feat(multi-rig): auto-discover per-rig audio ports via GetRigs
This commit is contained in:
@@ -244,6 +244,7 @@ async fn handle_client(
|
||||
entries.push(RigEntry {
|
||||
rig_id: handle.rig_id.clone(),
|
||||
state: snapshot,
|
||||
audio_port: Some(handle.audio_port),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -303,7 +304,10 @@ async fn handle_client(
|
||||
match time::timeout(IO_TIMEOUT, handle.rig_tx.send(req)).await {
|
||||
Ok(Ok(())) => {}
|
||||
Ok(Err(e)) => {
|
||||
error!("Failed to send request to rig_task for '{}': {:?}", target_rig_id, e);
|
||||
error!(
|
||||
"Failed to send request to rig_task for '{}': {:?}",
|
||||
target_rig_id, e
|
||||
);
|
||||
let resp = ClientResponse {
|
||||
success: false,
|
||||
rig_id: Some(target_rig_id.clone()),
|
||||
@@ -404,8 +408,8 @@ mod tests {
|
||||
|
||||
use trx_core::radio::freq::Band;
|
||||
use trx_core::rig::request::RigRequest;
|
||||
use trx_core::rig::{RigAccessMethod, RigCapabilities, RigInfo};
|
||||
use trx_core::rig::state::RigState;
|
||||
use trx_core::rig::{RigAccessMethod, RigCapabilities, RigInfo};
|
||||
|
||||
fn loopback_addr() -> SocketAddr {
|
||||
let listener = std::net::TcpListener::bind((Ipv4Addr::LOCALHOST, 0)).expect("bind");
|
||||
@@ -458,6 +462,7 @@ mod tests {
|
||||
rig_id: "default".to_string(),
|
||||
rig_tx,
|
||||
state_rx,
|
||||
audio_port: 4531,
|
||||
};
|
||||
let mut map = HashMap::new();
|
||||
map.insert("default".to_string(), handle);
|
||||
@@ -568,7 +573,11 @@ mod tests {
|
||||
reader.read_line(&mut line).await.expect("read");
|
||||
let resp: ClientResponse = serde_json::from_str(line.trim_end()).expect("response json");
|
||||
assert!(!resp.success);
|
||||
assert!(resp.error.as_deref().unwrap_or("").contains("Unknown rig_id"));
|
||||
assert!(resp
|
||||
.error
|
||||
.as_deref()
|
||||
.unwrap_or("")
|
||||
.contains("Unknown rig_id"));
|
||||
|
||||
let _ = shutdown_tx.send(true);
|
||||
handle.abort();
|
||||
|
||||
@@ -219,11 +219,9 @@ fn access_from_rig_instance(rig_cfg: &RigInstanceConfig) -> DynResult<RigAccess>
|
||||
let args = rig_cfg.rig.access.args.clone().unwrap_or_default();
|
||||
Ok(RigAccess::Sdr { args })
|
||||
}
|
||||
Some(other) => Err(format!(
|
||||
"Unknown access type '{}' for rig '{}'",
|
||||
other, rig_cfg.id
|
||||
)
|
||||
.into()),
|
||||
Some(other) => {
|
||||
Err(format!("Unknown access type '{}' for rig '{}'", other, rig_cfg.id).into())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -455,7 +453,10 @@ fn spawn_rig_audio_stack(
|
||||
if rig_cfg.audio.rx_enabled {
|
||||
if let Some(mut sdr_rx) = sdr_pcm_rx {
|
||||
// SDR path: the backend pipeline provides demodulated PCM.
|
||||
info!("[{}] using SDR audio source — cpal capture disabled", rig_cfg.id);
|
||||
info!(
|
||||
"[{}] using SDR audio source — cpal capture disabled",
|
||||
rig_cfg.id
|
||||
);
|
||||
let pcm_tx_clone = pcm_tx.clone();
|
||||
handles.push(tokio::spawn(async move {
|
||||
loop {
|
||||
@@ -661,7 +662,10 @@ async fn main() -> DynResult<()> {
|
||||
}
|
||||
}
|
||||
}
|
||||
let callsign = cli.callsign.clone().or_else(|| cfg.general.callsign.clone());
|
||||
let callsign = cli
|
||||
.callsign
|
||||
.clone()
|
||||
.or_else(|| cfg.general.callsign.clone());
|
||||
(callsign, cfg.general.latitude, cfg.general.longitude)
|
||||
};
|
||||
|
||||
@@ -799,6 +803,7 @@ async fn main() -> DynResult<()> {
|
||||
rig_id: rig_cfg.id.clone(),
|
||||
rig_tx,
|
||||
state_rx,
|
||||
audio_port: rig_cfg.audio.port,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,4 +20,6 @@ pub struct RigHandle {
|
||||
pub rig_tx: mpsc::Sender<RigRequest>,
|
||||
/// Watch the latest rig state for fast GetState/GetRigs responses.
|
||||
pub state_rx: watch::Receiver<RigState>,
|
||||
/// Per-rig audio listener TCP port.
|
||||
pub audio_port: u16,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user