音频播放

Audio Playback Event此事件只能由音频队列播放函数触发,并将返回存储在变量 async_load 中的 DS Map,包含与触发事件的音频队列相关的不同键 / 值对。当你选择了要播放的音频队列和时,该事件由 回调 触发该音频队列中的缓冲区已播放完毕。

以下键将在DS地图中可用:

由于可以从多个缓冲区创建音频队列,因此当到达缓冲音频的每个部分的末尾时,可以为一个队列多次触发此事件,因此使用"buffer_id"键。

注意:变量 async_load 仅在异步事件中有效,因为指向的 DS 映射是在事件开始时创建的,然后在最后再次删除,使用这个变量被重置为 -1 的值。但是,必须使用相应的函数清理从该事件中创建的所有其他数据结构。

在下面给出的使用示例中,我们将创建一个音频队列,其中添加了10个缓冲的音频声音,然后播放队列:

audio_queue = audio_create_play_queue(buffer_s16, 11052, audio_mono);
for (var i = 0; i < 10; i++;)
   {
   audio_queue_sound(audio_queue, audio_buffer[i], 0, buffer_get_size(audio_buffer[i]));
   }
audio_play_sound(audio_queue, 0, true);

现在检测到录音的每个游戏步骤都会触发一个异步音频录制事件,您可以在其中处理录制的输入,如下所示:

var queue = async_load[? "queue_id"];
var num = 0;
if (queue == audio_queue)
   {
   for (var i = 0; i < 10; i++;)
      {
      if async_load[? "buffer_id"] == audio_buffer[i]
         {
         buffer_seek(audio_buffer[i], buffer_seek_start, 0);
         num = i;
         }
      }
   if (num == 9)
      {
      audio_stop_sound(audio_queue);
      audio_free_play_queue(audio_queue);
      }
 }

在这里我们检查队列ID,如果它是我们想要的,我们检查"buffer_id"键中的值以获得已完成播放的缓冲区。然后我们还将局部变量设置为该索引值以供稍后检查,并将缓冲区设置回该声音的起始位置。一旦我们的局部变量达到9,表明队列已完成,我们停止声音播放并释放队列。