audio.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import { useAudio } from "@/hooks/useAudio";
  2. import { unref } from "vue";
  3. const resourceURL = process.env.VUE_APP_RESOURCE_URL;
  4. export default {
  5. namespaced: true,
  6. state() {
  7. return {
  8. normalBGM: {
  9. url: "",
  10. isAuto: false,
  11. type: 0,
  12. order: 0,
  13. repeat: true,
  14. }, // 一般背景音乐
  15. // appBGM: {
  16. // url: "",
  17. // isAuto: false,
  18. // order: 0
  19. // }, // 一般背景音乐
  20. v3BGM: {
  21. url: "",
  22. isAuto: false,
  23. type: 1,
  24. order: 9,
  25. repeat: false,
  26. isExist: false,
  27. isPlayIng: false,
  28. }, // v3背景音乐
  29. v4BGM: {
  30. url: "",
  31. type: 2,
  32. isAuto: false,
  33. order: 10,
  34. repeat: false,
  35. }, // v4背景音乐
  36. explanationBGM: {
  37. url: "",
  38. type: 3,
  39. isAuto: false,
  40. order: 11,
  41. repeat: false,
  42. }, //解说音乐
  43. currentPlaying: false,
  44. pauseByControl: false,
  45. };
  46. },
  47. getters: {
  48. bgmList: (state) => [
  49. state.normalBGM,
  50. state.v3BGM,
  51. state.v4BGM,
  52. state.explanationBGM,
  53. ],
  54. currentAudio: (_, getters) => {
  55. const arr = Array.from(getters.bgmList)
  56. .filter((i) => i.url && i.type !== 1)
  57. .sort((a, b) => b.order - a.order);
  58. return arr.length > 0 ? arr[0] : false;
  59. },
  60. currentPlayer: () => {
  61. const { currentPlayer } = useAudio();
  62. return unref(currentPlayer);
  63. },
  64. isCurrentPlaying: (state) => state.currentPlaying,
  65. isHasNormalBGM: (state) => {
  66. return state.normalBGM.url && state.normalBGM.url.length > 0;
  67. },
  68. isHasV3BGM: (state) => {
  69. return state.v3BGM.isExist;
  70. },
  71. isHasV4BGM: (state) => {
  72. return state.v4BGM.url.length > 0;
  73. },
  74. isHasExplanationBGM: (state) => {
  75. return state.explanationBGM.url.length > 0;
  76. },
  77. isPlayNormalBGM: (_, getters) => {
  78. return getters.currentAudio.type === 0;
  79. },
  80. isPlayV3BGM: (state) => {
  81. return state.v3BGM.isPlayIng;
  82. },
  83. isPlayV4BGM: (_, getters) => {
  84. return getters.currentAudio.type === 2;
  85. },
  86. isPlayExplanationBGM: (_, getters) => {
  87. return getters.currentAudio.type === 3;
  88. },
  89. isPauseByControl: (state) => {
  90. return state.pauseByControl;
  91. },
  92. },
  93. mutations: {
  94. setNormalBGM(state, payload) {
  95. state.normalBGM.url = payload.url;
  96. state.normalBGM.isAuto = payload.isAuto;
  97. },
  98. setExplanationBGM(state, payload) {
  99. state.explanationBGM.url = payload.url;
  100. state.explanationBGM.isAuto = payload.isAuto;
  101. state.explanationBGM.repeat = payload.repeat;
  102. },
  103. setV3BGM(state, payload) {
  104. state.v3BGM.isExist = payload;
  105. },
  106. setV3BGMPlaying(state, payload) {
  107. state.v3BGM.isPlayIng = payload;
  108. },
  109. setV4BGM(state, payload) {
  110. state.v4BGM.url = payload.url;
  111. state.v4BGM.isAuto = payload.isAuto;
  112. state.v4BGM.repeat = payload.repeat;
  113. },
  114. setPlayStatus(state, payload) {
  115. state.currentPlaying = payload;
  116. },
  117. },
  118. actions: {
  119. initNormalBGM({ commit }, url) {
  120. // 一般背景音乐
  121. commit("setNormalBGM", {
  122. isAuto: true,
  123. url: url,
  124. });
  125. },
  126. initExplanationBGM({ commit }, { url, repeat, isAuto }) {
  127. commit("setExplanationBGM", { url, repeat, isAuto });
  128. },
  129. initV3BGM({ commit, dispatch }, status) {
  130. // V3音乐
  131. commit("setV3BGM", status);
  132. if (status) {
  133. dispatch("pauseBGM");
  134. }
  135. },
  136. initV4BGM({ commit }, url) {
  137. // v4音乐
  138. let newURL = "";
  139. if (url) {
  140. if (!/^https?:\/\//.test(url)) {
  141. newURL = resourceURL + url;
  142. } else {
  143. newURL = url;
  144. }
  145. }
  146. commit("setV4BGM", { url: newURL, repeat: true, isAuto: true });
  147. },
  148. playBGM({ commit, getters, state, dispatch }, type) {
  149. console.warn("~~playBGM~~", type);
  150. // debugger;
  151. const index = getters["currentAudio"].order;
  152. const order = index + 1;
  153. const target = getters["bgmList"].find((i) => i.type === type);
  154. state.pauseByControl = false;
  155. if (target.url.length > 0) {
  156. switch (type) {
  157. case 0:
  158. state.normalBGM.order = order;
  159. break;
  160. case 2:
  161. state.v4BGM.order = order;
  162. break;
  163. case 3:
  164. state.explanationBGM.order = order;
  165. break;
  166. default:
  167. state.normalBGM.order = order;
  168. break;
  169. }
  170. } else {
  171. console.error("当前BGM没有URL", target);
  172. if (type === 2) {
  173. //fallback
  174. dispatch("playBGM", 0);
  175. }
  176. }
  177. },
  178. pauseBGM({ commit, getters, state, dispatch }, from) {
  179. const { currentPlayer } = useAudio();
  180. if (unref(currentPlayer)) {
  181. currentPlayer.value.pause();
  182. }
  183. if (from === 0) {
  184. state.pauseByControl = true;
  185. }
  186. },
  187. resumeBGM() {
  188. const { currentPlayer } = useAudio();
  189. if (unref(currentPlayer)) {
  190. const hasURl =
  191. currentPlayer.value._src && currentPlayer.value._src.length > 0;
  192. console.log("resumeBGM", hasURl);
  193. hasURl && currentPlayer.value.resume();
  194. }
  195. },
  196. updatePlayerStatus({ commit }, status) {
  197. commit("setPlayStatus", status);
  198. },
  199. updateV3BGMStatus({ commit }, status) {
  200. commit("setV3BGMPlaying", status);
  201. },
  202. destroy() {
  203. const { currentPlayer } = useAudio();
  204. if (unref(currentPlayer)) {
  205. currentPlayer.value.destroy();
  206. }
  207. },
  208. setLock({ commit }, status) {
  209. const { currentPlayer } = useAudio();
  210. if (unref(currentPlayer)) {
  211. status ? currentPlayer.value.lock() : currentPlayer.value.unlock();
  212. }
  213. },
  214. setMuteBGM({ commit }, status) {
  215. const { currentPlayer } = useAudio();
  216. if (unref(currentPlayer)) {
  217. status ? currentPlayer.value.mute() : currentPlayer.value.unmute();
  218. }
  219. },
  220. },
  221. };