captureVoiceSample method
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();
}
}