start method

Future<void> start()

Start recording audio.

Implementation

Future<void> start() async {
  if (_isRecording) return;

  _buffer.clear();
  _startTime = DateTime.now();
  _isRecording = true;

  // Use platform-appropriate recording command.
  if (Platform.isMacOS) {
    _process = await Process.start('rec', [
      '-q', // Quiet
      '-r', '$sampleRate', // Sample rate
      '-c', '1', // Mono
      '-b', '16', // 16-bit
      '-t', _formatExtension(), // Output format
      '-', // Stdout
    ]);
  } else if (Platform.isLinux) {
    _process = await Process.start('arecord', [
      '-q',
      '-r',
      '$sampleRate',
      '-c',
      '1',
      '-f',
      'S16_LE',
      '-t',
      _formatExtension(),
      '-',
    ]);
  } else {
    throw UnsupportedError(
      'Audio recording not supported on ${Platform.operatingSystem}',
    );
  }

  // Collect audio data and compute levels.
  _process!.stdout.listen((data) {
    _buffer.addAll(data);

    // Compute audio level from PCM data.
    if (data.length >= 2) {
      final level = _computeLevel(data);
      _levelController.add(level);
    }
  });

  _process!.stderr.listen((_) {}); // Ignore stderr.
}