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