SDL Audio Callback 没有声音

No sound generated by SDL Audio Callback

我正在尝试在 Windows10 上使用 SDL 2.0.12 获得一个简单的正弦波声音生成示例,但没有声音输出。 我不知道这是代码问题还是输出设备问题或音频驱动程序问题。 我非常感谢有关如何进一步调试问题的建议。

#include <iostream>
#include "SDL.h"


float sine_freq = 200.0f;
float audio_volume = 4000.0f;
float audio_frequency;

void SineAudioCallback(void* userdata, Uint8* stream, int len) {
    float* buf = (float*)stream;
    for (int i = 0; i < len / 4; ++i) {
        buf[i] = (float)(audio_volume * sin(2 * M_PI * i * audio_frequency));
    }
    return;
}

int main(int argc, char* argv[])
{
    if (SDL_Init(SDL_INIT_AUDIO)) {
        return 1;
    }

    std::cout << "[SDL] Audio driver: " << SDL_GetCurrentAudioDriver() << std::endl;

    SDL_AudioSpec want, have;
    SDL_zero(want);

    want.freq = 5000;
    want.format = AUDIO_F32;
    want.channels = 2;
    want.samples = 4096;
    want.callback = SineAudioCallback;

    std::cout <<"[SDL] Desired - frequency: " << want.freq
        << ", format: f " << SDL_AUDIO_ISFLOAT(want.format)  << " s " << SDL_AUDIO_ISSIGNED(want.format) << " be " << SDL_AUDIO_ISBIGENDIAN(want.format) << " sz " << SDL_AUDIO_BITSIZE(want.format)
        << ", channels: " << (int)want.channels << ", samples: " << want.samples << std::endl;


    SDL_AudioDeviceID dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, SDL_AUDIO_ALLOW_ANY_CHANGE);

    if (!dev) {
        SDL_Quit();
        return 1;
    }


    std::cout << "[SDL] Desired - frequency: " << have.freq
        << ", format: f " << SDL_AUDIO_ISFLOAT(have.format) << " s " << SDL_AUDIO_ISSIGNED(have.format) << " be " << SDL_AUDIO_ISBIGENDIAN(have.format) << " sz " << SDL_AUDIO_BITSIZE(have.format)
        << ", channels: " << (int)have.channels << ", samples: " << have.samples << std::endl;

    audio_frequency = sine_freq / have.freq;

    SDL_PauseAudioDevice(dev, 0);
    SDL_Delay(10000);

    SDL_CloseAudioDevice(dev);
    SDL_Quit();

    return 0;
}

我得到的输出是

[SDL] Audio driver: wasapi

[SDL] Desired - frequency: 5000, format: f 256 s 32768 be 0 sz 32, channels: 2, samples: 4096

[SDL] Desired - frequency: 5000, format: f 256 s 32768 be 0 sz 32, channels: 2, samples: 118

所以 SDL_AudioSpec 我想要的和有的,在减少的样本数量上是有区别的。

我还收到与 dll 相关的错误消息,但我不确定它是否重要。 avcore\audiocore\client\audioclient\audioclientcore.cpp(1839)\AUDIOSES.DLL!00007FFC48E00F8E: (caller: 0000000070D6BE39) ReturnHr(1) tid(46dc) 80070057 The parameter is incorrect.

事实证明我需要做两件事来解决这个问题。

对于 float 类型,声波只能取 -1 到 1 之间的值,而我使用的是更大的音量提升。我需要改变

float audio_volume = 1.0f;

对于 Windows,直接声音和 winmm 驱动程序提供比 wasapi 更好的样本长度。对于 Windows 上的 SDL2,您需要将 SDL_AUDIODRIVER=directsoundSDL_AUDIODRIVER=winmm 设置为环境变量。 More details here