AS3 SoundChannel stop() не работает

У меня есть класс SoundHandler со следующими переменными:

private static var musicChannel: SoundChannel;
private static var effectsChannel: SoundChannel;
private static var narrationChannel: SoundChannel;
private static var narrationMuted:Boolean;

В функции инициализации:

var classReference: Class = getDefinitionByName(narrationClassName) as Class; 
var s: Sound = new classReference(); 
narrationChannel = s.play();

Эффекты и музыкальные каналы работают нормально, но канал повествования не останавливается при вызове stop(). Вот функция:

    public static function playNarration(narrationClassName: String): void {
        if (!narrationMuted) {
            narrationChannel.stop(); //NOT WORKING--THE SOUND KEEPS PLAYING!
            var classReference: Class = getDefinitionByName(narrationClassName) as Class;
            var s: Sound = new classReference();
            narrationChannel = s.play();
        }
    }

SoundMixer.stopAll () останавливает звук повествования, но я не могу его использовать, потому что он также останавливает музыку и звуковые эффекты.

Я подозреваю, что stop() не работает из-за того, как я создаю объект Sound, но я не уверен. Внешняя загрузка не решает проблему:

     public static function playNarration(narrationClassName: String): void {
            if (!narrationMuted) {
                narrationChannel.stop();
                var s: Sound = new Sound();
                s.addEventListener(Event.COMPLETE, onNarrationSoundLoaded);
                var req: URLRequest = new URLRequest("sounds/Narration/sub_narr_1.mp3");
                s.load(req);
            }
        }
        private static function onNarrationSoundLoaded(e: Event): void {
            var localSound: Sound = e.target as Sound;
            narrationChannel = localSound.play();
        }

Сохранение повествования звучит как статические переменные, также не работает:

private static var subNarr1:Sound;

public static function playNarration(narrationClassName: String): void {
            if (!narrationMuted) {      
                narrationChannel.stop();
                narrationChannel = subNarr1.play();
            }
        }

Любая помощь приветствуется. Спасибо!

1 ответ

Я предполагаю, что ваша функция инициализации вызывается дважды. Каждый раз, когда вы звоните narrationChannel = s.play(); Вы теряете ссылку на предыдущий экземпляр.

Например, если вы делаете это:

narrationChannel = s.play(); //narrationChannel points to what we'll call "instance 1"
narrationChannel = s.play(); //narrationChannel points to what we'll call "instance 2"
narrationChannel.stop(); //you just stopped 'instance 2' but 'instance 1' is still playing

Попробуйте - добавьте команды трассировки при каждом запуске или остановке s или же narrationChannel в любом месте вашего кода: trace("Остановка канала!"); narrationChannel.stop(); var classReference: Class = getDefinitionByName(narrationClassName) as Class; var s: Sound = new classReference(); trace("Воспроизведение нового звука в канале!") narrationChannel = s.play();

Сделайте это в своей функции инициализации, а также воспроизведите повествование и везде, где вы запускаете или останавливаете звук или канал. Я подозреваю, что вы увидите это в выводе вашей консоли:

Playing new sound in the channel!
Playing new sound in the channel!
Stopping the channel!

а это значит, вам просто нужно отследить, как s.play() вызывается дважды narrationChannel.stop()

Я могу быть совершенно неправ, но это кажется мне наиболее вероятным объяснением.

Другие вопросы по тегам