123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645 |
- /*-========================================================================-_
- | - XAPO - |
- | Copyright (c) Microsoft Corporation. All rights reserved. |
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
- |PROJECT: XAPO MODEL: Unmanaged User-mode |
- |VERSION: 1.0 EXCEPT: No Exceptions |
- |CLASS: N / A MINREQ: WinXP, Xbox360 |
- |BASE: N / A DIALECT: MSC++ 14.00 |
- |>------------------------------------------------------------------------<|
- | DUTY: Cross-platform Audio Processing Object interfaces |
- ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
- NOTES:
- 1. Definition of terms:
- DSP: Digital Signal Processing.
- CBR: Constant BitRate -- DSP that consumes a constant number of
- input samples to produce an output sample.
- For example, a 22kHz to 44kHz resampler is CBR DSP.
- Even though the number of input to output samples differ,
- the ratio between input to output rate remains constant.
- All user-defined XAPOs are assumed to be CBR as
- XAudio2 only allows CBR DSP to be added to an effect chain.
- XAPO: Cross-platform Audio Processing Object --
- a thin wrapper that manages DSP code, allowing it
- to be easily plugged into an XAudio2 effect chain.
- Frame: A block of samples, one per channel,
- to be played simultaneously.
- In-Place: Processing such that the input buffer equals the
- output buffer (i.e. input data modified directly).
- This form of processing is generally more efficient
- than using separate memory for input and output.
- However, an XAPO may not perform format conversion
- when processing in-place.
- 2. XAPO member variables are divided into three classifications:
- Immutable: Set once via IXAPO::Initialize and remain
- constant during the lifespan of the XAPO.
- Locked: May change before the XAPO is locked via
- IXAPO::LockForProcess but remain constant
- until IXAPO::UnlockForProcess is called.
- Dynamic: May change from one processing pass to the next,
- usually via IXAPOParameters::SetParameters.
- XAPOs should assign reasonable defaults to their dynamic
- variables during IXAPO::Initialize/LockForProcess so
- that calling IXAPOParameters::SetParameters is not
- required before processing begins.
- When implementing an XAPO, determine the type of each variable and
- initialize them in the appropriate method. Immutable variables are
- generally preferable over locked which are preferable over dynamic.
- That is, one should strive to minimize XAPO state changes for
- best performance, maintainability, and ease of use.
- 3. To minimize glitches, the realtime audio processing thread must
- not block. XAPO methods called by the realtime thread are commented
- as non-blocking and therefore should not use blocking synchronization,
- allocate memory, access the disk, etc. The XAPO interfaces were
- designed to allow an effect implementer to move such operations
- into other methods called on an application controlled thread.
- 4. Extending functionality is accomplished through the addition of new
- COM interfaces. For example, if a new member is added to a parameter
- structure, a new interface using the new structure should be added,
- leaving the original interface unchanged.
- This ensures consistent communication between future versions of
- XAudio2 and various versions of XAPOs that may exist in an application.
- 5. All audio data is interleaved in XAudio2.
- The default audio format for an effect chain is WAVE_FORMAT_IEEE_FLOAT.
- 6. User-defined XAPOs should assume all input and output buffers are
- 16-byte aligned.
- 7. See XAPOBase.h for an XAPO base class which provides a default
- implementation for most of the interface methods defined below. */
- #pragma once
- //--------------<D-E-F-I-N-I-T-I-O-N-S>-------------------------------------//
- #include "comdecl.h" // for DEFINE_IID
- // XAPO interface IDs
- DEFINE_IID(IXAPO, A90BC001, E897, E897, 55, E4, 9E, 47, 00, 00, 00, 00);
- DEFINE_IID(IXAPOParameters, A90BC001, E897, E897, 55, E4, 9E, 47, 00, 00, 00, 01);
- #if !defined(GUID_DEFS_ONLY) // ignore rest if only GUID definitions requested
- #if defined(_XBOX) // general windows and COM declarations
- #include <xtl.h>
- #include <xobjbase.h>
- #else
- #include <windows.h>
- #include <objbase.h>
- #endif
- #include "audiodefs.h" // for WAVEFORMATEX etc.
- // XAPO error codes
- #define FACILITY_XAPO 0x897
- #define XAPO_E_FORMAT_UNSUPPORTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_XAPO, 0x01) // requested audio format unsupported
- // supported number of channels (samples per frame) range
- #define XAPO_MIN_CHANNELS 1
- #define XAPO_MAX_CHANNELS 64
- // supported framerate range
- #define XAPO_MIN_FRAMERATE 1000
- #define XAPO_MAX_FRAMERATE 200000
- // unicode string length, including terminator, used with XAPO_REGISTRATION_PROPERTIES
- #define XAPO_REGISTRATION_STRING_LENGTH 256
- // XAPO property flags, used with XAPO_REGISTRATION_PROPERTIES.Flags:
- // Number of channels of input and output buffers must match,
- // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat.
- #define XAPO_FLAG_CHANNELS_MUST_MATCH 0x00000001
- // Framerate of input and output buffers must match,
- // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat.
- #define XAPO_FLAG_FRAMERATE_MUST_MATCH 0x00000002
- // Bit depth of input and output buffers must match,
- // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat.
- // Container size of input and output buffers must also match if
- // XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat is WAVEFORMATEXTENSIBLE.
- #define XAPO_FLAG_BITSPERSAMPLE_MUST_MATCH 0x00000004
- // Number of input and output buffers must match,
- // applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.
- //
- // Also, XAPO_REGISTRATION_PROPERTIES.MinInputBufferCount must
- // equal XAPO_REGISTRATION_PROPERTIES.MinOutputBufferCount and
- // XAPO_REGISTRATION_PROPERTIES.MaxInputBufferCount must equal
- // XAPO_REGISTRATION_PROPERTIES.MaxOutputBufferCount when used.
- #define XAPO_FLAG_BUFFERCOUNT_MUST_MATCH 0x00000008
- // XAPO must be run in-place. Use this flag only if your DSP
- // implementation cannot process separate input and output buffers.
- // If set, the following flags must also be set:
- // XAPO_FLAG_CHANNELS_MUST_MATCH
- // XAPO_FLAG_FRAMERATE_MUST_MATCH
- // XAPO_FLAG_BITSPERSAMPLE_MUST_MATCH
- // XAPO_FLAG_BUFFERCOUNT_MUST_MATCH
- // XAPO_FLAG_INPLACE_SUPPORTED
- //
- // Multiple input and output buffers may be used with in-place XAPOs,
- // though the input buffer count must equal the output buffer count.
- // When multiple input/output buffers are used, the XAPO may assume
- // input buffer [N] equals output buffer [N] for in-place processing.
- #define XAPO_FLAG_INPLACE_REQUIRED 0x00000020
- // XAPO may be run in-place. If the XAPO is used in a chain
- // such that the requirements for XAPO_FLAG_INPLACE_REQUIRED are met,
- // XAudio2 will ensure the XAPO is run in-place. If not met, XAudio2
- // will still run the XAPO albeit with separate input and output buffers.
- //
- // For example, consider an effect which may be ran in stereo->5.1 mode or
- // mono->mono mode. When set to stereo->5.1, it will be run with separate
- // input and output buffers as format conversion is not permitted in-place.
- // However, if configured to run mono->mono, the same XAPO can be run
- // in-place. Thus the same implementation may be conveniently reused
- // for various input/output configurations, while taking advantage of
- // in-place processing when possible.
- #define XAPO_FLAG_INPLACE_SUPPORTED 0x00000010
- //--------------<D-A-T-A---T-Y-P-E-S>---------------------------------------//
- #pragma pack(push, 1) // set packing alignment to ensure consistency across arbitrary build environments
- // XAPO registration properties, describes general XAPO characteristics, used with IXAPO::GetRegistrationProperties
- typedef struct XAPO_REGISTRATION_PROPERTIES {
- CLSID clsid; // COM class ID, used with CoCreate
- WCHAR FriendlyName[XAPO_REGISTRATION_STRING_LENGTH]; // friendly name unicode string
- WCHAR CopyrightInfo[XAPO_REGISTRATION_STRING_LENGTH]; // copyright information unicode string
- UINT32 MajorVersion; // major version
- UINT32 MinorVersion; // minor version
- UINT32 Flags; // XAPO property flags, describes supported input/output configuration
- UINT32 MinInputBufferCount; // minimum number of input buffers required for processing, can be 0
- UINT32 MaxInputBufferCount; // maximum number of input buffers supported for processing, must be >= MinInputBufferCount
- UINT32 MinOutputBufferCount; // minimum number of output buffers required for processing, can be 0, must match MinInputBufferCount when XAPO_FLAG_BUFFERCOUNT_MUST_MATCH used
- UINT32 MaxOutputBufferCount; // maximum number of output buffers supported for processing, must be >= MinOutputBufferCount, must match MaxInputBufferCount when XAPO_FLAG_BUFFERCOUNT_MUST_MATCH used
- } XAPO_REGISTRATION_PROPERTIES;
- // LockForProcess buffer parameters:
- // Defines buffer parameters that remain constant while an XAPO is locked.
- // Used with IXAPO::LockForProcess.
- //
- // For CBR XAPOs, MaxFrameCount is the only number of frames
- // IXAPO::Process would have to handle for the respective buffer.
- typedef struct XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS {
- const WAVEFORMATEX* pFormat; // buffer audio format
- UINT32 MaxFrameCount; // maximum number of frames in respective buffer that IXAPO::Process would have to handle, irrespective of dynamic variable settings, can be 0
- } XAPO_LOCKFORPROCESS_PARAMETERS;
- // Buffer flags:
- // Describes assumed content of the respective buffer.
- // Used with XAPO_PROCESS_BUFFER_PARAMETERS.BufferFlags.
- //
- // This meta-data can be used by an XAPO to implement
- // optimizations that require knowledge of a buffer's content.
- //
- // For example, XAPOs that always produce silent output from silent input
- // can check the flag on the input buffer to determine if any signal
- // processing is necessary. If silent, the XAPO may simply set the flag
- // on the output buffer to silent and return, optimizing out the work of
- // processing silent data: XAPOs that generate silence for any reason may
- // set the buffer's flag accordingly rather than writing out silent
- // frames to the buffer itself.
- //
- // The flags represent what should be assumed is in the respective buffer.
- // The flags may not reflect what is actually stored in memory.
- typedef enum XAPO_BUFFER_FLAGS {
- XAPO_BUFFER_SILENT, // silent data should be assumed, respective memory may be uninitialized
- XAPO_BUFFER_VALID, // arbitrary data should be assumed (may or may not be silent frames), respective memory initialized
- } XAPO_BUFFER_FLAGS;
- // Process buffer parameters:
- // Defines buffer parameters that may change from one
- // processing pass to the next. Used with IXAPO::Process.
- //
- // Note the byte size of the respective buffer must be at least:
- // XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount * XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat->nBlockAlign
- //
- // Although the audio format and maximum size of the respective
- // buffer is locked (defined by XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS),
- // the actual memory address of the buffer given is permitted to change
- // from one processing pass to the next.
- //
- // For CBR XAPOs, ValidFrameCount is constant while locked and equals
- // the respective XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.MaxFrameCount.
- typedef struct XAPO_PROCESS_BUFFER_PARAMETERS {
- void* pBuffer; // audio data buffer, must be non-NULL
- XAPO_BUFFER_FLAGS BufferFlags; // describes assumed content of pBuffer, does not affect ValidFrameCount
- 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
- } XAPO_PROCESS_BUFFER_PARAMETERS;
- //--------------<M-A-C-R-O-S>-----------------------------------------------//
- // Memory allocation macros that allow one module to allocate memory and
- // another to free it, by guaranteeing that the same heap manager is used
- // regardless of differences between build environments of the two modules.
- //
- // Used by IXAPO methods that must allocate arbitrary sized structures
- // such as WAVEFORMATEX that are subsequently returned to the application.
- #if defined(_XBOX)
- #define XAPO_ALLOC_ATTRIBUTES MAKE_XALLOC_ATTRIBUTES ( \
- 0, /* ObjectType */ \
- FALSE, /* HeapTracksAttributes */ \
- FALSE, /* MustSucceed */ \
- FALSE, /* FixedSize */ \
- eXALLOCAllocatorId_XAUDIO2, /* AllocatorId */ \
- XALLOC_ALIGNMENT_DEFAULT, /* Alignment */ \
- XALLOC_MEMPROTECT_READWRITE, /* MemoryProtect */ \
- FALSE, /* ZeroInitialize */ \
- XALLOC_MEMTYPE_HEAP /* MemoryType */ \
- )
- #define XAPOAlloc(size) XMemAlloc(size, XAPO_ALLOC_ATTRIBUTES)
- #define XAPOFree(p) XMemFree(p, XAPO_ALLOC_ATTRIBUTES)
- #else
- #define XAPOAlloc(size) CoTaskMemAlloc(size)
- #define XAPOFree(p) CoTaskMemFree(p)
- #endif
- //--------------<I-N-T-E-R-F-A-C-E-S>---------------------------------------//
- // IXAPO:
- // The only mandatory XAPO COM interface -- a thin wrapper that manages
- // DSP code, allowing it to be easily plugged into an XAudio2 effect chain.
- #undef INTERFACE
- #define INTERFACE IXAPO
- DECLARE_INTERFACE_(IXAPO, IUnknown) {
- ////
- // DESCRIPTION:
- // Allocates a copy of the registration properties of the XAPO.
- //
- // PARAMETERS:
- // ppRegistrationProperties - [out] receives pointer to copy of registration properties, use XAPOFree to free structure, left untouched on failure
- //
- // RETURN VALUE:
- // COM error code
- ////
- STDMETHOD(GetRegistrationProperties) (THIS_ __deref_out XAPO_REGISTRATION_PROPERTIES** ppRegistrationProperties) PURE;
- ////
- // DESCRIPTION:
- // Queries if an input/output configuration is supported.
- //
- // REMARKS:
- // This method allows XAPOs to express dependency of input format
- // with respect to output format.
- //
- // If the input/output format pair configuration is unsupported,
- // this method also determines the nearest input format supported.
- // Nearest meaning closest bit depth, framerate, and channel count,
- // in that order of importance.
- //
- // The behaviour of this method should remain constant after the
- // XAPO has been initialized.
- //
- // PARAMETERS:
- // pOutputFormat - [in] output format known to be supported
- // pRequestedInputFormat - [in] input format to examine
- // 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
- //
- // RETURN VALUE:
- // COM error code, including:
- // S_OK - input/output configuration supported, ppSupportedInputFormat left untouched
- // XAPO_E_FORMAT_UNSUPPORTED - input/output configuration unsupported, ppSupportedInputFormat receives pointer to nearest input format supported if not NULL
- // E_INVALIDARG - either audio format invalid, ppSupportedInputFormat left untouched
- ////
- STDMETHOD(IsInputFormatSupported) (THIS_ const WAVEFORMATEX* pOutputFormat, const WAVEFORMATEX* pRequestedInputFormat, __deref_opt_out WAVEFORMATEX** ppSupportedInputFormat) PURE;
- ////
- // DESCRIPTION:
- // Queries if an input/output configuration is supported.
- //
- // REMARKS:
- // This method allows XAPOs to express dependency of output format
- // with respect to input format.
- //
- // If the input/output format pair configuration is unsupported,
- // this method also determines the nearest output format supported.
- // Nearest meaning closest bit depth, framerate, and channel count,
- // in that order of importance.
- //
- // The behaviour of this method should remain constant after the
- // XAPO has been initialized.
- //
- // PARAMETERS:
- // pInputFormat - [in] input format known to be supported
- // pRequestedOutputFormat - [in] output format to examine
- // 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
- //
- // RETURN VALUE:
- // COM error code, including:
- // S_OK - input/output configuration supported, ppSupportedOutputFormat left untouched
- // XAPO_E_FORMAT_UNSUPPORTED - input/output configuration unsupported, ppSupportedOutputFormat receives pointer to nearest output format supported if not NULL
- // E_INVALIDARG - either audio format invalid, ppSupportedOutputFormat left untouched
- ////
- STDMETHOD(IsOutputFormatSupported) (THIS_ const WAVEFORMATEX* pInputFormat, const WAVEFORMATEX* pRequestedOutputFormat, __deref_opt_out WAVEFORMATEX** ppSupportedOutputFormat) PURE;
- ////
- // DESCRIPTION:
- // Performs any effect-specific initialization if required.
- //
- // REMARKS:
- // The contents of pData are defined by the XAPO.
- // Immutable variables (constant during the lifespan of the XAPO)
- // should be set once via this method.
- // Once initialized, an XAPO cannot be initialized again.
- //
- // An XAPO should be initialized before passing it to XAudio2
- // as part of an effect chain. XAudio2 will not call this method;
- // it exists for future content-driven initialization by XACT.
- //
- // PARAMETERS:
- // pData - [in] effect-specific initialization parameters, may be NULL if DataByteSize == 0
- // DataByteSize - [in] size of pData in bytes, may be 0 if DataByteSize is NULL
- //
- // RETURN VALUE:
- // COM error code
- ////
- STDMETHOD(Initialize) (THIS_ __in_bcount_opt(DataByteSize) const void* pData, UINT32 DataByteSize) PURE;
- ////
- // DESCRIPTION:
- // Resets variables dependent on frame history.
- //
- // REMARKS:
- // All other variables remain unchanged, including variables set by
- // IXAPOParameters::SetParameters.
- //
- // For example, an effect with delay should zero out its delay line
- // during this method, but should not reallocate anything as the
- // XAPO remains locked with a constant input/output configuration.
- //
- // XAudio2 calls this method only if the XAPO is locked.
- // This method should not block as it is called from the
- // realtime thread.
- //
- // PARAMETERS:
- // void
- //
- // RETURN VALUE:
- // void
- ////
- STDMETHOD_(void, Reset) (THIS) PURE;
- ////
- // DESCRIPTION:
- // Locks the XAPO to a specific input/output configuration,
- // allowing it to do any final initialization before Process
- // is called on the realtime thread.
- //
- // REMARKS:
- // Once locked, the input/output configuration and any other locked
- // variables remain constant until UnlockForProcess is called.
- //
- // XAPOs should assert the input/output configuration is supported
- // and that any required effect-specific initialization is complete.
- // IsInputFormatSupported, IsOutputFormatSupported, and Initialize
- // should be called as necessary before this method is called.
- //
- // All internal memory buffers required for Process should be
- // allocated by the time this method returns successfully
- // as Process is non-blocking and should not allocate memory.
- //
- // Once locked, an XAPO cannot be locked again until
- // UnLockForProcess is called.
- //
- // PARAMETERS:
- // InputLockedParameterCount - [in] number of input buffers, must be within [XAPO_REGISTRATION_PROPERTIES.MinInputBufferCount, XAPO_REGISTRATION_PROPERTIES.MaxInputBufferCount]
- // pInputLockedParameters - [in] array of input locked buffer parameter structures, may be NULL if InputLockedParameterCount == 0, otherwise must have InputLockedParameterCount elements
- // 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
- // pOutputLockedParameters - [in] array of output locked buffer parameter structures, may be NULL if OutputLockedParameterCount == 0, otherwise must have OutputLockedParameterCount elements
- //
- // RETURN VALUE:
- // COM error code
- ////
- 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;
- ////
- // DESCRIPTION:
- // Opposite of LockForProcess. Variables allocated during
- // LockForProcess should be deallocated by this method.
- //
- // REMARKS:
- // Unlocking an XAPO allows an XAPO instance to be reused with
- // different input/output configurations.
- //
- // PARAMETERS:
- // void
- //
- // RETURN VALUE:
- // void
- ////
- STDMETHOD_(void, UnlockForProcess) (THIS) PURE;
- ////
- // DESCRIPTION:
- // Runs the XAPO's DSP code on the given input/output buffers.
- //
- // REMARKS:
- // In addition to writing to the output buffers as appropriate,
- // an XAPO must set the BufferFlags and ValidFrameCount members
- // of all elements in pOutputProcessParameters accordingly.
- //
- // ppInputProcessParameters will not necessarily be the same as
- // ppOutputProcessParameters for in-place processing, rather
- // the pBuffer members of each will point to the same memory.
- //
- // Multiple input/output buffers may be used with in-place XAPOs,
- // though the input buffer count must equal the output buffer count.
- // When multiple input/output buffers are used with in-place XAPOs,
- // the XAPO may assume input buffer [N] equals output buffer [N].
- //
- // When IsEnabled is FALSE, the XAPO should process thru.
- // Thru processing means an XAPO should not apply its normal
- // processing to the given input/output buffers during Process.
- // It should instead pass data from input to output with as little
- // modification possible. Effects that perform format conversion
- // should continue to do so. The effect must ensure transitions
- // between normal and thru processing do not introduce
- // discontinuities into the signal.
- //
- // XAudio2 calls this method only if the XAPO is locked.
- // This method should not block as it is called from the
- // realtime thread.
- //
- // PARAMETERS:
- // InputProcessParameterCount - [in] number of input buffers, matches respective InputLockedParameterCount parameter given to LockForProcess
- // pInputProcessParameters - [in] array of input process buffer parameter structures, may be NULL if InputProcessParameterCount == 0, otherwise must have InputProcessParameterCount elements
- // OutputProcessParameterCount - [in] number of output buffers, matches respective OutputLockedParameterCount parameter given to LockForProcess
- // pOutputProcessParameters - [in/out] array of output process buffer parameter structures, may be NULL if OutputProcessParameterCount == 0, otherwise must have OutputProcessParameterCount elements
- // IsEnabled - [in] TRUE to process normally, FALSE to process thru
- //
- // RETURN VALUE:
- // void
- ////
- 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;
- ////
- // DESCRIPTION:
- // Returns the number of input frames required to generate the
- // requested number of output frames.
- //
- // REMARKS:
- // XAudio2 may call this method to determine how many input frames
- // an XAPO requires. This is constant for locked CBR XAPOs;
- // this method need only be called once while an XAPO is locked.
- //
- // XAudio2 calls this method only if the XAPO is locked.
- // This method should not block as it is called from the
- // realtime thread.
- //
- // PARAMETERS:
- // 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
- //
- // RETURN VALUE:
- // number of input frames required
- ////
- STDMETHOD_(UINT32, CalcInputFrames) (THIS_ UINT32 OutputFrameCount) PURE;
- ////
- // DESCRIPTION:
- // Returns the number of output frames generated for the
- // requested number of input frames.
- //
- // REMARKS:
- // XAudio2 may call this method to determine how many output frames
- // an XAPO will generate. This is constant for locked CBR XAPOs;
- // this method need only be called once while an XAPO is locked.
- //
- // XAudio2 calls this method only if the XAPO is locked.
- // This method should not block as it is called from the
- // realtime thread.
- //
- // PARAMETERS:
- // 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
- //
- // RETURN VALUE:
- // number of output frames generated
- ////
- STDMETHOD_(UINT32, CalcOutputFrames) (THIS_ UINT32 InputFrameCount) PURE;
- };
- // IXAPOParameters:
- // Optional XAPO COM interface that allows an XAPO to use
- // effect-specific parameters.
- #undef INTERFACE
- #define INTERFACE IXAPOParameters
- DECLARE_INTERFACE_(IXAPOParameters, IUnknown) {
- ////
- // DESCRIPTION:
- // Sets effect-specific parameters.
- //
- // REMARKS:
- // This method may only be called on the realtime thread;
- // no synchronization between it and IXAPO::Process is necessary.
- //
- // This method should not block as it is called from the
- // realtime thread.
- //
- // PARAMETERS:
- // pParameters - [in] effect-specific parameter block, must be != NULL
- // ParameterByteSize - [in] size of pParameters in bytes, must be > 0
- //
- // RETURN VALUE:
- // void
- ////
- STDMETHOD_(void, SetParameters) (THIS_ __in_bcount(ParameterByteSize) const void* pParameters, UINT32 ParameterByteSize) PURE;
- ////
- // DESCRIPTION:
- // Gets effect-specific parameters.
- //
- // REMARKS:
- // Unlike SetParameters, XAudio2 does not call this method on the
- // realtime thread. Thus, the XAPO must protect variables shared
- // with SetParameters/Process using appropriate synchronization.
- //
- // PARAMETERS:
- // pParameters - [out] receives effect-specific parameter block, must be != NULL
- // ParameterByteSize - [in] size of pParameters in bytes, must be > 0
- //
- // RETURN VALUE:
- // void
- ////
- STDMETHOD_(void, GetParameters) (THIS_ __out_bcount(ParameterByteSize) void* pParameters, UINT32 ParameterByteSize) PURE;
- };
- //--------------<M-A-C-R-O-S>-----------------------------------------------//
- // macros to allow XAPO interfaces to be used in C code
- #if !defined(__cplusplus)
- // IXAPO
- #define IXAPO_QueryInterface(This, riid, ppInterface) \
- ( (This)->lpVtbl->QueryInterface(This, riid, ppInterface) )
- #define IXAPO_AddRef(This) \
- ( (This)->lpVtbl->AddRef(This) )
- #define IXAPO_Release(This) \
- ( (This)->lpVtbl->Release(This) )
- #define IXAPO_GetRegistrationProperties(This, ppRegistrationProperties) \
- ( (This)->lpVtbl->GetRegistrationProperties(This, ppRegistrationProperties) )
- #define IXAPO_IsInputFormatSupported(This, pOutputFormat, pRequestedInputFormat, ppSupportedInputFormat) \
- ( (This)->lpVtbl->IsInputFormatSupported(This, pOutputFormat, pRequestedInputFormat, ppSupportedInputFormat) )
- #define IXAPO_IsOutputFormatSupported(This, pInputFormat, pRequestedOutputFormat, ppSupportedOutputFormat) \
- ( (This)->lpVtbl->IsOutputFormatSupported(This, pInputFormat, pRequestedOutputFormat, ppSupportedOutputFormat) )
- #define IXAPO_Initialize(This, pData, DataByteSize) \
- ( (This)->lpVtbl->Initialize(This, pData, DataByteSize) )
- #define IXAPO_Reset(This) \
- ( (This)->lpVtbl->Reset(This) )
- #define IXAPO_LockForProcess(This, InputLockedParameterCount, pInputLockedParameters, OutputLockedParameterCount, pOutputLockedParameters) \
- ( (This)->lpVtbl->LockForProcess(This, InputLockedParameterCount, pInputLockedParameters, OutputLockedParameterCount, pOutputLockedParameters) )
- #define IXAPO_UnlockForProcess(This) \
- ( (This)->lpVtbl->UnlockForProcess(This) )
- #define IXAPO_Process(This, InputProcessParameterCount, pInputProcessParameters, OutputProcessParameterCount, pOutputProcessParameters, IsEnabled) \
- ( (This)->lpVtbl->Process(This, InputProcessParameterCount, pInputProcessParameters, OutputProcessParameterCount, pOutputProcessParameters, IsEnabled) )
- #define IXAPO_CalcInputFrames(This, OutputFrameCount) \
- ( (This)->lpVtbl->CalcInputFrames(This, OutputFrameCount) )
- #define IXAPO_CalcOutputFrames(This, InputFrameCount) \
- ( (This)->lpVtbl->CalcOutputFrames(This, InputFrameCount) )
- // IXAPOParameters
- #define IXAPOParameters_QueryInterface(This, riid, ppInterface) \
- ( (This)->lpVtbl->QueryInterface(This, riid, ppInterface) )
- #define IXAPOParameters_AddRef(This) \
- ( (This)->lpVtbl->AddRef(This) )
- #define IXAPOParameters_Release(This) \
- ( (This)->lpVtbl->Release(This) )
- #define IXAPOParameters_SetParameters(This, pParameters, ParameterByteSize) \
- ( (This)->lpVtbl->SetParameters(This, pParameters, ParameterByteSize) )
- #define IXAPOParameters_GetParameters(This, pParameters, ParameterByteSize) \
- ( (This)->lpVtbl->GetParameters(This, pParameters, ParameterByteSize) )
- #endif // !defined(__cplusplus)
- #pragma pack(pop) // revert packing alignment
- #endif // !defined(GUID_DEFS_ONLY)
- //---------------------------------<-EOF->----------------------------------//
|