feat: currentTime

This commit is contained in:
unanmed 2025-01-19 13:37:43 +08:00
parent d60252dca5
commit 3ec7681ecc
2 changed files with 27 additions and 2 deletions

View File

@ -340,11 +340,25 @@ export class AudioRoute
status: AudioStatus = AudioStatus.Stoped; status: AudioStatus = AudioStatus.Stoped;
/** 暂停时刻 */ /** 暂停时刻 */
private pauseTime: number = 0; private pauseTime: number = 0;
/** 暂停时播放了多长时间 */
private pauseCurrentTime: number = 0;
/** 音频时长,单位秒 */ /** 音频时长,单位秒 */
get duration() { get duration() {
return this.source.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; private shouldStop: boolean = false;
/** /**
@ -430,6 +444,7 @@ export class AudioRoute
) { ) {
return; return;
} }
this.pauseCurrentTime = this.source.currentTime;
const time = this.source.stop(); const time = this.source.stop();
this.pauseTime = time; this.pauseTime = time;
if (this.shouldStop) { if (this.shouldStop) {

View File

@ -24,6 +24,8 @@ export abstract class AudioSource
/** 获取音频时长 */ /** 获取音频时长 */
abstract get duration(): number; abstract get duration(): number;
/** 获取当前音频播放了多长时间 */
abstract get currentTime(): number;
constructor(public readonly ac: AudioContext) { constructor(public readonly ac: AudioContext) {
super(); super();
@ -81,7 +83,9 @@ export class AudioStreamSource extends AudioSource implements IStreamReader {
/** 歌曲时长,加载完毕之前保持为 0 */ /** 歌曲时长,加载完毕之前保持为 0 */
duration: number = 0; duration: number = 0;
/** 当前已经播放了多长时间 */ /** 当前已经播放了多长时间 */
// readonly currentTime: number = -1; get currentTime(): number {
return this.ac.currentTime - this.lastStartTime + this.lastStartWhen;
}
/** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */
bufferPlayDuration: number = 1; bufferPlayDuration: number = 1;
/** 音频的采样率,未成功解析出之前保持为 0 */ /** 音频的采样率,未成功解析出之前保持为 0 */
@ -92,6 +96,8 @@ export class AudioStreamSource extends AudioSource implements IStreamReader {
private target?: IAudioInput; private target?: IAudioInput;
/** 上一次播放是从何时开始的 */
private lastStartWhen: number = 0;
/** 开始播放时刻 */ /** 开始播放时刻 */
private lastStartTime: number = 0; private lastStartTime: number = 0;
/** 上一次播放的缓存长度 */ /** 上一次播放的缓存长度 */
@ -492,8 +498,12 @@ export class AudioBufferSource extends AudioSource {
private loop: boolean = false; private loop: boolean = false;
duration: number = 0; 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 lastStartTime: number = 0;
private target?: IAudioInput; private target?: IAudioInput;