AS3项目的声音库

时间:2011-11-22 10:50:18

标签: flash actionscript-3 audio

我正在寻找一个简单易用的as3库,它可以帮助我管理我开发的Flash应用中的声音。

我需要一些可以保持声音的东西(不超过25个),当我打电话给某些声音播放时,它应该播放它。

3 个答案:

答案 0 :(得分:3)

我使用“SoundManager”类来处理所有声音。这是一个非常简单易用的库来处理声音。

package
{
    import com.greensock.TweenMax;
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.media.SoundLoaderContext;
    import flash.media.SoundTransform;
    import flash.net.URLRequest;
    import flash.utils.Dictionary;
    import flash.utils.getQualifiedClassName;

    /**
     * The SoundManager is a singleton that allows you to have various ways to control sounds in your project.
     * <p />
     * The SoundManager can load external or library sounds, pause/mute/stop/control volume for one or more sounds at a time,
     * fade sounds up or down, and allows additional control to sounds not readily available through the default classes.
     * <p />
     * This class is dependent on TweenLite (http://www.tweenlite.com) to aid in easily fading the volume of the sound.
     *
     * @author Matt Przybylski [http://www.reintroducing.com]
     * @version 1.0
     */

     /**
     * 
     * Modified by Oliver-Bogdan Iancu
     * 
     */

    public class SoundManager
    {
//- PRIVATE & PROTECTED VARIABLES -------------------------------------------------------------------------
        // singleton instance
        private static var _instance:SoundManager;
        private static var _allowInstance:Boolean;
        private var _soundsDict:Dictionary;
        private var _sounds:Array;
        private var $callBackFun:Function;

//- PUBLIC & INTERNAL VARIABLES ---------------------------------------------------------------------------
//- CONSTRUCTOR -------------------------------------------------------------------------------------------
        // singleton instance of SoundManager
        public static function getInstance():SoundManager
        {
            if (SoundManager._instance == null)
            {
                SoundManager._allowInstance = true;
                SoundManager._instance = new SoundManager();
                SoundManager._allowInstance = false;
            }
            return SoundManager._instance;
        }
        public function SoundManager()
        {
            this._soundsDict = new Dictionary(true);
            this._sounds = new Array();
            if (!SoundManager._allowInstance)
            {
                throw new Error("Error: Use SoundManager.getInstance() instead of the new keyword.");
            }
        }
//- PRIVATE & PROTECTED METHODS ---------------------------------------------------------------------------
//- PUBLIC & INTERNAL METHODS -----------------------------------------------------------------------------
        /**
         * Adds a sound from the library to the sounds dictionary for playing in the future.
         *
         * @param $linkageID The class name of the library symbol that was exported for AS
         * @param $name The string identifier of the sound to be used when calling other methods on the sound
         *
         * @return Boolean A boolean value representing if the sound was added successfully
         */
        public function addLibrarySound($linkageID:*, $name:String):Boolean
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                if (this._sounds[i].name == $name) return false;
            }
            var sndObj:Object = new Object();
            var snd:Sound = $linkageID;
            sndObj.name = $name;
            sndObj.sound = snd;
            sndObj.channel = new SoundChannel();
            sndObj.position = 0;
            sndObj.paused = true;
            sndObj.volume = 1;
            sndObj.startTime = 0;
            sndObj.loops = 0;
            sndObj.pausedByAll = false;
            this._soundsDict[$name] = sndObj;
            this._sounds.push(sndObj);
            return true;
        }
        /**
         * Adds an external sound to the sounds dictionary for playing in the future.
         *
         * @param $path A string representing the path where the sound is on the server
         * @param $name The string identifier of the sound to be used when calling other methods on the sound
         * @param $buffer The number, in milliseconds, to buffer the sound before you can play it (default: 1000)
         * @param $checkPolicyFile A boolean that determines whether Flash Player should try to download a cross-domain policy file from the loaded sound's server before beginning to load the sound (default: false)
         *
         * @return Boolean A boolean value representing if the sound was added successfully
         */
        public function addExternalSound($path:String, $name:String, $buffer:Number = 1000, $checkPolicyFile:Boolean = false):Boolean
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                if (this._sounds[i].name == $name) return false;
            }
            var sndObj:Object = new Object();
            var snd:Sound = new Sound(new URLRequest($path), new SoundLoaderContext($buffer, $checkPolicyFile));
            sndObj.name = $name;
            sndObj.sound = snd;
            sndObj.channel = new SoundChannel();
            sndObj.position = 0;
            sndObj.paused = true;
            sndObj.volume = 1;
            sndObj.startTime = 0;
            sndObj.loops = 0;
            sndObj.pausedByAll = false;
            this._soundsDict[$name] = sndObj;
            this._sounds.push(sndObj);
            return true;
        }
        /**
         * Removes a sound from the sound dictionary.  After calling this, the sound will not be available until it is re-added.
         *
         * @param $name The string identifier of the sound to remove
         *
         * @return void
         */
        public function removeSound($name:String):void
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                if (this._sounds[i].name == $name)
                {
                    this._sounds[i] = null;
                    this._sounds.splice(i, 1);
                }
            }
            delete this._soundsDict[$name];
        }
        /**
         * Removes all sounds from the sound dictionary.
         *
         * @return void
         */
        public function removeAllSounds():void
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                this._sounds[i] = null;
            }
            this._sounds = new Array();
            this._soundsDict = new Dictionary(true);
        }
        /**
         * Plays or resumes a sound from the sound dictionary with the specified name.
         *
         * @param $name The string identifier of the sound to play
         * @param $volume A number from 0 to 1 representing the volume at which to play the sound (default: 1)
         * @param $startTime A number (in milliseconds) representing the time to start playing the sound at (default: 0)
         * @param $loops An integer representing the number of times to loop the sound (default: 0)
         *
         * @return void
         */
        public function playSound($name:String, $volume:Number = 1, $startTime:Number = 0, $loops:int = 0, $callBackFun:Function = null):SoundChannel
        {

            this.$callBackFun = $callBackFun;
            var snd:Object = this._soundsDict[$name];
            snd.volume = $volume;
            snd.startTime = $startTime;
            snd.loops = $loops;
            if (snd.paused)
            {
                snd.channel = snd.sound.play(snd.position, snd.loops, new SoundTransform(snd.volume));
            }
            else
            {
                snd.channel = snd.sound.play($startTime, snd.loops, new SoundTransform(snd.volume));
            }
            if ($callBackFun != null)
                snd.channel.addEventListener(Event.SOUND_COMPLETE, onSoundCompleteEvent);
            snd.paused = false;

            return snd.channel;
        }

        private function onSoundCompleteEvent(e:Event):void 
        {
            $callBackFun.call();
        }
        /**
         * Stops the specified sound.
         *
         * @param $name The string identifier of the sound
         *
         * @return void
         */
        public function stopSound($name:String):void
        {
            var snd:Object = this._soundsDict[$name];
            snd.paused = true;
            snd.channel.stop();
            snd.position = snd.channel.position;
        }
        /**
         * Pauses the specified sound.
         *
         * @param $name The string identifier of the sound
         *
         * @return void
         */
        public function pauseSound($name:String):void
        {
            var snd:Object = this._soundsDict[$name];
            snd.paused = true;
            snd.position = snd.channel.position;
            snd.channel.stop();
        }
        /**
         * Plays all the sounds that are in the sound dictionary.
         *
         * @param $useCurrentlyPlayingOnly A boolean that only plays the sounds which were currently playing before a pauseAllSounds() or stopAllSounds() call (default: false)
         *
         * @return void
         */
        public function playAllSounds($useCurrentlyPlayingOnly:Boolean = false):void
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                var id:String = this._sounds[i].name;
                if ($useCurrentlyPlayingOnly)
                {
                    if (this._soundsDict[id].pausedByAll)
                    {
                        this._soundsDict[id].pausedByAll = false;
                        this.playSound(id);
                    }
                }
                else
                {
                    this.playSound(id);
                }
            }
        }
        /**
         * Stops all the sounds that are in the sound dictionary.
         *
         * @param $useCurrentlyPlayingOnly A boolean that only stops the sounds which are currently playing (default: true)
         *
         * @return void
         */
        public function stopAllSounds($useCurrentlyPlayingOnly:Boolean = true):void
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                var id:String = this._sounds[i].name;
                if ($useCurrentlyPlayingOnly)
                {
                    if (!this._soundsDict[id].paused)
                    {
                        this._soundsDict[id].pausedByAll = true;
                        this.stopSound(id);
                    }
                }
                else
                {
                    this.stopSound(id);
                }
            }
        }
        /**
         * Pauses all the sounds that are in the sound dictionary.
         *
         * @param $useCurrentlyPlayingOnly A boolean that only pauses the sounds which are currently playing (default: true)
         *
         * @return void
         */
        public function pauseAllSounds($useCurrentlyPlayingOnly:Boolean = true):void
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                var id:String = this._sounds[i].name;
                if ($useCurrentlyPlayingOnly)
                {
                    if (!this._soundsDict[id].paused)
                    {
                        this._soundsDict[id].pausedByAll = true;
                        this.pauseSound(id);
                    }
                }
                else
                {
                    this.pauseSound(id);
                }
            }
        }
        /**
         * Fades the sound to the specified volume over the specified amount of time.
         *
         * @param $name The string identifier of the sound
         * @param $targVolume The target volume to fade to, between 0 and 1 (default: 0)
         * @param $fadeLength The time to fade over, in seconds (default: 1)
         *
         * @return void
         */
        public function fadeSound($name:String, $targVolume:Number = 0, $fadeLength:Number = 1):void
        {
            var fadeChannel:SoundChannel = this._soundsDict[$name].channel;
            TweenMax.to(fadeChannel , $fadeLength, { volume: $targVolume } );
        }

        /**
         * Mutes the volume for all sounds in the sound dictionary.
         *
         * @return void
         */
        public function muteAllSounds():void
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                var id:String = this._sounds[i].name;
                this.setSoundVolume(id, 0);
            }
        }
        /**
         * Resets the volume to their original setting for all sounds in the sound dictionary.
         *
         * @return void
         */
        public function unmuteAllSounds():void
        {
            for (var i:int = 0; i <this._sounds.length; i++)
            {
                var id:String = this._sounds[i].name;
                var snd:Object = this._soundsDict[id];
                var curTransform:SoundTransform = snd.channel.soundTransform;
                curTransform.volume = snd.volume;
                snd.channel.soundTransform = curTransform;
            }
        }
        /**
         * Sets the volume of the specified sound.
         *
         * @param $name The string identifier of the sound
         * @param $volume The volume, between 0 and 1, to set the sound to
         *
         * @return void
         */
        public function setSoundVolume($name:String, $volume:Number):void
        {
            var snd:Object = this._soundsDict[$name];
            var curTransform:SoundTransform = snd.channel.soundTransform;
            curTransform.volume = $volume;
            snd.channel.soundTransform = curTransform;
        }
        /**
         * Gets the volume of the specified sound.
         *
         * @param $name The string identifier of the sound
         *
         * @return Number The current volume of the sound
         */
        public function getSoundVolume($name:String):Number
        {
            return this._soundsDict[$name].channel.soundTransform.volume;
        }
        /**
         * Gets the position of the specified sound.
         *
         * @param $name The string identifier of the sound
         *
         * @return Number The current position of the sound, in milliseconds
         */
        public function getSoundPosition($name:String):Number
        {
            return this._soundsDict[$name].channel.position;
        }
        /**
         * Gets the duration of the specified sound.
         *
         * @param $name The string identifier of the sound
         *
         * @return Number The length of the sound, in milliseconds
         */
        public function getSoundDuration($name:String):Number
        {
            return this._soundsDict[$name].sound.length;
        }
        /**
         * Gets the sound object of the specified sound.
         *
         * @param $name The string identifier of the sound
         *
         * @return Sound The sound object
         */
        public function getSoundObject($name:String):Sound
        {
            return this._soundsDict[$name].sound;
        }
        /**
         * Identifies if the sound is paused or not.
         *
         * @param $name The string identifier of the sound
         *
         * @return Boolean The boolean value of paused or not paused
         */
        public function isSoundPaused($name:String):Boolean
        {
            return this._soundsDict[$name].paused;
        }
        /**
         * Identifies if the sound was paused or stopped by calling the stopAllSounds() or pauseAllSounds() methods.
         *
         * @param $name The string identifier of the sound
         *
         * @return Number The boolean value of pausedByAll or not pausedByAll
         */
        public function isSoundPausedByAll($name:String):Boolean
        {
            return this._soundsDict[$name].pausedByAll;
        }
