mirror of https://github.com/jetkvm/kvm.git
178 lines
4.8 KiB
Go
178 lines
4.8 KiB
Go
package audio
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
// Validation errors
|
|
var (
|
|
ErrInvalidAudioQuality = errors.New("invalid audio quality level")
|
|
ErrInvalidFrameSize = errors.New("invalid frame size")
|
|
ErrInvalidFrameData = errors.New("invalid frame data")
|
|
ErrInvalidBufferSize = errors.New("invalid buffer size")
|
|
ErrInvalidPriority = errors.New("invalid priority value")
|
|
ErrInvalidLatency = errors.New("invalid latency value")
|
|
ErrInvalidConfiguration = errors.New("invalid configuration")
|
|
ErrInvalidSocketConfig = errors.New("invalid socket configuration")
|
|
ErrInvalidMetricsInterval = errors.New("invalid metrics interval")
|
|
ErrInvalidSampleRate = errors.New("invalid sample rate")
|
|
ErrInvalidChannels = errors.New("invalid channels")
|
|
)
|
|
|
|
// ValidateAudioQuality validates audio quality enum values
|
|
func ValidateAudioQuality(quality AudioQuality) error {
|
|
switch quality {
|
|
case AudioQualityLow, AudioQualityMedium, AudioQualityHigh, AudioQualityUltra:
|
|
return nil
|
|
default:
|
|
return ErrInvalidAudioQuality
|
|
}
|
|
}
|
|
|
|
// ValidateFrameData validates audio frame data
|
|
func ValidateFrameData(data []byte) error {
|
|
if len(data) == 0 {
|
|
return ErrInvalidFrameData
|
|
}
|
|
// Use a reasonable default if config is not available
|
|
maxFrameSize := 4096
|
|
if config := GetConfig(); config != nil {
|
|
maxFrameSize = config.MaxAudioFrameSize
|
|
}
|
|
if len(data) > maxFrameSize {
|
|
return ErrInvalidFrameSize
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ValidateZeroCopyFrame validates zero-copy audio frame
|
|
func ValidateZeroCopyFrame(frame *ZeroCopyAudioFrame) error {
|
|
if frame == nil {
|
|
return ErrInvalidFrameData
|
|
}
|
|
data := frame.Data()
|
|
if len(data) == 0 {
|
|
return ErrInvalidFrameData
|
|
}
|
|
// Use a reasonable default if config is not available
|
|
maxFrameSize := 4096
|
|
if config := GetConfig(); config != nil {
|
|
maxFrameSize = config.MaxAudioFrameSize
|
|
}
|
|
if len(data) > maxFrameSize {
|
|
return ErrInvalidFrameSize
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ValidateBufferSize validates buffer size parameters
|
|
func ValidateBufferSize(size int) error {
|
|
if size <= 0 {
|
|
return ErrInvalidBufferSize
|
|
}
|
|
// Use a reasonable default if config is not available
|
|
maxBuffer := 262144 // 256KB default
|
|
if config := GetConfig(); config != nil {
|
|
maxBuffer = config.SocketMaxBuffer
|
|
}
|
|
if size > maxBuffer {
|
|
return ErrInvalidBufferSize
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ValidateThreadPriority validates thread priority values
|
|
func ValidateThreadPriority(priority int) error {
|
|
// Use reasonable defaults if config is not available
|
|
minPriority := -20
|
|
maxPriority := 99
|
|
if config := GetConfig(); config != nil {
|
|
minPriority = config.MinNiceValue
|
|
maxPriority = config.RTAudioHighPriority
|
|
}
|
|
if priority < minPriority || priority > maxPriority {
|
|
return ErrInvalidPriority
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ValidateLatency validates latency values
|
|
func ValidateLatency(latency time.Duration) error {
|
|
if latency < 0 {
|
|
return ErrInvalidLatency
|
|
}
|
|
// Use a reasonable default if config is not available
|
|
maxLatency := 500 * time.Millisecond
|
|
if config := GetConfig(); config != nil {
|
|
maxLatency = config.MaxLatency
|
|
}
|
|
if latency > maxLatency {
|
|
return ErrInvalidLatency
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ValidateMetricsInterval validates metrics update interval
|
|
func ValidateMetricsInterval(interval time.Duration) error {
|
|
// Use reasonable defaults if config is not available
|
|
minInterval := 100 * time.Millisecond
|
|
maxInterval := 10 * time.Second
|
|
if config := GetConfig(); config != nil {
|
|
minInterval = config.MinMetricsUpdateInterval
|
|
maxInterval = config.MaxMetricsUpdateInterval
|
|
}
|
|
if interval < minInterval {
|
|
return ErrInvalidMetricsInterval
|
|
}
|
|
if interval > maxInterval {
|
|
return ErrInvalidMetricsInterval
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ValidateAdaptiveBufferConfig validates adaptive buffer configuration
|
|
func ValidateAdaptiveBufferConfig(minSize, maxSize, defaultSize int) error {
|
|
if minSize <= 0 || maxSize <= 0 || defaultSize <= 0 {
|
|
return ErrInvalidBufferSize
|
|
}
|
|
if minSize >= maxSize {
|
|
return ErrInvalidBufferSize
|
|
}
|
|
if defaultSize < minSize || defaultSize > maxSize {
|
|
return ErrInvalidBufferSize
|
|
}
|
|
// Validate against global limits
|
|
maxBuffer := 262144 // 256KB default
|
|
if config := GetConfig(); config != nil {
|
|
maxBuffer = config.SocketMaxBuffer
|
|
}
|
|
if maxSize > maxBuffer {
|
|
return ErrInvalidBufferSize
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ValidateInputIPCConfig validates input IPC configuration
|
|
func ValidateInputIPCConfig(sampleRate, channels, frameSize int) error {
|
|
// Use reasonable defaults if config is not available
|
|
minSampleRate := 8000
|
|
maxSampleRate := 48000
|
|
maxChannels := 8
|
|
if config := GetConfig(); config != nil {
|
|
minSampleRate = config.MinSampleRate
|
|
maxSampleRate = config.MaxSampleRate
|
|
maxChannels = config.MaxChannels
|
|
}
|
|
if sampleRate < minSampleRate || sampleRate > maxSampleRate {
|
|
return ErrInvalidSampleRate
|
|
}
|
|
if channels < 1 || channels > maxChannels {
|
|
return ErrInvalidChannels
|
|
}
|
|
if frameSize <= 0 {
|
|
return ErrInvalidFrameSize
|
|
}
|
|
return nil
|
|
}
|