Skip to content

Latest commit

 

History

History
314 lines (217 loc) · 9 KB

File metadata and controls

314 lines (217 loc) · 9 KB

기능별 구현 현황 📊

OnVoice COM 브리지 개발 기능 중심 진행 상황

마지막 업데이트: 2025-11-20
현재 상태: 핵심 기능 완료 ✅ + E2E 테스트 성공 🎉 + 데드락 수정 완료 🐛 → Electron 연동 준비 중


🎯 전체 진행률

[████████████░░░░] 70% (18h / 50h)

✅ 완료: COM 인터페이스, 이벤트 시스템, 캡처 엔진
⏳ 진행 예정: Electron 연동, 다중 프로세스 지원

✅ 완료된 기능

1. COM 인터페이스 구현 ✅

구현 상태: 완료
소요 시간: 2시간
완료 날짜: 2025-11-18

주요 기능:

  • IOnVoiceCapture 인터페이스 정의 (IDL)
  • StartCapture(LONG processId) - PID 기반 캡처 시작
  • StopCapture() - 캡처 중지
  • GetCaptureState(LONG* pState) - 상태 조회
  • IDispatch 지원 (VBScript/JavaScript 호출 가능)
  • ✅ 상태 관리 (CaptureState enum: Stopped/Starting/Capturing/Stopping)

구현 파일:

  • OnVoiceAudioBridge.idl - 인터페이스 정의
  • OnVoiceCapture.h/.cpp - COM 클래스 구현

검증:

  • ✅ VBScript에서 COM 객체 생성 성공
  • ✅ 메서드 호출 정상 작동
  • ✅ 상태 전환 확인 (0 → 1 → 2 → 3 → 0)

2. COM 이벤트 시스템 ✅

구현 상태: 완료
소요 시간: 2시간
완료 날짜: 2025-11-18

주요 기능:

  • _IOnVoiceCaptureEvents dispinterface 정의
  • IConnectionPoint / IConnectionPointContainer 구현
  • ✅ GIT (Global Interface Table) 프록시를 통한 스레드 간 안전한 이벤트 전송
  • OnAudioData(SAFEARRAY(BYTE) pcmData) 이벤트
  • ✅ SAFEARRAY를 사용한 바이너리 데이터 전송
  • ✅ 오디오 캡처 스레드(MTA)에서 스크립트 아파트먼트로 마샬링

핵심 구현:

// GIT 프록시 등록 (StartCapture 시)
m_gitSinks[i].Attach(spDisp);

// 오디오 스레드에서 이벤트 전송
m_gitSinks[i].CopyTo(&spDispatch);
spDispatch->Invoke(dispidOnAudioData, ...);

구현 파일:

  • OnVoiceAudioBridge.idl - 이벤트 인터페이스 정의
  • OnVoiceCapture.cpp - Fire_OnAudioData() 구현

검증:

  • ✅ VBScript에서 이벤트 수신 성공
  • ✅ 실시간 오디오 데이터 전송 확인
  • ✅ 스레드 간 안전성 검증

3. 오디오 캡처 엔진 ✅

구현 상태: 완료
소요 시간: 2시간
완료 날짜: 2025-11-18

주요 기능:

  • AudioCaptureEngine 래퍼 클래스
  • ProcessLoopbackCapture 통합
  • ✅ PID 기반 프로세스별 오디오 캡처
  • ✅ 16kHz mono 16-bit PCM 자동 변환
  • IAudioDataCallback 콜백 인터페이스
  • ✅ 스레드 로컬 COM 초기화 (오디오 스레드용)

캡처 설정:

  • Sample Rate: 16kHz (STT 최적화)
  • Bit Depth: 16-bit
  • Channels: Mono
  • Format: PCM

구현 파일:

  • AudioCaptureEngine.h/.cpp - 캡처 엔진 래퍼
  • ProcessLoopbackCapture.h/.cpp - 실제 WASAPI 캡처

검증:

  • ✅ Discord/Chrome PID로 선택적 캡처 성공
  • ✅ 16kHz mono PCM 데이터 확인
  • ✅ 실시간 스트리밍 정상 작동

4. 상태 관리 시스템 ✅

구현 상태: 완료
완료 날짜: 2025-11-18

주요 기능:

  • CaptureState enum 정의
    • Stopped = 0 - 중지됨
    • Starting = 1 - 시작 중
    • Capturing = 2 - 캡처 중
    • Stopping = 3 - 중지 중
  • ✅ 상태 전환 검증
  • ✅ 동시성 안전성 (멀티스레드 모델)

구현 위치:

  • OnVoiceCapture.h - enum 정의
  • OnVoiceCapture.cpp - 상태 전환 로직

5. 테스트 및 검증 ✅

구현 상태: 완료
완료 날짜: 2025-11-18
E2E 테스트 완료: 2025-11-20 🎉

