Skip to content

Commit 0e8ed26

Browse files
committed
fix: align native fallback meters and transport ordering
1 parent 762d78e commit 0e8ed26

16 files changed

Lines changed: 238 additions & 46 deletions

src/components/mixer/LevelMeter.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useEffect, useRef, useCallback } from 'react';
2-
import { getAudioEngine } from '../../hooks/useAudioEngine';
2+
import { getAudioEngine, getTauriPlaybackClockOwner } from '../../hooks/useAudioEngine';
33
import { getAudioBridge } from '../../engine/bridge';
44
import { METER_CANVAS_STOPS, METER_DB_TICKS, METER_DB_TICKS_MINOR, METER_PADDING_PCT, dbToFill, levelToFill } from '../meter-colors';
55

@@ -94,8 +94,12 @@ export function LevelMeter({ trackId, masterStage, returnTrackId, stereo, showSc
9494
let rightLevel = 0;
9595
let clipped = false;
9696

97+
const meterSource = bridge.backend === 'tauri' && getTauriPlaybackClockOwner() === 'native'
98+
? bridge
99+
: engine;
100+
97101
if (masterStage) {
98-
const meter = bridge.getMasterMeter(masterStage);
102+
const meter = meterSource.getMasterMeter(masterStage);
99103
leftLevel = meter.level;
100104
rightLevel = meter.level;
101105
clipped = meter.clipped;
@@ -105,7 +109,7 @@ export function LevelMeter({ trackId, masterStage, returnTrackId, stereo, showSc
105109
rightLevel = meter.level;
106110
clipped = meter.clipped;
107111
} else if (trackId) {
108-
const meter = bridge.getTrackMeter(trackId);
112+
const meter = meterSource.getTrackMeter(trackId);
109113
leftLevel = isStereo ? meter.leftLevel : meter.level;
110114
rightLevel = isStereo ? meter.rightLevel : meter.level;
111115
clipped = meter.clipped;
@@ -186,12 +190,15 @@ export function LevelMeter({ trackId, masterStage, returnTrackId, stereo, showSc
186190
const resetClip = () => {
187191
const engine = getAudioEngine();
188192
const bridge = getAudioBridge(engine);
193+
const meterSource = bridge.backend === 'tauri' && getTauriPlaybackClockOwner() === 'native'
194+
? bridge
195+
: engine;
189196
if (masterStage) {
190-
bridge.resetMasterClip(masterStage);
197+
meterSource.resetMasterClip(masterStage);
191198
} else if (returnTrackId) {
192199
engine.resetReturnTrackClip(returnTrackId);
193200
} else if (trackId) {
194-
bridge.resetTrackClip(trackId);
201+
meterSource.resetTrackClip(trackId);
195202
}
196203
clippedRef.current = false;
197204
clippedStateRef.current = false;

src/components/mixer/__tests__/LevelMeter.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { render, screen } from '@testing-library/react';
33
import { LevelMeter } from '../LevelMeter';
44

55
vi.mock('../../../hooks/useAudioEngine', () => ({
6+
getTauriPlaybackClockOwner: () => 'web-audio',
67
getAudioEngine: () => ({
78
getTrackMeter: () => ({ level: 0.5, leftLevel: 0.4, rightLevel: 0.6, clipped: false }),
89
getMasterMeter: () => ({ level: 0.3, clipped: false }),

src/components/session/SessionMixerStrip.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useCallback, useEffect, useRef, useState } from 'react';
2-
import { getAudioEngine } from '../../hooks/useAudioEngine';
2+
import { getAudioEngine, getTauriPlaybackClockOwner } from '../../hooks/useAudioEngine';
33
import { getAudioBridge } from '../../engine/bridge';
44
import { Knob } from '../ui/Knob';
55

@@ -48,7 +48,10 @@ export function SessionMixerStrip({
4848
const engine = getAudioEngine();
4949
const bridge = getAudioBridge(engine);
5050
const tick = () => {
51-
const meter = bridge.getTrackMeter(trackId);
51+
const meterSource = bridge.backend === 'tauri' && getTauriPlaybackClockOwner() === 'native'
52+
? bridge
53+
: engine;
54+
const meter = meterSource.getTrackMeter(trackId);
5255
setLeftFill(levelToFill(meter.leftLevel));
5356
setRightFill(levelToFill(meter.rightLevel));
5457
rafRef.current = requestAnimationFrame(tick);

src/components/session/__tests__/SessionMixer.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ vi.mock('../../../services/projectStorage', () => ({
99
}));
1010

1111
vi.mock('../../../hooks/useAudioEngine', () => ({
12+
getTauriPlaybackClockOwner: () => 'web-audio',
1213
getAudioEngine: () => ({
1314
getTrackMeter: () => ({ leftLevel: 0, rightLevel: 0, clipped: false }),
1415
getTrackLevel: () => 0,

src/components/tracks/FaderMeter.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useCallback, useEffect, useRef, useState } from 'react';
2-
import { getAudioEngine } from '../../hooks/useAudioEngine';
2+
import { getAudioEngine, getTauriPlaybackClockOwner } from '../../hooks/useAudioEngine';
33
import { getAudioBridge } from '../../engine/bridge';
44
import { METER_GRADIENT_HORIZONTAL, levelToMeterFill } from '../meter-colors';
55

@@ -36,7 +36,10 @@ export function FaderMeter({ trackId, volume, onVolumeChange, trackName }: Fader
3636
const engine = getAudioEngine();
3737
const bridge = getAudioBridge(engine);
3838
const tick = () => {
39-
const meter = bridge.getTrackMeter(trackId);
39+
const meterSource = bridge.backend === 'tauri' && getTauriPlaybackClockOwner() === 'native'
40+
? bridge
41+
: engine;
42+
const meter = meterSource.getTrackMeter(trackId);
4043
setLeftFill(levelToMeterFill(meter.leftLevel));
4144
setRightFill(levelToMeterFill(meter.rightLevel));
4245
setClipping((was) => was || meter.clipped);
@@ -49,7 +52,10 @@ export function FaderMeter({ trackId, volume, onVolumeChange, trackName }: Fader
4952
const resetClip = useCallback(() => {
5053
const engine = getAudioEngine();
5154
const bridge = getAudioBridge(engine);
52-
bridge.resetTrackClip(trackId);
55+
const meterSource = bridge.backend === 'tauri' && getTauriPlaybackClockOwner() === 'native'
56+
? bridge
57+
: engine;
58+
meterSource.resetTrackClip(trackId);
5359
setClipping(false);
5460
}, [trackId]);
5561

src/components/tracks/StereoMeter.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useEffect, useRef, useState } from 'react';
2-
import { getAudioEngine } from '../../hooks/useAudioEngine';
2+
import { getAudioEngine, getTauriPlaybackClockOwner } from '../../hooks/useAudioEngine';
33
import { getAudioBridge } from '../../engine/bridge';
44
import { METER_GRADIENT_HORIZONTAL, levelToMeterFill } from '../meter-colors';
55

@@ -18,7 +18,10 @@ export function StereoMeter({ trackId }: StereoMeterProps) {
1818
const bridge = getAudioBridge(engine);
1919

2020
const tick = () => {
21-
const meter = bridge.getTrackMeter(trackId);
21+
const meterSource = bridge.backend === 'tauri' && getTauriPlaybackClockOwner() === 'native'
22+
? bridge
23+
: engine;
24+
const meter = meterSource.getTrackMeter(trackId);
2225
setLeftFill(levelToMeterFill(meter.leftLevel));
2326
setRightFill(levelToMeterFill(meter.rightLevel));
2427
setClipping((was) => was || meter.clipped);
@@ -32,7 +35,10 @@ export function StereoMeter({ trackId }: StereoMeterProps) {
3235
const resetClip = () => {
3336
const engine = getAudioEngine();
3437
const bridge = getAudioBridge(engine);
35-
bridge.resetTrackClip(trackId);
38+
const meterSource = bridge.backend === 'tauri' && getTauriPlaybackClockOwner() === 'native'
39+
? bridge
40+
: engine;
41+
meterSource.resetTrackClip(trackId);
3642
setClipping(false);
3743
};
3844

src/components/tracks/__tests__/StereoMeter.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const engine = {
1010

1111
vi.mock('../../../hooks/useAudioEngine', () => ({
1212
getAudioEngine: () => engine,
13+
getTauriPlaybackClockOwner: () => 'web-audio',
1314
}));
1415

1516
describe('StereoMeter', () => {

src/components/tracks/__tests__/TrackHeader.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ vi.mock('../../../services/freezeTrack', () => ({
2323
}));
2424

2525
vi.mock('../../../hooks/useAudioEngine', () => ({
26+
getTauriPlaybackClockOwner: () => 'web-audio',
2627
getAudioEngine: () => ({
2728
getTrackLevel: () => 0,
2829
getTrackMeter: () => ({ level: 0, clipped: false }),

src/components/tracks/__tests__/TrackHeaderAnimation.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ vi.mock('../../../services/freezeTrack', () => ({
1818
flattenTrackToAudio: vi.fn(),
1919
}));
2020
vi.mock('../../../hooks/useAudioEngine', () => ({
21+
getTauriPlaybackClockOwner: () => 'web-audio',
2122
getAudioEngine: () => ({
2223
getTrackLevel: () => 0,
2324
}),

src/components/tracks/__tests__/TrackHeaderLayout.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ vi.mock('../../../services/freezeTrack', () => ({
1919
flattenTrackToAudio: vi.fn(),
2020
}));
2121
vi.mock('../../../hooks/useAudioEngine', () => ({
22+
getTauriPlaybackClockOwner: () => 'web-audio',
2223
getAudioEngine: () => ({
2324
getTrackLevel: () => 0,
2425
getTrackMeter: () => ({ level: 0, clipped: false }),

0 commit comments

Comments
 (0)