Browse Source

Audio: add buffer (un)queuing to Source.

pull/342/head
Guillaume Jacquemin 7 years ago committed by Vladimír Vondruš
parent
commit
b9fb03ab8e
  1. 29
      src/Magnum/Audio/Source.cpp
  2. 24
      src/Magnum/Audio/Source.h

29
src/Magnum/Audio/Source.cpp

@ -25,7 +25,10 @@
#include "Source.h"
#include <algorithm>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Reference.h>
#include "Magnum/Audio/Buffer.h"
@ -38,6 +41,32 @@ Source& Source::setBuffer(Buffer* buffer) {
return *this;
}
Source& Source::queueBuffers(Containers::ArrayView<Containers::Reference<Buffer>> buffers) {
Containers::Array<ALuint> 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<Containers::Reference<Buffer>> buffers) {
ALint processedBuffers;
alGetSourcei(_id, AL_BUFFERS_PROCESSED, &processedBuffers);
if(!processedBuffers) return 0;
Containers::Array<ALuint> 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<ALuint> sourceIds(const std::initializer_list<std::reference_wrapper<Source>>& sources) {

24
src/Magnum/Audio/Source.h

@ -35,6 +35,8 @@
#include <vector>
#include <al.h>
#include <Corrade/Containers/Containers.h>
#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<Containers::Reference<Buffer>> 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<Containers::Reference<Buffer>> buffers);
/*@}*/
/** @{ @name State management */

Loading…
Cancel
Save