diff --git a/src/renderer/utils/lyric-font-player/font-player.js b/src/renderer/utils/lyric-font-player/font-player.js index 1bd66c9d..0240d500 100644 --- a/src/renderer/utils/lyric-font-player/font-player.js +++ b/src/renderer/utils/lyric-font-player/font-player.js @@ -36,7 +36,7 @@ module.exports = class FontPlayer { this.curFontNum = 0 this.maxFontNum = 0 this._performanceTime = 0 - this._performanceOffsetTime = 0 + this._startTime = 0 this.fontContent = null @@ -141,12 +141,12 @@ module.exports = class FontPlayer { } _currentTime() { - return getNow() - this._performanceTime + this._performanceOffsetTime + return getNow() - this._performanceTime + this._startTime } - _findcurFontNum(curTime) { + _findcurFontNum(curTime, startIndex = 0) { const length = this.fonts.length - for (let index = 0; index < length; index++) if (curTime <= this.fonts[index].startTime) return index === 0 ? 0 : index - 1 + for (let index = startIndex; index < length; index++) if (curTime < this.fonts[index].startTime) return index == 0 ? 0 : index - 1 return length - 1 } @@ -195,9 +195,8 @@ module.exports = class FontPlayer { _refresh() { this.curFontNum++ // console.log('curFontNum time', this.fonts[this.curFontNum].time) - if (this.curFontNum === this.maxFontNum) return this._handlePlayMaxFontNum() + if (this.curFontNum >= this.maxFontNum) return this._handlePlayMaxFontNum() let curFont = this.fonts[this.curFontNum] - let nextFont = this.fonts[this.curFontNum + 1] // console.log(curFont, nextFont, this.curFontNum, this.maxFontNum) const currentTime = this._currentTime() // console.log(curFont.text) @@ -206,27 +205,38 @@ module.exports = class FontPlayer { // console.log(currentTime, driftTime) if (driftTime >= 0 || this.curFontNum == 0) { + let nextFont = this.fonts[this.curFontNum + 1] this.delay = nextFont.startTime - curFont.startTime - driftTime if (this.delay > 0) { + if (this.isPlay) { + this.timeoutTools.start(() => { + if (!this.isPlay) return + this._refresh() + }, this.delay) + } this._handlePlayFont(curFont, driftTime) - this.timeoutTools.start(() => { - if (!this.isPlay) return - this._refresh() - }, this.delay) + return + } else { + let newCurLineNum = this._findcurFontNum(currentTime, this.curFontNum + 1) + if (newCurLineNum > this.curFontNum) this.curFontNum = newCurLineNum - 1 + for (let i = 0; i <= this.curFontNum; i++) this._handlePlayFont(this.fonts[i], 0, true) + this._refresh() return } } else if (this.curFontNum == 0) { this.curFontNum-- - this.waitPlayTimeout.start(() => { - if (!this.isPlay) return - this._refresh() - }, -driftTime) + if (this.isPlay) { + this.waitPlayTimeout.start(() => { + if (!this.isPlay) return + this._refresh() + }, -driftTime) + } return } - this.curFontNum = this._findcurFontNum(currentTime) - for (let i = 0; i < this.curFontNum; i++) this._handlePlayFont(this.fonts[i], 0, true) - this.curFontNum-- + this.curFontNum = this._findcurFontNum(currentTime, this.curFontNum) - 1 + for (let i = 0; i <= this.curFontNum; i++) this._handlePlayFont(this.fonts[i], 0, true) + // this.curFontNum-- this._refresh() } @@ -237,14 +247,11 @@ module.exports = class FontPlayer { if (this.isLineMode) return this._handlePlayLine(true) this.isPlay = true - this._performanceTime = getNow() - curTime - this._performanceOffsetTime = 0 - if (this._performanceTime < 0) { - this._performanceOffsetTime = -this._performanceTime - this._performanceTime = 0 - } + this._performanceTime = getNow() + this._startTime = curTime this.curFontNum = this._findcurFontNum(curTime) + for (let i = this.curFontNum; i > -1; i--) { this._handlePlayFont(this.fonts[i], 0, true) } diff --git a/src/renderer/utils/lyric-font-player/index.js b/src/renderer/utils/lyric-font-player/index.js index bdb305d8..14d1e836 100644 --- a/src/renderer/utils/lyric-font-player/index.js +++ b/src/renderer/utils/lyric-font-player/index.js @@ -7,7 +7,7 @@ module.exports = class Lyric { constructor({ lyric = '', translationLyric = '', - offset = 150, + offset = 0, lineClassName = '', fontClassName = 'font', translationClassName = 'translation', @@ -166,5 +166,6 @@ module.exports = class Lyric { this.lyric = lyric this.translationLyric = translationLyric this._init() + this.linePlayer.offset = this.isLineMode ? this.offset + 150 : this.offset } } diff --git a/src/renderer/utils/lyric-font-player/line-player.js b/src/renderer/utils/lyric-font-player/line-player.js index dee608cd..49772cda 100644 --- a/src/renderer/utils/lyric-font-player/line-player.js +++ b/src/renderer/utils/lyric-font-player/line-player.js @@ -26,7 +26,7 @@ module.exports = class LinePlayer { this.offset = offset this.isOffseted = false this._performanceTime = 0 - this._performanceOffsetTime = 0 + this._startTime = 0 this._init() } @@ -93,12 +93,12 @@ module.exports = class LinePlayer { } _currentTime() { - return getNow() - this._performanceTime + this._performanceOffsetTime + return getNow() - this._performanceTime + this._startTime } - _findCurLineNum(curTime) { + _findCurLineNum(curTime, startIndex = 0) { const length = this.lines.length - for (let index = 0; index < length; index++) if (curTime <= this.lines[index].time) return index === 0 ? 0 : index - 1 + for (let index = startIndex; index < length; index++) if (curTime <= this.lines[index].time) return index === 0 ? 0 : index - 1 return length - 1 } @@ -110,30 +110,40 @@ module.exports = class LinePlayer { _refresh() { this.curLineNum++ // console.log('curLineNum time', this.lines[this.curLineNum].time) + if (this.curLineNum >= this.maxLine) return this._handleMaxLine() + let curLine = this.lines[this.curLineNum] - let nextLine = this.lines[this.curLineNum + 1] + const currentTime = this._currentTime() const driftTime = currentTime - curLine.time if (driftTime >= 0 || this.curLineNum === 0) { - if (this.curLineNum === this.maxLine) return this._handleMaxLine() + let nextLine = this.lines[this.curLineNum + 1] this.delay = nextLine.time - curLine.time - driftTime + if (this.delay > 0) { if (!this.isOffseted && this.delay >= this.offset) { - this._performanceOffsetTime += this.offset + this._startTime += this.offset this.delay -= this.offset this.isOffseted = true } - timeoutTools.start(() => { - if (!this.isPlay) return - this._refresh() - }, this.delay) + if (this.isPlay) { + timeoutTools.start(() => { + if (!this.isPlay) return + this._refresh() + }, this.delay) + } this.onPlay(this.curLineNum, curLine.text, currentTime) return + } else { + let newCurLineNum = this._findCurLineNum(currentTime, this.curLineNum + 1) + if (newCurLineNum > this.curLineNum) this.curLineNum = newCurLineNum - 1 + this._refresh() + return } } - this.curLineNum = this._findCurLineNum(currentTime) - 1 + this.curLineNum = this._findCurLineNum(currentTime, this.curLineNum) - 1 this._refresh() } @@ -142,12 +152,8 @@ module.exports = class LinePlayer { this.pause() this.isPlay = true - this._performanceOffsetTime = 0 - this._performanceTime = getNow() - curTime - if (this._performanceTime < 0) { - this._performanceOffsetTime = -this._performanceTime - this._performanceTime = 0 - } + this._performanceTime = getNow() + this._startTime = curTime this.curLineNum = this._findCurLineNum(curTime) - 1