diff --git a/src/trx-server/src/main.rs b/src/trx-server/src/main.rs index f80df92d..68111080 100644 --- a/src/trx-server/src/main.rs +++ b/src/trx-server/src/main.rs @@ -922,11 +922,10 @@ fn bound_sockets(cli: &Cli, cfg: &ServerConfig, rigs: &[RigInstanceConfig]) -> V "[listen]", )); } - let audio_ip = cli.listen.unwrap_or(cfg.audio.listen); for rig in rigs { if rig.audio.enabled { sockets.push(BoundSocket::new( - audio_ip, + cli.listen.unwrap_or(rig.audio.listen), rig.audio.port, format!("rig \"{}\" [audio]", rig.id), )); @@ -1276,9 +1275,9 @@ async fn main() -> DynResult<()> { } })); - // Spawn audio stack. - // listen_override priority: --listen CLI flag > global [audio].listen > per-rig default. - let audio_listen_override = cli.listen.or(Some(cfg.audio.listen)); + // Spawn audio stack. --listen overrides every configured bind address; + // otherwise each rig keeps its own [rigs.audio].listen value. + let audio_listen_override = cli.listen; #[cfg(feature = "soapysdr")] let audio_vchan_manager = sdr_vchan_manager.clone(); #[cfg(not(feature = "soapysdr"))] @@ -1417,6 +1416,40 @@ mod tests { assert!(parse_serial_addr(" ").is_err()); } + #[test] + fn bound_sockets_preserves_per_rig_audio_addresses() { + let cli = Cli::parse_from(["trx-server"]); + let cfg = ServerConfig::default(); + let mut local = RigInstanceConfig::default(); + local.id = "local".into(); + local.audio.listen = "127.0.0.1".parse().unwrap(); + local.audio.port = 4531; + let mut remote = RigInstanceConfig::default(); + remote.id = "remote".into(); + remote.audio.listen = "0.0.0.0".parse().unwrap(); + remote.audio.port = 4532; + + let sockets = bound_sockets(&cli, &cfg, &[local, remote]); + let local = sockets.iter().find(|s| s.port == 4531).unwrap(); + let remote = sockets.iter().find(|s| s.port == 4532).unwrap(); + assert_eq!(local.addr, "127.0.0.1".parse::().unwrap()); + assert_eq!(remote.addr, "0.0.0.0".parse::().unwrap()); + } + + #[test] + fn bound_sockets_applies_cli_listen_to_every_audio_listener() { + let cli = Cli::parse_from(["trx-server", "--listen", "192.0.2.10"]); + let cfg = ServerConfig::default(); + let mut rig = RigInstanceConfig::default(); + rig.id = "remote".into(); + rig.audio.listen = "127.0.0.1".parse().unwrap(); + rig.audio.port = 4532; + + let sockets = bound_sockets(&cli, &cfg, &[rig]); + let audio = sockets.iter().find(|s| s.port == 4532).unwrap(); + assert_eq!(audio.addr, "192.0.2.10".parse::().unwrap()); + } + #[test] fn default_audio_bandwidth_for_mode_table() { assert_eq!(default_audio_bandwidth_for_mode(&RigMode::USB), 3_000);