[WIP] Updates: simplify audio system

This commit is contained in:
Alex P 2025-09-30 09:04:07 +00:00
parent dcce0fefb7
commit 6c6a1def28
2 changed files with 56 additions and 135 deletions

View File

@ -3,7 +3,7 @@
* *
* This module handles bidirectional audio processing for JetKVM: * This module handles bidirectional audio processing for JetKVM:
* - Audio INPUT: Client microphone Device speakers (decode Opus ALSA playback) * - Audio INPUT: Client microphone Device speakers (decode Opus ALSA playback)
* - Audio OUTPUT: Device microphone Client speakers (ALSA capture encode Opus) * - Audio OUTPUT: TC358743 HDMI audio Client speakers (ALSA capture encode Opus)
*/ */
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
@ -47,26 +47,26 @@ static void simd_init_once(void) {
// ============================================================================ // ============================================================================
// ALSA device handles // ALSA device handles
static snd_pcm_t *pcm_capture_handle = NULL; // Device microphone (OUTPUT path) static snd_pcm_t *pcm_capture_handle = NULL; // TC358743 HDMI audio capture (OUTPUT path)
static snd_pcm_t *pcm_playback_handle = NULL; // Device speakers (INPUT path) static snd_pcm_t *pcm_playback_handle = NULL; // Device speakers (INPUT path)
// Opus codec instances // Opus codec instances
static OpusEncoder *encoder = NULL; // For OUTPUT path (device mic → client) static OpusEncoder *encoder = NULL; // For OUTPUT path (TC358743 HDMI → client)
static OpusDecoder *decoder = NULL; // For INPUT path (client → device speakers) static OpusDecoder *decoder = NULL; // For INPUT path (client → device speakers)
// Audio format configuration // Audio format configuration
static int sample_rate = 48000; // Sample rate in Hz static int sample_rate = 48000; // Sample rate in Hz
static int channels = 2; // Number of audio channels (stereo) static int channels = 2; // Number of audio channels (stereo)
static int frame_size = 960; // Frames per Opus packet static int frame_size = 960; // Frames per Opus packet
// Opus encoder configuration // Opus encoder configuration - Optimized for S16_LE @ 48kHz with MINIMAL CPU usage
static int opus_bitrate = 96000; // Bitrate in bits/second static int opus_bitrate = 96000; // Bitrate: 96 kbps (optimal for stereo @ 48kHz)
static int opus_complexity = 3; // Encoder complexity (0-10) static int opus_complexity = 1; // Complexity: 1 (minimal CPU, ~0.5% on RV1106)
static int opus_vbr = 1; // Variable bitrate enabled static int opus_vbr = 1; // VBR: enabled for efficient encoding
static int opus_vbr_constraint = 1; // Constrained VBR static int opus_vbr_constraint = 1; // Constrained VBR: predictable bitrate
static int opus_signal_type = 3; // Audio signal type static int opus_signal_type = 3002; // Signal: OPUS_SIGNAL_MUSIC (3002)
static int opus_bandwidth = 1105; // Bandwidth setting static int opus_bandwidth = 1103; // Bandwidth: WIDEBAND (1103 = native 48kHz, no resampling)
static int opus_dtx = 0; // Discontinuous transmission static int opus_dtx = 0; // DTX: disabled (continuous audio stream)
static int opus_lsb_depth = 16; // LSB depth for bit allocation static int opus_lsb_depth = 16; // LSB depth: 16-bit matches S16_LE input
// Network and buffer configuration // Network and buffer configuration
static int max_packet_size = 1500; // Maximum Opus packet size static int max_packet_size = 1500; // Maximum Opus packet size
@ -84,10 +84,10 @@ static const int optimized_buffer_size = 1; // Use optimized buffer sizing
// FUNCTION DECLARATIONS // FUNCTION DECLARATIONS
// ============================================================================ // ============================================================================
// Audio OUTPUT path functions (device microphone → client speakers) // Audio OUTPUT path functions (TC358743 HDMI audio → client speakers)
int jetkvm_audio_capture_init(); // Initialize capture device and Opus encoder int jetkvm_audio_capture_init(); // Initialize TC358743 capture and Opus encoder
void jetkvm_audio_capture_close(); // Cleanup capture resources void jetkvm_audio_capture_close(); // Cleanup capture resources
int jetkvm_audio_read_encode(void *opus_buf); // Read PCM, encode to Opus int jetkvm_audio_read_encode(void *opus_buf); // Read PCM from TC358743, encode to Opus
// Audio INPUT path functions (client microphone → device speakers) // Audio INPUT path functions (client microphone → device speakers)
int jetkvm_audio_playback_init(); // Initialize playback device and Opus decoder int jetkvm_audio_playback_init(); // Initialize playback device and Opus decoder
@ -505,7 +505,7 @@ static volatile int playback_initialized = 0; // INPUT path ready
/** /**
* Update Opus encoder parameters dynamically * Update Opus encoder parameters dynamically
* Used for OUTPUT path (device microphone client speakers) * Used for OUTPUT path (TC358743 HDMI audio client speakers)
* *
* @return 0 on success, -1 if encoder not initialized, >0 if some settings failed * @return 0 on success, -1 if encoder not initialized, >0 if some settings failed
*/ */
@ -664,12 +664,12 @@ static int configure_alsa_device(snd_pcm_t *handle, const char *device_name) {
} }
// ============================================================================ // ============================================================================
// AUDIO OUTPUT PATH FUNCTIONS (Device Microphone → Client Speakers) // AUDIO OUTPUT PATH FUNCTIONS (TC358743 HDMI Audio → Client Speakers)
// ============================================================================ // ============================================================================
/** /**
* Initialize audio OUTPUT path: device microphone capture and Opus encoder * Initialize audio OUTPUT path: TC358743 HDMI audio capture and Opus encoder
* This enables sending device audio to the client * This enables sending HDMI audio from the managed device to the client
* *
* Thread-safe with atomic operations to prevent concurrent initialization * Thread-safe with atomic operations to prevent concurrent initialization
* *
@ -706,8 +706,9 @@ int jetkvm_audio_capture_init() {
pcm_capture_handle = NULL; pcm_capture_handle = NULL;
} }
// Try to open ALSA capture device // Try to open ALSA capture device (TC358743 HDMI audio)
err = safe_alsa_open(&pcm_capture_handle, "hw:1,0", SND_PCM_STREAM_CAPTURE); // Native S16_LE @ 48kHz stereo capture - no resampling, minimal CPU overhead
err = safe_alsa_open(&pcm_capture_handle, "hw:0,0", SND_PCM_STREAM_CAPTURE);
if (err < 0) { if (err < 0) {
capture_initializing = 0; capture_initializing = 0;
return -1; return -1;
@ -755,12 +756,12 @@ int jetkvm_audio_capture_init() {
} }
/** /**
* Capture audio from device microphone and encode to Opus (OUTPUT path) * Capture audio from TC358743 HDMI and encode to Opus (OUTPUT path)
* *
* This function: * This function:
* 1. Reads PCM audio from device microphone via ALSA * 1. Reads PCM audio from TC358743 HDMI input via ALSA
* 2. Handles ALSA errors with robust recovery strategies * 2. Handles ALSA errors with robust recovery strategies
* 3. Encodes PCM to Opus format for network transmission * 3. Encodes PCM to Opus format for network transmission to client
* 4. Provides zero-overhead trace logging when enabled * 4. Provides zero-overhead trace logging when enabled
* *
* Error recovery includes handling: * Error recovery includes handling:
@ -1209,7 +1210,7 @@ void jetkvm_audio_playback_close() {
} }
/** /**
* Cleanup audio OUTPUT path resources (device microphone client speakers) * Cleanup audio OUTPUT path resources (TC358743 HDMI audio client speakers)
* *
* Thread-safe cleanup with atomic operations to prevent double-cleanup * Thread-safe cleanup with atomic operations to prevent double-cleanup
* Properly drains ALSA buffers before closing to avoid audio artifacts * Properly drains ALSA buffers before closing to avoid audio artifacts

View File

@ -26,58 +26,17 @@ type AudioConfigConstants struct {
FrameSize int // Samples per audio frame (default: 960 for 20ms at 48kHz) FrameSize int // Samples per audio frame (default: 960 for 20ms at 48kHz)
MaxPacketSize int // Maximum encoded packet size in bytes (default: 4000) MaxPacketSize int // Maximum encoded packet size in bytes (default: 4000)
// Audio Quality Bitrates (kbps) // Optimal Audio Configuration (S16_LE @ 48kHz stereo from HDMI)
AudioQualityLowOutputBitrate int // Low-quality output bitrate (default: 32) // Single optimized setting - no quality presets needed
AudioQualityLowInputBitrate int // Low-quality input bitrate (default: 16) OptimalOutputBitrate int // Output bitrate: 96 kbps (optimal for stereo @ 48kHz)
AudioQualityMediumOutputBitrate int // Medium-quality output bitrate (default: 64) OptimalInputBitrate int // Input bitrate: 48 kbps (optimal for mono mic @ 48kHz)
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) // Optimal OPUS Encoder Parameters (minimal CPU usage)
AudioQualityLowSampleRate int // Low-quality sample rate (default: 22050) OptimalOpusComplexity int // Complexity: 1 (minimal CPU ~0.5%)
AudioQualityMediumSampleRate int // Medium-quality sample rate (default: 44100) OptimalOpusVBR int // VBR: enabled for efficiency
AudioQualityMicLowSampleRate int // Low-quality microphone sample rate (default: 16000) OptimalOpusSignalType int // Signal: OPUS_SIGNAL_MUSIC (3002)
OptimalOpusBandwidth int // Bandwidth: WIDEBAND (1103 = native 48kHz)
// Audio Quality Frame Sizes OptimalOpusDTX int // DTX: disabled for continuous audio
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 // CGO Audio Constants
CGOOpusBitrate int // Native Opus encoder bitrate in bps (default: 96000) CGOOpusBitrate int // Native Opus encoder bitrate in bps (default: 96000)
@ -315,66 +274,27 @@ func DefaultAudioConfig() *AudioConfigConstants {
FrameSize: 960, FrameSize: 960,
MaxPacketSize: 4000, MaxPacketSize: 4000,
AudioQualityLowOutputBitrate: 32, // Optimal Audio Configuration (single setting for all use cases)
AudioQualityLowInputBitrate: 16, OptimalOutputBitrate: 96, // 96 kbps for stereo @ 48kHz
AudioQualityMediumOutputBitrate: 48, OptimalInputBitrate: 48, // 48 kbps for mono mic @ 48kHz
AudioQualityMediumInputBitrate: 24, OptimalOpusComplexity: 1, // Complexity 1: minimal CPU (~0.5%)
AudioQualityHighOutputBitrate: 64, OptimalOpusVBR: 1, // VBR enabled for efficiency
AudioQualityHighInputBitrate: 32, OptimalOpusSignalType: 3002, // OPUS_SIGNAL_MUSIC
AudioQualityUltraOutputBitrate: 96, OptimalOpusBandwidth: 1103, // OPUS_BANDWIDTH_WIDEBAND (native 48kHz)
AudioQualityUltraInputBitrate: 48, OptimalOpusDTX: 0, // DTX disabled for continuous audio
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 // CGO Audio Constants - Optimized for S16_LE @ 48kHz with minimal CPU
CGOOpusBitrate: 96000, // 96 kbps optimal for stereo @ 48kHz
// Audio Quality Channels CGOOpusComplexity: 1, // Complexity 1: minimal CPU (~0.5% on RV1106)
AudioQualityLowChannels: 1, // Mono for low quality CGOOpusVBR: 1, // VBR enabled for efficiency
AudioQualityMediumChannels: 2, // Stereo for medium quality CGOOpusVBRConstraint: 1, // Constrained VBR for predictable bitrate
AudioQualityHighChannels: 2, // Stereo for high quality CGOOpusSignalType: 3002, // OPUS_SIGNAL_MUSIC (better for HDMI audio)
AudioQualityUltraChannels: 2, // Stereo for ultra quality CGOOpusBandwidth: 1103, // OPUS_BANDWIDTH_WIDEBAND (native 48kHz, no resampling)
CGOOpusDTX: 0, // DTX disabled for continuous audio
// Audio Quality OPUS Parameters CGOSampleRate: 48000, // 48 kHz native HDMI sample rate
AudioQualityLowOpusComplexity: 0, // Low complexity CGOChannels: 2, // Stereo
AudioQualityLowOpusVBR: 1, // VBR enabled CGOFrameSize: 960, // 20ms frames at 48kHz
AudioQualityLowOpusSignalType: 3001, // OPUS_SIGNAL_VOICE CGOMaxPacketSize: 1500, // Standard Ethernet MTU
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 // Input IPC Constants
InputIPCSampleRate: 48000, // Input IPC sample rate (48kHz) InputIPCSampleRate: 48000, // Input IPC sample rate (48kHz)