//- EVENT HANDLERS ----------------------------------------------------------------------------------------
//- GETTERS & SETTERS -------------------------------------------------------------------------------------
        public function get sounds():Array
        {
            return this._sounds;
        }
//- HELPERS -----------------------------------------------------------------------------------------------
        public function toString():String
        {
            return getQualifiedClassName(this);
        }
//- END CLASS ---------------------------------------------------------------------------------------------
    }
}

答案 1 :(得分:1)

我建议http://www.anegmetex.com/devblog/2011/04/15/zvuki-i-muzyka/ 俄语文本,但代码清晰

答案 2 :(得分:1)

    import flash.display.MovieClip;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.media.SoundTransform;
import flash.net.URLRequest;

public class SoundManager extends MovieClip
{
    private var _loadSound:Sound;
    public var channel:SoundChannel;
    private var _loadSoundArr:Array = new Array();
    private var _soundTransform:SoundTransform;
    public var vol:Number=0;  

    /**Construtor*/
    public function SoundManager()
    {
        //trace("SoundManager.SoundManager");
        channel         = new SoundChannel();

    }

    /**Set the sound  pass as string to push in array.*/
    public function setLoadSounds(soundIDParam:String, soundPathParam:String )
    {
        _loadSoundArr.push( { soundID:soundIDParam, soundPath:soundPathParam } );
        soundLoader();

    }

