Итак, у меня был этот класс, работающий и играющий звук. Он внезапно прекратил играть звук. Если я отлаживаю его в хромовом отладчике, все члены данных получат заполнение, когда я создам его и вызываю функцию init().Chromecast Audio прекратил HTML 5 Web Audio API
var audioplayer = new cast.AudioPlayer();
audioplayer.init();
Тогда после того, как я уверен, что .wav файлы загружены, я называю мой метод игры
audioplayer.play(cast.AudioPlayer.welcome);//pass index of buffer
Вот класс
var cast = window.cast || {};
(function() {
'use strict';
AudioPlayer.applause = 0;
AudioPlayer.ding = 1;
AudioPlayer.buzzer = 2;
AudioPlayer.sigh = 3;
AudioPlayer.welcome = 4;
function AudioPlayer() {
try {
// Fix up for prefixing
window.AudioContext = window.AudioContext
|| window.webkitAudioContext;
this.context = new AudioContext();
} catch (e) {
console.log('Web Audio API is not supported in this browser');
}
this.soundBuffer = [];
this.loaded = false;
this.sources = [];
}
AudioPlayer.prototype = {
play : function(index){
this.sources[index].start(0);//play then reload the buffer to reduce latency between user action and sound playing
this.sources[index] = this.context.createBufferSource();
this.sources[index].buffer = this.soundBuffer[index];
this.sources[index].connect(this.context.destination);
},
init : function() {
// Fix up prefixing
window.AudioContext = window.AudioContext
|| window.webkitAudioContext;
this.context = new AudioContext();
var bufferLoader = new BufferLoader(this.context, this, [
'./sounds/applause.wav',
'./sounds/ding.wav',
'./sounds/buzzer.wav',
'./sounds/sigh.wav',
'./sounds/welcome.wav',],
this.finishedLoading);
bufferLoader.load();
},
//buffer up the sounds so they are immediately ready to play
finishedLoading : function(bufferList) {
this.sources[0] = this.context.createBufferSource();
this.sources[1] = this.context.createBufferSource();
this.sources[2] = this.context.createBufferSource();
this.sources[3] = this.context.createBufferSource();
this.sources[4] = this.context.createBufferSource();
this.sources[0].buffer = bufferList[0];
this.sources[1].buffer = bufferList[1];
this.sources[2].buffer = bufferList[2];
this.sources[3].buffer = bufferList[3];
this.sources[4].buffer = bufferList[4];
this.sources[0].connect(this.context.destination);
this.sources[1].connect(this.context.destination);
this.sources[2].connect(this.context.destination);
this.sources[3].connect(this.context.destination);
this.sources[4].connect(this.context.destination);
this.soundBuffer = bufferList;
this.loaded = true;
console.log('Sounds Loaded!');
}
};
// Exposes public functions and APIs
cast.AudioPlayer = AudioPlayer;
})();
А вот буфер загрузчика, извините о двух разных типах инкапсуляции.
function BufferLoader(context, cbObj, urlList, callback) {
this.context = context;
this.urlList = urlList;
this.onload = callback;
this.bufferList = new Array();
this.loadCount = 0;
this.callBackObj = cbObj;
}
BufferLoader.prototype.loadBuffer = function(url, index) {
// Load buffer asynchronously
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = "arraybuffer";
var loader = this;
request.onload = function() {
// Asynchronously decode the audio file data in request.response
loader.context.decodeAudioData(
request.response,
function(buffer) {
if (!buffer) {
console.log('error decoding file data: ' + url);
return;
}
loader.bufferList[index] = buffer;
if (++loader.loadCount == loader.urlList.length)
loader.onload.apply(loader.callBackObj, [loader.bufferList]);
},
function(error) {
console.error('decodeAudioData error', error);
}
);
}
request.onerror = function() {
console.log('BufferLoader: XHR error');
}
request.send();
}
BufferLoader.prototype.load = function() {
for (var i = 0; i < this.urlList.length; ++i)
this.loadBuffer(this.urlList[i], i);
}
Я не понимаю. Я отлично проигрывал звук. В моем отладчике нет ошибок, они просто перестали работать. Я протестировал свой хромометр и с другими приложениями. Все они передают аудио. Кто-нибудь видит какие-либо проблемы с этим классом?
Я даже перешагиваю его с помощью отладчика, проверяя все переменные, поскольку, по-видимому, у меня есть данные. Метод start() просто ничего не делает.
OK Я сделал еще несколько тестов с помощью браузера crhome, и он отлично работал. Здесь отсутствует контроль громкости. Я вижу тот, который приходит на Android с интерфейсом литья. Это доведено до конца. Есть ли что-то, что мне не хватает с контролем объема в самом API-интерфейсе WEB? – musterjunk
Просто держите журнал того, что я делаю. Я добавил некоторый контроль усиления в метод воспроизведения. Он изменяет громкость в хроме, но все же не изменяется в хромоте. // создаем управление усилением \t var gainNode = this.context.createGain(); \t // Подключите источник к узлу усиления. \t this.sources [index] .connect (gainNode); \t // Подключите узел усиления к месту назначения. \t gainNode.connect (this.context.destination); \t gainNode.gain.value = 4.0; \t \t \t this.sources [index] .start (0); // воспроизведение, перезагрузка буфера для уменьшения латентности между действием пользователя и воспроизведением звука – musterjunk