DirectMusic DirectMusic C++ 샘플 Play Audio 샘플   [목차열람] [주소복사] [슬롯비우기]
Play Audio 샘플
 
Microsoft DirectX 9.0

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 함수는 다음의 처리를 실행한다.

  1. g_hDMusicMessageEvent 이벤트를 생성 한다. DirectMusic 의 통지를 수신할 때마다, DirectMusic 는 이 이벤트를 사용해 애플리케이션에 통지한다.
  2. CMusicManager 클래스의 개체 g_pMusicManager 를 생성 한다.
  3. CMusicManager 개체를 초기화한다. 이것에 의해 다음의 처리를 한다.
  4. IDirectMusicPerformance8::AddNotificationType 를 호출해 GUID_NOTIFICATION_SEGMENT 형의 통지를 요구한다. 애플리케이션이 세그먼트(segment)의 종료를 확인할 수 있도록(듯이), DirectMusic 는 모든 세그먼트(segment) 이벤트를 애플리케이션에 통지한다.
  5. IDirectMusicPerformance8::SetNotificationHandle 를 호출해,g_hDMusicMessageEvent 에 핸들이 들어가 있는 이벤트를 건네준다. 이것을 받은 DirectMusic 는, 통지를 이용할 수 있을 때 이 이벤트를 통지한다.

WinMain 함수는 다음의 태스크를 실행한다.

  1. CreateDialog 를 사용해 윈도우를 생성 한다.
  2. 메시지 루프내에서,MsgWaitForMultipleObjects 를 호출해 g_hDMusicMessageEvent 를 건네준다. 이것을 받는 것으로,g_hDMusicMessageEvent 이 통지된 것을 알 수 있다. DirectMusic 은, DirectMusic 통지를 수신할 때마다 이 이벤트를 통지한다.
  3. WAIT_OBJECT_0 가 돌려주어졌을 경우는, ProcessDirectMusicMessages 를 호출한다.
  4. WAIT_OBJECT_0 + 1 이 돌려주어졌을 경우는, Windows 메시지를 이용할 수 있다. 이 함수는,PeekMessage 를 사용해 메시지의 표준적인 처리를 실시한다.

[Open File] 를 클릭 하면,OnOpenSoundFile 함수에 의해 다음의 태스크가 실행된다.

  1. 파일명을 얻어온다.
  2. 이전에 생성 한 세그먼트(segment)가 있으면, 이것을 릴리즈 한다.
  3. Dmutil.cpp 내의 CMusicManager::CollectGarbage 를 호출한다. 이것에 의해 IDirectMusicLoader8::CollectGarbage 가 불려 가 미사용 개체가 릴리즈 된다. 「가베지 콜렉션」을 참조할것.
  4. CMusicManager::SetSearchDirectory 를 호출한다. IDirectMusicLoader8::SetSearchDirectory 가 불려 가 GUID_DirectMusicAllTypes 와 디렉토리가 건네받는다. 이것에 의해, 세그먼트(segment)에 의해 참조되는 파일의 장소가 DirectMusic 에게 전할 수 있다.
  5. CMusicManager::CreateSegmentFromFile 를 호출해,g_pMusicSegment 로 불리는 CMusicSegment 를 생성 한다. 이 처리는 다음의 순서로 행해진다.

[Play] 를 클릭 하면,OnPlayAudio 함수에 의해 다음의 처리가 실행된다.

  1. 그 사운드를 루프 하는 경우는,CMusicSegment::SetRepeats 를 호출해 DMUS_SEG_REPEAT_INFINITE 를 건네준다. 루프 하지 않는 경우는, 반복을 0 으로 설정한다.
  2. CMusicSegment::Play 을 호출해 IDirectMusicPerformance8::PlaySegmentEx 를 호출한다.

통지를 하면ProcessDirectMusicMessages 함수는 세그먼트(segment)가 정지된 것을 나타내는 메시지를 검색한다. 다음의 태스크가 실행된다.

  1. 루프내에서 IDirectMusicPerformance8::GetNotificationPMsg 를 호출해 이용 가능한 각 메시지를 처리한다. S_OK 가 돌려받는 한 루프는 반복된다. 이용 가능한 메시지가 없어지면 S_FALSE 가 반환된다.
  2. 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) 뿐이다고는 할 수 없다.
  3. 모든 인터페이스를 클린 업 한다.

참조

↑TOP