테스트 스크립트:

  • TestOnVoiceEvents.vbs - 이벤트 수신 테스트
  • TestPidCapture.vbs - PID 기반 캡처 테스트
  • TestAudioCaptureEngine.vbs - 엔진 연동 테스트
  • TestCaptureToWav.vbs - WAV 파일 저장 E2E 테스트 🎉 신규!

검증 결과:

✅ COM 객체 생성 성공
✅ StartCapture(PID) → 실제 오디오 캡처 시작
✅ OnVoice_OnAudioData 이벤트 수신 성공
✅ 16kHz mono PCM 데이터 실시간 전송 확인
✅ 상태 전환 확인 (Stopped → Starting → Capturing → Stopping → Stopped)
✅ 모든 테스트 통과!

E2E 테스트 결과 (2025-11-20):

✅ 945개의 오디오 청크 수집 성공
✅ 총 데이터 크기: 323,190 bytes
✅ StopCapture 정상 작동
✅ WAV 파일 저장 완료: capture_Chrome_2025-11-20_오후_25001.wav
✅ 전체 E2E 테스트 통과! 🎉

6. 데드락 방지 메커니즘 ✅

구현 상태: 완료
완료 날짜: 2025-11-20
상태: ✅ 완료

주요 기능:

  • Fire_OnAudioData에서 상태 체크 먼저 수행 (1차 방어)
  • StopCapture에서 상태 먼저 변경 + 200ms 대기 (2차 방어)
  • AudioCaptureEngine::Stop에서 콜백 먼저 끊기 + 50ms 대기 (3차 방어)
  • ProcessLoopbackCapture::Reset에서 스레드 종료 순서 개선

문제 상황:

Main Thread: StopCapture() → 스레드 Join 대기
오디오 스레드: Fire_OnAudioData() → IDispatch::Invoke 마샬링 대기
❌ 데드락 발생!

해결 방법:

  1. Fire_OnAudioData: m_state != Capturing이면 즉시 리턴
  2. StopCapture: 상태를 Stopping으로 먼저 변경 → 200ms 대기
  3. AudioCaptureEngine::Stop: 콜백 포인터 먼저 nullptr 설정 → 50ms 대기

검증 결과:

✅ StopCapture() 호출 시 데드락 없이 정상 종료
✅ 오디오 스레드가 안전하게 종료
✅ VBScript 이벤트 처리 완료 후 정상 종료

⏳ 진행 예정 기능

6. Electron 연동

구현 상태: 계획
예상 소요: 18-22시간
난이도: ⭐⭐⭐⭐ 매우 어려움

필요 작업:

  • winax 설치 및 재빌드
  • Electron Main 프로세스에서 COM 객체 생성
  • 이벤트 수신 및 Renderer로 전송
  • IPC 통신 구현
  • E2E 테스트

7. 다중 프로세스 지원

구현 상태: 계획
예상 소요: 4-6시간

필요 작업:

  • 여러 COM 객체 인스턴스 동시 생성
  • Discord/Chrome/Edge 동시 캡처
  • 프로세스 격리 검증

8. 안정화 및 최적화

구현 상태: 계획
예상 소요: 6-8시간

필요 작업:

  • 메모리 누수 검사 (1시간 연속 실행)
  • 크래시 시나리오 테스트
  • 성능 최적화 (latency < 3초)
  • 에러 처리 개선

📊 시간 효율

기능 계획 실제 차이
COM 인터페이스 4h 2h -2h
COM 이벤트 시스템 3h 2h -1h
오디오 캡처 엔진 4h 2h -2h
상태 관리 시스템 1h 0.5h -0.5h
테스트 및 검증 2h 1.5h -0.5h
완료된 기능 합계 14h 8h -6h 🎉
전체 누적 39h 18h -21h 🎉

🎯 다음 우선순위

  1. Electron 연동 (최우선) - COM → Electron Main → Renderer
  2. 다중 프로세스 지원 - 동시 캡처 기능
  3. 안정화 - 장시간 실행 테스트 및 최적화

📚 상세 문서

각 기능별 상세 내용은 다음 문서를 참조하세요:


📋 마일스톤

마일스톤 상태 날짜 비고
COM 인터페이스 완성 ✅ 완료 2025-11-18 IOnVoiceCapture
이벤트 시스템 완성 ✅ 완료 2025-11-18 IConnectionPoint
캡처 엔진 통합 완성 ✅ 완료 2025-11-18 AudioCaptureEngine
E2E 테스트 성공 완료 2025-11-20 WAV 파일 저장 🎉
Electron 연동 📅 예정 2025-11-19 winax
MVP 완성 📅 예정 2025-12-04 E2E 테스트

마지막 업데이트: 2025-11-20
현재 포커스: Electron 연동 준비
다음 마일스톤: Electron Main 프로세스 연동