Skip to content

Add client-side digital voice keyer (DVK) with local audio file playback #957

Description

@dk4dj

Request preparation

  • I used an AI assistant to help structure this request
  • I checked for existing issues covering the same feature

What would you like?

What

A client-side Digital Voice Keyer (DVK) that plays locally stored audio files as transmitted speech — without requiring audio files to be stored on the FlexRadio hardware and without needing an upgraded SmartSDR license (e.g. the Maestro or SSDR DVK feature).

The user loads a set of WAV/FLAC files (e.g. CQ calls, contest exchanges, 73 messages) into AetherSDR, assigns them to numbered slots, and triggers playback with a button click or keyboard shortcut. AetherSDR keys the radio's PTT via the TX audio path, streams the audio, then unkeys when the file ends.

A prior art implementation by K9DUR for SmartSDR on Windows demonstrates the concept and community demand: it injected PC audio into the DAX TX channel to achieve the same result client-side.

Why

  • The FlexRadio hardware-side DVK (CWX DVK macros) requires an upgraded SmartSDR license tier not available to all users
  • Contest and DX operation benefits enormously from repeatable, consistent TX audio for CQ calls and exchanges
  • Linux users have no access to third-party DVK utilities written for Windows
  • A client-side implementation stores files locally, keeps operation fully offline, and requires zero radio firmware changes

How Other Clients Do It

Client | Approach -- | -- SmartSDR (Windows) | Hardware DVK via dvk commands — audio stored on radio, requires license upgrade K9DUR's DVK utility | Injects a WAV file into the DAX TX audio channel from the PC side; keys PTT via xmit 1 / xmit 0 — no license needed N1MM+ / Win-Test | WAV file playback routed through virtual audio (VAC/VB-Cable) into radio TX WSJT-X | Routes generated audio through system audio to DAX TX; PTT via CAT or VOX

The direct VITA-49 path (feeding AudioEngine's TX buffer directly) is preferred: it avoids PipeWire, works in all modes, and uses the already-wired r8brain-free-src resampler for sample rate conversion.

Audio format requirements (from existing AudioEngine): float32, big-endian, 24 kHz stereo. The Resampler class (r8brain-free-src) already handles arbitrary-rate → 24 kHz conversion for RN2 and RADE — the same pipeline can be reused here.

Acceptance Criteria

  • User can assign a local audio file (WAV/FLAC) to each of 8 DVK slots via the UI; assignments survive application restart (stored in AppSettings)
  • Pressing a slot button keys the radio (xmit 1), streams the audio file through the existing TX audio path at the correct sample rate, and automatically unkeys (xmit 0) when playback ends
  • Pressing Stop or Esc at any time during playback immediately stops audio and sends xmit 0
  • Repeat mode continuously retransmits a slot with a configurable inter-transmission gap until stopped
  • The DVK is disabled (buttons greyed out) when the radio is not connected or when the active slice mode is CW (to avoid accidental phone transmission on a CW QSO)

Suggested labels: enhancement, audio, GUI

Metadata

Metadata

Assignees

No one assigned

    Labels

    GUIUser interfaceNew FeatureNew feature requestaudioAudio engine and streamingawaiting-confirmationFix applied — waiting for reporter to confirm resolutionawaiting-responseWaiting for reporter to provide additional informationenhancementImprovement to existing featuremaintainer-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