sound.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. function myb64(bytes)
  2. {
  3. var binary = '';
  4. var len = bytes.byteLength;
  5. for (var i = 0; i < len; i++) {
  6. binary += String.fromCharCode( bytes[ i ] )
  7. }
  8. return window.btoa( binary );
  9. }
  10. function loopEnded()
  11. {
  12. var buffer = .4;
  13. if(this.currentTime > this.duration - buffer)
  14. {
  15. this.currentTime = 0;
  16. this.play()
  17. };
  18. }
  19. var sound = {
  20. j2c: null,
  21. init: function() {
  22. this.j2c = js2cppX();
  23. },
  24. create: function(){
  25. },
  26. play: function(path, volume, loop){
  27. try {
  28. var data = FS.readFile(path, {encoding:'binary'});
  29. }
  30. catch(er)
  31. {
  32. return 0;
  33. }
  34. var b64data = myb64(data);
  35. var src = "data:audio/ogg;base64," + b64data;
  36. var a = new Audio();
  37. a.src = src;
  38. a.play();
  39. a.volume = volume;
  40. //a.loop = true;
  41. if (loop)
  42. {
  43. a.addEventListener('timeupdate', loopEnded, false);
  44. }
  45. var obj = {instance:a, looped:loop, path:path};
  46. return this.j2c.create(obj);
  47. },
  48. get: function(id){
  49. return this.j2c.get(id);
  50. },
  51. setLoop: function(id, loop){
  52. var s = sound.get(id);
  53. if (!s)
  54. return;
  55. if (s.looped == loop)
  56. return;
  57. s.looped = loop;
  58. if (loop)
  59. s.instance.addEventListener('timeupdate', loopEnded, false);
  60. else
  61. s.instance.removeEventListener('timeupdate', loopEnded);
  62. },
  63. setVolume: function(id, volume){
  64. var s = sound.get(id);
  65. if (!s)
  66. return;
  67. s.instance.volume = volume;
  68. },
  69. pause: function(id){
  70. var s = sound.get(id);
  71. if (!s)
  72. return;
  73. console.log("pause " + s.path + " " + s.instance.readyState);
  74. s.instance.pause();
  75. console.log("pause end" + s.path + " " + s.instance.readyState);
  76. },
  77. resume: function(id){
  78. var s = sound.get(id);
  79. if (!s)
  80. return;
  81. s.instance.play();
  82. },
  83. stop: function(id){
  84. var s = sound.get(id);
  85. if (!s)
  86. return;
  87. if (s.looped)
  88. s.instance.removeEventListener('timeupdate', loopEnded);
  89. console.log("stop " + s.path + " " + s.instance.readyState);
  90. if (s.instance.readyState == 4)
  91. s.instance.pause();
  92. console.log("stop end" + s.path + " " + s.instance.readyState);
  93. },
  94. update: function(id){
  95. var s = sound.get(id);
  96. if (!s)
  97. return true;
  98. if (s.looped)
  99. return false;
  100. var ended = s.instance.ended;
  101. return ended;
  102. },
  103. free: function(id){
  104. this.j2c.free(id);
  105. },
  106. stats: function(){
  107. return this.j2c.get_size();
  108. },
  109. };