startRecording method
Implementation
Future<String> startRecording({
required Stream<Uint8List> audioStream,
required int sampleRate,
required String deviceName,
String? customFileName,
}) async {
if (_state == RecordingState.recording) {
throw Exception('Recording already in progress');
}
// Reset state
_sampleRate = sampleRate;
_deviceName = deviceName;
_recordingStartTime = DateTime.now();
_pauseStartTime = null;
_pausedDuration = Duration.zero;
// Create recording file
final directory = await getApplicationDocumentsDirectory();
final recordingsDir = Directory(path.join(directory.path, 'recordings'));
if (!recordingsDir.existsSync()) {
recordingsDir.createSync(recursive: true);
}
final fileName = customFileName ??
'recording_${DateTime.now().millisecondsSinceEpoch}.wav';
_currentRecordingFile = File(path.join(recordingsDir.path, fileName));
_currentRecordingSink = _currentRecordingFile!.openWrite();
// Write WAV header (will be updated when recording stops)
await _writeWavHeader(_currentRecordingSink!, 0, sampleRate);
_audioBuffer.clear();
// Listen to audio stream
_audioStreamSubscription = audioStream.listen(
(audioData) {
if (_state == RecordingState.recording) {
_audioBuffer.addAll(audioData);
_currentRecordingSink?.add(audioData);
}
},
onError: (error) {
print('Audio stream error in recording: $error');
_stopRecordingInternal();
_updateState(RecordingState.idle);
},
onDone: () {
print('Audio stream ended');
_stopRecordingInternal();
_updateState(RecordingState.idle);
},
);
_updateState(RecordingState.recording);
// Start duration timer
_startDurationTimer();
return _currentRecordingFile!.path;
}