Allegro 声音不起作用(播放 wav 文件)
Posted
技术标签:
【中文标题】Allegro 声音不起作用(播放 wav 文件)【英文标题】:Allegro sound not working (playing wav file) 【发布时间】:2017-01-06 04:08:43 【问题描述】:我正在为一个学校项目制作一个游戏,并且我有一个应该在发射激光时播放的音效。有一段时间它运行良好,但后来停止了。在它停止后,我稍微更改了代码,因为我想将文件存储在数据文件中。
在 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);
声音本身很短,如果重要的话,不到一秒钟。 声音也会尝试快速连续播放多次,但实际上现在比最初工作时有更多的休息时间,所以我认为这没有什么区别。
我有什么明显的错误吗?
【问题讨论】:
【参考方案1】:首先,确保所有参数都已设置,如果您只调用 install_sound,则不会。你也应该这样称呼:
set_config_int("sound", "quality", 1);
第三个参数是指使用的音质。这应该意味着最高质量,如果您想要其他类型,您应该在 allegro libs 参考中搜索。
其次,你应该分配声音。语音基本上是内存中用于播放样本的空间。默认情况下,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);
【讨论】:
【参考方案2】:原来我只是犯了一个愚蠢的错误,我在播放声音文件的同一个函数中调用了卸载函数;在文件被卸载之前没有足够的时间来播放声音文件,所以虽然从技术上讲,编译器不会发现错误或导致崩溃,但代码正试图播放它已经忘记的声音。移除卸载调用可以播放声音。
【讨论】:
以上是关于Allegro 声音不起作用(播放 wav 文件)的主要内容,如果未能解决你的问题,请参考以下文章