Przeglądaj źródła

feat: 添加playProgress监听播放进度

TIANYONG 1 rok temu
rodzic
commit
ac967d6a1e

+ 23 - 0
src/pages/detail/runtime.ts

@@ -133,6 +133,11 @@ const state = reactive({
   partIndex: 0,
   /** 当前音符index */
   activeIndex: 0,
+  /** 音频播放结束钩子 */
+  playEndCallback: {
+    /** 结束评测 */
+    endEvaluat: () => {}
+  } as {[key: string]: () => void},  
   /** 阶段评测,延迟检测是否检测过 */
   delayCheckFirst: false,  
 })
@@ -971,6 +976,24 @@ export const setAudioInit = () => {
     refreshView()
     // })
   })
+  // 监听评测曲谱音频播放进度,返回
+  listenerMessage("playProgress", (res) => {
+    const time = res?.content.currentTime / 1000
+    requestAnimationFrame(async () => {
+      if (state.playState === 'play') {
+        state.currentTimeNum = time
+        refreshPlayer(time)
+        refreshIndex(time)
+        // 播放到最后一秒,停止播放
+        if (res?.content?.totalDuration > 1000 && res?.content?.currentTime >= res?.content?.totalDuration) {
+          state.playState = 'pause'
+          state.playEndCallback.endEvaluat()
+          ended(new Event('ended'))
+        }
+      }
+      refreshView()
+    })
+  });
   state.audiosInstance.event.on('timeupdate', () => {
     state.currentTimeNum = state.audiosInstance.currentTime
     state.currentTime = formatTime(state.audiosInstance.currentTime)

+ 20 - 5
src/subpages/colexiu/buttons/evaluating.tsx

@@ -330,6 +330,7 @@ const formatTimes = () => {
   }
   let measureIndex = -1
   let recordMeasure = -1
+  let firstNoteTime = times[0].time * 1000
   for (let index = 0; index < times.length; index++) {
     const item = times[index]
     const note = getNoteByMeasuresSlursStart(item)
@@ -385,16 +386,21 @@ const formatTimes = () => {
     // console.log('时间1111', data)
     datas.push(data)
   }
-  return datas
+  return {
+    datas,
+    firstNoteTime
+  }
 }
+const calculateInfo = formatTimes()
+
 const connect = async () => {
   const search = useOriginSearch()
   connentLoading.value = true
   const behaviorId = sessionStorage.getItem('behaviorId') || search.behaviorId || initBehaviorId
   const rate = runtime.speed / detailState.baseSpeed //1
-
   const content = {
-    musicXmlInfos: formatTimes(),
+    musicXmlInfos: calculateInfo.datas,
+    firstNoteTime: calculateInfo.firstNoteTime,
     subjectId: detailState.subjectId ? detailState.subjectId : detailState.isPercussion ? 1 : detailState.subjectId,
     detailId: detailState.activeDetail?.id,
     examSongId: search.id,
@@ -516,7 +522,7 @@ const setPlayer = async () => {
   })
   try {
     await connect()
-    startPlay()
+    //startPlay()
     setTimeout(() => {
       console.log('关闭弹窗')
       Toast.clear()
@@ -526,6 +532,7 @@ const setPlayer = async () => {
     runtime.evaluatingStatus = false
     Toast.clear()
   }
+  evaluatStart()
 }
 
 const togglePlay = () => {
@@ -645,13 +652,15 @@ const evaluatStart = () => {
     {
       api: 'startRecording',
       content: {
-        accompanimentState: SettingState.eva.mute ? 1 : 0
+        accompanimentState: SettingState.eva.mute ? 1 : 0,
+        firstNoteTime: calculateInfo.firstNoteTime,
       }
     },
     () => {
       // console.log('开始录音app回调时间', Date.now())
       backtime = Date.now()
       evaluating.value = true
+      runtime.playState = "play";
       if (detailState.activeDetail?.midiUrl) {
         console.log('midiUrl', detailState.activeDetail?.midiUrl)
         setTimeout(() => {
@@ -663,6 +672,11 @@ const evaluatStart = () => {
   RuntimeUtils.startCapture()
 }
 
+  /** 音频播放完结束评测 */
+  const playEnd_endEvalute = () => {
+    playerStop()
+  }
+
 /**
  * 酷乐秀活动接口,Url中有设置并且仅在学生端提评分交数据
  * 管乐团单元测验, url中有单元测验ID仅在学生端提评分交数据
@@ -869,6 +883,7 @@ export default defineComponent({
       listenerMessage('cloudTimeUpdae', onProgress)
       RuntimeUtils.event.on('tickDestroy', cloudMetronome)
       RuntimeUtils.event.on('tickEnd', evaluatStart)
+      runtime.playEndCallback.endEvaluat = playEnd_endEvalute
       hideComplexButton(handleComplexButton, true);
       // 开始效验
 		  checkEvaluating()