Skip to content

Commit c4f2251

Browse files
committed
fix: 避免在跳转后旧音频残留在 SoundTouch 缓冲区中导致音频重叠
1 parent 49390b6 commit c4f2251

2 files changed

Lines changed: 12 additions & 3 deletions

File tree

web/src/audio-core/queue/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const STATE_READ_INDEX = 2;
77
const STATE_WRITE_INDEX = 3;
88
const STATE_PLAYBACK_INDEX = 4;
99
const STATE_PAUSE_AT_INDEX = 5;
10+
const STATE_SEEK_GENERATION = 6;
1011

1112
const RING_BUFFER_CAPACITY = 192000 * 2;
1213
const RING_BUFFER_BYTES_PER_CHANNEL = RING_BUFFER_CAPACITY * 4;
@@ -122,6 +123,7 @@ export interface AudioReader {
122123
getPauseAtIndex(): number;
123124
clearPauseAtIndex(): void;
124125
pausePlayback(): void;
126+
getSeekGeneration(): number;
125127
}
126128
//#endregion
127129

@@ -222,6 +224,7 @@ class AudioQueueCore implements MainAudioController, AudioWriter, AudioReader {
222224
Atomics.store(this.controlBlock, STATE_WRITE_INDEX, 0);
223225
Atomics.store(this.controlBlock, STATE_READ_INDEX, 0);
224226
Atomics.store(this.controlBlock, STATE_PLAYBACK_INDEX, 0);
227+
Atomics.add(this.controlBlock, STATE_SEEK_GENERATION, 1);
225228
Atomics.notify(this.controlBlock, STATE_READ_INDEX, 1);
226229
}
227230

@@ -266,6 +269,10 @@ class AudioQueueCore implements MainAudioController, AudioWriter, AudioReader {
266269

267270
return { isDrained: false };
268271
}
272+
273+
getSeekGeneration(): number {
274+
return Atomics.load(this.controlBlock, STATE_SEEK_GENERATION);
275+
}
269276
//#endregion
270277

271278
//#region AudioReader

web/src/audio-core/worklet/audio.worklet.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class FFmpegAudioProcessor extends AudioWorkletProcessor {
1515
private currentRate: number = 1.0;
1616
private playbackFractional: number = 0.0;
1717

18-
private wasSeeking: boolean = false;
18+
private lastSeekGeneration: number = 0;
1919

2020
constructor() {
2121
super();
@@ -73,11 +73,13 @@ class FFmpegAudioProcessor extends AudioWorkletProcessor {
7373
}
7474

7575
const isCurrentlySeeking = this.audioReader.isSeeking();
76-
if (this.wasSeeking && !isCurrentlySeeking) {
76+
const currentSeekGeneration = this.audioReader.getSeekGeneration();
77+
78+
if (this.lastSeekGeneration !== currentSeekGeneration) {
7779
this.stProcessor.clear();
7880
this.playbackFractional = 0.0;
81+
this.lastSeekGeneration = currentSeekGeneration;
7982
}
80-
this.wasSeeking = isCurrentlySeeking;
8183

8284
if (!this.audioReader.isPlaying() || isCurrentlySeeking) {
8385
this.fillSilence(output, WORKLET_BLOCK_SIZE);

0 commit comments

Comments
 (0)