오래된 내비게이션과 CarPlay
오래된 ARM 내비게이션에서 CarPlay를 쓰기 위한 WinCE 클라이언트, Unikit을 만들고 있습니다. AutoKit의 화면·글꼴 호환성을 분석하던 작업에서 USB 동글, 영상 디코더와 오디오를 직접 연결하는 실험으로 이어졌습니다.
오래된 기기의 경계를 이해하기
USB로 들어온 데이터가 실제 화면과 소리가 되기까지의 경로를 하나씩 확인했습니다. 영상이 빠지는 문제를 수신과 파싱 경계에서 찾고, 기본 영상 렌더러의 충돌을 피해 기기의 하드웨어 디코더와 화면 출력을 연결했습니다.
설계와 구현
구성과 데이터 흐름
iPhone ↔ CarPlay 동글 ↔ USB 수신·스트림 파서
영상 → H.264 디코더 → 프레임 정보 → 화면 출력
오디오 → 역할별 큐 → PCM 믹서 → Audio Renderer
USB 수신, 프로토콜 파싱, 영상 공급, 오디오 처리를 각각의 작업으로 나눴습니다. 수신한 메시지를 영상·오디오·제어로 분기하고, 터치 입력과 연결 유지를 위한 heartbeat는 USB 송신 작업으로 전달합니다. 느린 디코딩이나 출력 처리가 다른 경로를 막는 지점을 분리해 추적하기 위한 구조입니다.
USB 읽기와 메시지 경계를 분리하기
헤더와 본문을 따로 읽던 방식에서 압축 영상의 P-frame이 빠지는 문제를 발견했습니다. 수신 바이트를 하나의 버퍼에 이어 붙이고 완전한 메시지가 모였을 때 해석하는 파서로 바꿨습니다. 잘못된 헤더 뒤에서는 경계를 다시 찾고, 한 번의 파싱에 처리량과 시간 한도를 두어 다른 작업도 진행할 수 있게 했습니다.
하드웨어 디코더와 화면 사이의 연결
H.264를 Telechips의 TCCVPUDecFilter에 공급하고, 직접 만든 DirectShow sink에서 디코딩된 프레임 정보를 받습니다. 이를 RDMA3의 YUV 화면 출력으로 연결해 기본 렌더러에서 발생하던 충돌을 피했습니다. 기기의 디코더와 출력 경로를 활용할 수 있는 대신, 특정 칩셋의 프레임 형식과 화면 설정에 의존하는 선택입니다.
음악과 안내 음성을 함께 처리하기
미디어와 내비 안내·음성·통화 등을 역할별 큐로 나누고, 48kHz 스테레오 PCM으로 맞춰 20ms 단위로 섞어 DirectShow Audio Renderer에 전달합니다. 안내 중에는 음악을 낮추고 큐마다 버퍼 상한을 둡니다. 영상과 오디오의 적체를 각각 관찰할 수 있도록 수신·믹싱·출력 경계를 나눴습니다.
검증과 남은 범위
오디오 처리와 세션 손실 후 재접속 코드를 통합했습니다. 통합한 앱 전체의 안정성은 아직 확인하는 단계입니다. 안내·음성·통화가 겹치는 조건과 반복 연결 후의 자원 정리는 추가 검증이 필요합니다.
지금까지와 다음 단계
화면·터치·미디어 오디오는 이전 실기기 실험에서 동작을 확인했습니다. 현재는 이 경로를 통합한 앱의 연결·종료·재접속 동작을 다듬고 있습니다.