diff --git a/dist/angular-audio-recorder.js b/dist/angular-audio-recorder.js index 0cee9cb..72be584 100644 --- a/dist/angular-audio-recorder.js +++ b/dist/angular-audio-recorder.js @@ -60,8 +60,7 @@ var blobToDataURL = function (blob, callback) { }; a.readAsDataURL(blob); }; - -var RecorderController = function (element, service, recorderUtils, $scope, $timeout, $interval, PLAYBACK) { +var RecorderController = function ($element, recorderService, recorderUtils, $scope, $timeout, $interval, recorderPlaybackStatus) { //used in NON-Angular Async process var scopeApply = function (fn) { var phase = $scope.$root.$$phase; @@ -79,73 +78,73 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim audioObjId = 'recorded-audio-' + control.id, status = { isRecording: false, - playback: PLAYBACK.STOPPED, + playback: recorderPlaybackStatus.STOPPED, isDenied: null, isSwfLoaded: null, isConverting: false, get isPlaying() { - return status.playback === PLAYBACK.PLAYING; + return status.playback === recorderPlaybackStatus.PLAYING; }, get isStopped() { - return status.playback === PLAYBACK.STOPPED; + return status.playback === recorderPlaybackStatus.STOPPED; }, get isPaused() { - return status.playback === PLAYBACK.PAUSED; + return status.playback === recorderPlaybackStatus.PAUSED; } }, - shouldConvertToMp3 = angular.isDefined(control.convertMp3) ? !!control.convertMp3 : service.shouldConvertToMp3(), - mp3Converter = shouldConvertToMp3 ? new MP3Converter(service.getMp3Config()) : null; + shouldConvertToMp3 = angular.isDefined(control.convertMp3) ? !!control.convertMp3 : recorderService.shouldConvertToMp3(), + mp3Converter = shouldConvertToMp3 ? new MP3Converter(recorderService.getMp3Config()) : null; ; control.timeLimit = control.timeLimit || 0; control.status = createReadOnlyVersion(status); - control.isAvailable = service.isAvailable(); + control.isAvailable = recorderService.isAvailable(); control.elapsedTime = 0; - //Sets ID for the element if ID doesn't exists + //Sets ID for the $element if ID doesn't exists if (!control.id) { control.id = recorderUtils.generateUuid(); - element.attr("id", control.id); + $element.attr("id", control.id); } - if (!service.isHtml5 && !service.isCordova) { - status.isSwfLoaded = service.swfIsLoaded(); + if (!recorderService.isHtml5 && !recorderService.isCordova) { + status.isSwfLoaded = recorderService.swfIsLoaded(); $scope.$watch(function () { - return service.swfIsLoaded(); + return recorderService.swfIsLoaded(); }, function (n) { status.isSwfLoaded = n; }); } - //register controller with service - service.setController(control.id, this); + //register controller with recorderService + recorderService.setController(control.id, this); var playbackOnEnded = function () { - status.playback = PLAYBACK.STOPPED; + status.playback = recorderPlaybackStatus.STOPPED; control.onPlaybackComplete(); scopeApply(); }; var playbackOnPause = function () { - status.playback = PLAYBACK.PAUSED; + status.playback = recorderPlaybackStatus.PAUSED; control.onPlaybackPause(); }; var playbackOnStart = function () { - status.playback = PLAYBACK.PLAYING; + status.playback = recorderPlaybackStatus.PLAYING; control.onPlaybackStart(); }; var playbackOnResume = function () { - status.playback = PLAYBACK.PLAYING; + status.playback = recorderPlaybackStatus.PLAYING; control.onPlaybackResume(); }; var embedPlayer = function (blob) { if (document.getElementById(audioObjId) == null) { - element.append(''); + $element.append(''); var audioPlayer = document.getElementById(audioObjId); if (control.showPlayer) { @@ -199,28 +198,28 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.getAudioPlayer = function () { - return service.isCordova ? cordovaMedia.player : document.getElementById(audioObjId); + return recorderService.isCordova ? cordovaMedia.player : document.getElementById(audioObjId); }; control.startRecord = function () { - if (!service.isAvailable()) { + if (!recorderService.isAvailable()) { return; } if (status.isPlaying) { control.playbackPause(); //indicate that this is not paused. - status.playback = PLAYBACK.STOPPED; + status.playback = recorderPlaybackStatus.STOPPED; } //clear audio previously recorded control.audioModel = null; - var id = control.id, recordHandler = service.getHandler(); + var id = control.id, recordHandler = recorderService.getHandler(); //Record initiation based on browser type var start = function () { - if (service.isCordova) { + if (recorderService.isCordova) { cordovaMedia.url = recorderUtils.cordovaAudioUrl(control.id); //mobile app needs wav extension to save recording cordovaMedia.recorder = new Media(cordovaMedia.url, function () { @@ -231,7 +230,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim console.log('CordovaRecording'); cordovaMedia.recorder.startRecord(); } - else if (service.isHtml5) { + else if (recorderService.isHtml5) { //HTML5 recording if (!recordHandler) { return; @@ -242,7 +241,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim } else { //Flash recording - if (!service.isReady) { + if (!recorderService.isReady) { //Stop recording if the flash object is not ready return; } @@ -261,18 +260,18 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }, 1000); }; - if (service.isCordova || recordHandler) { + if (recorderService.isCordova || recordHandler) { start(); } else if (!status.isDenied) { //probably permission was never asked - service.showPermission({ + recorderService.showPermission({ onDenied: function () { status.isDenied = true; $scope.$apply(); }, onAllowed: function () { status.isDenied = false; - recordHandler = service.getHandler(); + recordHandler = recorderService.getHandler(); start(); scopeApply(); } @@ -282,11 +281,11 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim control.stopRecord = function () { var id = control.id; - if (!service.isAvailable() || !status.isRecording) { + if (!recorderService.isAvailable() || !status.isRecording) { return false; } - var recordHandler = service.getHandler(); + var recordHandler = recorderService.getHandler(); var completed = function (blob) { $interval.cancel(timing); status.isRecording = false; @@ -306,7 +305,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; //To stop recording - if (service.isCordova) { + if (recorderService.isCordova) { cordovaMedia.recorder.stopRecord(); window.resolveLocalFileSystemURL(cordovaMedia.url, function (entry) { entry.file(function (blob) { @@ -315,7 +314,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }, function (err) { console.log('Could not retrieve file, error code:', err.code); }); - } else if (service.isHtml5) { + } else if (recorderService.isHtml5) { recordHandler.stop(); recordHandler.getBuffer(function () { recordHandler.exportWAV(function (blob) { @@ -330,11 +329,11 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.playbackRecording = function () { - if (status.isPlaying || !service.isAvailable() || status.isRecording || !control.audioModel) { + if (status.isPlaying || !recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } - if (service.isCordova) { + if (recorderService.isCordova) { cordovaMedia.player = new Media(cordovaMedia.url, playbackOnEnded, function () { console.log('Playback failed'); }); @@ -347,25 +346,25 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.playbackPause = function () { - if (!status.isPlaying || !service.isAvailable() || status.isRecording || !control.audioModel) { + if (!status.isPlaying || !recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } control.getAudioPlayer().pause(); - if (service.isCordova) { + if (recorderService.isCordova) { playbackOnPause(); } }; control.playbackResume = function () { - if (status.isPlaying || !service.isAvailable() || status.isRecording || !control.audioModel) { + if (status.isPlaying || !recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } if (status.isPaused) { //previously paused, just resume control.getAudioPlayer().play(); - if (service.isCordova) { + if (recorderService.isCordova) { playbackOnResume(); } } else { @@ -376,7 +375,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim control.save = function (fileName) { - if (!service.isAvailable() || status.isRecording || !control.audioModel) { + if (!recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } @@ -395,7 +394,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.isHtml5 = function () { - return service.isHtml5; + return recorderService.isHtml5; }; if (control.autoStart) { @@ -404,16 +403,14 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }, 1000); } - element.on('$destroy', function () { + $element.on('$destroy', function () { $interval.cancel(timing); }); }; -RecorderController.$inject = ['$element', 'recorderService', 'recorderUtils', '$scope', '$timeout', '$interval', 'recorderPlaybackStatus']; - angular.module('angularAudioRecorder.controllers') - .controller('recorderController', RecorderController) + .controller('recorderController', ['$element', 'recorderService', 'recorderUtils', '$scope', '$timeout', '$interval', 'recorderPlaybackStatus', RecorderController]) ; angular.module('angularAudioRecorder.directives', [ 'angularAudioRecorder.config', @@ -422,15 +419,15 @@ angular.module('angularAudioRecorder.directives', [ ]); angular.module('angularAudioRecorder.directives') .directive('ngAudioRecorderAnalyzer', ['recorderService', 'recorderUtils', - function (service, utils) { + function (recorderService, recorderUtils) { var link = function (scope, element, attrs, recorder) { - if (!service.isHtml5) { + if (!recorderService.isHtml5) { scope.hide = true; return; } - var canvasWidth, canvasHeight, rafID, analyserContext, props = service.$html5AudioProps; + var canvasWidth, canvasHeight, rafID, analyserContext, props = recorderService.$html5AudioProps; function updateAnalysers(time) { @@ -500,8 +497,8 @@ angular.module('angularAudioRecorder.directives') }; })(recorder.onRecordStart); - utils.appendActionToCallback(recorder, 'onRecordStart', updateAnalysers, 'analyzer'); - utils.appendActionToCallback(recorder, 'onRecordComplete', cancelAnalyserUpdates, 'analyzer'); + recorderUtils.appendActionToCallback(recorder, 'onRecordStart', updateAnalysers, 'analyzer'); + recorderUtils.appendActionToCallback(recorder, 'onRecordComplete', cancelAnalyserUpdates, 'analyzer'); }; return { @@ -516,8 +513,8 @@ angular.module('angularAudioRecorder.directives') } ]); angular.module('angularAudioRecorder.directives') - .directive('ngAudioRecorderWaveView', ['recorderService', 'recorderUtils', '$log', - function (service, utils, $log) { + .directive('ngAudioRecorderWaveView', ['recorderUtils', '$log', + function (recorderUtils, $log) { return { restrict: 'E', @@ -533,14 +530,14 @@ angular.module('angularAudioRecorder.directives') var options = angular.extend({container: $element.find('div')[0]}, attrs); var waveSurfer = WaveSurfer.create(options); waveSurfer.setVolume(0); - utils.appendActionToCallback(recorder, 'onPlaybackStart|onPlaybackResume', function () { + recorderUtils.appendActionToCallback(recorder, 'onPlaybackStart|onPlaybackResume', function () { waveSurfer.play(); }, 'waveView'); - utils.appendActionToCallback(recorder, 'onPlaybackComplete|onPlaybackPause', function () { + recorderUtils.appendActionToCallback(recorder, 'onPlaybackComplete|onPlaybackPause', function () { waveSurfer.pause(); }, 'waveView'); - utils.appendActionToCallback(recorder, 'onRecordComplete', function () { + recorderUtils.appendActionToCallback(recorder, 'onRecordComplete', function () { if (!audioPlayer) { audioPlayer = recorder.getAudioPlayer(); audioPlayer.addEventListener('seeking', function (e) { @@ -614,16 +611,16 @@ angular.module('angularAudioRecorder.directives') angular.module('angularAudioRecorder.services', ['angularAudioRecorder.config']); angular.module('angularAudioRecorder.services') .provider('recorderService', ['recorderScriptUrl', - function (scriptPath) { + function (recorderScriptUrl) { var handler = null, service = {isHtml5: false, isReady: false}, permissionHandlers = {onDenied: null, onClosed: null, onAllow: null}, forceSwf = false, /*this path is relative to the dist path:*/ - swfUrl = scriptPath + '../lib/recorder.swf', + swfUrl = recorderScriptUrl + '../lib/recorder.swf', utils, mp3Covert = false, - mp3Config = {bitRate: 92, lameJsUrl: scriptPath + '../lib/lame.min.js'} + mp3Config = {bitRate: 92, lameJsUrl: recorderScriptUrl + '../lib/lame.min.js'} ; var swfHandlerConfig = { diff --git a/dist/angular-audio-recorder.min.js b/dist/angular-audio-recorder.min.js index 3ad847a..1ec1c97 100644 --- a/dist/angular-audio-recorder.min.js +++ b/dist/angular-audio-recorder.min.js @@ -1 +1 @@ -!function(){"use strict";window.cancelAnimationFrame=window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame,window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,angular.module("angularAudioRecorder",["angularAudioRecorder.config","angularAudioRecorder.services","angularAudioRecorder.controllers","angularAudioRecorder.directives"]),angular.module("angularAudioRecorder.config",[]).constant("recorderScriptUrl",function(){var e=document.getElementsByTagName("script"),t=e[e.length-1].getAttribute("src"),n=t.substr(0,t.lastIndexOf("/")+1),r=document.createElement("a");return r.href=n,r.href}()).constant("recorderPlaybackStatus",{STOPPED:0,PLAYING:1,PAUSED:2}),angular.module("angularAudioRecorder.controllers",["angularAudioRecorder.config","angularAudioRecorder.services"]);var e=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&Object.defineProperty(t,n,{get:function(t){var n=t;return function(){return e[n]}}(n),enumerable:!0,configurable:!0});return t},t=function(e,t){var n=new FileReader;n.onload=function(e){t(e.target.result)},n.readAsDataURL(e)},n=function(n,r,o,i,a,c,s){var l=function(e){var t=i.$root.$$phase;return"$apply"!==t&&"$digest"!==t?i.$apply(e):void 0},d=this,u={recorder:null,url:null,player:null},f=null,p="recorded-audio-"+d.id,v={isRecording:!1,playback:s.STOPPED,isDenied:null,isSwfLoaded:null,isConverting:!1,get isPlaying(){return v.playback===s.PLAYING},get isStopped(){return v.playback===s.STOPPED},get isPaused(){return v.playback===s.PAUSED}},g=angular.isDefined(d.convertMp3)?!!d.convertMp3:r.shouldConvertToMp3(),m=g?new MP3Converter(r.getMp3Config()):null;d.timeLimit=d.timeLimit||0,d.status=e(v),d.isAvailable=r.isAvailable(),d.elapsedTime=0,d.id||(d.id=o.generateUuid(),n.attr("id",d.id)),r.isHtml5||r.isCordova||(v.isSwfLoaded=r.swfIsLoaded(),i.$watch(function(){return r.swfIsLoaded()},function(e){v.isSwfLoaded=e})),r.setController(d.id,this);var h=function(){v.playback=s.STOPPED,d.onPlaybackComplete(),l()},w=function(){v.playback=s.PAUSED,d.onPlaybackPause()},y=function(){v.playback=s.PLAYING,d.onPlaybackStart()},b=function(){v.playback=s.PLAYING,d.onPlaybackResume()},A=function(e){if(null==document.getElementById(p)){n.append('');var r=document.getElementById(p);d.showPlayer&&r.setAttribute("controls",""),r.addEventListener("ended",h),r.addEventListener("pause",function(e){this.duration!==this.currentTime&&(w(),l())}),r.addEventListener("playing",function(e){v.isPaused?b():y(),l()})}e?t(e,function(e){document.getElementById(p).src=e}):document.getElementById(p).removeAttribute("src")},R=function(e,t){m&&(v.isConverting=!0,m.convert(e,function(e){v.isConverting=!1,t&&t(e),l(d.onConversionComplete)},function(){v.isConverting=!1}),d.onConversionStart())};d.getAudioPlayer=function(){return r.isCordova?u.player:document.getElementById(p)},d.startRecord=function(){if(r.isAvailable()){v.isPlaying&&(d.playbackPause(),v.playback=s.STOPPED),d.audioModel=null;var e=d.id,t=r.getHandler(),n=function(){if(r.isCordova)u.url=o.cordovaAudioUrl(d.id),u.recorder=new Media(u.url,function(){console.log("Media successfully played")},function(e){console.log("Media could not be launched"+e.code,e)}),console.log("CordovaRecording"),u.recorder.startRecord();else if(r.isHtml5){if(!t)return;console.log("HTML5Recording"),t.clear(),t.record()}else{if(!r.isReady)return;console.log("FlashRecording"),t.record(e,"audio.wav")}v.isRecording=!0,d.onRecordStart(),d.elapsedTime=0,f=c(function(){++d.elapsedTime,d.timeLimit&&d.timeLimit>0&&d.elapsedTime>=d.timeLimit&&d.stopRecord()},1e3)};r.isCordova||t?n():v.isDenied||r.showPermission({onDenied:function(){v.isDenied=!0,i.$apply()},onAllowed:function(){v.isDenied=!1,t=r.getHandler(),n(),l()}})}},d.stopRecord=function(){var e=d.id;if(!r.isAvailable()||!v.isRecording)return!1;var t=r.getHandler(),n=function(e){c.cancel(f),v.isRecording=!1;var t=function(e){d.audioModel=e,A(e)};g?R(e,t):t(e),A(null),d.onRecordComplete()};r.isCordova?(u.recorder.stopRecord(),window.resolveLocalFileSystemURL(u.url,function(e){e.file(function(e){n(e)})},function(e){console.log("Could not retrieve file, error code:",e.code)})):r.isHtml5?(t.stop(),t.getBuffer(function(){t.exportWAV(function(e){n(e),l()})})):(t.stopRecording(e),n(t.getBlob(e)))},d.playbackRecording=function(){return v.isPlaying||!r.isAvailable()||v.isRecording||!d.audioModel?!1:void(r.isCordova?(u.player=new Media(u.url,h,function(){console.log("Playback failed")}),u.player.play(),y()):d.getAudioPlayer().play())},d.playbackPause=function(){return v.isPlaying&&r.isAvailable()&&!v.isRecording&&d.audioModel?(d.getAudioPlayer().pause(),void(r.isCordova&&w())):!1},d.playbackResume=function(){return v.isPlaying||!r.isAvailable()||v.isRecording||!d.audioModel?!1:void(v.isPaused?(d.getAudioPlayer().play(),r.isCordova&&b()):d.playbackRecording())},d.save=function(e){if(!r.isAvailable()||v.isRecording||!d.audioModel)return!1;e||(e="audio_recording_"+d.id+(d.audioModel.type.indexOf("mp3")>-1?"mp3":"wav"));var t=window.URL.createObjectURL(d.audioModel),n=document.createElement("a");n.href=t,n.target="_blank",n.download=e;var o=document.createEvent("Event");o.initEvent("click",!0,!0),n.dispatchEvent(o)},d.isHtml5=function(){return r.isHtml5},d.autoStart&&a(function(){d.startRecord()},1e3),n.on("$destroy",function(){c.cancel(f)})};n.$inject=["$element","recorderService","recorderUtils","$scope","$timeout","$interval","recorderPlaybackStatus"],angular.module("angularAudioRecorder.controllers").controller("recorderController",n),angular.module("angularAudioRecorder.directives",["angularAudioRecorder.config","angularAudioRecorder.services","angularAudioRecorder.controllers"]),angular.module("angularAudioRecorder.directives").directive("ngAudioRecorderAnalyzer",["recorderService","recorderUtils",function(e,t){var n=function(n,r,o,i){function a(e){if(!u){var t=r.find("canvas")[0];o.width&&!isNaN(o.width)&&(t.width=o.width),o.height&&!isNaN(o.height)&&(t.height=parseInt(o.height)),s=t.width,l=t.height,u=t.getContext("2d")}var n=3,i=1,c=Math.round(s/n),p=new Uint8Array(f.analyserNode.frequencyBinCount);f.analyserNode.getByteFrequencyData(p),u.clearRect(0,0,s,l),u.lineCap="round";for(var v=f.analyserNode.frequencyBinCount/c,g=0;c>g;++g){for(var m=0,h=Math.floor(g*v),w=0;v>w;w++)m+=p[h+w];m/=v;p[g*v];o.waveColor?u.fillStyle=o.waveColor:u.fillStyle="hsl( "+Math.round(360*g/c)+", 100%, 50%)",u.fillRect(g*n,l,i,-m)}d=window.requestAnimationFrame(a)}function c(){window.cancelAnimationFrame(d),d=null}if(!e.isHtml5)return void(n.hide=!0);var s,l,d,u,f=e.$html5AudioProps;r.on("$destroy",function(){c()}),i.onRecordStart=function(e){return function(){e.apply(),a()}}(i.onRecordStart),t.appendActionToCallback(i,"onRecordStart",a,"analyzer"),t.appendActionToCallback(i,"onRecordComplete",c,"analyzer")};return{restrict:"E",require:"^ngAudioRecorder",template:'
',link:n}}]),angular.module("angularAudioRecorder.directives").directive("ngAudioRecorderWaveView",["recorderService","recorderUtils","$log",function(e,t,n){return{restrict:"E",require:"^ngAudioRecorder",link:function(e,r,o,i){if(!window.WaveSurfer)return void n.warn("WaveSurfer was found.");var a;r.html('
');var c=angular.extend({container:r.find("div")[0]},o),s=WaveSurfer.create(c);s.setVolume(0),t.appendActionToCallback(i,"onPlaybackStart|onPlaybackResume",function(){s.play()},"waveView"),t.appendActionToCallback(i,"onPlaybackComplete|onPlaybackPause",function(){s.pause()},"waveView"),t.appendActionToCallback(i,"onRecordComplete",function(){a||(a=i.getAudioPlayer(),a.addEventListener("seeking",function(e){var t=a.currentTime/a.duration;s.seekTo(t)}))},"waveView"),e.$watch(function(){return i.audioModel},function(e){e instanceof Blob&&s.loadBlob(e)})}}}]),angular.module("angularAudioRecorder.directives").directive("ngAudioRecorder",["recorderService","$timeout",function(e,t){return{restrict:"EA",scope:{audioModel:"=",id:"@",onRecordStart:"&",onRecordComplete:"&",onPlaybackComplete:"&",onPlaybackStart:"&",onPlaybackPause:"&",onPlaybackResume:"&",onConversionStart:"&",onConversionComplete:"&",showPlayer:"=?",autoStart:"=?",convertMp3:"=?",timeLimit:"=?"},controllerAs:"recorder",bindToController:!0,template:function(e,t){return'
'+e.html()+"
"},controller:"recorderController",link:function(n,r,o){t(function(){if(e.isAvailable&&!e.isHtml5&&!e.isCordova){var t={allowscriptaccess:"always"},n={id:"recorder-app",name:"recorder-app"},r={save_text:""};swfobject.embedSWF(e.getSwfUrl(),"audioRecorder-fwrecorder","0","0","11.0.0","",r,t,n)}},100)}}}]),angular.module("angularAudioRecorder.services",["angularAudioRecorder.config"]),angular.module("angularAudioRecorder.services").provider("recorderService",["recorderScriptUrl",function(e){var t,n=null,r={isHtml5:!1,isReady:!1},o={onDenied:null,onClosed:null,onAllow:null},i=!1,a=e+"../lib/recorder.swf",c=!1,s={bitRate:92,lameJsUrl:e+"../lib/lame.min.js"},l={isAvailable:!1,loaded:!1,configureMic:function(){FWRecorder.isReady&&(FWRecorder.configure(44,100,0,2e3),FWRecorder.setUseEchoSuppression(!1),FWRecorder.setLoopBack(!1))},allowed:!1,externalEvents:function(e){arguments[1];switch(arguments[0]){case"ready":parseInt(arguments[1]),parseInt(arguments[2]);FWRecorder.connect("recorder-app",0),FWRecorder.recorderOriginalWidth=1,FWRecorder.recorderOriginalHeight=1,l.loaded=!0;break;case"microphone_user_request":FWRecorder.showPermissionWindow({permanent:!0});break;case"microphone_connected":console.log("Permission to use MIC granted"),l.allowed=!0;break;case"microphone_not_connected":console.log("Permission to use MIC denied"),l.allowed=!1;break;case"permission_panel_closed":l.allowed?l.setAllowed():l.setDeclined(),FWRecorder.defaultSize(),angular.isFunction(o.onClosed)&&o.onClosed();break;case"recording":FWRecorder.hide();break;case"recording_stopped":FWRecorder.hide();break;case"playing":break;case"playback_started":arguments[2];break;case"save_pressed":FWRecorder.updateForm();break;case"saving":break;case"saved":var t=$.parseJSON(arguments[2]);t.saved;break;case"save_failed":arguments[2];break;case"save_progress":arguments[2],arguments[3];break;case"stopped":case"playing_paused":case"no_microphone_found":case"observing_level":case"microphone_level":case"microphone_activity":case"observing_level_stopped":}},isInstalled:function(){return swfobject.getFlashPlayerVersion().major>0},init:function(){return r.isHtml5=!1,l.isInstalled()?(l.isAvailable=!0,window.fwr_event_handler=l.externalEvents,void(window.configureMicrophone=l.configureMic)):void console.log("Flash is not installed, application cannot be initialized")},setAllowed:function(){r.isReady=!0,n=FWRecorder,angular.isFunction(o.onAllowed)&&o.onAllowed()},setDeclined:function(){r.isReady=!1,n=null,angular.isFunction(o.onDenied)&&o.onDenied()},getPermission:function(){l.isAvailable&&(FWRecorder.isMicrophoneAccessible()?(l.allowed=!0,setTimeout(function(){l.setAllowed()},100)):FWRecorder.showPermissionWindow({permanent:!0}))}},d={audioContext:null,inputPoint:null,audioInput:null,audioRecorder:null,analyserNode:null},u={gotStream:function(e){var t=d.audioContext;d.audioInput=t.createMediaStreamSource(e),d.audioInput.connect(d.inputPoint=t.createGain()),d.analyserNode=t.createAnalyser(),d.analyserNode.fftSize=2048,d.inputPoint.connect(d.analyserNode),d.audioRecorder=new Recorder(d.audioInput);var i=t.createGain();i.gain.value=0,d.inputPoint.connect(i),i.connect(t.destination),r.isReady=!0,n=d.audioRecorder,angular.isFunction(o.onAllowed)&&("https:"==window.location.protocol&&localStorage.setItem("permission","given"),o.onAllowed())},failStream:function(e){angular.isDefined(o.onDenied)&&o.onDenied()},getPermission:function(){navigator.getUserMedia({audio:!0},u.gotStream,u.failStream)},init:function(){r.isHtml5=!0;var e=window.AudioContext||window.webkitAudioContext;e&&!d.audioContext&&(d.audioContext=new e),null!==localStorage.getItem("permission")&&u.getPermission()}};navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia,r.isCordova=!1;var f=function(){"cordova"in window?r.isCordova=!0:!i&&navigator.getUserMedia?u.init():l.init()},p={};r.controller=function(e){return p[e]},r.getSwfUrl=function(){return a},r.setController=function(e,t){p[e]=t},r.isAvailable=function(){if(r.isCordova){if(!("Media"in window))throw new Error('The Media plugin for cordova is required for this library, add plugin using "cordova plugin add cordova-plugin-media"');return!0}return r.isHtml5||l.isInstalled()},r.getHandler=function(){return n},r.showPermission=function(e){return r.isAvailable()?(e&&angular.extend(o,e),void(r.isHtml5?u.getPermission():l.getPermission())):void console.warn("Neither HTML5 nor SWF is supported.")},r.swfIsLoaded=function(){return l.loaded},r.shouldConvertToMp3=function(){return c},r.getMp3Config=function(){return s},r.$html5AudioProps=d;var v={$get:["recorderUtils",function(e){return t=e,f(),r}],forceSwf:function(e){return i=e,v},setSwfUrl:function(e){return a=e,v},withMp3Conversion:function(e,t){return c=!!e,s=angular.extend(s,t||{}),v}};return v}]),angular.module("angularAudioRecorder.services").factory("recorderUtils",[function(){var e={generateUuid:function(){function e(e){var t=(Math.random().toString(16)+"000000000").substr(2,8);return e?"-"+t.substr(0,4)+"-"+t.substr(4,4):t}return e()+e(!0)+e(!0)+e()},cordovaAudioUrl:function(e){if(!window.cordova)return"record-audio"+e+".wav";var t=cordova.file.tempDirectory||cordova.file.externalApplicationStorageDirectory||cordova.file.sharedDirectory;switch(t+=Date.now()+"_recordedAudio_"+e.replace("/[^A-Za-z0-9_-]+/gi","-"),window.cordova.platformId){case"ios":t+=".wav";break;case"android":t+=".amr";break;case"wp":t+=".wma";break;default:t+=".mp3"}return t}};return e.appendActionToCallback=function(e,t,n,r){t.split(/\|/).forEach(function(t){if(!(angular.isObject(e)&&angular.isFunction(n)&&t in e&&angular.isFunction(e[t])))throw new Error("One or more parameter supplied is not valid");"$$appendTrackers"in e||(e.$$appendTrackers=[]);var o=t+"|"+r;return e.$$appendTrackers.indexOf(o)>-1?void console.log("Already appended: ",o):(e[t]=function(t){return function(){t.apply(e,arguments),n.apply(e,arguments)}}(e[t]),void e.$$appendTrackers.push(o))})},e}])}(),function(e){"use strict";function t(e,t,n){t=t||"",n=n||512;for(var r=atob(e),o=[],i=0;i=40))if(n.recorder&&n.recorder.init){if(n.recorderOriginalWidth=n.recorder.width,n.recorderOriginalHeight=n.recorder.height,n.uploadFormId&&$){var r=$(n.uploadFormId);n.recorder.init(r.attr("action").toString(),n.uploadFieldName,r.serializeArray())}}else setTimeout(function(){n.connect(e,t+1)},100)},playBack:function(e){n.recorder.playBack(e)},pausePlayBack:function(e){n.recorder.pausePlayBack(e)},playBackFrom:function(e,t){n.recorder.playBackFrom(e,t)},record:function(e,t){n.recorder.record(e,t)},stopRecording:function(){n.recorder.stopRecording()},stopPlayBack:function(){n.recorder.stopPlayBack()},observeLevel:function(){n.recorder.observeLevel()},stopObservingLevel:function(){n.recorder.stopObservingLevel()},observeSamples:function(){n.recorder.observeSamples()},stopObservingSamples:function(){n.recorder.stopObservingSamples()},resize:function(e,t){n.recorder.width=e+"px",n.recorder.height=t+"px"},defaultSize:function(){n.resize(n.recorderOriginalWidth,n.recorderOriginalHeight)},show:function(){n.recorder.show()},hide:function(){n.recorder.hide()},duration:function(e){return n.recorder.duration(e||n.uploadFieldName)},getBase64:function(e){var t=n.recorder.getBase64(e);return"data:"+r+";base64,"+t},getBlob:function(e){var o=n.getBase64(e).split(",")[1];return t(o,r)},getCurrentTime:function(e){return n.recorder.getCurrentTime(e)},isMicrophoneAccessible:function(){return n.recorder.isMicrophoneAccessible()},updateForm:function(){var e=$(n.uploadFormId);n.recorder.update(e.serializeArray())},showPermissionWindow:function(e){n.resize(240,160);var t=function(){e&&e.permanent?n.recorder.permitPermanently():n.recorder.permit()};setTimeout(t,1)},configure:function(e,t,r,o){switch(e=parseInt(e||22),t=parseInt(t||100),r=parseInt(r||0),o=parseInt(o||4e3),e){case 44:case 22:case 11:case 8:case 5:break;default:throw"invalid rate "+e}if(0>t||t>100)throw"invalid gain "+t;if(0>r||r>100)throw"invalid silenceLevel "+r;if(-1>o)throw"invalid silenceTimeout "+o;n.recorder.configure(e,t,r,o)},setUseEchoSuppression:function(e){if("boolean"!=typeof e)throw"invalid value for setting echo suppression, val: "+e;n.recorder.setUseEchoSuppression(e)},setLoopBack:function(e){if("boolean"!=typeof e)throw"invalid value for setting loop back, val: "+e;n.recorder.setLoopBack(e)}},e.FWRecorder=n}(window),function(){"use strict";var e=function(e,t){if("function"!=typeof e)throw"The specified parameter must be a valid function";var n=e.toString();if(n.match(/\[native\s*code\]/i))throw"You cannot bind a native function to a worker";t=t||{},"object"!=typeof t&&console.warn("Params must be an object that is serializable with JSON.stringify, specified is: "+typeof t);var r=window.URL.createObjectURL(new Blob(["(",n,")(this,",JSON.stringify(t),")"],{type:"application/javascript"}));return r};Function.prototype.toWorker=function(t){var n=e(this,t);return new Worker(n)}}(),function(e){"use strict";var t=function(e){function t(e){d=e.sampleRate}function n(e){f.push(e[0]),u+=e[0].length}function r(t){var n=a(f,u),r=l(n),o=new Blob([r],{type:t});e.postMessage(o)}function o(){var t=[];t.push(a(f,u)),t.push(a(p,u)),e.postMessage(t)}function i(){u=0,f=[],p=[]}function a(e,t){for(var n=new Float32Array(t),r=0,o=0;oo?32768*o:32767*o,!0)}}function s(e,t,n){for(var r=0;r=s;c+=s){var l=o.subarray(c,c+s),u=n.encodeBuffer(l);d(u),t-=s}},p=function(){var e=n.flush();d(e),self.postMessage({cmd:"end",buf:c}),console.log("done encoding"),l()};e.onmessage=function(e){switch(e.data.cmd){case"init":u(e.data.config);break;case"encode":f(e.data.rawInput);break;case"finish":p()}}},n=function(){var e=document.getElementsByTagName("script"),t=e[e.length-1].getAttribute("src"),n=t.substr(0,t.lastIndexOf("/")+1);if(n&&!n.match(/:\/\//)){var r=document.createElement("a");return r.href=n,r.href}return n}(),r=function(e){e=e||{},e.lameJsUrl=e.lameJsUrl||n+"/lame.min.js";var r=!1,o=t.toWorker(e);this.isBusy=function(){return r},this.convert=function(e){var t="conversion_"+Date.now(),n=t+":";console.log(n,"Starting conversion");var i,a,c={};switch(typeof arguments[1]){case"object":c=arguments[1];break;case"function":i=arguments[1];break;default:throw"parameter 2 is expected to be an object (config) or function (success callback)"}if("function"==typeof arguments[2]&&(i?a=arguments[2]:i=arguments[2]),"function"!=typeof arguments[3]||a||(a=arguments[3]),r)throw"Another conversion is in progress";var s=e.size,l=new FileReader,d=Date.now();l.onload=function(e){console.log(n,"Passed to BG process"),o.postMessage({cmd:"init",config:c}),o.postMessage({cmd:"encode",rawInput:e.target.result}),o.postMessage({cmd:"finish"}),o.onmessage=function(e){if("end"==e.data.cmd){console.log(n,"Done converting to Mp3");var t=new Blob(e.data.buf,{type:"audio/mp3"});console.log(n,"Conversion completed in: "+(Date.now()-d)/1e3+"s");var o=t.size;console.log(n+"Initial size: = "+s+", Final size = "+o+", Reduction: "+Number(100*(s-o)/s).toPrecision(4)+"%"),r=!1,i&&"function"==typeof i&&i(t)}}},r=!0,l.readAsArrayBuffer(e)}};e.MP3Converter=r}(window),function(e){"use strict";e.swfobject=function(){function e(){"complete"==b.readyState&&(b.parentNode.removeChild(b),t())}function t(){if(!x){if($.ie&&$.win){var e=v("span");try{var t=I.getElementsByTagName("body")[0].appendChild(e);t.parentNode.removeChild(t)}catch(n){return}}x=!0,O&&(clearInterval(O),O=null);for(var r=F.length,o=0;r>o;o++)F[o]()}}function n(e){x?e():F[F.length]=e}function r(e){if(typeof M.addEventListener!=A)M.addEventListener("load",e,!1);else if(typeof I.addEventListener!=A)I.addEventListener("load",e,!1);else if(typeof M.attachEvent!=A)g(M,"onload",e);else if("function"==typeof M.onload){var t=M.onload;M.onload=function(){t(),e()}}else M.onload=e}function o(){for(var e=L.length,t=0;e>t;t++){var n=L[t].id;if($.pv[0]>0){var r=p(n);r&&(L[t].width=r.getAttribute("width")?r.getAttribute("width"):"0",L[t].height=r.getAttribute("height")?r.getAttribute("height"):"0",m(L[t].swfVersion)?($.webkit&&$.webkit<312&&i(r),w(n,!0)):L[t].expressInstall&&!j&&m("6.0.65")&&($.win||$.mac)?a(L[t]):c(r))}else w(n,!0)}}function i(e){var t=e.getElementsByTagName(R)[0];if(t){var n=v("embed"),r=t.attributes;if(r)for(var o=r.length,i=0;o>i;i++)"DATA"==r[i].nodeName?n.setAttribute("src",r[i].nodeValue):n.setAttribute(r[i].nodeName,r[i].nodeValue);var a=t.childNodes;if(a)for(var c=a.length,s=0;c>s;s++)1==a[s].nodeType&&"PARAM"==a[s].nodeName&&n.setAttribute(a[s].getAttribute("name"),a[s].getAttribute("value"));e.parentNode.replaceChild(n,e)}}function a(e){j=!0;var t=p(e.id);if(t){if(e.altContentId){var n=p(e.altContentId);n&&(T=n,U=e.altContentId)}else T=s(t);!/%$/.test(e.width)&&parseInt(e.width,10)<310&&(e.width="310"),!/%$/.test(e.height)&&parseInt(e.height,10)<137&&(e.height="137"),I.title=I.title.slice(0,47)+" - Flash Player Installation";var r=$.ie&&$.win?"ActiveX":"PlugIn",o=I.title,i="MMredirectURL="+M.location+"&MMplayerType="+r+"&MMdoctitle="+o,a=e.id;if($.ie&&$.win&&4!=t.readyState){var c=v("div");a+="SWFObjectNew",c.setAttribute("id",a),t.parentNode.insertBefore(c,t),t.style.display="none";var d=function(){t.parentNode.removeChild(t)};g(M,"onload",d)}l({data:e.expressInstall,id:P,width:e.width,height:e.height},{flashvars:i},a)}}function c(e){if($.ie&&$.win&&4!=e.readyState){var t=v("div");e.parentNode.insertBefore(t,e),t.parentNode.replaceChild(s(e),t),e.style.display="none";var n=function(){e.parentNode.removeChild(e)};g(M,"onload",n)}else e.parentNode.replaceChild(s(e),e)}function s(e){var t=v("div");if($.win&&$.ie)t.innerHTML=e.innerHTML;else{var n=e.getElementsByTagName(R)[0];if(n){var r=n.childNodes;if(r)for(var o=r.length,i=0;o>i;i++)1==r[i].nodeType&&"PARAM"==r[i].nodeName||8==r[i].nodeType||t.appendChild(r[i].cloneNode(!0))}}return t}function l(e,t,n){var r,o=p(n);if(o)if(typeof e.id==A&&(e.id=n),$.ie&&$.win){var i="";for(var a in e)e[a]!=Object.prototype[a]&&("data"==a.toLowerCase()?t.movie=e[a]:"styleclass"==a.toLowerCase()?i+=' class="'+e[a]+'"':"classid"!=a.toLowerCase()&&(i+=" "+a+'="'+e[a]+'"'));var c="";for(var s in t)t[s]!=Object.prototype[s]&&(c+='');o.outerHTML='"+c+"",N[N.length]=e.id,r=p(e.id)}else if($.webkit&&$.webkit<312){var l=v("embed");l.setAttribute("type",S);for(var u in e)e[u]!=Object.prototype[u]&&("data"==u.toLowerCase()?l.setAttribute("src",e[u]):"styleclass"==u.toLowerCase()?l.setAttribute("class",e[u]):"classid"!=u.toLowerCase()&&l.setAttribute(u,e[u]));for(var f in t)t[f]!=Object.prototype[f]&&"movie"!=f.toLowerCase()&&l.setAttribute(f,t[f]);o.parentNode.replaceChild(l,o),r=l}else{var g=v(R);g.setAttribute("type",S);for(var m in e)e[m]!=Object.prototype[m]&&("styleclass"==m.toLowerCase()?g.setAttribute("class",e[m]):"classid"!=m.toLowerCase()&&g.setAttribute(m,e[m]));for(var h in t)t[h]!=Object.prototype[h]&&"movie"!=h.toLowerCase()&&d(g,h,t[h]);o.parentNode.replaceChild(g,o),r=g}return r}function d(e,t,n){var r=v("param");r.setAttribute("name",t),r.setAttribute("value",n),e.appendChild(r)}function u(e){var t=p(e);!t||"OBJECT"!=t.nodeName&&"EMBED"!=t.nodeName||($.ie&&$.win?4==t.readyState?f(e):M.attachEvent("onload",function(){f(e)}):t.parentNode.removeChild(t))}function f(e){var t=p(e);if(t){for(var n in t)"function"==typeof t[n]&&(t[n]=null);t.parentNode.removeChild(t)}}function p(e){var t=null;try{t=I.getElementById(e)}catch(n){}return t}function v(e){return I.createElement(e)}function g(e,t,n){e.attachEvent(t,n),B[B.length]=[e,t,n]}function m(e){var t=$.pv,n=e.split(".");return n[0]=parseInt(n[0],10),n[1]=parseInt(n[1],10)||0,n[2]=parseInt(n[2],10)||0,t[0]>n[0]||t[0]==n[0]&&t[1]>n[1]||t[0]==n[0]&&t[1]==n[1]&&t[2]>=n[2]?!0:!1}function h(e,t){if(!$.ie||!$.mac){var n=I.getElementsByTagName("head")[0],r=v("style");if(r.setAttribute("type","text/css"),r.setAttribute("media","screen"),$.ie&&$.win||typeof I.createTextNode==A||r.appendChild(I.createTextNode(e+" {"+t+"}")),n.appendChild(r),$.ie&&$.win&&typeof I.styleSheets!=A&&I.styleSheets.length>0){var o=I.styleSheets[I.styleSheets.length-1];typeof o.addRule==R&&o.addRule(e,t)}}}function w(e,t){var n=t?"visible":"hidden";x&&p(e)?p(e).style.visibility=n:h("#"+e,"visibility:"+n)}function y(e){var t=/[\\\"<>\.;]/,n=null!=t.exec(e);return n?encodeURIComponent(e):e}var b,A="undefined",R="object",C="Shockwave Flash",k="ShockwaveFlash.ShockwaveFlash",S="application/x-shockwave-flash",P="SWFObjectExprInst",M=window,I=document,E=navigator,F=[],L=[],N=[],B=[],O=null,T=null,U=null,x=!1,j=!1,$=function(){var e=typeof I.getElementById!=A&&typeof I.getElementsByTagName!=A&&typeof I.createElement!=A,t=[0,0,0],n=null;if(typeof E.plugins!=A&&typeof E.plugins[C]==R)n=E.plugins[C].description,!n||typeof E.mimeTypes!=A&&E.mimeTypes[S]&&!E.mimeTypes[S].enabledPlugin||(n=n.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),t[0]=parseInt(n.replace(/^(.*)\..*$/,"$1"),10),t[1]=parseInt(n.replace(/^.*\.(.*)\s.*$/,"$1"),10),t[2]=/r/.test(n)?parseInt(n.replace(/^.*r(.*)$/,"$1"),10):0);else if(typeof M.ActiveXObject!=A){var r=null,o=!1;try{r=new ActiveXObject(k+".7")}catch(i){try{r=new ActiveXObject(k+".6"),t=[6,0,21],r.AllowScriptAccess="always"}catch(i){6==t[0]&&(o=!0)}if(!o)try{r=new ActiveXObject(k)}catch(i){}}if(!o&&r)try{n=r.GetVariable("$version"),n&&(n=n.split(" ")[1].split(","),t=[parseInt(n[0],10),parseInt(n[1],10),parseInt(n[2],10)])}catch(i){}}var a=E.userAgent.toLowerCase(),c=E.platform.toLowerCase(),s=/webkit/.test(a)?parseFloat(a.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,l=!1,d=c?/win/.test(c):/win/.test(a),u=c?/mac/.test(c):/mac/.test(a);return{w3cdom:e,pv:t,webkit:s,ie:l,win:d,mac:u}}();(function(){if($.w3cdom){if(n(o),$.ie&&$.win)try{I.write(""),b=p("__ie_ondomload"),b&&g(b,"onreadystatechange",e)}catch(i){}$.webkit&&typeof I.readyState!=A&&(O=setInterval(function(){/loaded|complete/.test(I.readyState)&&t()},10)),typeof I.addEventListener!=A&&I.addEventListener("DOMContentLoaded",t,null),r(t)}})(),function(){$.ie&&$.win&&window.attachEvent("onunload",function(){for(var e=B.length,t=0;e>t;t++)B[t][0].detachEvent(B[t][1],B[t][2]);for(var n=N.length,r=0;n>r;r++)u(N[r]);for(var o in $)$[o]=null;$=null;for(var i in swfobject)swfobject[i]=null;swfobject=null})}();return{registerObject:function(e,t,n){if($.w3cdom&&e&&t){var r={};r.id=e,r.swfVersion=t,r.expressInstall=n?n:!1,L[L.length]=r,w(e,!1)}},getObjectById:function(e){var t=null;if($.w3cdom){var n=p(e);if(n){var r=n.getElementsByTagName(R)[0];!r||r&&typeof n.SetVariable!=A?t=n:typeof r.SetVariable!=A&&(t=r)}}return t},embedSWF:function(e,t,r,o,i,c,s,d,u){if($.w3cdom&&e&&t&&r&&o&&i)if(r+="",o+="",m(i)){w(t,!1);var f={};if(u&&typeof u===R)for(var p in u)u[p]!=Object.prototype[p]&&(f[p]=u[p]);f.data=e,f.width=r,f.height=o;var v={};if(d&&typeof d===R)for(var g in d)d[g]!=Object.prototype[g]&&(v[g]=d[g]);if(s&&typeof s===R)for(var h in s)s[h]!=Object.prototype[h]&&(typeof v.flashvars!=A?v.flashvars+="&"+h+"="+s[h]:v.flashvars=h+"="+s[h]);n(function(){l(f,v,t),f.id==t&&w(t,!0)})}else c&&!j&&m("6.0.65")&&($.win||$.mac)&&(j=!0,w(t,!1),n(function(){var e={};e.id=e.altContentId=t,e.width=r,e.height=o,e.expressInstall=c,a(e)}))},getFlashPlayerVersion:function(){return{major:$.pv[0],minor:$.pv[1],release:$.pv[2]}},hasFlashPlayerVersion:m,createSWF:function(e,t,n){return $.w3cdom?l(e,t,n):void 0},removeSWF:function(e){$.w3cdom&&u(e)},createCSS:function(e,t){$.w3cdom&&h(e,t)},addDomLoadEvent:n,addLoadEvent:r,getQueryParamValue:function(e){var t=I.location.search||I.location.hash;if(null==e)return y(t);if(t)for(var n=t.substring(1).split("&"),r=0;r');var r=document.getElementById(p);d.showPlayer&&r.setAttribute("controls",""),r.addEventListener("ended",h),r.addEventListener("pause",function(e){this.duration!==this.currentTime&&(w(),l())}),r.addEventListener("playing",function(e){v.isPaused?b():y(),l()})}e?t(e,function(e){document.getElementById(p).src=e}):document.getElementById(p).removeAttribute("src")},R=function(e,t){m&&(v.isConverting=!0,m.convert(e,function(e){v.isConverting=!1,t&&t(e),l(d.onConversionComplete)},function(){v.isConverting=!1}),d.onConversionStart())};d.getAudioPlayer=function(){return r.isCordova?u.player:document.getElementById(p)},d.startRecord=function(){if(r.isAvailable()){v.isPlaying&&(d.playbackPause(),v.playback=s.STOPPED),d.audioModel=null;var e=d.id,t=r.getHandler(),n=function(){if(r.isCordova)u.url=o.cordovaAudioUrl(d.id),u.recorder=new Media(u.url,function(){console.log("Media successfully played")},function(e){console.log("Media could not be launched"+e.code,e)}),console.log("CordovaRecording"),u.recorder.startRecord();else if(r.isHtml5){if(!t)return;console.log("HTML5Recording"),t.clear(),t.record()}else{if(!r.isReady)return;console.log("FlashRecording"),t.record(e,"audio.wav")}v.isRecording=!0,d.onRecordStart(),d.elapsedTime=0,f=c(function(){++d.elapsedTime,d.timeLimit&&d.timeLimit>0&&d.elapsedTime>=d.timeLimit&&d.stopRecord()},1e3)};r.isCordova||t?n():v.isDenied||r.showPermission({onDenied:function(){v.isDenied=!0,i.$apply()},onAllowed:function(){v.isDenied=!1,t=r.getHandler(),n(),l()}})}},d.stopRecord=function(){var e=d.id;if(!r.isAvailable()||!v.isRecording)return!1;var t=r.getHandler(),n=function(e){c.cancel(f),v.isRecording=!1;var t=function(e){d.audioModel=e,A(e)};g?R(e,t):t(e),A(null),d.onRecordComplete()};r.isCordova?(u.recorder.stopRecord(),window.resolveLocalFileSystemURL(u.url,function(e){e.file(function(e){n(e)})},function(e){console.log("Could not retrieve file, error code:",e.code)})):r.isHtml5?(t.stop(),t.getBuffer(function(){t.exportWAV(function(e){n(e),l()})})):(t.stopRecording(e),n(t.getBlob(e)))},d.playbackRecording=function(){return v.isPlaying||!r.isAvailable()||v.isRecording||!d.audioModel?!1:void(r.isCordova?(u.player=new Media(u.url,h,function(){console.log("Playback failed")}),u.player.play(),y()):d.getAudioPlayer().play())},d.playbackPause=function(){return v.isPlaying&&r.isAvailable()&&!v.isRecording&&d.audioModel?(d.getAudioPlayer().pause(),void(r.isCordova&&w())):!1},d.playbackResume=function(){return v.isPlaying||!r.isAvailable()||v.isRecording||!d.audioModel?!1:void(v.isPaused?(d.getAudioPlayer().play(),r.isCordova&&b()):d.playbackRecording())},d.save=function(e){if(!r.isAvailable()||v.isRecording||!d.audioModel)return!1;e||(e="audio_recording_"+d.id+(d.audioModel.type.indexOf("mp3")>-1?"mp3":"wav"));var t=window.URL.createObjectURL(d.audioModel),n=document.createElement("a");n.href=t,n.target="_blank",n.download=e;var o=document.createEvent("Event");o.initEvent("click",!0,!0),n.dispatchEvent(o)},d.isHtml5=function(){return r.isHtml5},d.autoStart&&a(function(){d.startRecord()},1e3),n.on("$destroy",function(){c.cancel(f)})};angular.module("angularAudioRecorder.controllers").controller("recorderController",["$element","recorderService","recorderUtils","$scope","$timeout","$interval","recorderPlaybackStatus",n]),angular.module("angularAudioRecorder.directives",["angularAudioRecorder.config","angularAudioRecorder.services","angularAudioRecorder.controllers"]),angular.module("angularAudioRecorder.directives").directive("ngAudioRecorderAnalyzer",["recorderService","recorderUtils",function(e,t){var n=function(n,r,o,i){function a(e){if(!u){var t=r.find("canvas")[0];o.width&&!isNaN(o.width)&&(t.width=o.width),o.height&&!isNaN(o.height)&&(t.height=parseInt(o.height)),s=t.width,l=t.height,u=t.getContext("2d")}var n=3,i=1,c=Math.round(s/n),p=new Uint8Array(f.analyserNode.frequencyBinCount);f.analyserNode.getByteFrequencyData(p),u.clearRect(0,0,s,l),u.lineCap="round";for(var v=f.analyserNode.frequencyBinCount/c,g=0;c>g;++g){for(var m=0,h=Math.floor(g*v),w=0;v>w;w++)m+=p[h+w];m/=v;p[g*v];o.waveColor?u.fillStyle=o.waveColor:u.fillStyle="hsl( "+Math.round(360*g/c)+", 100%, 50%)",u.fillRect(g*n,l,i,-m)}d=window.requestAnimationFrame(a)}function c(){window.cancelAnimationFrame(d),d=null}if(!e.isHtml5)return void(n.hide=!0);var s,l,d,u,f=e.$html5AudioProps;r.on("$destroy",function(){c()}),i.onRecordStart=function(e){return function(){e.apply(),a()}}(i.onRecordStart),t.appendActionToCallback(i,"onRecordStart",a,"analyzer"),t.appendActionToCallback(i,"onRecordComplete",c,"analyzer")};return{restrict:"E",require:"^ngAudioRecorder",template:'
',link:n}}]),angular.module("angularAudioRecorder.directives").directive("ngAudioRecorderWaveView",["recorderUtils","$log",function(e,t){return{restrict:"E",require:"^ngAudioRecorder",link:function(n,r,o,i){if(!window.WaveSurfer)return void t.warn("WaveSurfer was found.");var a;r.html('
');var c=angular.extend({container:r.find("div")[0]},o),s=WaveSurfer.create(c);s.setVolume(0),e.appendActionToCallback(i,"onPlaybackStart|onPlaybackResume",function(){s.play()},"waveView"),e.appendActionToCallback(i,"onPlaybackComplete|onPlaybackPause",function(){s.pause()},"waveView"),e.appendActionToCallback(i,"onRecordComplete",function(){a||(a=i.getAudioPlayer(),a.addEventListener("seeking",function(e){var t=a.currentTime/a.duration;s.seekTo(t)}))},"waveView"),n.$watch(function(){return i.audioModel},function(e){e instanceof Blob&&s.loadBlob(e)})}}}]),angular.module("angularAudioRecorder.directives").directive("ngAudioRecorder",["recorderService","$timeout",function(e,t){return{restrict:"EA",scope:{audioModel:"=",id:"@",onRecordStart:"&",onRecordComplete:"&",onPlaybackComplete:"&",onPlaybackStart:"&",onPlaybackPause:"&",onPlaybackResume:"&",onConversionStart:"&",onConversionComplete:"&",showPlayer:"=?",autoStart:"=?",convertMp3:"=?",timeLimit:"=?"},controllerAs:"recorder",bindToController:!0,template:function(e,t){return'
'+e.html()+"
"},controller:"recorderController",link:function(n,r,o){t(function(){if(e.isAvailable&&!e.isHtml5&&!e.isCordova){var t={allowscriptaccess:"always"},n={id:"recorder-app",name:"recorder-app"},r={save_text:""};swfobject.embedSWF(e.getSwfUrl(),"audioRecorder-fwrecorder","0","0","11.0.0","",r,t,n)}},100)}}}]),angular.module("angularAudioRecorder.services",["angularAudioRecorder.config"]),angular.module("angularAudioRecorder.services").provider("recorderService",["recorderScriptUrl",function(e){var t,n=null,r={isHtml5:!1,isReady:!1},o={onDenied:null,onClosed:null,onAllow:null},i=!1,a=e+"../lib/recorder.swf",c=!1,s={bitRate:92,lameJsUrl:e+"../lib/lame.min.js"},l={isAvailable:!1,loaded:!1,configureMic:function(){FWRecorder.isReady&&(FWRecorder.configure(44,100,0,2e3),FWRecorder.setUseEchoSuppression(!1),FWRecorder.setLoopBack(!1))},allowed:!1,externalEvents:function(e){arguments[1];switch(arguments[0]){case"ready":parseInt(arguments[1]),parseInt(arguments[2]);FWRecorder.connect("recorder-app",0),FWRecorder.recorderOriginalWidth=1,FWRecorder.recorderOriginalHeight=1,l.loaded=!0;break;case"microphone_user_request":FWRecorder.showPermissionWindow({permanent:!0});break;case"microphone_connected":console.log("Permission to use MIC granted"),l.allowed=!0;break;case"microphone_not_connected":console.log("Permission to use MIC denied"),l.allowed=!1;break;case"permission_panel_closed":l.allowed?l.setAllowed():l.setDeclined(),FWRecorder.defaultSize(),angular.isFunction(o.onClosed)&&o.onClosed();break;case"recording":FWRecorder.hide();break;case"recording_stopped":FWRecorder.hide();break;case"playing":break;case"playback_started":arguments[2];break;case"save_pressed":FWRecorder.updateForm();break;case"saving":break;case"saved":var t=$.parseJSON(arguments[2]);t.saved;break;case"save_failed":arguments[2];break;case"save_progress":arguments[2],arguments[3];break;case"stopped":case"playing_paused":case"no_microphone_found":case"observing_level":case"microphone_level":case"microphone_activity":case"observing_level_stopped":}},isInstalled:function(){return swfobject.getFlashPlayerVersion().major>0},init:function(){return r.isHtml5=!1,l.isInstalled()?(l.isAvailable=!0,window.fwr_event_handler=l.externalEvents,void(window.configureMicrophone=l.configureMic)):void console.log("Flash is not installed, application cannot be initialized")},setAllowed:function(){r.isReady=!0,n=FWRecorder,angular.isFunction(o.onAllowed)&&o.onAllowed()},setDeclined:function(){r.isReady=!1,n=null,angular.isFunction(o.onDenied)&&o.onDenied()},getPermission:function(){l.isAvailable&&(FWRecorder.isMicrophoneAccessible()?(l.allowed=!0,setTimeout(function(){l.setAllowed()},100)):FWRecorder.showPermissionWindow({permanent:!0}))}},d={audioContext:null,inputPoint:null,audioInput:null,audioRecorder:null,analyserNode:null},u={gotStream:function(e){var t=d.audioContext;d.audioInput=t.createMediaStreamSource(e),d.audioInput.connect(d.inputPoint=t.createGain()),d.analyserNode=t.createAnalyser(),d.analyserNode.fftSize=2048,d.inputPoint.connect(d.analyserNode),d.audioRecorder=new Recorder(d.audioInput);var i=t.createGain();i.gain.value=0,d.inputPoint.connect(i),i.connect(t.destination),r.isReady=!0,n=d.audioRecorder,angular.isFunction(o.onAllowed)&&("https:"==window.location.protocol&&localStorage.setItem("permission","given"),o.onAllowed())},failStream:function(e){angular.isDefined(o.onDenied)&&o.onDenied()},getPermission:function(){navigator.getUserMedia({audio:!0},u.gotStream,u.failStream)},init:function(){r.isHtml5=!0;var e=window.AudioContext||window.webkitAudioContext;e&&!d.audioContext&&(d.audioContext=new e),null!==localStorage.getItem("permission")&&u.getPermission()}};navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia,r.isCordova=!1;var f=function(){"cordova"in window?r.isCordova=!0:!i&&navigator.getUserMedia?u.init():l.init()},p={};r.controller=function(e){return p[e]},r.getSwfUrl=function(){return a},r.setController=function(e,t){p[e]=t},r.isAvailable=function(){if(r.isCordova){if(!("Media"in window))throw new Error('The Media plugin for cordova is required for this library, add plugin using "cordova plugin add cordova-plugin-media"');return!0}return r.isHtml5||l.isInstalled()},r.getHandler=function(){return n},r.showPermission=function(e){return r.isAvailable()?(e&&angular.extend(o,e),void(r.isHtml5?u.getPermission():l.getPermission())):void console.warn("Neither HTML5 nor SWF is supported.")},r.swfIsLoaded=function(){return l.loaded},r.shouldConvertToMp3=function(){return c},r.getMp3Config=function(){return s},r.$html5AudioProps=d;var v={$get:["recorderUtils",function(e){return t=e,f(),r}],forceSwf:function(e){return i=e,v},setSwfUrl:function(e){return a=e,v},withMp3Conversion:function(e,t){return c=!!e,s=angular.extend(s,t||{}),v}};return v}]),angular.module("angularAudioRecorder.services").factory("recorderUtils",[function(){var e={generateUuid:function(){function e(e){var t=(Math.random().toString(16)+"000000000").substr(2,8);return e?"-"+t.substr(0,4)+"-"+t.substr(4,4):t}return e()+e(!0)+e(!0)+e()},cordovaAudioUrl:function(e){if(!window.cordova)return"record-audio"+e+".wav";var t=cordova.file.tempDirectory||cordova.file.externalApplicationStorageDirectory||cordova.file.sharedDirectory;switch(t+=Date.now()+"_recordedAudio_"+e.replace("/[^A-Za-z0-9_-]+/gi","-"),window.cordova.platformId){case"ios":t+=".wav";break;case"android":t+=".amr";break;case"wp":t+=".wma";break;default:t+=".mp3"}return t}};return e.appendActionToCallback=function(e,t,n,r){t.split(/\|/).forEach(function(t){if(!(angular.isObject(e)&&angular.isFunction(n)&&t in e&&angular.isFunction(e[t])))throw new Error("One or more parameter supplied is not valid");"$$appendTrackers"in e||(e.$$appendTrackers=[]);var o=t+"|"+r;return e.$$appendTrackers.indexOf(o)>-1?void console.log("Already appended: ",o):(e[t]=function(t){return function(){t.apply(e,arguments),n.apply(e,arguments)}}(e[t]),void e.$$appendTrackers.push(o))})},e}])}(),function(e){"use strict";function t(e,t,n){t=t||"",n=n||512;for(var r=atob(e),o=[],i=0;i=40))if(n.recorder&&n.recorder.init){if(n.recorderOriginalWidth=n.recorder.width,n.recorderOriginalHeight=n.recorder.height,n.uploadFormId&&$){var r=$(n.uploadFormId);n.recorder.init(r.attr("action").toString(),n.uploadFieldName,r.serializeArray())}}else setTimeout(function(){n.connect(e,t+1)},100)},playBack:function(e){n.recorder.playBack(e)},pausePlayBack:function(e){n.recorder.pausePlayBack(e)},playBackFrom:function(e,t){n.recorder.playBackFrom(e,t)},record:function(e,t){n.recorder.record(e,t)},stopRecording:function(){n.recorder.stopRecording()},stopPlayBack:function(){n.recorder.stopPlayBack()},observeLevel:function(){n.recorder.observeLevel()},stopObservingLevel:function(){n.recorder.stopObservingLevel()},observeSamples:function(){n.recorder.observeSamples()},stopObservingSamples:function(){n.recorder.stopObservingSamples()},resize:function(e,t){n.recorder.width=e+"px",n.recorder.height=t+"px"},defaultSize:function(){n.resize(n.recorderOriginalWidth,n.recorderOriginalHeight)},show:function(){n.recorder.show()},hide:function(){n.recorder.hide()},duration:function(e){return n.recorder.duration(e||n.uploadFieldName)},getBase64:function(e){var t=n.recorder.getBase64(e);return"data:"+r+";base64,"+t},getBlob:function(e){var o=n.getBase64(e).split(",")[1];return t(o,r)},getCurrentTime:function(e){return n.recorder.getCurrentTime(e)},isMicrophoneAccessible:function(){return n.recorder.isMicrophoneAccessible()},updateForm:function(){var e=$(n.uploadFormId);n.recorder.update(e.serializeArray())},showPermissionWindow:function(e){n.resize(240,160);var t=function(){e&&e.permanent?n.recorder.permitPermanently():n.recorder.permit()};setTimeout(t,1)},configure:function(e,t,r,o){switch(e=parseInt(e||22),t=parseInt(t||100),r=parseInt(r||0),o=parseInt(o||4e3),e){case 44:case 22:case 11:case 8:case 5:break;default:throw"invalid rate "+e}if(0>t||t>100)throw"invalid gain "+t;if(0>r||r>100)throw"invalid silenceLevel "+r;if(-1>o)throw"invalid silenceTimeout "+o;n.recorder.configure(e,t,r,o)},setUseEchoSuppression:function(e){if("boolean"!=typeof e)throw"invalid value for setting echo suppression, val: "+e;n.recorder.setUseEchoSuppression(e)},setLoopBack:function(e){if("boolean"!=typeof e)throw"invalid value for setting loop back, val: "+e;n.recorder.setLoopBack(e)}},e.FWRecorder=n}(window),function(){"use strict";var e=function(e,t){if("function"!=typeof e)throw"The specified parameter must be a valid function";var n=e.toString();if(n.match(/\[native\s*code\]/i))throw"You cannot bind a native function to a worker";t=t||{},"object"!=typeof t&&console.warn("Params must be an object that is serializable with JSON.stringify, specified is: "+typeof t);var r=window.URL.createObjectURL(new Blob(["(",n,")(this,",JSON.stringify(t),")"],{type:"application/javascript"}));return r};Function.prototype.toWorker=function(t){var n=e(this,t);return new Worker(n)}}(),function(e){"use strict";var t=function(e){function t(e){d=e.sampleRate}function n(e){f.push(e[0]),u+=e[0].length}function r(t){var n=a(f,u),r=l(n),o=new Blob([r],{type:t});e.postMessage(o)}function o(){var t=[];t.push(a(f,u)),t.push(a(p,u)),e.postMessage(t)}function i(){u=0,f=[],p=[]}function a(e,t){for(var n=new Float32Array(t),r=0,o=0;oo?32768*o:32767*o,!0)}}function s(e,t,n){for(var r=0;r=s;c+=s){var l=o.subarray(c,c+s),u=n.encodeBuffer(l);d(u),t-=s}},p=function(){var e=n.flush();d(e),self.postMessage({cmd:"end",buf:c}),console.log("done encoding"),l()};e.onmessage=function(e){switch(e.data.cmd){case"init":u(e.data.config);break;case"encode":f(e.data.rawInput);break;case"finish":p()}}},n=function(){var e=document.getElementsByTagName("script"),t=e[e.length-1].getAttribute("src"),n=t.substr(0,t.lastIndexOf("/")+1);if(n&&!n.match(/:\/\//)){var r=document.createElement("a");return r.href=n,r.href}return n}(),r=function(e){e=e||{},e.lameJsUrl=e.lameJsUrl||n+"/lame.min.js";var r=!1,o=t.toWorker(e);this.isBusy=function(){return r},this.convert=function(e){var t="conversion_"+Date.now(),n=t+":";console.log(n,"Starting conversion");var i,a,c={};switch(typeof arguments[1]){case"object":c=arguments[1];break;case"function":i=arguments[1];break;default:throw"parameter 2 is expected to be an object (config) or function (success callback)"}if("function"==typeof arguments[2]&&(i?a=arguments[2]:i=arguments[2]),"function"!=typeof arguments[3]||a||(a=arguments[3]),r)throw"Another conversion is in progress";var s=e.size,l=new FileReader,d=Date.now();l.onload=function(e){console.log(n,"Passed to BG process"),o.postMessage({cmd:"init",config:c}),o.postMessage({cmd:"encode",rawInput:e.target.result}),o.postMessage({cmd:"finish"}),o.onmessage=function(e){if("end"==e.data.cmd){console.log(n,"Done converting to Mp3");var t=new Blob(e.data.buf,{type:"audio/mp3"});console.log(n,"Conversion completed in: "+(Date.now()-d)/1e3+"s");var o=t.size;console.log(n+"Initial size: = "+s+", Final size = "+o+", Reduction: "+Number(100*(s-o)/s).toPrecision(4)+"%"),r=!1,i&&"function"==typeof i&&i(t)}}},r=!0,l.readAsArrayBuffer(e)}};e.MP3Converter=r}(window),function(e){"use strict";e.swfobject=function(){function e(){"complete"==b.readyState&&(b.parentNode.removeChild(b),t())}function t(){if(!x){if($.ie&&$.win){var e=v("span");try{var t=I.getElementsByTagName("body")[0].appendChild(e);t.parentNode.removeChild(t)}catch(n){return}}x=!0,O&&(clearInterval(O),O=null);for(var r=F.length,o=0;r>o;o++)F[o]()}}function n(e){x?e():F[F.length]=e}function r(e){if(typeof M.addEventListener!=A)M.addEventListener("load",e,!1);else if(typeof I.addEventListener!=A)I.addEventListener("load",e,!1);else if(typeof M.attachEvent!=A)g(M,"onload",e);else if("function"==typeof M.onload){var t=M.onload;M.onload=function(){t(),e()}}else M.onload=e}function o(){for(var e=L.length,t=0;e>t;t++){var n=L[t].id;if($.pv[0]>0){var r=p(n);r&&(L[t].width=r.getAttribute("width")?r.getAttribute("width"):"0",L[t].height=r.getAttribute("height")?r.getAttribute("height"):"0",m(L[t].swfVersion)?($.webkit&&$.webkit<312&&i(r),w(n,!0)):L[t].expressInstall&&!j&&m("6.0.65")&&($.win||$.mac)?a(L[t]):c(r))}else w(n,!0)}}function i(e){var t=e.getElementsByTagName(R)[0];if(t){var n=v("embed"),r=t.attributes;if(r)for(var o=r.length,i=0;o>i;i++)"DATA"==r[i].nodeName?n.setAttribute("src",r[i].nodeValue):n.setAttribute(r[i].nodeName,r[i].nodeValue);var a=t.childNodes;if(a)for(var c=a.length,s=0;c>s;s++)1==a[s].nodeType&&"PARAM"==a[s].nodeName&&n.setAttribute(a[s].getAttribute("name"),a[s].getAttribute("value"));e.parentNode.replaceChild(n,e)}}function a(e){j=!0;var t=p(e.id);if(t){if(e.altContentId){var n=p(e.altContentId);n&&(T=n,U=e.altContentId)}else T=s(t);!/%$/.test(e.width)&&parseInt(e.width,10)<310&&(e.width="310"),!/%$/.test(e.height)&&parseInt(e.height,10)<137&&(e.height="137"),I.title=I.title.slice(0,47)+" - Flash Player Installation";var r=$.ie&&$.win?"ActiveX":"PlugIn",o=I.title,i="MMredirectURL="+M.location+"&MMplayerType="+r+"&MMdoctitle="+o,a=e.id;if($.ie&&$.win&&4!=t.readyState){var c=v("div");a+="SWFObjectNew",c.setAttribute("id",a),t.parentNode.insertBefore(c,t),t.style.display="none";var d=function(){t.parentNode.removeChild(t)};g(M,"onload",d)}l({data:e.expressInstall,id:P,width:e.width,height:e.height},{flashvars:i},a)}}function c(e){if($.ie&&$.win&&4!=e.readyState){var t=v("div");e.parentNode.insertBefore(t,e),t.parentNode.replaceChild(s(e),t),e.style.display="none";var n=function(){e.parentNode.removeChild(e)};g(M,"onload",n)}else e.parentNode.replaceChild(s(e),e)}function s(e){var t=v("div");if($.win&&$.ie)t.innerHTML=e.innerHTML;else{var n=e.getElementsByTagName(R)[0];if(n){var r=n.childNodes;if(r)for(var o=r.length,i=0;o>i;i++)1==r[i].nodeType&&"PARAM"==r[i].nodeName||8==r[i].nodeType||t.appendChild(r[i].cloneNode(!0))}}return t}function l(e,t,n){var r,o=p(n);if(o)if(typeof e.id==A&&(e.id=n),$.ie&&$.win){var i="";for(var a in e)e[a]!=Object.prototype[a]&&("data"==a.toLowerCase()?t.movie=e[a]:"styleclass"==a.toLowerCase()?i+=' class="'+e[a]+'"':"classid"!=a.toLowerCase()&&(i+=" "+a+'="'+e[a]+'"'));var c="";for(var s in t)t[s]!=Object.prototype[s]&&(c+='');o.outerHTML='"+c+"",N[N.length]=e.id,r=p(e.id)}else if($.webkit&&$.webkit<312){var l=v("embed");l.setAttribute("type",S);for(var u in e)e[u]!=Object.prototype[u]&&("data"==u.toLowerCase()?l.setAttribute("src",e[u]):"styleclass"==u.toLowerCase()?l.setAttribute("class",e[u]):"classid"!=u.toLowerCase()&&l.setAttribute(u,e[u]));for(var f in t)t[f]!=Object.prototype[f]&&"movie"!=f.toLowerCase()&&l.setAttribute(f,t[f]);o.parentNode.replaceChild(l,o),r=l}else{var g=v(R);g.setAttribute("type",S);for(var m in e)e[m]!=Object.prototype[m]&&("styleclass"==m.toLowerCase()?g.setAttribute("class",e[m]):"classid"!=m.toLowerCase()&&g.setAttribute(m,e[m]));for(var h in t)t[h]!=Object.prototype[h]&&"movie"!=h.toLowerCase()&&d(g,h,t[h]);o.parentNode.replaceChild(g,o),r=g}return r}function d(e,t,n){var r=v("param");r.setAttribute("name",t),r.setAttribute("value",n),e.appendChild(r)}function u(e){var t=p(e);!t||"OBJECT"!=t.nodeName&&"EMBED"!=t.nodeName||($.ie&&$.win?4==t.readyState?f(e):M.attachEvent("onload",function(){f(e)}):t.parentNode.removeChild(t))}function f(e){var t=p(e);if(t){for(var n in t)"function"==typeof t[n]&&(t[n]=null);t.parentNode.removeChild(t)}}function p(e){var t=null;try{t=I.getElementById(e)}catch(n){}return t}function v(e){return I.createElement(e)}function g(e,t,n){e.attachEvent(t,n),B[B.length]=[e,t,n]}function m(e){var t=$.pv,n=e.split(".");return n[0]=parseInt(n[0],10),n[1]=parseInt(n[1],10)||0,n[2]=parseInt(n[2],10)||0,t[0]>n[0]||t[0]==n[0]&&t[1]>n[1]||t[0]==n[0]&&t[1]==n[1]&&t[2]>=n[2]}function h(e,t){if(!$.ie||!$.mac){var n=I.getElementsByTagName("head")[0],r=v("style");if(r.setAttribute("type","text/css"),r.setAttribute("media","screen"),$.ie&&$.win||typeof I.createTextNode==A||r.appendChild(I.createTextNode(e+" {"+t+"}")),n.appendChild(r),$.ie&&$.win&&typeof I.styleSheets!=A&&I.styleSheets.length>0){var o=I.styleSheets[I.styleSheets.length-1];typeof o.addRule==R&&o.addRule(e,t)}}}function w(e,t){var n=t?"visible":"hidden";x&&p(e)?p(e).style.visibility=n:h("#"+e,"visibility:"+n)}function y(e){var t=/[\\\"<>\.;]/,n=null!=t.exec(e);return n?encodeURIComponent(e):e}var b,A="undefined",R="object",C="Shockwave Flash",k="ShockwaveFlash.ShockwaveFlash",S="application/x-shockwave-flash",P="SWFObjectExprInst",M=window,I=document,E=navigator,F=[],L=[],N=[],B=[],O=null,T=null,U=null,x=!1,j=!1,$=function(){var e=typeof I.getElementById!=A&&typeof I.getElementsByTagName!=A&&typeof I.createElement!=A,t=[0,0,0],n=null;if(typeof E.plugins!=A&&typeof E.plugins[C]==R)n=E.plugins[C].description,!n||typeof E.mimeTypes!=A&&E.mimeTypes[S]&&!E.mimeTypes[S].enabledPlugin||(n=n.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),t[0]=parseInt(n.replace(/^(.*)\..*$/,"$1"),10),t[1]=parseInt(n.replace(/^.*\.(.*)\s.*$/,"$1"),10),t[2]=/r/.test(n)?parseInt(n.replace(/^.*r(.*)$/,"$1"),10):0);else if(typeof M.ActiveXObject!=A){var r=null,o=!1;try{r=new ActiveXObject(k+".7")}catch(i){try{r=new ActiveXObject(k+".6"),t=[6,0,21],r.AllowScriptAccess="always"}catch(i){6==t[0]&&(o=!0)}if(!o)try{r=new ActiveXObject(k)}catch(i){}}if(!o&&r)try{n=r.GetVariable("$version"),n&&(n=n.split(" ")[1].split(","),t=[parseInt(n[0],10),parseInt(n[1],10),parseInt(n[2],10)])}catch(i){}}var a=E.userAgent.toLowerCase(),c=E.platform.toLowerCase(),s=/webkit/.test(a)?parseFloat(a.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,l=!1,d=c?/win/.test(c):/win/.test(a),u=c?/mac/.test(c):/mac/.test(a);return{w3cdom:e,pv:t,webkit:s,ie:l,win:d,mac:u}}();(function(){if($.w3cdom){if(n(o),$.ie&&$.win)try{I.write(""),b=p("__ie_ondomload"),b&&g(b,"onreadystatechange",e)}catch(i){}$.webkit&&typeof I.readyState!=A&&(O=setInterval(function(){/loaded|complete/.test(I.readyState)&&t()},10)),typeof I.addEventListener!=A&&I.addEventListener("DOMContentLoaded",t,null),r(t)}})(),function(){$.ie&&$.win&&window.attachEvent("onunload",function(){for(var e=B.length,t=0;e>t;t++)B[t][0].detachEvent(B[t][1],B[t][2]);for(var n=N.length,r=0;n>r;r++)u(N[r]);for(var o in $)$[o]=null;$=null;for(var i in swfobject)swfobject[i]=null;swfobject=null})}();return{registerObject:function(e,t,n){if($.w3cdom&&e&&t){var r={};r.id=e,r.swfVersion=t,r.expressInstall=n?n:!1,L[L.length]=r,w(e,!1)}},getObjectById:function(e){var t=null;if($.w3cdom){var n=p(e);if(n){var r=n.getElementsByTagName(R)[0];!r||r&&typeof n.SetVariable!=A?t=n:typeof r.SetVariable!=A&&(t=r)}}return t},embedSWF:function(e,t,r,o,i,c,s,d,u){if($.w3cdom&&e&&t&&r&&o&&i)if(r+="",o+="",m(i)){w(t,!1);var f={};if(u&&typeof u===R)for(var p in u)u[p]!=Object.prototype[p]&&(f[p]=u[p]);f.data=e,f.width=r,f.height=o;var v={};if(d&&typeof d===R)for(var g in d)d[g]!=Object.prototype[g]&&(v[g]=d[g]);if(s&&typeof s===R)for(var h in s)s[h]!=Object.prototype[h]&&(typeof v.flashvars!=A?v.flashvars+="&"+h+"="+s[h]:v.flashvars=h+"="+s[h]);n(function(){l(f,v,t),f.id==t&&w(t,!0)})}else c&&!j&&m("6.0.65")&&($.win||$.mac)&&(j=!0,w(t,!1),n(function(){var e={};e.id=e.altContentId=t,e.width=r,e.height=o,e.expressInstall=c,a(e)}))},getFlashPlayerVersion:function(){return{major:$.pv[0],minor:$.pv[1],release:$.pv[2]}},hasFlashPlayerVersion:m,createSWF:function(e,t,n){return $.w3cdom?l(e,t,n):void 0},removeSWF:function(e){$.w3cdom&&u(e)},createCSS:function(e,t){$.w3cdom&&h(e,t)},addDomLoadEvent:n,addLoadEvent:r,getQueryParamValue:function(e){var t=I.location.search||I.location.hash;if(null==e)return y(t);if(t)for(var n=t.substring(1).split("&"),r=0;r'); + $element.append(''); var audioPlayer = document.getElementById(audioObjId); if (control.showPlayer) { @@ -166,28 +165,28 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.getAudioPlayer = function () { - return service.isCordova ? cordovaMedia.player : document.getElementById(audioObjId); + return recorderService.isCordova ? cordovaMedia.player : document.getElementById(audioObjId); }; control.startRecord = function () { - if (!service.isAvailable()) { + if (!recorderService.isAvailable()) { return; } if (status.isPlaying) { control.playbackPause(); //indicate that this is not paused. - status.playback = PLAYBACK.STOPPED; + status.playback = recorderPlaybackStatus.STOPPED; } //clear audio previously recorded control.audioModel = null; - var id = control.id, recordHandler = service.getHandler(); + var id = control.id, recordHandler = recorderService.getHandler(); //Record initiation based on browser type var start = function () { - if (service.isCordova) { + if (recorderService.isCordova) { cordovaMedia.url = recorderUtils.cordovaAudioUrl(control.id); //mobile app needs wav extension to save recording cordovaMedia.recorder = new Media(cordovaMedia.url, function () { @@ -198,7 +197,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim console.log('CordovaRecording'); cordovaMedia.recorder.startRecord(); } - else if (service.isHtml5) { + else if (recorderService.isHtml5) { //HTML5 recording if (!recordHandler) { return; @@ -209,7 +208,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim } else { //Flash recording - if (!service.isReady) { + if (!recorderService.isReady) { //Stop recording if the flash object is not ready return; } @@ -228,18 +227,18 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }, 1000); }; - if (service.isCordova || recordHandler) { + if (recorderService.isCordova || recordHandler) { start(); } else if (!status.isDenied) { //probably permission was never asked - service.showPermission({ + recorderService.showPermission({ onDenied: function () { status.isDenied = true; $scope.$apply(); }, onAllowed: function () { status.isDenied = false; - recordHandler = service.getHandler(); + recordHandler = recorderService.getHandler(); start(); scopeApply(); } @@ -249,11 +248,11 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim control.stopRecord = function () { var id = control.id; - if (!service.isAvailable() || !status.isRecording) { + if (!recorderService.isAvailable() || !status.isRecording) { return false; } - var recordHandler = service.getHandler(); + var recordHandler = recorderService.getHandler(); var completed = function (blob) { $interval.cancel(timing); status.isRecording = false; @@ -273,7 +272,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; //To stop recording - if (service.isCordova) { + if (recorderService.isCordova) { cordovaMedia.recorder.stopRecord(); window.resolveLocalFileSystemURL(cordovaMedia.url, function (entry) { entry.file(function (blob) { @@ -282,7 +281,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }, function (err) { console.log('Could not retrieve file, error code:', err.code); }); - } else if (service.isHtml5) { + } else if (recorderService.isHtml5) { recordHandler.stop(); recordHandler.getBuffer(function () { recordHandler.exportWAV(function (blob) { @@ -297,11 +296,11 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.playbackRecording = function () { - if (status.isPlaying || !service.isAvailable() || status.isRecording || !control.audioModel) { + if (status.isPlaying || !recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } - if (service.isCordova) { + if (recorderService.isCordova) { cordovaMedia.player = new Media(cordovaMedia.url, playbackOnEnded, function () { console.log('Playback failed'); }); @@ -314,25 +313,25 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.playbackPause = function () { - if (!status.isPlaying || !service.isAvailable() || status.isRecording || !control.audioModel) { + if (!status.isPlaying || !recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } control.getAudioPlayer().pause(); - if (service.isCordova) { + if (recorderService.isCordova) { playbackOnPause(); } }; control.playbackResume = function () { - if (status.isPlaying || !service.isAvailable() || status.isRecording || !control.audioModel) { + if (status.isPlaying || !recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } if (status.isPaused) { //previously paused, just resume control.getAudioPlayer().play(); - if (service.isCordova) { + if (recorderService.isCordova) { playbackOnResume(); } } else { @@ -343,7 +342,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim control.save = function (fileName) { - if (!service.isAvailable() || status.isRecording || !control.audioModel) { + if (!recorderService.isAvailable() || status.isRecording || !control.audioModel) { return false; } @@ -362,7 +361,7 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }; control.isHtml5 = function () { - return service.isHtml5; + return recorderService.isHtml5; }; if (control.autoStart) { @@ -371,14 +370,12 @@ var RecorderController = function (element, service, recorderUtils, $scope, $tim }, 1000); } - element.on('$destroy', function () { + $element.on('$destroy', function () { $interval.cancel(timing); }); }; -RecorderController.$inject = ['$element', 'recorderService', 'recorderUtils', '$scope', '$timeout', '$interval', 'recorderPlaybackStatus']; - angular.module('angularAudioRecorder.controllers') - .controller('recorderController', RecorderController) + .controller('recorderController', ['$element', 'recorderService', 'recorderUtils', '$scope', '$timeout', '$interval', 'recorderPlaybackStatus', RecorderController]) ; \ No newline at end of file diff --git a/src/angular/directives/ng-audio-recorder-analyzer.js b/src/angular/directives/ng-audio-recorder-analyzer.js index 486a7e1..89ec481 100644 --- a/src/angular/directives/ng-audio-recorder-analyzer.js +++ b/src/angular/directives/ng-audio-recorder-analyzer.js @@ -2,15 +2,15 @@ angular.module('angularAudioRecorder.directives') .directive('ngAudioRecorderAnalyzer', ['recorderService', 'recorderUtils', - function (service, utils) { + function (recorderService, recorderUtils) { var link = function (scope, element, attrs, recorder) { - if (!service.isHtml5) { + if (!recorderService.isHtml5) { scope.hide = true; return; } - var canvasWidth, canvasHeight, rafID, analyserContext, props = service.$html5AudioProps; + var canvasWidth, canvasHeight, rafID, analyserContext, props = recorderService.$html5AudioProps; function updateAnalysers(time) { @@ -80,8 +80,8 @@ angular.module('angularAudioRecorder.directives') }; })(recorder.onRecordStart); - utils.appendActionToCallback(recorder, 'onRecordStart', updateAnalysers, 'analyzer'); - utils.appendActionToCallback(recorder, 'onRecordComplete', cancelAnalyserUpdates, 'analyzer'); + recorderUtils.appendActionToCallback(recorder, 'onRecordStart', updateAnalysers, 'analyzer'); + recorderUtils.appendActionToCallback(recorder, 'onRecordComplete', cancelAnalyserUpdates, 'analyzer'); }; return { diff --git a/src/angular/directives/ng-audio-recorder-wave-view.js b/src/angular/directives/ng-audio-recorder-wave-view.js index c10a3c8..96791d8 100644 --- a/src/angular/directives/ng-audio-recorder-wave-view.js +++ b/src/angular/directives/ng-audio-recorder-wave-view.js @@ -1,8 +1,8 @@ 'use strict'; angular.module('angularAudioRecorder.directives') - .directive('ngAudioRecorderWaveView', ['recorderService', 'recorderUtils', '$log', - function (service, utils, $log) { + .directive('ngAudioRecorderWaveView', ['recorderUtils', '$log', + function (recorderUtils, $log) { return { restrict: 'E', @@ -18,14 +18,14 @@ angular.module('angularAudioRecorder.directives') var options = angular.extend({container: $element.find('div')[0]}, attrs); var waveSurfer = WaveSurfer.create(options); waveSurfer.setVolume(0); - utils.appendActionToCallback(recorder, 'onPlaybackStart|onPlaybackResume', function () { + recorderUtils.appendActionToCallback(recorder, 'onPlaybackStart|onPlaybackResume', function () { waveSurfer.play(); }, 'waveView'); - utils.appendActionToCallback(recorder, 'onPlaybackComplete|onPlaybackPause', function () { + recorderUtils.appendActionToCallback(recorder, 'onPlaybackComplete|onPlaybackPause', function () { waveSurfer.pause(); }, 'waveView'); - utils.appendActionToCallback(recorder, 'onRecordComplete', function () { + recorderUtils.appendActionToCallback(recorder, 'onRecordComplete', function () { if (!audioPlayer) { audioPlayer = recorder.getAudioPlayer(); audioPlayer.addEventListener('seeking', function (e) { diff --git a/src/angular/services/recorder-service.js b/src/angular/services/recorder-service.js index 2feb40b..dfd8ed7 100644 --- a/src/angular/services/recorder-service.js +++ b/src/angular/services/recorder-service.js @@ -2,16 +2,16 @@ angular.module('angularAudioRecorder.services') .provider('recorderService', ['recorderScriptUrl', - function (scriptPath) { + function (recorderScriptUrl) { var handler = null, service = {isHtml5: false, isReady: false}, permissionHandlers = {onDenied: null, onClosed: null, onAllow: null}, forceSwf = false, /*this path is relative to the dist path:*/ - swfUrl = scriptPath + '../lib/recorder.swf', + swfUrl = recorderScriptUrl + '../lib/recorder.swf', utils, mp3Covert = false, - mp3Config = {bitRate: 92, lameJsUrl: scriptPath + '../lib/lame.min.js'} + mp3Config = {bitRate: 92, lameJsUrl: recorderScriptUrl + '../lib/lame.min.js'} ; var swfHandlerConfig = {