    /**Load Sound*/
    private function soundLoader()
    {
        //trace("SoundManager.soundLoader");
        if(_loadSoundArr.length > 0)
        {
            //StaticClass.SOUND_LOAD_IN_PROGRESS = true;

            _loadSound = new Sound();
            _loadSound.load(new URLRequest(_loadSoundArr[0].soundPath));
            _loadSound.addEventListener(Event.COMPLETE, soundCompleteHandler);
            _loadSound.addEventListener(IOErrorEvent.IO_ERROR, showError);
            _loadSound.addEventListener(IOErrorEvent.NETWORK_ERROR, showError);
            _loadSound.addEventListener(SecurityErrorEvent.SECURITY_ERROR, showSecurityError);

        }
    }

    private function showError(e:IOErrorEvent)
    {
        //trace("SoundManager.showError");
        trace(e);
    }
    private function showSecurityError(e:SecurityErrorEvent)
    {
        //trace("SoundManager.showSecurityError");
        trace(e);
    }

    /**Sound complete handler,push sound into array*/
    private function soundCompleteHandler(evt:Event):void
    {
        //trace("SoundManager.soundCompleteHandler");
        //StaticClass.loadedSoundArr.push( { soundID:_loadSoundArr[0].soundID, soundPath:_loadSoundArr[0].soundPath, soundObj:evt.target} )
        // taken [0] due to every time we shifting array, so we will load first value only
        _loadSoundArr.shift();
        //StaticClass.SOUND_LOAD_IN_PROGRESS = false;
        soundLoader();
    }

