Skip to content

fix(transmit): exclude FreeDV modes from Quindar tone allowlist #3318

Description

@NF0T

Summary

isPhoneModeForQuindar() currently allows Quindar tones for FDV, FDVU, and
FDVL (FreeDV modes). FreeDV now uses RADAE (the same neural speech autoencoder as
RADE mode), meaning a Quindar tone injected into the TX audio stream is fed into a
neural encoder trained on speech — the result on air is codec-artifact noise, not a
recognizable signaling tone. The far end cannot detect it as Quindar. The behaviour
is misleading and technically incorrect.

Background

Surfaced during review of #3224 / PR #3317. The Quindar tone is injected in the TX
audio pipeline after the user DSP chain but before the brickwall limiter
(AudioEngine.cpp around the // Quindar tones (#2262) comment). From there it
goes to the radio as raw PCM.

For SSB/AM/FM, that PCM goes on air as-is — the Quindar sine reaches the far end
intact and relay equipment can detect it. ✓

For FreeDV (FDV/FDVU/FDVL), the radio receives the PCM and runs it through
RADAE internally before transmitting. A 2525 Hz sine is as far from the speech
manifold as you can get — RADAE produces heavily distorted codec output, not a
Quindar beep. The far end decodes noise.

For RADE, this was avoided by accident: RADE sets the slice to DIGU/DIGL, which
isPhoneModeForQuindar() already excludes. FreeDV was explicitly included, likely
when FreeDV still used Codec2 and someone categorised it as "phone-adjacent." Now
that FreeDV uses RADAE, it belongs in the same excluded bucket.

The existing code comment already states the design intent:

// Digital (DIGU/DIGL/RTTY/CW/FT8) intentionally excluded — the
// tone would corrupt the digital waveform.

FreeDV is a digital waveform in the same sense. The exclusion applies.

Proposed fix

One line change in TransmitModel.cpp::isPhoneModeForQuindar():

// before
return m == "USB" || m == "LSB"
    || m == "AM"  || m == "FM"  || m == "NFM"
    || m == "FDV" || m == "FDVU" || m == "FDVL";

// after
return m == "USB" || m == "LSB"
    || m == "AM"  || m == "FM"  || m == "NFM";

Impact

  • Users who currently have Quindar enabled and operate in a FreeDV mode will no
    longer see Quindar tones fire. They are currently getting a broken/inaudible tone
    on air — so the change removes a feature that doesn't work, not one that does.
  • No change to SSB/AM/FM behaviour.
  • No change to RADE behaviour (already excluded).

Acceptance

  • isPhoneModeForQuindar() returns false for FDV, FDVU, FDVL.
  • Quindar intro/outro do not fire when the TX slice is in a FreeDV mode.
  • SSB/AM/FM Quindar behaviour is unchanged.

Refs

Metadata

Metadata

Assignees

No one assigned

    Labels

    audioAudio engine and streamingbugSomething isn't workingmaintainer-reviewRequires maintainer review before any action is taken

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions