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.
		
		
		
		
		
			
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
| /*
 | |
|  * vim: ts=4:sw=4:expandtab
 | |
|  */
 | |
| (function () {
 | |
|     'use strict';
 | |
|     window.Whisper = window.Whisper || {};
 | |
| 
 | |
|     Whisper.RecorderView = Whisper.View.extend({
 | |
|         className: 'recorder clearfix',
 | |
|         templateName: 'recorder',
 | |
|         initialize: function() {
 | |
|           this.startTime = Date.now();
 | |
|           this.interval = setInterval(this.updateTime.bind(this), 1000);
 | |
|           this.start();
 | |
|         },
 | |
|         events: {
 | |
|             'click .close': 'close',
 | |
|             'click .finish': 'finish',
 | |
|             'close': 'close'
 | |
|         },
 | |
|         updateTime: function() {
 | |
|           var duration = moment.duration(Date.now() - this.startTime, 'ms');
 | |
|           var minutes = '' + Math.trunc(duration.asMinutes());
 | |
|           var seconds = '' + duration.seconds();
 | |
|           if (seconds.length < 2) {
 | |
|             seconds = '0' + seconds;
 | |
|           }
 | |
|           this.$('.time').text(minutes + ':' + seconds);
 | |
|         },
 | |
|         close: function() {
 | |
|             if (this.recorder.isRecording()) {
 | |
|                 this.recorder.cancelRecording();
 | |
|             }
 | |
|             if (this.interval) {
 | |
|               clearInterval(this.interval);
 | |
|             }
 | |
|             this.source.disconnect();
 | |
|             if (this.context) {
 | |
|               this.context.close().then(function() {
 | |
|                   console.log('audio context closed');
 | |
|               });
 | |
|             }
 | |
|             this.remove();
 | |
|             this.trigger('closed');
 | |
|         },
 | |
|         finish: function() {
 | |
|             this.recorder.finishRecording();
 | |
|             this.close();
 | |
|         },
 | |
|         handleBlob: function(recorder, blob) {
 | |
|             if (blob) {
 | |
|               this.trigger('send', blob);
 | |
|             }
 | |
|         },
 | |
|         start: function() {
 | |
|             this.context = new AudioContext();
 | |
|             this.input = this.context.createGain();
 | |
|             this.recorder = new WebAudioRecorder(this.input, {
 | |
|                 encoding: 'mp3',
 | |
|                 workerDir: 'js/'     // must end with slash
 | |
|             });
 | |
|             this.recorder.onComplete = this.handleBlob.bind(this);
 | |
|             this.recorder.onError = this.onError;
 | |
|             navigator.webkitGetUserMedia({ audio: true }, function(stream) {
 | |
|                 this.source = this.context.createMediaStreamSource(stream);
 | |
|                 this.source.connect(this.input);
 | |
|             }.bind(this), this.onError);
 | |
|             this.recorder.startRecording();
 | |
|         },
 | |
|         onError: function(error) {
 | |
|             console.log(error);
 | |
|         }
 | |
|     });
 | |
| })();
 |