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;