captureVoiceSample method

  1. @override
Future<void> captureVoiceSample({
  1. Duration duration = const Duration(seconds: 5),
})
override

Record a mic sample, analyze it, and add the resulting HarmonicCapture to the current footprint.

Implementation

@override
Future<void> captureVoiceSample({
  Duration duration = const Duration(seconds: 5),
}) async {
  if (isCapturing.value || isProcessing.value) return;

  try {
    isCapturing.value = true;
    update();

    _accumulatedPcm.clear();

    // Set up audio stream
    _audioStreamController?.close();
    _audioStreamController = StreamController<Uint8List>(sync: true);
    _audioStreamController!.stream.listen((data) {
      _accumulatedPcm.addAll(data);
    });

    // Start recording PCM16 mono to stream
    await _recorder.startRecorder(
      codec: Codec.pcm16,
      sampleRate: _sampleRate,
      numChannels: 1,
      toStream: _audioStreamController!.sink,
    );

    // Wait for the capture duration
    await Future.delayed(duration);

    // Stop recording
    await _recorder.stopRecorder();

    isCapturing.value = false;
    isProcessing.value = true;
    update();

    // Convert PCM16 bytes to normalized doubles
    final samples = _pcmBytesToDoubles(_accumulatedPcm);

    // Process the captured audio
    final capture = await _processAudio(samples, duration.inMilliseconds);
    if (capture != null) {
      _addCaptureToFootprint(capture);
      _captureStreamController.add(capture);
      await _persist();
    }
  } catch (e) {
    debugPrint('[HarmonicFootprint] Capture error: $e');
  } finally {
    isCapturing.value = false;
    isProcessing.value = false;
    update();
  }
}