2015-08-30 3 views
1

Итак, у меня был этот класс, работающий и играющий звук. Он внезапно прекратил играть звук. Если я отлаживаю его в хромовом отладчике, все члены данных получат заполнение, когда я создам его и вызываю функцию 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() просто ничего не делает.

+0

OK Я сделал еще несколько тестов с помощью браузера crhome, и он отлично работал. Здесь отсутствует контроль громкости. Я вижу тот, который приходит на Android с интерфейсом литья. Это доведено до конца. Есть ли что-то, что мне не хватает с контролем объема в самом API-интерфейсе WEB? – musterjunk

+0

Просто держите журнал того, что я делаю. Я добавил некоторый контроль усиления в метод воспроизведения. Он изменяет громкость в хроме, но все же не изменяется в хромоте. // создаем управление усилением \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

ответ

0

ОК, это было что-то пропустить с моим устройством для хромирования. Я получал аудио от netflix, поэтому я начал netflix, а затем начал игру, чтобы взять на себя хромист. Звук только начал работать. Потрачено около 48 часов на то, что я не могу воспроизвести сейчас. Любые комментарии к тому, почему это может произойти, будут очень признательны.

+0

Проблемы возникли. Кто-нибудь знает дополнительную инициализацию, которая необходима. – musterjunk

1

Окончательное решение моей проблемы в том, чтобы заменить строки

window.AudioContext = window.AudioContext 
      || window.webkitAudioContext; 
var context = new AudioContext(); 

с

var context = new window.AudioContext(); 

Кажется, что или (||) был в пользу window.webkitAudioContext. Это устаревший интерфейс и не работает на моем хромоте.

Смежные вопросы