Skip to content

Commit 34fe287

Browse files
committed
fix(ui): 修正横向浏览变速预览交接
1 parent 8f13c1b commit 34fe287

31 files changed

Lines changed: 1199 additions & 61 deletions

‎drafts/intermittent-bugs/horizontal-browse-live-tempo-release-jitter.md‎

Lines changed: 309 additions & 0 deletions
Large diffs are not rendered by default.

‎rust_package/src/horizontal_browse_transport_audio.rs‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,15 @@ fn resolved_output_sample_rate(output_sample_rate: f64, source_sample_rate: u32)
7070
}
7171

7272
pub(super) fn should_use_master_tempo(target: &DeckState) -> bool {
73-
target.master_tempo_enabled
74-
&& (target.playback_rate - 1.0).abs() > 0.0001
75-
&& !target.pcm_data.is_empty()
76-
&& target.sample_rate > 0
77-
&& target.channels > 0
73+
if !target.master_tempo_enabled
74+
|| target.pcm_data.is_empty()
75+
|| target.sample_rate == 0
76+
|| target.channels == 0
77+
{
78+
return false;
79+
}
80+
// 已经在拉伸时划过原速不要关掉处理器,避免 BPM 拖动经过 1.0 时咔一声。
81+
(target.playback_rate - 1.0).abs() > 0.0001 || target.master_tempo_state.processor.is_some()
7882
}
7983

8084
fn configure_processor(target: &mut DeckState, output_sample_rate: f64) {

‎src/main/ipc/horizontalBrowseTransportHandlers.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,13 @@ export function registerHorizontalBrowseTransportHandlers() {
204204
}
205205
)
206206

