|
@@ -0,0 +1,377 @@
|
|
|
+#+build windows
|
|
|
+
|
|
|
+/* 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.
|
|
|
+ E.g. a mono stream has one sample per frame.
|
|
|
+
|
|
|
+ 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.odin for an XAPO base class which provides a default
|
|
|
+ implementation for most of the interface methods defined below. */
|
|
|
+
|
|
|
+package windows_xaudio2
|
|
|
+
|
|
|
+import win "core:sys/windows"
|
|
|
+
|
|
|
+//--------------<D-E-F-I-N-I-T-I-O-N-S>-------------------------------------//
|
|
|
+
|
|
|
+// XAPO error codes
|
|
|
+FORMAT_UNSUPPORTED := win.MAKE_HRESULT(win.SEVERITY.ERROR, 0x897, 0x01) // requested audio format unsupported
|
|
|
+
|
|
|
+// supported number of channels (samples per frame) range
|
|
|
+XAPO_MIN_CHANNELS :: 1
|
|
|
+XAPO_MAX_CHANNELS :: 64
|
|
|
+
|
|
|
+// supported framerate range
|
|
|
+XAPO_MIN_FRAMERATE :: 1000
|
|
|
+XAPO_MAX_FRAMERATE :: 200000
|
|
|
+
|
|
|
+// unicode string length, including terminator, used with XAPO_REGISTRATION_PROPERTIES
|
|
|
+XAPO_REGISTRATION_STRING_LENGTH :: 256
|
|
|
+
|
|
|
+
|
|
|
+// XAPO property flags, used with XAPO_REGISTRATION_PROPERTIES.Flags:
|
|
|
+XAPO_FLAGS :: distinct bit_set[XAPO_FLAG; u32]
|
|
|
+XAPO_FLAG :: enum u32 {
|
|
|
+ // Number of channels of input and output buffers must match, applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat.
|
|
|
+ CHANNELS_MUST_MATCH = 0,
|
|
|
+
|
|
|
+ // Framerate of input and output buffers must match, applies to XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS.pFormat.
|
|
|
+ FRAMERATE_MUST_MATCH = 1,
|
|
|
+
|
|
|
+ // 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.
|
|
|
+ BITSPERSAMPLE_MUST_MATCH = 2,
|
|
|
+
|
|
|
+ // 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.
|
|
|
+ BUFFERCOUNT_MUST_MATCH = 3,
|
|
|
+
|
|
|
+ // 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.
|
|
|
+ INPLACE_REQUIRED = 5,
|
|
|
+
|
|
|
+ // 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.
|
|
|
+ INPLACE_SUPPORTED = 4,
|
|
|
+}
|
|
|
+
|
|
|
+//--------------<D-A-T-A---T-Y-P-E-S>---------------------------------------//
|
|
|
+
|
|
|
+// XAPO registration properties, describes general XAPO characteristics, used with IXAPO.GetRegistrationProperties
|
|
|
+XAPO_REGISTRATION_PROPERTIES :: struct #packed {
|
|
|
+ clsid: win.CLSID, // COM class ID, used with CoCreate
|
|
|
+ FriendlyName: [XAPO_REGISTRATION_STRING_LENGTH]u16, // friendly name unicode string
|
|
|
+ CopyrightInfo: [XAPO_REGISTRATION_STRING_LENGTH]u16, // copyright information unicode string
|
|
|
+ MajorVersion: u32, // major version
|
|
|
+ MinorVersion: u32, // minor version
|
|
|
+ Flags: XAPO_FLAGS, // XAPO property flags, describes supported input/output configuration
|
|
|
+ MinInputBufferCount: u32, // minimum number of input buffers required for processing, can be 0
|
|
|
+ MaxInputBufferCount: u32, // maximum number of input buffers supported for processing, must be >= MinInputBufferCount
|
|
|
+ MinOutputBufferCount: u32, // minimum number of output buffers required for processing, can be 0, must match MinInputBufferCount when XAPO_FLAG_BUFFERCOUNT_MUST_MATCH used
|
|
|
+ MaxOutputBufferCount: u32, // maximum number of output buffers supported for processing, must be >= MinOutputBufferCount, must match MaxInputBufferCount when XAPO_FLAG_BUFFERCOUNT_MUST_MATCH used
|
|
|
+}
|
|
|
+
|
|
|
+// 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.
|
|
|
+XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS :: struct #packed {
|
|
|
+ pFormat: ^WAVEFORMATEX, // buffer audio format
|
|
|
+ MaxFrameCount: u32, // maximum number of frames in respective buffer that IXAPO::Process would have to handle, irrespective of dynamic variable settings, can be 0
|
|
|
+}
|
|
|
+
|
|
|
+// 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.
|
|
|
+XAPO_BUFFER_FLAGS :: enum i32 {
|
|
|
+ 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
|
|
|
+}
|
|
|
+
|
|
|
+// 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.
|
|
|
+XAPO_PROCESS_BUFFER_PARAMETERS :: struct #packed {
|
|
|
+ pBuffer: rawptr, // audio data buffer, must be non-NULL
|
|
|
+ BufferFlags: XAPO_BUFFER_FLAGS, // describes assumed content of pBuffer, does not affect ValidFrameCount
|
|
|
+ ValidFrameCount: u32, // 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
|
|
|
+}
|
|
|
+
|
|
|
+XAPOFree :: win.CoTaskMemFree
|
|
|
+
|
|
|
+IXAPO_UUID_STRING :: "A410B984-9839-4819-A0BE-2856AE6B3ADB"
|
|
|
+IXAPO_UUID := &win.IID{0xA410B984, 0x9839, 0x4819, {0xA0, 0xBE, 0x28, 0x56, 0xAE, 0x6B, 0x3A, 0xDB}}
|
|
|
+IXAPO :: struct #raw_union {
|
|
|
+ #subtype iunknown: IUnknown,
|
|
|
+ using ixapo_vtable: ^IXAPO_VTable,
|
|
|
+}
|
|
|
+IXAPO_VTable :: struct {
|
|
|
+ using iunknown_vtable: IUnknown_VTable,
|
|
|
+
|
|
|
+ // 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
|
|
|
+ GetRegistrationProperties: proc "system" (this: ^IXAPO, ppRegistrationProperties: ^^XAPO_REGISTRATION_PROPERTIES) -> HRESULT,
|
|
|
+
|
|
|
+ // 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
|
|
|
+ // 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
|
|
|
+ IsInputFormatSupported: proc "system" (this: ^IXAPO, pOutputFormat: ^WAVEFORMATEX, pRequestedInputFormat: ^WAVEFORMATEX, ppSupportedInputFormat: ^^WAVEFORMATEX) -> HRESULT,
|
|
|
+
|
|
|
+ // 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
|
|
|
+ // 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
|
|
|
+ IsOutputFormatSupported: proc "system" (this: ^IXAPO, pInputFormat: ^WAVEFORMATEX, pRequestedOutputFormat: ^WAVEFORMATEX, ppSupportedOutputFormat: ^^WAVEFORMATEX) -> HRESULT,
|
|
|
+
|
|
|
+ // 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.
|
|
|
+ // PARAMETERS:
|
|
|
+ // pData - [in] effect-specific initialization parameters, may be NULL if DataByteSize == 0
|
|
|
+ // DataByteSize - [in] size of pData in bytes, may be 0 if pData is NULL
|
|
|
+ // RETURN VALUE:
|
|
|
+ // COM error code
|
|
|
+ Initialize: proc "system" (this: ^IXAPO, pData: rawptr, DataByteSize: u32) -> HRESULT,
|
|
|
+
|
|
|
+ // 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
|
|
|
+ Reset: proc "system" (this: ^IXAPO),
|
|
|
+
|
|
|
+ // 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
|
|
|
+ LockForProcess: proc "system" (this: ^IXAPO, InputLockedParameterCount: u32, pInputLockedParameters: [^]XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS, OutputLockedParameterCount: u32, pOutputLockedParameters: [^]XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS) -> HRESULT,
|
|
|
+
|
|
|
+ // 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
|
|
|
+ UnlockForProcess: proc "system" (this: ^IXAPO),
|
|
|
+
|
|
|
+ // 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
|
|
|
+ Process: proc "system" (this: ^IXAPO, InputProcessParameterCount: u32, pInputProcessParameters: [^]XAPO_PROCESS_BUFFER_PARAMETERS, OutputProcessParameterCount: u32, pOutputProcessParameters: [^]XAPO_PROCESS_BUFFER_PARAMETERS, IsEnabled: b32),
|
|
|
+
|
|
|
+ // 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
|
|
|
+ CalcInputFrames: proc "system" (this: ^IXAPO, OutputFrameCount: u32) -> u32,
|
|
|
+
|
|
|
+ // 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
|
|
|
+ CalcOutputFrames: proc "system" (this: ^IXAPO, InputFrameCount: u32) -> u32,
|
|
|
+}
|
|
|
+
|
|
|
+// IXAPOParameters:
|
|
|
+// Optional XAPO COM interface that allows an XAPO to use effect-specific parameters.
|
|
|
+IXAPOParameters_UUID_STRING :: "26D95C66-80F2-499A-AD54-5AE7F01C6D98"
|
|
|
+IXAPOParameters_UUID := &win.IID{0x26D95C66, 0x80F2, 0x499A, {0xAD, 0x54, 0x5A, 0xE7, 0xF0, 0x1C, 0x6D, 0x98}}
|
|
|
+IXAPOParameters :: struct #raw_union {
|
|
|
+ #subtype iunknown: IUnknown,
|
|
|
+ using ixapoparameters_vtable: ^IXAPOParameters_VTable,
|
|
|
+}
|
|
|
+IXAPOParameters_VTable :: struct {
|
|
|
+ using iunknown_vtable: IUnknown_VTable,
|
|
|
+
|
|
|
+ // 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
|
|
|
+ SetParameters: proc "system" (this: ^IXAPOParameters, pParameters: rawptr, ParameterByteSize: u32),
|
|
|
+
|
|
|
+ // 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
|
|
|
+ GetParameters: proc "system" (this: ^IXAPOParameters, pParameters: rawptr, ParameterByteSize: u32),
|
|
|
+}
|