Appearance
Voice store-and-forward
Voice is modeled as codec frames carried in fragment clusters (same messageId as file transfer).
VOICE_META (0x41)
| Field | Size | Description |
|---|---|---|
codecType | 2 | See registry below |
sampleRateHz | 2 | e.g. 8000 |
durationMs | 4 | Total reconstructed audio |
frameSizeBytes | 2 | Per codec frame |
titleLen | 1 | Optional UTF-8 title |
titleUtf8 | variable |
Codec registry (examples)
These codecType values are inside the VOICE_META body (typically uint16, big-endian in dumps). They are not the mesh payloadType byte.
codecType | Codec | Typical bitrate |
|---|---|---|
0x0001 | PCM s16le mono | N/A |
0x0101 | CODEC2 1200 | 1200 bps |
0x0102 | CODEC2 700 | 700 bps |
0x0201 | Opus | 8–64 kbps |
0x0101 is the canonical ultra-narrowband mesh voice profile for long-range links.
VOICE_FRAME (0x42)
| Field | Size |
|---|---|
frameSeq | 2 |
frameBytes | remainder |
frameSeq MUST be monotonic for the message. Missing frames trigger fragment recovery.
Store-and-forward behavior
Repeaters and gateways MAY cache complete voice messages for replay to late joiners (policy). Clients SHOULD NOT cache long audio to protect flash.
Bandwidth note
Voice competes with flood traffic. Implementations SHOULD prefer unicast / tighter TTL toward known recipients when possible and lower voice bitrate on busy default community (channelHash == 0x0000) channels.
Example flow
- Originator sends
VOICE_META+ N ×VOICE_FRAMEfragments withmessageId = M. - Receiver plays incrementally if
codecTypesupports streaming; else buffers until complete. - If frame 7 missing, receiver issues
FRAG_NACKlisting index 7.