C++:SDL 音频回调最终停止工作
Posted
技术标签:
【中文标题】C++:SDL 音频回调最终停止工作【英文标题】:C++: SDL audio callback eventually stops working 【发布时间】:2021-07-19 16:24:53 【问题描述】:我正在制作一个音频可视化工具,其中包括 SDL 来录制音频。
当我打开录音时,在 0 到 20 秒之间一切正常,然后 SDL 停止进行音频回调。我的印象是在短时间内没有任何声音时会发生这种情况,但无论我发出多大的声音,我都无法阻止它。
这是我的代码大纲。它有很多,所以我会省略我认为正常工作的东西。
//(imports and stuff)
bool active = false;
Uint8* rawSamples = nullptr;
float* audioBuffer = nullptr;
int main()
init();
active = true;
while (active)
float* audio = getAudio();
handleEvents();
void init ()
// (SDL Init, device selection, device opening)
// dev: device ID returned by SDL_OpenAudioDevice, have: audiospec of said device
int rawSamplesSize = (int)have.samples * SDL_AUDIO_BITSIZE(have.format) * have.channels / 8;
rawSamples = new Uint8[rawSamplesSize * 4];
audioBuffer = new float[(int)have.samples];
SDL_PauseAudioDevice(dev, 0);
void audioCallback(void* userdata, Uint8* stream, int len)
for (int i = 0; i < len; i++)
rawSamples[i] = stream[i];
float* getAudio()
SDL_LockAudioDevice(dev);
for (int i = 0; i < have.samples; i++)
audioBuffer[i] = ((float*)rawSamples)[i];
*audioLengthPointer = have.samples;
SDL_UnlockAudioDevice(dev);
return audioBuffer
void handleEvents()
SDL_Event e;
while (SDL_PollEvent(&e))
if (e.type == SDL_QUIT)
active = false;
我检查了几件事: 录音工作正常。 即使没有任何回调,设备也会保持活动状态。 这不是锁定解锁问题。 暂停-取消暂停似乎没有帮助。 即使没有回调,程序也会继续运行。 一开始,有一些回调,它们之间没有任何 getAudio 调用。
注意:我已经知道这个问题类似于SDL audio callback stops after two iterations,但在我的情况下,我正在录制音频,并且回调的数量不固定。
【问题讨论】:
【参考方案1】:更换驱动程序已解决问题。 由于现在的问题变成了为什么 wasapi 决定停止发送与 SDL 不太相关的音频数据,所以我要结束这个问题。
【讨论】:
以上是关于C++:SDL 音频回调最终停止工作的主要内容,如果未能解决你的问题,请参考以下文章