|
@@ -22,41 +22,41 @@ import {
|
|
|
listenerMessage,
|
|
|
removeListenerMessage,
|
|
|
IPostMessage,
|
|
|
- CallBack
|
|
|
+ CallBack,
|
|
|
} from '/src/helpers/native-message'
|
|
|
import SettingState from '/src/pages/detail/setting-state'
|
|
|
import { getLeveByScore, getLeveByScoreMeasure } from './helper'
|
|
|
import styles from './index.module.less'
|
|
|
import { browser, getRequestHostname } from '/src/helpers/utils'
|
|
|
-import CheckDelayPopup from "../CheckDelayPopup";
|
|
|
-import Headphone, { HeadphoneData } from "../Headphone";
|
|
|
-import PhoneTip from "../PhoneTip";
|
|
|
+import CheckDelayPopup from '../CheckDelayPopup'
|
|
|
+import Headphone, { HeadphoneData } from '../Headphone'
|
|
|
+import PhoneTip from '../PhoneTip'
|
|
|
|
|
|
const browserInfo = browser()
|
|
|
|
|
|
/** 初始化评测音频 */
|
|
|
export const evaluatCreateMusicPlayer = () => {
|
|
|
- return new Promise((resolve) => {
|
|
|
- // 初始化曲谱音频 和效音音频
|
|
|
- postMessage(
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ // 初始化曲谱音频 和效音音频
|
|
|
+ postMessage(
|
|
|
{
|
|
|
- api: "createMusicPlayer",
|
|
|
+ api: 'createMusicPlayer',
|
|
|
content: {
|
|
|
musicSrc: runtime.songs.background || runtime.songs.music, // 曲谱音频url
|
|
|
- tuneSrc: "https://oss.dayaedu.com/cloud-coach/1686725501654check_music1_(1).mp3", //效音音频url
|
|
|
+ tuneSrc: 'https://oss.dayaedu.com/cloud-coach/1686725501654check_music1_(1).mp3', //效音音频url
|
|
|
},
|
|
|
},
|
|
|
() => {
|
|
|
if (browserInfo.ios) {
|
|
|
- resolve(true);
|
|
|
+ resolve(true)
|
|
|
}
|
|
|
}
|
|
|
- );
|
|
|
- // 安卓不需要
|
|
|
- if(!browserInfo.ios){
|
|
|
- resolve(true)
|
|
|
- }
|
|
|
- })
|
|
|
+ )
|
|
|
+ // 安卓不需要
|
|
|
+ if (!browserInfo.ios) {
|
|
|
+ resolve(true)
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
let player: any = null
|
|
@@ -74,17 +74,13 @@ const getMusicMode = (): RuntimeUtils.IMode => {
|
|
|
const tongguan = [12, 13, 14, 15, 17]
|
|
|
if (
|
|
|
muguan.includes(state.subjectId) &&
|
|
|
- (state.activeDetail?.examSongName || '').search(
|
|
|
- /[^\u0000-\u00FF](1-2|1-3|1-6)/gi
|
|
|
- ) > -1
|
|
|
+ (state.activeDetail?.examSongName || '').search(/[^\u0000-\u00FF](1-2|1-3|1-6)/gi) > -1
|
|
|
) {
|
|
|
return 'music'
|
|
|
}
|
|
|
if (
|
|
|
tongguan.includes(state.subjectId) &&
|
|
|
- (state.activeDetail?.examSongName || '').search(
|
|
|
- /[^\u0000-\u00FF](1-1-1|1-1-2|1-5|1-6)/gi
|
|
|
- ) > -1
|
|
|
+ (state.activeDetail?.examSongName || '').search(/[^\u0000-\u00FF](1-1-1|1-1-2|1-5|1-6)/gi) > -1
|
|
|
) {
|
|
|
return 'music'
|
|
|
}
|
|
@@ -103,21 +99,21 @@ export const resetPlayer = () => {
|
|
|
|
|
|
/** 监听评测弹窗是否隐藏保存演奏按钮 */
|
|
|
const hideComplexButton = (callback: CallBack, listen?: boolean) => {
|
|
|
- if (listen) {
|
|
|
- listenerMessage("hideComplexButton", callback);
|
|
|
- } else {
|
|
|
- removeListenerMessage("hideComplexButton", callback);
|
|
|
- }
|
|
|
-};
|
|
|
+ if (listen) {
|
|
|
+ listenerMessage('hideComplexButton', callback)
|
|
|
+ } else {
|
|
|
+ removeListenerMessage('hideComplexButton', callback)
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
// 隐藏存演奏按钮
|
|
|
const handleComplexButton = (res?: IPostMessage) => {
|
|
|
- console.log('监听是否隐藏上传云端按钮', res)
|
|
|
- if (res?.content) {
|
|
|
- const { header, body } = res.content;
|
|
|
- detailState.isHideEvaluatReportSaveBtn = true
|
|
|
- }
|
|
|
-};
|
|
|
+ console.log('监听是否隐藏上传云端按钮', res)
|
|
|
+ if (res?.content) {
|
|
|
+ const { header, body } = res.content
|
|
|
+ detailState.isHideEvaluatReportSaveBtn = true
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'evaluating',
|
|
@@ -144,22 +140,22 @@ export default defineComponent({
|
|
|
shareLoadedPngData: null as null | string,
|
|
|
isSaveVideo: SettingState.sett.camera && SettingState.eva.save,
|
|
|
tuningStatus: false,
|
|
|
- /** 延迟数据 */
|
|
|
- delayData: {
|
|
|
- /** 是否强制检测 */
|
|
|
- isForce: true,
|
|
|
- /** 弹窗 */
|
|
|
- open: false,
|
|
|
- /** 延迟次数 */
|
|
|
- count: 0,
|
|
|
- /** 延迟时间 */
|
|
|
- time: 0,
|
|
|
- /** 耳机状态 */
|
|
|
- erji: false,
|
|
|
- /** 检测状态 */
|
|
|
- checkStatus: 'init' as 'init' | 'ing' | 'error',
|
|
|
+ /** 延迟数据 */
|
|
|
+ delayData: {
|
|
|
+ /** 是否强制检测 */
|
|
|
+ isForce: true,
|
|
|
+ /** 弹窗 */
|
|
|
+ open: false,
|
|
|
+ /** 延迟次数 */
|
|
|
+ count: 0,
|
|
|
+ /** 延迟时间 */
|
|
|
+ time: 0,
|
|
|
+ /** 耳机状态 */
|
|
|
+ erji: false,
|
|
|
+ /** 检测状态 */
|
|
|
+ checkStatus: 'init' as 'init' | 'ing' | 'error',
|
|
|
step: 1,
|
|
|
- },
|
|
|
+ },
|
|
|
}
|
|
|
},
|
|
|
computed: {
|
|
@@ -169,10 +165,7 @@ export default defineComponent({
|
|
|
},
|
|
|
methods: {
|
|
|
startPlay() {
|
|
|
- console.log(
|
|
|
- '连接服务成功,开始播放',
|
|
|
- new Date().getTime() - runtime.clickTime
|
|
|
- )
|
|
|
+ console.log('连接服务成功,开始播放', new Date().getTime() - runtime.clickTime)
|
|
|
synced = false
|
|
|
if (!SettingState.eva.mute) {
|
|
|
RuntimeUtils.changeAllMode()
|
|
@@ -241,9 +234,7 @@ export default defineComponent({
|
|
|
clientId: 'student',
|
|
|
speed: runtime.speed,
|
|
|
heardLevel: SettingState.eva.difficulty,
|
|
|
- beatLength: Math.round(
|
|
|
- (RuntimeUtils.getFixTime(state.times[0].beatSpeed) * 1000) / rate
|
|
|
- ),
|
|
|
+ beatLength: Math.round((RuntimeUtils.getFixTime(state.times[0].beatSpeed) * 1000) / rate),
|
|
|
}
|
|
|
const apiPath = getRequestHostname()
|
|
|
if (apiPath === '/api-student') {
|
|
@@ -463,12 +454,9 @@ export default defineComponent({
|
|
|
// const fixtime = 0
|
|
|
const start = item.sourceRelativeTime || item.relativeTime
|
|
|
const end = item.sourceRelaEndtime || item.relaEndtime
|
|
|
- const isStaccato = note.isStaccato
|
|
|
+ const isStaccato = note.isStaccato
|
|
|
const noteRate = isStaccato ? 0.5 : 1
|
|
|
- if (
|
|
|
- note.formatLyricsEntries.contains('Play') ||
|
|
|
- note.formatLyricsEntries.contains('Play...')
|
|
|
- ) {
|
|
|
+ if (note.formatLyricsEntries.contains('Play') || note.formatLyricsEntries.contains('Play...')) {
|
|
|
ListenMode = false
|
|
|
}
|
|
|
if (note.formatLyricsEntries.contains('Listen')) {
|
|
@@ -482,20 +470,10 @@ export default defineComponent({
|
|
|
}
|
|
|
const nextNote = state.times[index + 1]
|
|
|
// console.log("noteinfo", note.noteElement.isRestFlag && !!note.stave && !!nextNote)
|
|
|
- if (
|
|
|
- skip &&
|
|
|
- (note.stave ||
|
|
|
- !note.noteElement.isRestFlag ||
|
|
|
- (nextNote && !nextNote.noteElement.isRestFlag))
|
|
|
- ) {
|
|
|
+ if (skip && (note.stave || !note.noteElement.isRestFlag || (nextNote && !nextNote.noteElement.isRestFlag))) {
|
|
|
skip = false
|
|
|
}
|
|
|
- if (
|
|
|
- note.noteElement.isRestFlag &&
|
|
|
- !!note.stave &&
|
|
|
- !!nextNote &&
|
|
|
- nextNote.noteElement.isRestFlag
|
|
|
- ) {
|
|
|
+ if (note.noteElement.isRestFlag && !!note.stave && !!nextNote && nextNote.noteElement.isRestFlag) {
|
|
|
skip = true
|
|
|
}
|
|
|
// console.log(note.measureOpenIndex, item.measureOpenIndex, note)
|
|
@@ -678,79 +656,79 @@ export default defineComponent({
|
|
|
// }
|
|
|
// },
|
|
|
|
|
|
- sendResult(evt?: IPostMessage) {
|
|
|
- console.log("sendResult", evt);
|
|
|
- if (evt?.content) {
|
|
|
- const data = evt?.content?.body;
|
|
|
- if (evt?.content.header.commond === "overall") {
|
|
|
- detailState.isHideEvaluatReportSaveBtn = false;
|
|
|
- Toast.clear();
|
|
|
- this.res = data;
|
|
|
- this.endloading = false;
|
|
|
- RuntimeUtils.event.emit("onEvaluationResult", data);
|
|
|
- } else if (evt?.content.header.commond === "checkDone") {
|
|
|
- this.checkStatus = true;
|
|
|
- } else if (evt?.content.header.commond === "checking") {
|
|
|
- this.frequency = evt?.content?.body?.frequency;
|
|
|
- } else if (evt?.content.header.commond === "recordEnd") {
|
|
|
- if (this.delayData.checkStatus !== 'ing') return
|
|
|
- this.delayData.count++;
|
|
|
- if (this.delayData.count >= 2) {
|
|
|
- this.handleToggleTune('finishTune');
|
|
|
- return;
|
|
|
- }
|
|
|
- setTimeout(() => {
|
|
|
- this.startTune()
|
|
|
- }, 100)
|
|
|
- } else {
|
|
|
- const getBeforeNote = (index: number) => {
|
|
|
- while (index >= 0) {
|
|
|
- const item = state.times[index];
|
|
|
- if (item.stave) {
|
|
|
- return item;
|
|
|
- }
|
|
|
- index--;
|
|
|
- }
|
|
|
- };
|
|
|
- const setEvaluatings = (note: any, data: any, dontTransition = false) => {
|
|
|
- const startNote = getBoundingBoxByverticalNote(note);
|
|
|
- state.evaluatings = {
|
|
|
- ...state.evaluatings,
|
|
|
- [startNote.measureIndex]: {
|
|
|
- ...startNote,
|
|
|
- ...getLeveByScoreMeasure(data.score),
|
|
|
- score: data.score,
|
|
|
- dontTransition,
|
|
|
- },
|
|
|
- };
|
|
|
- };
|
|
|
+ sendResult(evt?: IPostMessage) {
|
|
|
+ console.log('sendResult', evt)
|
|
|
+ if (evt?.content) {
|
|
|
+ const data = evt?.content?.body
|
|
|
+ if (evt?.content.header.commond === 'overall') {
|
|
|
+ detailState.isHideEvaluatReportSaveBtn = false
|
|
|
+ Toast.clear()
|
|
|
+ this.res = data
|
|
|
+ this.endloading = false
|
|
|
+ RuntimeUtils.event.emit('onEvaluationResult', data)
|
|
|
+ } else if (evt?.content.header.commond === 'checkDone') {
|
|
|
+ this.checkStatus = true
|
|
|
+ } else if (evt?.content.header.commond === 'checking') {
|
|
|
+ this.frequency = evt?.content?.body?.frequency
|
|
|
+ } else if (evt?.content.header.commond === 'recordEnd') {
|
|
|
+ if (this.delayData.checkStatus !== 'ing') return
|
|
|
+ this.delayData.count++
|
|
|
+ if (this.delayData.count >= 2) {
|
|
|
+ this.handleToggleTune('finishTune')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ setTimeout(() => {
|
|
|
+ this.startTune()
|
|
|
+ }, 100)
|
|
|
+ } else {
|
|
|
+ const getBeforeNote = (index: number) => {
|
|
|
+ while (index >= 0) {
|
|
|
+ const item = state.times[index]
|
|
|
+ if (item.stave) {
|
|
|
+ return item
|
|
|
+ }
|
|
|
+ index--
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const setEvaluatings = (note: any, data: any, dontTransition = false) => {
|
|
|
+ const startNote = getBoundingBoxByverticalNote(note)
|
|
|
+ state.evaluatings = {
|
|
|
+ ...state.evaluatings,
|
|
|
+ [startNote.measureIndex]: {
|
|
|
+ ...startNote,
|
|
|
+ ...getLeveByScoreMeasure(data.score),
|
|
|
+ score: data.score,
|
|
|
+ dontTransition,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for (let index = 0; index < state.times.length; index++) {
|
|
|
- let time = state.times[index];
|
|
|
- if (data.measureRenderIndex == time.noteElement.sourceMeasure.measureListIndex) {
|
|
|
- if (!time.stave) {
|
|
|
- const ntime = getBeforeNote(index);
|
|
|
- // console.log('ntime', ntime)
|
|
|
- if (ntime) {
|
|
|
- time = ntime;
|
|
|
- }
|
|
|
- }
|
|
|
+ for (let index = 0; index < state.times.length; index++) {
|
|
|
+ let time = state.times[index]
|
|
|
+ if (data.measureRenderIndex == time.noteElement.sourceMeasure.measureListIndex) {
|
|
|
+ if (!time.stave) {
|
|
|
+ const ntime = getBeforeNote(index)
|
|
|
+ // console.log('ntime', ntime)
|
|
|
+ if (ntime) {
|
|
|
+ time = ntime
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (!time.noteElement.tie) {
|
|
|
- setEvaluatings(time, data);
|
|
|
- } else {
|
|
|
- for (const item of time.noteElement.tie.notes) {
|
|
|
- const note = getParentNote(item);
|
|
|
- if (!note) continue;
|
|
|
- setEvaluatings(note, data, item !== time.noteElement.tie.StartNote);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
+ if (!time.noteElement.tie) {
|
|
|
+ setEvaluatings(time, data)
|
|
|
+ } else {
|
|
|
+ for (const item of time.noteElement.tie.notes) {
|
|
|
+ const note = getParentNote(item)
|
|
|
+ if (!note) continue
|
|
|
+ setEvaluatings(note, data, item !== time.noteElement.tie.StartNote)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
setWiredStatus(res?: IPostMessage) {
|
|
|
this.erjiShow = !res?.content.checkIsWired
|
|
|
this.tuningStatus = true
|
|
@@ -771,8 +749,7 @@ export default defineComponent({
|
|
|
api: 'openWebView',
|
|
|
content: {
|
|
|
// url: location.origin + '/accompany/#/report/',
|
|
|
- url:
|
|
|
- location.origin + '/accompany/#/report/' + this.res?.recordId || '',
|
|
|
+ url: location.origin + '/accompany/#/report/' + this.res?.recordId || '',
|
|
|
orientation: 0,
|
|
|
isHideTitle: true, // 此处兼容安卓,意思为隐藏全部头部
|
|
|
statusBarTextColor: false,
|
|
@@ -843,7 +820,7 @@ export default defineComponent({
|
|
|
api: 'shareAchievements',
|
|
|
content: {
|
|
|
title: '分享我的乐器练习进度,一起见证我的成长!',
|
|
|
- desc: '晒一下我的评测分数,快来“云教练”上和我PK一下吧!',
|
|
|
+ desc: '晒一下我的评测分数,快来“云练习”上和我PK一下吧!',
|
|
|
image: this.shareLoadedPngData,
|
|
|
video: '',
|
|
|
type: 'image',
|
|
@@ -862,8 +839,7 @@ export default defineComponent({
|
|
|
getShareUrl() {
|
|
|
const data: any = {
|
|
|
name: appstate.user?.student?.username || '',
|
|
|
- subjectName:
|
|
|
- (appstate.user?.student?.subjectNames || '').split(',')[0] || '',
|
|
|
+ subjectName: (appstate.user?.student?.subjectNames || '').split(',')[0] || '',
|
|
|
avatar: encodeURIComponent(appstate.user?.student?.avatar || ''),
|
|
|
score: this.res?.score || 0,
|
|
|
examSongName: detailState.activeDetail?.examSongName || '',
|
|
@@ -882,149 +858,155 @@ export default defineComponent({
|
|
|
return ''
|
|
|
},
|
|
|
|
|
|
-
|
|
|
- /** 评测效验 */
|
|
|
- async checkEvaluating() {
|
|
|
- this.delayData.erji = await this.getWiredStatus();
|
|
|
- this.delayData.time = await this.getDeviceDelay();
|
|
|
- // 没有设备延迟数据,显示检测组件,并持续检测耳机状态
|
|
|
- if (!this.delayData.time || this.delayData.isForce) {
|
|
|
- this.delayData.open = runtime.delayCheckFirst && this.$route.query.evaluatingRecord ? false : true
|
|
|
- this.delayData.count = 0;
|
|
|
- if (runtime.delayCheckFirst && this.$route.query.evaluatingRecord) {
|
|
|
- this.closeErji()
|
|
|
- }
|
|
|
- return;
|
|
|
- }
|
|
|
- this.handleCheckDelayEnd()
|
|
|
- },
|
|
|
+ /** 评测效验 */
|
|
|
+ async checkEvaluating() {
|
|
|
+ this.delayData.erji = await this.getWiredStatus()
|
|
|
+ this.delayData.time = await this.getDeviceDelay()
|
|
|
+ // 没有设备延迟数据,显示检测组件,并持续检测耳机状态
|
|
|
+ if (!this.delayData.time || this.delayData.isForce) {
|
|
|
+ this.delayData.open = runtime.delayCheckFirst && this.$route.query.evaluatingRecord ? false : true
|
|
|
+ this.delayData.count = 0
|
|
|
+ if (runtime.delayCheckFirst && this.$route.query.evaluatingRecord) {
|
|
|
+ this.closeErji()
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.handleCheckDelayEnd()
|
|
|
+ },
|
|
|
/** 获取设备延迟 */
|
|
|
- getDeviceDelay(): Promise<number> {
|
|
|
- return new Promise((resolve) => {
|
|
|
- const timer = setTimeout(() => {
|
|
|
- resolve(0);
|
|
|
- }, 1000)
|
|
|
- postMessage({
|
|
|
- api: "getDeviceDelay",
|
|
|
- }, (res) => {
|
|
|
- const delay = res?.content?.value > 0 ? res?.content?.value : 0;
|
|
|
- clearTimeout(timer)
|
|
|
- resolve(delay);
|
|
|
- });
|
|
|
- });
|
|
|
- },
|
|
|
- /** 获取耳机状态 */
|
|
|
- getWiredStatus(): Promise<boolean> {
|
|
|
- return new Promise((resolve) => {
|
|
|
- const timer = setTimeout(() => {
|
|
|
- resolve(false);
|
|
|
- }, 1000)
|
|
|
- postMessage({
|
|
|
- api: "isWiredHeadsetOn",
|
|
|
- }, (res) => {
|
|
|
- const checkIsWired = res?.content?.checkIsWired ? true : false;
|
|
|
- if (checkIsWired) {
|
|
|
- if (this.delayData.step <= 5) {
|
|
|
- this.delayData.step = 3
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (this.delayData.step === 2 || this.delayData.step === 3) {
|
|
|
- this.delayData.step = 4
|
|
|
+ getDeviceDelay(): Promise<number> {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ const timer = setTimeout(() => {
|
|
|
+ resolve(0)
|
|
|
+ }, 1000)
|
|
|
+ postMessage(
|
|
|
+ {
|
|
|
+ api: 'getDeviceDelay',
|
|
|
+ },
|
|
|
+ (res) => {
|
|
|
+ const delay = res?.content?.value > 0 ? res?.content?.value : 0
|
|
|
+ clearTimeout(timer)
|
|
|
+ resolve(delay)
|
|
|
+ }
|
|
|
+ )
|
|
|
+ })
|
|
|
+ },
|
|
|
+ /** 获取耳机状态 */
|
|
|
+ getWiredStatus(): Promise<boolean> {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ const timer = setTimeout(() => {
|
|
|
+ resolve(false)
|
|
|
+ }, 1000)
|
|
|
+ postMessage(
|
|
|
+ {
|
|
|
+ api: 'isWiredHeadsetOn',
|
|
|
+ },
|
|
|
+ (res) => {
|
|
|
+ const checkIsWired = res?.content?.checkIsWired ? true : false
|
|
|
+ if (checkIsWired) {
|
|
|
+ if (this.delayData.step <= 5) {
|
|
|
+ this.delayData.step = 3
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (this.delayData.step === 2 || this.delayData.step === 3) {
|
|
|
+ this.delayData.step = 4
|
|
|
+ }
|
|
|
}
|
|
|
+ clearTimeout(timer)
|
|
|
+ resolve(checkIsWired)
|
|
|
}
|
|
|
- clearTimeout(timer)
|
|
|
- resolve(checkIsWired);
|
|
|
- });
|
|
|
- });
|
|
|
- },
|
|
|
- /** 持续检测耳机状态 */
|
|
|
+ )
|
|
|
+ })
|
|
|
+ },
|
|
|
+ /** 持续检测耳机状态 */
|
|
|
checkWiredStatus() {
|
|
|
- console.log('耳机状态',this.delayData.checkStatus)
|
|
|
- // 设备检测结束,停止获取耳机状态
|
|
|
- if (this.delayData.checkStatus !== 'ing' || this.delayData.open === false) {
|
|
|
- return
|
|
|
- }
|
|
|
- setTimeout(async () => {
|
|
|
- this.delayData.erji = await this.getWiredStatus();
|
|
|
- if (this.delayData.erji) {
|
|
|
- this.delayData.count = 0;
|
|
|
- this.delayData.time = 0;
|
|
|
- this.delayData.checkStatus = 'error'
|
|
|
- }
|
|
|
- this.checkWiredStatus();
|
|
|
- }, 1000)
|
|
|
- },
|
|
|
- /** 开始效音 */
|
|
|
- startTune() {
|
|
|
- // 带了耳机,停止播放效音
|
|
|
- if (this.delayData.erji) return;
|
|
|
- this.handleToggleTune('start')
|
|
|
- setTimeout(() => {
|
|
|
- this.handleToggleTune('stop')
|
|
|
- }, 1500)
|
|
|
- },
|
|
|
- /** 设备延迟检测结束 */
|
|
|
- handleCheckDelayEnd() {
|
|
|
- if (this.delayData.erji) {
|
|
|
- this.closeErji();
|
|
|
- } else {
|
|
|
- this.erjiShow = true;
|
|
|
- HeadphoneData.toggle();
|
|
|
- }
|
|
|
- },
|
|
|
- /** 切换效音 */
|
|
|
- handleToggleTune(state: 'start' | 'stop' | 'finishTune'){
|
|
|
- if (state === 'start') {
|
|
|
+ console.log('耳机状态', this.delayData.checkStatus)
|
|
|
+ // 设备检测结束,停止获取耳机状态
|
|
|
+ if (this.delayData.checkStatus !== 'ing' || this.delayData.open === false) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ setTimeout(async () => {
|
|
|
+ this.delayData.erji = await this.getWiredStatus()
|
|
|
+ if (this.delayData.erji) {
|
|
|
+ this.delayData.count = 0
|
|
|
+ this.delayData.time = 0
|
|
|
+ this.delayData.checkStatus = 'error'
|
|
|
+ }
|
|
|
+ this.checkWiredStatus()
|
|
|
+ }, 1000)
|
|
|
+ },
|
|
|
+ /** 开始效音 */
|
|
|
+ startTune() {
|
|
|
+ // 带了耳机,停止播放效音
|
|
|
+ if (this.delayData.erji) return
|
|
|
+ this.handleToggleTune('start')
|
|
|
+ setTimeout(() => {
|
|
|
+ this.handleToggleTune('stop')
|
|
|
+ }, 1500)
|
|
|
+ },
|
|
|
+ /** 设备延迟检测结束 */
|
|
|
+ handleCheckDelayEnd() {
|
|
|
+ if (this.delayData.erji) {
|
|
|
+ this.closeErji()
|
|
|
+ } else {
|
|
|
+ this.erjiShow = true
|
|
|
+ HeadphoneData.toggle()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /** 切换效音 */
|
|
|
+ handleToggleTune(state: 'start' | 'stop' | 'finishTune') {
|
|
|
+ if (state === 'start') {
|
|
|
this.delayData.step = 5
|
|
|
- // 开始效音
|
|
|
- postMessage({
|
|
|
- api: "startTune",
|
|
|
- content: {
|
|
|
- count: this.delayData.count + '',
|
|
|
- }
|
|
|
- })
|
|
|
- } else if (state === 'stop') {
|
|
|
- // 结束效音,触发时机: 1.监听后台效音返回 2.点击跳过效音或关闭效音
|
|
|
- postMessage({
|
|
|
- api: "endTune"
|
|
|
- })
|
|
|
- } else if (state === 'finishTune') {
|
|
|
+ // 开始效音
|
|
|
+ postMessage({
|
|
|
+ api: 'startTune',
|
|
|
+ content: {
|
|
|
+ count: this.delayData.count + '',
|
|
|
+ },
|
|
|
+ })
|
|
|
+ } else if (state === 'stop') {
|
|
|
+ // 结束效音,触发时机: 1.监听后台效音返回 2.点击跳过效音或关闭效音
|
|
|
+ postMessage({
|
|
|
+ api: 'endTune',
|
|
|
+ })
|
|
|
+ } else if (state === 'finishTune') {
|
|
|
this.delayData.step = 6
|
|
|
- // 效音完成
|
|
|
- postMessage({
|
|
|
- api: "finishTune",
|
|
|
- }, (res) => {
|
|
|
- const result = res?.content?.result //1成功 0失败
|
|
|
- // Toast('检测延迟完成')
|
|
|
- // setTimeout(() => {
|
|
|
- // this.delayData.open = false
|
|
|
- // }, 500)
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- },
|
|
|
- /** 停止设备延迟检测 */
|
|
|
- handleStopCheckDelay() {
|
|
|
- runtime.delayCheckFirst = true
|
|
|
- this.delayData.open = false
|
|
|
- this.delayData.checkStatus = 'init'
|
|
|
- this.handleToggleTune('stop')
|
|
|
- this.close();
|
|
|
- },
|
|
|
- /** 开始检测设备延迟 */
|
|
|
- async handleStartCheckDelay(){
|
|
|
- if (this.delayData.checkStatus === 'ing') return;
|
|
|
+ // 效音完成
|
|
|
+ postMessage(
|
|
|
+ {
|
|
|
+ api: 'finishTune',
|
|
|
+ },
|
|
|
+ (res) => {
|
|
|
+ const result = res?.content?.result //1成功 0失败
|
|
|
+ // Toast('检测延迟完成')
|
|
|
+ // setTimeout(() => {
|
|
|
+ // this.delayData.open = false
|
|
|
+ // }, 500)
|
|
|
+ }
|
|
|
+ )
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /** 停止设备延迟检测 */
|
|
|
+ handleStopCheckDelay() {
|
|
|
+ runtime.delayCheckFirst = true
|
|
|
+ this.delayData.open = false
|
|
|
+ this.delayData.checkStatus = 'init'
|
|
|
+ this.handleToggleTune('stop')
|
|
|
+ this.close()
|
|
|
+ },
|
|
|
+ /** 开始检测设备延迟 */
|
|
|
+ async handleStartCheckDelay() {
|
|
|
+ if (this.delayData.checkStatus === 'ing') return
|
|
|
this.delayData.step = 2
|
|
|
- this.delayData.erji = await this.getWiredStatus();
|
|
|
- if (this.delayData.erji) {
|
|
|
- this.delayData.checkStatus = 'error'
|
|
|
- return;
|
|
|
- }
|
|
|
- this.delayData.checkStatus = 'ing';
|
|
|
- this.startTune();
|
|
|
- this.checkWiredStatus();
|
|
|
- },
|
|
|
-
|
|
|
+ this.delayData.erji = await this.getWiredStatus()
|
|
|
+ if (this.delayData.erji) {
|
|
|
+ this.delayData.checkStatus = 'error'
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.delayData.checkStatus = 'ing'
|
|
|
+ this.startTune()
|
|
|
+ this.checkWiredStatus()
|
|
|
+ },
|
|
|
},
|
|
|
mounted() {
|
|
|
if (!SettingState.eva.mute) {
|
|
@@ -1040,22 +1022,14 @@ export default defineComponent({
|
|
|
listenerMessage('sendResult', this.sendResult)
|
|
|
listenerMessage('listenerWiredStatus', this.setWiredStatus)
|
|
|
listenerMessage('recordStartTime', (res) => {
|
|
|
- console.log(
|
|
|
- '监听时间',
|
|
|
- res?.content.inteveral,
|
|
|
- '系统时间',
|
|
|
- new Date().getTime()
|
|
|
- )
|
|
|
+ console.log('监听时间', res?.content.inteveral, '系统时间', new Date().getTime())
|
|
|
})
|
|
|
RuntimeUtils.event.on('stopTick', this.clearStartStatus)
|
|
|
RuntimeUtils.event.on('next-click', this.stop)
|
|
|
RuntimeUtils.event.on('ended', this.endevent)
|
|
|
RuntimeUtils.event.on('tickEnd', this.start)
|
|
|
// console.log('runtime.songs', runtime.songs)
|
|
|
- runtime.audiosInstance?.audios[this.playUrl]?.addEventListener(
|
|
|
- 'play',
|
|
|
- this.timeupdate
|
|
|
- )
|
|
|
+ runtime.audiosInstance?.audios[this.playUrl]?.addEventListener('play', this.timeupdate)
|
|
|
runtime.evaluatingTips = true
|
|
|
postMessage(
|
|
|
{
|
|
@@ -1063,9 +1037,9 @@ export default defineComponent({
|
|
|
},
|
|
|
this.setWiredStatus
|
|
|
)
|
|
|
- hideComplexButton(handleComplexButton, true);
|
|
|
+ hideComplexButton(handleComplexButton, true)
|
|
|
// 开始效验
|
|
|
- this.checkEvaluating()
|
|
|
+ this.checkEvaluating()
|
|
|
},
|
|
|
unmounted() {
|
|
|
state.mode = this.oldMode
|
|
@@ -1076,10 +1050,7 @@ export default defineComponent({
|
|
|
RuntimeUtils.event.off('next-click', this.stop)
|
|
|
RuntimeUtils.event.off('ended', this.endevent)
|
|
|
RuntimeUtils.event.off('tickEnd', this.start)
|
|
|
- runtime.audiosInstance?.audios[this.playUrl]?.removeEventListener(
|
|
|
- 'play',
|
|
|
- this.timeupdate
|
|
|
- )
|
|
|
+ runtime.audiosInstance?.audios[this.playUrl]?.removeEventListener('play', this.timeupdate)
|
|
|
runtime.evaluatingTips = false
|
|
|
state.evaluatings = {}
|
|
|
},
|
|
@@ -1087,17 +1058,9 @@ export default defineComponent({
|
|
|
const data = getLeveByScore(this.res?.score)
|
|
|
return (
|
|
|
<div class={styles.button}>
|
|
|
- {!(this.endloading || this.startloading) &&
|
|
|
- !this.res &&
|
|
|
- this.erjiClicked ? (
|
|
|
+ {!(this.endloading || this.startloading) && !this.res && this.erjiClicked ? (
|
|
|
this.evaluating && !state.isPauseRecording ? (
|
|
|
- <Button
|
|
|
- key="end"
|
|
|
- color="#01c1b5"
|
|
|
- round
|
|
|
- onClick={this.stop}
|
|
|
- icon="success"
|
|
|
- >
|
|
|
+ <Button key="end" color="#01c1b5" round onClick={this.stop} icon="success">
|
|
|
结束演奏
|
|
|
</Button>
|
|
|
) : state.activeTick === -1 ? (
|
|
@@ -1109,10 +1072,7 @@ export default defineComponent({
|
|
|
{/* {this.erjiClicked && SettingState.sett.tuning && state.subjectId !== 23 ? (
|
|
|
<TuningPopup checkStatus={this.checkStatus} trend={this.trend}/>
|
|
|
) : null} */}
|
|
|
- {this.erjiClicked &&
|
|
|
- SettingState.sett.tuning &&
|
|
|
- !detailState.isPercussion &&
|
|
|
- this.tuningStatus ? (
|
|
|
+ {this.erjiClicked && SettingState.sett.tuning && !detailState.isPercussion && this.tuningStatus ? (
|
|
|
<TuningPopup
|
|
|
checkStatus={this.checkStatus}
|
|
|
frequency={this.frequency}
|
|
@@ -1129,25 +1089,13 @@ export default defineComponent({
|
|
|
<div class={styles.title}>提示</div>
|
|
|
<div class={styles.content}>
|
|
|
<div class={styles.detail} style={{ flexDirection: 'column' }}>
|
|
|
- <p class={styles.tips}>
|
|
|
- 评测{this.isSaveVideo ? '音视频' : '音频'}是否上传到云端?
|
|
|
- </p>
|
|
|
+ <p class={styles.tips}>评测{this.isSaveVideo ? '音视频' : '音频'}是否上传到云端?</p>
|
|
|
</div>
|
|
|
<div class={styles.ctrls}>
|
|
|
- <Button
|
|
|
- color="#F0F0F0"
|
|
|
- round
|
|
|
- onClick={() => (this.alertStatus = false)}
|
|
|
- style={{ color: '#01c1b5' }}
|
|
|
- >
|
|
|
+ <Button color="#F0F0F0" round onClick={() => (this.alertStatus = false)} style={{ color: '#01c1b5' }}>
|
|
|
取消
|
|
|
</Button>
|
|
|
- <Button
|
|
|
- color="#01c1b5"
|
|
|
- round
|
|
|
- onClick={this.videoUpdate}
|
|
|
- style={{ marginLeft: '10px' }}
|
|
|
- >
|
|
|
+ <Button color="#01c1b5" round onClick={this.videoUpdate} style={{ marginLeft: '10px' }}>
|
|
|
确认
|
|
|
</Button>
|
|
|
</div>
|
|
@@ -1175,11 +1123,7 @@ export default defineComponent({
|
|
|
</div>
|
|
|
</div>
|
|
|
{this.shareStatus ? (
|
|
|
- <iframe
|
|
|
- class={styles.iframe}
|
|
|
- src={this.getShareUrl()}
|
|
|
- onLoad={this.shareLoaded}
|
|
|
- />
|
|
|
+ <iframe class={styles.iframe} src={this.getShareUrl()} onLoad={this.shareLoaded} />
|
|
|
) : null}
|
|
|
</Popup>
|
|
|
<Popup
|
|
@@ -1219,10 +1163,7 @@ export default defineComponent({
|
|
|
<div class={styles.content}>
|
|
|
{!detailState.isPercussion ? (
|
|
|
<div class={styles.leftContent}>
|
|
|
- <img
|
|
|
- src={data.img}
|
|
|
- style={{ margin: detailState.isPercussion ? 'auto' : '' }}
|
|
|
- />
|
|
|
+ <img src={data.img} style={{ margin: detailState.isPercussion ? 'auto' : '' }} />
|
|
|
<div>
|
|
|
<span>{this.res?.score}</span>分<br />
|
|
|
{data.mome}
|
|
@@ -1275,32 +1216,20 @@ export default defineComponent({
|
|
|
margin: detailState.isPercussion ? 'auto' : '',
|
|
|
}}
|
|
|
/>
|
|
|
- <div
|
|
|
- class={styles.progress}
|
|
|
- style={{ display: detailState.isPercussion ? 'none' : '' }}
|
|
|
- >
|
|
|
+ <div class={styles.progress} style={{ display: detailState.isPercussion ? 'none' : '' }}>
|
|
|
<div class={styles.progressitem}>
|
|
|
<span>音准</span>
|
|
|
- <Progress
|
|
|
- percentage={this.res?.intonation}
|
|
|
- color="linear-gradient(to right, #02E2DB, #01C1B5)"
|
|
|
- />
|
|
|
+ <Progress percentage={this.res?.intonation} color="linear-gradient(to right, #02E2DB, #01C1B5)" />
|
|
|
<span>{this.res?.intonation}</span>
|
|
|
</div>
|
|
|
<div class={styles.progressitem}>
|
|
|
<span>节奏</span>
|
|
|
- <Progress
|
|
|
- percentage={this.res?.cadence}
|
|
|
- color="linear-gradient(to right, #02E2DB, #01C1B5)"
|
|
|
- />
|
|
|
+ <Progress percentage={this.res?.cadence} color="linear-gradient(to right, #02E2DB, #01C1B5)" />
|
|
|
<span>{this.res?.cadence}</span>
|
|
|
</div>
|
|
|
<div class={styles.progressitem}>
|
|
|
<span>完成度</span>
|
|
|
- <Progress
|
|
|
- percentage={this.res?.integrity}
|
|
|
- color="linear-gradient(to right, #02E2DB, #01C1B5)"
|
|
|
- />
|
|
|
+ <Progress percentage={this.res?.integrity} color="linear-gradient(to right, #02E2DB, #01C1B5)" />
|
|
|
<span>{this.res?.integrity}</span>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -1315,20 +1244,10 @@ export default defineComponent({
|
|
|
<Button color="#01c1b5" round onClick={this.backDetail}>
|
|
|
去练习
|
|
|
</Button>
|
|
|
- <Button
|
|
|
- color="#F79300"
|
|
|
- style={{ marginLeft: '10px' }}
|
|
|
- round
|
|
|
- onClick={() => this.retest()}
|
|
|
- >
|
|
|
+ <Button color="#F79300" style={{ marginLeft: '10px' }} round onClick={() => this.retest()}>
|
|
|
再试一次
|
|
|
</Button>
|
|
|
- <Button
|
|
|
- color="#F7B500"
|
|
|
- style={{ marginLeft: '10px' }}
|
|
|
- round
|
|
|
- onClick={this.viewReport}
|
|
|
- >
|
|
|
+ <Button color="#F7B500" style={{ marginLeft: '10px' }} round onClick={this.viewReport}>
|
|
|
查看报告
|
|
|
</Button>
|
|
|
</div>
|
|
@@ -1337,25 +1256,24 @@ export default defineComponent({
|
|
|
) : null}
|
|
|
</Popup>
|
|
|
|
|
|
- {/* 延迟检测窗口 */}
|
|
|
- <Popup
|
|
|
- teleport="body"
|
|
|
- class="popup-scale"
|
|
|
- transition="van-scale"
|
|
|
- overlay={false}
|
|
|
- show={this.delayData.open}
|
|
|
- onClose={() => this.handleCheckDelayEnd()}
|
|
|
- >
|
|
|
- <CheckDelayPopup
|
|
|
- delayData={this.delayData}
|
|
|
- onStartCheckDelay={() => this.handleStartCheckDelay()}
|
|
|
- onClose={() => this.handleStopCheckDelay()}
|
|
|
- />
|
|
|
- </Popup>
|
|
|
+ {/* 延迟检测窗口 */}
|
|
|
+ <Popup
|
|
|
+ teleport="body"
|
|
|
+ class="popup-scale"
|
|
|
+ transition="van-scale"
|
|
|
+ overlay={false}
|
|
|
+ show={this.delayData.open}
|
|
|
+ onClose={() => this.handleCheckDelayEnd()}
|
|
|
+ >
|
|
|
+ <CheckDelayPopup
|
|
|
+ delayData={this.delayData}
|
|
|
+ onStartCheckDelay={() => this.handleStartCheckDelay()}
|
|
|
+ onClose={() => this.handleStopCheckDelay()}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
|
|
|
- {/* <Headphone onClose={this.closeErji} />
|
|
|
+ {/* <Headphone onClose={this.closeErji} />
|
|
|
<PhoneTip show={!this.delayData.erji && runtime.evaluatingTips} /> */}
|
|
|
-
|
|
|
</div>
|
|
|
)
|
|
|
},
|