Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 1 | pmbaty | 1 | /*-========================================================================-_ |
| 2 | | - XAPO - | |
||
| 3 | | Copyright (c) Microsoft Corporation. All rights reserved. | |
||
| 4 | |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| |
||
| 5 | |PROJECT: XAPO MODEL: Unmanaged User-mode | |
||
| 6 | |VERSION: 1.0 EXCEPT: No Exceptions | |
||
| 7 | |CLASS: N / A MINREQ: WinXP, Xbox360 | |
||
| 8 | |BASE: N / A DIALECT: MSC++ 14.00 | |
||
| 9 | |>------------------------------------------------------------------------<| |
||
| 10 | | DUTY: Cross-platform Audio Processing Object interfaces | |
||
| 11 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ |
||
| 12 | NOTES: |
||
| 13 | 1. Definition of terms: |
||
| 14 | DSP: Digital Signal Processing. |
||
| 15 | |||
| 16 | CBR: Constant BitRate -- DSP that consumes a constant number of |
||
| 17 | input samples to produce an output sample. |
||
| 18 | For example, a 22kHz to 44kHz resampler is CBR DSP. |
||
| 19 | Even though the number of input to output samples differ, |
||
| 20 | the ratio between input to output rate remains constant. |
||
| 21 | All user-defined XAPOs are assumed to be CBR as |
||
| 22 | XAudio2 only allows CBR DSP to be added to an effect chain. |
||
| 23 | |||
| 24 | XAPO: Cross-platform Audio Processing Object -- |
||
| 25 | a thin wrapper that manages DSP code, allowing it |
||
| 26 | to be easily plugged into an XAudio2 effect chain. |
||
| 27 | |||
| 28 | Frame: A block of samples, one per channel, |
||
| 29 | to be played simultaneously. |
||
| 30 | |||
| 31 | In-Place: Processing such that the input buffer equals the |
||
| 32 | output buffer (i.e. input data modified directly). |
||
| 33 | This form of processing is generally more efficient |
||
| 34 | than using separate memory for input and output. |
||
| 35 | However, an XAPO may not perform format conversion |
||
| 36 | when processing in-place. |
||
| 37 | |||
| 38 | 2. XAPO member variables are divided into three classifications: |
||
| 39 | Immutable: Set once via IXAPO::Initialize and remain |
||
| 40 | constant during the lifespan of the XAPO. |
||
| 41 | |||
| 42 | Locked: May change before the XAPO is locked via |
||
| 43 | IXAPO::LockForProcess but remain constant |
||
| 44 | until IXAPO::UnlockForProcess is called. |
||
| 45 | |||
| 46 | Dynamic: May change from one processing pass to the next, |
||
| 47 | usually via IXAPOParameters::SetParameters. |
||
| 48 | XAPOs should assign reasonable defaults to their dynamic |
||
| 49 | variables during IXAPO::Initialize/LockForProcess so |
||
| 50 | that calling IXAPOParameters::SetParameters is not |
||
| 51 | required before processing begins. |
||
| 52 | |||
| 53 | When implementing an XAPO, determine the type of each variable and |
||
| 54 | initialize them in the appropriate method. Immutable variables are |
||
| 55 | generally preferable over locked which are preferable over dynamic. |
||
| 56 | That is, one should strive to minimize XAPO state changes for |
||
| 57 | best performance, maintainability, and ease of use. |
||
| 58 | |||
| 59 | 3. To minimize glitches, the realtime audio processing thread must |
||
| 60 | not block. XAPO methods called by the realtime thread are commented |
||
| 61 | as non-blocking and therefore should not use blocking synchronization, |
||
| 62 | allocate memory, access the disk, etc. The XAPO interfaces were |
||
| 63 | designed to allow an effect implementer to move such operations |
||
| 64 | into other methods called on an application controlled thread. |
||
| 65 | |||
| 66 | 4. Extending functionality is accomplished through the addition of new |
||
| 67 | COM interfaces. For example, if a new member is added to a parameter |
||
| 68 | structure, a new interface using the new structure should be added, |
||
| 69 | leaving the original interface unchanged. |
||
| 70 | This ensures consistent communication between future versions of |
||
| 71 | XAudio2 and various versions of XAPOs that may exist in an application. |
||
| 72 | |||
| 73 | 5. All audio data is interleaved in XAudio2. |
||
| 74 | The default audio format for an effect chain is WAVE_FORMAT_IEEE_FLOAT. |
||
| 75 | |||
| 76 | 6. User-defined XAPOs should assume all input and output buffers are |
||
| 77 | 16-byte aligned. |
||
| 78 | |||
| 79 | 7. See XAPOBase.h for an XAPO base class which provides a default |
||
| 80 | implementation for most of the interface methods defined below. */ |
||
| 81 | |||
| 82 | #pragma once |
||
| 83 | //--------------<D-E-F-I-N-I-T-I-O-N-S>-------------------------------------// |
||
| 84 | #include "comdecl.h" // for DEFINE_IID |
||
| 85 | |||
| 86 | // XAPO interface IDs |
||
| 87 | DEFINE_IID(IXAPO, A90BC001, E897, E897, 55, E4, 9E, 47, 00, 00, 00, 00); |
||
| 88 | DEFINE_IID(IXAPOParameters, A90BC001, E897, E897, 55, E4, 9E, 47, 00, 00, 00, 01); |
||
| 89 | |||
| 90 | |||
| 91 | #if !defined(GUID_DEFS_ONLY) // ignore rest if only GUID definitions requested |
||
| 92 | #if defined(_XBOX) // general windows and COM declarations |
||
| 93 | #include <xtl.h> |
||
| 94 | #include <xobjbase.h> |
||
| 95 | #else |
||
| 96 | #include <windows.h> |
||
| 97 | #include <objbase.h> |
||
| 98 | #endif |
||
| 99 | #include "audiodefs.h" // for WAVEFORMATEX etc. |
||
| 100 | |||
| 101 | // XAPO error codes |
||
| 102 | #define FACILITY_XAPO 0x897 |
||
| 103 | #define XAPO_E_FORMAT_UNSUPPORTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_XAPO, 0x01) // requested audio format unsupported |
||
| 104 | |||
| 105 | // supported number of channels (samples per frame) range |
||
| 106 | #define XAPO_MIN_CHANNELS 1 |
||
| 107 | #define XAPO_MAX_CHANNELS 64 |
||
| 108 | |||
| 109 | // supported framerate range |
||
| 110 | #define XAPO_MIN_FRAMERATE 1000 |
||
| 111 | #define XAPO_MAX_FRAMERATE 200000 |
||
| 112 | |||
| 113 | // unicode string length, including terminator, used with XAPO_REGISTRATION_PROPERTIES |
||
| 114 | #define XAPO_REGISTRATION_STRING_LENGTH 256 |
||
| 115 | |||
| 116 | |||
| 117 | // XAPO property flags, used with XAPO_REGISTRATION_PROPERTIES.Flags: |
||
| 118 | // Number of channels of input and output buffers must match, |
||
| 119 | // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat. |
||
| 120 | #define XAPO_FLAG_CHANNELS_MUST_MATCH 0x00000001 |
||
| 121 | |||
| 122 | // Framerate of input and output buffers must match, |
||
| 123 | // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat. |
||
| 124 | #define XAPO_FLAG_FRAMERATE_MUST_MATCH 0x00000002 |
||
| 125 | |||
| 126 | // Bit depth of input and output buffers must match, |
||
| 127 | // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat. |
||
| 128 | // Container size of input and output buffers must also match if |
||
| 129 | // XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat is WAVEFORMATEXTENSIBLE. |
||
| 130 | #define XAPO_FLAG_BITSPERSAMPLE_MUST_MATCH 0x00000004 |
||
| 131 | |||
| 132 | // Number of input and output buffers must match, |
||
| 133 | // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS. |
||
| 134 | // |
||
| 135 | // Also, XAPO_REGISTRATION_PROPERTIES.MinInputBufferCount must |
||
| 136 | // equal XAPO_REGISTRATION_PROPERTIES.MinOutputBufferCount and |
||
| 137 | // XAPO_REGISTRATION_PROPERTIES.MaxInputBufferCount must equal |
||
| 138 | // XAPO_REGISTRATION_PROPERTIES.MaxOutputBufferCount when used. |
||
| 139 | #define XAPO_FLAG_BUFFERCOUNT_MUST_MATCH 0x00000008 |
||
| 140 | |||
| 141 | // XAPO must be run in-place. Use this flag only if your DSP |
||
| 142 | // implementation cannot process separate input and output buffers. |
||
| 143 | // If set, the following flags must also be set: |
||
| 144 | // XAPO_FLAG_CHANNELS_MUST_MATCH |
||
| 145 | // XAPO_FLAG_FRAMERATE_MUST_MATCH |
||
| 146 | // XAPO_FLAG_BITSPERSAMPLE_MUST_MATCH |
||
| 147 | // XAPO_FLAG_BUFFERCOUNT_MUST_MATCH |
||
| 148 | // XAPO_FLAG_INPLACE_SUPPORTED |
||
| 149 | // |
||
| 150 | // Multiple input and output buffers may be used with in-place XAPOs, |
||
| 151 | // though the input buffer count must equal the output buffer count. |
||
| 152 | // When multiple input/output buffers are used, the XAPO may assume |
||
| 153 | // input buffer [N] equals output buffer [N] for in-place processing. |
||
| 154 | #define XAPO_FLAG_INPLACE_REQUIRED 0x00000020 |
||
| 155 | |||
| 156 | // XAPO may be run in-place. If the XAPO is used in a chain |
||
| 157 | // such that the requirements for XAPO_FLAG_INPLACE_REQUIRED are met, |
||
| 158 | // XAudio2 will ensure the XAPO is run in-place. If not met, XAudio2 |
||
| 159 | // will still run the XAPO albeit with separate input and output buffers. |
||
| 160 | // |
||
| 161 | // For example, consider an effect which may be ran in stereo->5.1 mode or |
||
| 162 | // mono->mono mode. When set to stereo->5.1, it will be run with separate |
||
| 163 | // input and output buffers as format conversion is not permitted in-place. |
||
| 164 | // However, if configured to run mono->mono, the same XAPO can be run |
||
| 165 | // in-place. Thus the same implementation may be conveniently reused |
||
| 166 | // for various input/output configurations, while taking advantage of |
||
| 167 | // in-place processing when possible. |
||
| 168 | #define XAPO_FLAG_INPLACE_SUPPORTED 0x00000010 |
||
| 169 | |||
| 170 | |||
| 171 | //--------------<D-A-T-A---T-Y-P-E-S>---------------------------------------// |
||
| 172 | #pragma pack(push, 1) // set packing alignment to ensure consistency across arbitrary build environments |
||
| 173 | |||
| 174 | |||
| 175 | // XAPO registration properties, describes general XAPO characteristics, used with IXAPO::GetRegistrationProperties |
||
| 176 | typedef struct XAPO_REGISTRATION_PROPERTIES { |
||
| 177 | CLSID clsid; // COM class ID, used with CoCreate |
||
| 178 | WCHAR FriendlyName[XAPO_REGISTRATION_STRING_LENGTH]; // friendly name unicode string |
||
| 179 | WCHAR CopyrightInfo[XAPO_REGISTRATION_STRING_LENGTH]; // copyright information unicode string |
||
| 180 | UINT32 MajorVersion; // major version |
||
| 181 | UINT32 MinorVersion; // minor version |
||
| 182 | UINT32 Flags; // XAPO property flags, describes supported input/output configuration |
||
| 183 | UINT32 MinInputBufferCount; // minimum number of input buffers required for processing, can be 0 |
||
| 184 | UINT32 MaxInputBufferCount; // maximum number of input buffers supported for processing, must be >= MinInputBufferCount |
||
| 185 | UINT32 MinOutputBufferCount; // minimum number of output buffers required for processing, can be 0, must match MinInputBufferCount when XAPO_FLAG_BUFFERCOUNT_MUST_MATCH used |
||
| 186 | UINT32 MaxOutputBufferCount; // maximum number of output buffers supported for processing, must be >= MinOutputBufferCount, must match MaxInputBufferCount when XAPO_FLAG_BUFFERCOUNT_MUST_MATCH used |
||
| 187 | } XAPO_REGISTRATION_PROPERTIES; |
||
| 188 | |||
| 189 | |||
| 190 | // LockForProcess buffer parameters: |
||
| 191 | // Defines buffer parameters that remain constant while an XAPO is locked. |
||
| 192 | // Used with IXAPO::LockForProcess. |
||
| 193 | // |
||
| 194 | // For CBR XAPOs, MaxFrameCount is the only number of frames |
||
| 195 | // IXAPO::Process would have to handle for the respective buffer. |
||
| 196 | typedef struct XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS { |
||
| 197 | const WAVEFORMATEX* pFormat; // buffer audio format |
||
| 198 | UINT32 MaxFrameCount; // maximum number of frames in respective buffer that IXAPO::Process would have to handle, irrespective of dynamic variable settings, can be 0 |
||
| 199 | } XAPO_LOCKFORPROCESS_PARAMETERS; |
||
| 200 | |||
| 201 | // Buffer flags: |
||
| 202 | // Describes assumed content of the respective buffer. |
||
| 203 | // Used with XAPO_PROCESS_BUFFER_PARAMETERS.BufferFlags. |
||
| 204 | // |
||
| 205 | // This meta-data can be used by an XAPO to implement |
||
| 206 | // optimizations that require knowledge of a buffer's content. |
||
| 207 | // |
||
| 208 | // For example, XAPOs that always produce silent output from silent input |
||
| 209 | // can check the flag on the input buffer to determine if any signal |
||
| 210 | // processing is necessary. If silent, the XAPO may simply set the flag |
||
| 211 | // on the output buffer to silent and return, optimizing out the work of |
||
| 212 | // processing silent data: XAPOs that generate silence for any reason may |
||
| 213 | // set the buffer's flag accordingly rather than writing out silent |
||
| 214 | // frames to the buffer itself. |
||
| 215 | // |
||
| 216 | // The flags represent what should be assumed is in the respective buffer. |
||
| 217 | // The flags may not reflect what is actually stored in memory. |
||
| 218 | typedef enum XAPO_BUFFER_FLAGS { |
||
| 219 | XAPO_BUFFER_SILENT, // silent data should be assumed, respective memory may be uninitialized |
||
| 220 | XAPO_BUFFER_VALID, // arbitrary data should be assumed (may or may not be silent frames), respective memory initialized |
||
| 221 | } XAPO_BUFFER_FLAGS; |
||
| 222 | |||
| 223 | // Process buffer parameters: |
||
| 224 | // Defines buffer parameters that may change from one |
||
| 225 | // processing pass to the next. Used with IXAPO::Process. |
||
| 226 | // |
||
| 227 | // Note the byte size of the respective buffer must be at least: |
||
| 228 | // XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount * XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat->nBlockAlign |
||
| 229 | // |
||
| 230 | // Although the audio format and maximum size of the respective |
||
| 231 | // buffer is locked (defined by XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS), |
||
| 232 | // the actual memory address of the buffer given is permitted to change |
||
| 233 | // from one processing pass to the next. |
||
| 234 | // |
||
| 235 | // For CBR XAPOs, ValidFrameCount is constant while locked and equals |
||
| 236 | // the respective XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount. |
||
| 237 | typedef struct XAPO_PROCESS_BUFFER_PARAMETERS { |
||
| 238 | void* pBuffer; // audio data buffer, must be non-NULL |
||
| 239 | XAPO_BUFFER_FLAGS BufferFlags; // describes assumed content of pBuffer, does not affect ValidFrameCount |
||
| 240 | UINT32 ValidFrameCount; // number of frames of valid data, must be within respective [0, XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount], always XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount for CBR/user-defined XAPOs, does not affect BufferFlags |
||
| 241 | } XAPO_PROCESS_BUFFER_PARAMETERS; |
||
| 242 | |||
| 243 | |||
| 244 | //--------------<M-A-C-R-O-S>-----------------------------------------------// |
||
| 245 | // Memory allocation macros that allow one module to allocate memory and |
||
| 246 | // another to free it, by guaranteeing that the same heap manager is used |
||
| 247 | // regardless of differences between build environments of the two modules. |
||
| 248 | // |
||
| 249 | // Used by IXAPO methods that must allocate arbitrary sized structures |
||
| 250 | // such as WAVEFORMATEX that are subsequently returned to the application. |
||
| 251 | #if defined(_XBOX) |
||
| 252 | #define XAPO_ALLOC_ATTRIBUTES MAKE_XALLOC_ATTRIBUTES ( \ |
||
| 253 | 0, /* ObjectType */ \ |
||
| 254 | FALSE, /* HeapTracksAttributes */ \ |
||
| 255 | FALSE, /* MustSucceed */ \ |
||
| 256 | FALSE, /* FixedSize */ \ |
||
| 257 | eXALLOCAllocatorId_XAUDIO2, /* AllocatorId */ \ |
||
| 258 | XALLOC_ALIGNMENT_DEFAULT, /* Alignment */ \ |
||
| 259 | XALLOC_MEMPROTECT_READWRITE, /* MemoryProtect */ \ |
||
| 260 | FALSE, /* ZeroInitialize */ \ |
||
| 261 | XALLOC_MEMTYPE_HEAP /* MemoryType */ \ |
||
| 262 | ) |
||
| 263 | #define XAPOAlloc(size) XMemAlloc(size, XAPO_ALLOC_ATTRIBUTES) |
||
| 264 | #define XAPOFree(p) XMemFree(p, XAPO_ALLOC_ATTRIBUTES) |
||
| 265 | #else |
||
| 266 | #define XAPOAlloc(size) CoTaskMemAlloc(size) |
||
| 267 | #define XAPOFree(p) CoTaskMemFree(p) |
||
| 268 | #endif |
||
| 269 | |||
| 270 | |||
| 271 | //--------------<I-N-T-E-R-F-A-C-E-S>---------------------------------------// |
||
| 272 | // IXAPO: |
||
| 273 | // The only mandatory XAPO COM interface -- a thin wrapper that manages |
||
| 274 | // DSP code, allowing it to be easily plugged into an XAudio2 effect chain. |
||
| 275 | #undef INTERFACE |
||
| 276 | #define INTERFACE IXAPO |
||
| 277 | DECLARE_INTERFACE_(IXAPO, IUnknown) { |
||
| 278 | //// |
||
| 279 | // DESCRIPTION: |
||
| 280 | // Allocates a copy of the registration properties of the XAPO. |
||
| 281 | // |
||
| 282 | // PARAMETERS: |
||
| 283 | // ppRegistrationProperties - [out] receives pointer to copy of registration properties, use XAPOFree to free structure, left untouched on failure |
||
| 284 | // |
||
| 285 | // RETURN VALUE: |
||
| 286 | // COM error code |
||
| 287 | //// |
||
| 288 | STDMETHOD(GetRegistrationProperties) (THIS_ __deref_out XAPO_REGISTRATION_PROPERTIES** ppRegistrationProperties) PURE; |
||
| 289 | |||
| 290 | //// |
||
| 291 | // DESCRIPTION: |
||
| 292 | // Queries if an input/output configuration is supported. |
||
| 293 | // |
||
| 294 | // REMARKS: |
||
| 295 | // This method allows XAPOs to express dependency of input format |
||
| 296 | // with respect to output format. |
||
| 297 | // |
||
| 298 | // If the input/output format pair configuration is unsupported, |
||
| 299 | // this method also determines the nearest input format supported. |
||
| 300 | // Nearest meaning closest bit depth, framerate, and channel count, |
||
| 301 | // in that order of importance. |
||
| 302 | // |
||
| 303 | // The behaviour of this method should remain constant after the |
||
| 304 | // XAPO has been initialized. |
||
| 305 | // |
||
| 306 | // PARAMETERS: |
||
| 307 | // pOutputFormat - [in] output format known to be supported |
||
| 308 | // pRequestedInputFormat - [in] input format to examine |
||
| 309 | // ppSupportedInputFormat - [out] receives pointer to nearest input format supported if not NULL and input/output configuration unsupported, use XAPOFree to free structure, left untouched on any failure except XAPO_E_FORMAT_UNSUPPORTED |
||
| 310 | // |
||
| 311 | // RETURN VALUE: |
||
| 312 | // COM error code, including: |
||
| 313 | // S_OK - input/output configuration supported, ppSupportedInputFormat left untouched |
||
| 314 | // XAPO_E_FORMAT_UNSUPPORTED - input/output configuration unsupported, ppSupportedInputFormat receives pointer to nearest input format supported if not NULL |
||
| 315 | // E_INVALIDARG - either audio format invalid, ppSupportedInputFormat left untouched |
||
| 316 | //// |
||
| 317 | STDMETHOD(IsInputFormatSupported) (THIS_ const WAVEFORMATEX* pOutputFormat, const WAVEFORMATEX* pRequestedInputFormat, __deref_opt_out WAVEFORMATEX** ppSupportedInputFormat) PURE; |
||
| 318 | |||
| 319 | //// |
||
| 320 | // DESCRIPTION: |
||
| 321 | // Queries if an input/output configuration is supported. |
||
| 322 | // |
||
| 323 | // REMARKS: |
||
| 324 | // This method allows XAPOs to express dependency of output format |
||
| 325 | // with respect to input format. |
||
| 326 | // |
||
| 327 | // If the input/output format pair configuration is unsupported, |
||
| 328 | // this method also determines the nearest output format supported. |
||
| 329 | // Nearest meaning closest bit depth, framerate, and channel count, |
||
| 330 | // in that order of importance. |
||
| 331 | // |
||
| 332 | // The behaviour of this method should remain constant after the |
||
| 333 | // XAPO has been initialized. |
||
| 334 | // |
||
| 335 | // PARAMETERS: |
||
| 336 | // pInputFormat - [in] input format known to be supported |
||
| 337 | // pRequestedOutputFormat - [in] output format to examine |
||
| 338 | // ppSupportedOutputFormat - [out] receives pointer to nearest output format supported if not NULL and input/output configuration unsupported, use XAPOFree to free structure, left untouched on any failure except XAPO_E_FORMAT_UNSUPPORTED |
||
| 339 | // |
||
| 340 | // RETURN VALUE: |
||
| 341 | // COM error code, including: |
||
| 342 | // S_OK - input/output configuration supported, ppSupportedOutputFormat left untouched |
||
| 343 | // XAPO_E_FORMAT_UNSUPPORTED - input/output configuration unsupported, ppSupportedOutputFormat receives pointer to nearest output format supported if not NULL |
||
| 344 | // E_INVALIDARG - either audio format invalid, ppSupportedOutputFormat left untouched |
||
| 345 | //// |
||
| 346 | STDMETHOD(IsOutputFormatSupported) (THIS_ const WAVEFORMATEX* pInputFormat, const WAVEFORMATEX* pRequestedOutputFormat, __deref_opt_out WAVEFORMATEX** ppSupportedOutputFormat) PURE; |
||
| 347 | |||
| 348 | //// |
||
| 349 | // DESCRIPTION: |
||
| 350 | // Performs any effect-specific initialization if required. |
||
| 351 | // |
||
| 352 | // REMARKS: |
||
| 353 | // The contents of pData are defined by the XAPO. |
||
| 354 | // Immutable variables (constant during the lifespan of the XAPO) |
||
| 355 | // should be set once via this method. |
||
| 356 | // Once initialized, an XAPO cannot be initialized again. |
||
| 357 | // |
||
| 358 | // An XAPO should be initialized before passing it to XAudio2 |
||
| 359 | // as part of an effect chain. XAudio2 will not call this method; |
||
| 360 | // it exists for future content-driven initialization by XACT. |
||
| 361 | // |
||
| 362 | // PARAMETERS: |
||
| 363 | // pData - [in] effect-specific initialization parameters, may be NULL if DataByteSize == 0 |
||
| 364 | // DataByteSize - [in] size of pData in bytes, may be 0 if DataByteSize is NULL |
||
| 365 | // |
||
| 366 | // RETURN VALUE: |
||
| 367 | // COM error code |
||
| 368 | //// |
||
| 369 | STDMETHOD(Initialize) (THIS_ __in_bcount_opt(DataByteSize) const void* pData, UINT32 DataByteSize) PURE; |
||
| 370 | |||
| 371 | //// |
||
| 372 | // DESCRIPTION: |
||
| 373 | // Resets variables dependent on frame history. |
||
| 374 | // |
||
| 375 | // REMARKS: |
||
| 376 | // All other variables remain unchanged, including variables set by |
||
| 377 | // IXAPOParameters::SetParameters. |
||
| 378 | // |
||
| 379 | // For example, an effect with delay should zero out its delay line |
||
| 380 | // during this method, but should not reallocate anything as the |
||
| 381 | // XAPO remains locked with a constant input/output configuration. |
||
| 382 | // |
||
| 383 | // XAudio2 calls this method only if the XAPO is locked. |
||
| 384 | // This method should not block as it is called from the |
||
| 385 | // realtime thread. |
||
| 386 | // |
||
| 387 | // PARAMETERS: |
||
| 388 | // void |
||
| 389 | // |
||
| 390 | // RETURN VALUE: |
||
| 391 | // void |
||
| 392 | //// |
||
| 393 | STDMETHOD_(void, Reset) (THIS) PURE; |
||
| 394 | |||
| 395 | //// |
||
| 396 | // DESCRIPTION: |
||
| 397 | // Locks the XAPO to a specific input/output configuration, |
||
| 398 | // allowing it to do any final initialization before Process |
||
| 399 | // is called on the realtime thread. |
||
| 400 | // |
||
| 401 | // REMARKS: |
||
| 402 | // Once locked, the input/output configuration and any other locked |
||
| 403 | // variables remain constant until UnlockForProcess is called. |
||
| 404 | // |
||
| 405 | // XAPOs should assert the input/output configuration is supported |
||
| 406 | // and that any required effect-specific initialization is complete. |
||
| 407 | // IsInputFormatSupported, IsOutputFormatSupported, and Initialize |
||
| 408 | // should be called as necessary before this method is called. |
||
| 409 | // |
||
| 410 | // All internal memory buffers required for Process should be |
||
| 411 | // allocated by the time this method returns successfully |
||
| 412 | // as Process is non-blocking and should not allocate memory. |
||
| 413 | // |
||
| 414 | // Once locked, an XAPO cannot be locked again until |
||
| 415 | // UnLockForProcess is called. |
||
| 416 | // |
||
| 417 | // PARAMETERS: |
||
| 418 | // InputLockedParameterCount - [in] number of input buffers, must be within [XAPO_REGISTRATION_PROPERTIES.MinInputBufferCount, XAPO_REGISTRATION_PROPERTIES.MaxInputBufferCount] |
||
| 419 | // pInputLockedParameters - [in] array of input locked buffer parameter structures, may be NULL if InputLockedParameterCount == 0, otherwise must have InputLockedParameterCount elements |
||
| 420 | // OutputLockedParameterCount - [in] number of output buffers, must be within [XAPO_REGISTRATION_PROPERTIES.MinOutputBufferCount, XAPO_REGISTRATION_PROPERTIES.MaxOutputBufferCount], must match InputLockedParameterCount when XAPO_FLAG_BUFFERCOUNT_MUST_MATCH used |
||
| 421 | // pOutputLockedParameters - [in] array of output locked buffer parameter structures, may be NULL if OutputLockedParameterCount == 0, otherwise must have OutputLockedParameterCount elements |
||
| 422 | // |
||
| 423 | // RETURN VALUE: |
||
| 424 | // COM error code |
||
| 425 | //// |
||
| 426 | STDMETHOD(LockForProcess) (THIS_ UINT32 InputLockedParameterCount, __in_ecount_opt(InputLockedParameterCount) const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS* pInputLockedParameters, UINT32 OutputLockedParameterCount, __in_ecount_opt(OutputLockedParameterCount) const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS* pOutputLockedParameters) PURE; |
||
| 427 | |||
| 428 | //// |
||
| 429 | // DESCRIPTION: |
||
| 430 | // Opposite of LockForProcess. Variables allocated during |
||
| 431 | // LockForProcess should be deallocated by this method. |
||
| 432 | // |
||
| 433 | // REMARKS: |
||
| 434 | // Unlocking an XAPO allows an XAPO instance to be reused with |
||
| 435 | // different input/output configurations. |
||
| 436 | // |
||
| 437 | // PARAMETERS: |
||
| 438 | // void |
||
| 439 | // |
||
| 440 | // RETURN VALUE: |
||
| 441 | // void |
||
| 442 | //// |
||
| 443 | STDMETHOD_(void, UnlockForProcess) (THIS) PURE; |
||
| 444 | |||
| 445 | //// |
||
| 446 | // DESCRIPTION: |
||
| 447 | // Runs the XAPO's DSP code on the given input/output buffers. |
||
| 448 | // |
||
| 449 | // REMARKS: |
||
| 450 | // In addition to writing to the output buffers as appropriate, |
||
| 451 | // an XAPO must set the BufferFlags and ValidFrameCount members |
||
| 452 | // of all elements in pOutputProcessParameters accordingly. |
||
| 453 | // |
||
| 454 | // ppInputProcessParameters will not necessarily be the same as |
||
| 455 | // ppOutputProcessParameters for in-place processing, rather |
||
| 456 | // the pBuffer members of each will point to the same memory. |
||
| 457 | // |
||
| 458 | // Multiple input/output buffers may be used with in-place XAPOs, |
||
| 459 | // though the input buffer count must equal the output buffer count. |
||
| 460 | // When multiple input/output buffers are used with in-place XAPOs, |
||
| 461 | // the XAPO may assume input buffer [N] equals output buffer [N]. |
||
| 462 | // |
||
| 463 | // When IsEnabled is FALSE, the XAPO should process thru. |
||
| 464 | // Thru processing means an XAPO should not apply its normal |
||
| 465 | // processing to the given input/output buffers during Process. |
||
| 466 | // It should instead pass data from input to output with as little |
||
| 467 | // modification possible. Effects that perform format conversion |
||
| 468 | // should continue to do so. The effect must ensure transitions |
||
| 469 | // between normal and thru processing do not introduce |
||
| 470 | // discontinuities into the signal. |
||
| 471 | // |
||
| 472 | // XAudio2 calls this method only if the XAPO is locked. |
||
| 473 | // This method should not block as it is called from the |
||
| 474 | // realtime thread. |
||
| 475 | // |
||
| 476 | // PARAMETERS: |
||
| 477 | // InputProcessParameterCount - [in] number of input buffers, matches respective InputLockedParameterCount parameter given to LockForProcess |
||
| 478 | // pInputProcessParameters - [in] array of input process buffer parameter structures, may be NULL if InputProcessParameterCount == 0, otherwise must have InputProcessParameterCount elements |
||
| 479 | // OutputProcessParameterCount - [in] number of output buffers, matches respective OutputLockedParameterCount parameter given to LockForProcess |
||
| 480 | // pOutputProcessParameters - [in/out] array of output process buffer parameter structures, may be NULL if OutputProcessParameterCount == 0, otherwise must have OutputProcessParameterCount elements |
||
| 481 | // IsEnabled - [in] TRUE to process normally, FALSE to process thru |
||
| 482 | // |
||
| 483 | // RETURN VALUE: |
||
| 484 | // void |
||
| 485 | //// |
||
| 486 | STDMETHOD_(void, Process) (THIS_ UINT32 InputProcessParameterCount, __in_ecount_opt(InputProcessParameterCount) const XAPO_PROCESS_BUFFER_PARAMETERS* pInputProcessParameters, UINT32 OutputProcessParameterCount, __inout_ecount_opt(OutputProcessParameterCount) XAPO_PROCESS_BUFFER_PARAMETERS* pOutputProcessParameters, BOOL IsEnabled) PURE; |
||
| 487 | |||
| 488 | //// |
||
| 489 | // DESCRIPTION: |
||
| 490 | // Returns the number of input frames required to generate the |
||
| 491 | // requested number of output frames. |
||
| 492 | // |
||
| 493 | // REMARKS: |
||
| 494 | // XAudio2 may call this method to determine how many input frames |
||
| 495 | // an XAPO requires. This is constant for locked CBR XAPOs; |
||
| 496 | // this method need only be called once while an XAPO is locked. |
||
| 497 | // |
||
| 498 | // XAudio2 calls this method only if the XAPO is locked. |
||
| 499 | // This method should not block as it is called from the |
||
| 500 | // realtime thread. |
||
| 501 | // |
||
| 502 | // PARAMETERS: |
||
| 503 | // OutputFrameCount - [in] requested number of output frames, must be within respective [0, XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount], always XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount for CBR/user-defined XAPOs |
||
| 504 | // |
||
| 505 | // RETURN VALUE: |
||
| 506 | // number of input frames required |
||
| 507 | //// |
||
| 508 | STDMETHOD_(UINT32, CalcInputFrames) (THIS_ UINT32 OutputFrameCount) PURE; |
||
| 509 | |||
| 510 | //// |
||
| 511 | // DESCRIPTION: |
||
| 512 | // Returns the number of output frames generated for the |
||
| 513 | // requested number of input frames. |
||
| 514 | // |
||
| 515 | // REMARKS: |
||
| 516 | // XAudio2 may call this method to determine how many output frames |
||
| 517 | // an XAPO will generate. This is constant for locked CBR XAPOs; |
||
| 518 | // this method need only be called once while an XAPO is locked. |
||
| 519 | // |
||
| 520 | // XAudio2 calls this method only if the XAPO is locked. |
||
| 521 | // This method should not block as it is called from the |
||
| 522 | // realtime thread. |
||
| 523 | // |
||
| 524 | // PARAMETERS: |
||
| 525 | // InputFrameCount - [in] requested number of input frames, must be within respective [0, XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount], always XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount for CBR/user-defined XAPOs |
||
| 526 | // |
||
| 527 | // RETURN VALUE: |
||
| 528 | // number of output frames generated |
||
| 529 | //// |
||
| 530 | STDMETHOD_(UINT32, CalcOutputFrames) (THIS_ UINT32 InputFrameCount) PURE; |
||
| 531 | }; |
||
| 532 | |||
| 533 | |||
| 534 | |||
| 535 | // IXAPOParameters: |
||
| 536 | // Optional XAPO COM interface that allows an XAPO to use |
||
| 537 | // effect-specific parameters. |
||
| 538 | #undef INTERFACE |
||
| 539 | #define INTERFACE IXAPOParameters |
||
| 540 | DECLARE_INTERFACE_(IXAPOParameters, IUnknown) { |
||
| 541 | //// |
||
| 542 | // DESCRIPTION: |
||
| 543 | // Sets effect-specific parameters. |
||
| 544 | // |
||
| 545 | // REMARKS: |
||
| 546 | // This method may only be called on the realtime thread; |
||
| 547 | // no synchronization between it and IXAPO::Process is necessary. |
||
| 548 | // |
||
| 549 | // This method should not block as it is called from the |
||
| 550 | // realtime thread. |
||
| 551 | // |
||
| 552 | // PARAMETERS: |
||
| 553 | // pParameters - [in] effect-specific parameter block, must be != NULL |
||
| 554 | // ParameterByteSize - [in] size of pParameters in bytes, must be > 0 |
||
| 555 | // |
||
| 556 | // RETURN VALUE: |
||
| 557 | // void |
||
| 558 | //// |
||
| 559 | STDMETHOD_(void, SetParameters) (THIS_ __in_bcount(ParameterByteSize) const void* pParameters, UINT32 ParameterByteSize) PURE; |
||
| 560 | |||
| 561 | //// |
||
| 562 | // DESCRIPTION: |
||
| 563 | // Gets effect-specific parameters. |
||
| 564 | // |
||
| 565 | // REMARKS: |
||
| 566 | // Unlike SetParameters, XAudio2 does not call this method on the |
||
| 567 | // realtime thread. Thus, the XAPO must protect variables shared |
||
| 568 | // with SetParameters/Process using appropriate synchronization. |
||
| 569 | // |
||
| 570 | // PARAMETERS: |
||
| 571 | // pParameters - [out] receives effect-specific parameter block, must be != NULL |
||
| 572 | // ParameterByteSize - [in] size of pParameters in bytes, must be > 0 |
||
| 573 | // |
||
| 574 | // RETURN VALUE: |
||
| 575 | // void |
||
| 576 | //// |
||
| 577 | STDMETHOD_(void, GetParameters) (THIS_ __out_bcount(ParameterByteSize) void* pParameters, UINT32 ParameterByteSize) PURE; |
||
| 578 | }; |
||
| 579 | |||
| 580 | |||
| 581 | //--------------<M-A-C-R-O-S>-----------------------------------------------// |
||
| 582 | // macros to allow XAPO interfaces to be used in C code |
||
| 583 | #if !defined(__cplusplus) |
||
| 584 | // IXAPO |
||
| 585 | #define IXAPO_QueryInterface(This, riid, ppInterface) \ |
||
| 586 | ( (This)->lpVtbl->QueryInterface(This, riid, ppInterface) ) |
||
| 587 | |||
| 588 | #define IXAPO_AddRef(This) \ |
||
| 589 | ( (This)->lpVtbl->AddRef(This) ) |
||
| 590 | |||
| 591 | #define IXAPO_Release(This) \ |
||
| 592 | ( (This)->lpVtbl->Release(This) ) |
||
| 593 | |||
| 594 | #define IXAPO_GetRegistrationProperties(This, ppRegistrationProperties) \ |
||
| 595 | ( (This)->lpVtbl->GetRegistrationProperties(This, ppRegistrationProperties) ) |
||
| 596 | |||
| 597 | #define IXAPO_IsInputFormatSupported(This, pOutputFormat, pRequestedInputFormat, ppSupportedInputFormat) \ |
||
| 598 | ( (This)->lpVtbl->IsInputFormatSupported(This, pOutputFormat, pRequestedInputFormat, ppSupportedInputFormat) ) |
||
| 599 | |||
| 600 | #define IXAPO_IsOutputFormatSupported(This, pInputFormat, pRequestedOutputFormat, ppSupportedOutputFormat) \ |
||
| 601 | ( (This)->lpVtbl->IsOutputFormatSupported(This, pInputFormat, pRequestedOutputFormat, ppSupportedOutputFormat) ) |
||
| 602 | |||
| 603 | #define IXAPO_Initialize(This, pData, DataByteSize) \ |
||
| 604 | ( (This)->lpVtbl->Initialize(This, pData, DataByteSize) ) |
||
| 605 | |||
| 606 | #define IXAPO_Reset(This) \ |
||
| 607 | ( (This)->lpVtbl->Reset(This) ) |
||
| 608 | |||
| 609 | #define IXAPO_LockForProcess(This, InputLockedParameterCount, pInputLockedParameters, OutputLockedParameterCount, pOutputLockedParameters) \ |
||
| 610 | ( (This)->lpVtbl->LockForProcess(This, InputLockedParameterCount, pInputLockedParameters, OutputLockedParameterCount, pOutputLockedParameters) ) |
||
| 611 | |||
| 612 | #define IXAPO_UnlockForProcess(This) \ |
||
| 613 | ( (This)->lpVtbl->UnlockForProcess(This) ) |
||
| 614 | |||
| 615 | #define IXAPO_Process(This, InputProcessParameterCount, pInputProcessParameters, OutputProcessParameterCount, pOutputProcessParameters, IsEnabled) \ |
||
| 616 | ( (This)->lpVtbl->Process(This, InputProcessParameterCount, pInputProcessParameters, OutputProcessParameterCount, pOutputProcessParameters, IsEnabled) ) |
||
| 617 | |||
| 618 | #define IXAPO_CalcInputFrames(This, OutputFrameCount) \ |
||
| 619 | ( (This)->lpVtbl->CalcInputFrames(This, OutputFrameCount) ) |
||
| 620 | |||
| 621 | #define IXAPO_CalcOutputFrames(This, InputFrameCount) \ |
||
| 622 | ( (This)->lpVtbl->CalcOutputFrames(This, InputFrameCount) ) |
||
| 623 | |||
| 624 | |||
| 625 | // IXAPOParameters |
||
| 626 | #define IXAPOParameters_QueryInterface(This, riid, ppInterface) \ |
||
| 627 | ( (This)->lpVtbl->QueryInterface(This, riid, ppInterface) ) |
||
| 628 | |||
| 629 | #define IXAPOParameters_AddRef(This) \ |
||
| 630 | ( (This)->lpVtbl->AddRef(This) ) |
||
| 631 | |||
| 632 | #define IXAPOParameters_Release(This) \ |
||
| 633 | ( (This)->lpVtbl->Release(This) ) |
||
| 634 | |||
| 635 | #define IXAPOParameters_SetParameters(This, pParameters, ParameterByteSize) \ |
||
| 636 | ( (This)->lpVtbl->SetParameters(This, pParameters, ParameterByteSize) ) |
||
| 637 | |||
| 638 | #define IXAPOParameters_GetParameters(This, pParameters, ParameterByteSize) \ |
||
| 639 | ( (This)->lpVtbl->GetParameters(This, pParameters, ParameterByteSize) ) |
||
| 640 | #endif // !defined(__cplusplus) |
||
| 641 | |||
| 642 | |||
| 643 | #pragma pack(pop) // revert packing alignment |
||
| 644 | #endif // !defined(GUID_DEFS_ONLY) |
||
| 645 | //---------------------------------<-EOF->----------------------------------// |