PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/js/mediaHandlers.js

https://gitlab.com/iftikhar.ali/myproject
JavaScript | 417 lines | 323 code | 50 blank | 44 comment | 55 complexity | 9f1000fb560a75acc56587d71f15ef7b MD5 | raw file
  1. document.addEventListener('deviceready', masterAudioCode, false);
  2. var my_recorder = null;
  3. var my_player = null;
  4. function masterAudioCode(){
  5. window.localStorage.setItem("sat_recording",false);
  6. var my_recorder = 'created';
  7. var my_player = null;
  8. cl("masterAudioCode running");
  9. var progressTimmer = null;
  10. var createdStatus = false;
  11. var recTime = 0;
  12. var d = new Date();
  13. y = d.getFullYear();
  14. m = d.getMonth()+1;
  15. da = d.getDay();
  16. h = d.getHours();
  17. mn = d.getMinutes();
  18. s = d.getSeconds();
  19. ml = d.getMilliseconds();
  20. var unique = y+""+m+""+da+""+h+""+mn+""+s+""+ml;
  21. function makeUnique(){
  22. var d = new Date();
  23. y = d.getFullYear();
  24. m = d.getMonth()+1;
  25. da = d.getDay();
  26. h = d.getHours();
  27. mn = d.getMinutes();
  28. s = d.getSeconds();
  29. ml = d.getMilliseconds();
  30. var unique = y+""+m+""+da+""+h+""+mn+""+s+""+ml;
  31. return unique;
  32. }
  33. // for recording: do not specify any directory
  34. var mediaFileFullName = null;
  35. var type_ios = ua.match(/(iphone|ipod|ipad)/i);
  36. var type_android = ua.match(/android/i);
  37. cl("type_ios: "+type_ios+" type_android: "+type_android);
  38. if(type_ios){var mediaRecFile = "satrecording100.wav"; window.localStorage.setItem("sat_recording_name",mediaRecFile);}
  39. else if (type_android){var mediaRecFile = "satrecording"+unique+".amr";window.localStorage.setItem("sat_recording_name",mediaRecFile);}
  40. else if (!type_android && !type_ios){var mediaRecFile = "satrecording1000.wav";}
  41. cl("mediaRecFile Line 18: "+mediaRecFile);
  42. var checkFileOnly = false;
  43. var mediaFileExist = false;
  44. var myMediaState =
  45. {
  46. start: 1,
  47. recording: 2,
  48. finishRec: 3,
  49. playback: 4,
  50. paused: 5,
  51. stopped: 6
  52. };
  53. if(typeof console === "undefined") {
  54. console = { log: function() { cl("console === undefined") } };
  55. }
  56. function onOK_GetFile(fileEntry) {
  57. cl("***test: onOK_GetFile File name and path: " + mediaRecFile + " at " + fileEntry.fullPath);
  58. // save the full file name
  59. mediaFileFullName = fileEntry.fullPath;
  60. if (phoneCheck.ios)
  61. mediaRecFile = mediaFileFullName;
  62. if (checkFileOnly == true) { // check if file exist at app launch.
  63. mediaFileExist = true;
  64. setButtonState(myMediaState.finishRec);
  65. }
  66. else {
  67. // create media object using full media file name
  68. my_recorder = new Media(mediaRecFile, onMediaCallSuccess, onMediaCallError);
  69. // specific for iOS device: recording start here in call-back function
  70. cl("!!!! About to record !!!!");
  71. recordNow();
  72. }
  73. }
  74. function onSuccessFileSystem(fileSystem) {
  75. cl("***test: fileSystem.root.name: " + fileSystem.root.name);
  76. if (checkFileOnly == true) {
  77. cl("checkFileOnly == true | mediaRecFile: " +mediaRecFile);
  78. fileSystem.root.getFile(mediaRecFile, { create: false, exclusive: false }, onOK_GetFile,
  79. function(){cl("!!!! error checkFileOnly == true")});
  80. } else {
  81. fileSystem.root.getFile(mediaRecFile, { create: true, exclusive: false }, onOK_GetFile, function(){cl("checkFileOnly else called")});
  82. }
  83. }
  84. function checkMediaRecFileExist() {
  85. cl("checkMediaRecFileExist triggered");
  86. checkFileOnly = true;
  87. window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onSuccessFileSystem, onFailedFileSystem);
  88. }
  89. function onFailedFileSystem(){cl("!!!! Failed the checMediaRecFilExist test");}
  90. function recordNow() {
  91. cl("recordNow triggered");
  92. jQuery("#start-recording-audio-container").slideUp("fast");
  93. jQuery("#audio-recording-container").slideDown("fast");
  94. jQuery("#capture-photo-button").slideUp("fast");
  95. jQuery("#open-images-folder-button").slideUp("fast");
  96. my_recorder = new Media(mediaRecFile, onMediaCallSuccess, onMediaCallError);
  97. console.log(mediaRecFile);
  98. my_recorder.startRecord();
  99. cl("Status: recording");
  100. cl("***test: recording started: in recordNow() line 104 ***");
  101. }// recordNow
  102. function recordNowAndroid(){
  103. cl("recordNowAndroid triggered");
  104. window.localStorage.setItem("sat_recording",true);
  105. jQuery("#start-recording-audio-container").slideUp("fast");
  106. jQuery("#audio-recording-container").toggle();
  107. jQuery("#capture-photo-button").slideUp("fast");
  108. jQuery("#open-images-folder-button").slideUp("fast");
  109. var src = "satrecording"+unique+".amr";
  110. var my_recorder = new Media(src, onMediaCallSuccess, onMediaCallError,function(status){
  111. var sat_recorder = JSON.stringify(my_recorder);
  112. console.log(sat_recorder);
  113. localStorage.setItem("sat_recorder", sat_recorder);
  114. console.log("Media status:");
  115. console.log(status)});
  116. console.log("my_recorder (Android):")
  117. console.log(my_recorder);
  118. // Record audio
  119. my_recorder.startRecord();
  120. // temp stop
  121. var recTime = 0;
  122. var recInterval = setInterval(function() {
  123. recTime = recTime + 1;
  124. setAudioPosition(recTime + " sec");
  125. recording = window.localStorage.getItem("sat_recording");
  126. if (recTime >= 5000 || recording == "false") {
  127. clearInterval(recInterval);
  128. my_recorder.stopRecord();
  129. }
  130. }, 1000);
  131. }// recordNowAndroid
  132. // Record audio
  133. //
  134. jQuery("#record-audio").on("click",hereWeGo);
  135. function hereWeGo(){
  136. navigator.notification.confirm("Ready to record?",startTheProcess,"Ready, Set...","Record!, Nope!");
  137. }
  138. function startTheProcess(){
  139. cl("Record button pressed");
  140. checkMediaRecFileExist();
  141. cl("checkMediaRecFileExist triggered from record-audio on click line 148");
  142. startRecording();
  143. }// start the process
  144. function startRecording() {
  145. cl("startRecording triggered")
  146. // change buttons state
  147. setButtonState(myMediaState.recording);
  148. cl("setButtonState triggered");
  149. // create media object - overwrite existing recording
  150. if (my_recorder)
  151. //my_recorder.release();
  152. cl("my_recorder.release");
  153. if (phoneCheck.android) {
  154. cl("mediaRecFile Line 125: "+mediaRecFile);
  155. cl("***test: new Media() for android ***");
  156. recordNowAndroid();
  157. }
  158. else if (phoneCheck.windows7) {
  159. my_recorder = new Media(mediaRecFile, onMediaCallSuccess, onMediaCallError);
  160. cl("***test: new Media() for Windows7 ***");
  161. recordNow();
  162. }
  163. else if (phoneCheck.ios) {
  164. //first create the file
  165. checkFileOnly = false;
  166. window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onSuccessFileSystem, function() {
  167. cl("***test: failed in creating media file in requestFileSystem");
  168. });
  169. cl("***test: new Media() for ios***");
  170. }
  171. }
  172. // Stop recording
  173. jQuery("#stop-recording-audio").on("click",function(){
  174. cl("stop recording button pressed");
  175. jQuery("#audio-play-button-container").slideDown("fast");
  176. jQuery("#audio-recording-container").slideUp('fast');
  177. window.localStorage.setItem("sat_recording",false);
  178. cl("MediaRecFile: "+ MediaRecFile)
  179. stopRecording();
  180. });
  181. function stopRecording() {
  182. if(phoneCheck.android && my_recorder == null){
  183. sat_recorder = localStorage.getItem("sat_recorder");
  184. console.log("sat_recorder:");
  185. console.log(sat_recorder);
  186. my_recorder = sat_recorder
  187. }
  188. console.log("my_recorder");
  189. console.log(my_recorder);
  190. // enable "record" button but disable "stop"
  191. //clearProgressTimmer();
  192. //setButtonState(myMediaState.finishRec);
  193. cl("stopRecording triggered - line 199");
  194. if (my_recorder) {
  195. my_recorder.stopRecord(); // the file should be moved to "/sdcard/"+mediaRecFile
  196. cl("stopRecord()");
  197. my_recorder.release();
  198. cl("release()")
  199. clearProgressTimmer();
  200. cl("Status: stopped record - line 208");
  201. cl("***test: recording stopped***");
  202. } else {console.log("Can't find 'my_recorder'")}
  203. }// stopRecording
  204. // Play audio
  205. jQuery("#audio-play-button-container").on("click", function(){
  206. cl("Play button pressed");
  207. jQuery("#audio-play-button-container").slideUp("fast");
  208. jQuery("#stop-playing-audio-container").slideDown('fast');
  209. playMusic();
  210. });
  211. function playMusic() {
  212. cl("playMusic function started");
  213. if (my_player === null) { // play existing media recorded from previous session
  214. // the existing medail should be on /sdcard/ for android.
  215. if (phoneCheck.android) {
  216. cl("Play!! phoneCheck.android");
  217. my_player = new Media("satrecording"+unique+".amr", onMediaCallSuccess, onMediaCallError);
  218. //my_player = new Media("/sdcard/" + mediaRecFile, onMediaCallSuccess, onMediaCallError);
  219. cl("***test: Open file:" + mediaRecFile);
  220. } else if (phoneCheck.windows7) // windows 7.1 phone
  221. my_player = new Media(mediaRecFile, onMediaCallSuccess, onMediaCallError);
  222. else if (phoneCheck.ios) {
  223. my_player = new Media(mediaFileFullName, onMediaCallSuccess, onMediaCallError);
  224. }
  225. }
  226. // Play audio
  227. if (my_player) {
  228. my_player.play();
  229. cl("Status: playing...");
  230. setButtonState(myMediaState.playback);
  231. // Update media position every second
  232. clearProgressTimmer();
  233. progressTimmer = setInterval(function () {
  234. // get my_player position
  235. my_player.getCurrentPosition(
  236. // success callback
  237. function (position) {
  238. if (position >= 0)
  239. setAudioPosition('media_pos', (position) + " sec");
  240. else {
  241. // reached end of media: same as clicked stop-music
  242. clearProgressTimmer();
  243. setAudioPosition('media_pos', "0 sec");
  244. cl("Status: stopped");
  245. setButtonState(myMediaState.stopped);
  246. }
  247. },
  248. // error callback
  249. function (e) {
  250. cl("Status: Error on getting position - " + e);
  251. setAudioPosition("Error: " + e);
  252. });
  253. }, 1000);
  254. }
  255. }
  256. // Pause audio
  257. //
  258. function pauseMusic() {
  259. if (my_player) {
  260. my_player.pause();
  261. cl("Status: paused");
  262. clearProgressTimmer();
  263. setButtonState(myMediaState.paused);
  264. }
  265. }
  266. // Stop audio
  267. //
  268. jQuery("#stop-playing-audio").on("click",function(){
  269. jQuery("#audio-play-button-container").slideDown("fast");
  270. jQuery("#stop-playing-audio-container").slideUp('fast');
  271. cl("Stop button pressed");
  272. stopMusic();
  273. });
  274. function stopMusic() {
  275. cl("stopMusic function started");
  276. if (my_player) {
  277. setAudioPosition('media_pos', "0 sec");
  278. setButtonState(myMediaState.stopped);
  279. my_player.stop();
  280. // should not be necessary, but it is needed in order to play again.
  281. my_player.release()
  282. my_player = null;
  283. clearProgressTimmer();
  284. cl("Status: stopped");
  285. }
  286. }
  287. function clearProgressTimmer() {
  288. if (progressTimmer) {
  289. clearInterval(progressTimmer);
  290. progressTimmer = null;
  291. }
  292. }
  293. // Media() success callback
  294. function onMediaCallSuccess() {
  295. createdStatus = true;
  296. cl("***test: new Media() succeeded ***");
  297. }
  298. // Media() error callback
  299. function onMediaCallError(error) {
  300. console.log('line 315 - code: ' + error.code + ' | message: ' + error.message);
  301. cl("***test: new Media() failed ***");
  302. }
  303. // Set audio position
  304. //
  305. function setAudioPosition(audioPosID, position) {
  306. //document.getElementById(audioPosID).innerHTML = "<p></p>Audio position: "+position;
  307. cl("Audio position: "+position);
  308. }
  309. // only "Record" button is enabled at init state
  310. function setButtonState(curState)
  311. {
  312. var id_disabled_map = {"startRecID":false,
  313. "stopRecID":true,
  314. "startPlayID":true,
  315. "pausePlayID":true,
  316. "stopPlayID":true};
  317. if (curState == myMediaState.start) // only "record" is enabled
  318. {
  319. cl("***test: start state #####");
  320. }
  321. else if (curState == myMediaState.recording) // only "stoprec" is enabled
  322. {
  323. cl("***test: recording state #####");
  324. id_disabled_map["startRecID"] = true;
  325. id_disabled_map["stopRecID"] = false;
  326. }
  327. else if ((curState == myMediaState.finishRec) ||
  328. (curState == myMediaState.stopped)) // only "record", "play" are enabled
  329. {
  330. cl("***test: finishing/stopped state #####");
  331. id_disabled_map["startPlayID"] = false;
  332. }
  333. else if (curState == myMediaState.playback) // only "pause", "stop" are enabled
  334. {
  335. cl("***test: playback state #####");
  336. id_disabled_map["startRecID"] = true;
  337. id_disabled_map["startPlayID"] = true;
  338. }
  339. else if (curState == myMediaState.paused) // only "play", "record" & "stop" are enabled
  340. {
  341. cl("***test: paused state #####");
  342. id_disabled_map["startPlayID"] = false;
  343. id_disabled_map["stopPlayID"] = false;
  344. }
  345. else
  346. {
  347. cl("*** unknown media state");
  348. }
  349. var keys = Object.keys(id_disabled_map); //the list of ids: ["startRecID", "stopRecID",...]
  350. console.log(keys);
  351. id_disabled_map["startRecID"] = false;
  352. id_disabled_map["stopRecID"] = false;
  353. id_disabled_map["startPlayID"] = false;
  354. id_disabled_map["pausePlayID"] = false;
  355. id_disabled_map["stopPlayID"] = false;
  356. /*
  357. keys.forEach(function(id){
  358. console.log(id);
  359. //id_disabled_map[id] = false;
  360. });
  361. */
  362. console.log(id_disabled_map);
  363. return(id_disabled_map);
  364. }
  365. }// masterAudioCode
  366. //https://github.com/apache/cordova-plugin-media/blob/6de7e53f40be0160dff9789e98ad664574ca6ff4/docs/media.play.md
  367. // from 0.092s