SDL_LoadWAV未加载文件

SDL_LoadWAV not loading file

本文关键字:加载 文件 LoadWAV SDL      更新时间:2023-10-16

我想加载一个 wav 文件并使用以下代码播放它:

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
std::cerr << "Could not init SDL:" << SDL_GetError() << 'n';
}
SDL_AudioSpec wavSpec;
Uint32 wavLength;
Uint8 *wavBuffer;
if(SDL_LoadWAV("sound.wav", &wavSpec, &wavBuffer, &wavLength) == NULL) {
std::cerr << "Could not load wave:" << SDL_GetError() << 'n';
return;
}
SDL_AudioDeviceID deviceId = SDL_OpenAudioDevice(NULL, 0, &wavSpec, NULL, 0);
int success = SDL_QueueAudio(deviceId, wavBuffer, wavLength);
SDL_PauseAudioDevice(deviceId, 0);
SDL_CloseAudioDevice(deviceId);
SDL_FreeWAV(wavBuffer);
SDL_Quit();

但是SDL_LoadWav返回NULLSDL_GetError只是返回:

Couldn't open sounds.wav

我已经检查了该文件是否存在,但仍然没有运气。代码有什么问题吗?

出于调试目的,我还尝试使用如下ifstream打开 wav:

std::ifstream ifs{"hitBrick.wav"};
if(!ifs) {
std::cerr << "cannot open plattform fstream n";
}

在这里它没有错误。

可能是什么问题?

编辑:

我可以找到 wav 无法加载的原因SDL_LoadWAV.

根据SDL_LoadWav的文档,只有支持的波形格式是MS-ADPCMIMA-ADPCM.

但我的文件是 PCM 格式。所以我使用 SOX 工具转换了 linux 下的文件:https://wiki.ubuntuusers.de/SoX/

现在我没有收到任何错误,但我也没有听到任何声音。这个问题可能是什么?

我在听不到声音时发现了问题。

SDL_PauseAudioDevice(deviceId, 0);
SDL_CloseAudioDevice(deviceId);

在这里,我准备播放声音并直接关闭它。

在声音之间有延迟可以听到:

SDL_PauseAudioDevice(deviceId, 0);
SDL_Delay(1000);
SDL_CloseAudioDevice(deviceId);