a.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. Recorder = {
  2. recorder : null,
  3. recorderOriginalWidth : 0,
  4. recorderOriginalHeight : 0,
  5. uploadFormId : null,
  6. uploadFieldName : null,
  7. isReady : false,
  8. connect : function(name, attempts) {
  9. if (navigator.appName.indexOf("Microsoft") != -1) {
  10. Recorder.recorder = window[name];
  11. } else {
  12. Recorder.recorder = document[name];
  13. }
  14. if (attempts >= 40) {
  15. return;
  16. }
  17. // flash app needs time to load and initialize
  18. if (Recorder.recorder && Recorder.recorder.init) {
  19. Recorder.recorderOriginalWidth = Recorder.recorder.width;
  20. Recorder.recorderOriginalHeight = Recorder.recorder.height;
  21. if (Recorder.uploadFormId && $) {
  22. var frm = $(Recorder.uploadFormId);
  23. Recorder.recorder.init(frm.attr('action').toString(), Recorder.uploadFieldName, frm.serializeArray());
  24. }
  25. return;
  26. }
  27. setTimeout(function() {
  28. Recorder.connect(name, attempts + 1);
  29. }, 100);
  30. },
  31. playBack : function(name) {
  32. // TODO: Rename to `playback`
  33. Recorder.recorder.playBack(name);
  34. },
  35. pausePlayBack : function(name) {
  36. // TODO: Rename to `pausePlayback`
  37. Recorder.recorder.pausePlayBack(name);
  38. },
  39. playBackFrom : function(name, time) {
  40. // TODO: Rename to `playbackFrom`
  41. Recorder.recorder.playBackFrom(name, time);
  42. },
  43. record : function(name, filename) {
  44. Recorder.recorder.record(name, filename);
  45. },
  46. stopRecording : function() {
  47. Recorder.recorder.stopRecording();
  48. },
  49. stopPlayBack : function() {
  50. // TODO: Rename to `stopPlayback`
  51. Recorder.recorder.stopPlayBack();
  52. },
  53. observeLevel : function() {
  54. Recorder.recorder.observeLevel();
  55. },
  56. stopObservingLevel : function() {
  57. Recorder.recorder.stopObservingLevel();
  58. },
  59. observeSamples : function() {
  60. Recorder.recorder.observeSamples();
  61. },
  62. stopObservingSamples : function() {
  63. Recorder.recorder.stopObservingSamples();
  64. },
  65. resize : function(width, height) {
  66. Recorder.recorder.width = width + "px";
  67. Recorder.recorder.height = height + "px";
  68. },
  69. defaultSize : function() {
  70. Recorder.resize(Recorder.recorderOriginalWidth, Recorder.recorderOriginalHeight);
  71. },
  72. show : function() {
  73. Recorder.recorder.show();
  74. },
  75. hide : function() {
  76. Recorder.recorder.hide();
  77. },
  78. duration : function(name) {
  79. // TODO: rename to `getDuration`
  80. return Recorder.recorder.duration(name || Recorder.uploadFieldName);
  81. },
  82. getBase64 : function(name) {
  83. var data = Recorder.recorder.getBase64(name);
  84. return 'data:' + 'audio/wav' + ';base64,' + data;
  85. },
  86. getBlob : function(name) {
  87. var base64Data = Recorder.getBase64(name).split(',')[1];
  88. return base64toBlob(base64Data, 'audio/wav');
  89. },
  90. getCurrentTime : function(name) {
  91. return Recorder.recorder.getCurrentTime(name);
  92. },
  93. isMicrophoneAccessible : function() {
  94. return Recorder.recorder.isMicrophoneAccessible();
  95. },
  96. updateForm : function() {
  97. var frm = $(Recorder.uploadFormId);
  98. Recorder.recorder.update(frm.serializeArray());
  99. },
  100. showPermissionWindow : function(options) {
  101. Recorder.resize(240, 160);
  102. // need to wait until app is resized before displaying permissions
  103. // screen
  104. var permissionCommand = function() {
  105. if (options && options.permanent) {
  106. Recorder.recorder.permitPermanently();
  107. } else {
  108. Recorder.recorder.permit();
  109. }
  110. };
  111. setTimeout(permissionCommand, 1);
  112. },
  113. configure : function(rate, gain, silenceLevel, silenceTimeout) {
  114. rate = parseInt(rate || 22);
  115. gain = parseInt(gain || 100);
  116. silenceLevel = parseInt(silenceLevel || 0);
  117. silenceTimeout = parseInt(silenceTimeout || 4000);
  118. switch (rate) {
  119. case 44:
  120. case 22:
  121. case 11:
  122. case 8:
  123. case 5:
  124. break;
  125. default:
  126. throw ("invalid rate " + rate);
  127. }
  128. if (gain < 0 || gain > 100) {
  129. throw ("invalid gain " + gain);
  130. }
  131. if (silenceLevel < 0 || silenceLevel > 100) {
  132. throw ("invalid silenceLevel " + silenceLevel);
  133. }
  134. if (silenceTimeout < -1) {
  135. throw ("invalid silenceTimeout " + silenceTimeout);
  136. }
  137. Recorder.recorder.configure(rate, gain, silenceLevel, silenceTimeout);
  138. },
  139. setUseEchoSuppression : function(val) {
  140. if (typeof (val) != 'boolean') {
  141. throw ("invalid value for setting echo suppression, val: " + val);
  142. }
  143. Recorder.recorder.setUseEchoSuppression(val);
  144. },
  145. setLoopBack : function(val) {
  146. if (typeof (val) != 'boolean') {
  147. throw ("invalid value for setting loop back, val: " + val);
  148. }
  149. Recorder.recorder.setLoopBack(val);
  150. }
  151. };
  152. function base64toBlob(b64Data, contentType, sliceSize) {
  153. contentType = contentType || '';
  154. sliceSize = sliceSize || 512;
  155. var byteCharacters = atob(b64Data);
  156. var byteArrays = [];
  157. for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
  158. var slice = byteCharacters.slice(offset, offset + sliceSize);
  159. var byteNumbers = new Array(slice.length);
  160. for (var i = 0; i < slice.length; i++) {
  161. byteNumbers[i] = slice.charCodeAt(i);
  162. }
  163. var byteArray = new Uint8Array(byteNumbers);
  164. byteArrays.push(byteArray);
  165. }
  166. return new Blob(byteArrays, {
  167. type : contentType
  168. });
  169. }