diff --git a/src/module/audio/player.ts b/src/module/audio/player.ts index b4a1149..4c56dc6 100644 --- a/src/module/audio/player.ts +++ b/src/module/audio/player.ts @@ -340,11 +340,25 @@ export class AudioRoute status: AudioStatus = AudioStatus.Stoped; /** 暂停时刻 */ private pauseTime: number = 0; + /** 暂停时播放了多长时间 */ + private pauseCurrentTime: number = 0; /** 音频时长,单位秒 */ get duration() { return this.source.duration; } + /** 当前播放了多长时间,单位秒 */ + get currentTime() { + if (this.status === AudioStatus.Paused) { + return this.pauseCurrentTime; + } else { + return this.source.currentTime; + } + } + set currentTime(time: number) { + this.source.stop(); + this.source.play(time); + } private shouldStop: boolean = false; /** @@ -430,6 +444,7 @@ export class AudioRoute ) { return; } + this.pauseCurrentTime = this.source.currentTime; const time = this.source.stop(); this.pauseTime = time; if (this.shouldStop) { diff --git a/src/module/audio/source.ts b/src/module/audio/source.ts index c417f3f..04f9622 100644 --- a/src/module/audio/source.ts +++ b/src/module/audio/source.ts @@ -24,6 +24,8 @@ export abstract class AudioSource /** 获取音频时长 */ abstract get duration(): number; + /** 获取当前音频播放了多长时间 */ + abstract get currentTime(): number; constructor(public readonly ac: AudioContext) { super(); @@ -81,7 +83,9 @@ export class AudioStreamSource extends AudioSource implements IStreamReader { /** 歌曲时长,加载完毕之前保持为 0 */ duration: number = 0; /** 当前已经播放了多长时间 */ - // readonly currentTime: number = -1; + get currentTime(): number { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ bufferPlayDuration: number = 1; /** 音频的采样率,未成功解析出之前保持为 0 */ @@ -92,6 +96,8 @@ export class AudioStreamSource extends AudioSource implements IStreamReader { private target?: IAudioInput; + /** 上一次播放是从何时开始的 */ + private lastStartWhen: number = 0; /** 开始播放时刻 */ private lastStartTime: number = 0; /** 上一次播放的缓存长度 */ @@ -492,8 +498,12 @@ export class AudioBufferSource extends AudioSource { private loop: boolean = false; duration: number = 0; - // readonly currentTime: number = -1; + get currentTime(): number { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + /** 上一次播放是从何时开始的 */ + private lastStartWhen: number = 0; /** 播放开始时刻 */ private lastStartTime: number = 0; private target?: IAudioInput;