startRecording method

Future<String> startRecording({
  1. required Stream<Uint8List> audioStream,
  2. required int sampleRate,
  3. required String deviceName,
  4. String? customFileName,
})

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