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
		
	
| (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);
 |