No Description

main.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. 'use strict';
  2. /**
  3. * @ngdoc function
  4. * @name infernoQuadrifonicoApp.controller:MainCtrl
  5. * @description
  6. * # MainCtrl
  7. * Controller of the infernoQuadrifonicoApp
  8. */
  9. angular.module('infernoQuadrifonicoApp')
  10. .controller('MainCtrl', function ($http, $scope, $interval, $localStorage) {
  11. var useLocalStorage = false;
  12. var socket = io("", { query: "type=controller"});
  13. $scope.playing = [];
  14. $scope.sound_mode = "stereo";
  15. $scope.changeSoundMode = function(){
  16. if($scope.sound_mode == "stereo"){
  17. $scope.sound_mode = "surround";
  18. } else {
  19. $scope.sound_mode = "stereo"
  20. }
  21. }
  22. $http.get('roteiro.json')
  23. .then(function(res){
  24. if($localStorage.roteiro && useLocalStorage){
  25. console.log("Loading data from localstorage...")
  26. $scope.roteiro = angular.copy($localStorage.roteiro);
  27. } else {
  28. console.log("Loading data from file...")
  29. $scope.roteiro = res.data.estrofe;
  30. for (var i = 0; i < $scope.roteiro.length; i++) {
  31. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  32. $scope.roteiro[i].arquivos[c].playing = false;
  33. $scope.roteiro[i].arquivos[c].seek = 0;
  34. $scope.roteiro[i].arquivos[c].show = false;
  35. $scope.loadAudioFile($scope.roteiro[i].arquivos[c]);
  36. }
  37. }
  38. }
  39. console.log($scope.roteiro);
  40. var interval = $interval(function() {
  41. updateSeekers();
  42. }, 25);
  43. var save = $interval(function() {
  44. $localStorage.roteiro = angular.copy($scope.roteiro);
  45. console.log("Autosaving...")
  46. //console.log($localStorage);
  47. }, 60000);
  48. //$interval.cancel(interval);
  49. });
  50. $scope.loadAudioFile = function(arquivo){
  51. for (var i = 0; i < $scope.roteiro.length; i++) {
  52. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  53. if($scope.roteiro[i].arquivos[c].url == arquivo.url){
  54. var sound = new Howl({
  55. usingWebAudio: true,
  56. html5: false,
  57. src: [$scope.roteiro[i].arquivos[c].url],
  58. autoplay: false,
  59. loop: $scope.roteiro[i].arquivos[c].loop,
  60. volume: ($scope.roteiro[i].arquivos[c].channels[0].volume/100),
  61. //stereo: $scope.roteiro[i].arquivos[c].pan,
  62. onend: function(id) {
  63. for (var i = 0; i < $scope.roteiro.length; i++) {
  64. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  65. if($scope.roteiro[i].arquivos[c].id == id){
  66. $scope.roteiro[i].arquivos[c].playing = false;
  67. $scope.roteiro[i].arquivos[c].seek = 0;
  68. console.log('Finished: ' + id + " | playing: " + $scope.roteiro[i].arquivos[c].playing);
  69. $scope.$apply();
  70. delete $scope.roteiro[i].arquivos[c].sound;
  71. break;
  72. }
  73. }
  74. }
  75. },
  76. onload: function(id) {
  77. for (var i = 0; i < $scope.roteiro.length; i++) {
  78. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  79. if($scope.roteiro[i].arquivos[c].id == id && $scope.roteiro[i].arquivos[c].show == false){
  80. if($scope.roteiro[i].arquivos[c].sound){
  81. $scope.roteiro[i].arquivos[c].duration = $scope.roteiro[i].arquivos[c].sound.duration();
  82. delete $scope.roteiro[i].arquivos[c].sound;
  83. }
  84. $scope.roteiro[i].arquivos[c].show = true;
  85. break;
  86. }
  87. }
  88. }
  89. }
  90. });
  91. }
  92. }
  93. }
  94. }
  95. $scope.playAudio = function(estrofe){
  96. //console.log(estrofe)
  97. for (var i = 0; i < estrofe.arquivos.length; i++) {
  98. $scope.playAudioFile(estrofe.arquivos[i]);
  99. }
  100. }
  101. $scope.playAudioFile = function(arquivo){
  102. for (var i = 0; i < $scope.roteiro.length; i++) {
  103. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  104. if($scope.roteiro[i].arquivos[c].url == arquivo.url){
  105. $scope.roteiro[i].arquivos[c].playing = true;
  106. var d = $scope.roteiro[i].arquivos[c].duration;
  107. var s1 = $scope.roteiro[i].arquivos[c].channels[0].seek;
  108. var s2 = $scope.roteiro[i].arquivos[c].channels[1].seek;
  109. var volume1 = $scope.roteiro[i].arquivos[c].channels[0].volume
  110. var volume2 = $scope.roteiro[i].arquivos[c].channels[1].volume
  111. var pan1 = $scope.roteiro[i].arquivos[c].channels[0].pan
  112. var pan2 = $scope.roteiro[i].arquivos[c].channels[1].pan
  113. $scope.roteiro[i].arquivos[c].channels[0].seek;
  114. console.log('Playing: ' + $scope.roteiro[i].arquivos[c].url.split("public/audio/").pop() + " ("+ volume1 + "/" + volume2 + " | " + pan1 + "/" + pan2 + ")");
  115. sendPlayCommand($scope.roteiro[i].arquivos[c]);
  116. }
  117. }
  118. }
  119. }
  120. $scope.stopAudioFile = function(arquivo){
  121. for (var i = 0; i < $scope.roteiro.length; i++) {
  122. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  123. if($scope.roteiro[i].arquivos[c].url == arquivo.url){
  124. //$scope.roteiro[i].arquivos[c].sound.stop();
  125. //delete $scope.roteiro[i].arquivos[c].sound;
  126. $scope.roteiro[i].arquivos[c].playing = false;
  127. //$scope.roteiro[i].arquivos[c].seek = 0;
  128. sendStopCommand($scope.roteiro[i].arquivos[c])
  129. console.log('Finished: ' + $scope.roteiro[i].arquivos[c].url + " | " + $scope.roteiro[i].arquivos[c].playing);
  130. }
  131. }
  132. }
  133. }
  134. $scope.stopPlayback = function(){
  135. for (var i = 0; i < $scope.roteiro.length; i++) {
  136. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  137. if($scope.roteiro[i].arquivos[c].sound){
  138. //$scope.roteiro[i].arquivos[c].sound.stop();
  139. sendStopCommand($scope.roteiro[i].arquivos[c]);
  140. //delete $scope.roteiro[i].arquivos[c].sound;
  141. $scope.roteiro[i].arquivos[c].playing = false;
  142. $scope.roteiro[i].arquivos[c].seek = 0;
  143. console.log('Finished: ' + $scope.roteiro[i].arquivos[c].id + " | " + $scope.roteiro[i].arquivos[c].seek);
  144. }
  145. }
  146. }
  147. }
  148. var updateSeekers = function() {
  149. for (var i = 0; i < $scope.roteiro.length; i++) {
  150. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  151. if($scope.roteiro[i].arquivos[c].sound){
  152. var d = $scope.roteiro[i].arquivos[c].sound.duration();
  153. var s = $scope.roteiro[i].arquivos[c].sound.seek()
  154. $scope.roteiro[i].arquivos[c].seek = (s/d)*100
  155. //console.log("updating seek position to: " + ((s/d)*100));
  156. }
  157. }
  158. }
  159. }
  160. $scope.isStereo = function(){
  161. if($scope.sound_mode == "stereo"){
  162. return true;
  163. } else {
  164. return false;
  165. }
  166. }
  167. $scope.options_seek = {
  168. from: 0,
  169. to: 100,
  170. step: 1,
  171. realtime: true,
  172. css: {
  173. background: {"background-color": "white"},
  174. before: {"background-color": "white"},// zone before default value
  175. default: {"background-color": "white"}, // default value: 1px
  176. after: {"background-color": "white"}, // zone after default value
  177. pointer: {"background-color": "#999"}, // circle pointer
  178. range: {"background-color": "white"} // use it if double value
  179. },
  180. //scale: [{val:50, label: ""}],
  181. callback: function(value, elt) {
  182. console.log("Seek: " + value);
  183. updateTrackPosition();
  184. }
  185. }
  186. $scope.options_volume = {
  187. from: 0,
  188. to: 100,
  189. step: 1,
  190. realtime: true,
  191. scale: [{val:50, label:'volume'}],
  192. css: {
  193. background: {"background-color": "white"},
  194. before: {"background-color": "white"},// zone before default value
  195. default: {"background-color": "white", "height" : "10px;"}, // default value: 1px
  196. after: {"background-color": "white"}, // zone after default value
  197. pointer: {"background-color": "#999"}, // circle pointer
  198. range: {"background-color": "white"} // use it if double value
  199. },
  200. callback: function(value, elt) {
  201. console.log("Volume: " + value);
  202. updateActiveVolume();
  203. }
  204. };
  205. $scope.options_pan = {
  206. from: -100,
  207. to: 100,
  208. step: 1,
  209. realtime: true,
  210. scale: [{val: 0, label:'stereo'}],
  211. css: {
  212. background: {"background-color": "white"},
  213. before: {"background-color": "white"},// zone before default value
  214. default: {"background-color": "white"}, // default value: 1px
  215. after: {"background-color": "white"}, // zone after default value
  216. pointer: {"background-color": "#999"}, // circle pointer
  217. range: {"background-color": "white"} // use it if double value
  218. },
  219. callback: function(value, elt) {
  220. console.log("Pan: " + value);
  221. updateActivePan();
  222. }
  223. };
  224. var updateTrackPosition = function(){
  225. for (var i = 0; i < $scope.roteiro.length; i++) {
  226. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  227. if($scope.roteiro[i].arquivos[c].playing == true){
  228. if($scope.roteiro[i].arquivos[c].sound){
  229. var d = $scope.roteiro[i].arquivos[c].sound.duration();
  230. var s = $scope.roteiro[i].arquivos[c].seek;
  231. var v = $scope.roteiro[i].arquivos[c].sound.seek();
  232. if(v - ((d * s)/100) > 0.5 || v - ((d * s)/100) < -0.5){
  233. //$scope.roteiro[i].arquivos[c].sound.seek((d * s)/100)
  234. var arquivo = $scope.roteiro[i].arquivos[c];
  235. delete arquivo.sound;
  236. delete arquivo.channels[0].volume;
  237. arquivo.channels[0].seek = (d * s)/100;
  238. socket.emit('update playback', arquivo);
  239. }
  240. }
  241. }
  242. }
  243. }
  244. }
  245. var updateActiveVolume = function(){
  246. for (var i = 0; i < $scope.roteiro.length; i++) {
  247. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  248. if($scope.roteiro[i].arquivos[c].playing == true){
  249. var arquivo = $scope.roteiro[i].arquivos[c];
  250. if($scope.roteiro[i].arquivos[c].sound){
  251. delete arquivo.sound;
  252. }
  253. delete arquivo.channels[0].pan;
  254. delete arquivo.channels[0].seek;
  255. delete arquivo.channels[1].pan;
  256. delete arquivo.channels[1].seek;
  257. socket.emit('update playback', arquivo);
  258. }
  259. }
  260. }
  261. }
  262. var updateActivePan = function(){
  263. for (var i = 0; i < $scope.roteiro.length; i++) {
  264. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  265. if($scope.roteiro[i].arquivos[c].playing == true){
  266. var arquivo = $scope.roteiro[i].arquivos[c];
  267. if($scope.roteiro[i].arquivos[c].sound){
  268. delete arquivo.sound;
  269. }
  270. delete arquivo.channels[0].volume;
  271. delete arquivo.channels[0].seek;
  272. delete arquivo.channels[1].volume;
  273. delete arquivo.channels[1].seek;
  274. socket.emit('update playback', arquivo);
  275. }
  276. }
  277. }
  278. }
  279. $scope.isEmpty = function(text){
  280. if(text != ""){ return false; } else { return true; }
  281. }
  282. var sendPlayCommand = function(arquivo){
  283. delete arquivo.sound;
  284. socket.emit('play', arquivo);
  285. }
  286. var sendStopCommand = function(arquivo){
  287. delete arquivo.sound;
  288. socket.emit('stop', arquivo);
  289. }
  290. socket.on('play ended', function(arquivo){
  291. for (var i = 0; i < $scope.roteiro.length; i++) {
  292. for (var c = 0; c < $scope.roteiro[i].arquivos.length; c++) {
  293. if($scope.roteiro[i].arquivos[c].url == arquivo.url){
  294. $scope.roteiro[i].arquivos[c].channels[0].seek = 0;
  295. $scope.roteiro[i].arquivos[c].playing = false;
  296. //delete $scope.roteiro[i].arquivos[c].sound;
  297. console.log('Finished: ' + $scope.roteiro[i].arquivos[c].url + " | playing: " + $scope.roteiro[i].arquivos[c].playing);
  298. break;
  299. }
  300. }
  301. }
  302. });
  303. });