У меня возникли некоторые трудности с обработкой потоковых источников в OpenAL на Mac OS X (с использованием системной инфраструктуры). Я до сих пор не уверен, что это вызывает, но иногда, после остановки потокового источника и повторного его воспроизведения, постановка в очередь буфера увеличивает значение AL_BUFFERS_PROCESSED
. Я использую цикл while, подобный следующему, для обработки исходных буферов:
alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
while (processed--)
{
ALuint buffer;
// Get a free buffer.
alSourceUnqueueBuffers(source, 1, &buffer);
streamAtomic(buffer, decoder); // streamAtomic decodes compressed audio data and calls alBufferData.
alSourceQueueBuffers(source, 1, &buffer);
}
Полный исходный код класса Source можно найти здесь .
Обычно этот цикл обновления работает нормально, но всякий раз, когда эта ошибка срабатывает, вызов alSourceQueueBuffers
, по-видимому, увеличивает AL_BUFFERS_PROCESSED
, означая, что каждый цикл обновления, этот цикл занимает все больше и больше времени, пока не достигнет общего числа буферов, поставленных в очередь, период (32 в данном случае), где он остается до приостановки или остановки источника, после чего AL_BUFFERS_PROCESSED
сбрасывается - и быстро начинает снова увеличиваться. Я проверил, и после вызова alSourceUnqueueBuffers
счет уменьшается на 1. Только после того, как я позвоню alSourceQueueBuffers
, счет снова увеличится.
Я просматривал свой код, спецификацию OpenAL, переполнение стека, список рассылки OpenAL и Google, и я не могу найти ни документации по этому случаю, ни указаний относительно того, что я делаю что-то неправильно или если это ошибка в реализации OpenAL. Что бы это ни стоило, эта ошибка не возникает, используя точно такой же код, в OpenAL Soft для Windows и Linux. Однако я не смог заставить OpenAL Soft нормально работать на моем Mac для тестирования.
Есть идеи?