Transfer JSON metadata between machines via audio using ggwave.
ggwave send [-protocol N] [-volume N] [-delay N] [-repeat N] [-out file.wav]
ggwave recv [-timeout duration] [-in file.wav]
Reads JSON from stdin, compresses, chunks, and transmits via speaker.
| Flag | Default | Description |
|---|---|---|
-protocol |
1 (Audible Fast) | ggwave protocol ID |
-volume |
25 | Volume (1-50) |
-delay |
2000 | Inter-chunk delay in ms |
-repeat |
1 | Per-chunk repeat count |
-out |
(speaker) | Write WAV file instead |
Listens on microphone, decodes, reassembles, and writes JSON to stdout.
| Flag | Default | Description |
|---|---|---|
-timeout |
30s | Silence timeout |
-in |
(microphone) | Read WAV file instead |
ggwave transmits up to 140 bytes per message. Larger payloads are gzip-compressed and split into chunks.
Offset Size Field
0 1 Magic+Version (0x61)
1 1 SessionID
2 1 SeqNum (0-254)
3 1 TotalChunks
4-5 2 CRC-16 CCITT (over payload)
6-139 134 Payload
Offset Size Field
0 1 Magic+Version (0x61)
1 1 SessionID
2 1 0xFF (EOT marker)
3 1 TotalChunks
4-7 4 CRC-32 (original data)
8-11 4 Original data size (big-endian)
12-43 32 SHA-256 (compressed data)
- Compress input with gzip
- Split into 134-byte chunks with 6-byte headers
- Encode each chunk with ggwave, play via speaker
- Send EOT frame twice
- Decode audio frames with ggwave
- Lock to first SessionID received
- Verify CRC-16 per chunk, deduplicate by SeqNum
- On completion: verify SHA-256 and CRC-32, decompress, output
Using Audible Fast protocol with 2-second interval:
| Input | Compressed | Chunks | Time |
|---|---|---|---|
| 500B | ~200B | 2 | ~12s |
| 1KB | ~400B | 3 | ~17s |
| 5KB | ~2KB | 15 | ~80s |