Ariver
2026-05-18 14f801be6ea478678209c381fd188d7a58eadf93
VoiceSnapGo/internal/audio/recorder.go
@@ -151,19 +151,21 @@
// Stop stops recording and discards audio data.
func (r *Recorder) Stop() {
   device := r.detachDevice()
   stopAndUninitDevice(device)
   r.mu.Lock()
   defer r.mu.Unlock()
   r.stopDevice()
   r.pcmBuf = nil
}
// StopAndGetSamples stops recording and returns the captured audio as float32 samples.
func (r *Recorder) StopAndGetSamples() []float32 {
   device := r.detachDevice()
   stopAndUninitDevice(device)
   r.mu.Lock()
   defer r.mu.Unlock()
   r.stopDevice()
   if len(r.pcmBuf) < 2 {
      return nil
@@ -203,23 +205,36 @@
// Close releases all audio resources.
func (r *Recorder) Close() {
   device := r.detachDevice()
   stopAndUninitDevice(device)
   r.mu.Lock()
   defer r.mu.Unlock()
   r.stopDevice()
   if r.ctx != nil {
      r.ctx.Free()
      r.ctx = nil
   }
}
func (r *Recorder) stopDevice() {
   if r.device != nil {
      r.device.Stop()
      r.device.Uninit()
func (r *Recorder) detachDevice() *malgo.Device {
   r.mu.Lock()
   defer r.mu.Unlock()
   device := r.device
      r.device = nil
   }
   r.isRecording = false
   return device
}
func stopAndUninitDevice(device *malgo.Device) {
   if device == nil {
      return
   }
   logger.Info("Stopping audio device")
   device.Stop()
   logger.Info("Audio device stopped")
   device.Uninit()
   logger.Info("Audio device uninitialized")
}
func (r *Recorder) onData(input []byte) {