diff --git a/src/Magnum/Audio/Source.cpp b/src/Magnum/Audio/Source.cpp index 9bdc17e79..7bf957417 100644 --- a/src/Magnum/Audio/Source.cpp +++ b/src/Magnum/Audio/Source.cpp @@ -25,7 +25,10 @@ #include "Source.h" +#include + #include +#include #include "Magnum/Audio/Buffer.h" @@ -38,6 +41,32 @@ Source& Source::setBuffer(Buffer* buffer) { return *this; } +Source& Source::queueBuffers(Containers::ArrayView> buffers) { + Containers::Array ids(buffers.size()); + for(std::size_t i = 0; i < ids.size(); i++) + ids[i] = buffers[i]->id(); + alSourceQueueBuffers(_id, ids.size(), ids.data()); + return *this; +} + +std::size_t Source::unqueueBuffers(Containers::ArrayView> buffers) { + ALint processedBuffers; + alGetSourcei(_id, AL_BUFFERS_PROCESSED, &processedBuffers); + + if(!processedBuffers) return 0; + + Containers::Array unqueuedIds(processedBuffers); + alSourceUnqueueBuffers(_id, unqueuedIds.size(), unqueuedIds.data()); + auto isNotUnqueued = [&unqueuedIds](Buffer& buffer) { + for(ALuint id : unqueuedIds) { + if(buffer.id() == id) + return false; + } + return true; + }; + return std::remove_if(buffers.begin(), buffers.end(), isNotUnqueued) - buffers.begin(); +} + namespace { Containers::Array sourceIds(const std::initializer_list>& sources) { diff --git a/src/Magnum/Audio/Source.h b/src/Magnum/Audio/Source.h index cf8890787..2628806cc 100644 --- a/src/Magnum/Audio/Source.h +++ b/src/Magnum/Audio/Source.h @@ -35,6 +35,8 @@ #include #include +#include + #include "Magnum/Magnum.h" #include "Magnum/Audio/Audio.h" #include "Magnum/Audio/visibility.h" @@ -507,6 +509,28 @@ class MAGNUM_AUDIO_EXPORT Source { */ Source& setBuffer(Buffer* buffer); + /** + * @brief Queue buffers + * @param buffers Buffers to queue + * @return Reference to self (for method chaining) + * + * Changes source type to @ref Type::Streaming. The buffers must be + * already filled with data. + * @see @ref type(), @fn_al_keyword{SourceQueueBuffers} + */ + Source& queueBuffers(Containers::ArrayView> buffers); + + /** + * @brief Unqueue buffers + * @param buffers Buffers to unqueue + * @return The number of unqueued buffers + * + * The unqueued buffers will be listed in the prefix of the array. Use + * @ref Corrade::Containers::ArrayView::prefix() to get it. + * @see @fn_al_keyword{SourceUnqueueBuffers} + */ + std::size_t unqueueBuffers(Containers::ArrayView> buffers); + /*@}*/ /** @{ @name State management */