Показать сообщение отдельно
Старый 30.08.2008, 04:38
konstantin.noir вне форума Посмотреть профиль Отправить личное сообщение для konstantin.noir Найти все сообщения от konstantin.noir
  № 4  
Ответить с цитированием
konstantin.noir

Регистрация: Jan 2008
Сообщений: 24
Можно сделать что-то наподобие класса-оболочки. Примерно так:
Код:
package
{
    import flash.events.EventDispatcher;
	
    //можно и не наследовать от EventDispatcher, если события от этого класса не нужны

    public class SoundWrapper extends EventDispatcher
    {
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.net.URLRequest;

        //экземпляр Sound
        protected var __sound:Sound;
        public function get sound():Sound
        {
            return __sound;
        }

        //экземпляр SoundChannel
        protected var __soundChannel:SoundChannel;
        public function get soundChannel():SoundChannel
        {
            return __soundChannel;
        }
        //true - если произошло событие OPEN объекта __sound
        protected var __isOpened:Boolean;
        /**
        *    если true, то при событии OPEN объекта __sound 
        *    нужно закрыть соединение
        */
        protected var __toClose:Boolean;

        //constructor
        public function SoundWrapper()
        {
            __sound = new Sound();
            __sound.addEventListener(Event.OPEN, __onSoundOpen);
            __sound.addEventListener(IOErrorEvent.IO_ERROR, __onSoundIOError);
            __isOpened = false;
            __toClose = false;
        }

        //начинает воспроизведение
        public function play():void
        {
            __soundChannel = __sound.play();
        }
		
        //останавливает воспроизведение
        public function stop():void
        {
            if(__soundChannel != null)
            {
                __soundChannel.stop();
            }
        }
		
        //начинает загрузку
        public function load(__aURLRequest:URLRequest):void
        {
            __sound.load(__aURLRequest);
        }
		
        //останавливает загрузку
        public function close():void
        {
            if(__isOpened)
            {
                __sound.close();
                __sound.removeEventListener(Event.OPEN, __onSoundOpen);
                __sound.removeEventListener(IOErrorEvent.IO_ERROR, __onSoundIOError);
            }
            else
            {
                __toClose = true;
            }
        }

        //при событии OPEN объекта __sound
        protected function __onSoundOpen(event:Event):void
        {
            __isOpened = true;
            if(__toClose)
            {
                close();
            }
        }
		
        //при событии IOError объекта __sound
        protected function __onSoundIOError(event:IOErrorEvent):void
        {
	
        }
    }
}
Соответственно, использование будет как и для Sound (этот объект будет тоже одноразовым)
Ещё можно проверять экземпляр Sound в этом классе на bytesLoaded, потому что бывают ситуации, когда загрузка началась (т.е. событие OPEN произошло) и больше ничего не грузится. Тогда при попытке закрыть тоже появляется ошибка #2029


Последний раз редактировалось konstantin.noir; 30.08.2008 в 05:01.