mirror of
https://github.com/jetkvm/kvm.git
synced 2025-09-16 08:38:14 +00:00
This change replaces all instances of GetConfig() function calls with direct access to the Config variable throughout the audio package. The modification improves performance by eliminating function call overhead and simplifies the codebase by removing unnecessary indirection. The commit also includes minor optimizations in validation logic and connection handling, while maintaining all existing functionality. Error handling remains robust with appropriate fallbacks when config values are not available. Additional improvements include: - Enhanced connection health monitoring in UnifiedAudioClient - Optimized validation functions using cached config values - Reduced memory allocations in hot paths - Improved error recovery during quality changes
712 lines
35 KiB
Go
712 lines
35 KiB
Go
package audio
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/jetkvm/kvm/internal/logging"
|
|
)
|
|
|
|
// AudioConfigConstants centralizes all hardcoded values used across audio components.
|
|
// This configuration system allows runtime tuning of audio performance, quality, and resource usage.
|
|
type AudioConfigConstants struct {
|
|
// Audio Quality Presets
|
|
MaxAudioFrameSize int // Maximum audio frame size in bytes (default: 4096)
|
|
MaxPCMBufferSize int // Maximum PCM buffer size in bytes for separate buffer optimization
|
|
|
|
// Opus Encoding Parameters
|
|
OpusBitrate int // Target bitrate for Opus encoding in bps (default: 128000)
|
|
OpusComplexity int // Computational complexity 0-10 (default: 10 for best quality)
|
|
OpusVBR int // Variable Bit Rate: 0=CBR, 1=VBR (default: 1)
|
|
OpusVBRConstraint int // VBR constraint: 0=unconstrained, 1=constrained (default: 0)
|
|
OpusDTX int // Discontinuous Transmission: 0=disabled, 1=enabled (default: 0)
|
|
|
|
// Audio Parameters
|
|
SampleRate int // Audio sampling frequency in Hz (default: 48000)
|
|
Channels int // Number of audio channels: 1=mono, 2=stereo (default: 2)
|
|
FrameSize int // Samples per audio frame (default: 960 for 20ms at 48kHz)
|
|
MaxPacketSize int // Maximum encoded packet size in bytes (default: 4000)
|
|
|
|
// Audio Quality Bitrates (kbps)
|
|
AudioQualityLowOutputBitrate int // Low-quality output bitrate (default: 32)
|
|
AudioQualityLowInputBitrate int // Low-quality input bitrate (default: 16)
|
|
AudioQualityMediumOutputBitrate int // Medium-quality output bitrate (default: 64)
|
|
AudioQualityMediumInputBitrate int // Medium-quality input bitrate (default: 32)
|
|
AudioQualityHighOutputBitrate int // High-quality output bitrate (default: 128)
|
|
AudioQualityHighInputBitrate int // High-quality input bitrate (default: 64)
|
|
AudioQualityUltraOutputBitrate int // Ultra-quality output bitrate (default: 192)
|
|
AudioQualityUltraInputBitrate int // Ultra-quality input bitrate (default: 96)
|
|
|
|
// Audio Quality Sample Rates (Hz)
|
|
AudioQualityLowSampleRate int // Low-quality sample rate (default: 22050)
|
|
AudioQualityMediumSampleRate int // Medium-quality sample rate (default: 44100)
|
|
AudioQualityMicLowSampleRate int // Low-quality microphone sample rate (default: 16000)
|
|
|
|
// Audio Quality Frame Sizes
|
|
AudioQualityLowFrameSize time.Duration // Low-quality frame duration (default: 40ms)
|
|
AudioQualityMediumFrameSize time.Duration // Medium-quality frame duration (default: 20ms)
|
|
AudioQualityHighFrameSize time.Duration // High-quality frame duration (default: 20ms)
|
|
|
|
AudioQualityUltraFrameSize time.Duration // Ultra-quality frame duration (default: 10ms)
|
|
|
|
// Audio Quality Channels
|
|
AudioQualityLowChannels int // Low-quality channel count (default: 1)
|
|
AudioQualityMediumChannels int // Medium-quality channel count (default: 2)
|
|
AudioQualityHighChannels int // High-quality channel count (default: 2)
|
|
AudioQualityUltraChannels int // Ultra-quality channel count (default: 2)
|
|
|
|
// Audio Quality OPUS Encoder Parameters
|
|
AudioQualityLowOpusComplexity int // Low-quality OPUS complexity (default: 1)
|
|
AudioQualityLowOpusVBR int // Low-quality OPUS VBR setting (default: 0)
|
|
AudioQualityLowOpusSignalType int // Low-quality OPUS signal type (default: 3001)
|
|
AudioQualityLowOpusBandwidth int // Low-quality OPUS bandwidth (default: 1101)
|
|
AudioQualityLowOpusDTX int // Low-quality OPUS DTX setting (default: 1)
|
|
|
|
AudioQualityMediumOpusComplexity int // Medium-quality OPUS complexity (default: 5)
|
|
AudioQualityMediumOpusVBR int // Medium-quality OPUS VBR setting (default: 1)
|
|
AudioQualityMediumOpusSignalType int // Medium-quality OPUS signal type (default: 3002)
|
|
AudioQualityMediumOpusBandwidth int // Medium-quality OPUS bandwidth (default: 1103)
|
|
AudioQualityMediumOpusDTX int // Medium-quality OPUS DTX setting (default: 0)
|
|
|
|
AudioQualityHighOpusComplexity int // High-quality OPUS complexity (default: 8)
|
|
AudioQualityHighOpusVBR int // High-quality OPUS VBR setting (default: 1)
|
|
AudioQualityHighOpusSignalType int // High-quality OPUS signal type (default: 3002)
|
|
AudioQualityHighOpusBandwidth int // High-quality OPUS bandwidth (default: 1104)
|
|
AudioQualityHighOpusDTX int // High-quality OPUS DTX setting (default: 0)
|
|
|
|
AudioQualityUltraOpusComplexity int // Ultra-quality OPUS complexity (default: 10)
|
|
AudioQualityUltraOpusVBR int // Ultra-quality OPUS VBR setting (default: 1)
|
|
AudioQualityUltraOpusSignalType int // Ultra-quality OPUS signal type (default: 3002)
|
|
AudioQualityUltraOpusBandwidth int // Ultra-quality OPUS bandwidth (default: 1105)
|
|
AudioQualityUltraOpusDTX int // Ultra-quality OPUS DTX setting (default: 0)
|
|
|
|
// CGO Audio Constants
|
|
CGOOpusBitrate int // Native Opus encoder bitrate in bps (default: 96000)
|
|
|
|
CGOOpusComplexity int // Computational complexity for native Opus encoder (0-10)
|
|
CGOOpusVBR int // Variable Bit Rate in native Opus encoder (0=CBR, 1=VBR)
|
|
CGOOpusVBRConstraint int // Constrained VBR in native encoder (0/1)
|
|
CGOOpusSignalType int // Signal type hint for native Opus encoder
|
|
CGOOpusBandwidth int // Frequency bandwidth for native Opus encoder
|
|
CGOOpusDTX int // Discontinuous Transmission in native encoder (0/1)
|
|
CGOSampleRate int // Sample rate for native audio processing (Hz)
|
|
CGOChannels int // Channel count for native audio processing
|
|
CGOFrameSize int // Frame size for native Opus processing (samples)
|
|
CGOMaxPacketSize int // Maximum packet size for native encoding (bytes)
|
|
|
|
// Input IPC Constants
|
|
InputIPCSampleRate int // Sample rate for input IPC audio processing (Hz)
|
|
InputIPCChannels int // Channel count for input IPC audio processing
|
|
InputIPCFrameSize int // Frame size for input IPC processing (samples)
|
|
|
|
// Output IPC Constants
|
|
OutputMaxFrameSize int // Maximum frame size for output processing (bytes)
|
|
OutputHeaderSize int // Size of output message headers (bytes)
|
|
|
|
OutputMessagePoolSize int // Output message pool size (128)
|
|
|
|
// Socket Buffer Constants
|
|
SocketOptimalBuffer int // Optimal socket buffer size (128KB)
|
|
SocketMaxBuffer int // Maximum socket buffer size (256KB)
|
|
SocketMinBuffer int // Minimum socket buffer size (32KB)
|
|
|
|
// Process Management
|
|
MaxRestartAttempts int // Maximum restart attempts (5)
|
|
RestartWindow time.Duration // Restart attempt window (5m)
|
|
RestartDelay time.Duration // Initial restart delay (2s)
|
|
MaxRestartDelay time.Duration // Maximum restart delay (30s)
|
|
|
|
// Buffer Management
|
|
|
|
PreallocSize int
|
|
MaxPoolSize int
|
|
MessagePoolSize int
|
|
OptimalSocketBuffer int
|
|
MaxSocketBuffer int
|
|
MinSocketBuffer int
|
|
ChannelBufferSize int
|
|
AudioFramePoolSize int
|
|
PageSize int
|
|
InitialBufferFrames int
|
|
BytesToMBDivisor int
|
|
MinReadEncodeBuffer int
|
|
MaxDecodeWriteBuffer int
|
|
MinBatchSizeForThreadPinning int
|
|
GoroutineMonitorInterval time.Duration
|
|
MagicNumber uint32
|
|
MaxFrameSize int
|
|
WriteTimeout time.Duration
|
|
HeaderSize int
|
|
MetricsUpdateInterval time.Duration
|
|
WarmupSamples int
|
|
MetricsChannelBuffer int
|
|
LatencyHistorySize int
|
|
MaxCPUPercent float64
|
|
MinCPUPercent float64
|
|
DefaultClockTicks float64
|
|
DefaultMemoryGB int
|
|
MaxWarmupSamples int
|
|
WarmupCPUSamples int
|
|
LogThrottleIntervalSec int
|
|
MinValidClockTicks int
|
|
MaxValidClockTicks int
|
|
CPUFactor float64
|
|
MemoryFactor float64
|
|
LatencyFactor float64
|
|
|
|
// Adaptive Buffer Configuration
|
|
AdaptiveMinBufferSize int // Minimum buffer size in frames for adaptive buffering
|
|
AdaptiveMaxBufferSize int // Maximum buffer size in frames for adaptive buffering
|
|
AdaptiveDefaultBufferSize int // Default buffer size in frames for adaptive buffering
|
|
|
|
// Timing Configuration
|
|
RetryDelay time.Duration // Retry delay
|
|
MaxRetryDelay time.Duration // Maximum retry delay
|
|
BackoffMultiplier float64 // Backoff multiplier
|
|
MaxConsecutiveErrors int // Maximum consecutive errors
|
|
DefaultSleepDuration time.Duration // 100ms
|
|
ShortSleepDuration time.Duration // 10ms
|
|
LongSleepDuration time.Duration // 200ms
|
|
DefaultTickerInterval time.Duration // 100ms
|
|
BufferUpdateInterval time.Duration // 500ms
|
|
InputSupervisorTimeout time.Duration // 5s
|
|
OutputSupervisorTimeout time.Duration // 5s
|
|
BatchProcessingDelay time.Duration // 10ms
|
|
|
|
AdaptiveOptimizerStability time.Duration // 10s
|
|
LatencyMonitorTarget time.Duration // 50ms
|
|
|
|
// Adaptive Buffer Configuration
|
|
// LowCPUThreshold defines CPU usage threshold for buffer size reduction.
|
|
LowCPUThreshold float64 // 20% CPU threshold for buffer optimization
|
|
|
|
// HighCPUThreshold defines CPU usage threshold for buffer size increase.
|
|
HighCPUThreshold float64 // 60% CPU threshold
|
|
LowMemoryThreshold float64 // 50% memory threshold
|
|
HighMemoryThreshold float64 // 75% memory threshold
|
|
AdaptiveBufferTargetLatency time.Duration // 20ms target latency
|
|
CooldownPeriod time.Duration // 30s cooldown period
|
|
RollbackThreshold time.Duration // 300ms rollback threshold
|
|
AdaptiveOptimizerLatencyTarget time.Duration // 50ms latency target
|
|
MaxLatencyThreshold time.Duration // 200ms max latency
|
|
JitterThreshold time.Duration // 20ms jitter threshold
|
|
LatencyOptimizationInterval time.Duration // 5s optimization interval
|
|
LatencyAdaptiveThreshold float64 // 0.8 adaptive threshold
|
|
MicContentionTimeout time.Duration // 200ms contention timeout
|
|
PreallocPercentage int // 20% preallocation percentage
|
|
BackoffStart time.Duration // 50ms initial backoff
|
|
|
|
InputMagicNumber uint32 // Magic number for input IPC messages (0x4A4B4D49 "JKMI")
|
|
|
|
OutputMagicNumber uint32 // Magic number for output IPC messages (0x4A4B4F55 "JKOU")
|
|
|
|
// Calculation Constants
|
|
PercentageMultiplier float64 // Multiplier for percentage calculations (100.0)
|
|
AveragingWeight float64 // Weight for weighted averaging (0.7)
|
|
ScalingFactor float64 // General scaling factor (1.5)
|
|
SmoothingFactor float64 // Smoothing factor for adaptive buffers (0.3)
|
|
CPUMemoryWeight float64 // Weight for CPU factor in calculations (0.5)
|
|
MemoryWeight float64 // Weight for memory factor (0.3)
|
|
LatencyWeight float64 // Weight for latency factor (0.2)
|
|
PoolGrowthMultiplier int // Multiplier for pool size growth (2)
|
|
LatencyScalingFactor float64 // Scaling factor for latency calculations (2.0)
|
|
OptimizerAggressiveness float64 // Aggressiveness level for optimization (0.7)
|
|
|
|
// CGO Audio Processing Constants
|
|
CGOUsleepMicroseconds int // Sleep duration for CGO usleep calls (1000μs)
|
|
|
|
CGOPCMBufferSize int // PCM buffer size for CGO audio processing
|
|
CGONanosecondsPerSecond float64 // Nanoseconds per second conversion
|
|
FrontendOperationDebounceMS int // Frontend operation debounce delay
|
|
FrontendSyncDebounceMS int // Frontend sync debounce delay
|
|
FrontendSampleRate int // Frontend sample rate
|
|
FrontendRetryDelayMS int // Frontend retry delay
|
|
FrontendShortDelayMS int // Frontend short delay
|
|
FrontendLongDelayMS int // Frontend long delay
|
|
FrontendSyncDelayMS int // Frontend sync delay
|
|
FrontendMaxRetryAttempts int // Frontend max retry attempts
|
|
FrontendAudioLevelUpdateMS int // Frontend audio level update interval
|
|
FrontendFFTSize int // Frontend FFT size
|
|
FrontendAudioLevelMax int // Frontend max audio level
|
|
FrontendReconnectIntervalMS int // Frontend reconnect interval
|
|
FrontendSubscriptionDelayMS int // Frontend subscription delay
|
|
FrontendDebugIntervalMS int // Frontend debug interval
|
|
|
|
// Process Monitoring Constants
|
|
ProcessMonitorDefaultMemoryGB int // Default memory size for fallback (4GB)
|
|
ProcessMonitorKBToBytes int // KB to bytes conversion factor (1024)
|
|
ProcessMonitorDefaultClockHz float64 // Default system clock frequency (250.0 Hz)
|
|
ProcessMonitorFallbackClockHz float64 // Fallback clock frequency (1000.0 Hz)
|
|
ProcessMonitorTraditionalHz float64 // Traditional system clock frequency (100.0 Hz)
|
|
|
|
// Batch Processing Constants
|
|
BatchProcessorFramesPerBatch int // Frames processed per batch (4)
|
|
BatchProcessorTimeout time.Duration // Batch processing timeout (5ms)
|
|
BatchProcessorMaxQueueSize int // Maximum batch queue size (16)
|
|
BatchProcessorAdaptiveThreshold float64 // Adaptive batch sizing threshold (0.8)
|
|
BatchProcessorThreadPinningThreshold int // Thread pinning threshold (8 frames)
|
|
|
|
// Output Streaming Constants
|
|
OutputStreamingFrameIntervalMS int // Output frame interval (20ms for 50 FPS)
|
|
|
|
// IPC Constants
|
|
IPCInitialBufferFrames int // Initial IPC buffer size (500 frames)
|
|
|
|
EventTimeoutSeconds int
|
|
EventTimeFormatString string
|
|
EventSubscriptionDelayMS int
|
|
InputProcessingTimeoutMS int
|
|
AdaptiveBufferCPUMultiplier int
|
|
AdaptiveBufferMemoryMultiplier int
|
|
InputSocketName string
|
|
OutputSocketName string
|
|
AudioInputComponentName string
|
|
AudioOutputComponentName string
|
|
AudioServerComponentName string
|
|
AudioRelayComponentName string
|
|
AudioEventsComponentName string
|
|
|
|
TestSocketTimeout time.Duration
|
|
TestBufferSize int
|
|
TestRetryDelay time.Duration
|
|
LatencyHistogramMaxSamples int
|
|
LatencyPercentile50 int
|
|
LatencyPercentile95 int
|
|
LatencyPercentile99 int
|
|
BufferPoolMaxOperations int
|
|
HitRateCalculationBase float64
|
|
MaxLatency time.Duration
|
|
MinMetricsUpdateInterval time.Duration
|
|
MaxMetricsUpdateInterval time.Duration
|
|
MinSampleRate int
|
|
MaxSampleRate int
|
|
MaxChannels int
|
|
|
|
// CGO Constants
|
|
CGOMaxBackoffMicroseconds int // Maximum CGO backoff time (500ms)
|
|
CGOMaxAttempts int // Maximum CGO retry attempts (5)
|
|
|
|
// Frame Duration Validation
|
|
MinFrameDuration time.Duration // Minimum frame duration (10ms)
|
|
MaxFrameDuration time.Duration // Maximum frame duration (100ms)
|
|
|
|
// Valid Sample Rates
|
|
// Validation Constants
|
|
ValidSampleRates []int // Supported sample rates (8kHz to 48kHz)
|
|
MinOpusBitrate int // Minimum Opus bitrate (6000 bps)
|
|
MaxOpusBitrate int // Maximum Opus bitrate (510000 bps)
|
|
MaxValidationTime time.Duration // Validation timeout (5s)
|
|
MinFrameSize int // Minimum frame size (64 bytes)
|
|
FrameSizeTolerance int // Frame size tolerance (512 bytes)
|
|
|
|
// Latency Histogram Buckets
|
|
LatencyBucket10ms time.Duration // 10ms latency bucket
|
|
LatencyBucket25ms time.Duration // 25ms latency bucket
|
|
LatencyBucket50ms time.Duration // 50ms latency bucket
|
|
LatencyBucket100ms time.Duration // 100ms latency bucket
|
|
LatencyBucket250ms time.Duration // 250ms latency bucket
|
|
LatencyBucket500ms time.Duration // 500ms latency bucket
|
|
LatencyBucket1s time.Duration // 1s latency bucket
|
|
LatencyBucket2s time.Duration // 2s latency bucket
|
|
|
|
MaxAudioProcessorWorkers int
|
|
MaxAudioReaderWorkers int
|
|
AudioProcessorQueueSize int
|
|
AudioReaderQueueSize int
|
|
WorkerMaxIdleTime time.Duration
|
|
|
|
// Connection Retry Configuration
|
|
MaxConnectionAttempts int // Maximum connection retry attempts
|
|
ConnectionRetryDelay time.Duration // Initial connection retry delay
|
|
MaxConnectionRetryDelay time.Duration // Maximum connection retry delay
|
|
ConnectionBackoffFactor float64 // Connection retry backoff factor
|
|
ConnectionTimeoutDelay time.Duration // Connection timeout for each attempt
|
|
ReconnectionInterval time.Duration // Interval for automatic reconnection attempts
|
|
HealthCheckInterval time.Duration // Health check interval for connections
|
|
}
|
|
|
|
// DefaultAudioConfig returns the default configuration constants
|
|
// These values are carefully chosen based on JetKVM's embedded ARM environment,
|
|
// real-time audio requirements, and extensive testing for optimal performance.
|
|
func DefaultAudioConfig() *AudioConfigConstants {
|
|
return &AudioConfigConstants{
|
|
// Audio Quality Presets
|
|
MaxAudioFrameSize: 4096,
|
|
MaxPCMBufferSize: 8192, // Default PCM buffer size (2x MaxAudioFrameSize for safety)
|
|
|
|
// Opus Encoding Parameters
|
|
OpusBitrate: 128000,
|
|
OpusComplexity: 10,
|
|
OpusVBR: 1,
|
|
OpusVBRConstraint: 0,
|
|
OpusDTX: 0,
|
|
|
|
// Audio Parameters
|
|
SampleRate: 48000,
|
|
Channels: 2,
|
|
FrameSize: 960,
|
|
MaxPacketSize: 4000,
|
|
|
|
AudioQualityLowOutputBitrate: 32,
|
|
AudioQualityLowInputBitrate: 16,
|
|
AudioQualityMediumOutputBitrate: 48,
|
|
AudioQualityMediumInputBitrate: 24,
|
|
AudioQualityHighOutputBitrate: 64,
|
|
AudioQualityHighInputBitrate: 32,
|
|
AudioQualityUltraOutputBitrate: 96,
|
|
AudioQualityUltraInputBitrate: 48,
|
|
AudioQualityLowSampleRate: 48000,
|
|
AudioQualityMediumSampleRate: 48000,
|
|
AudioQualityMicLowSampleRate: 16000,
|
|
AudioQualityLowFrameSize: 20 * time.Millisecond,
|
|
AudioQualityMediumFrameSize: 20 * time.Millisecond,
|
|
AudioQualityHighFrameSize: 20 * time.Millisecond,
|
|
|
|
AudioQualityUltraFrameSize: 20 * time.Millisecond, // Ultra-quality frame duration
|
|
|
|
// Audio Quality Channels
|
|
AudioQualityLowChannels: 1, // Mono for low quality
|
|
AudioQualityMediumChannels: 2, // Stereo for medium quality
|
|
AudioQualityHighChannels: 2, // Stereo for high quality
|
|
AudioQualityUltraChannels: 2, // Stereo for ultra quality
|
|
|
|
// Audio Quality OPUS Parameters
|
|
AudioQualityLowOpusComplexity: 0, // Low complexity
|
|
AudioQualityLowOpusVBR: 1, // VBR enabled
|
|
AudioQualityLowOpusSignalType: 3001, // OPUS_SIGNAL_VOICE
|
|
AudioQualityLowOpusBandwidth: 1101, // OPUS_BANDWIDTH_NARROWBAND
|
|
AudioQualityLowOpusDTX: 1, // DTX enabled
|
|
|
|
AudioQualityMediumOpusComplexity: 1, // Low complexity
|
|
AudioQualityMediumOpusVBR: 1, // VBR enabled
|
|
AudioQualityMediumOpusSignalType: 3001, // OPUS_SIGNAL_VOICE
|
|
AudioQualityMediumOpusBandwidth: 1102, // OPUS_BANDWIDTH_MEDIUMBAND
|
|
AudioQualityMediumOpusDTX: 1, // DTX enabled
|
|
|
|
AudioQualityHighOpusComplexity: 2, // Medium complexity
|
|
AudioQualityHighOpusVBR: 1, // VBR enabled
|
|
AudioQualityHighOpusSignalType: 3002, // OPUS_SIGNAL_MUSIC
|
|
AudioQualityHighOpusBandwidth: 1103, // OPUS_BANDWIDTH_WIDEBAND
|
|
AudioQualityHighOpusDTX: 0, // DTX disabled
|
|
|
|
AudioQualityUltraOpusComplexity: 3, // Higher complexity
|
|
AudioQualityUltraOpusVBR: 1, // VBR enabled
|
|
AudioQualityUltraOpusSignalType: 3002, // OPUS_SIGNAL_MUSIC
|
|
AudioQualityUltraOpusBandwidth: 1103, // OPUS_BANDWIDTH_WIDEBAND
|
|
AudioQualityUltraOpusDTX: 0, // DTX disabled
|
|
|
|
// CGO Audio Constants - Optimized for RV1106 native audio processing
|
|
CGOOpusBitrate: 64000, // Reduced for RV1106 efficiency
|
|
CGOOpusComplexity: 2, // Minimal complexity for RV1106
|
|
CGOOpusVBR: 1,
|
|
CGOOpusVBRConstraint: 1,
|
|
CGOOpusSignalType: 3002, // OPUS_SIGNAL_MUSIC
|
|
CGOOpusBandwidth: 1103, // OPUS_BANDWIDTH_WIDEBAND for RV1106
|
|
CGOOpusDTX: 0,
|
|
CGOSampleRate: 48000,
|
|
CGOChannels: 2,
|
|
CGOFrameSize: 960,
|
|
CGOMaxPacketSize: 1200, // Reduced for RV1106 memory efficiency
|
|
|
|
// Input IPC Constants
|
|
InputIPCSampleRate: 48000, // Input IPC sample rate (48kHz)
|
|
InputIPCChannels: 2, // Input IPC channels (stereo)
|
|
InputIPCFrameSize: 960, // Input IPC frame size (960 samples)
|
|
|
|
// Output IPC Constants
|
|
OutputMaxFrameSize: 4096, // Maximum output frame size
|
|
OutputHeaderSize: 17, // Output frame header size
|
|
|
|
OutputMessagePoolSize: 128, // Output message pool size
|
|
|
|
// Socket Buffer Constants
|
|
SocketOptimalBuffer: 131072, // 128KB optimal socket buffer
|
|
SocketMaxBuffer: 262144, // 256KB maximum socket buffer
|
|
SocketMinBuffer: 32768, // 32KB minimum socket buffer
|
|
|
|
// Process Management
|
|
MaxRestartAttempts: 5, // Maximum restart attempts
|
|
|
|
RestartWindow: 5 * time.Minute, // Time window for restart attempt counting
|
|
RestartDelay: 1 * time.Second, // Initial delay before restart attempts
|
|
MaxRestartDelay: 30 * time.Second, // Maximum delay for exponential backoff
|
|
|
|
// Buffer Management
|
|
PreallocSize: 1024 * 1024, // 1MB buffer preallocation
|
|
MaxPoolSize: 100, // Maximum object pool size
|
|
MessagePoolSize: 512, // Increased message pool for quality change bursts
|
|
OptimalSocketBuffer: 262144, // 256KB optimal socket buffer
|
|
MaxSocketBuffer: 1048576, // 1MB maximum socket buffer
|
|
MinSocketBuffer: 8192, // 8KB minimum socket buffer
|
|
ChannelBufferSize: 1000, // Increased channel buffer for quality change bursts
|
|
AudioFramePoolSize: 1500, // Audio frame object pool size
|
|
PageSize: 4096, // Memory page size for alignment
|
|
InitialBufferFrames: 500, // Initial buffer size during startup
|
|
BytesToMBDivisor: 1024 * 1024, // Byte to megabyte conversion
|
|
MinReadEncodeBuffer: 1276, // Minimum CGO read/encode buffer
|
|
MaxDecodeWriteBuffer: 4096, // Maximum CGO decode/write buffer
|
|
|
|
// IPC Configuration - Balanced for stability
|
|
MagicNumber: 0xDEADBEEF, // IPC message validation header
|
|
MaxFrameSize: 4096, // Maximum audio frame size (4KB)
|
|
WriteTimeout: 500 * time.Millisecond, // Increased timeout to handle quality change bursts
|
|
HeaderSize: 8, // IPC message header size
|
|
|
|
// Monitoring and Metrics - Balanced for stability
|
|
MetricsUpdateInterval: 1000 * time.Millisecond, // Stable metrics collection frequency
|
|
WarmupSamples: 10, // Adequate warmup samples for accuracy
|
|
MetricsChannelBuffer: 100, // Adequate metrics data channel buffer
|
|
LatencyHistorySize: 100, // Adequate latency measurements to keep
|
|
|
|
// Process Monitoring Constants
|
|
MaxCPUPercent: 100.0, // Maximum CPU percentage
|
|
MinCPUPercent: 0.01, // Minimum CPU percentage
|
|
DefaultClockTicks: 250.0, // Default clock ticks for embedded ARM systems
|
|
DefaultMemoryGB: 8, // Default memory in GB
|
|
MaxWarmupSamples: 3, // Maximum warmup samples
|
|
WarmupCPUSamples: 2, // CPU warmup samples
|
|
LogThrottleIntervalSec: 10, // Log throttle interval in seconds
|
|
MinValidClockTicks: 50, // Minimum valid clock ticks
|
|
MaxValidClockTicks: 1000, // Maximum valid clock ticks
|
|
|
|
// Performance Tuning
|
|
CPUFactor: 0.7, // CPU weight in performance calculations
|
|
MemoryFactor: 0.8, // Memory weight in performance calculations
|
|
LatencyFactor: 0.9, // Latency weight in performance calculations
|
|
|
|
// Error Handling
|
|
RetryDelay: 100 * time.Millisecond, // Initial retry delay
|
|
MaxRetryDelay: 5 * time.Second, // Maximum retry delay
|
|
BackoffMultiplier: 2.0, // Exponential backoff multiplier
|
|
MaxConsecutiveErrors: 5, // Consecutive error threshold
|
|
|
|
// Connection Retry Configuration
|
|
MaxConnectionAttempts: 15, // Maximum connection retry attempts
|
|
ConnectionRetryDelay: 50 * time.Millisecond, // Initial connection retry delay
|
|
MaxConnectionRetryDelay: 2 * time.Second, // Maximum connection retry delay
|
|
ConnectionBackoffFactor: 1.5, // Connection retry backoff factor
|
|
ConnectionTimeoutDelay: 5 * time.Second, // Connection timeout for each attempt
|
|
ReconnectionInterval: 30 * time.Second, // Interval for automatic reconnection attempts
|
|
HealthCheckInterval: 10 * time.Second, // Health check interval for connections
|
|
|
|
// Timing Constants - Optimized for quality change stability
|
|
DefaultSleepDuration: 100 * time.Millisecond, // Balanced polling interval
|
|
ShortSleepDuration: 10 * time.Millisecond, // Balanced high-frequency polling
|
|
LongSleepDuration: 200 * time.Millisecond, // Balanced background task delay
|
|
DefaultTickerInterval: 100 * time.Millisecond, // Balanced periodic task interval
|
|
BufferUpdateInterval: 300 * time.Millisecond, // Faster buffer updates for quality changes
|
|
InputSupervisorTimeout: 5 * time.Second, // Input monitoring timeout
|
|
OutputSupervisorTimeout: 5 * time.Second, // Output monitoring timeout
|
|
BatchProcessingDelay: 5 * time.Millisecond, // Reduced batch processing delay
|
|
AdaptiveOptimizerStability: 5 * time.Second, // Faster adaptive stability period
|
|
|
|
LatencyMonitorTarget: 50 * time.Millisecond, // Balanced target latency for monitoring
|
|
|
|
// Adaptive Buffer Configuration - Optimized for low latency
|
|
LowCPUThreshold: 0.30,
|
|
HighCPUThreshold: 0.70,
|
|
LowMemoryThreshold: 0.60,
|
|
HighMemoryThreshold: 0.80,
|
|
AdaptiveBufferTargetLatency: 15 * time.Millisecond, // Reduced target latency
|
|
|
|
// Adaptive Buffer Size Configuration - Optimized for quality change bursts
|
|
AdaptiveMinBufferSize: 16, // Higher minimum to handle bursts
|
|
AdaptiveMaxBufferSize: 64, // Higher maximum for quality changes
|
|
AdaptiveDefaultBufferSize: 32, // Higher default for stability
|
|
|
|
// Adaptive Optimizer Configuration - Faster response
|
|
CooldownPeriod: 15 * time.Second, // Reduced cooldown period
|
|
RollbackThreshold: 200 * time.Millisecond, // Lower rollback threshold
|
|
AdaptiveOptimizerLatencyTarget: 30 * time.Millisecond, // Reduced latency target
|
|
|
|
// Latency Monitor Configuration - More aggressive monitoring
|
|
MaxLatencyThreshold: 150 * time.Millisecond, // Lower max latency threshold
|
|
JitterThreshold: 15 * time.Millisecond, // Reduced jitter threshold
|
|
LatencyOptimizationInterval: 3 * time.Second, // More frequent optimization
|
|
LatencyAdaptiveThreshold: 0.7, // More aggressive adaptive threshold
|
|
|
|
// Microphone Contention Configuration
|
|
MicContentionTimeout: 200 * time.Millisecond,
|
|
|
|
// Buffer Pool Configuration
|
|
PreallocPercentage: 20,
|
|
|
|
// Sleep and Backoff Configuration
|
|
BackoffStart: 50 * time.Millisecond,
|
|
|
|
// Protocol Magic Numbers
|
|
InputMagicNumber: 0x4A4B4D49, // "JKMI" (JetKVM Microphone Input)
|
|
OutputMagicNumber: 0x4A4B4F55, // "JKOU" (JetKVM Output)
|
|
|
|
// Calculation Constants
|
|
PercentageMultiplier: 100.0, // Standard percentage conversion (0.5 * 100 = 50%)
|
|
AveragingWeight: 0.7, // Weight for smoothing values (70% recent, 30% historical)
|
|
ScalingFactor: 1.5, // General scaling factor for adaptive adjustments
|
|
|
|
SmoothingFactor: 0.3, // For adaptive buffer smoothing
|
|
CPUMemoryWeight: 0.5, // CPU factor weight in combined calculations
|
|
MemoryWeight: 0.3, // Memory factor weight in combined calculations
|
|
LatencyWeight: 0.2, // Latency factor weight in combined calculations
|
|
PoolGrowthMultiplier: 2, // Pool growth multiplier
|
|
LatencyScalingFactor: 2.0, // Latency ratio scaling factor
|
|
OptimizerAggressiveness: 0.7, // Optimizer aggressiveness factor
|
|
|
|
// CGO Audio Processing Constants - Balanced for stability
|
|
CGOUsleepMicroseconds: 1000, // 1000 microseconds (1ms) for stable CGO usleep calls
|
|
CGOPCMBufferSize: 1920, // 1920 samples for PCM buffer (max 2ch*960)
|
|
CGONanosecondsPerSecond: 1000000000.0, // 1000000000.0 for nanosecond conversions
|
|
|
|
// Frontend Constants - Balanced for stability
|
|
FrontendOperationDebounceMS: 1000, // 1000ms debounce for frontend operations
|
|
FrontendSyncDebounceMS: 1000, // 1000ms debounce for sync operations
|
|
FrontendSampleRate: 48000, // 48000Hz sample rate for frontend audio
|
|
FrontendRetryDelayMS: 500, // 500ms retry delay
|
|
FrontendShortDelayMS: 200, // 200ms short delay
|
|
FrontendLongDelayMS: 300, // 300ms long delay
|
|
FrontendSyncDelayMS: 500, // 500ms sync delay
|
|
FrontendMaxRetryAttempts: 3, // 3 maximum retry attempts
|
|
FrontendAudioLevelUpdateMS: 100, // 100ms audio level update interval
|
|
FrontendFFTSize: 256, // 256 FFT size for audio analysis
|
|
FrontendAudioLevelMax: 100, // 100 maximum audio level
|
|
FrontendReconnectIntervalMS: 3000, // 3000ms reconnect interval
|
|
FrontendSubscriptionDelayMS: 100, // 100ms subscription delay
|
|
FrontendDebugIntervalMS: 5000, // 5000ms debug interval
|
|
|
|
// Process Monitor Constants
|
|
ProcessMonitorDefaultMemoryGB: 4, // 4GB default memory for fallback
|
|
ProcessMonitorKBToBytes: 1024, // 1024 conversion factor
|
|
ProcessMonitorDefaultClockHz: 250.0, // 250.0 Hz default for ARM systems
|
|
ProcessMonitorFallbackClockHz: 1000.0, // 1000.0 Hz fallback clock
|
|
ProcessMonitorTraditionalHz: 100.0, // 100.0 Hz traditional clock
|
|
|
|
// Batch Processing Constants - Optimized for quality change bursts
|
|
BatchProcessorFramesPerBatch: 16, // Larger batches for quality changes
|
|
BatchProcessorTimeout: 20 * time.Millisecond, // Longer timeout for bursts
|
|
BatchProcessorMaxQueueSize: 64, // Larger queue for quality changes
|
|
BatchProcessorAdaptiveThreshold: 0.6, // Lower threshold for faster adaptation
|
|
BatchProcessorThreadPinningThreshold: 8, // Lower threshold for better performance
|
|
|
|
// Output Streaming Constants - Balanced for stability
|
|
OutputStreamingFrameIntervalMS: 20, // 20ms frame interval (50 FPS) for stability
|
|
|
|
// IPC Constants
|
|
IPCInitialBufferFrames: 500, // 500 frames for initial buffer
|
|
|
|
// Event Constants - Balanced for stability
|
|
EventTimeoutSeconds: 2, // 2 seconds for event timeout
|
|
EventTimeFormatString: "2006-01-02T15:04:05.000Z", // "2006-01-02T15:04:05.000Z" time format
|
|
EventSubscriptionDelayMS: 100, // 100ms subscription delay
|
|
|
|
// Goroutine Pool Configuration
|
|
MaxAudioProcessorWorkers: 16, // 16 workers for audio processing tasks
|
|
MaxAudioReaderWorkers: 8, // 8 workers for audio reading tasks
|
|
AudioProcessorQueueSize: 64, // 64 tasks queue size for processor pool
|
|
AudioReaderQueueSize: 32, // 32 tasks queue size for reader pool
|
|
WorkerMaxIdleTime: 60 * time.Second, // 60s maximum idle time before worker termination
|
|
|
|
// Input Processing Constants - Balanced for stability
|
|
InputProcessingTimeoutMS: 10, // 10ms processing timeout threshold
|
|
|
|
// Adaptive Buffer Constants
|
|
AdaptiveBufferCPUMultiplier: 100, // 100 multiplier for CPU percentage
|
|
AdaptiveBufferMemoryMultiplier: 100, // 100 multiplier for memory percentage
|
|
|
|
// Socket Names
|
|
InputSocketName: "audio_input.sock", // Socket name for audio input IPC
|
|
OutputSocketName: "audio_output.sock", // Socket name for audio output IPC
|
|
|
|
// Component Names
|
|
AudioInputComponentName: "audio-input", // Component name for input logging
|
|
AudioOutputComponentName: "audio-output", // Component name for output logging
|
|
AudioServerComponentName: "audio-server", // Component name for server logging
|
|
AudioRelayComponentName: "audio-relay", // Component name for relay logging
|
|
AudioEventsComponentName: "audio-events", // Component name for events logging
|
|
|
|
// Test Configuration
|
|
TestSocketTimeout: 100 * time.Millisecond, // 100ms timeout for test socket operations
|
|
TestBufferSize: 4096, // 4096 bytes buffer size for test operations
|
|
TestRetryDelay: 200 * time.Millisecond, // 200ms delay between test retry attempts
|
|
|
|
// Latency Histogram Configuration
|
|
LatencyHistogramMaxSamples: 1000, // 1000 samples for latency tracking
|
|
LatencyPercentile50: 50, // 50th percentile calculation factor
|
|
LatencyPercentile95: 95, // 95th percentile calculation factor
|
|
LatencyPercentile99: 99, // 99th percentile calculation factor
|
|
|
|
// Buffer Pool Efficiency Constants
|
|
BufferPoolMaxOperations: 1000, // 1000 operations for efficiency tracking
|
|
HitRateCalculationBase: 100.0, // 100.0 base for hit rate percentage calculation
|
|
|
|
// Validation Constants
|
|
MaxLatency: 500 * time.Millisecond, // 500ms maximum allowed latency
|
|
MinMetricsUpdateInterval: 100 * time.Millisecond, // 100ms minimum metrics update interval
|
|
MaxMetricsUpdateInterval: 10 * time.Second, // 10s maximum metrics update interval
|
|
MinSampleRate: 8000, // 8kHz minimum sample rate
|
|
MaxSampleRate: 48000, // 48kHz maximum sample rate
|
|
MaxChannels: 8, // 8 maximum audio channels
|
|
|
|
// CGO Constants
|
|
CGOMaxBackoffMicroseconds: 500000, // 500ms maximum backoff in microseconds
|
|
CGOMaxAttempts: 5, // 5 maximum retry attempts
|
|
|
|
// Validation Frame Size Limits
|
|
MinFrameDuration: 10 * time.Millisecond, // 10ms minimum frame duration
|
|
MaxFrameDuration: 100 * time.Millisecond, // 100ms maximum frame duration
|
|
|
|
// Valid Sample Rates
|
|
ValidSampleRates: []int{8000, 12000, 16000, 22050, 24000, 44100, 48000}, // Supported sample rates
|
|
|
|
// Opus Bitrate Validation Constants
|
|
MinOpusBitrate: 6000, // 6000 bps minimum Opus bitrate
|
|
MaxOpusBitrate: 510000, // 510000 bps maximum Opus bitrate
|
|
|
|
// Validation Configuration
|
|
MaxValidationTime: 5 * time.Second, // 5s maximum validation timeout
|
|
MinFrameSize: 1, // 1 byte minimum frame size (allow small frames)
|
|
FrameSizeTolerance: 512, // 512 bytes frame size tolerance
|
|
|
|
// Removed device health monitoring configuration - functionality not used
|
|
|
|
// Latency Histogram Bucket Configuration
|
|
LatencyBucket10ms: 10 * time.Millisecond, // 10ms latency bucket
|
|
LatencyBucket25ms: 25 * time.Millisecond, // 25ms latency bucket
|
|
LatencyBucket50ms: 50 * time.Millisecond, // 50ms latency bucket
|
|
LatencyBucket100ms: 100 * time.Millisecond, // 100ms latency bucket
|
|
LatencyBucket250ms: 250 * time.Millisecond, // 250ms latency bucket
|
|
LatencyBucket500ms: 500 * time.Millisecond, // 500ms latency bucket
|
|
LatencyBucket1s: 1 * time.Second, // 1s latency bucket
|
|
LatencyBucket2s: 2 * time.Second, // 2s latency bucket
|
|
|
|
// Batch Audio Processing Configuration
|
|
MinBatchSizeForThreadPinning: 5, // Minimum batch size to pin thread
|
|
|
|
// Goroutine Monitoring Configuration
|
|
GoroutineMonitorInterval: 30 * time.Second, // 30s monitoring interval
|
|
|
|
// Performance Configuration Flags - Production optimizations
|
|
|
|
}
|
|
}
|
|
|
|
// Global configuration instance
|
|
var Config = DefaultAudioConfig()
|
|
|
|
// UpdateConfig allows runtime configuration updates
|
|
func UpdateConfig(newConfig *AudioConfigConstants) {
|
|
// Validate the new configuration before applying it
|
|
if err := ValidateAudioConfigConstants(newConfig); err != nil {
|
|
// Log validation error and keep current configuration
|
|
logger := logging.GetDefaultLogger().With().Str("component", "AudioConfig").Logger()
|
|
logger.Error().Err(err).Msg("Configuration validation failed, keeping current configuration")
|
|
return
|
|
}
|
|
|
|
Config = newConfig
|
|
logger := logging.GetDefaultLogger().With().Str("component", "AudioConfig").Logger()
|
|
logger.Info().Msg("Audio configuration updated successfully")
|
|
}
|
|
|
|
// GetConfig returns the current configuration
|
|
func GetConfig() *AudioConfigConstants {
|
|
return Config
|
|
}
|