From 57baa14ee6ef36cd952721e0a903c62ff888c214 Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 21 Nov 2025 01:44:03 +0200 Subject: [PATCH] Fix frame size calculation for configurable sample rates Calculate frame size dynamically based on sample rate (20ms frames): - 48kHz: 960 samples - 24kHz: 480 samples - 16kHz: 320 samples - 12kHz: 240 samples - 8kHz: 160 samples Previously hardcoded to 960, causing decoder init failures at non-48kHz rates --- internal/audio/cgo_source.go | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/internal/audio/cgo_source.go b/internal/audio/cgo_source.go index 76b09703..a94a6c91 100644 --- a/internal/audio/cgo_source.go +++ b/internal/audio/cgo_source.go @@ -83,6 +83,8 @@ func (c *CgoSource) Connect() error { func (c *CgoSource) connectOutput() error { os.Setenv("ALSA_CAPTURE_DEVICE", c.alsaDevice) + frameSize := uint16(c.config.SampleRate * 20 / 1000) + c.logger.Debug(). Uint16("bitrate_kbps", c.config.Bitrate). Uint8("complexity", c.config.Complexity). @@ -90,6 +92,7 @@ func (c *CgoSource) connectOutput() error { Bool("fec", c.config.FECEnabled). Uint8("buffer_periods", c.config.BufferPeriods). Uint32("sample_rate", c.config.SampleRate). + Uint16("frame_size", frameSize). Uint8("packet_loss_perc", c.config.PacketLossPerc). Msg("Initializing audio capture") @@ -97,12 +100,12 @@ func (c *CgoSource) connectOutput() error { C.uint(uint32(c.config.Bitrate)*1000), C.uchar(c.config.Complexity), C.uint(c.config.SampleRate), - C.uchar(2), // capture_channels - C.ushort(960), // frame_size - C.ushort(1500), // max_packet_size - C.uint(1000), // sleep_us - C.uchar(5), // max_attempts - C.uint(500000), // max_backoff + C.uchar(2), + C.ushort(frameSize), + C.ushort(1500), + C.uint(1000), + C.uchar(5), + C.uint(500000), boolToUchar(c.config.DTXEnabled), boolToUchar(c.config.FECEnabled), C.uchar(c.config.BufferPeriods), @@ -122,14 +125,16 @@ func (c *CgoSource) connectOutput() error { func (c *CgoSource) connectInput() error { os.Setenv("ALSA_PLAYBACK_DEVICE", c.alsaDevice) + frameSize := uint16(c.config.SampleRate * 20 / 1000) + C.update_audio_decoder_constants( C.uint(c.config.SampleRate), - C.uchar(1), // playback_channels - C.ushort(960), // frame_size - C.ushort(1500), // max_packet_size - C.uint(1000), // sleep_us - C.uchar(5), // max_attempts - C.uint(500000), // max_backoff + C.uchar(1), + C.ushort(frameSize), + C.ushort(1500), + C.uint(1000), + C.uchar(5), + C.uint(500000), C.uchar(c.config.BufferPeriods), )