Skip to content

Commit bdaf573

Browse files
Merge pull request #698 from braedonsaunders/claude/remove-unused-import-KfbWA
Claude/remove unused import kfb wa
2 parents 2e686f3 + 9f091be commit bdaf573

5 files changed

Lines changed: 50 additions & 23 deletions

File tree

native-bridge/src/audio/engine.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -987,18 +987,26 @@ impl AudioEngine {
987987
false // Default to not muted - let audio through
988988
};
989989

990-
// DRY monitoring: hardware bypass for zero-latency monitoring
990+
// WET monitoring: apply effects chain for local monitoring
991991
let should_monitor = monitoring_enabled && !is_muted;
992992

993993
if should_monitor {
994-
if let Ok(state) = processing_state.try_read() {
994+
if let Ok(mut state) = processing_state.try_write() {
995995
let gain = state.track_state.input_gain_linear();
996996
let volume = state.track_state.volume;
997997
let (pan_left, pan_right) = state.track_state.pan_gains();
998998

999-
// Apply gain, volume, and pan to stereo pairs
999+
// Apply input gain first
1000+
for sample in stereo_buffer.iter_mut() {
1001+
*sample *= gain;
1002+
}
1003+
1004+
// Process through effects chain (if any effects are enabled)
1005+
state.effects_chain.process(stereo_buffer);
1006+
1007+
// Apply volume, pan, and monitoring volume to stereo pairs
10001008
for chunk in stereo_buffer.chunks_exact_mut(2) {
1001-
let base_gain = gain * volume * mon_vol;
1009+
let base_gain = volume * mon_vol;
10021010
chunk[0] *= base_gain * pan_left;
10031011
chunk[1] *= base_gain * pan_right;
10041012
}

native-bridge/src/effects/types.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,36 @@ use serde::{Deserialize, Serialize};
66
#[derive(Debug, Clone, Serialize, Deserialize)]
77
#[serde(rename_all = "camelCase")]
88
pub struct EffectsSettings {
9-
// Base effects (15)
9+
// Base effects (15) - all have defaults so partial updates work
10+
#[serde(default)]
1011
pub wah: WahSettings,
12+
#[serde(default)]
1113
pub overdrive: OverdriveSettings,
14+
#[serde(default)]
1215
pub distortion: DistortionSettings,
16+
#[serde(default)]
1317
pub amp: AmpSettings,
18+
#[serde(default)]
1419
pub cabinet: CabinetSettings,
20+
#[serde(default)]
1521
pub noise_gate: NoiseGateSettings,
22+
#[serde(default)]
1623
pub eq: EqSettings,
24+
#[serde(default)]
1725
pub compressor: CompressorSettings,
26+
#[serde(default)]
1827
pub chorus: ChorusSettings,
28+
#[serde(default)]
1929
pub flanger: FlangerSettings,
30+
#[serde(default)]
2031
pub phaser: PhaserSettings,
32+
#[serde(default)]
2133
pub delay: DelaySettings,
34+
#[serde(default)]
2235
pub tremolo: TremoloSettings,
36+
#[serde(default)]
2337
pub reverb: ReverbSettings,
38+
#[serde(default)]
2439
pub limiter: LimiterSettings,
2540
// Extended effects (20)
2641
#[serde(default)]

src/components/daw/native-bridge-gate.tsx

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,8 @@ export function NativeBridgeGate({
7272
}
7373
};
7474

75-
// If already connected and running, auto-proceed
76-
useEffect(() => {
77-
if (isConnected && isRunning) {
78-
// Small delay to show the success state
79-
const timer = setTimeout(() => {
80-
onJoinAsPerformer();
81-
}, 500);
82-
return () => clearTimeout(timer);
83-
}
84-
}, [isConnected, isRunning, onJoinAsPerformer]);
75+
// Note: We don't auto-proceed anymore - user should explicitly click "Join as Performer"
76+
// Audio starts AFTER joining, so isRunning will be false on this screen
8577

8678
return (
8779
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-indigo-950 to-slate-900 flex items-center justify-center p-4">
@@ -229,21 +221,21 @@ export function NativeBridgeGate({
229221

230222
{/* Join Options */}
231223
<div className="space-y-3 pt-2">
232-
{/* Performer option */}
224+
{/* Performer option - only requires connection, audio starts after joining */}
233225
<Button
234226
size="lg"
235-
disabled={!isConnected || !isRunning}
227+
disabled={!isConnected}
236228
onClick={onJoinAsPerformer}
237229
className={cn(
238230
"w-full h-14 text-base",
239-
isConnected && isRunning
231+
isConnected
240232
? "bg-gradient-to-r from-indigo-600 to-purple-600 hover:from-indigo-500 hover:to-purple-500"
241233
: "bg-slate-700 text-slate-400"
242234
)}
243235
>
244236
<Mic className="w-5 h-5 mr-2" />
245237
Join as Performer
246-
{isConnected && isRunning && (
238+
{isConnected && latency.total > 0 && (
247239
<span className="ml-2 text-xs bg-white/20 px-2 py-0.5 rounded-full">
248240
{latency.total.toFixed(0)}ms
249241
</span>

src/hooks/useNativeBridge.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,17 +406,24 @@ export function useNativeBridge() {
406406
nativeBridge.setSampleRate(state.sampleRate);
407407
nativeBridge.setChannelConfig(channelConfigToUse);
408408

409-
// Send track state to native bridge for direct monitoring
409+
// Send track state AND effects to native bridge for direct monitoring
410410
if (currentUserId && primaryTrack) {
411411
nativeBridge.updateTrackState(primaryTrack.id, {
412412
isArmed: primaryTrack.isArmed,
413413
isMuted: primaryTrack.isMuted,
414414
isSolo: primaryTrack.isSolo,
415415
volume: primaryTrack.volume,
416+
pan: primaryTrack.pan ?? 0,
416417
inputGainDb: primaryTrack.audioSettings.inputGain || 0,
417418
monitoringEnabled: primaryTrack.audioSettings.directMonitoring ?? true,
418419
monitoringVolume: primaryTrack.audioSettings.monitoringVolume ?? 1,
419420
});
421+
422+
// Send effects to native bridge on startup
423+
if (primaryTrack.audioSettings.effects) {
424+
console.log('[useNativeBridge] Sending initial effects to native bridge');
425+
nativeBridge.updateEffects(primaryTrack.id, primaryTrack.audioSettings.effects);
426+
}
420427
}
421428

422429
// Start audio - processors are already ready to receive it

src/lib/audio/native-bridge.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,9 @@ export class NativeBridge {
340340
break;
341341

342342
case 'streamHealth':
343-
// Only log if there's an issue (overflow or unhealthy)
344-
if (msg.overflowCount > 0 || !msg.isHealthy) {
345-
console.warn('[NativeBridge] Stream health issue:', msg);
343+
// Only log overflow issues - empty buffer on reconnect is normal
344+
if (msg.overflowCount > 0) {
345+
console.warn('[NativeBridge] Buffer overflow:', msg.overflowCount, 'batches,', msg.overflowSamples, 'samples dropped');
346346
}
347347
this.emit('streamHealth', {
348348
bufferOccupancy: msg.bufferOccupancy,
@@ -593,6 +593,11 @@ export class NativeBridge {
593593
* Update effects
594594
*/
595595
updateEffects(trackId: string, effects: Partial<UnifiedEffectsChain>): void {
596+
// Log which effects are enabled for debugging
597+
const enabledEffects = Object.entries(effects)
598+
.filter(([, v]) => v && typeof v === 'object' && 'enabled' in v && v.enabled)
599+
.map(([k]) => k);
600+
console.log('[NativeBridge] updateEffects:', { trackId, enabledEffects });
596601
this.send({ type: 'updateEffects', trackId: trackId, effects });
597602
}
598603

0 commit comments

Comments
 (0)