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 音频回调最终停止工作的主要内容,如果未能解决你的问题,请参考以下文章

带有 SDL 音频的 Emscripten 工作模型

AVAssestReader 停止音频回调

添加回调函数时 JavaScript 停止工作

C++ “**.exe已停止工作”是啥原因?

屏幕关闭时,HTML5 音频/javascript 停止在 android(谷歌浏览器)上工作

程序停止工作并给出垃圾值 C++