Почему alSourceUnqueueBuffers терпит неудачу с INVALID_OPERATION
Вот код:
ALint cProcessedBuffers = 0;
ALenum alError = AL_NO_ERROR;
alGetSourcei(m_OpenALSourceId, AL_BUFFERS_PROCESSED, &cProcessedBuffers);
if((alError = alGetError()) != AL_NO_ERROR)
{
throw "AudioClip::ProcessPlayedBuffers - error returned from alGetSroucei()";
}
alError = AL_NO_ERROR;
if (cProcessedBuffers > 0)
{
alSourceUnqueueBuffers(m_OpenALSourceId, cProcessedBuffers, arrBuffers);
if((alError = alGetError()) != AL_NO_ERROR)
{
throw "AudioClip::ProcessPlayedBuffers - error returned from alSourceUnqueueBuffers()";
}
}
Вызов alGetSourcei возвращается с cProcessedBuffers > 0, но следующий вызов alSourceUnqueueBuffers завершается неудачно с INVALID_OPERATION. Это ошибочная ошибка, которая не всегда возникает. Программа, содержащая этот пример кода, представляет собой однопоточное приложение, работающее в замкнутом цикле (обычно оно синхронизируется с циклом отображения, но в этом случае я не использую какой-либо синхронизированный обратный вызов).
2 ответа
Пытаться alSourceStop(m_OpenALSourceId)
первый. затем alUnqueueBuffers()
и после этого возобновить игру alSourcePlay(m_OpenALSourceId)
,
Я решил эту проблему таким же образом. Но я не знаю, почему это нужно сделать в
Упоминается в этой теме,
Если вы включили AL_LOOPING для потокового источника, операция отмены очереди завершится неудачно.
Флаг зацикливания имеет некоторую блокировку на буферах при включении. Ответ @MyMiracle также намекает на это, останавливая удержание звуковых релизов, но это не обязательно.
AL_LOOPING не предназначен для установки на потоковом источнике, так как вы управляете исходными данными в очереди. Продолжайте стоять в очереди, это продолжит играть. Очередь с начала данных, она будет зациклена.