feat: implement mixer categorization by group_id

Adds useEffect to categorize mixers into track-specific arrays:
- metronomeTrackMixers (group_id: 16)
- backingTrackMixers (group_id: 11)
- jamTrackMixers (group_id: 12)
- recordingTrackMixers (group_id: 13)
- adhocTrackMixers (other types)

Each mixer categorized as {master, personal, mixer} pair.
Dispatches to Redux for component consumption.

Resolves TODO at line 243 about groupMixersByType logic.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Nuwan 2026-01-16 19:05:27 +05:30
parent be3d39bff6
commit fc3bbeeafe
1 changed files with 68 additions and 3 deletions

View File

@ -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