207+
ipcMain.on(
208+
'horizontal-browse-transport:set-playback-rate-live',
209+
(_event, deck: HorizontalBrowseDeckKey, nowMs: number, playbackRate: number) => {
210+
horizontalBrowseTransportBridge.setPlaybackRate(deck, nowMs, playbackRate)
211+
}
212+
)
213+
207214
ipcMain.handle(
208215
'horizontal-browse-transport:set-tempo-nudge-playback-rate',
209216
async (_event, deck: HorizontalBrowseDeckKey, nowMs: number, playbackRate: number) => {

‎src/preload/index.ts‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ const exactSendChannels = new Set([
129129
'whatsNew-toggle-minimize'
130130
])
131131

132+
const exactSendTransportChannels = new Set(['horizontal-browse-transport:set-playback-rate-live'])
133+
132134
const exactListenChannels = new Set([
133135
'addSongFingerprintFinished',
134136
'analysis-runtime-download-state',
@@ -259,6 +261,7 @@ const isAllowedIpcChannel = (method: IpcMethod, channel: string): boolean => {
259261
if (method === 'send') {
260262
return (
261263
exactSendChannels.has(channel) ||
264+
exactSendTransportChannels.has(channel) ||
262265
channel.startsWith('mini-player:') ||
263266
sourceChannelPrefixes.some((prefix) => channel === `${prefix}stream-preview-waveforms`)
264267
)

‎src/renderer/src/components/HorizontalBrowseDeckDetailLane.vue‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const props = defineProps<{
3838
playbackActive: boolean
3939
playbackRate: number
4040
visualPlaybackRate?: number
41+
liveTempoPreviewRate?: number | null
4142
waveformGain?: number
4243
playbackSyncRevision: number
4344
gridBpm: number
@@ -107,6 +108,8 @@ defineExpose<HorizontalBrowseRawWaveformDetailExpose>({
107108
releaseDynamicGridSelectionForBpmInput: () =>
108109
detailRef.value?.releaseDynamicGridSelectionForBpmInput?.(),
109110
cycleMetronomeState: () => detailRef.value?.cycleMetronomeState?.(),
111+
setLiveTempoPreviewRate: (rate: number | null) =>
112+
detailRef.value?.setLiveTempoPreviewRate?.(rate),
110113
prepareStableFrameForAnchor: (seconds: number, options?: { timeoutMs?: number }) =>
111114
detailRef.value?.prepareStableFrameForAnchor?.(seconds, options) ?? Promise.resolve(false),
112115
commitLinkedGridVisualTransaction: (
@@ -138,6 +141,7 @@ defineExpose<HorizontalBrowseRawWaveformDetailExpose>({
138141
:playback-active="props.playbackActive"
139142
:playback-rate="props.playbackRate"
140143
:visual-playback-rate="props.visualPlaybackRate"
144+
:live-tempo-preview-rate="props.liveTempoPreviewRate"
141145
:waveform-gain="props.waveformGain"
142146
:playback-sync-revision="props.playbackSyncRevision"
143147
:grid-bpm="props.gridBpm"

‎src/renderer/src/components/HorizontalBrowseDeckOverviewSection.vue‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ const emit = defineEmits<{
9191
(event: 'shift-right-small'): void
9292
(event: 'shift-right-large'): void
9393
(event: 'update-bpm-input', value: string): void
94+
(event: 'live-bpm-input', value: string): void
9495
(event: 'blur-bpm-input'): void
9596
(event: 'tap-bpm'): void
9697
(event: 'memory-cue'): void
@@ -213,6 +214,7 @@ const isTop = props.position === 'top'
213214
@shift-right-small="emit('shift-right-small')"
214215
@shift-right-large="emit('shift-right-large')"
215216
@update-bpm-input="emit('update-bpm-input', $event)"
217+
@live-bpm-input="emit('live-bpm-input', $event)"
216218
@blur-bpm-input="emit('blur-bpm-input')"
217219
@tap-bpm="emit('tap-bpm')"
218220
@memory-cue="emit('memory-cue')"

‎src/renderer/src/components/HorizontalBrowseDeckToolbarRow.vue‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const emit = defineEmits<{
4848
(event: 'shift-right-small'): void
4949
(event: 'shift-right-large'): void
5050
(event: 'update-bpm-input', value: string): void
51+
(event: 'live-bpm-input', value: string): void
5152
(event: 'blur-bpm-input'): void
5253
(event: 'tap-bpm'): void
5354
(event: 'memory-cue'): void
@@ -141,6 +142,7 @@ const handleTempoNudgeKeyUp = (direction: HorizontalBrowseTempoNudgeDirection) =
141142
@shift-right-small="emit('shift-right-small')"
142143
@shift-right-large="emit('shift-right-large')"
143144
@update-bpm-input="emit('update-bpm-input', $event)"
145+
@live-bpm-input="emit('live-bpm-input', $event)"
144146
@blur-bpm-input="emit('blur-bpm-input')"
145147
@tap-bpm="emit('tap-bpm')"
146148
@memory-cue="emit('memory-cue')"

‎src/renderer/src/components/HorizontalBrowseModeShell.vue‎

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -326,13 +326,22 @@ const {
326326
getDeckSong: resolveDeckSong,
327327
setDeckSong
328328
})
329-
const { isDeckMasterTempoEnabled, toggleDeckMasterTempo, setDeckTargetBpm, resetDeckTempo } =
330-
useHorizontalBrowseDeckTempoControls({
331-
resolveDeckSong,
332-
resolveDeckGridBpm,
333-
resolveTransportDeckSnapshot,
334-
nativeTransport
335-
})
329+
const {
330+
isDeckMasterTempoEnabled,
331+
toggleDeckMasterTempo,
332+
scheduleDeckLiveTargetBpm,
333+
commitDeckTargetBpm,
334+
cancelDeckLiveTargetBpm,
335+
resetDeckTempo
336+
} = useHorizontalBrowseDeckTempoControls({
337+
resolveDeckSong,
338+
resolveDeckGridBpm,
339+
resolveTransportDeckSnapshot,
340+
nativeTransport,
341+
onLiveVisualPlaybackRate: (deck, playbackRate) => {
342+
resolveDetailRef(deck)?.setLiveTempoPreviewRate?.(playbackRate)
343+
}
344+
})
336345
resolveDeckMasterTempoEnabledForTransport = isDeckMasterTempoEnabled
337346
const handleDeckMasterTempoToggle = (deck: DeckKey) => {
338347
touchDeckInteraction(deck)
@@ -652,6 +661,7 @@ const {
652661
handleDeckMetronomeStateCycle,
653662
handleDeckBpmTap,
654663
handleDeckBpmInputUpdate,
664+
handleDeckBpmInputLive,
655665
handleDeckBpmInputBlur,
656666
handleDeckSelectWholeAdjustment,
657667
handleDeckSplitAfterPlayhead,
@@ -666,7 +676,9 @@ const {
666676
resolveDeckToolbarBpmInputValue,
667677
shouldPreserveGridShiftPhase,
668678
shouldCommitBpmInputAsGridEdit: (deck) => isEditMode.value && deck === 'top',
669-
setDeckTargetBpm
679+
scheduleDeckLiveTargetBpm,
680+
commitDeckTargetBpm,
681+
cancelDeckLiveTargetBpm
670682
})
671683
672684
const resolveDeckSyncUiEnabled = (deck: DeckKey) =>
@@ -871,6 +883,7 @@ const waveformStackModel: HorizontalBrowseModeShellWaveformStackModel = {
871883
handleDeckGridShiftSmallRight,
872884
handleDeckGridShiftLargeRight,
873885
handleDeckBpmInputUpdate,
886+
handleDeckBpmInputLive,
874887
handleDeckBpmInputBlur,
875888
handleDeckBpmTap,
876889
handleDeckMemoryCueCreate,

‎src/renderer/src/components/HorizontalBrowseModeShellWaveformStack.vue‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ onUnmounted(() => {
189189
@shift-right-small="model.handleDeckGridShiftSmallRight('top')"
190190
@shift-right-large="model.handleDeckGridShiftLargeRight('top')"
191191
@update-bpm-input="model.handleDeckBpmInputUpdate('top', $event)"
192+
@live-bpm-input="model.handleDeckBpmInputLive('top', $event)"
192193
@blur-bpm-input="model.handleDeckBpmInputBlur('top')"
193194
@tap-bpm="model.handleDeckBpmTap('top')"
194195
@memory-cue="handleTopMemoryCueCreate()"
@@ -413,6 +414,7 @@ onUnmounted(() => {
413414
@shift-right-small="model.handleDeckGridShiftSmallRight('bottom')"
414415
@shift-right-large="model.handleDeckGridShiftLargeRight('bottom')"
415416
@update-bpm-input="model.handleDeckBpmInputUpdate('bottom', $event)"
417+
@live-bpm-input="model.handleDeckBpmInputLive('bottom', $event)"
416418
@blur-bpm-input="model.handleDeckBpmInputBlur('bottom')"
417419
@tap-bpm="model.handleDeckBpmTap('bottom')"
418420
@memory-cue="void model.handleDeckMemoryCueCreate('bottom')"

‎src/renderer/src/components/HorizontalBrowseRawWaveformDetail.scss‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@
3939
overflow: hidden;
4040
}
4141

42+
.raw-detail-waveform__tempo-scaler {
43+
position: absolute;
44+
inset: 0;
45+
overflow: visible;
46+
transform-origin: 50% 50%;
47+
backface-visibility: hidden;
48+
}
49+
4250
.raw-detail-waveform__unavailable {
4351
position: absolute;
4452
inset: 0;
@@ -66,6 +74,7 @@
6674
.raw-detail-waveform__overlay-surface {
6775
opacity: 0;
6876
transition: none;
77+
backface-visibility: hidden;
6978
}
7079

7180
.raw-detail-waveform__canvas--waveform {

0 commit comments

Comments
 (0)