Skip to content

Commit

Permalink
feat: Add buffer cleanup method for audio sources
Browse files Browse the repository at this point in the history
- Introduce CleanupAnalysisBuffers to safely remove and reset audio analysis buffers
- Refactor buffer initialization in realtime analysis with new initializeBuffers function
- Improve error handling during audio source buffer setup
- Add graceful error recovery for buffer initialization failures
- Enhance logging for audio source configuration scenarios
  • Loading branch information
tphakala committed Feb 9, 2025
1 parent 3efa797 commit a6844e8
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 10 deletions.
32 changes: 22 additions & 10 deletions internal/analysis/realtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,13 @@ func RealtimeAnalysis(settings *conf.Settings, notificationChan chan handlers.No
sources = append(sources, "malgo")
}

// Initialize analysis buffers for each audio source
err := myaudio.InitAnalysisBuffers(conf.BufferSize*3, sources) // 3x buffer size to avoid underruns
if err != nil {
log.Printf("❌ Error initializing analysis buffers: %v", err)
return err
}
// Initialize capture buffers for each audio source
err = myaudio.InitCaptureBuffers(60, conf.SampleRate, conf.BitDepth/8, sources)
if err != nil {
log.Printf("❌ Error initializing capture buffers: %v", err)
// Initialize buffers for all audio sources
if err := initializeBuffers(sources); err != nil {
log.Printf("❌ %v", err)
return err
}
} else {
log.Println("⚠️ Starting without active audio sources. You can configure audio devices or RTSP streams through the web interface.")
}

// init detection queue
Expand Down Expand Up @@ -440,3 +435,20 @@ func startControlMonitor(wg *sync.WaitGroup, controlChan chan string, quitChan,
}
}()
}

// initializeBuffers handles initialization of all audio-related buffers
func initializeBuffers(sources []string) error {
// Initialize analysis buffers
if err := myaudio.InitAnalysisBuffers(conf.BufferSize*3, sources); err != nil { // 3x buffer size to avoid underruns
return fmt.Errorf("failed to initialize analysis buffers: %w", err)
}

// Initialize capture buffers
if err := myaudio.InitCaptureBuffers(60, conf.SampleRate, conf.BitDepth/8, sources); err != nil {
// Cleanup analysis buffers on failure
myaudio.CleanupAnalysisBuffers()
return fmt.Errorf("failed to initialize capture buffers: %w", err)
}

return nil
}
19 changes: 19 additions & 0 deletions internal/myaudio/analysis_buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,25 @@ func InitAnalysisBuffers(capacity int, sources []string) error {
return nil
}

// CleanupAnalysisBuffers removes and cleans up all analysis buffers.
func CleanupAnalysisBuffers() {
abMutex.Lock()
defer abMutex.Unlock()

// Clean up each buffer
for source, ab := range analysisBuffers {
ab.Reset()
delete(analysisBuffers, source)
delete(prevData, source)
delete(warningCounter, source)
}

// Reset the maps
analysisBuffers = make(map[string]*ringbuffer.RingBuffer)
prevData = make(map[string][]byte)
warningCounter = make(map[string]int)
}

// WriteToAnalysisBuffer writes audio data into the ring buffer for a given stream.
func WriteToAnalysisBuffer(stream string, data []byte) error {
abMutex.RLock()
Expand Down

0 comments on commit a6844e8

Please sign in to comment.