Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как оборвать загрузку аудио файла (Sound.close()) (http://www.flasher.ru/forum/showthread.php?t=115315)

Pow R. Toc H. 26.08.2008 14:26

Как оборвать загрузку аудио файла (Sound.close())
 
Если делаю просто через Sound.close() выводит ошибку

Error: Error #2029: This URLStream object does not have a stream opened.

В самом же примере хелпа данное действие делается через блок try/catch:
Код:

try {
    snd.close();
    button.text = "Wait for loaded stream to finish.";
}
catch (error:IOError) {
    button.text = "Couldn't close stream " + error.message;   
}

А как всё таки правильно оборвать?

AL.exe 28.08.2008 02:37

Приравнять snd к null?

Хотя в мануале говорится, что URLStream.close() должен обрывать загрузку...

kutuzov 29.08.2008 15:33

Цитата:

Error: Error #2029: This URLStream object does not have a stream opened.
У меня данная ошибка появлялась только если пытаться закрыть соединения больше одного раза.
Если у вас после закрытия продолжает играть музыка, то это остатки забуференного.
При закрытии соединения вы можете остановить звук путем SoundChannel.stop();

konstantin.noir 30.08.2008 04:38

Можно сделать что-то наподобие класса-оболочки. Примерно так:
Код:

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

iznanka 26.06.2009 17:25

спасибо большое с утра с этими ошибками мучаюсь :)


Часовой пояс GMT +4, время: 05:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.