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)
}