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