diff --git a/components/recording/InputLevelMeter.tsx b/components/recording/InputLevelMeter.tsx
new file mode 100644
index 0000000..9bc80f2
--- /dev/null
+++ b/components/recording/InputLevelMeter.tsx
@@ -0,0 +1,85 @@
+'use client';
+
+import * as React from 'react';
+import { cn } from '@/lib/utils/cn';
+
+export interface InputLevelMeterProps {
+ level: number; // 0.0 to 1.0
+ orientation?: 'horizontal' | 'vertical';
+ className?: string;
+}
+
+export function InputLevelMeter({
+ level,
+ orientation = 'horizontal',
+ className,
+}: InputLevelMeterProps) {
+ // Clamp level between 0 and 1
+ const clampedLevel = Math.max(0, Math.min(1, level));
+
+ // Calculate color based on level
+ const getColor = (level: number): string => {
+ if (level > 0.9) return 'bg-red-500';
+ if (level > 0.7) return 'bg-yellow-500';
+ return 'bg-green-500';
+ };
+
+ const isHorizontal = orientation === 'horizontal';
+
+ return (
+
+ {/* Level bar */}
+
+
+ {/* Clip indicator (at 90%) */}
+ {clampedLevel > 0.9 && (
+
+ )}
+
+ {/* Tick marks */}
+
+ {[0.25, 0.5, 0.75].map((tick) => (
+
+ ))}
+
+
+ );
+}
diff --git a/components/tracks/Track.tsx b/components/tracks/Track.tsx
index 4f556b8..1ad77e3 100644
--- a/components/tracks/Track.tsx
+++ b/components/tracks/Track.tsx
@@ -1,7 +1,7 @@
'use client';
import * as React from 'react';
-import { Volume2, VolumeX, Headphones, Trash2, ChevronDown, ChevronRight, CircleArrowOutUpRight, Upload, Plus } from 'lucide-react';
+import { Volume2, VolumeX, Headphones, Trash2, ChevronDown, ChevronRight, CircleArrowOutUpRight, Upload, Plus, Mic } from 'lucide-react';
import type { Track as TrackType } from '@/types/track';
import { Button } from '@/components/ui/Button';
import { Slider } from '@/components/ui/Slider';
@@ -9,6 +9,7 @@ import { cn } from '@/lib/utils/cn';
import { EffectBrowser } from '@/components/effects/EffectBrowser';
import { EffectDevice } from '@/components/effects/EffectDevice';
import { createEffect, type EffectType } from '@/lib/audio/effects/chain';
+import { InputLevelMeter } from '@/components/recording/InputLevelMeter';
export interface TrackProps {
track: TrackType;
@@ -31,6 +32,9 @@ export interface TrackProps {
onUpdateEffect?: (effectId: string, parameters: any) => void;
onAddEffect?: (effectType: EffectType) => void;
onSelectionChange?: (selection: { start: number; end: number } | null) => void;
+ onToggleRecordEnable?: () => void;
+ isRecording?: boolean;
+ recordingLevel?: number;
}
export function Track({
@@ -54,6 +58,9 @@ export function Track({
onUpdateEffect,
onAddEffect,
onSelectionChange,
+ onToggleRecordEnable,
+ isRecording = false,
+ recordingLevel = 0,
}: TrackProps) {
const canvasRef = React.useRef(null);
const containerRef = React.useRef(null);
@@ -439,6 +446,22 @@ export function Track({
)}
+ {/* Record Enable Button */}
+ {onToggleRecordEnable && (
+
+ )}
+
{/* Solo Button */}