我正在从 Windows 移植一个小游戏。它使用一些存储在 WAV 文件中的小声音。在 Windows 中,所有细节都会自动处理,但在 SDL2 中我遇到了挑战。
SDL_OpenAudioDevice 希望被告知(通过 wavSpec)期望的采样率,例如:
SDL_AudioSpec wavSpec;
soundDevice = SDL_OpenAudioDevice(NULL, 0, &wavSpec, NULL, 0);
因此,我通过加载第一个 WAV 文件并使用 SDL_LoadWAV 提供的 wavSpec 来填充我的 wavSpec。哎呀。并非所有 WAV 文件都具有相同的采样率。因此,如果一个是正确的,其他的要么太快要么太慢,听起来很荒谬。
处理这个问题的最佳方法是什么?关闭设备并以不同的采样率打开? (感觉太重了。)明确地将所有波形文件重新采样到相同的采样率?噢,拜托,不!打开多个不同采样率的“设备”?
您几乎肯定不应该以不同的速率打开多个设备。我相信您应该使用 SDL_ConvertAudio 来重新采样您想要播放的每个声音。
您需要将音频数据从 wav 文件移动到 SDL_AudioCVT 结构的 buf 参数中。然后使用该结构调用 SDL_BuildAudioCVT,将原始 wav 文件采样率指定为 src_rate,将设备采样率指定为 dst_rate。最后调用SDL_ConvertAudio进行转换。请参阅:https://wiki.libsdl.org/SDL2/CategoryAudio