Search code examples
javascriptmozilla

Variable is null (only in Mozilla)


Here is the resume of the code:

var client = new BinaryClient('ws://localhost:9001');
var context = null;
var store_data  = null;
//(.....)
if (!navigator.getUserMedia)
      navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia || navigator.msGetUserMedia;

if (navigator.getUserMedia) {
  navigator.getUserMedia({audio:true}, success, function(e) {
    alert('Error capturing audio.');
  });
} else alert('getUserMedia not supported in this browser.');

function success(e) {
      audioContext = window.AudioContext || window.webkitAudioContext;
      context = new audioContext();
      audioInput = context.createMediaStreamSource(e);
      var bufferSize = 2048;
      store_data = context.createScriptProcessor(bufferSize, 1, 1);
      //(...)
}

//(....)
client.on('open', function() {
    console.log("createStream");
    Stream = client.createStream(command_list);
    var recording = false;

    window.startRecording = function() {
      document.getElementById("startbutton").disabled = true;
      document.getElementById("stopbutton").disabled = false;

      recording = true;
      window.Stream.resume();
    }

    window.stopRecording = function() {
      document.getElementById("startbutton").disabled = false;
      document.getElementById("stopbutton").disabled = true;

      recording = false
      //window.Stream.end();
      window.Stream.pause();
    }

    store_data.onaudioprocess = function(e){ //<---line of the error
        if(!recording) return;
        console.log ('recording');
        var left = e.inputBuffer.getChannelData(0);
        window.Stream.write(convertoFloat32ToInt16(left));
      }
//(..events generated from server..)

In chrome my code works just fine. In Mozilla I am getting always the error "store data is undefined". Any idea why? Because I am declaring store_data as global and when getusermedia is a sucess the value is changed.


Solution

  • var client = new BinaryClient('ws://193.136.94.233:9001');
    var context = null;
    var gain = null;
    var store_data  = null;
    //(.....)
    
    navigator.mediaDevices.getUserMedia({audio:true}) .then( function(stream){ 
    context = new AudioContext(); 
    audioInput = context.createMediaStreamSource(stream); 
    var bufferSize = 4096; 
    store_data = context.createScriptProcessor(bufferSize, 1, 1);
    biquadFilter = context.createBiquadFilter();
    biquadFilter.type = "lowpass";
    biquadFilter.frequency.value = 11500;
    biquadFilter.Q.value = 3;
    
    ganho = context.createGain();
    ganho.gain.value=0.5;
    
    //audioInput.connect(ganho);//compresso
    //ganho.connect(recorder);
    //recorder.connect(context.destination); 
    
    audioInput.connect(biquadFilter);
    biquadFilter.connect(ganho);
    ganho.connect(store_data);
    store_data.connect(context.destination); 
    
    store_data.onaudioprocess = function(e){
      if(!recording){
        //console.log("nada faz nada desta vida")
        return; 
     }
      console.log ('recording'); 
      var left = e.inputBuffer.getChannelData(0); 
      Stream.write(convertoFloat32ToInt16(left)); 
    } 
      //audioInput.connect(store_data); 
    } ) .catch( function(e){ console.log(e) } );
    
    //(...)
    
    client.on('open', function() {
        console.log("opened connection");
    
    
        //haveStoreData.then(function(store_data) {
        Stream = client.createStream(command_list);
        //recording = false;
    //(........)
    );
    
    //Other function
    

    Here is the solution to stream with BinaryJS with Chrome an Mozilla. Thanks to @jib and @Kaiido