0

I am running some JavaScript on a website which collects all incoming microphone data with the AudioContext API.
I've re-enabled the dom.audio API with the about:config setting. (For reference, SECURITY DOES NOT MATTER HERE. Fingerprintability doesnt necessarily matter in this case.)
So far, the audio API works, and when the audio context code runs, the "Allow this site to use the microphone?" menu comes up.
The problem is that when I allow the microphone to be used, I only get incoming white noise (basically just a long beep noise)
Also, in normal Firefox, the exact name of the microphone pops up in the allow/block microphone menu, while in TBB, the only option to allow is the "Default Audio Device".
For reference, here's the entire code I'm working with:

    var webaudio_tooling_obj = function () {
    var audioContext = new AudioContext();
    var BUFF_SIZE = 16384;
    var audioInput = null,
        microphone_stream = null,
        gain_node = null,
        script_processor_node = null,
        script_processor_fft_node = null,
        analyserNode = null;
    if (!navigator.getUserMedia)
            navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
                          navigator.mozGetUserMedia || navigator.msGetUserMedia;
    if (navigator.getUserMedia){
        navigator.getUserMedia({audio:true}, 
          function(stream) {
              start_microphone(stream);
          },
          function(e) {
            alert('Error capturing audio.');
          }
        );
    } else { alert('getUserMedia not supported in this browser.'); }
    function show_some_data(given_typed_array, num_row_to_display, label) {
        var size_buffer = given_typed_array.length;
        var index = 0;
        var max_index = num_row_to_display;
        for (; index < max_index && index < size_buffer; index += 1) {
            console.log(given_typed_array[index]); //THIS IS WHERE I EXTRACT THE DATA
        }
    }
    function process_microphone_buffer(event) { // invoked by event loop
        var i, N, inp, microphone_output_buffer;
        microphone_output_buffer = event.inputBuffer.getChannelData(0); 
        show_some_data(microphone_output_buffer, 5, "from getChannelData");
    }
    function start_microphone(stream){
      gain_node = audioContext.createGain();
      gain_node.connect( audioContext.destination );
      microphone_stream = audioContext.createMediaStreamSource(stream);
      microphone_stream.connect(gain_node); 
      script_processor_node = audioContext.createScriptProcessor(BUFF_SIZE, 1, 1);
      script_processor_node.onaudioprocess = process_microphone_buffer;
      microphone_stream.connect(script_processor_node);
      gain_node.gain.value = 0.5;
      script_processor_fft_node = audioContext.createScriptProcessor(2048, 1, 1);
      script_processor_fft_node.connect(gain_node);
      analyserNode = audioContext.createAnalyser();
      analyserNode.smoothingTimeConstant = 0;
      analyserNode.fftSize = 2048;
      microphone_stream.connect(analyserNode);
      analyserNode.connect(script_processor_fft_node);
      script_processor_fft_node.onaudioprocess = function() {
        var array = new Uint8Array(analyserNode.frequencyBinCount);
        analyserNode.getByteFrequencyData(array);
        if (microphone_stream.playbackState == microphone_stream.PLAYING_STATE) {
            show_some_data(array, 5, "from fft");
        }
      };
    }
  }();

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.