6

How to check reliably if a SoundChannel is still playing a sound?

For example,

[Embed(source="song.mp3")]
var Song: Class;

var s: Song = new Song();
var ch: SoundChannel = s.play();

// how to check if ch is playing?
Randy Sugianto 'Yuku'
  • 71,383
  • 57
  • 178
  • 228

3 Answers3

11

I've done a little research and I can't find a way to query any object to determine if a sound is playing. You'll have to write a wrapper class and manage it yourself it seems.


package
{
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;

    public class SoundPlayer
    {
        [Embed(source="song.mp3")]
        private var Song:Class;

        private var s:Song;
        private var ch:SoundChannel;
        private var isSoundPlaying:Boolean;

        public function SoundPlayer()
        {
            s = new Song();
            play();
        }

        public function play():void
        {
            if(!isPlaying)
            {
                ch = s.play();
                ch.addEventListener(
                    Event.SOUND_COMPLETE,
                    handleSoundComplete);
                isSoundPlaying = true;
            }
        }

        public function stop():void
        {
            if(isPlaying)
            {
                ch.stop();
                isSoundPlaying = false;
            }
        }

        private function handleSoundComplete(ev:Event):void
        {
            isSoundPlaying = false;
        }
    }
}
James Fassett
  • 40,306
  • 11
  • 38
  • 43
2

I know this is really old but i found this link that i think is quite helpful. it explains how to monitor and play a file from a certain point.

http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7d21.html

RustyH
  • 473
  • 7
  • 22
1

One of the ways to check if sound is still playing, and not using any managers, would be checking soundChannel.position in two consecutive enterFrame listener calls, if mismatched, then the sound is still playing.

private var oldPosition:Number;
function onEnterFrame(e:Event):void {
    var stillPlaying:Boolean;
    var newPosition=soundChannel.position;
    if (newPosition-oldPosition>1) stillPlaying=true; else stillPlaying=false;
    oldPosition=newPosition;
}
Vesper
  • 18,599
  • 6
  • 39
  • 61