DirectSound DirectSound C++ 샘플 Stream Data 샘플   [목차열람] [주소복사] [슬롯비우기]
Stream Data 샘플
 
Microsoft DirectX 9.0

Stream Data 샘플

설명

Stream Data 샘플에서는, WAV 파일을 DirectSound 2차 버퍼에 스트리밍 하는 방법을 나타낸다. Play Sound 샘플과 유사하지만 이 샘플에는 스트리밍의 지원이 추가되고 있다.

패스

소스:(SDK 루트) \Samples\C++\DirectSound\StreamData

실행 가능 파일:(SDK 루트) \Samples\C++\DirectSound\Bin

사용자가이드

[Sound File] 를 클릭해 WAV 파일을 로드한다. 반복해 재생하는 경우는,[Loop Sound] 를 선택한다. [Play] 를 클릭한다.

프로그래밍 메모

이 샘플에서는, DirectSound 2차 버퍼내의 스트리밍 사운드를 재생하기 위해서 필요한 기본적 태스크가 나타나고 있다.

DirectSound 의 설정

  1. DirectSoundCreate8 함수를 호출해 DirectSound 개체를 생성 한다.
  2. IDirectSound8::SetCooperativeLevel 를 호출한다.
  3. 1차 버퍼의 포맷을 설정한다. 이 샘플은, Dsutil.cpp 내의 DSUtil_SetPrimaryBufferFormat 함수를 호출해 이 처리를 실시한다.

DirectSound 버퍼의 생성과 통지의 설정

  1. WAV 파일 헤더를 읽어들여 데이터의 사이즈와 포맷을 얻어온다.
  2. DirectSound 버퍼의 사이즈를 선택한다. 이 샘플에서는, 버퍼는 3 초간의 데이터를 보관 유지한다.
  3. 선택한 사이즈로, WAV 파일과 같은 포맷의 DirectSound 버퍼를 생성 한다. DSBCAPS_CTRLPOSITIONNOTIFY 플래그도 설정한다. 이것에 의해, 재생이 버퍼내의 특정의 포인트에 도달할 때마다 버퍼에 의해 통지 이벤트가 송신되게 된다. 하드웨어 버퍼가 위치의 통지를 지원 하고 있지 않는 드라이버에서는, 이 플래그의 사용은 소프트웨어 버퍼에 제한된다.
  4. 버퍼로부터 IDirectSoundNotify8 인터페이스를 취득해,IDirectSoundNotify8::SetNotificationPositions 를 호출해, 버퍼의 통지를 설정한다. InitDSoundNotification 함수를 참조할것. 재생 커서는, 통지 위치를 건네줄 때, Win32 이벤트를 통지한다.

DirectSound 버퍼의 재생

  1. 버퍼가 없어지지 않은지 어떤지를 확인해, 없어졌을 경우는 IDirectSoundBuffer8::Restore 를 호출한다.
  2. 버퍼 전체에 파일의 데이터를 기입한다.
  3. DSBPLAY_LOOPING 플래그를 설정해 IDirectSoundBuffer8::Play 를 호출한다. 루프 플래그를 설정 하면, 버퍼는 데이터의 최초의 배치를 재생한 후에 이어 재생을 실시한다.

통지를 하고 있는지의 확인

  1. 메시지 루프로, 또는 MsgWaitForMultipleObjects 를 호출해 독립한 thread로, 통지된 이벤트를 찾는다.
  2. 버퍼의 통지 이벤트를 수신하고 있는 경우는, 버퍼의 마지막에 재생을 종료한 섹션을 잠그어, 거기에 새로운 데이터를 기입한다. HandleNotification 함수를 참조할것.

버퍼의 정지

이벤트 통지를 처리할 때는, 버퍼에 기입해진 데이터량을 상시 추적한다. WAV 파일 전체가 버퍼에 기입해져 그 내용 모든 것이 DirectSound 에 의해 재생되면 버퍼를 수동으로 정지할 필요가 있다. 수동으로 정지하지 않으면 버퍼는 루프 계속 한다.

참조

↑TOP