0

我有一个程序用作录音平台,每播放一个声音,我都会制作一个新声音。

        public function playAudioFile():void {
            trace("audio file:", currentAudioFile);
            sound = new Sound();
            sound.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); 
            sound.addEventListener(Event.COMPLETE, soundLoaded);
            sound.load(new URLRequest(soundLocation + currentAudioFile));
        }

        public function soundLoaded(event:Event):void {
            sound.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler); 
            sound.removeEventListener(Event.COMPLETE, soundLoaded);
            var soundChannel:SoundChannel = new SoundChannel();
            soundChannel = sound.play();
            soundChannel.addEventListener(Event.SOUND_COMPLETE, handleSoundComplete);
            trace('soundChannel?', soundChannel);
        }

        public function handleSoundComplete(event:Event):void {
            var soundChannel:SoundChannel = event.target as SoundChannel;
            soundChannel.stop();
            soundChannel.removeEventListener(Event.SOUND_COMPLETE,handleSoundComplete);
            soundChannel = null;
        }

32 次后,当我调用 sound.play()(在 soundLoaded 中)时,我停止获取 SoundChannel 对象。但是,我不需要 32 个 SoundChannel 对象,因为我只是连续播放这些声音,而不是同时播放。在“使用”它播放文件后如何摆脱 SoundChannel?

4

1 回答 1

2

您可以明确说明您使用的 soundChannel:

var soundChannel:SoundChannel = new SoundChannel();
soundChannel = sound.play();
soundChannel.addEventListener(Event.SOUND_COMPLETE,handleSoundComplete);

然后,当您播放完声音后,您可以将通道设置为 null,以便将其标记为垃圾收集:

function handleSoundComplete(e:Event):void
{
   var soundChannel:SoundChannel = e.target as SoundChannel;
   soundChannel.removeEventListener(Event.SOUND_COMPLETE,handleSoundComplete);
   soundChannel = null;
}

请记住,当声音加载完成时,您需要删除上面代码中显示的那些事件侦听器。

另请记住,当您将某些内容设置为 null 时,这只是将其设置为垃圾收集的公平游戏,它不会强制进行垃圾收集。

另一个注意事项是,我发布的这段代码只是一个示例,您可能想考虑拥有几个保持活动状态的声道实例,并根据需要重复使用。在这种情况下需要管理,但是您不会不断地创建/杀死声道。

于 2013-04-19T15:42:52.900 回答