방법: X3DAudio와 XAudio2 통합
이 항목에서는 XAudio2와 X3DAudio를 통합하는 방법을 보여줍니다. X3DAudio를 사용하여 XAudio2 음성에 대한 볼륨 및 피치 값과 기본 제공 반향 효과의 XAudio2 매개 변수를 제공할 수 있습니다. 이 항목에서는 방법: 기본 오디오 처리 그래프 빌드에 설명된 대로 오디오 그래프를 만들었다고 가정합니다. 오디오 그래프를 아직 만들지 않은 경우 X3DAudioInitialize 가 실패합니다.
X3DAudio를 초기화하려면
X3DAudioInitialize를 호출하여 X3DAudio를 초기화합니다.
X3DAudioInitialize 함수는 화자 설정, 초당 사용자 정의 월드 단위의 소리 속도 및 X3DAudio 엔진의 instance 반환하는 핸들을 나타내는 플래그를 사용합니다. IXAudio2MasteringVoice::GetChannelMask를 호출하여 출력 형식의 채널 마스크를 가져옵니다.
DWORD dwChannelMask; pMasteringVoice->GetChannelMask( &dwChannelMask ); X3DAUDIO_HANDLE X3DInstance; X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
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개 이상인 사운드 소스의 경우 방출기
ChannelRadius
및pChannelAzimuths
값도 설정해야 합니다.
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 오디오 설정을 계산하고 적용하려면
X3DAUDIO_LISTENER 및 X3DAUDIO_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;
X3DAudioCalculate를 호출하여 음성에 대한 새 설정을 계산합니다.
X3DAudioCalculate에 대한 매개 변수는 업데이트된 X3DAUDIO_LISTENER 및 X3DAUDIO_EMITTER 구조입니다. 플래그는 X3DAudioCalculate 에서 계산해야 하는 값과 수행된 계산 결과를 포함할 X3DAUDIO_DSP_SETTINGS 구조를 나타냅니다.
X3DAudioCalculate(X3DInstance, &Listener, &Emitter, X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB, &DSPSettings );
IXAudio2Voice::SetOutputMatrix 및 IXAudio2SourceVoice::SetFrequencyRatio를 사용하여 볼륨 및 피치 값을 원본 음성에 적용합니다.
pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ; pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
IXAudio2Voice::SetOutputMatrix를 사용하여 계산된 반향 수준을 서브믹스 음성에 적용합니다.
pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
IXAudio2Voice::SetFilterParameters를 사용하여 계산된 로우 패스 필터 직접 계수를 원본 음성에 적용합니다.
XAUDIO2_FILTER_PARAMETERS FilterParameters = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * DSPSettings.LPFDirectCoefficient), 1.0f }; pSFXSourceVoice->SetFilterParameters(&FilterParameters);
관련 항목