DirectMusic DirectMusic 의 사용법 DirectMusic 에서의 이펙트의 사용법   [목차열람] [주소복사] [슬롯비우기]
DirectMusic 에서의 이펙트의 사용법
 
Microsoft DirectX 9.0

DirectMusic 에서의 이펙트의 사용법

DirectX 는, DMO (DirectX Media Object)에 의한 사운드의 이펙트 처리를 지원 하고 있다. 모든 DirectX 애플리케이션으로, 일련의 표준 이펙트를 사용할 수 있다. 그 이외의 DMO 도 시스템에 등록할 수 있다.

Waves 리버브 이외의 모든 표준 DMO 는, DirectSound 가 지원 하고 있는 임의의 샘플 레이트로, 1 개 또는 2 개의 채널을 사용해, 8 비트 또는 16 비트의 PCM 데이터를 처리할 수 있다. Waves 리버브는 8 비트의 샘플을 지원 하고 있지 않다.

이펙트는, 오디오 패스의 DirectSound 버퍼에 Attach 된다. 실행시에 애플리케이션으로 이펙트를 추가·삭제·변경하려면 , 버퍼에 대한 인터페이스를 취득해, DirectSound API 를 사용해야 한다. 더 자세한 정보는, 「이펙트의 사용법」을 참조할것.

DirectMusic Producer 로 생성 한 세그먼트(segment)를, 오디오 패스 구성을 사용해 연주하고 있는 경우는, 구성 개체로부터 오디오 패스를 생성 하면 이펙트가 설정된다. 표준 오디오 패스에는 이펙트도 보관 유지된다. 다만, 실행시에 커스텀 오디오 패스로 이펙트를 처리 하거나 표준 오디오 패스에 이펙트를 추가하고 싶은 경우가 있다. 예를 들어, 표준의 WAV 파일이나 MIDI 파일에 이펙트를 적용할 수 있도록(듯이), 표준 오디오 패스에 이펙트를 추가하는 경우이다.

오디오 패스에 이펙트를 적용하려면 , 우선 패스 위에의 버퍼에의 IDirectSoundBuffer8 인터페이스를 얻어온다. 다음에,IDirectSoundBuffer8::SetFX 를 사용해, 그 버퍼에 1 개 또는 복수의 이펙트를 설정한다.

버퍼 인터페이스를 얻어온다 방법에 대해서는, 「오디오 패스로부터의 개체의 취득」을 참조할것. GetObjectInPath 의 호출로 표준 오디오 패스 버퍼를 식별하는 방법에 대해서는, 「표준 오디오 패스」의 오디오 패스의 타입을 참조할것.

다음 샘플 코드에서는, 표준 오디오 패스를 설정해, 패스로부터 버퍼를 취득해, 버퍼상에서 메아리 이펙트를 설정해 있다.

HRESULT SetEchoEffect(IDirectMusicPerformance8 *pPerformance,
    IDirectMusicAudioPath* p3DAudioPath,
    IDirectSoundBuffer8* pDSBuffer)
{
  HRESULT       hr;
 
  // 소스 버퍼와 환경 리버브밧파를 사용해 표준 오디오 패스를 생성 한다.
  // 패스를 액티브화해서는 안 된다.
  // 버퍼가 가동하고 있으면 SetFX 는 실패한다.
 
  if( FAILED(hr = pPerformance->CreateStandardAudioPath(
      DMUS_APATH_DYNAMIC_3D, 64, FALSE, &p3DAudioPath)))
    return hr;
   
  // 오디오 패스로 버퍼를 얻어온다.
 
  if( FAILED(hr = p3DAudioPath->GetObjectInPath(DMUS_PCHANNEL_ALL,
      DMUS_PATH_BUFFER, 0, GUID_NULL, 0, IID_IDirectSoundBuffer8, 
      (LPVOID*) &pDSBuffer)))
    return hr;
 
  // 이펙트를 기술한다.
 
  DSEFFECTDESC dsEffect;
  dsEffect.dwSize = sizeof(DSEFFECTDESC);
  dsEffect.dwFlags = 0;
  dsEffect.guidDSFXClass = GUID_DSFX_STANDARD_ECHO;
  dsEffect.dwReserved1 = 0;
  dsEffect.dwReserved2 = 0;
 
  DWORD dwResults;
 
  // 이펙트를 설정한다.
  if (FAILED(hr = pDSBuffer->SetFX(1, &dsEffect, &dwResults)))
  {
    p3DAudioPath->Activate(TRUE);
    return hr;
  }
  // 여기서 dwResults 의 값을 체크해,
  // 이펙트를 할당할 수 있는지, 또 그방법을 확인할 수 있다.
 
  // 패스를 액티브화한다.
 
  p3DAudioPath->Activate(TRUE);
  return hr;
}
↑TOP