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

Другие вопросы по тегам