[fix](trx-backend-soapysdr): disable hidden AIS DSP outside AIS modes
Add per-channel processing gating and disable hidden AIS channel DSP unless mode is AIS or MARINE, reducing continuous IQ read-loop CPU load in normal operation.\n\nCo-authored-by: OpenAI Codex <codex@openai.com> Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -86,6 +86,7 @@ pub struct ChannelDsp {
|
||||
iq_agc: Option<SoftAgc>,
|
||||
audio_agc: SoftAgc,
|
||||
audio_dc: Option<DcBlocker>,
|
||||
processing_enabled: bool,
|
||||
}
|
||||
|
||||
impl ChannelDsp {
|
||||
@@ -262,9 +263,14 @@ impl ChannelDsp {
|
||||
iq_agc: iq_agc_for_mode(mode, channel_sample_rate),
|
||||
audio_agc: agc_for_mode(mode, audio_sample_rate),
|
||||
audio_dc: dc_for_mode(mode),
|
||||
processing_enabled: true,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_processing_enabled(&mut self, enabled: bool) {
|
||||
self.processing_enabled = enabled;
|
||||
}
|
||||
|
||||
pub fn set_mode(&mut self, mode: &RigMode) {
|
||||
self.mode = mode.clone();
|
||||
if *mode != RigMode::WFM {
|
||||
@@ -325,6 +331,9 @@ impl ChannelDsp {
|
||||
}
|
||||
|
||||
pub fn process_block(&mut self, block: &[Complex<f32>]) {
|
||||
if !self.processing_enabled {
|
||||
return;
|
||||
}
|
||||
let n = block.len();
|
||||
if n == 0 {
|
||||
return;
|
||||
|
||||
@@ -227,7 +227,7 @@ impl SoapySdrRig {
|
||||
let spectrum_buf = pipeline.spectrum_buf.clone();
|
||||
let retune_cmd = pipeline.retune_cmd.clone();
|
||||
|
||||
Ok(Self {
|
||||
let rig = Self {
|
||||
info,
|
||||
freq: initial_freq,
|
||||
mode: initial_mode,
|
||||
@@ -245,7 +245,9 @@ impl SoapySdrRig {
|
||||
gain_db,
|
||||
max_gain_db,
|
||||
ais_channel_indices: Some((primary_channel_count, primary_channel_count + 1)),
|
||||
})
|
||||
};
|
||||
rig.apply_ais_channel_activity();
|
||||
Ok(rig)
|
||||
}
|
||||
|
||||
/// Simple constructor for backward compatibility with the factory function.
|
||||
@@ -300,6 +302,18 @@ impl SoapySdrRig {
|
||||
}
|
||||
}
|
||||
|
||||
fn apply_ais_channel_activity(&self) {
|
||||
let Some((ais_a_idx, ais_b_idx)) = self.ais_channel_indices else {
|
||||
return;
|
||||
};
|
||||
let enabled = matches!(self.mode, RigMode::AIS | RigMode::MARINE);
|
||||
for idx in [ais_a_idx, ais_b_idx] {
|
||||
if let Some(dsp_arc) = self.pipeline.channel_dsps.get(idx) {
|
||||
dsp_arc.lock().unwrap().set_processing_enabled(enabled);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn subscribe_iq_channel(
|
||||
&self,
|
||||
channel_idx: usize,
|
||||
@@ -435,6 +449,7 @@ impl RigCat for SoapySdrRig {
|
||||
dsp.set_mode(&mode);
|
||||
dsp.set_filter(self.bandwidth_hz, self.fir_taps as usize);
|
||||
}
|
||||
self.apply_ais_channel_activity();
|
||||
self.apply_ais_channel_filters();
|
||||
Ok(())
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user