Код ошибки отмены OpenAL, неполная документация

Я пытаюсь реализовать потоковое аудио, и я столкнулся с проблемой, когда 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), на случай, если это имеет значение.

0

Решение

До сих пор я понял, что эта реализация OpenAL неправильно выдает ошибку, если вы удаляете буфер из очереди во время воспроизведения источника. В спецификации сказано, что у вас должна быть возможность снять буфер, который был помечен как обрабатываемый во время воспроизведения источника:

Удаление данной записи в очереди невозможно, если только источник не остановлен (в этом случае вся очередь считается обработанной), или если запись очереди уже обработана (источник AL_PLAYING или AL_PAUSED).

Исходя из этого, я хочу сказать, что это, вероятно, ошибка в моей реализации OpenAL. Я оставлю вопрос открытым, если кто-то сможет дать более конкретный ответ.

0

Другие решения

Для обработки условия для нескольких буферов используйте цикл.
Следующие работы на 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--; }
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector