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 文件)的主要内容,如果未能解决你的问题,请参考以下文章

IOS推送通知自定义声音不起作用

如何在 Debian Python 中播放声音文件?

我如何使用 javascript 在 IE7、IE8、Safari 和其他支持的浏览器中播放 .Wav 声音

Firefox 不会播放声音,但可以在其他浏览器中使用

使用 Pyqt4 和 QSound 播放声音

C++如何播放wav声音文件.Linux系统