kvm/internal/audio/nonblocking_api.go

97 lines
2.7 KiB
Go

package audio
import (
"sync"
)
var (
globalNonBlockingManager *NonBlockingAudioManager
managerMutex sync.Mutex
)
// StartNonBlockingAudioStreaming starts the non-blocking audio streaming system
func StartNonBlockingAudioStreaming(send func([]byte)) error {
managerMutex.Lock()
defer managerMutex.Unlock()
if globalNonBlockingManager != nil && globalNonBlockingManager.IsOutputRunning() {
return nil // Already running, this is not an error
}
if globalNonBlockingManager == nil {
globalNonBlockingManager = NewNonBlockingAudioManager()
}
return globalNonBlockingManager.StartAudioOutput(send)
}
// StartNonBlockingAudioInput starts the non-blocking audio input system
func StartNonBlockingAudioInput(receiveChan <-chan []byte) error {
managerMutex.Lock()
defer managerMutex.Unlock()
if globalNonBlockingManager == nil {
globalNonBlockingManager = NewNonBlockingAudioManager()
}
// Check if input is already running to avoid unnecessary operations
if globalNonBlockingManager.IsInputRunning() {
return nil // Already running, this is not an error
}
return globalNonBlockingManager.StartAudioInput(receiveChan)
}
// StopNonBlockingAudioStreaming stops the non-blocking audio streaming system
func StopNonBlockingAudioStreaming() {
managerMutex.Lock()
defer managerMutex.Unlock()
if globalNonBlockingManager != nil {
globalNonBlockingManager.Stop()
globalNonBlockingManager = nil
}
}
// StopNonBlockingAudioInput stops only the audio input without affecting output
func StopNonBlockingAudioInput() {
managerMutex.Lock()
defer managerMutex.Unlock()
if globalNonBlockingManager != nil && globalNonBlockingManager.IsInputRunning() {
globalNonBlockingManager.StopAudioInput()
// If both input and output are stopped, recreate manager to ensure clean state
if !globalNonBlockingManager.IsRunning() {
globalNonBlockingManager = nil
}
}
}
// GetNonBlockingAudioStats returns statistics from the non-blocking audio system
func GetNonBlockingAudioStats() NonBlockingAudioStats {
managerMutex.Lock()
defer managerMutex.Unlock()
if globalNonBlockingManager != nil {
return globalNonBlockingManager.GetStats()
}
return NonBlockingAudioStats{}
}
// IsNonBlockingAudioRunning returns true if the non-blocking audio system is running
func IsNonBlockingAudioRunning() bool {
managerMutex.Lock()
defer managerMutex.Unlock()
return globalNonBlockingManager != nil && globalNonBlockingManager.IsRunning()
}
// IsNonBlockingAudioInputRunning returns true if the non-blocking audio input is running
func IsNonBlockingAudioInputRunning() bool {
managerMutex.Lock()
defer managerMutex.Unlock()
return globalNonBlockingManager != nil && globalNonBlockingManager.IsInputRunning()
}