Allegro 声音不工作(播放 wav 文件)

Allegro sound not working (playing wav file)

我正在为一个学校项目制作游戏,并且我有一个声音效果,应该在激光发射时播放。有一段时间它运行良好,但此后就停止了。停止后我稍微更改了代码,因为我想将文件存储在数据文件中。

正在 Allegro 中初始化声音

install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL);

这是加载和播放声音的代码

//Loading sound file from datafile
DATAFILE *laserShot = NULL;
laserShot = load_datafile_object("asteroids.dat", "laser_Shot");

//Error checking
if (laserShot->dat == NULL) {
    allegro_message("Error loading laser_Shot.wav");
}
else {
    //Playing sound for shot
    play_sample((SAMPLE*) laserShot->dat, 255, 127, 1000, 0);
}

//Freeing memory
unload_datafile_object(laserShot);

如果重要的话,声音本身很短,不到一秒钟。 声音也会尝试快速连续播放多次,但实际上现在比它最初工作时有更多的中断,所以我认为这没有什么不同。

有没有我明显弄错的地方?

首先,确保所有参数都已设置,如果您只调用 install_sound,则不会。你也应该这样称呼:

 set_config_int("sound", "quality", 1);

第三个参数是指使用的音质。这应该意味着最高质量,如果你想要其他类型,你应该在 allegro 库参考中搜索。

其次,你应该分配语音。语音基本上是 space 在内存中播放样本。默认情况下,allegro 4 可以分配 255 个不同的声音,但由于硬件原因,实际数量可能要少得多。你这样做:

int laser_voice = allocate_voice("sample.wav");

现在您可以设置参数,例如音量、声像、扫描和播放模式。例如,如果您想以与源相同的频率和音量播放循环样本,您应该这样做:

voice_set_volume(   laser_voice, 200);
voice_set_pan(      laser_voice, 127);
voice_set_playmode( laser_voice, PLAYMODE_LOOP);

对于其他选项,您应该访问参考资料。

现在,要播放示例,您只需调用

voice_start(laser_voice);

然后您可以通过reallocate_voice停止、重播、更改参数或更改样本。就这样。在代码末尾,您通过

释放它
deallocate_voice(laser_voice);

原来我只是犯了一个愚蠢的错误,我在播放声音文件的同一个函数中调用了卸载函数;在文件被卸载之前没有足够的时间来播放声音文件,所以虽然从技术上讲编译器没有发现错误或导致崩溃,但代码正在尝试播放它已经忘记的声音。去掉卸载调用可以播放声音