VoIP Client

The GVA VoIP Client (gva-voip-client) is a Qt6-based softphone application for vehicle crew communications. It supports multiple codecs including military-grade MELPe and optional SRTP encryption.

Overview

The client provides a graphical interface for:

  • Registering with a SIP server
  • Making and receiving voice calls
  • Managing contacts/address book
  • Selecting audio codecs and devices

User Interface

The client features a tabbed interface for dialing, contacts, settings, and help.

Dialer Tab

The main dialer tab allows direct SIP address entry and call control:

VoIP Client Dialer

Contacts Tab

The contacts tab displays the address book for quick dialing:

VoIP Client Contacts

Settings Tab

Configure audio devices, codec profile, and connection settings:

VoIP Client Settings

Help Tab

View codec information, keyboard shortcuts, and documentation:

VoIP Client Help

Features

Audio Codecs

The client supports multiple codecs for different bandwidth scenarios:

Codec Bitrate Quality Use Case
G.711 64 kbps Excellent LAN, high bandwidth
G.729 8 kbps Good Limited bandwidth
MELPe 2.4 kbps Acceptable Tactical radio links
Opus Variable Excellent Modern networks

SRTP Encryption

All RTP audio is encrypted by default using AES-256-CM with HMAC-SHA1-80 authentication (RFC 3711 / RFC 4568) suitable for OFFICIAL-SENSITIVE classification. Key exchange occurs during SIP INVITE via SDP crypto attributes.

Security

SRTP encryption is always enabled and cannot be disabled. This ensures all voice communications meet MoD OFFICIAL-SENSITIVE security baseline.

Address Book

The client can load contacts from a JSON address book:

./build/bin/gva-voip-client --address-book ~/.config/gva-voip-client/contacts.json

Command Line Options

gva-voip-client [options]

SIP Options:
  -u, --user <username>      SIP username (e.g. alice)
  -s, --server <host>        SIP server host or IP
  -p, --port <port>          SIP server port (default: 5060)
  --local-port <port>        Local SIP listen port (default: 5061)
  --rtp-port <port>          Local RTP base port (default: 10000)
  -n, --display-name <name>  SIP display name

Codec Options:
  --codec-profile <profile>  SDP codec priority profile:
                             - tactical: MELPe NB, STANAG 4591
                             - wideband: TSVCIS WB+NB (RFC 8817)
                             - standard: Opus/G.711
                             Default: tactical
  --codecs                   Show available audio codecs and license info

Auto-Answer Options:
  --auto-answer              Automatically answer incoming calls (implies --headless)
  --play-wav <path>          WAV file to play when call is auto-answered
  --hangup-after <seconds>   Hang up after N seconds (0 = after WAV ends)

Other:
  --headless                 Run without GUI
  --address-book <path>      Path to address book JSON file
  -h, --help                 Show help
  -v, --version              Show version

Example Usage

Basic Registration

# Connect to local server
./build/bin/gva-voip-client \
    --user operator1 \
    --server 127.0.0.1

# Connect to remote server with display name
./build/bin/gva-voip-client \
    --user crew1 \
    --server voip.unit.mil \
    --display-name "Crew Station 1"

Secure Calling

# SRTP encryption is enabled by default (AES-256-CM)
./build/bin/gva-voip-client \
    --user secure1 \
    --server 127.0.0.1

Tactical Mode (Low Bandwidth)

# Use tactical codec profile (MELPe, STANAG 4591)
./build/bin/gva-voip-client \
    --user tac1 \
    --server 127.0.0.1 \
    --codec-profile tactical

Wideband Mode

# Use wideband codec profile (TSVCIS WB+NB)
./build/bin/gva-voip-client \
    --user wb1 \
    --server 127.0.0.1 \
    --codec-profile wideband

Auto-Answer (Intercom/Relay)

# Auto-answer and play a WAV file
./build/bin/gva-voip-client \
    --user intercom \
    --server 127.0.0.1 \
    --auto-answer \
    --play-wav /path/to/message.wav \
    --hangup-after 0

# Auto-answer, play message, then hang up after 30 seconds
./build/bin/gva-voip-client \
    --user relay \
    --server 127.0.0.1 \
    --auto-answer \
    --play-wav /path/to/greeting.wav \
    --hangup-after 30

Audio Device Selection

Audio devices are selected via the GUI or use system defaults in headless mode.

Common Device Names

Type Example Names
USB Headset "USB Audio Device", "Jabra"
Built-in "HDA Intel PCH", "Realtek"
Bluetooth "WH-1000XM4", "AirPods"
HDMI "HDMI Audio"

Setting System Defaults

In headless mode, configure default audio devices via PulseAudio/PipeWire:

# List audio sinks (outputs)
pactl list short sinks

# List audio sources (inputs)
pactl list short sources

# Set default sink
pactl set-default-sink alsa_output.usb-0d8c_USB_Audio_Device-00.analog-stereo

# Set default source
pactl set-default-source alsa_input.usb-0d8c_USB_Audio_Device-00.mono-fallback

Keyboard Shortcuts

Key Action
Enter Dial / Answer
Escape Hang up
M Mute/Unmute
H Hold/Resume
Ctrl+Q Quit

Troubleshooting

No Audio

  1. Check audio device selection in the GUI
  2. Verify microphone permissions
  3. Test with arecord -l and aplay -l

Registration Failed

  1. Verify server address and port
  2. Check firewall (UDP 5060)
  3. Ensure username is unique

Poor Audio Quality

  1. Try a lower bandwidth codec (G.729 or MELPe)
  2. Check network latency with ping
  3. Verify QoS/DSCP marking is enabled on network

Echo/Feedback

  1. Use headphones instead of speakers
  2. Enable acoustic echo cancellation (AEC) if available
  3. Reduce speaker volume

Configuration Files

Address Book

The address book is a JSON file containing contacts. Pass it via --address-book:

{
  "contacts": [
    {
      "name": "Operator 2",
      "uri": "operator2@192.168.1.10"
    },
    {
      "name": "AI Agent",
      "uri": "agent@192.168.1.10"
    },
    {
      "name": "Command Post",
      "uri": "cmd@10.0.0.1"
    }
  ]
}

No Settings File

The VoIP client uses command-line options for all configuration. For persistent settings, create a shell alias or wrapper script:

# ~/.bashrc
alias voip-client='gva-voip-client --user=crew1 --server=192.168.1.10'

See Also