import { useCallback, useEffect } from "react" import { useTranslation } from "react-i18next" import { cn } from "@/lib/utils" import { useAudioEngine } from "../../hooks/use-audio-engine" import { useMidiIntegration } from "../../hooks/use-midi-integration" import { useMixerState } from "../../hooks/use-mixer-state" import { useTimelineMixerSync } from "../../services/timeline-sync-service" import { MidiIndicator } from "../midi/midi-indicator" import { ChannelWithAudio } from "./channel-with-audio" import { MasterSection } from "./master-section" interface MixerConsoleProps { className?: string } export function MixerConsole({ className }: MixerConsoleProps) { const { t } = useTranslation() const { channels, updateChannel, toggleMute, toggleSolo, toggleArm, setChannels } = useMixerState() // Enable MIDI integration useMidiIntegration() const { engine, isInitialized, updateChannelVolume: engineUpdateVolume, updateChannelPan: engineUpdatePan, muteChannel: engineMuteChannel, soloChannel: engineSoloChannel, createChannel, getChannelAnalyser, } = useAudioEngine() // Sync with timeline const handleChannelsUpdate = useCallback( (newChannels: typeof channels) => { setChannels(newChannels) }, [setChannels], ) const { updateTrackFromMixer } = useTimelineMixerSync(handleChannelsUpdate) // Create audio channels when mixer channels change useEffect(() => { if (!isInitialized) return channels.forEach((channel) => { createChannel(channel.id) engineUpdateVolume(channel.id, channel.volume) engineUpdatePan(channel.id, channel.pan) engineMuteChannel(channel.id, channel.muted) engineSoloChannel(channel.id, channel.solo) }) }, [ channels, isInitialized, createChannel, engineUpdateVolume, engineUpdatePan, engineMuteChannel, engineSoloChannel, ]) const handleVolumeChange = (channelId: string, volume: number) => { updateChannel(channelId, { volume }) updateTrackFromMixer(channelId, { volume }) engineUpdateVolume(channelId, volume) } const handlePanChange = (channelId: string, pan: number) => { updateChannel(channelId, { pan }) updateTrackFromMixer(channelId, { pan }) engineUpdatePan(channelId, pan) } const handleMute = (channelId: string) => { toggleMute(channelId) const channel = channels.find((ch) => ch.id === channelId) if (channel) { updateTrackFromMixer(channelId, { muted: !channel.muted }) engineMuteChannel(channelId, !channel.muted) } } const handleSolo = (channelId: string) => { toggleSolo(channelId) const channel = channels.find((ch) => ch.id === channelId) if (channel) { updateTrackFromMixer(channelId, { solo: !channel.solo }) engineSoloChannel(channelId, !channel.solo) } } return (
{t("timeline.audioMixer.noTracks")}
{t("timeline.audioMixer.addTracksHint")}