mic/client/README.md

97 lines
2.2 KiB
Markdown

# 클라이언트
Orange Pi Zero 2W에서 실행할 USB 마이크 송신기입니다.
초기 목표는 USB 마이크 입력을 ALSA로 캡처하고, Mac 수신기로 UDP 패킷을 보내 실제 소리가 나오는지 확인하는 것입니다.
## 현재 범위
- C++17
- ALSA 기반 캡처
- UDP 송신
- 단일 송신기
- 무압축 signed 16-bit little endian PCM
- 설정 파일 기반 Mac 수신기 주소 지정
자동 검색, 압축, 다중 송신기, 동기화, 지연 시간 최적화는 이후 단계에서 다룹니다.
## 필요 패키지
Orange Pi 공식 Debian 12 Bookworm Server 기준으로 다음 패키지가 필요합니다.
```bash
sudo apt update
sudo apt install build-essential cmake libasound2-dev
```
## 빌드
```bash
cd client
cmake -S . -B build
cmake --build build
```
## 설정
예시 설정 파일을 복사해서 사용합니다.
```bash
cp client.conf.example client.conf
```
주요 값:
```text
server_host = 192.168.0.10
server_port = 4860
alsa_device = default
sample_rate = 48000
channels = 1
frame_ms = 20
```
`server_host`는 Mac 수신기의 IP 주소로 바꿉니다.
초기 버전은 단일 포트 `4860`을 사용합니다. 이후 여러 포트가 필요해지면 `4800-5000` 범위 안에서 배정하는 방향으로 둡니다.
## 실행
```bash
./build/mic-client --config client.conf
```
종료는 `Ctrl+C`로 합니다.
## 마이크 확인
Orange Pi에서 USB 마이크 인식 여부를 먼저 확인합니다.
```bash
arecord -l
arecord -L
```
마이크가 `default`로 바로 잡히지 않으면 `client.conf``alsa_device` 값을 `plughw:CARD,DEV` 또는 `hw:CARD,DEV` 형태로 지정합니다.
## 패킷 형식
현재 클라이언트는 각 UDP 패킷 앞에 40바이트 헤더를 붙이고, 그 뒤에 PCM payload를 붙입니다.
헤더 숫자 값은 network byte order로 전송합니다. PCM payload는 signed 16-bit little endian입니다.
```text
magic 4 bytes "MIC1"
version u16
header_size u16
sequence u64
timestamp_frames u64
sample_rate u32
channels u16
bits_per_sample u16
frame_count u32
payload_bytes u32
```
서버 구현은 이 형식에 맞춰 UDP 패킷을 수신하고 PCM payload를 재생하거나 저장하면 됩니다.