    /**Play sound*/
    public function playSound(target_array:Array, soundIDParam:String, startTime:Number, loop:Number):void
    {
        //trace("SoundManager.playSound");
        for (var i = 0; i < target_array.length; i++)
        {
            if (soundIDParam == target_array[i].path)
            {
                var playSound:Sound = new Sound();

                playSound.addEventListener(IOErrorEvent.IO_ERROR, function(evt:IOErrorEvent):void 
                {
                    trace("evt >>" + evt) ;
                } );

                playSound.load(new URLRequest(target_array[i].path));
                channel = playSound.play(startTime, loop);
                break;
            }
        }
    }

    /**Stop sound*/
    public function stopSound(targetArray:Array, soundIDParam:String="")
    {
        //trace("SoundManager.stopSound : " + soundIDParam);
        if(soundIDParam != "")
        {
            for (var i = 0; i < targetArray.length; i++)
            {
                if (soundIDParam == targetArray[i].path)
                {
                    if (channel != null)
                    {
                        channel.stop();
                        //SoundMixer.stopAll();
                    }
                    break;
                }
            }
        }
        else
        {
            if (channel != null)
            {
                channel.stop();
            }
        }
    }

    /*public function isPlaying():Boolean
    {
        if (_loadSound.is)
    }*/

    /** Do mute or unmute sound*/
    public function soundStateChange():void
    {
        //trace("SoundManager.soundStateChange");
        if(StaticClass.SOUND_MUTE == true)
        {
            muteSound();
        }else
        {
            unMuteSound();
        }
    }

    public function volumeController(vLevel:Number):void
    {
        var soundTransform:SoundTransform = new SoundTransform(vLevel);
        channel.soundTransform = soundTransform;
    }

    /** Do mute sound*/
    private function muteSound():void 
    {
        //trace("SoundManager.muteSound");
        SoundMixer.soundTransform = new SoundTransform(0);
        //_soundTransform.volume = 0;
        //TweenLite.to(_soundTransform, 2, {volume:0});
        //channel.soundTransform = _soundTransform; 
        //StaticClass.SOUND_MUTE = false;
    }

    /** Do unmute sound*/
    private function unMuteSound():void
    {
        //trace("SoundManager.unMuteSound");
        SoundMixer.soundTransform = new SoundTransform(0.5);
        //_soundTransform = new SoundTransform();
        //_soundTransform.volume = 1
        //TweenLite.to(_soundTransform, 2, { volume:1 } );
        //channel.soundTransform = _soundTransform; 
        //StaticClass.SOUND_MUTE = true;
    }

    public function getSoundChannel():SoundChannel
    {
        return channel; 
    }

    public function setVol()
    {
         _soundTransform = channel.soundTransform
         _soundTransform.volume =  vol;
          SoundMixer.soundTransform = _soundTransform;

        /*  _soundTransform = channel.soundTransform;
        trace("volume is " + vol);
        _soundTransform.volume = vol;
        channel.soundTransform = _soundTransform;*/


        /*if ()
        {
            trace("if");
            _soundTransform.volume += .1;
            if(_soundTransform.volume > 1)
            {
                _soundTransform.volume = 1;
            } 
            channel.soundTransform = _soundTransform;
        }

        else
        {
            trace("else");
            _soundTransform.volume -= .1;
            if(_soundTransform.volume < 0)
            {
                _soundTransform.volume = 0;
            } 
            channel.soundTransform = _soundTransform;
        }*/
    }

}//Class Ends