SoundJS - регистрация 4 звуков в аудиопризме

Я загружаю аудиозапись SoundJS 1.0 с помощью preloadJS 1.0. Аудиосприятие разделено на 4 звука, которые я называю a, b, c и d. (В другом месте кода он рандомизирует, какой из 4 звуков играть.)

Вот основной код загрузки и объявления:

 var queue = new createjs.LoadQueue();
 createjs.Sound.alternateExtensions = ["mp3"];
 queue.addEventListener("complete",handleComplete);

 //load audiosprite and define start/duration times with variables.
 queue.loadFile({src:path,data:{
     audioSprite:[
     {id:sound+"a", startTime:aStart, duration: aDur},
     {id:sound+"b", startTime:bStart, duration: bDur},
     {id:sound+"c", startTime:cStart, duration: cDur},
     {id:sound+"d", startTime:dStart, duration: dDur},
     ]
     }});

 //register the 4 audioSprite sounds as individual sound instances
    myAudio[sound+"a"] = createjs.Sound.createInstance(sound+"a");
    myAudio[sound+"b"] = createjs.Sound.createInstance(sound+"b");
    myAudio[sound+"c"] = createjs.Sound.createInstance(sound+"c");
    myAudio[sound+"d"] = createjs.Sound.createInstance(sound+"d");

Когда я загружаю звук, я получаю: Uncaught TypeError: Невозможно прочитать свойство '1' из null

Если я закомментирую последние 3 строки и просто создаю 1 экземпляр (например, звук +"а"), звук загружается, и я не получаю ошибки, но, очевидно, я получаю только 1 из 4 частей.

Я чувствую, что проблема в том, что мне не нравится, когда я так называю createInstance. Как правильно это сделать?

1 ответ

Вам нужно использовать loadManifest для нескольких файлов; loadFile загружает только один файл.

 queue.loadManifest({src:path,data:{
 audioSprite:[
 {id:sound+"a", startTime:aStart, duration: aDur},
 {id:sound+"b", startTime:bStart, duration: bDur},
 {id:sound+"c", startTime:cStart, duration: cDur},
 {id:sound+"d", startTime:dStart, duration: dDur},
 ]
 }});

Редактировать - функция handlePreloadComplete из строки 286 выглядит немного подозрительно и может быть ошибкой https://createjs.com/docs/soundjs/files/soundjs_AbstractPlugin.js.html

p._handlePreloadComplete = function (event) {
    var src = event.target.getItem().src;
    this._audioSources[src] = event.result;
    for (var i = 0, l = this._soundInstances[src].length; i < l; i++) {
        var item = this._soundInstances[src][i];
        item.playbackResource = this._audioSources[src];
        // ToDo consider adding play call here if playstate == playfailed
        this._soundInstances[src] = null;
    }
};

Итерирование по длине this._soundInstances[src], но затем установка нулевого значения на первой итерации даст указанную вами ошибку.

Возможно, так и должно быть

this._soundInstances[src][i] = null;
Другие вопросы по тегам