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