Я пытаюсь реализовать потоковое аудио, и я столкнулся с проблемой, когда OpenAL дает мне коды ошибок, кажется невозможным, учитывая информацию в документации.
int buffersProcessed = 0;
alGetSourcei(m_Source, AL_BUFFERS_PROCESSED, &buffersProcessed);
PrintALError();
int toAddBufferIndex;
// Remove the first buffer from the queue and move it to
//the end after buffering new data.
if (buffersProcessed > 0)
{
ALuint unqueued;
alSourceUnqueueBuffers(m_Source, 1, &unqueued);
/////////////////////////////////
PrintALError(); // Prints AL_INVALID_OPERATION //
/////////////////////////////////
toAddBufferIndex = firstBufferIndex;
}
В соответствии с документация [PDF], AL_INVALID_OPERATION
означает: «Текущий контекст отсутствует». Похоже, что это не может быть правдой, потому что OpenAL был и продолжает воспроизводить другое аудио просто отлично!
Просто чтобы быть уверенным, я позвонил ALCcontext* temp = alcGetCurrentContext( );
здесь и вернул действительный контекст.
Есть ли здесь какое-то другое условие ошибки, которое не упомянуто в документации?
Подробнее: источник звука воспроизводится при вызове этого кода, но впечатление от чтения спецификации у меня сложилось так: вы можете безопасно снять обработанные буферы во время воспроизведения источника. PrintALError
это просто обертка для alGetError
это печатает, если есть какая-либо ошибка.
Я на Mac (OS 10.8.3), на случай, если это имеет значение.
До сих пор я понял, что эта реализация OpenAL неправильно выдает ошибку, если вы удаляете буфер из очереди во время воспроизведения источника. В спецификации сказано, что у вас должна быть возможность снять буфер, который был помечен как обрабатываемый во время воспроизведения источника:
Удаление данной записи в очереди невозможно, если только источник не остановлен (в этом случае вся очередь считается обработанной), или если запись очереди уже обработана (источник AL_PLAYING или AL_PAUSED).
Исходя из этого, я хочу сказать, что это, вероятно, ошибка в моей реализации OpenAL. Я оставлю вопрос открытым, если кто-то сможет дать более конкретный ответ.
Для обработки условия для нескольких буферов используйте цикл.
Следующие работы на iOS и Linux:
// UN queue used buffers
ALint buffers_processed = 0;
alGetSourcei(streaming_source, AL_BUFFERS_PROCESSED, & buffers_processed); // get source parameter num used buffs
while (buffers_processed > 0) { // we have a consumed buffer so we need to replenishALuint unqueued_buffer;
alSourceUnqueueBuffers(streaming_source, 1, & unqueued_buffer);
available_AL_buffer_array_curr_index--;
available_AL_buffer_array[available_AL_buffer_array_curr_index] = unqueued_buffer;
buffers_processed--;
}