diff --git a/jam-ui/src/hooks/useMixerHelper.js b/jam-ui/src/hooks/useMixerHelper.js index fc9e3c0bc..4288fd5c9 100644 --- a/jam-ui/src/hooks/useMixerHelper.js +++ b/jam-ui/src/hooks/useMixerHelper.js @@ -34,7 +34,12 @@ import { setMetronome as setMetronomeAction, setMediaSummary, setSimulatedMusicCategoryMixers as setSimulatedMusicAction, - setSimulatedChatCategoryMixers as setSimulatedChatAction + setSimulatedChatCategoryMixers as setSimulatedChatAction, + setRecordingTrackMixers, + setBackingTrackMixers, + setJamTrackMixers, + setMetronomeTrackMixers, + setAdhocTrackMixers } from '../store/features/mixersSlice'; import { selectBackingTracks, @@ -236,8 +241,68 @@ const useMixerHelper = () => { dispatch(organizeMixers()); }, [currentSession, masterMixers, personalMixers, dispatch]); - // Note: groupMixersByType logic is handled by WebSocket MIXER_CHANGES handler - // which updates backingTrackMixers, jamTrackMixers, etc. via Redux actions + // Categorize mixers by group_id and dispatch to Redux + useEffect(() => { + if (!masterMixers || !personalMixers || masterMixers.length === 0) return; + + console.log('[useMixerHelper] Categorizing mixers by group_id'); + + const metronomeTrackMixers = []; + const backingTrackMixers = []; + const jamTrackMixers = []; + const recordingTrackMixers = []; + const adhocTrackMixers = []; + + // Process master/personal mixer pairs + for (const masterMixer of masterMixers) { + const personalMixer = personalMixers.find(p => p.rid === masterMixer.rid); + const mixerPair = { + master: masterMixer, + personal: personalMixer, + mixer: mixMode === MIX_MODES.PERSONAL ? personalMixer : masterMixer + }; + + // Categorize by group_id (from ChannelGroupIds) + switch (masterMixer.group_id) { + case ChannelGroupIds.MetronomeGroup: // 16 + metronomeTrackMixers.push(mixerPair); + console.log('[useMixerHelper] Found metronome mixer:', masterMixer.id); + break; + case ChannelGroupIds.BackingTrackGroup: // 11 + backingTrackMixers.push(mixerPair); + break; + case ChannelGroupIds.JamTrackGroup: // 12 + jamTrackMixers.push(mixerPair); + break; + case ChannelGroupIds.RecordingGroup: // 13 + recordingTrackMixers.push(mixerPair); + break; + default: + // Other mixer types go into adhoc + if (masterMixer.group_id !== ChannelGroupIds.UserMusicInputGroup && + masterMixer.group_id !== ChannelGroupIds.ChatMicGroup && + masterMixer.group_id !== ChannelGroupIds.BroadcastGroup) { + adhocTrackMixers.push(mixerPair); + } + } + } + + console.log('[useMixerHelper] Categorized mixers:', { + metronome: metronomeTrackMixers.length, + backing: backingTrackMixers.length, + jam: jamTrackMixers.length, + recording: recordingTrackMixers.length, + adhoc: adhocTrackMixers.length + }); + + // Dispatch to Redux + dispatch(setMetronomeTrackMixers(metronomeTrackMixers)); + dispatch(setBackingTrackMixers(backingTrackMixers)); + dispatch(setJamTrackMixers(jamTrackMixers)); + dispatch(setRecordingTrackMixers(recordingTrackMixers)); + dispatch(setAdhocTrackMixers(adhocTrackMixers)); + + }, [masterMixers, personalMixers, mixMode, dispatch]); // Sync local isReady ref with Redux isReady state // This ensures VU meter callbacks have immediate access to the ready state