import { View, Text, Pressable, ScrollView, Alert } from 'react-native'; import { useState, useEffect } from 'react'; import { useAudioRecorder } from '../hooks/use-audio-recorder'; import { useAudioPlayer } from '../hooks/use-audio-player'; import { getRecordingPermissionsAsync, requestRecordingPermissionsAsync } from 'expo-audio'; export default function AudioTestScreen() { const [permissionGranted, setPermissionGranted] = useState(false); const [recordingStatus, setRecordingStatus] = useState<'idle' | 'recording' | 'processing'>('idle'); const [lastRecordingSize, setLastRecordingSize] = useState(null); const [playbackStatus, setPlaybackStatus] = useState('No audio playing'); const [lastRecordedBlob, setLastRecordedBlob] = useState(null); const audioRecorder = useAudioRecorder({ sampleRate: 16000, numberOfChannels: 1, }); const audioPlayer = useAudioPlayer(); useEffect(() => { checkAndRequestPermissions(); }, []); async function checkAndRequestPermissions() { try { const { status } = await getRecordingPermissionsAsync(); if (status === 'granted') { setPermissionGranted(true); } else { const { granted } = await requestRecordingPermissionsAsync(); setPermissionGranted(granted); if (!granted) { Alert.alert( 'Permission Required', 'Microphone permission is required to test audio recording.' ); } } } catch (error) { console.error('[AudioTest] Permission error:', error); Alert.alert('Error', 'Failed to check/request microphone permissions'); } } async function handleStartRecording() { if (!permissionGranted) { Alert.alert('Permission Required', 'Please grant microphone permission first'); return; } try { setRecordingStatus('recording'); setLastRecordingSize(null); await audioRecorder.start(); } catch (error: any) { console.error('[AudioTest] Start recording error:', error); Alert.alert('Recording Error', error.message); setRecordingStatus('idle'); } } async function handleStopRecording() { try { setRecordingStatus('processing'); const audioBlob = await audioRecorder.stop(); setLastRecordingSize(audioBlob.size); setLastRecordedBlob(audioBlob); setRecordingStatus('idle'); Alert.alert( 'Recording Complete', `Audio recorded successfully!\nSize: ${audioBlob.size} bytes\nType: ${audioBlob.type}` ); } catch (error: any) { console.error('[AudioTest] Stop recording error:', error); Alert.alert('Recording Error', error.message); setRecordingStatus('idle'); } } async function handlePlayLastRecording() { if (!lastRecordedBlob) { Alert.alert('No Recording', 'Please record audio first'); return; } try { setPlaybackStatus('Playing last recording...'); const duration = await audioPlayer.play(lastRecordedBlob); setPlaybackStatus(`Playback complete (${duration.toFixed(2)}s)`); } catch (error: any) { console.error('[AudioTest] Playback error:', error); Alert.alert('Playback Error', error.message); setPlaybackStatus('Playback failed'); } } async function handlePlayTestAudio() { // Create a test audio blob (silent audio for testing) // In a real scenario, this would be audio from the server try { setPlaybackStatus('Playing test audio...'); // For now, we'll show an alert since we don't have a test audio file Alert.alert( 'Test Audio', 'This would play a test audio file. Try recording and playing back instead.' ); setPlaybackStatus('Test audio not implemented'); } catch (error: any) { console.error('[AudioTest] Test playback error:', error); Alert.alert('Playback Error', error.message); setPlaybackStatus('Test playback failed'); } } function handleStopPlayback() { audioPlayer.stop(); setPlaybackStatus('Playback stopped'); } return ( {/* Header */} Audio Test Test audio recording and playback functionality {/* Permission Status */} Permission Status {permissionGranted ? '✓ Microphone permission granted' : '✗ Microphone permission denied'} {/* Recording Section */} Audio Recording {/* Recording Status */} Status {recordingStatus === 'idle' && 'Ready to record'} {recordingStatus === 'recording' && '🔴 Recording...'} {recordingStatus === 'processing' && 'Processing...'} {/* Recording Controls */} Start Recording Stop Recording {/* Last Recording Info */} {lastRecordingSize !== null && ( Last Recording Size: {lastRecordingSize} bytes Type: audio/m4a )} {/* Playback Section */} Audio Playback {/* Playback Status */} Status {playbackStatus} {/* Playback Controls */} Play Last Recording Play Test Audio Stop Playback {/* Audio Settings Info */} Audio Configuration • Sample Rate: 16000 Hz • Channels: 1 (Mono) • Format: M4A/AAC • Optimized for voice/speech ); }