mirror of https://github.com/jetkvm/kvm.git
97 lines
2.7 KiB
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()
|
|
}
|