Проект реализует передачу аудио по UDP между разными системами:
- 🎤 запись звука на Mac (client)
- 📦 разбиение на чанки
- 🌐 отправка по UDP
- 📥 приём и сборка в WSL (server)
- 🔊 воспроизведение звука
Реализовать и понять:
- передачу бинарных данных по UDP
- собственный сетевой протокол
- работу аудио через
miniaudio - взаимодействие Mac ↔ WSL (Windows)
solution/
├── CMakeLists.txt
├── conanfile.txt
├── README.md
├── src/
│ ├── audio.h # Player (miniaudio)
│ └── main.cpp # UDP сервер
└── build/
├── bin/
│ └── radio # исполняемый файл
└── ... # CMake / Conan файлы
radio_mac/
├── audio.h # только Recorder
├── main.cpp # client-only (1.5 сек запись)
├── miniaudio.h # библиотека
└── client # бинарник
Mac (client)
🎤 запись (Recorder)
↓
📦 chunking + header
↓
🌐 UDP
↓
WSL (server)
📥 приём чанков
↓
🧩 сборка сообщения
↓
🔊 воспроизведение (Player)
Ситуация выглядела идеально:
✔ UDP пакеты приходят
✔ чанки собираются
✔ Message complete есть
❌ звука НЕТ
Вот эта строка:
ma_device_init(nullptr, &device_config, &device_);Это означает:
miniaudio сам выбирает backend
Но в WSL:
- ALSA ❌ (часто не работает)
- PulseAudio ✅ (через WSLg)
- виртуальные устройства ❌
👉 miniaudio выбирает НЕ тот backend
Playing done
НО:
🔇 тишина
Использовались:
paplay
parecordИ:
export PULSE_SERVER=unix:/mnt/wslg/PulseServer👉 они гарантированно используют PulseAudio
Был принудительно задан backend:
const ma_backend backends[] = {ma_backend_pulseaudio};
ma_context_init(backends, 1, ...);
ma_device_init(&context_, ...);звук появился
WSL ≠ обычный Linux
ВСЕГДА использовать PulseAudio backend
Mac 🎤
↓
UDP
↓
WSL 📥
↓
PulseAudio
↓
WSLg
↓
Windows 🔊
Recording 1.5 seconds...
Recording done
Total bytes: ...
Sent chunk 1/...
...
All chunks sent successfully
RAW packet: ...
Accepted chunk ...
...
Message complete
Playing done
struct PacketHeader {
uint32_t magic;
uint32_t message_id;
uint32_t total_size;
uint16_t chunk_index;
uint16_t chunk_count;
uint16_t payload_size;
};- ✔ chunking (~1400 bytes)
- ✔ message_id
- ✔ сборка вне порядка
- ✔ защита от дублей
- ✔ TTL очистка
- быстрее тестировать
- меньше чанков
- меньше потерь UDP
- быстрее цикл разработки
cd build
export PULSE_SERVER=unix:/mnt/wslg/PulseServer
./bin/radio server 3333clang++ -std=c++20 main.cpp -o client
./client192.168.0.xxx
Удалось добиться:
- стабильной передачи аудио
- работы Mac → WSL
- корректного воспроизведения
- устранения “тихого бага”
если всё работает, но нет результата
→ проблема часто в среде, а не в логике
- UDP требует своего протокола
- аудио backend критичен
- WSL имеет особенности
- лог ≠ реальный результат
Mac 🎤 → UDP → WSL 🔊
Это уже полноценная межплатформенная система передачи аудио 🚀