我可以暂停回调吗?
我正在使用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库中没有错误(这很可能是错误的,用google搜索这条消息之后),我想应该可以改变我的代码来修复,或者至少避免欠载。
所以,问题是:我可以暂停自己的回调吗? 它能引起我看到的不足吗?
最后我想通了。
当SDL_PauseAudio( 1 );
在回调中被调用,那么SDL将切换到另一个回调(它将零置入音频流中)。 该函数被调用后,回调将结束执行。
因此,从回调中调用此函数是安全的。
链接地址: http://www.djcxy.com/p/33817.html上一篇: Can I pause the callback from within itself?
下一篇: How to edit raw PCM audio data without an audio library?