Могу ли я приостановить обратный вызов изнутри себя? - PullRequest
4 голосов
/ 02 февраля 2012

Я использую SDL аудио для воспроизведения звуков.

SDL_LockAudio сообщает следующее:

Не вызывать это из обратного вызовафункция или вы будете вызывать тупик.

Но, SDL_PauseAudio не говорит об этом, вместо этого говорит:

Эта функция приостанавливает и приостанавливает обработку обратного вызова аудио

Мой обратный вызов микшера выглядит следующим образом:

void AudioPlaybackCallback( void *, core::bty::UInt8 *stream, int len )
{
         // number of bytes left to play in the current sample
        const int thisSampleLeft = currentSample.dataLength - currentSample.dataPos;
        // number of bytes that will be sent to the audio stream
        const int amountToPlay = std::min( thisSampleLeft, len );

        if ( amountToPlay > 0 )
        {
            SDL_MixAudio( stream,
                          currentSample.data + currentSample.dataPos,
                          amountToPlay,
                          currentSample.volume );

            // update the current sample
            currentSample.dataPos += amountToPlay;
        }
        else
        {
            if ( PlayingQueue::QueueHasElements() )
            {
                // update the current sample
                currentSample = PlayingQueue::QueuePop();
            }
            else
            {
                // since the current sample finished, and there are no more samples to
                // play, pause the playback
                SDL_PauseAudio( 1 );
            }
        }
}

PlayingQueue - это класс, который обеспечивает доступ к статическому std::queue объекту.Ничего особенного.

Это работало нормально, пока мы не решили обновить библиотеки SDL и alsa (теперь больше нет пути назад).С тех пор я вижу это в своем журнале:

ALSA lib pcm.c: 7316: (snd_pcm_recover) произошло опустошение

Если я предполагаю, что нет ошибок в SDL илибиблиотека alsa (это, скорее всего, неправильно, после поиска в сообщении), я думаю, что должна быть возможность изменить мой код для исправления или, по крайней мере, избежать опустошения.

Итак, вопрос: могу ли я сделать паузуобратный звонок от себя?Может ли это привести к опустошению, которое я вижу?

1 Ответ

3 голосов
/ 03 февраля 2012

Наконец я разобрался.

Когда в обратном вызове вызывается SDL_PauseAudio( 1 );, тогда SDL собирается переключиться на другой обратный вызов (который просто помещает нули в аудиопоток).Обратный вызов завершит выполнение после вызова функции.

Следовательно, безопасно вызывать эту функцию из обратного вызова.

...