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.
		
		
		
		
		
			
		
			
	
	
		
			92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 years ago
										 | importScripts("Mp3LameEncoder.min.js"); | ||
|  | 
 | ||
|  | var NUM_CH = 2, // constant
 | ||
|  |     sampleRate = 44100, | ||
|  |     options = undefined, | ||
|  |     maxBuffers = undefined, | ||
|  |     encoder = undefined, | ||
|  |     recBuffers = undefined, | ||
|  |     bufferCount = 0; | ||
|  | 
 | ||
|  | function error(message) { | ||
|  |   self.postMessage({ command: "error", message: "mp3: " + message }); | ||
|  | } | ||
|  | 
 | ||
|  | function init(data) { | ||
|  |   if (data.config.numChannels === NUM_CH) { | ||
|  |     sampleRate = data.config.sampleRate; | ||
|  |     options = data.options; | ||
|  |   } else | ||
|  |     error("numChannels must be " + NUM_CH); | ||
|  | }; | ||
|  | 
 | ||
|  | function setOptions(opt) { | ||
|  |   if (encoder || recBuffers) | ||
|  |     error("cannot set options during recording"); | ||
|  |   else | ||
|  |     options = opt; | ||
|  | } | ||
|  | 
 | ||
|  | function start(bufferSize) { | ||
|  |   maxBuffers = Math.ceil(options.timeLimit * sampleRate / bufferSize); | ||
|  |   if (options.encodeAfterRecord) | ||
|  |     recBuffers = []; | ||
|  |   else | ||
|  |     encoder = new Mp3LameEncoder(sampleRate, options.mp3.bitRate); | ||
|  | } | ||
|  | 
 | ||
|  | function record(buffer) { | ||
|  |   if (bufferCount++ < maxBuffers) | ||
|  |     if (encoder) | ||
|  |       encoder.encode(buffer); | ||
|  |     else | ||
|  |       recBuffers.push(buffer); | ||
|  |   else | ||
|  |     self.postMessage({ command: "timeout" }); | ||
|  | }; | ||
|  | 
 | ||
|  | function postProgress(progress) { | ||
|  |   self.postMessage({ command: "progress", progress: progress }); | ||
|  | }; | ||
|  | 
 | ||
|  | function finish() { | ||
|  |   if (recBuffers) { | ||
|  |     postProgress(0); | ||
|  |     encoder = new Mp3LameEncoder(sampleRate, options.mp3.bitRate); | ||
|  |     var timeout = Date.now() + options.progressInterval; | ||
|  |     while (recBuffers.length > 0) { | ||
|  |       encoder.encode(recBuffers.shift()); | ||
|  |       var now = Date.now(); | ||
|  |       if (now > timeout) { | ||
|  |         postProgress((bufferCount - recBuffers.length) / bufferCount); | ||
|  |         timeout = now + options.progressInterval; | ||
|  |       } | ||
|  |     } | ||
|  |     postProgress(1); | ||
|  |   } | ||
|  |   self.postMessage({ | ||
|  |     command: "complete", | ||
|  |     blob: encoder.finish(options.mp3.mimeType) | ||
|  |   }); | ||
|  |   cleanup(); | ||
|  | }; | ||
|  | 
 | ||
|  | function cleanup() { | ||
|  |   encoder = recBuffers = undefined; | ||
|  |   bufferCount = 0; | ||
|  | } | ||
|  | 
 | ||
|  | self.onmessage = function(event) { | ||
|  |   var data = event.data; | ||
|  |   switch (data.command) { | ||
|  |     case "init":    init(data);                 break; | ||
|  |     case "options": setOptions(data.options);   break; | ||
|  |     case "start":   start(data.bufferSize);     break; | ||
|  |     case "record":  record(data.buffer);        break; | ||
|  |     case "finish":  finish();                   break; | ||
|  |     case "cancel":  cleanup(); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | self.postMessage({ command: "loaded" }); |