gpt4 book ai didi

c++ - 我可以从内部暂停回调吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:56 34 4
gpt4 key购买 nike

我正在使用 SDL audio播放声音。

SDL_LockAudio告诉这个:

Do not call this from the callback function or you will cause deadlock.

但是,SDL_PauseAudio没有这么说,而是告诉:

This function pauses and unpauses the audio callback processing

我的混音器回调看起来像这样:

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) underrun occurred

如果我假设 SDL 或 alsa 库中没有错误(这很可能是错误的,在谷歌搜索此消息后),我想应该可以更改我的代码来修复,或者至少避免欠载。

所以,问题是:我可以暂停自身的回调吗?它会导致我看到的欠载运行吗?

最佳答案

我终于明白了。

当在回调中调用 SDL_PauseAudio( 1 ); 时,SDL 将切换到另一个回调(它只是将零放入音频流)。调用函数后,回调将完成执行。

因此,从回调中调用此函数是安全的。

关于c++ - 我可以从内部暂停回调吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115191/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com