xact3d.h
上传用户:hfmengyao
上传日期:2017-07-11
资源大小:5146k
文件大小:9k
源码类别:

游戏

开发平台:

Visual C++

  1. /*-========================================================================-_
  2.  |                                - XACT3D -                                |
  3.  |        Copyright (c) Microsoft Corporation.  All rights reserved.        |
  4.  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
  5.  |VERSION:  0.1                         MODEL:   Unmanaged User-mode        |
  6.  |CONTRACT: N / A                       EXCEPT:  No Exceptions              |
  7.  |PARENT:   N / A                       MINREQ:  Win2000, Xbox360           |
  8.  |PROJECT:  XACT3D                      DIALECT: MS Visual C++ 7.0          |
  9.  |>------------------------------------------------------------------------<|
  10.  | DUTY: XACT 3D support                                                    |
  11.  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
  12.   NOTES:
  13.     1.  See X3DAudio.h for information regarding X3DAudio types.            */
  14. #ifndef __XACT3D_H__
  15. #define __XACT3D_H__
  16. //--------------<D-E-F-I-N-I-T-I-O-N-S>-------------------------------------//
  17.     #include <x3daudio.h>
  18.     #include <xact.h>
  19.     // Supported speaker positions, represented as azimuth angles.
  20.     //
  21.     // Here's a picture of the azimuth angles for the 8 cardinal points,
  22.     // seen from above.  The emitter's base position is at the origin 0.
  23.     //
  24.     //           FRONT
  25.     //             | 0  <-- azimuth
  26.     //             |
  27.     //    7pi/4   |  / pi/4
  28.     //            | /
  29.     // LEFT       |/      RIGHT
  30.     // 3pi/2-------0-------pi/2
  31.     //            /|
  32.     //           / | 
  33.     //    5pi/4 /  |   3pi/4
  34.     //             |
  35.     //             | pi
  36.     //           BACK
  37.     //
  38.     #define LEFT_AZIMUTH                    (3*X3DAUDIO_PI/2)
  39.     #define RIGHT_AZIMUTH                   (X3DAUDIO_PI/2)
  40.     #define FRONT_LEFT_AZIMUTH              (7*X3DAUDIO_PI/4)
  41.     #define FRONT_RIGHT_AZIMUTH             (X3DAUDIO_PI/4)
  42.     #define FRONT_CENTER_AZIMUTH            0.0f
  43.     #define LOW_FREQUENCY_AZIMUTH           X3DAUDIO_2PI
  44.     #define BACK_LEFT_AZIMUTH               (5*X3DAUDIO_PI/4)
  45.     #define BACK_RIGHT_AZIMUTH              (3*X3DAUDIO_PI/4)
  46.     #define BACK_CENTER_AZIMUTH             X3DAUDIO_PI
  47.     #define FRONT_LEFT_OF_CENTER_AZIMUTH    (15*X3DAUDIO_PI/8)
  48.     #define FRONT_RIGHT_OF_CENTER_AZIMUTH   (X3DAUDIO_PI/8)
  49. //--------------<D-A-T-A---T-Y-P-E-S>---------------------------------------//
  50.     // Supported emitter channel layouts:
  51.     static const float aStereoLayout[] =
  52.     {
  53.         LEFT_AZIMUTH,
  54.         RIGHT_AZIMUTH
  55.     };
  56.     static const float a2Point1Layout[] =
  57.     {
  58.         LEFT_AZIMUTH,
  59.         RIGHT_AZIMUTH,
  60.         LOW_FREQUENCY_AZIMUTH
  61.     };
  62.     static const float aQuadLayout[] =
  63.     {
  64.         FRONT_LEFT_AZIMUTH,
  65.         FRONT_RIGHT_AZIMUTH,
  66.         BACK_LEFT_AZIMUTH,
  67.         BACK_RIGHT_AZIMUTH
  68.     };
  69.     static const float a4Point1Layout[] =
  70.     {
  71.         FRONT_LEFT_AZIMUTH,
  72.         FRONT_RIGHT_AZIMUTH,
  73.         LOW_FREQUENCY_AZIMUTH,
  74.         BACK_LEFT_AZIMUTH,
  75.         BACK_RIGHT_AZIMUTH
  76.     };
  77.     static const float a5Point1Layout[] =
  78.     {
  79.         FRONT_LEFT_AZIMUTH,
  80.         FRONT_RIGHT_AZIMUTH,
  81.         FRONT_CENTER_AZIMUTH,
  82.         LOW_FREQUENCY_AZIMUTH,
  83.         BACK_LEFT_AZIMUTH,
  84.         BACK_RIGHT_AZIMUTH
  85.     };
  86.     static const float a7Point1Layout[] =
  87.     {
  88.         FRONT_LEFT_AZIMUTH,
  89.         FRONT_RIGHT_AZIMUTH,
  90.         FRONT_CENTER_AZIMUTH,
  91.         LOW_FREQUENCY_AZIMUTH,
  92.         BACK_LEFT_AZIMUTH,
  93.         BACK_RIGHT_AZIMUTH,
  94.         LEFT_AZIMUTH,
  95.         RIGHT_AZIMUTH
  96.     };
  97. //--------------<F-U-N-C-T-I-O-N-S>-----------------------------------------//
  98.     ////
  99.     // DESCRIPTION:
  100.     //  Initializes the 3D API's:
  101.     //
  102.     // REMARKS:
  103.     //  This method only needs to be called once
  104.     //  The number of bits set in SpeakerChannelMask should equal the number of
  105.     //  channels expected on the final mix.
  106.     //
  107.     // PARAMETERS:
  108.     //  SpeakerChannelMask - [in]  speaker geometry configuration on the final mix, specifies assignment of channels to speaker positions, defined as per WAVEFORMATEXTENSIBLE.dwChannelMask, must be != 0
  109.     //                             Currently only SPEAKER_STEREO and SPEAKER_5POINT1 is supported by X3DAudio.
  110.     //  pEngine            - [in]  pointer to the XACT engine
  111.     //  X3DInstance        - [out] Handle to the X3DAudio instance
  112.     //
  113.     // RETURN VALUE:
  114.     //  HResult error code
  115.     ////
  116.     EXTERN_C HRESULT inline XACT3DInitialize (UINT32 SpeakerChannelMask, IXACTEngine* pEngine, X3DAUDIO_HANDLE X3DInstance)
  117.     {
  118.         HRESULT hr = S_OK;
  119.         if (pEngine == NULL) {
  120.             hr = E_POINTER;
  121.         }
  122.         XACTVARIABLEVALUE nSpeedOfSound = 0.0f;
  123.         if (SUCCEEDED(hr)) {
  124.             XACTVARIABLEINDEX xactSpeedOfSoundID = pEngine->GetGlobalVariableIndex("SpeedOfSound");
  125.             hr = pEngine->GetGlobalVariable(xactSpeedOfSoundID, &nSpeedOfSound);
  126.         }
  127.         if (SUCCEEDED(hr)) {
  128.             X3DAudioInitialize(SpeakerChannelMask, nSpeedOfSound, X3DInstance);
  129.         }
  130.         return hr;
  131.     }
  132.     ////
  133.     // DESCRIPTION:
  134.     //  Calculates DSP settings with respect to 3D parameters:
  135.     //
  136.     // PARAMETERS:
  137.     //  X3DInstance        - [in]  X3DAudio instance (returned from XACT3DInitialize)
  138.     //  pListener          - [in]  point of 3D audio reception
  139.     //  pEmitter           - [in]  3D audio source
  140.     //  pDSPSettings       - [out] receives calculation results, applied to an XACT cue via XACT3DApply
  141.     //
  142.     // RETURN VALUE:
  143.     //  HResult error code
  144.     ////
  145.     EXTERN_C HRESULT inline XACT3DCalculate (X3DAUDIO_HANDLE X3DInstance, const X3DAUDIO_LISTENER* pListener, X3DAUDIO_EMITTER* pEmitter, X3DAUDIO_DSP_SETTINGS* pDSPSettings)
  146.     {
  147.         HRESULT hr = S_OK;
  148.         if (pListener == NULL || pEmitter == NULL || pDSPSettings == NULL) {
  149.             hr = E_POINTER;
  150.         }
  151.         if(SUCCEEDED(hr)) {
  152.             if (pEmitter->ChannelCount > 1 && pEmitter->pChannelAzimuths == NULL) {
  153.                 pEmitter->ChannelRadius = 1.0f;
  154.                 switch (pEmitter->ChannelCount) {
  155.                     case 2: pEmitter->pChannelAzimuths = (float*)&aStereoLayout[0]; break;
  156.                     case 3: pEmitter->pChannelAzimuths = (float*)&a2Point1Layout[0]; break;
  157.                     case 4: pEmitter->pChannelAzimuths = (float*)&aQuadLayout[0]; break;
  158.                     case 5: pEmitter->pChannelAzimuths = (float*)&a4Point1Layout[0]; break;
  159.                     case 6: pEmitter->pChannelAzimuths = (float*)&a5Point1Layout[0]; break;
  160.                     case 8: pEmitter->pChannelAzimuths = (float*)&a7Point1Layout[0]; break;
  161.                     default: hr = E_FAIL; break;
  162.                 }
  163.             }
  164.         }
  165.         if(SUCCEEDED(hr)) {
  166.             static X3DAUDIO_DISTANCE_CURVE_POINT DefaultCurvePoints[2] = { 0.0f, 1.0f, 1.0f, 1.0f };
  167.             static X3DAUDIO_DISTANCE_CURVE       DefaultCurve          = { (X3DAUDIO_DISTANCE_CURVE_POINT*)&DefaultCurvePoints[0], 2 };
  168.             if (pEmitter->pVolumeCurve == NULL) {
  169.                 pEmitter->pVolumeCurve = &DefaultCurve;
  170.             }
  171.             if (pEmitter->pLFECurve == NULL) {
  172.                 pEmitter->pLFECurve = &DefaultCurve;
  173.             }
  174.             X3DAudioCalculate(X3DInstance, pListener, pEmitter, X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_EMITTER_ANGLE, pDSPSettings);
  175.         }
  176.         return hr;
  177.     }
  178.     ////
  179.     // DESCRIPTION:
  180.     //  Applies a 3D calculation returned by XACT3DCalculate to a cue:
  181.     //
  182.     // PARAMETERS:
  183.     //  pDSPSettings - [in] calculation results generated by XACT3DCalculate
  184.     //  pCue         - [in] cue to which to apply pDSPSettings
  185.     //
  186.     // RETURN VALUE:
  187.     //  HResult error code
  188.     ////
  189.     EXTERN_C HRESULT inline XACT3DApply (X3DAUDIO_DSP_SETTINGS* pDSPSettings, IXACTCue* pCue)
  190.     {
  191.         HRESULT hr = S_OK;
  192.         if (pDSPSettings == NULL || pCue == NULL) {
  193.             hr = E_POINTER;
  194.         }
  195.         if (SUCCEEDED(hr)) {
  196.             hr = pCue->SetMatrixCoefficients(pDSPSettings->SrcChannelCount, pDSPSettings->DstChannelCount, pDSPSettings->pMatrixCoefficients);
  197.         }
  198.         if (SUCCEEDED(hr)) {
  199.             XACTVARIABLEINDEX xactDistanceID = pCue->GetVariableIndex("Distance");
  200.             hr = pCue->SetVariable(xactDistanceID, pDSPSettings->EmitterToListenerDistance);
  201.         }
  202.         if (SUCCEEDED(hr)) {
  203.             XACTVARIABLEINDEX xactDopplerID = pCue->GetVariableIndex("DopplerPitchScalar");
  204.             hr = pCue->SetVariable(xactDopplerID, pDSPSettings->DopplerFactor);
  205.         }
  206.         if (SUCCEEDED(hr)) {
  207.             XACTVARIABLEINDEX xactOrientationID = pCue->GetVariableIndex("OrientationAngle");
  208.             hr = pCue->SetVariable(xactOrientationID, pDSPSettings->EmitterToListenerAngle * (180.0f / X3DAUDIO_PI));
  209.         }
  210.         return hr;
  211.     }
  212. #endif // __XACT3D_H__
  213. //---------------------------------<-EOF->----------------------------------//