SDL MIX_LOADWAV() 在加载一些 wav 文件时崩溃
SDL MIX_LOADWAV() crashes on loading some wav files
我有一个加载波形文件的 C++ 程序。并接受击键以充当钢琴。最近,我尝试将 wav 文件从互联网上的笔记更改为现场录音笔记。文件的唯一区别可能是现场录音是立体声的。无论如何,当我给 Mix_LoadWAV(a.wav) 它 returns null [例如,所有现场录音都加载 null]。
sdl 1.2 是否有任何限制 MIX_LOADWAV() 我应该知道吗?
bool LoadFiles()
{
Background = LoadImage("graphics/background.bmp");
cNote = Mix_LoadWAV("notes/c.wav" );
csNote = Mix_LoadWAV("notes/cs.wav" );
dNote = Mix_LoadWAV("notes/d.wav" );
dsNote = Mix_LoadWAV("notes/ds.wav" );
eNote = Mix_LoadWAV("notes/e.wav" );
fNote = Mix_LoadWAV("notes/f.wav" );
fsNote = Mix_LoadWAV("notes/fs.wav" );
gNote = Mix_LoadWAV("notes/g.wav" );
gsNote = Mix_LoadWAV("notes/gs.wav" );
aNote = Mix_LoadWAV("notes/a.wav" );
asNote = Mix_LoadWAV("notes/as.wav" );
bNote = Mix_LoadWAV("notes/b.wav" );
highCNote = Mix_LoadWAV("notes/highC.wav" );
if(Background == NULL || cNote == NULL || csNote == NULL || dNote == NULL || dsNote == NULL || eNote == NULL || fNote == NULL || fsNote == NULL || gNote == NULL || gsNote == NULL || aNote == NULL || asNote == NULL || bNote == NULL || highCNote == NULL)
{
printf("File load error\n");
return false;
}
return true;
}
今天好不容易解决了SDL Mixer的WAV加载功能的问题。我重新录制了一些音效,一旦我替换了它们,我正在制作的游戏就彻底崩溃了。经过一些错误追踪,我推断是 Mixer 拒绝加载新的 WAV 文件,但我无法弄清楚为什么。
然后我想到我在 Audacity 中录制了新的音效,并将它们保存为 32 位签名 PCM, 而不是 16 -位 PCM.
事实证明 Load_WAV 不支持 32 位签名的 PCM WAV 文件,如果您尝试加载它们会崩溃。相反,您必须将它们转换为 16 位签名的 PCM WAV 文件,即使用像 Audacity 这样的程序。一旦你这样做,它就会完美地工作。
希望这能帮助像我和 OP 一样困惑的人!据我所知,文档从来没有在任何地方提到这个限制,所以我相信它已经绊倒了很多人。
(其他地方注明:https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-files)
我有一个加载波形文件的 C++ 程序。并接受击键以充当钢琴。最近,我尝试将 wav 文件从互联网上的笔记更改为现场录音笔记。文件的唯一区别可能是现场录音是立体声的。无论如何,当我给 Mix_LoadWAV(a.wav) 它 returns null [例如,所有现场录音都加载 null]。
sdl 1.2 是否有任何限制 MIX_LOADWAV() 我应该知道吗?
bool LoadFiles()
{
Background = LoadImage("graphics/background.bmp");
cNote = Mix_LoadWAV("notes/c.wav" );
csNote = Mix_LoadWAV("notes/cs.wav" );
dNote = Mix_LoadWAV("notes/d.wav" );
dsNote = Mix_LoadWAV("notes/ds.wav" );
eNote = Mix_LoadWAV("notes/e.wav" );
fNote = Mix_LoadWAV("notes/f.wav" );
fsNote = Mix_LoadWAV("notes/fs.wav" );
gNote = Mix_LoadWAV("notes/g.wav" );
gsNote = Mix_LoadWAV("notes/gs.wav" );
aNote = Mix_LoadWAV("notes/a.wav" );
asNote = Mix_LoadWAV("notes/as.wav" );
bNote = Mix_LoadWAV("notes/b.wav" );
highCNote = Mix_LoadWAV("notes/highC.wav" );
if(Background == NULL || cNote == NULL || csNote == NULL || dNote == NULL || dsNote == NULL || eNote == NULL || fNote == NULL || fsNote == NULL || gNote == NULL || gsNote == NULL || aNote == NULL || asNote == NULL || bNote == NULL || highCNote == NULL)
{
printf("File load error\n");
return false;
}
return true;
}
今天好不容易解决了SDL Mixer的WAV加载功能的问题。我重新录制了一些音效,一旦我替换了它们,我正在制作的游戏就彻底崩溃了。经过一些错误追踪,我推断是 Mixer 拒绝加载新的 WAV 文件,但我无法弄清楚为什么。
然后我想到我在 Audacity 中录制了新的音效,并将它们保存为 32 位签名 PCM, 而不是 16 -位 PCM.
事实证明 Load_WAV 不支持 32 位签名的 PCM WAV 文件,如果您尝试加载它们会崩溃。相反,您必须将它们转换为 16 位签名的 PCM WAV 文件,即使用像 Audacity 这样的程序。一旦你这样做,它就会完美地工作。
希望这能帮助像我和 OP 一样困惑的人!据我所知,文档从来没有在任何地方提到这个限制,所以我相信它已经绊倒了很多人。
(其他地方注明:https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-files)