123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- /*-========================================================================-_
- | - XACT3D3 - |
- | Copyright (c) Microsoft Corporation. All rights reserved. |
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
- |VERSION: 0.1 MODEL: Unmanaged User-mode |
- |CONTRACT: N / A EXCEPT: No Exceptions |
- |PARENT: N / A MINREQ: Win2000, Xbox360 |
- |PROJECT: XACT3D DIALECT: MS Visual C++ 7.0 |
- |>------------------------------------------------------------------------<|
- | DUTY: XACT 3D support |
- ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
- NOTES:
- 1. See X3DAudio.h for information regarding X3DAudio types. */
- #ifndef __XACT3D3_H__
- #define __XACT3D3_H__
- //--------------<D-E-F-I-N-I-T-I-O-N-S>-------------------------------------//
- #include <x3daudio.h>
- #include <xact3.h>
- #pragma warning(push)
- #pragma warning(disable: 4701) // disable "local variable may be used without having been initialized" compile warning
- // Supported speaker positions, represented as azimuth angles.
- //
- // Here's a picture of the azimuth angles for the 8 cardinal points,
- // seen from above. The emitter's base position is at the origin 0.
- //
- // FRONT
- // | 0 <-- azimuth
- // |
- // 7pi/4 \ | / pi/4
- // \ | /
- // LEFT \|/ RIGHT
- // 3pi/2-------0-------pi/2
- // /|\
- // / | \
- // 5pi/4 / | \ 3pi/4
- // |
- // | pi
- // BACK
- //
- #define LEFT_AZIMUTH (3*X3DAUDIO_PI/2)
- #define RIGHT_AZIMUTH (X3DAUDIO_PI/2)
- #define FRONT_LEFT_AZIMUTH (7*X3DAUDIO_PI/4)
- #define FRONT_RIGHT_AZIMUTH (X3DAUDIO_PI/4)
- #define FRONT_CENTER_AZIMUTH 0.0f
- #define LOW_FREQUENCY_AZIMUTH X3DAUDIO_2PI
- #define BACK_LEFT_AZIMUTH (5*X3DAUDIO_PI/4)
- #define BACK_RIGHT_AZIMUTH (3*X3DAUDIO_PI/4)
- #define BACK_CENTER_AZIMUTH X3DAUDIO_PI
- #define FRONT_LEFT_OF_CENTER_AZIMUTH (15*X3DAUDIO_PI/8)
- #define FRONT_RIGHT_OF_CENTER_AZIMUTH (X3DAUDIO_PI/8)
- //--------------<D-A-T-A---T-Y-P-E-S>---------------------------------------//
- // Supported emitter channel layouts:
- static const float aStereoLayout[] =
- {
- LEFT_AZIMUTH,
- RIGHT_AZIMUTH
- };
- static const float a2Point1Layout[] =
- {
- LEFT_AZIMUTH,
- RIGHT_AZIMUTH,
- LOW_FREQUENCY_AZIMUTH
- };
- static const float aQuadLayout[] =
- {
- FRONT_LEFT_AZIMUTH,
- FRONT_RIGHT_AZIMUTH,
- BACK_LEFT_AZIMUTH,
- BACK_RIGHT_AZIMUTH
- };
- static const float a4Point1Layout[] =
- {
- FRONT_LEFT_AZIMUTH,
- FRONT_RIGHT_AZIMUTH,
- LOW_FREQUENCY_AZIMUTH,
- BACK_LEFT_AZIMUTH,
- BACK_RIGHT_AZIMUTH
- };
- static const float a5Point1Layout[] =
- {
- FRONT_LEFT_AZIMUTH,
- FRONT_RIGHT_AZIMUTH,
- FRONT_CENTER_AZIMUTH,
- LOW_FREQUENCY_AZIMUTH,
- BACK_LEFT_AZIMUTH,
- BACK_RIGHT_AZIMUTH
- };
- static const float a7Point1Layout[] =
- {
- FRONT_LEFT_AZIMUTH,
- FRONT_RIGHT_AZIMUTH,
- FRONT_CENTER_AZIMUTH,
- LOW_FREQUENCY_AZIMUTH,
- BACK_LEFT_AZIMUTH,
- BACK_RIGHT_AZIMUTH,
- LEFT_AZIMUTH,
- RIGHT_AZIMUTH
- };
- //--------------<F-U-N-C-T-I-O-N-S>-----------------------------------------//
- ////
- // DESCRIPTION:
- // Initializes the 3D API's:
- //
- // REMARKS:
- // This method only needs to be called once.
- // X3DAudio will be initialized such that its speaker channel mask
- // matches the format of the given XACT engine's final mix.
- //
- // PARAMETERS:
- // pEngine - [in] XACT engine
- // X3DInstance - [out] X3DAudio instance handle
- //
- // RETURN VALUE:
- // HResult error code
- ////
- EXTERN_C HRESULT inline XACT3DInitialize (__in IXACT3Engine* pEngine, __in X3DAUDIO_HANDLE X3DInstance)
- {
- HRESULT hr = S_OK;
- if (pEngine == NULL) {
- hr = E_POINTER;
- }
- XACTVARIABLEVALUE nSpeedOfSound;
- if (SUCCEEDED(hr)) {
- XACTVARIABLEINDEX xactSpeedOfSoundID = pEngine->GetGlobalVariableIndex("SpeedOfSound");
- hr = pEngine->GetGlobalVariable(xactSpeedOfSoundID, &nSpeedOfSound);
- }
- if (SUCCEEDED(hr)) {
- WAVEFORMATEXTENSIBLE wfxFinalMixFormat;
- hr = pEngine->GetFinalMixFormat(&wfxFinalMixFormat);
- if (SUCCEEDED(hr)) {
- X3DAudioInitialize(wfxFinalMixFormat.dwChannelMask, nSpeedOfSound, X3DInstance);
- }
- }
- return hr;
- }
- ////
- // DESCRIPTION:
- // Calculates DSP settings with respect to 3D parameters:
- //
- // REMARKS:
- // Note the following flags are always specified for XACT3D calculation:
- // X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_EMITTER_ANGLE
- //
- // This means the caller must set at least the following fields:
- // X3DAUDIO_LISTENER.OrientFront
- // X3DAUDIO_LISTENER.OrientTop
- // X3DAUDIO_LISTENER.Position
- // X3DAUDIO_LISTENER.Velocity
- //
- // X3DAUDIO_EMITTER.OrientFront
- // X3DAUDIO_EMITTER.OrientTop, if emitter is multi-channel
- // X3DAUDIO_EMITTER.Position
- // X3DAUDIO_EMITTER.Velocity
- // X3DAUDIO_EMITTER.InnerRadius
- // X3DAUDIO_EMITTER.InnerRadiusAngle
- // X3DAUDIO_EMITTER.ChannelCount
- // X3DAUDIO_EMITTER.CurveDistanceScaler
- // X3DAUDIO_EMITTER.DopplerScaler
- //
- // X3DAUDIO_DSP_SETTINGS.pMatrixCoefficients, the caller need only allocate space for SrcChannelCount*DstChannelCount elements
- // X3DAUDIO_DSP_SETTINGS.SrcChannelCount
- // X3DAUDIO_DSP_SETTINGS.DstChannelCount
- //
- // If X3DAUDIO_EMITTER.pChannelAzimuths is left NULL for multi-channel emitters,
- // a default channel radius and channel azimuth array will be applied below.
- // Distance curves such as X3DAUDIO_EMITTER.pVolumeCurve should be
- // left NULL as XACT's native RPCs will be used to define DSP behaviour
- // with respect to normalized distance.
- //
- // See X3DAudio.h for information regarding X3DAudio types.
- //
- // PARAMETERS:
- // X3DInstance - [in] X3DAudio instance handle, returned from XACT3DInitialize()
- // pListener - [in] point of 3D audio reception
- // pEmitter - [in] 3D audio source
- // pDSPSettings - [out] receives calculation results, applied to an XACT cue via XACT3DApply()
- //
- // RETURN VALUE:
- // HResult error code
- ////
- EXTERN_C HRESULT inline XACT3DCalculate (__in X3DAUDIO_HANDLE X3DInstance, __in const X3DAUDIO_LISTENER* pListener, __inout X3DAUDIO_EMITTER* pEmitter, __inout X3DAUDIO_DSP_SETTINGS* pDSPSettings)
- {
- HRESULT hr = S_OK;
- if (pListener == NULL || pEmitter == NULL || pDSPSettings == NULL) {
- hr = E_POINTER;
- }
- if (SUCCEEDED(hr)) {
- if (pEmitter->ChannelCount > 1 && pEmitter->pChannelAzimuths == NULL) {
- pEmitter->ChannelRadius = 1.0f;
- switch (pEmitter->ChannelCount) {
- case 2: pEmitter->pChannelAzimuths = (float*)&aStereoLayout[0]; break;
- case 3: pEmitter->pChannelAzimuths = (float*)&a2Point1Layout[0]; break;
- case 4: pEmitter->pChannelAzimuths = (float*)&aQuadLayout[0]; break;
- case 5: pEmitter->pChannelAzimuths = (float*)&a4Point1Layout[0]; break;
- case 6: pEmitter->pChannelAzimuths = (float*)&a5Point1Layout[0]; break;
- case 8: pEmitter->pChannelAzimuths = (float*)&a7Point1Layout[0]; break;
- default: hr = E_FAIL; break;
- }
- }
- }
- if (SUCCEEDED(hr)) {
- static X3DAUDIO_DISTANCE_CURVE_POINT DefaultCurvePoints[2] = { 0.0f, 1.0f, 1.0f, 1.0f };
- static X3DAUDIO_DISTANCE_CURVE DefaultCurve = { (X3DAUDIO_DISTANCE_CURVE_POINT*)&DefaultCurvePoints[0], 2 };
- if (pEmitter->pVolumeCurve == NULL) {
- pEmitter->pVolumeCurve = &DefaultCurve;
- }
- if (pEmitter->pLFECurve == NULL) {
- pEmitter->pLFECurve = &DefaultCurve;
- }
- X3DAudioCalculate(X3DInstance, pListener, pEmitter, (X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_EMITTER_ANGLE), pDSPSettings);
- }
- return hr;
- }
- ////
- // DESCRIPTION:
- // Applies results from a call to XACT3DCalculate() to a cue.
- //
- // PARAMETERS:
- // pDSPSettings - [in] calculation results generated by XACT3DCalculate()
- // pCue - [in] cue to which to apply pDSPSettings
- //
- // RETURN VALUE:
- // HResult error code
- ////
- EXTERN_C HRESULT inline XACT3DApply (__in const X3DAUDIO_DSP_SETTINGS* pDSPSettings, __in IXACT3Cue* pCue)
- {
- HRESULT hr = S_OK;
- if (pDSPSettings == NULL || pCue == NULL) {
- hr = E_POINTER;
- }
- if (SUCCEEDED(hr)) {
- hr = pCue->SetMatrixCoefficients(pDSPSettings->SrcChannelCount, pDSPSettings->DstChannelCount, pDSPSettings->pMatrixCoefficients);
- }
- if (SUCCEEDED(hr)) {
- XACTVARIABLEINDEX xactDistanceID = pCue->GetVariableIndex("Distance");
- hr = pCue->SetVariable(xactDistanceID, pDSPSettings->EmitterToListenerDistance);
- }
- if (SUCCEEDED(hr)) {
- XACTVARIABLEINDEX xactDopplerID = pCue->GetVariableIndex("DopplerPitchScalar");
- hr = pCue->SetVariable(xactDopplerID, pDSPSettings->DopplerFactor);
- }
- if (SUCCEEDED(hr)) {
- XACTVARIABLEINDEX xactOrientationID = pCue->GetVariableIndex("OrientationAngle");
- hr = pCue->SetVariable(xactOrientationID, pDSPSettings->EmitterToListenerAngle * (180.0f / X3DAUDIO_PI));
- }
- return hr;
- }
- #pragma warning(pop)
- #endif // __XACT3D3_H__
- //---------------------------------<-EOF->----------------------------------//
|