You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			98 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
| 
								 
											9 years ago
										 
									 | 
							
								(function(window){
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var WORKER_PATH = 'recorderWorker.js';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var Recorder = function(source, cfg){
							 | 
						||
| 
								 | 
							
								    var config = cfg || {};
							 | 
						||
| 
								 | 
							
								    var bufferLen = config.bufferLen || 4096;
							 | 
						||
| 
								 | 
							
								    this.context = source.context;
							 | 
						||
| 
								 | 
							
								    this.node = (this.context.createScriptProcessor ||
							 | 
						||
| 
								 | 
							
								                 this.context.createJavaScriptNode).call(this.context,
							 | 
						||
| 
								 | 
							
								                                                         bufferLen, 2, 2);
							 | 
						||
| 
								 | 
							
								    var worker = new Worker(config.workerPath || WORKER_PATH);
							 | 
						||
| 
								 | 
							
								    worker.postMessage({
							 | 
						||
| 
								 | 
							
								      command: 'init',
							 | 
						||
| 
								 | 
							
								      config: {
							 | 
						||
| 
								 | 
							
								        sampleRate: this.context.sampleRate
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    var recording = false,
							 | 
						||
| 
								 | 
							
								      currCallback;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var self = this;
							 | 
						||
| 
								 | 
							
								    this.node.onaudioprocess = function(e){
							 | 
						||
| 
								 | 
							
								      if (!recording) return;
							 | 
						||
| 
								 | 
							
								      self.ondata && self.ondata(e.inputBuffer.getChannelData(0));
							 | 
						||
| 
								 | 
							
								      worker.postMessage({
							 | 
						||
| 
								 | 
							
								        command: 'record',
							 | 
						||
| 
								 | 
							
								        buffer: [
							 | 
						||
| 
								 | 
							
								          e.inputBuffer.getChannelData(0),
							 | 
						||
| 
								 | 
							
								          e.inputBuffer.getChannelData(1)
							 | 
						||
| 
								 | 
							
								        ]
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.configure = function(cfg){
							 | 
						||
| 
								 | 
							
								      for (var prop in cfg){
							 | 
						||
| 
								 | 
							
								        if (cfg.hasOwnProperty(prop)){
							 | 
						||
| 
								 | 
							
								          config[prop] = cfg[prop];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.record = function(){
							 | 
						||
| 
								 | 
							
								      recording = true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.stop = function(){
							 | 
						||
| 
								 | 
							
								      recording = false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.clear = function(){
							 | 
						||
| 
								 | 
							
								      worker.postMessage({ command: 'clear' });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.getBuffer = function(cb) {
							 | 
						||
| 
								 | 
							
								      currCallback = cb || config.callback;
							 | 
						||
| 
								 | 
							
								      worker.postMessage({ command: 'getBuffer' })
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.exportWAV = function(cb, type){
							 | 
						||
| 
								 | 
							
								      currCallback = cb || config.callback;
							 | 
						||
| 
								 | 
							
								      type = type || config.type || 'audio/wav';
							 | 
						||
| 
								 | 
							
								      if (!currCallback) throw new Error('Callback not set');
							 | 
						||
| 
								 | 
							
								      worker.postMessage({
							 | 
						||
| 
								 | 
							
								        command: 'exportWAV',
							 | 
						||
| 
								 | 
							
								        type: type
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.shutdown = function(){
							 | 
						||
| 
								 | 
							
								      worker.terminate();
							 | 
						||
| 
								 | 
							
								      source.disconnect();
							 | 
						||
| 
								 | 
							
								      this.node.disconnect();
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    worker.onmessage = function(e){
							 | 
						||
| 
								 | 
							
								      var blob = e.data;
							 | 
						||
| 
								 | 
							
								      currCallback(blob);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    source.connect(this.node);
							 | 
						||
| 
								 | 
							
								    this.node.connect(this.context.destination);    //this should not be necessary
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Recorder.forceDownload = function(blob, filename){
							 | 
						||
| 
								 | 
							
								    var url = (window.URL || window.webkitURL).createObjectURL(blob);
							 | 
						||
| 
								 | 
							
								    var link = window.document.createElement('a');
							 | 
						||
| 
								 | 
							
								    link.href = url;
							 | 
						||
| 
								 | 
							
								    link.download = filename || 'output.wav';
							 | 
						||
| 
								 | 
							
								    var click = document.createEvent("Event");
							 | 
						||
| 
								 | 
							
								    click.initEvent("click", true, true);
							 | 
						||
| 
								 | 
							
								    link.dispatchEvent(click);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  window.Recorder = Recorder;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								})(window);
							 |