aboutsummaryrefslogtreecommitdiffstats
path: root/alc
diff options
context:
space:
mode:
Diffstat (limited to 'alc')
-rw-r--r--alc/alc.cpp10
-rw-r--r--alc/alu.cpp18
-rw-r--r--alc/effects/base.h12
-rw-r--r--alc/effects/convolution.cpp29
4 files changed, 16 insertions, 53 deletions
diff --git a/alc/alc.cpp b/alc/alc.cpp
index a8ec407f..8a89e8c2 100644
--- a/alc/alc.cpp
+++ b/alc/alc.cpp
@@ -2102,10 +2102,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
state->mOutTarget = device->Dry.Buffer;
state->deviceUpdate(device);
if(ALbuffer *buffer{slot->Buffer})
- {
- slot->Effect.Buffer = nullptr;
- slot->Effect.Buffer.reset(state->createBuffer(device, buffer->mBuffer));
- }
+ state->setBuffer(device, &buffer->mBuffer);
slot->updateProps(context);
}
@@ -2128,10 +2125,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
state->mOutTarget = device->Dry.Buffer;
state->deviceUpdate(device);
if(ALbuffer *buffer{slot->Buffer})
- {
- slot->Effect.Buffer = nullptr;
- slot->Effect.Buffer.reset(state->createBuffer(device, buffer->mBuffer));
- }
+ state->setBuffer(device, &buffer->mBuffer);
slot->updateProps(context);
}
}
diff --git a/alc/alu.cpp b/alc/alu.cpp
index 978f6d62..bda8b08d 100644
--- a/alc/alu.cpp
+++ b/alc/alu.cpp
@@ -505,24 +505,6 @@ bool CalcEffectSlotParams(ALeffectslot *slot, ALeffectslot **sorted_slots, ALCco
}
}
- EffectBufferBase *buffer{props->Buffer.release()};
- EffectBufferBase *oldbuffer{slot->Params.mEffectBuffer};
- slot->Params.mEffectBuffer = buffer;
-
- if(oldbuffer && !oldbuffer->releaseIfNoDelete())
- {
- RingBuffer *ring{context->mAsyncEvents.get()};
- auto evt_vec = ring->getWriteVector();
- if LIKELY(evt_vec.first.len > 0)
- {
- AsyncEvent *evt{::new(evt_vec.first.buf) AsyncEvent{EventType_ReleaseEffectBuffer}};
- evt->u.mEffectBuffer = oldbuffer;
- ring->writeAdvance(1);
- }
- else
- props->Buffer.reset(oldbuffer);
- }
-
AtomicReplaceHead(context->mFreeEffectslotProps, props);
EffectTarget output;
diff --git a/alc/effects/base.h b/alc/effects/base.h
index a6b7e98a..db38fc49 100644
--- a/alc/effects/base.h
+++ b/alc/effects/base.h
@@ -155,10 +155,6 @@ const EffectVtable T##_vtable = { \
}
-struct EffectBufferBase : public al::intrusive_ref<EffectBufferBase> {
- virtual ~EffectBufferBase() = default;
-};
-
struct EffectTarget {
MixParams *Main;
RealMixParams *RealOut;
@@ -171,13 +167,7 @@ struct EffectState : public al::intrusive_ref<EffectState> {
virtual ~EffectState() = default;
virtual void deviceUpdate(const ALCdevice *device) = 0;
- /* Implementations are currently required to copy the buffer data if they
- * wish to hold on to it, as there's no guarantee the buffer won't be
- * deleted or altered during a mix.
- */
- virtual EffectBufferBase *createBuffer(const ALCdevice* /*device*/,
- const BufferStorage& /*buffer*/)
- { return nullptr; }
+ virtual void setBuffer(const ALCdevice* /*device*/, const BufferStorage* /*buffer*/) { }
virtual void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) = 0;
virtual void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn, const al::span<FloatBufferLine> samplesOut) = 0;
};
diff --git a/alc/effects/convolution.cpp b/alc/effects/convolution.cpp
index 1ce3bae2..2ba0bde8 100644
--- a/alc/effects/convolution.cpp
+++ b/alc/effects/convolution.cpp
@@ -97,7 +97,7 @@ using complex_d = std::complex<double>;
constexpr size_t ConvolveUpdateSize{1024};
constexpr size_t ConvolveUpdateSamples{ConvolveUpdateSize / 2};
-struct ConvolutionFilter final : public EffectBufferBase {
+struct ConvolutionFilter {
FmtChannels mChannels{};
AmbiLayout mAmbiLayout{};
AmbiScaling mAmbiScaling{};
@@ -385,13 +385,13 @@ void ConvolutionFilter::process(const size_t samplesToDo,
struct ConvolutionState final : public EffectState {
- ConvolutionFilter *mFilter{};
+ std::unique_ptr<ConvolutionFilter> mFilter;
ConvolutionState() = default;
~ConvolutionState() override = default;
void deviceUpdate(const ALCdevice *device) override;
- EffectBufferBase *createBuffer(const ALCdevice *device, const BufferStorage &buffer) override;
+ void setBuffer(const ALCdevice *device, const BufferStorage *buffer) override;
void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override;
void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn, const al::span<FloatBufferLine> samplesOut) override;
@@ -402,29 +402,26 @@ void ConvolutionState::deviceUpdate(const ALCdevice* /*device*/)
{
}
-EffectBufferBase *ConvolutionState::createBuffer(const ALCdevice *device,
- const BufferStorage &buffer)
+void ConvolutionState::setBuffer(const ALCdevice *device, const BufferStorage *buffer)
{
+ mFilter = nullptr;
/* An empty buffer doesn't need a convolution filter. */
- if(buffer.mSampleLen < 1) return nullptr;
+ if(!buffer || buffer->mSampleLen < 1) return;
- auto numChannels = ChannelsFromFmt(buffer.mChannels,
- minu(buffer.mAmbiOrder, device->mAmbiOrder));
+ auto numChannels = ChannelsFromFmt(buffer->mChannels,
+ minu(buffer->mAmbiOrder, device->mAmbiOrder));
- al::intrusive_ptr<ConvolutionFilter> filter{new ConvolutionFilter{numChannels}};
- if LIKELY(filter->init(device, buffer))
- return filter.release();
- return nullptr;
+ mFilter.reset(new ConvolutionFilter{numChannels});
+ if(!mFilter->init(device, *buffer))
+ mFilter = nullptr;
}
void ConvolutionState::update(const ALCcontext *context, const ALeffectslot *slot,
const EffectProps *props, const EffectTarget target)
{
- mFilter = static_cast<ConvolutionFilter*>(slot->Params.mEffectBuffer);
- if(!mFilter) return;
-
- mFilter->update(mOutTarget, context, slot, props, target);
+ if(mFilter)
+ mFilter->update(mOutTarget, context, slot, props, target);
}
void ConvolutionState::process(const size_t samplesToDo,