SoundManger.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import button_click from "@assets/sound/click2.mp3";
  2. const defaultAudio={
  3. "button_click":button_click
  4. }
  5. class SoundManger {
  6. constructor(){
  7. this.audioOn=true;
  8. this.audioContext=null;
  9. this.audioBuffers=[];
  10. this.baseUrl="";
  11. this.isLoadAudioFile=false;
  12. this.initModule();
  13. }
  14. initModule(url="@assets/"){
  15. this.baseUrl=url;
  16. this.audioBuffers = [];
  17. window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext
  18. this.audioContext = new window.AudioContext;
  19. }
  20. setSoundOn(isOpen){
  21. this.audioOn=isOpen;
  22. }
  23. stopSound(name){
  24. let audio = this.audioBuffers[name];
  25. if(audio && audio.source)
  26. {
  27. audio.source.stop(0);
  28. audio.source = null;
  29. }
  30. }
  31. playSound(name,loop=false){
  32. if (!this.audioOn)return;
  33. let audio = this.audioBuffers[name];
  34. if (audio)
  35. try {
  36. audio.source = null;
  37. audio.source = this.audioContext.createBufferSource();
  38. audio.source.buffer = audio.buffer;
  39. audio.source.loop = loop;
  40. let a = this.audioContext.createGain();
  41. if (loop)a.gain.value = .7;
  42. else a.gain.value = 1;
  43. audio.source.connect(a);
  44. a.connect(this.audioContext.destination);
  45. audio.source.start(0);
  46. } catch (t) {
  47. console.log(t)
  48. }
  49. else
  50. console.log(name)
  51. }
  52. initSound(buf,name){
  53. let self=this;
  54. try {
  55. this.audioContext.decodeAudioData(buf, function(t) {
  56. self.audioBuffers[name] = {
  57. name: name,
  58. buffer: t,
  59. source: null
  60. }
  61. }, function(t) {
  62. console.log("Error decoding file:" + name)
  63. })
  64. }
  65. catch (e){
  66. console.log(e)
  67. }
  68. }
  69. loadAudioFile(url, name){
  70. var request = new XMLHttpRequest;
  71. request.open("GET", url, true);
  72. request.responseType = "arraybuffer";
  73. var self = this;
  74. request.onload = function(t) {
  75. self.initSound(request.response, name)
  76. };
  77. request.send();
  78. }
  79. loadAllAudioFile(){
  80. if (!this.isLoadAudioFile) {
  81. this.isLoadAudioFile = true;
  82. let preAudios=[
  83. "sound/normal_click.mp3"
  84. ]
  85. let preNames=[
  86. "button_click"
  87. ]
  88. for (let i = 0; i < preAudios.length; i++) {
  89. let path=preAudios[i];
  90. let name=preNames[i];
  91. if (this.baseUrl==="@assets/")path=defaultAudio[name];
  92. else path=this.baseUrl+path;
  93. if (path==null)return;
  94. this.loadAudioFile(path,name);
  95. }
  96. }
  97. }
  98. }
  99. const SoundHelp=new SoundManger();
  100. export default SoundHelp;