mic/plans/5ee51f9b-4ba2-4474-8d6b-b7a...

4.3 KiB

작업 플랜

  • UUID: 5ee51f9b-4ba2-4474-8d6b-b7ad3306857b
  • 작업자: Codex
  • 생성 시각: 2026-06-02 16:50 KST
  • 요청 요약: 클라이언트 실행 중 Wi-Fi 송신과 별도 로컬 녹음 저장을 동시에 수행하는 기능 검토

할 일

  • 현재 요청 확인
  • 기능 목표 정리
  • server 작업영역을 수정하지 않는 범위 확인
  • 구현 계획 사용자 확인
  • 사용자 실행 지시 후 client 구현
  • 빌드 또는 가능한 범위의 검증
  • 완료 내용 정리

범위

  • client/ 작업만 대상으로 합니다.
  • server/ 작업영역은 수정하지 않습니다.
  • 사용자가 계획을 확정하고 실행을 지시하기 전까지 C++ 코드는 수정하지 않습니다.

기능 목표

  • 클라이언트가 실행되면 USB 마이크 입력을 기존처럼 Wi-Fi UDP로 전송합니다.
  • 동시에 같은 캡처 오디오를 Orange Pi 내부 저장장치에 녹음 파일로 저장합니다.
  • 방송 중 네트워크 끊김, 패킷 손실, 음성 깨짐이 발생해도 로컬 녹음본으로 후작업할 수 있게 합니다.

초기 구현 방향 후보

  • 저장 형식은 무압축 WAV를 우선 검토합니다.
  • 저장 데이터는 현재 송신 payload와 같은 signed 16-bit little endian PCM을 사용합니다.
  • 파일명은 녹음을 시작한 일자와 실행 시각 기반으로 자동 생성하는 방식을 우선 검토합니다.
  • 분할 저장은 하지 않고, 클라이언트 실행 1회마다 새 녹음 파일 1개를 만듭니다.
  • 클라이언트가 재부팅 또는 재실행되면 새 파일을 생성합니다.
  • 설정 파일에 로컬 녹음 활성화 여부와 저장 경로를 추가하는 방식을 우선 검토합니다.
  • 디스크 쓰기 실패가 UDP 송신 전체를 즉시 망가뜨리지 않도록 오류 처리 방식을 정해야 합니다.

확인할 설계 쟁점

  • 저장 파일은 실행 1회 기준 단일 WAV로 둡니다.
  • 저장 위치 기본값은 실행 위치 기준 recordings/로 둡니다.
  • 디스크 용량 부족이나 파일 쓰기 실패가 발생해도 프로그램은 종료하지 않고 Wi-Fi 송신을 계속합니다.

사용자 확정 내용

  • 녹음 파일 분할은 하지 않습니다.
  • 녹음을 시작한 일자 기준으로 파일을 만듭니다.
  • 클라이언트가 재부팅 또는 재실행되면 신규 파일을 만듭니다.
  • 로컬 녹음은 항상 켜진 상태를 기본값으로 둡니다.
  • 녹음 제어는 이후 서버에서 수행할 예정입니다.
  • 저장 위치 기본값은 recordings/로 둡니다.
  • 어떠한 경우라도 녹음 파일 문제 때문에 클라이언트 프로그램이 종료되면 안 됩니다.
  • 녹음 파일 생성 또는 쓰기에 실패하면 예외를 처리하고, 저장 없이 Wi-Fi 전송만 계속합니다.

구현 기준

  • record_enabled 기본값은 true로 둡니다.
  • record_dir 기본값은 recordings로 둡니다.
  • WAV 파일 열기, 디렉터리 생성, 파일 쓰기, 헤더 갱신 실패는 치명 오류로 처리하지 않습니다.
  • 녹음 실패 상태는 로그로 알리고 UDP 송신 루프는 계속 유지합니다.
  • 녹음이 비활성화되거나 실패한 상태에서도 ALSA 캡처와 UDP 송신은 계속 진행합니다.

완료 요약

  • client/src/main.cpp에 로컬 WAV 백업 녹음 기능을 추가했습니다.
  • 클라이언트 실행 시 recordings/mic-client-YYYYMMDD-HHMMSS.wav 형식의 파일을 생성합니다.
  • 파일 분할은 하지 않고, 실행 1회마다 파일 1개를 생성합니다.
  • 녹음 파일 생성, 디렉터리 생성, 파일 쓰기, 종료 시 WAV 헤더 갱신 실패는 경고만 출력하고 UDP 송신은 계속합니다.
  • client/client.conf.examplerecord_enabled = true, record_dir = recordings를 추가했습니다.
  • client/README.mddocs/02-client-direction.md에 로컬 백업 녹음 동작을 문서화했습니다.
  • server/ 작업영역은 수정하지 않았습니다.

검증 결과

  • cmake -S client -B client/build를 실행했으나, 현재 macOS 로컬 환경에 ALSA 헤더와 라이브러리가 없어 구성 단계에서 실패했습니다.
  • 실패 원인: Could NOT find ALSA (missing: ALSA_LIBRARY ALSA_INCLUDE_DIR)
  • 실제 빌드 검증은 Orange Pi 또는 libasound2-dev가 설치된 Linux 환경에서 수행해야 합니다.