Audio Data API: Difference between revisions

Jump to navigation Jump to search
Line 350: Line 350:
     <button onclick="stop()">stop</button>
     <button onclick="stop()">stop</button>


     <script type="text/javascript">
     <script type="text/javascript">    
       var sampleRate = 44100,
       function AudioDataDestination(sampleRate, readFn) {
          portionSize = sampleRate / 10,
        // Initialize the audio output.
          prebufferSize = sampleRate / 2,
        var audio = new Audio();
          freq = undefined; // no sound
        audio.mozSetup(1, sampleRate);


      var audio = new Audio();
        var currentWritePosition = 0;
      audio.mozSetup(1, sampleRate);
        var prebufferSize = sampleRate / 2; // buffer 500ms
      var currentWritePosition = 0;
        var tail = null;


      function getSoundData(t, size) {
        // The function called with regular interval to populate
        var soundData = new Float32Array(size);
        // the audio output buffer.
        if (freq) {
        setInterval(function() {
          var k = 2* Math.PI * freq / sampleRate;
          var written;
          for (var i=0; i<size; i++) {
          // Check if some data was not written in previous attempts.
            soundData[i] = Math.sin(k * (i + t));
          if(tail) {
            written = audio.mozWriteAudio(tail);
            currentWritePosition += written;
            if(written < tail.length) {
              // Not all the data was written, saving the tail...
              tail = tail.slice(written);
              return; // ... and exit the function.
            }
            tail = null;
           }
           }
        }
 
         return soundData;
          // Check if we need add some data to the audio output.
          var currentPosition = audio.mozCurrentSampleOffset();
          var available = currentPosition + prebufferSize - currentWritePosition;
          if(available > 0) {
            // Request some sound data from the callback function.
            var soundData = new Float32Array(available);
            readFn(soundData);
 
            // Writting the data.
            written = audio.mozWriteAudio(soundData);
            if(written < soundData.length) {
              // Not all the data was written, saving the tail.
              tail = soundData.slice(written);
            }
            currentWritePosition += written;
          }
         }, 100);
       }
       }


       function writeData() {
       // Control and generate the sound.
        while(audio.mozCurrentSampleOffset() + prebufferSize >= currentWritePosition) {
 
          var soundData = getSoundData(currentWritePosition, portionSize);
      var frequency = 0, currentSoundSample;
          audio.mozWriteAudio(soundData);
      var sampleRate = 44100;
           currentWritePosition += portionSize;
 
      function requestSoundData(soundData) {
        if (!frequency) {
           return; // no sound selected
         }
         }
        var k = 2* Math.PI * frequency / sampleRate;
        for (var i=0, size=soundData.length; i<size; i++) {
          soundData[i] = Math.sin(k * currentSoundSample++);
        }       
       }
       }


      // initial write
       var audioDestination = new AudioDataDestination(sampleRate, requestSoundData);
      writeData();
       var writeInterval = Math.floor(1000 * portionSize / sampleRate);
      setInterval(writeData, writeInterval);


       function start() {
       function start() {
         freq = parseFloat(document.getElementById("freq").value);
         currentSoundSample = 0;
        frequency = parseFloat(document.getElementById("freq").value);
       }
       }


       function stop() {
       function stop() {
         freq = undefined;
         frequency = 0;
       }
       }
   </script>
   </script>
50

edits

Navigation menu