import { IconMusic } from "@/assets/icons"; import { isWeixinBrowser } from "@/controllers/wxController"; import { useEditor } from "@/modules/editor"; import { PauseCircleOutlined, PlayCircleOutlined, SoundOutlined, } from "@ant-design/icons-vue"; import { css } from "@linaria/core"; import { Button, Dropdown, Slider } from "ant-design-vue"; import { Howl } from "howler"; import { nanoid } from "nanoid"; import { isPc } from "@queenjs/utils"; import { defineComponent, reactive, ref, watch, onUnmounted, onMounted, } from "vue"; import { bool, number } from "vue-types"; import { MusicOptions } from "./localMusic"; declare const WeixinJSBridge: any; export const PageMusic = defineComponent({ setup() { const { store, helper, controls, actions } = useEditor(); const rootComp = helper.findRootComp(); const volume = rootComp?.value.volume != undefined ? rootComp?.value.volume : 0.3; const state = reactive({ playStatus: false, duration: 0, currentTime: 0, muted: true, volume: volume, }); let audioKey = nanoid(); let audioBgm = ref(); const initAudioBgm = () => { audioBgm.value = null; const curAudio = MusicOptions.find((e) => { return e.value == rootComp?.value.music; }); const src = curAudio?.src || ""; audioBgm.value = new Howl({ src: [src], loop: store.isEditMode ? false : true, preload: true, HTML5: true, volume: volume, }); controls.mediaCtrl.setMediasInstance(audioKey, audioBgm.value); audioBgm.value.on("load", () => { state.duration = audioBgm.value.duration(); if (!store.isEditMode) { if (isWeixinBrowser()) { WeixinJSBridge.invoke( "getNetworkType", {}, () => { playAudio(true); }, false ); } else { playAudio(true); } } }); audioBgm.value.on("loaderror", () => { console.log("音频加载失败"); }); audioBgm.value.on("playerror", () => { console.log("音频播放失败"); }); audioBgm.value.on("play", () => { controls.mediaCtrl.pauseOtherMedia(audioKey); if (!state.playStatus) { state.playStatus = true; } playStep(); }); audioBgm.value.on("pause", () => { audioRest(); }); audioBgm.value.on("end", () => { if (store.isEditMode) { audioRest(); } }); setTimeout(() => { checkAutoPlay(); }, 500); }; const checkAutoPlay = () => { const duration = audioBgm.value.duration(); if (duration) { state.duration = duration; } if (!audioBgm.value || store.isEditMode) { return; } let playing = audioBgm.value.playing(); if (!playing) { playAudio(true); } }; const playStep = () => { if (!audioBgm.value) { return; } let playing = audioBgm.value.playing(); if (!playing) { return; } let seek = audioBgm.value.seek(); state.currentTime = seek; requestAnimationFrame(playStep); }; const playAudio = async (status: boolean) => { if (!audioBgm.value) { return; } if (status) { audioBgm.value.play(); } else { audioRest(); } let playing = audioBgm.value.playing(); if (status && playing) { state.playStatus = true; return; } state.playStatus = false; }; watch( () => rootComp?.value.music, () => { audioRest(); initAudioBgm(); } ); onMounted(() => { initAudioBgm(); }); onUnmounted(() => { audioRest(); audioBgm.value = null; controls.mediaCtrl.removeMedia(audioKey); }); const seekChange = (v: number) => { state.currentTime = v; audioBgm.value && audioBgm.value.seek(v); }; const volumeChange = (v: number) => { state.volume = v; if (rootComp) { actions.updateCompData(rootComp, "value.volume", v); } audioBgm.value && audioBgm.value.volume(v); }; const audioRest = () => { if (!audioBgm.value) { return; } let playing = audioBgm.value.playing(); if (playing) { audioBgm.value.pause(); } state.playStatus = false; state.currentTime = 0; audioBgm.value.seek(0); }; return () => { const music = rootComp?.value.music; return (