import { AudioWaveform, Headphones, Mic, Music, Volume2, VolumeX, Wind } from "lucide-react" import { useMemo } from "react" import { Button } from "@/components/ui/button" import { Label } from "@/components/ui/label" import { Slider } from "@/components/ui/slider" import { cn } from "@/lib/utils" import { useTimeline } from "../hooks/use-timeline" import { TimelineTrack, TrackType } from "../types/timeline" interface AudioMixerProps { className?: string } /** * Аудио микшер для управления громкостью и эффектами аудио треков */ export function AudioMixer({ className }: AudioMixerProps) { const { project, updateTrack } = useTimeline() // Получаем все аудио треки const audioTracks = useMemo(() => { if (!project) return [] type AudioTrackWithSection = TimelineTrack & { sectionName: string } const tracks: AudioTrackWithSection[] = [] // Собираем треки из секций project.sections?.forEach((section) => { section.tracks.forEach((track) => { if (isAudioTrack(track.type)) { tracks.push({ ...track, sectionName: section.name }) } }) }) // Добавляем глобальные треки project.globalTracks?.forEach((track) => { if (isAudioTrack(track.type)) { tracks.push({ ...track, sectionName: "Global" }) } }) return tracks }, [project]) const getTrackIcon = (type: TrackType) => { switch (type) { case "audio": return case "music": return case "voiceover": return case "sfx": return case "ambient": return default: return } } const getTrackColor = (type: TrackType) => { switch (type) { case "audio": return "bg-blue-500" case "music": return "bg-purple-500" case "voiceover": return "bg-green-500" case "sfx": return "bg-orange-500" case "ambient": return "bg-cyan-500" default: return "bg-gray-500" } } const handleVolumeChange = (trackId: string, value: number[]) => { void updateTrack(trackId, { volume: value[0] }) } const handleMute = (trackId: string, currentMuted: boolean) => { void updateTrack(trackId, { isMuted: !currentMuted }) } const handleSolo = (trackId: string, currentSolo: boolean) => { void updateTrack(trackId, { isSolo: !currentSolo }) } if (audioTracks.length === 0) { return (

Нет аудио треков

Добавьте аудио файлы на timeline

) } return (

Аудио микшер

{ // TODO: Implement master volume console.log("Master volume:", value[0]) }} />
{audioTracks.map((track) => (
{/* Заголовок трека */}
{getTrackIcon(track.type)}

{track.name}

{track.sectionName}

{/* Контролы громкости и панорамы */}
{/* Громкость */}
handleVolumeChange(track.id, value)} disabled={track.isMuted} /> {Math.round(track.volume * 100)}%
{/* Панорама */}
updateTrack(track.id, { pan: value[0] })} disabled={track.isMuted} /> {track.pan === 0 ? "C" : track.pan > 0 ? `${Math.round(track.pan * 100)}R` : `${Math.round(-track.pan * 100)}L`}
{/* VU метр (заглушка) */}
{/* Индикаторы эффектов */} {track.trackEffects.length > 0 && (
{track.trackEffects.map((_, index) => (
FX
))}
)}
))}
) } // Проверка, является ли трек аудио треком function isAudioTrack(type: TrackType): boolean { return ["audio", "music", "voiceover", "sfx", "ambient"].includes(type) }