Play Audio 샘플
Play Audio 샘플
Play Audio 샘플에서는, 세그먼트(segment)를 로드해 오디오 패스로 연주하는 방법, DirectMusic 통지를 사용하는 방법, 글로벌 퍼포먼스 파라미터를 변경할 방법이 나타나고 있다.
패스
소스 :(SDK 루트) \Samples\C++\DirectMusic\PlayAudio
실행 가능 파일 :(SDK 루트) \Samples\C++\DirectMusic\Bin
사용자가이드
디폴트의 세그먼트(segment)를 연주하는지,[Open File] 를 클릭해 다른 WAV, MIDI, 또는 DirectMusic 세그먼트(segment)의 파일을 로드한다. 슬라이더를 사용해 템포와 볼륨을 조정한다. 다만, WAV 파일의 템포를 조정할 수 없다.
프로그래밍 메모
OnInitDialog 함수는 다음의 처리를 실행한다.
- g_hDMusicMessageEvent 이벤트를 생성 한다. DirectMusic 의 통지를 수신할 때마다, DirectMusic 는 이 이벤트를 사용해 애플리케이션에 통지한다.
- CMusicManager 클래스의 개체 g_pMusicManager 를 생성 한다.
- CMusicManager 개체를 초기화한다. 이것에 의해 다음의 처리를 한다.
- IDirectMusicPerformance8::AddNotificationType 를 호출해 GUID_NOTIFICATION_SEGMENT 형의 통지를 요구한다. 애플리케이션이 세그먼트(segment)의 종료를 확인할 수 있도록(듯이), DirectMusic 는 모든 세그먼트(segment) 이벤트를 애플리케이션에 통지한다.
- IDirectMusicPerformance8::SetNotificationHandle 를 호출해,g_hDMusicMessageEvent 에 핸들이 들어가 있는 이벤트를 건네준다. 이것을 받은 DirectMusic 는, 통지를 이용할 수 있을 때 이 이벤트를 통지한다.
WinMain 함수는 다음의 태스크를 실행한다.
- CreateDialog 를 사용해 윈도우를 생성 한다.
- 메시지 루프내에서,MsgWaitForMultipleObjects 를 호출해 g_hDMusicMessageEvent 를 건네준다. 이것을 받는 것으로,g_hDMusicMessageEvent 이 통지된 것을 알 수 있다. DirectMusic 은, DirectMusic 통지를 수신할 때마다 이 이벤트를 통지한다.
- WAIT_OBJECT_0 가 돌려주어졌을 경우는, ProcessDirectMusicMessages 를 호출한다.
- WAIT_OBJECT_0 + 1 이 돌려주어졌을 경우는, Windows 메시지를 이용할 수 있다. 이 함수는,PeekMessage 를 사용해 메시지의 표준적인 처리를 실시한다.
[Open File] 를 클릭 하면,OnOpenSoundFile 함수에 의해 다음의 태스크가 실행된다.
- 파일명을 얻어온다.
- 이전에 생성 한 세그먼트(segment)가 있으면, 이것을 릴리즈 한다.
- Dmutil.cpp 내의 CMusicManager::CollectGarbage 를 호출한다. 이것에 의해 IDirectMusicLoader8::CollectGarbage 가 불려 가 미사용 개체가 릴리즈 된다. 「가베지 콜렉션」을 참조할것.
- CMusicManager::SetSearchDirectory 를 호출한다. IDirectMusicLoader8::SetSearchDirectory 가 불려 가 GUID_DirectMusicAllTypes 와 디렉토리가 건네받는다. 이것에 의해, 세그먼트(segment)에 의해 참조되는 파일의 장소가 DirectMusic 에게 전할 수 있다.
- CMusicManager::CreateSegmentFromFile 를 호출해,g_pMusicSegment 로 불리는 CMusicSegment 를 생성 한다. 이 처리는 다음의 순서로 행해진다.
[Play] 를 클릭 하면,OnPlayAudio 함수에 의해 다음의 처리가 실행된다.
- 그 사운드를 루프 하는 경우는,CMusicSegment::SetRepeats 를 호출해 DMUS_SEG_REPEAT_INFINITE 를 건네준다. 루프 하지 않는 경우는, 반복을 0 으로 설정한다.
- CMusicSegment::Play 을 호출해 IDirectMusicPerformance8::PlaySegmentEx 를 호출한다.
통지를 하면ProcessDirectMusicMessages 함수는 세그먼트(segment)가 정지된 것을 나타내는 메시지를 검색한다. 다음의 태스크가 실행된다.
- 루프내에서 IDirectMusicPerformance8::GetNotificationPMsg 를 호출해 이용 가능한 각 메시지를 처리한다. S_OK 가 돌려받는 한 루프는 반복된다. 이용 가능한 메시지가 없어지면 S_FALSE 가 반환된다.
- DMUS_NOTIFICATION_PMSG 구조체의 dwNotificationOption 가 DMUS_NOTIFICATION_SEGEND 의 경우는,punkUser 멤버상에서 QueryInterface 를 호출해, 종료한 세그먼트(segment) 인스턴스의 IDirectMusicSegmentState8 인터페이스를 얻어온다. IDirectMusicSegmentState8::GetSegment 를 사용하면 세그먼트(segment) 자체가 취득된다. 이 메서드는 IDirectMusicSegment 를 돌려준다. IDirectMusicSegment8 를 얻어오려면 QueryInterface 를 사용할 필요가 있다. 애플리케이션은 이 포인터를 글로벌 1차 세그먼트(segment)의 포인터와 비교해, 그것이 정말로 정지된 1차 세그먼트(segment)인 것을 확인한다. DirectMusic Producer 로 생성 한 세그먼트(segment)를 다른 세그먼트(segment)의 방아쇠로 할 수가 있다. 이 때문에, 연주되고 있었던 것이 1차 세그먼트(segment) 뿐이다고는 할 수 없다.
- 모든 인터페이스를 클린 업 한다.
참조