ActionScript 3.0 Загрузка и воспроизведение нескольких звуков

Я написал функцию loadSound, которая обрабатывает загрузку и воспроизведение нескольких звуков. Эта функция прекрасно работает, когда я вызываю эту функцию в другом ключевом кадре, т.е. в кадре, в котором функция не записана. Но когда я вызываю функцию в том же кадре, в котором написана функция, звуки смешиваются. Например, функция написана в 1-м ключевом кадре. Если я вызываю эту функцию во 2-м, 3-м и 4-м ключевых кадрах (с разными звуками), она работает нормально. Но когда я вызываю одну и ту же функцию в 1-м, 2-м и 3-м ключевых кадрах, все это портится. В 1-м ключевом кадре звук воспроизводится правильно. Когда я перехожу на 2-й ключевой кадр, 2-й звук играет. Но когда я возвращаюсь к 1-му ключевому кадру, все звуки 2-го и 1-го ключевых кадров смешиваются. Этого не происходит, когда я вызываю функцию во 2-м, 3-м и 4-м ключевых кадрах.

Ниже моя функция:

import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.errors.IOError;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.MovieClip;
import flash.media.SoundTransform;

stop();

var s:Sound;
var localSound:SoundChannel = new SoundChannel();
var req:URLRequest;
var loadedPct:uint;
var currentFrameArr:Array = ["One","Two","Three"];
var urlArr:Array = ["sound/m01_t01_s01.mp3","sound/m01_t01_s02.mp3","sound/page10_11.mp3"];



function loadSnd(currentFrm:String)
{
    s = new Sound();
    s.addEventListener(ProgressEvent.PROGRESS, onSoundProgress);
    s.addEventListener(Event.COMPLETE, onSoundLoaded);
    s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

    localSound.stop();

    for (var i:uint=0; i<currentFrameArr.length; i++)
    {
        if (currentFrm == currentFrameArr[i])
        {
            req = new URLRequest(urlArr[i]);
            break;
        }
    }
    s.load(req);
}

function onSoundProgress(evt:ProgressEvent):void
{
    loadedPct = Math.round(100 * (evt.bytesLoaded / evt.bytesTotal));
    trace("The sound is " + loadedPct + " % loaded");
}

function onSoundLoaded(evt:Event):void
{
    localSound = s.play();
}

function onIOError(evt:IOErrorEvent):void
{
    trace("The sound could not be loaded: " + evt.text);
}

Вызов этой функции в разных кадрах:

loadSnd("One");
loadSnd("Two");

так далее

Если я передаю параметр 'One' в loadSnd, он воспроизводит 1-й элемент в urlArray, 'Two' 2-й элемент и так далее.

Но если я включу soundChannel.stop() в мои кнопки, это будет работать нормально. Хотя мне бы хотелось встроить его в саму функцию, так как я планирую написать файл класса, который будет включен в мой проект. Ниже код, если включен, работает просто отлично.

nextBtn.addEventListener(MouseEvent.CLICK, onNextClk);
function onNextClk(evt:MouseEvent):void
{
          localSound.stop();
          this.nextFrame();
}


prevBtn.addEventListener(MouseEvent.CLICK, onPrevClk);
function onPrevClk(evt:MouseEvent):void
{
          localSound.stop();
          this.prevFrame();
}

Я также думал о том, что произойдет, если кадр будет изменен без щелчка мышью, например, если анимация заканчивается, и начинается новый ключевой кадр, и я хотел бы включить другой звуковой файл в этот ключевой кадр. Если soundChannel.stop() включен в саму функцию, независимо от того, какое бы событие ни происходило: щелчок мышью по кнопке или завершение анимации, он остановит предыдущий звук и воспроизведет новый.

Любая помощь будет принята с благодарностью, так как я долго ломаю голову над этим.

1 ответ

Got the Solution. The SoundMixer.stopAll(); statement did the trick. The complete workable function is pasted below:

import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.errors.IOError;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.MovieClip;
import flash.media.SoundTransform;

stop();

var s:Sound;
var localSound:SoundChannel = new SoundChannel();
var req:URLRequest;
var loadedPct:uint;
var currentFrameArr:Array = ["One","Two","Three"];
var urlArr:Array = ["sound/m01_t01_s01.mp3","sound/m01_t01_s02.mp3","sound/page10_11.mp3"];

function loadSnd(currentFrm:String)
{
    s = new Sound();
    s.addEventListener(ProgressEvent.PROGRESS, onSoundProgress);
    s.addEventListener(Event.COMPLETE, onSoundLoaded);
    s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

    SoundMixer.stopAll();
    localSound.stop();

    for (var i:uint=0; i<currentFrameArr.length; i++)
    {
        if (currentFrm == currentFrameArr[i])
        {
            req = new URLRequest(urlArr[i]);
            break;
        }
    }
    s.load(req);
}

function onSoundProgress(evt:ProgressEvent):void
{
    loadedPct = Math.round(100 * (evt.bytesLoaded / evt.bytesTotal));
    trace("The sound is " + loadedPct + " % loaded");
}

function onSoundLoaded(evt:Event):void
{
    localSound = s.play();
}

function onIOError(evt:IOErrorEvent):void
{
    trace("The sound could not be loaded: " + evt.text);
}

Calling the function:

loadSnd("One");
loadSnd("Two"); etc
Другие вопросы по тегам