diff --git a/Sources/CSFBAudioEngine/Player/AudioPlayerNode.h b/Sources/CSFBAudioEngine/Player/AudioPlayerNode.h index 845a4f6c..084c4d33 100644 --- a/Sources/CSFBAudioEngine/Player/AudioPlayerNode.h +++ b/Sources/CSFBAudioEngine/Player/AudioPlayerNode.h @@ -186,6 +186,8 @@ class AudioPlayerNode final { /// Pops the next decoder from the decoder queue Decoder _Nullable DequeueDecoder() noexcept; + bool RemoveDecoderFromQueue(Decoder _Nonnull decoder) noexcept; + void ClearQueue() noexcept { std::lock_guard lock(mQueueLock); diff --git a/Sources/CSFBAudioEngine/Player/AudioPlayerNode.mm b/Sources/CSFBAudioEngine/Player/AudioPlayerNode.mm index e15ea064..ed78e86a 100644 --- a/Sources/CSFBAudioEngine/Player/AudioPlayerNode.mm +++ b/Sources/CSFBAudioEngine/Player/AudioPlayerNode.mm @@ -623,6 +623,20 @@ bool PerformSeekIfRequired() noexcept return decoder; } +bool SFB::AudioPlayerNode::RemoveDecoderFromQueue(Decoder decoder) noexcept +{ +#if DEBUG + assert(decoder != nil); +#endif /* DEBUG */ + + std::lock_guard lock(mQueueLock); + const auto iter = std::find(mQueuedDecoders.cbegin(), mQueuedDecoders.cend(), decoder); + if(iter == mQueuedDecoders.cend()) + return false; + mQueuedDecoders.erase(iter); + return true; +} + SFB::AudioPlayerNode::Decoder SFB::AudioPlayerNode::CurrentDecoder() const noexcept { std::lock_guard lock(mDecoderLock); diff --git a/Sources/CSFBAudioEngine/Player/SFBAudioPlayerNode.mm b/Sources/CSFBAudioEngine/Player/SFBAudioPlayerNode.mm index 346f1360..f3c8e2bb 100644 --- a/Sources/CSFBAudioEngine/Player/SFBAudioPlayerNode.mm +++ b/Sources/CSFBAudioEngine/Player/SFBAudioPlayerNode.mm @@ -130,6 +130,12 @@ - (BOOL)enqueueDecoder:(id )decoder error:(NSError **)error return _impl->DequeueDecoder(); } +- (BOOL)removeDecoderFromQueue:(id)decoder +{ + NSParameterAssert(decoder != nil); + return _impl->RemoveDecoderFromQueue(decoder); +} + - (void)clearQueue { _impl->ClearQueue(); diff --git a/Sources/CSFBAudioEngine/include/SFBAudioEngine/SFBAudioPlayerNode.h b/Sources/CSFBAudioEngine/include/SFBAudioEngine/SFBAudioPlayerNode.h index d83ca652..a7af8730 100644 --- a/Sources/CSFBAudioEngine/include/SFBAudioEngine/SFBAudioPlayerNode.h +++ b/Sources/CSFBAudioEngine/include/SFBAudioEngine/SFBAudioPlayerNode.h @@ -143,6 +143,10 @@ NS_SWIFT_NAME(AudioPlayerNode) @interface SFBAudioPlayerNode : AVAudioSourceNode /// Dequeues and returns the next decoder from the decoder queue - (nullable id ) dequeueDecoder; +/// Removes a decoder from the decoder queue +/// - parameter decoder: The decoder to remove +/// - returns: `YES` if the decoder was removed successfully +- (BOOL)removeDecoderFromQueue:(id)decoder; /// Empties the decoder queue - (void)clearQueue;