VoiceConnect
VoiceConnect 샘플은, 다른 player와의 네트워킹에 의해, Microsoft® DirectPlay® Voice 의 채팅 세션을 시작 하는 방법을 나타낸다. 세션에 참가하는지, 또는 세션을 생성 하면, player는 마이크를 사용해 회화할 수 있게 된다. 세션에는, 다른 player도 언제라도 참가할 수 있다.
패스
소스 파일 : (SDK 루트) \Samples\C++\DirectPlay\VoiceConnect
실행 가능 파일 :(SDK 루트) \Samples\C++\DirectPlay\Bin
사용자가이드
접속 방법에 대해서는,SimplePeer 샘플의 「사용자가이드」를 참조할것. 접속 후는, 사용하는 음성 CODEC 를 지정하는 다이알로그 박스가 호스트에게 표시된다. 보통, 음성 애플리케이션은 자동적으로 음성 CODEC 를 선택하는지, 다른 방법으로 사용자를 선택할 수 있도록(듯이) 한다. 채팅 세션이 시작 되면 모두 클라이언트도 [Setup] 를 클릭해, 재생 또는 캡춰의 설정을 변경할 수 있다.
주 Internetwork Packet Exchange (IPX) 서비스 프로바이더를 선택했을 경우, DirectPlay 에 주소의 검색을 실행시키려면 ,[use DPNSVR] 체크 박스를 온으로 한다.
프로그래밍 정보
VoiceConnect 샘플은, SimplePeer 샘플과 매우 닮은 형식이다. VoiceConnect 가 다른 것은, 클라이언트가 DirectPlay Voice 를 사용해, 컴퓨터의 마이크를 이용해 서로 회화를 할 수 있는 것이다. 상세한 프로그래밍 정보에 대해서는, SimplePeer 샘플의 「프로그래밍 정보」를 참조할것.
음성 기능을 생성 하기 위해서는, 애플리케이션은 최초로 DirectPlay Voice 를 초기화할 필요가 있다. 이 샘플에서는, 메인 다이알로그 박스가 초기화될 때 CNetVoice::Init 를 호출해, 이 처리를 실행한다. CNetVoice::Init 는, 다음의 태스크를 실행한다.
VoiceSessionTestAudioSetup 함수를 호출해, DirectPlay Voice 에 의해, 오디오 설정을 테스트한다. VoiceSessionTestAudioSetup 는, 다음의 처리를 실행한다.
- CoCreateInstance 를 사용해 IDirectPlayVoiceTest 개체를 생성 한다.
- DVFLAGS_QUERYONLY 플래그를 설정해 IDirectPlayVoiceTest::CheckAudioSetup 를 호출한다. 셋업 위저드를 실행할 필요가 있는 경우, DVERR_RUNSETUP 가 반환된다. 셋업 위저드를 실행하려면 , DVFLAGS_QUERYONLY 플래그를 설정하지 않고 IDirectPlayVoiceTest::CheckAudioSetup 를 한번 더 호출한다. 값이 정상적으로 돌려받는 경우, VoiceConnect 샘플은 처리를 계속해, 그렇지 않은 경우, 샘플은 종료한다.
- IDirectPlayVoiceTest 개체를 릴리즈 한다.
- player가 호스트가 되고 있는 경우,VoiceSessionCreate 함수를 호출해, DirectPlay Voice 를 사용해 오디오 설정을 생성 한다. VoiceSessionCreate 는, 다음의 처리를 실행한다.
- CoCreateInstance 를 사용해 IDirectPlayVoiceServer 를 생성 한다.
- IDirectPlayVoiceServer::Initialize 를 호출해, 음성 서버의 메시지 핸들러를 등록한다. 여기에서도, DirectPlay 인터페이스가 건네받는다.
- DVSESSIONDESC 구조체에 세션 타입과 필요한 음성 CODEC 의 정보를 저장 한다.
- IDirectPlayVoiceServer::StartSession 를 호출해,DVSESSIONDESC 구조체에 건네준다.
- player가 호스트가 되는지 참가하는 경우, 애플리케이션은 VoiceSessionConnect 함수를 호출한다. 이 함수는, 다음의 순서를 사용해 세션에 접속한다.
- CoCreateInstance 를 사용해 IDirectPlayVoiceClient 를 생성 한다.
- IDirectPlayVoiceClient::Initialize 를 호출해, 음성 클라이언트의 메시지 핸들러를 등록한다. 여기에서도, DirectPlay 인터페이스가 건네받는다.
- Microsoft DirectShow® 의 재생 장치와 캡춰 장치의 글로벌 일의 식별자 (GUID)를 DVSOUNDDEVICECONFIG 구조체에 저장 한다.
- DVCLIENTCONFIG 구조체에 정보를 저장 한다. 이 샘플로, 이 구조체에 정보가 저장 되는 것은, 다이알로그 박스가 사용될 때이다. 한층 더 복잡한 애플리케이션에서는, 다른 방법을 사용하면 좋다. VoiceConnect.cpp 의 VoiceConfigDlgProc 함수를 참조할것.
- IDirectPlayVoiceClient::Connect 를 호출해,DVSOUNDDEVICECONFIG 및 DVCLIENTCONFIG 구조체를 건네준다.
- 목적의 디폴트 타겟으로 IDirectPlayVoiceClient::SetTransmitTargets 를 호출한다. 이 샘플은, 타겟값을 DVID_ALLPLAYERS 로 설정한다. DVID_ALLPLAYERS 는, 모든 player를 타겟으로 한다.
- IDirectPlayVoiceClient::GetSoundDeviceConfig 를 호출한다. 돌려주어진 DVSOUNDDEVICECONFIG 구조체의 dwflags 멤버로 DVSOUNDCONFIG_HALFDUPLEX 를 체크해, 이 클라이언트는 반이중 모드일지 어떨지를 확인한다. 반이중 모드에서는, 클라이언트는 이야기할 수 없지만, (들)물을 수 있다.
DirectPlayVoiceClientMessageHandler 는, 다른 DirectPlay 메시지를 처리한다. 그 메시지의 예를 다음에 나타낸다.
- DVMSGID_CREATEVOICEPLAYER
- DVMSGID_DELETEVOICEPLAYER
- DVMSGID_HOSTMIGRATED
- DVMSGID_GAINFOCUS 및 DVMSGID_LOSTFOCUS
- DVMSGID_RECORDSTART
- DVMSGID_RECORDSTOP
- DVMSGID_PLAYERVOICESTART
- DVMSGID_PLAYERVOICESTOP
[Exit] 가 클릭되었을 경우, 애플리케이션은 CNetVoice::Free 를 호출해, DirectPlay Voice 를 클린 업 할 필요가 있다. CNetVoice::Free 는, 다음의 처리를 실행한다.
- 음성 세션으로부터 player의 접속을 해제한다. VoiceSessionDisconnect 함수는 IDirectPlayVoiceClient::Disconnect 를 호출해,IDirectPlayVoiceClient 개체를 릴리즈 한다.
- 이 player가 호스트인 경우, 음성 세션을 삭제한다. VoiceSessionDestroy 함수는 IDirectPlayVoiceServer::StopSession 를 호출해,IDirectPlayVoiceServer 개체를 릴리즈 한다.