방법: X3DAudio와 XAudio2 통합

이 항목에서는 XAudio2와 X3DAudio를 통합하는 방법을 보여줍니다. X3DAudio를 사용하여 XAudio2 음성에 대한 볼륨 및 피치 값과 기본 제공 반향 효과의 XAudio2 매개 변수를 제공할 수 있습니다. 이 항목에서는 방법: 기본 오디오 처리 그래프 빌드에 설명된 대로 오디오 그래프를 만들었다고 가정합니다. 오디오 그래프를 아직 만들지 않은 경우 X3DAudioInitialize 가 실패합니다.

X3DAudio를 초기화하려면

  1. X3DAudioInitialize를 호출하여 X3DAudio를 초기화합니다.

    X3DAudioInitialize 함수는 화자 설정, 초당 사용자 정의 월드 단위의 소리 속도 및 X3DAudio 엔진의 instance 반환하는 핸들을 나타내는 플래그를 사용합니다. IXAudio2MasteringVoice::GetChannelMask를 호출하여 출력 형식의 채널 마스크를 가져옵니다.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. X3DAUDIO_LISTENER 및 X3DAUDIO_EMITTER 구조체의 인스턴스 만듭니다.

    X3DAUDIO_LISTENER 구조체는 소리를 듣는 모든 항목의 위치를 나타냅니다. 일반적으로 카메라의 위치 또는 카메라와 가까운 위치입니다. X3DAUDIO_EMITTER 구조체는 소리를 만드는 사물의 위치를 나타냅니다. 추적되는 각 사운드에 대해 하나의 X3DAUDIO_EMITTER 구조가 있습니다.

    게임 루프에서 업데이트되지 않을 구조체의 멤버는 여기에서 초기화해야 합니다. 구조체의 대부분의 멤버는 단순히 0으로 초기화할 수 있습니다. 그러나 X3DAUDIO_EMITTER 일부 멤버를 0이 아닌 값으로 초기화하도록 설정해야 합니다. X3DAUDIO_EMITTER ChannelCount 멤버는 방출기에서 나타내는 음성의 채널 수로 초기화해야 합니다. 또한 X3DAUDIO_EMITTER CurveDistanceScaler 멤버는 FLT_MAX FLT_MIN 범위에 있어야 합니다.

    X3DAUDIO_LISTENER Listener = {};
    
    X3DAUDIO_EMITTER Emitter = {};
    Emitter.ChannelCount = 1;
    Emitter.CurveDistanceScaler = Emitter.DopplerScaler = 1.0f;
    

여기서 ChannelCount는 설정하기 가장 쉬운 모노 채널 사운드를 재생하고 있다고 가정합니다. 채널이 1개 이상인 사운드 소스의 경우 방출기 ChannelRadiuspChannelAzimuths 값도 설정해야 합니다.

  1. X3DAUDIO_DSP_SETTINGS 구조체의 instance 만듭니다.

    X3DAUDIO_DSP_SETTINGS 구조체는 X3DAudioCalculate에서 계산된 결과를 반환하는 데 사용됩니다. X3DAudioCalculate 함수는 해당 매개 변수에 대한 메모리를 할당하지 않습니다. 즉, X3DAUDIO_DSP_SETTINGS 구조체의 pMatrixCoefficients 및 pDelayTimes 멤버를 사용하려는 경우 배열을 할당해야 합니다. 또한 SrcChannelCount 및 DstChannelCount 멤버를 방출기의 원본 및 대상 음성에 있는 채널 수로 설정해야 합니다.

    X3DAUDIO_DSP_SETTINGS DSPSettings = {};
    FLOAT32 * matrix = new FLOAT32[deviceDetails.OutputFormat.Format.nChannels];
    DSPSettings.SrcChannelCount = 1;
    DSPSettings.DstChannelCount = deviceDetails.OutputFormat.Format.nChannels;
    DSPSettings.pMatrixCoefficients = matrix;
    

    참고

    마스터링 음성에서 IXAudio2Voice::GetVoiceDetails 를 사용하여 nChannels에 대한 InputChannels 수를 가져옵니다. Windows 8 이전의 DirectX SDK XAUDIO2 버전의 경우 IXAudio2::GetDeviceDetails를 사용합니다.

     

2~3프레임마다 한 번씩 이러한 단계를 수행하여 새 설정을 계산하고 적용합니다. 이 예제에서 원본 음성은 마스터링 음성 및 반향 효과가 적용된 서브믹스 음성으로 직접 전송됩니다.

X3DAudio를 사용하여 새 3D 오디오 설정을 계산하고 적용하려면

  1. X3DAUDIO_LISTENERX3DAUDIO_EMITTER 구조를 현재 위치, 속도 및 방향으로 업데이트합니다.

    Emitter.OrientFront = EmitterOrientFront;
    Emitter.OrientTop = EmitterOrientTop;
    Emitter.Position = EmitterPosition;
    Emitter.Velocity = EmitterVelocity;
    Listener.OrientFront = ListenerOrientFront;
    Listener.OrientTop = ListenerOrientTop;
    Listener.Position = ListenerPosition;
    Listener.Velocity = ListenerVelocity;
    
  2. X3DAudioCalculate를 호출하여 음성에 대한 새 설정을 계산합니다.

    X3DAudioCalculate에 대한 매개 변수는 업데이트된 X3DAUDIO_LISTENERX3DAUDIO_EMITTER 구조입니다. 플래그는 X3DAudioCalculate 에서 계산해야 하는 값과 수행된 계산 결과를 포함할 X3DAUDIO_DSP_SETTINGS 구조를 나타냅니다.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. IXAudio2Voice::SetOutputMatrixIXAudio2SourceVoice::SetFrequencyRatio를 사용하여 볼륨 및 피치 값을 원본 음성에 적용합니다.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. IXAudio2Voice::SetOutputMatrix를 사용하여 계산된 반향 수준을 서브믹스 음성에 적용합니다.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. IXAudio2Voice::SetFilterParameters를 사용하여 계산된 로우 패스 필터 직접 계수를 원본 음성에 적용합니다.

    XAUDIO2_FILTER_PARAMETERS FilterParameters = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * DSPSettings.LPFDirectCoefficient), 1.0f };
    pSFXSourceVoice->SetFilterParameters(&FilterParameters);
    

X3DAudio

X3DAudio 개요

XAudio2 프로그래밍 지침

XAudio2 볼륨 및 피치 컨트롤