G940LEDControl/DirectX/xact.pas

1844 lines
83 KiB
ObjectPascal

{******************************************************************************}
{* *}
{* Copyright (C) Microsoft Corporation. All Rights Reserved. *}
{* *}
{* Files: xact.h, xact2wb.h, xact3D.h *}
{* Content: XACT public interfaces, functions and data types; *}
{* XACT 2 wave bank definitions; XACT 3D support. *}
{* *}
{* DirectX 9.0 Delphi / FreePascal adaptation by Alexey Barkovoy *}
{* E-Mail: directx@clootie.ru *}
{* *}
{* Latest version can be downloaded from: *}
{* http://www.clootie.ru *}
{* http://sourceforge.net/projects/delphi-dx9sdk *}
{* *}
{*----------------------------------------------------------------------------*}
{* $Id: xact.pas,v 1.14 2007/04/14 20:57:43 clootie Exp $ }
{******************************************************************************}
{ }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ The contents of this file are used with permission, subject to the Mozilla }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at }
{ http://www.mozilla.org/MPL/MPL-1.1.html }
{ }
{ Software distributed under the License is distributed on an "AS IS" basis, }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License. }
{ }
{ Alternatively, the contents of this file may be used under the terms of the }
{ GNU Lesser General Public License (the "LGPL License"), in which case the }
{ provisions of the LGPL License are applicable instead of those above. }
{ If you wish to allow use of your version of this file only under the terms }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting the provisions above and }
{ replace them with the notice and other provisions required by the LGPL }
{ License. If you do not delete the provisions above, a recipient may use }
{ your version of this file under either the MPL or the LGPL License. }
{ }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{ }
{******************************************************************************}
{$I DirectX.inc}
unit xact;
interface
(*$HPPEMIT '#include "xact.h"' *)
(*$HPPEMIT '#include "xact2wb.h"' *)
(*$HPPEMIT '#include "xact3D.h"' *)
uses
{$IFDEF XBOX}XAudio, xauddefs{$ELSE}Windows, ActiveX{$ENDIF}, X3DAudio;
type
UINT32 = Longword;
(***************************************************************************
*
* Copyright (C) Microsoft Corporation. All Rights Reserved.
*
* File: xact2wb.h
* Content: XACT 2 wave bank definitions.
*
****************************************************************************)
{$MINENUMSIZE 1}
const
WAVEBANK_HEADER_SIGNATURE = 'DNBW'; // WaveBank RIFF chunk signature
{$EXTERNALSYM WAVEBANK_HEADER_SIGNATURE}
WAVEBANK_HEADER_VERSION = 42; // Current wavebank file version
{$EXTERNALSYM WAVEBANK_HEADER_VERSION}
WAVEBANK_BANKNAME_LENGTH = 64; // Wave bank friendly name length, in characters
{$EXTERNALSYM WAVEBANK_BANKNAME_LENGTH}
WAVEBANK_ENTRYNAME_LENGTH = 64; // Wave bank entry friendly name length, in characters
{$EXTERNALSYM WAVEBANK_ENTRYNAME_LENGTH}
WAVEBANK_MAX_DATA_SEGMENT_SIZE = $FFFFFFFF; // Maximum wave bank data segment size, in bytes
{$EXTERNALSYM WAVEBANK_MAX_DATA_SEGMENT_SIZE}
WAVEBANK_MAX_COMPACT_DATA_SEGMENT_SIZE = $001FFFFF; // Maximum compact wave bank data segment size, in bytes
{$EXTERNALSYM WAVEBANK_MAX_COMPACT_DATA_SEGMENT_SIZE}
type
WAVEBANKOFFSET = DWORD;
{$EXTERNALSYM WAVEBANKOFFSET}
TWavebankOffset = WAVEBANKOFFSET;
const
//
// Bank flags
//
WAVEBANK_TYPE_BUFFER = $00000000; // In-memory buffer
{$EXTERNALSYM WAVEBANK_TYPE_BUFFER}
WAVEBANK_TYPE_STREAMING = $00000001; // Streaming
{$EXTERNALSYM WAVEBANK_TYPE_STREAMING}
WAVEBANK_TYPE_MASK = $00000001;
{$EXTERNALSYM WAVEBANK_TYPE_MASK}
WAVEBANK_FLAGS_ENTRYNAMES = $00010000; // Bank includes entry names
{$EXTERNALSYM WAVEBANK_FLAGS_ENTRYNAMES}
WAVEBANK_FLAGS_COMPACT = $00020000; // Bank uses compact format
{$EXTERNALSYM WAVEBANK_FLAGS_COMPACT}
WAVEBANK_FLAGS_SYNC_DISABLED = $00040000; // Bank is disabled for audition sync
{$EXTERNALSYM WAVEBANK_FLAGS_SYNC_DISABLED}
WAVEBANK_FLAGS_SEEKTABLES = $00080000; // Bank includes seek tables.
{$EXTERNALSYM WAVEBANK_FLAGS_SEEKTABLES}
WAVEBANK_FLAGS_MASK = $000F0000;
{$EXTERNALSYM WAVEBANK_FLAGS_MASK}
//
// Entry flags
//
WAVEBANKENTRY_FLAGS_READAHEAD = $00000001; // Enable stream read-ahead
{$EXTERNALSYM WAVEBANKENTRY_FLAGS_READAHEAD}
WAVEBANKENTRY_FLAGS_LOOPCACHE = $00000002; // One or more looping sounds use this wave
{$EXTERNALSYM WAVEBANKENTRY_FLAGS_LOOPCACHE}
WAVEBANKENTRY_FLAGS_REMOVELOOPTAIL = $00000004; // Remove data after the end of the loop region
{$EXTERNALSYM WAVEBANKENTRY_FLAGS_REMOVELOOPTAIL}
WAVEBANKENTRY_FLAGS_IGNORELOOP = $00000008; // Used internally when the loop region can't be used
{$EXTERNALSYM WAVEBANKENTRY_FLAGS_IGNORELOOP}
WAVEBANKENTRY_FLAGS_MASK = $00000008;
{$EXTERNALSYM WAVEBANKENTRY_FLAGS_MASK}
//
// Entry wave format identifiers
//
WAVEBANKMINIFORMAT_TAG_PCM = $0; // PCM data
{$EXTERNALSYM WAVEBANKMINIFORMAT_TAG_PCM}
WAVEBANKMINIFORMAT_TAG_XMA = $1; // XMA data
{$EXTERNALSYM WAVEBANKMINIFORMAT_TAG_XMA}
WAVEBANKMINIFORMAT_TAG_ADPCM = $2; // ADPCM data
{$EXTERNALSYM WAVEBANKMINIFORMAT_TAG_ADPCM}
WAVEBANKMINIFORMAT_BITDEPTH_8 = $0; // 8-bit data (PCM only)
{$EXTERNALSYM WAVEBANKMINIFORMAT_BITDEPTH_8}
WAVEBANKMINIFORMAT_BITDEPTH_16 = $1; // 16-bit data (PCM only)
{$EXTERNALSYM WAVEBANKMINIFORMAT_BITDEPTH_16}
//
// Arbitrary fixed sizes
//
WAVEBANKENTRY_XMASTREAMS_MAX = 3; // enough for 5.1 channel audio
{$EXTERNALSYM WAVEBANKENTRY_XMASTREAMS_MAX}
WAVEBANKENTRY_XMACHANNELS_MAX = 6; // enough for 5.1 channel audio (cf. XAUDIOCHANNEL_SOURCEMAX)
{$EXTERNALSYM WAVEBANKENTRY_XMACHANNELS_MAX}
//
// DVD data sizes
//
WAVEBANK_DVD_SECTOR_SIZE = 2048;
{$EXTERNALSYM WAVEBANK_DVD_SECTOR_SIZE}
WAVEBANK_DVD_BLOCK_SIZE = (WAVEBANK_DVD_SECTOR_SIZE * 16);
{$EXTERNALSYM WAVEBANK_DVD_BLOCK_SIZE}
//
// Bank alignment presets
//
WAVEBANK_ALIGNMENT_MIN = 4; // Minimum alignment
{$EXTERNALSYM WAVEBANK_ALIGNMENT_MIN}
WAVEBANK_ALIGNMENT_DVD = WAVEBANK_DVD_SECTOR_SIZE; // DVD-optimized alignment
{$EXTERNALSYM WAVEBANK_ALIGNMENT_DVD}
type
//
// Wave bank segment identifiers
//
//todo: What is size of this ENUM ???
PWavebankSegIDX = ^TWavebankSegIDX;
WAVEBANKSEGIDX =
(
WAVEBANK_SEGIDX_BANKDATA{= 0}, // Bank data
WAVEBANK_SEGIDX_ENTRYMETADATA, // Entry meta-data
WAVEBANK_SEGIDX_SEEKTABLES, // Storage for seek tables for the encoded waves.
WAVEBANK_SEGIDX_ENTRYNAMES, // Entry friendly names
WAVEBANK_SEGIDX_ENTRYWAVEDATA // Entry wave data
// WAVEBANK_SEGIDX_COUNT
);
{$EXTERNALSYM WAVEBANKSEGIDX}
TWavebankSegIDX = WAVEBANKSEGIDX;
const
WAVEBANK_SEGIDX_COUNT = Ord(High(TWavebankSegIDX))+1;
{$EXTERNALSYM WAVEBANK_SEGIDX_COUNT}
//
// Endianness
//
procedure SwapBytes(_dw_: PDWORD); overload;
{$EXTERNALSYM SwapBytes}
procedure SwapBytes(w: PWORD); overload;
{$EXTERNALSYM SwapBytes}
//
// Wave bank region in bytes.
//
type
PWavebankRegion = ^TWavebankRegion;
WAVEBANKREGION = record
dwOffset: DWORD; // Region offset, in bytes.
dwLength: DWORD; // Region length, in bytes.
end;
{$EXTERNALSYM WAVEBANKREGION}
TWavebankRegion = WAVEBANKREGION;
//procedure TWavebankRegion_SwapBytes(var wbr: TWavebankRegion);
//
// Wave bank region in samples.
//
PWavebankSampleRegion = ^TWavebankSampleRegion;
WAVEBANKSAMPLEREGION = record
dwStartSample: DWORD; // Start sample for the region.
dwTotalSamples: DWORD; // Region length in samples.
(*
void SwapBytes(void)
{
XACTWaveBank::SwapBytes(dwStartSample);
XACTWaveBank::SwapBytes(dwTotalSamples);
} *)
end;
{$EXTERNALSYM WAVEBANKSAMPLEREGION}
TWavebankSampleRegion = WAVEBANKSAMPLEREGION;
//
// Wave bank file header
//
type
PWavebankHeader = ^TWavebankHeader;
WAVEBANKHEADER = record
dwSignature: DWORD; // File signature
dwVersion: DWORD; // Version of the tool that created the file
dwHeaderVersion: DWORD; // Version of the file format
Segments: array[0..WAVEBANK_SEGIDX_COUNT-1] of TWavebankRegion; // Segment lookup table
end;
{$EXTERNALSYM WAVEBANKHEADER}
TWavebankHeader = WAVEBANKHEADER;
//procedure TWavebankHeader_SwapBytes(var wbh: TWavebankHeader);
//
// Entry compressed data format
//
type
PWavebankMiniWaveFormat = ^TWavebankMiniWaveFormat;
WAVEBANKMINIWAVEFORMAT = record
//struct
{
DWORD wFormatTag : 2; // Format tag
DWORD nChannels : 3; // Channel count (1 - 6)
DWORD nSamplesPerSec : 18; // Sampling rate
DWORD wBlockAlign : 8; // Block alignment
DWORD wBitsPerSample : 1; // Bits per sample (8 vs. 16, PCM only)
}
dwValue: DWORD;
end;
{$EXTERNALSYM WAVEBANKMINIWAVEFORMAT}
TWavebankMiniWaveFormat = WAVEBANKMINIWAVEFORMAT;
//procedure TWavebankMiniWaveFormat_SwapBytes(var wbmwf: TWavebankMiniWaveFormat);
//function TWavebankMiniWaveFormat_BitsPerSample(): Word;
//function TWavebankMiniWaveFormat_BlockAlign(): DWPRD;
//
// Entry meta-data
//
PWavebankEntry = ^TWavebankEntry;
WAVEBANKENTRY = record
//union
//struct
{
// Entry flags
DWORD dwFlags : 4;
// Duration of the wave, in units of one sample.
// For instance, a ten second long wave sampled
// at 48KHz would have a duration of 480,000.
// This value is not affected by the number of
// channels, the number of bits per sample, or the
// compression format of the wave.
DWORD Duration : 28;
}
dwFlagsAndDuration: DWORD;
//};
Format: TWavebankMiniWaveFormat; // Entry format
PlayRegion: TWavebankRegion; // Region within the wave data segment that contains this entry
LoopRegion: TWavebankSampleRegion;// Region within the wave data (in samples) that should loop.
end;
{$EXTERNALSYM WAVEBANKENTRY}
TWavebankEntry = WAVEBANKENTRY;
//
// Compact entry meta-data
//
PWavebankEntryCompact = ^TWavebankEntryCompact;
WAVEBANKENTRYCOMPACT = record
{DWORD dwOffset : 21; // Data offset, in sectors
DWORD dwLengthDeviation : 11; // Data length deviation, in bytes}
dwValue: DWORD;
end;
{$EXTERNALSYM WAVEBANKENTRYCOMPACT}
TWavebankEntryCompact = WAVEBANKENTRYCOMPACT;
//
// Bank data segment
//
PWavebankData = ^TWavebankData;
WAVEBANKDATA = record
dwFlags: DWORD; // Bank flags
dwEntryCount: DWORD; // Number of entries in the bank
szBankName: array [0..WAVEBANK_BANKNAME_LENGTH-1] of Char; // Bank friendly name
dwEntryMetaDataElementSize: DWORD; // Size of each entry meta-data element, in bytes
dwEntryNameElementSize: DWORD; // Size of each entry name element, in bytes
dwAlignment: DWORD; // Entry alignment, in bytes
CompactFormat: TWavebankMiniWaveFormat; // Format data for compact bank
BuildTime: FILETIME; // Build timestamp
end;
{$EXTERNALSYM WAVEBANKDATA}
TWavebankData = WAVEBANKDATA;
{$MINENUMSIZE 4}
(***************************************************************************
*
* Copyright (C) Microsoft Corporation. All Rights Reserved.
*
* File: xact.h
* Content: XACT public interfaces, functions and data types
*
****************************************************************************)
{$IFDEF XBOX}
type
//XBox compatibility types - not needed in real XBox SDK
PXAudioVoiceOutput = Pointer;
PXAudioVoiceOutputVolume = Pointer;
PXACTCueProperties = Pointer;
{$ENDIF}
//------------------------------------------------------------------------------
// XACT class and interface IDs (Version 2.7)
//------------------------------------------------------------------------------
{$IFNDEF XBOX} // XACT COM support only exists on Windows
const
CLSID_XACTEngine: TGUID = '{cd0d66ec-8057-43f5-acbd-66dfb36fd78c}';
CLSID_XACTAuditionEngine: TGUID = '{9b94bf7a-ce0f-4c68-8b5e-d062cb3730c3}';
CLSID_XACTDebugEngine: TGUID = '{1bd54a4b-a1dc-4e4c-92a2-73ed33552148}';
// will be defined later -> IID_IXACTEngine: TGUID = '{c2f0af68-1f6d-40ed-964f-26256842edc4}';
{$EXTERNALSYM CLSID_XACTEngine}
{$EXTERNALSYM CLSID_XACTAuditionEngine}
{$EXTERNALSYM CLSID_XACTDebugEngine}
{$ENDIF}
//------------------------------------------------------------------------------
// Forward Declarations
//------------------------------------------------------------------------------
{$IFNDEF XBOX}
const
XACT_RENDERER_ID_LENGTH = $ff; // Maximum number of characters allowed in the renderer ID
{$EXTERNALSYM XACT_RENDERER_ID_LENGTH}
XACT_RENDERER_NAME_LENGTH = $ff; // Maximum number of characters allowed in the renderer display name.
{$EXTERNALSYM XACT_RENDERER_NAME_LENGTH}
// -----------------------------------------------------------------------------
// Engine Look-Ahead Time
// -----------------------------------------------------------------------------
XACT_ENGINE_LOOKAHEAD_DEFAULT = 250; // Default look-ahead time of 250ms can be used during XACT engine initialization.
{$EXTERNALSYM XACT_ENGINE_LOOKAHEAD_DEFAULT}
{$ENDIF}
// -----------------------------------------------------------------------------
// Cue friendly name length
// -----------------------------------------------------------------------------
XACT_CUE_NAME_LENGTH = $FF;
{$EXTERNALSYM XACT_CUE_NAME_LENGTH}
type
IXACTSoundBank = class;
IXACTWaveBank = class;
IXACTWave = class;
IXACTCue = class;
PXACT_Notification = ^TXACT_Notification;
PIXACTCue = ^IXACTCue;
//------------------------------------------------------------------------------
// Typedefs
//------------------------------------------------------------------------------
TXACTIndex = Word; // All normal indices
TXACTNotificationType = Byte; // Notification type
TXACTVariableValue = Single; // Variable value
TXACTVariableIndex = Word; // Variable index
TXACTCategory = Word; // Sound category
TXACTChannel = Byte; // Audio channel
TXACTVolume = Single; // Volume value
TXACTTime = Longint; // Time (in ms)
TXACTPitch = Smallint; // Pitch value
TXACTLoopCount = Byte; // For all loops / recurrences
TXACTVariationWeight = Byte; // Variation weight
TXACTPriority = Byte; // Sound priority
TXACTInstanceLimit = Byte; // Instance limitations
PXACTIndex = ^TXACTIndex;
PXACTNotificationType = ^TXACTNotificationType;
PXACTVariableValue = ^TXACTVariableValue;
PXACTVariableIndex = ^TXACTVariableIndex;
PXACTCategory = ^TXACTCategory;
PXACTChannel = ^TXACTChannel;
PXACTVolume = ^TXACTVolume;
PXACTTime = ^TXACTTime;
PXACTPitch = ^TXACTPitch;
PXACTLoopCount = ^TXACTLoopCount;
PXACTVariationWeight = ^TXACTVariationWeight;
PXACTPriority = ^TXACTPriority;
PXACTInstanceLimit = ^TXACTInstanceLimit;
XACTINDEX = TXACTIndex;
XACTNOTIFICATIONTYPE = TXACTNotificationType;
XACTVARIABLEVALUE = TXACTVariableValue;
XACTVARIABLEINDEX = TXACTVariableIndex;
XACTCATEGORY = TXACTCategory;
XACTCHANNEL = TXACTChannel;
XACTVOLUME = TXACTVolume;
XACTTIME = TXACTTime;
XACTPITCH = TXACTPitch;
XACTLOOPCOUNT = TXACTLoopCount;
XACTVARIATIONWEIGHT = TXACTVariationWeight;
XACTPRIORITY = TXACTPriority;
XACTINSTANCELIMIT = TXACTInstanceLimit;
{$NODEFINE XACTINDEX}
{$NODEFINE XACTNOTIFICATIONTYPE}
{$NODEFINE XACTVARIABLEVALUE}
{$NODEFINE XACTVARIABLEINDEX}
{$NODEFINE XACTCATEGORY}
{$NODEFINE XACTCHANNEL}
{$NODEFINE XACTVOLUME}
{$NODEFINE XACTTIME}
{$NODEFINE XACTPITCH}
{$NODEFINE XACTLOOPCOUNT}
{$NODEFINE XACTVARIATIONWEIGHT}
{$NODEFINE XACTPRIORITY}
{$NODEFINE XACTINSTANCELIMIT}
{$NODEFINE TXACTINDEX}
{$NODEFINE TXACTNOTIFICATIONTYPE}
{$NODEFINE TXACTVARIABLEVALUE}
{$NODEFINE TXACTVARIABLEINDEX}
{$NODEFINE TXACTCATEGORY}
{$NODEFINE TXACTCHANNEL}
{$NODEFINE TXACTVOLUME}
{$NODEFINE TXACTTIME}
{$NODEFINE TXACTPITCH}
{$NODEFINE TXACTLOOPCOUNT}
{$NODEFINE TXACTVARIATIONWEIGHT}
{$NODEFINE TXACTPRIORITY}
{$NODEFINE TXACTINSTANCELIMIT}
{$HPPEMIT 'typedef XACTINDEX TXACTIndex'}
{$HPPEMIT 'typedef XACTNOTIFICATIONTYPE TXACTNotificationType'}
{$HPPEMIT 'typedef XACTVARIABLEVALUE TXACTVariableValue'}
{$HPPEMIT 'typedef XACTVARIABLEINDEX TXACTVariableIndex'}
{$HPPEMIT 'typedef XACTCATEGORY TXACTCategory'}
{$HPPEMIT 'typedef XACTCHANNEL TXACTChanel'}
{$HPPEMIT 'typedef XACTVOLUME TXACTVolume'}
{$HPPEMIT 'typedef XACTTIME TXACTTime'}
{$HPPEMIT 'typedef XACTPITCH TXACTPitch'}
{$HPPEMIT 'typedef XACTLOOPCOUNT TXACTLoopCount'}
{$HPPEMIT 'typedef XACTVARIATIONWEIGHT TXACTVariationWeight'}
{$HPPEMIT 'typedef XACTPRIORITY TXACTPriority'}
{$HPPEMIT 'typedef XACTINSTANCELIMIT TXACTInstanceLimit'}
//------------------------------------------------------------------------------
// Standard win32 multimedia definitions
//------------------------------------------------------------------------------
PWaveFormatEx = ^TWaveFormatEx;
{$EXTERNALSYM tWAVEFORMATEX}
tWAVEFORMATEX = packed record
wFormatTag: Word; { format type }
nChannels: Word; { number of channels (i.e. mono, stereo, etc.) }
nSamplesPerSec: DWORD; { sample rate }
nAvgBytesPerSec: DWORD; { for buffer estimation }
nBlockAlign: Word; { block size of data }
wBitsPerSample: Word; { number of bits per sample of mono data }
cbSize: Word; { the count in bytes of the size of }
end;
//
// The WAVEFORMATEXTENSIBLE structure defines the format of waveform-audio data for formats having more than two channels.
// This structure is part of the Platform SDK and is not declared in Dsound.h. It is included here for convenience.
//
TWaveFormatExtensibleSamples = record
case byte of
0: (wValidBitsPerSample : Word); // bits of precision
1: (wSamplesPerBlock : Word); // valid if wBitsPerSample = 0
2: (wReserved : Word); // If neither applies, set to zero.
end;
{$EXTERNALSYM TWaveFormatExtensibleSamples}
//Clootie: TWaveFormatExtensible definition is borrowed from DirectShow.pas
PWaveFormatExtensible = ^TWaveFormatExtensible;
WAVEFORMATEXTENSIBLE = record
Format: TWaveFormatEx;
Samples: TWaveFormatExtensibleSamples;
dwChannelMask : DWORD; // which channels are present in stream
SubFormat : TGUID;
end;
{$EXTERNALSYM WAVEFORMATEXTENSIBLE}
TWaveFormatExtensible = WAVEFORMATEXTENSIBLE;
// -----------------------------------------------------------------------------
// File IO Callbacks
// -----------------------------------------------------------------------------
{$NODEFINE TXACT_ReadFile_Callback}
TXACT_ReadFile_Callback = function (hFile: THandle; lpBuffer: Pointer; nNumberOfBytesToRead: DWORD;
lpNumberOfBytesRead: PDWORD; lpOverlapped: POverlapped): BOOL; stdcall;
{$NODEFINE TXACT_GetOverlappedResult_Callback}
TXACT_GetOverlappedResult_Callback = function (hFile: THandle; lpOverlapped: POverlapped;
lpNumberOfBytesTransferred: PDWORD; bWait: BOOL): BOOL; stdcall;
PXACT_FileIO_Callbacks = ^TXACT_FileIO_Callbacks;
XACT_FILEIO_CALLBACKS = record
readFileCallback: TXACT_ReadFile_Callback;
getOverlappedResultCallback: TXACT_GetOverlappedResult_Callback;
end;
{$EXTERNALSYM XACT_FILEIO_CALLBACKS}
TXACT_FileIO_Callbacks = XACT_FILEIO_CALLBACKS;
// -----------------------------------------------------------------------------
// Notification Callback
// -----------------------------------------------------------------------------
TXACT_Notification_Callback = procedure (const pNotification: PXACT_Notification); stdcall;
{$EXTERNALSYM TXACT_Notification_Callback}
{$IFNDEF XBOX}
// -----------------------------------------------------------------------------
// Renderer Details
// -----------------------------------------------------------------------------
PXACT_Renderer_Details = ^TXACT_Renderer_Details;
XACT_RENDERER_DETAILS = record
rendererID: array[0..XACT_RENDERER_ID_LENGTH-1] of WideChar; // The string ID for the rendering device.
displayName: array[0..XACT_RENDERER_NAME_LENGTH-1] of WideChar; // A friendly name suitable for display to a human.
defaultDevice: BOOL; // Set to TRUE if this device is the primary audio device on the system.
end;
{$EXTERNALSYM XACT_RENDERER_DETAILS}
TXACT_Renderer_Details = XACT_RENDERER_DETAILS;
TXACTRendererDetails = XACT_RENDERER_DETAILS;
PXACTRendererDetails = PXACT_Renderer_Details;
{$ENDIF}
// -----------------------------------------------------------------------------
// Runtime (engine) parameters
// -----------------------------------------------------------------------------
PXACT_Runtime_Parameters = ^TXACT_Runtime_Parameters;
XACT_RUNTIME_PARAMETERS = record
lookAheadTime: DWORD; // Time in ms
pGlobalSettingsBuffer: Pointer; // Buffer containing the global settings file
globalSettingsBufferSize: DWORD; // Size of global settings buffer
globalSettingsFlags: DWORD; // Flags for global settings
globalSettingsAllocAttributes: DWORD; // Global settings buffer allocation attributes (see XMemAlloc)
fileIOCallbacks: TXACT_FileIO_Callbacks; // File I/O callbacks
fnNotificationCallback: TXACT_Notification_Callback; // Callback that receives notifications.
{$IFNDEF XBOX}
pRendererID: PWideChar; // Ptr to the ID for the audio renderer the engine should connect to.
{$ENDIF}
end;
{$EXTERNALSYM XACT_RUNTIME_PARAMETERS}
TXACT_Runtime_Parameters = XACT_RUNTIME_PARAMETERS;
//------------------------------------------------------------------------------
// Streaming Parameters
//------------------------------------------------------------------------------
PXACT_Streaming_Parameters = ^TXACT_Streaming_Parameters;
PXACT_Wavebank_Streaming_Parameters = ^TXACT_Wavebank_Streaming_Parameters;
XACT_STREAMING_PARAMETERS = record
file_: THandle; // File handle associated with wavebank data
offset: DWORD; // Offset within file of wavebank header (must be sector aligned)
flags: DWORD; // Flags (none currently)
packetSize: Word; // Stream packet size (in sectors) to use for each stream (min = 2)
// number of sectors (DVD = 2048 bytes: 2 = 4096, 3 = 6144, 4 = 8192 etc.)
// optimal DVD size is a multiple of 16 (DVD block = 16 DVD sectors)
end;
{$EXTERNALSYM XACT_STREAMING_PARAMETERS}
XACT_WAVEBANK_STREAMING_PARAMETERS = XACT_STREAMING_PARAMETERS;
{$EXTERNALSYM XACT_WAVEBANK_STREAMING_PARAMETERS}
TXACT_Streaming_Parameters = XACT_STREAMING_PARAMETERS;
TXACT_Wavebank_Streaming_Parameters = XACT_STREAMING_PARAMETERS;
// Structure used to report cue properties back to the client.
PXACT_Cue_Properties = ^TXACT_Cue_Properties;
XACT_CUE_PROPERTIES = record
friendlyName: array [0..XACT_CUE_NAME_LENGTH-1] of Char; // Empty if the soundbank doesn't contain any friendly names
interactive: BOOL; // TRUE if an IA cue; FALSE otherwise
iaVariableIndex: TXACTIndex; // Only valid for IA cues; XACTINDEX_INVALID otherwise
numVariations: TXACTIndex; // Number of variations in the cue
maxInstances: TXACTInstanceLimit; // Number of maximum instances for this cue
currentInstances: TXACTInstanceLimit; // Current active instances of this cue
end;
{$EXTERNALSYM XACT_CUE_PROPERTIES}
TXACT_Cue_Properties = XACT_CUE_PROPERTIES;
// Strucutre used to return the track properties.
PXACT_Track_Properties = ^TXACT_Track_Properties;
XACT_TRACK_PROPERTIES = record
duration: TXACTTime; // Duration of the track in ms
numVariations: TXACTIndex; // Number of wave variations in the track
numChannels: TXACTChannel; // Number of channels for the active wave variation on this track
waveVariation: TXACTIndex; // Index of the active wave variation
loopCount: TXACTLoopCount; // Current loop count on this track
end;
{$EXTERNALSYM XACT_TRACK_PROPERTIES}
TXACT_Track_Properties = XACT_TRACK_PROPERTIES;
// Structure used to return the properties of a variation.
PXACT_Variation_Properties = ^TXACT_Variation_Properties;
XACT_VARIATION_PROPERTIES = record
index: TXACTIndex; // Index of the variation in the cue's variation list
weight: TXACTVariationWeight; // Weight for the active variation. Valid only for complex cues
iaVariableMin: TXACTVariableValue; // Valid only for IA cues
iaVariableMax: TXACTVariableValue; // Valid only for IA cues
linger: BOOL; // Valid only for IA cues
end;
{$EXTERNALSYM XACT_VARIATION_PROPERTIES}
TXACT_Variation_Properties = XACT_VARIATION_PROPERTIES;
// Structure used to return the properties of the sound referenced by a variation.
PXACT_Sound_Properties = ^TXACT_Sound_Properties;
XACT_SOUND_PROPERTIES = record
category: TXACTCategory; // Category this sound belongs to
priority: Byte; // Priority of this variation
pitch: TXACTPitch; // Current pitch set on the active variation
volume: TXACTVolume; // Current volume set on the active variation
numTracks: TXACTIndex; // Number of tracks in the active variation
arrTrackProperties: array [0..0] of TXACT_Track_Properties; // Array of active track properties (has numTracks number of elements)
end;
{$EXTERNALSYM XACT_SOUND_PROPERTIES}
TXACT_Sound_Properties = XACT_SOUND_PROPERTIES;
// Structure used to return the properties of the active variation and the sound referenced.
PXACT_Sound_Variation_Properties = ^TXACT_Sound_Variation_Properties;
XACT_SOUND_VARIATION_PROPERTIES = record
variationProperties: TXACT_Variation_Properties; // Properties for this variation
soundProperties: TXACT_Sound_Properties; // Proeprties for the sound referenced by this variation
end;
{$EXTERNALSYM XACT_SOUND_VARIATION_PROPERTIES}
TXACT_Sound_Variation_Properties = XACT_SOUND_VARIATION_PROPERTIES;
// Structure used to return the properties of an active cue instance.
PXACT_Cue_Instance_Properties = ^TXACT_Cue_Instance_Properties;
XACT_CUE_INSTANCE_PROPERTIES = record
allocAttributes: DWORD; // Buffer allocation attributes (see XMemAlloc)
cueProperties: TXACT_Cue_Properties; // Properties of the cue that are shared by all instances.
activeVariationProperties: TXACT_Sound_Variation_Properties; // Properties if the currently active variation.
end;
{$EXTERNALSYM XACT_CUE_INSTANCE_PROPERTIES}
TXACT_Cue_Instance_Properties = XACT_CUE_INSTANCE_PROPERTIES;
// Structure used to return the common wave properties.
PXACT_Wave_Properties = ^TXACT_Wave_Properties;
XACT_WAVE_PROPERTIES = record
friendlyName: array[0..WAVEBANK_ENTRYNAME_LENGTH-1] of Char; // Friendly name for the wave; empty if the wavebank doesn't contain friendly names.
format: TWavebankMiniWaveFormat; // Format for the wave.
durationInSamples: DWORD; // Duration of the wave in units of one sample
loopRegion: TWavebankSampleRegion; // Loop region defined in samples.
streaming: BOOL; // Set to TRUE if the wave is streaming; FALSE otherwise.
end;
{$EXTERNALSYM XACT_WAVE_PROPERTIES}
TXACT_Wave_Properties = XACT_WAVE_PROPERTIES;
// Structure used to return the properties specific to a wave instance.
PXACT_Wave_Instance_Properties = ^TXACT_Wave_Instance_Properties;
XACT_WAVE_INSTANCE_PROPERTIES = record
properties: TXACT_Wave_Properties; // Static properties common to all the wave instances.
backgroundMusic: BOOL; // Set to TRUE if the wave is tagged as background music; FALSE otherwise.
end;
{$EXTERNALSYM XACT_WAVE_INSTANCE_PROPERTIES}
TXACT_Wave_Instance_Properties = XACT_WAVE_INSTANCE_PROPERTIES;
//------------------------------------------------------------------------------
// Channel Mapping / Speaker Panning
//------------------------------------------------------------------------------
PXACTChannelMapEntry = ^TXACTChannelMapEntry;
XACTCHANNELMAPENTRY = record
InputChannel: TXACTChannel;
OutputChannel: TXACTChannel;
Volume: TXACTVolume;
end;
{$EXTERNALSYM XACTCHANNELMAPENTRY}
TXACTChannelMapEntry = XACTCHANNELMAPENTRY;
PXACTChannelMap = ^TXACTChannelMap;
XACTCHANNELMAP = record
EntryCount: TXACTChannel;
paEntries: PXACTChannelMapEntry;
end;
{$EXTERNALSYM XACTCHANNELMAP}
TXACTChannelMap = XACTCHANNELMAP;
PXACTChannelVolumeEntry = ^TXACTChannelVolumeEntry;
XACTCHANNELVOLUMEENTRY = record
EntryIndex: TXACTChannel;
Volume: TXACTVolume;
end;
{$EXTERNALSYM XACTCHANNELVOLUMEENTRY}
TXACTChannelVolumeEntry = XACTCHANNELVOLUMEENTRY;
PXACTChannelVolume = ^TXACTChannelVolume;
XACTCHANNELVOLUME = record
EntryCount: TXACTChannel;
paEntries: PXACTChannelVolumeEntry;
end;
{$EXTERNALSYM XACTCHANNELVOLUME}
TXACTChannelVolume = XACTCHANNELVOLUME;
//------------------------------------------------------------------------------
// Notifications
//------------------------------------------------------------------------------
// Pack the notification structures
// Original C++ header: #pragma pack(push, 1)
// Notification description used for registering, un-registering and flushing notifications
PXACT_Notification_Description = ^TXACT_Notification_Description;
XACT_NOTIFICATION_DESCRIPTION = packed record
type_: TXACTNotificationType; // Notification type
flags: Byte; // Flags
pSoundBank: IXACTSoundBank; // SoundBank instance
pWaveBank: IXACTWaveBank; // WaveBank instance
pCue: IXACTCue; // Cue instance
pWave: IXACTWave; // Wave instance
cueIndex: TXACTIndex; // Cue index
waveIndex: TXACTIndex; // Wave index
pvContext: Pointer; // User context (optional)
end;
{$EXTERNALSYM XACT_NOTIFICATION_DESCRIPTION}
TXACT_Notification_Description = XACT_NOTIFICATION_DESCRIPTION;
// Notification structure for all XACTNOTIFICATIONTYPE_CUE* notifications
PXACT_Notification_Cue = ^TXACT_Notification_Cue;
XACT_NOTIFICATION_CUE = packed record
cueIndex: TXACTIndex; // Cue index
pSoundBank: IXACTSoundBank; // SoundBank instance
pCue: IXACTCue; // Cue instance
end;
{$EXTERNALSYM XACT_NOTIFICATION_CUE}
TXACT_Notification_Cue = XACT_NOTIFICATION_CUE;
// Notification structure for all XACTNOTIFICATIONTYPE_MARKER* notifications
PXACT_Notification_Marker = ^TXACT_Notification_Marker;
XACT_NOTIFICATION_MARKER = packed record
cueIndex: TXACTIndex; // Cue index
pSoundBank: IXACTSoundBank; // SoundBank instance
pCue: IXACTCue; // Cue instance
marker: DWORD; // Marker value
end;
{$EXTERNALSYM XACT_NOTIFICATION_MARKER}
TXACT_Notification_Marker = XACT_NOTIFICATION_MARKER;
// Notification structure for all XACTNOTIFICATIONTYPE_SOUNDBANK* notifications
PXACT_Notification_SoundBank = ^TXACT_Notification_SoundBank;
XACT_NOTIFICATION_SOUNDBANK = packed record
pSoundBank: IXACTSoundBank; // SoundBank instance
end;
{$EXTERNALSYM XACT_NOTIFICATION_SOUNDBANK}
TXACT_Notification_SoundBank = XACT_NOTIFICATION_SOUNDBANK;
// Notification structure for all XACTNOTIFICATIONTYPE_WAVEBANK* notifications
PXACT_Notification_WaveBank = ^TXACT_Notification_WaveBank;
XACT_NOTIFICATION_WAVEBANK = packed record
pWaveBank: IXACTWaveBank; // WaveBank instance
end;
{$EXTERNALSYM XACT_NOTIFICATION_WAVEBANK}
TXACT_Notification_WaveBank = XACT_NOTIFICATION_WAVEBANK;
// Notification structure for all XACTNOTIFICATIONTYPE_*VARIABLE* notifications
PXACT_Notification_Variable = ^TXACT_Notification_Variable;
XACT_NOTIFICATION_VARIABLE = packed record
cueIndex: TXACTIndex; // Cue index
pSoundBank: IXACTSoundBank; // SoundBank instance
pCue: IXACTCue; // Cue instance
variableIndex: TXACTVariableIndex; // Variable index
variableValue: TXACTVariableValue; // Variable value
local: BOOL; // TRUE if a local variable
end;
{$EXTERNALSYM XACT_NOTIFICATION_VARIABLE}
TXACT_Notification_Variable = XACT_NOTIFICATION_VARIABLE;
// Notification structure for all XACTNOTIFICATIONTYPE_GUI* notifications
PXACT_Notification_GUI = ^TXACT_Notification_GUI;
XACT_NOTIFICATION_GUI = packed record
reserved: DWORD; // Reserved
end;
{$EXTERNALSYM XACT_NOTIFICATION_GUI}
TXACT_Notification_GUI = XACT_NOTIFICATION_GUI;
// Notification structure for all XACTNOTIFICATIONTYPE_WAVE* notifications
PXACT_Notification_Wave = ^TXACT_Notification_Wave;
XACT_NOTIFICATION_WAVE = packed record
pWaveBank: IXACTWaveBank; // WaveBank
waveIndex: TXACTIndex; // Wave index
cueIndex: TXACTIndex; // Cue index
pSoundBank: IXACTSoundBank; // SoundBank instance
pCue: IXACTCue; // Cue instance
pWave: IXACTWave; // Wave instance
end;
{$EXTERNALSYM XACT_NOTIFICATION_WAVE}
TXACT_Notification_Wave = XACT_NOTIFICATION_WAVE;
// General notification structure
XACT_NOTIFICATION = packed record
type_: TXACTNotificationType; // Notification type
timeStamp: Longint; // Timestamp of notification (milliseconds)
pvContext: Pointer; // User context (optional)
case Byte of
1: (cue: TXACT_Notification_Cue); // XACTNOTIFICATIONTYPE_CUE*
2: (marker: TXACT_Notification_Marker); // XACTNOTIFICATIONTYPE_MARKER*
3: (soundBank: TXACT_Notification_SoundBank); // XACTNOTIFICATIONTYPE_SOUNDBANK*
4: (waveBank: TXACT_Notification_WaveBank); // XACTNOTIFICATIONTYPE_WAVEBANK*
5: (variable: TXACT_Notification_Variable); // XACTNOTIFICATIONTYPE_VARIABLE*
6: (gui: TXACT_Notification_GUI); // XACTNOTIFICATIONTYPE_GUI*
7: (wave: TXACT_Notification_Wave); // XACTNOTIFICATIONTYPE_WAVE*
end;
{$EXTERNALSYM XACT_NOTIFICATION}
TXACT_Notification = XACT_NOTIFICATION;
//Original C++ header: #pragma pack(pop)
//------------------------------------------------------------------------------
// IXACTSoundBank
//------------------------------------------------------------------------------
{$EXTERNALSYM IXACTSoundBank}
IXACTSoundBank = class
function GetCueIndex(szFriendlyName: PAnsiChar): TXACTIndex; virtual; stdcall; abstract;
function GetNumCues(pnNumCues: PXACTIndex): HResult; virtual; stdcall; abstract;
function GetCueProperties(nCueIndex: TXACTIndex; pProperties: PXACT_Cue_Properties): HResult; virtual; stdcall; abstract;
function Prepare(nCueIndex: TXACTIndex; dwFlags: DWORD; timeOffset: TXACTTime; out ppCue: IXACTCue): HResult; virtual; stdcall; abstract;
function Play(nCueIndex: TXACTIndex; dwFlags: DWORD; timeOffset: TXACTTime; ppCue: PIXACTCue): HResult; virtual; stdcall; abstract;
function Stop(nCueIndex: TXACTIndex; dwFlags: DWORD): HResult; virtual; stdcall; abstract;
{$WARNINGS OFF}
function Destroy: HResult; virtual; stdcall; abstract; //Clootie: This method is not related to Delphi TObject.Destroy
{$WARNINGS ON}
function GetState(out pdwState: DWORD): HResult; virtual; stdcall; abstract;
end;
//------------------------------------------------------------------------------
// IXACTWaveBank
//------------------------------------------------------------------------------
{$EXTERNALSYM IXACTWaveBank}
IXACTWaveBank = class
{$WARNINGS OFF}
function Destroy: HResult; virtual; stdcall; abstract; //Clootie: This method is not related to Delphi TObject.Destroy
{$WARNINGS ON}
function GetNumWaves(pnNumWaves: PXACTIndex): HResult; virtual; stdcall; abstract;
function GetWaveIndex(szFriendlyName: PAnsiChar): XACTINDEX; virtual; stdcall; abstract;
function GetWaveProperties(nWaveIndex: TXACTIndex; pWaveProperties: PXACT_Wave_Properties): HResult; virtual; stdcall; abstract;
function Prepare(nWaveIndex: TXACTIndex; dwFlags: DWORD; dwPlayOffset: DWORD; nLoopCount: TXACTLoopCount; out ppWave: IXACTWave): HResult; virtual; stdcall; abstract;
function Play(nWaveIndex: TXACTIndex; dwFlags: DWORD; dwPlayOffset: DWORD; nLoopCount: TXACTLoopCount; out ppWave: IXACTWave): HResult; virtual; stdcall; abstract;
function Stop(nWaveIndex: TXACTIndex; dwFlags: DWORD): HResult; virtual; stdcall; abstract;
function GetState(out pdwState: DWORD): HResult; virtual; stdcall; abstract;
end;
//------------------------------------------------------------------------------
// IXACTWave
//------------------------------------------------------------------------------
{$EXTERNALSYM IXACTWave}
IXACTWave = class
{$WARNINGS OFF}
function Destroy: HResult; virtual; stdcall; abstract; //Clootie: This method is not related to Delphi TObject.Destroy
{$WARNINGS ON}
function Play: HResult; virtual; stdcall; abstract;
function Stop(dwFlags: DWORD): HResult; virtual; stdcall; abstract;
function Pause(fPause: BOOL): HResult; virtual; stdcall; abstract;
function GetState(out pdwState: DWORD): HResult; virtual; stdcall; abstract;
function SetPitch(pitch: TXACTPitch): HResult; virtual; stdcall; abstract;
function SetVolume(volume: TXACTVolume): HResult; virtual; stdcall; abstract;
function SetMatrixCoefficients(uSrcChannelCount: UINT32; uDstChannelCount: UINT32; pMatrixCoefficients: PSingle): HResult; virtual; stdcall; abstract;
function GetProperties(out pProperties: TXACT_Wave_Instance_Properties): HResult; virtual; stdcall; abstract;
end;
//------------------------------------------------------------------------------
// IXACTCue
//------------------------------------------------------------------------------
{$EXTERNALSYM IXACTCue}
IXACTCue = class
function Play: HResult; virtual; stdcall; abstract;
function Stop(dwFlags: DWORD): HResult; virtual; stdcall; abstract;
function GetState(out pdwState: DWORD): HResult; virtual; stdcall; abstract;
{$WARNINGS OFF}
function Destroy: HResult; virtual; stdcall; abstract; //Clootie: This method is not related to Delphi TObject.Destroy
{$WARNINGS ON}
function GetChannelMap(pChannelMap: PXACTChannelMap; BufferSize: DWORD; pRequiredSize: PDWORD): HResult; virtual; stdcall; abstract;
function SetChannelMap(const pChannelMap: PXACTChannelMap): HResult; virtual; stdcall; abstract;
function GetChannelVolume(const pVolume: PXACTChannelVolume): HResult; virtual; stdcall; abstract;
function SetChannelVolume(const pVolume: PXACTChannelVolume): HResult; virtual; stdcall; abstract;
function SetMatrixCoefficients(uSrcChannelCount: LongWord; uDstChannelCount: LongWord; pMatrixCoefficients: PSingle): HResult; virtual; stdcall; abstract;
function GetVariableIndex(szFriendlyName: PAnsiChar): TXACTVariableIndex; virtual; stdcall; abstract;
function SetVariable(nIndex: TXACTVariableIndex; nValue: TXACTVariableValue): HResult; virtual; stdcall; abstract;
function GetVariable(nIndex: TXACTVariableIndex; out nValue: TXACTVariableValue): HResult; virtual; stdcall; abstract;
function Pause(fPause: BOOL): HResult; virtual; stdcall; abstract;
function GetProperties(out ppProperties: TXACT_Cue_Instance_Properties): HResult; virtual; stdcall; abstract;
{$IFDEF XBOX}
function SetVoiceOutput(pVoiceOutput: PXAudioVoiceOutput): HResult; virtual; stdcall; abstract;
function SetVoiceOutputVolume(pVolume: PXAudioVoiceOutputVolume): HResult; virtual; stdcall; abstract;
{$ENDIF} // _XBOX
end;
//------------------------------------------------------------------------------
// IXACTEngine
//------------------------------------------------------------------------------
{$EXTERNALSYM IXACTEngine}
{$IFDEF XBOX}
IXACTEngine = interface // !CORBA!
function AddRef: Cardinal; stdcall;
function Release: Cardinal; stdcall;
{$ELSE}
IXACTEngine = interface(IUnknown)
['{c2f0af68-1f6d-40ed-964f-26256842edc4}']
{$ENDIF}
{$IFNDEF XBOX}
function GetRendererCount(out pnRendererCount: TXACTIndex): HResult; stdcall;
function GetRendererDetails(nRendererIndex: TXACTIndex; out pRendererDetails: TXACTRendererDetails): HResult; stdcall;
{$ENDIF}
function GetFinalMixFormat(out pFinalMixFormat: TWaveFormatExtensible): HResult; stdcall;
function Initialize(const pParams: TXACT_Runtime_Parameters): HResult; stdcall;
function ShutDown: HResult; stdcall;
function DoWork: HResult; stdcall;
function CreateSoundBank(const pvBuffer: Pointer; dwSize: DWORD; dwFlags: DWORD; dwAllocAttributes: DWORD; out ppSoundBank: IXACTSoundBank): HResult; stdcall;
function CreateInMemoryWaveBank(const pvBuffer: Pointer; dwSize: DWORD; dwFlags: DWORD; dwAllocAttributes: DWORD; out ppWaveBank: IXACTWaveBank): HResult; stdcall;
function CreateStreamingWaveBank(const pParms: TXACT_Wavebank_Streaming_Parameters; out ppWaveBank: IXACTWaveBank): HResult; stdcall;
function PrepareWave(dwFlags: DWORD; szWavePath: PAnsiChar; wStreamingPacketSize: Word; dwAlignment: DWORD; dwPlayOffset: DWORD; nLoopCount: XACTLOOPCOUNT; out ppWave: IXACTWave): HResult; stdcall;
function PrepareInMemoryWave(dwFlags: DWORD; entry: TWavebankEntry; pdwSeekTable: PDWORD; pbWaveData: PByte; dwPlayOffset: DWORD; nLoopCount: XACTLOOPCOUNT; out ppWave: IXACTWave): HResult; stdcall;
function PrepareStreamingWave(dwFlags: DWORD; entry: TWavebankEntry; streamingParams: TXACT_Streaming_Parameters; dwAlignment: DWORD; pdwSeekTable: PDWORD; dwPlayOffset: DWORD; nLoopCount: TXACTLoopCount; out ppWave: IXACTWave): HResult; stdcall;
function RegisterNotification(const pNotificationDesc: TXACT_Notification_Description): HResult; stdcall;
function UnRegisterNotification(const pNotificationDesc: TXACT_Notification_Description): HResult; stdcall;
function GetCategory(szFriendlyName: PAnsiChar): TXACTCategory; stdcall;
function Stop(nCategory: TXACTCategory; dwFlags: DWORD): HResult; stdcall;
function SetVolume(nCategory: TXACTCategory; nVolume: TXACTVolume): HResult; stdcall;
function Pause(nCategory: TXACTCategory; fPause: BOOL): HResult; stdcall;
function GetGlobalVariableIndex(szFriendlyName: PAnsiChar): TXACTVariableIndex; stdcall;
function SetGlobalVariable(nIndex: TXACTVariableIndex; nValue: TXACTVariableValue): HResult; stdcall;
function GetGlobalVariable(nIndex: TXACTVariableIndex; out nValue: TXACTVariableValue): HResult; stdcall;
end;
IID_IXACTEngine = IXACTEngine;
{$EXTERNALSYM IID_IXACTEngine}
//------------------------------------------------------------------------------
// XACT API's (these are deprecated and will be removed in a future release)
//------------------------------------------------------------------------------
{$IFDEF XBOX}
(*
#define XACT_FLAG_API_CREATE_MANAGEDATA XACT_FLAG_MANAGEDATA
#define XACT_FLAG_API_STOP_IMMEDIATE XACT_FLAG_STOP_IMMEDIATE
STDAPI XACTInitialize(const XACT_RUNTIME_PARAMETERS* pParams);
STDAPI XACTShutDown(void);
STDAPI XACTDoWork(void);
STDAPI XACTCreateSoundBank(const void* pvBuffer, DWORD dwSize, DWORD dwFlags, DWORD dwAllocAttributes, IXACTSoundBank** ppSoundBank);
STDAPI XACTCreateInMemoryWaveBank(const void* pvBuffer, DWORD dwSize, DWORD dwFlags, DWORD dwAllocAttributes, IXACTWaveBank** ppWaveBank);
STDAPI XACTCreateStreamingWaveBank(const XACT_WAVEBANK_STREAMING_PARAMETERS* pParms, IXACTWaveBank** ppWaveBank);
STDAPI XACTRegisterNotification(const XACT_NOTIFICATION_DESCRIPTION* pNotificationDesc);
STDAPI XACTUnRegisterNotification(const XACT_NOTIFICATION_DESCRIPTION* pNotificationDesc);
STDAPI_(XACTCATEGORY) XACTGetCategory(PCSTR szFriendlyName);
STDAPI XACTStop(XACTCATEGORY nCategory, DWORD dwFlags);
STDAPI XACTSetVolume(XACTCATEGORY nCategory, XACTVOLUME nVolume);
STDAPI XACTPause(XACTCATEGORY nCategory, BOOL fPause);
STDAPI_(XACTVARIABLEINDEX) XACTGetGlobalVariableIndex(PCSTR szFriendlyName);
STDAPI XACTSetGlobalVariable(XACTVARIABLEINDEX nIndex, XACTVARIABLEVALUE nValue);
STDAPI XACTGetGlobalVariable(XACTVARIABLEINDEX nIndex, XACTVARIABLEVALUE* pnValue);
*)
{$ENDIF XBOX}
//------------------------------------------------------------------------------
// Create Engine
//------------------------------------------------------------------------------
// Flags used only in XACTCreateEngine below. These flags are valid but ignored
// when building for Xbox 360; to enable auditioning on that platform you must
// link explicitly to an auditioning version of the XACT static library.
const
XACT_FLAG_API_AUDITION_MODE = DWORD($00000001);
{$EXTERNALSYM XACT_FLAG_API_AUDITION_MODE}
XACT_FLAG_API_DEBUG_MODE = DWORD($00000002);
{$EXTERNALSYM XACT_FLAG_API_DEBUG_MODE}
function XACTCreateEngine(dwCreationFlags: DWORD; out ppEngine: IXACTEngine): HRESULT; stdcall; // inline
{$EXTERNALSYM XACTCreateEngine}
{$IFNDEF XBOX}
const
XACT_DEBUGENGINE_REGISTRY_KEY = 'Software\Microsoft\XACT';
{$EXTERNALSYM XACT_DEBUGENGINE_REGISTRY_KEY}
XACT_DEBUGENGINE_REGISTRY_VALUE = 'DebugEngine';
{$EXTERNALSYM XACT_DEBUGENGINE_REGISTRY_VALUE}
{$ENDIF}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Standard win32 multimedia definitions
//------------------------------------------------------------------------------
const
WAVE_FORMAT_IEEE_FLOAT = $0003;
{$EXTERNALSYM WAVE_FORMAT_IEEE_FLOAT}
WAVE_FORMAT_EXTENSIBLE = $FFFE;
{$EXTERNALSYM WAVE_FORMAT_EXTENSIBLE}
//------------------------------------------------------------------------------
// Constants
//------------------------------------------------------------------------------
const
LONG_MIN = (-2147483647-1);
LONG_MAX = 2147483647;
const
XACTTIME_MIN = TXACTTime(LONG_MIN);
{$EXTERNALSYM XACTTIME_MIN}
XACTTIME_MAX = TXACTTime(LONG_MAX); // 24 days 20:31:23.647
{$EXTERNALSYM XACTTIME_MAX}
XACTTIME_INFINITE = TXACTTime(LONG_MAX);
{$EXTERNALSYM XACTTIME_INFINITE}
XACTINSTANCELIMIT_INFINITE = TXACTInstanceLimit($ff);
{$EXTERNALSYM XACTINSTANCELIMIT_INFINITE}
XACTINSTANCELIMIT_MIN = TXACTInstanceLimit($00); // == 1 instance total (0 additional instances)
{$EXTERNALSYM XACTINSTANCELIMIT_MIN}
XACTINSTANCELIMIT_MAX = TXACTInstanceLimit($fe); // == 255 instances total (254 additional instances)
{$EXTERNALSYM XACTINSTANCELIMIT_MAX}
XACTINDEX_MIN = TXACTIndex($0);
{$EXTERNALSYM XACTINDEX_MIN}
XACTINDEX_MAX = TXACTIndex($fffe);
{$EXTERNALSYM XACTINDEX_MAX}
XACTINDEX_INVALID = TXACTIndex($ffff);
{$EXTERNALSYM XACTINDEX_INVALID}
XACTNOTIFICATIONTYPE_MIN = TXACTNotificationType($00);
{$EXTERNALSYM XACTNOTIFICATIONTYPE_MIN}
XACTNOTIFICATIONTYPE_MAX = TXACTNotificationType($ff);
{$EXTERNALSYM XACTNOTIFICATIONTYPE_MAX}
XACTVARIABLEVALUE_MIN: TXACTVariableValue = -3.402823466e+38; // -FLT_MAX;
{$EXTERNALSYM XACTVARIABLEVALUE_MIN}
XACTVARIABLEVALUE_MAX: TXACTVariableValue = 3.402823466e+38; // FLT_MAX;
{$EXTERNALSYM XACTVARIABLEVALUE_MAX}
XACTVARIABLEINDEX_MIN = TXACTVariableIndex($0000);
{$EXTERNALSYM XACTVARIABLEINDEX_MIN}
XACTVARIABLEINDEX_MAX = TXACTVariableIndex($fffe);
{$EXTERNALSYM XACTVARIABLEINDEX_MAX}
XACTVARIABLEINDEX_INVALID = TXACTVariableIndex($ffff);
{$EXTERNALSYM XACTVARIABLEINDEX_INVALID}
XACTCATEGORY_MIN = TXACTCategory($0);
{$EXTERNALSYM XACTCATEGORY_MIN}
XACTCATEGORY_MAX = TXACTCategory($fffe);
{$EXTERNALSYM XACTCATEGORY_MAX}
XACTCATEGORY_INVALID = TXACTCategory($ffff);
{$EXTERNALSYM XACTCATEGORY_INVALID}
XACTCHANNEL_MIN = TXACTChannel(0);
{$EXTERNALSYM XACTCHANNEL_MIN}
XACTCHANNEL_MAX = TXACTChannel($FF);
{$EXTERNALSYM XACTCHANNEL_MAX}
XACTPITCH_MIN = TXACTPitch(-1200);
{$EXTERNALSYM XACTPITCH_MIN}
XACTPITCH_MAX = TXACTPitch( 1200);
{$EXTERNALSYM XACTPITCH_MAX}
XACTVOLUME_MIN = {TXACTVolume}(0.0);
{$EXTERNALSYM XACTVOLUME_MIN}
XACTVOLUME_MAX = {TXACTVolume}(3.402823466e+38); // FLT_MAX;
{$EXTERNALSYM XACTVOLUME_MAX}
XACTPARAMETERVALUE_MIN: TXACTVariableValue = -3.402823466e+38; // -FLT_MAX;
{$EXTERNALSYM XACTPARAMETERVALUE_MIN}
XACTPARAMETERVALUE_MAX: TXACTVariableValue = 3.402823466e+38; // FLT_MAX;
{$EXTERNALSYM XACTPARAMETERVALUE_MAX}
XACTLOOPCOUNT_MIN = TXACTLoopCount(0);
XACTLOOPCOUNT_MAX = TXACTLoopCount($fe);
XACTLOOPCOUNT_INFINITE = TXACTLoopCount($ff);
XACTWAVEALIGNMENT_MIN = 2048;
{$IFDEF XBOX}
XACTMAXOUTPUTVOICECOUNT: TXAudioVoiceIndex = 3;
{$EXTERNALSYM XACTMAXOUTPUTVOICECOUNT}
{$ENDIF} // XBOX
// -----------------------------------------------------------------------------
// Current Content Tool Version
// -----------------------------------------------------------------------------
XACT_CONTENT_VERSION = 42;
{$EXTERNALSYM XACT_CONTENT_VERSION}
// -----------------------------------------------------------------------------
// XACT Stop Flags
// -----------------------------------------------------------------------------
XACT_FLAG_STOP_RELEASE = DWORD($00000000); // Stop with release envelope (or as authored), for looping waves this acts as break loop.
{$EXTERNALSYM XACT_FLAG_STOP_RELEASE}
XACT_FLAG_STOP_IMMEDIATE = DWORD($00000001); // Stop immediately
{$EXTERNALSYM XACT_FLAG_STOP_IMMEDIATE}
// -----------------------------------------------------------------------------
// XACT Manage Data Flag - XACT will manage the lifetime of this data
// -----------------------------------------------------------------------------
XACT_FLAG_MANAGEDATA = DWORD($00000001);
{$EXTERNALSYM XACT_FLAG_MANAGEDATA}
// -----------------------------------------------------------------------------
// XACT Content Preparation Flags
// -----------------------------------------------------------------------------
XACT_FLAG_BACKGROUND_MUSIC = DWORD($00000002); // Marks the waves as background music.
{$EXTERNALSYM XACT_FLAG_BACKGROUND_MUSIC}
XACT_FLAG_UNITS_MS = DWORD($00000004); // Indicates that the units passed in are in milliseconds.
{$EXTERNALSYM XACT_FLAG_UNITS_MS}
XACT_FLAG_UNITS_SAMPLES = DWORD($00000008); // Indicates that the units passed in are in samples.
{$EXTERNALSYM XACT_FLAG_UNITS_SAMPLES}
// -----------------------------------------------------------------------------
// XACT State flags
// -----------------------------------------------------------------------------
XACT_STATE_CREATED = DWORD($00000001); // Created, but nothing else
{$EXTERNALSYM XACT_STATE_CREATED}
XACT_STATE_PREPARING = DWORD($00000002); // In the middle of preparing
{$EXTERNALSYM XACT_STATE_PREPARING}
XACT_STATE_PREPARED = DWORD($00000004); // Prepared, but not yet played
{$EXTERNALSYM XACT_STATE_PREPARED}
XACT_STATE_PLAYING = DWORD($00000008); // Playing (though could be paused)
{$EXTERNALSYM XACT_STATE_PLAYING}
XACT_STATE_STOPPING = DWORD($00000010); // Stopping
{$EXTERNALSYM XACT_STATE_STOPPING}
XACT_STATE_STOPPED = DWORD($00000020); // Stopped
{$EXTERNALSYM XACT_STATE_STOPPED}
XACT_STATE_PAUSED = DWORD($00000040); // Paused (Can be combined with some of the other state flags above)
{$EXTERNALSYM XACT_STATE_PAUSED}
XACT_STATE_INUSE = DWORD($00000080); // Object is in use (used by wavebanks and soundbanks).
{$EXTERNALSYM XACT_STATE_INUSE}
XACT_STATE_PREPAREFAILED = DWORD($80000000); // Object preparation failed.
{$EXTERNALSYM XACT_STATE_PREPAREFAILED}
//------------------------------------------------------------------------------
// XACT Parameters
//------------------------------------------------------------------------------
XACT_FLAG_GLOBAL_SETTINGS_MANAGEDATA = XACT_FLAG_MANAGEDATA;
{$EXTERNALSYM XACT_FLAG_GLOBAL_SETTINGS_MANAGEDATA}
//------------------------------------------------------------------------------
// Notifications
//------------------------------------------------------------------------------
XACTNOTIFICATIONTYPE_CUEPREPARED = TXACTNotificationType(1); // None, SoundBank, SoundBank & cue index, cue instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_CUEPREPARED}
XACTNOTIFICATIONTYPE_CUEPLAY = TXACTNotificationType(2); // None, SoundBank, SoundBank & cue index, cue instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_CUEPLAY}
XACTNOTIFICATIONTYPE_CUESTOP = TXACTNotificationType(3); // None, SoundBank, SoundBank & cue index, cue instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_CUESTOP}
XACTNOTIFICATIONTYPE_CUEDESTROYED = TXACTNotificationType(4); // None, SoundBank, SoundBank & cue index, cue instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_CUEDESTROYED}
XACTNOTIFICATIONTYPE_MARKER = TXACTNotificationType(5); // None, SoundBank, SoundBank & cue index, cue instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_MARKER}
XACTNOTIFICATIONTYPE_SOUNDBANKDESTROYED = TXACTNotificationType(6); // None, SoundBank
{$EXTERNALSYM XACTNOTIFICATIONTYPE_SOUNDBANKDESTROYED}
XACTNOTIFICATIONTYPE_WAVEBANKDESTROYED = TXACTNotificationType(7); // None, WaveBank
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVEBANKDESTROYED}
XACTNOTIFICATIONTYPE_LOCALVARIABLECHANGED = TXACTNotificationType(8); // None, SoundBank, SoundBank & cue index, cue instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_LOCALVARIABLECHANGED}
XACTNOTIFICATIONTYPE_GLOBALVARIABLECHANGED = TXACTNotificationType(9); // None
{$EXTERNALSYM XACTNOTIFICATIONTYPE_GLOBALVARIABLECHANGED}
XACTNOTIFICATIONTYPE_GUICONNECTED = TXACTNotificationType(10); // None
{$EXTERNALSYM XACTNOTIFICATIONTYPE_GUICONNECTED}
XACTNOTIFICATIONTYPE_GUIDISCONNECTED = TXACTNotificationType(11); // None
{$EXTERNALSYM XACTNOTIFICATIONTYPE_GUIDISCONNECTED}
XACTNOTIFICATIONTYPE_WAVEPREPARED = TXACTNotificationType(12); // None, WaveBank & wave index, wave instance.
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVEPREPARED}
XACTNOTIFICATIONTYPE_WAVEPLAY = TXACTNotificationType(13); // None, SoundBank, SoundBank & cue index, cue instance, WaveBank, wave instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVEPLAY}
XACTNOTIFICATIONTYPE_WAVESTOP = TXACTNotificationType(14); // None, SoundBank, SoundBank & cue index, cue instance, WaveBank, wave instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVESTOP}
XACTNOTIFICATIONTYPE_WAVELOOPED = TXACTNotificationType(15); // None, SoundBank, SoundBank & cue index, cue instance, WaveBank, wave instance
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVELOOPED}
XACTNOTIFICATIONTYPE_WAVEDESTROYED = TXACTNotificationType(16); // None, WaveBank & wave index, wave instance.
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVEDESTROYED}
XACTNOTIFICATIONTYPE_WAVEBANKPREPARED = TXACTNotificationType(17); // None, WaveBank
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVEBANKPREPARED}
XACTNOTIFICATIONTYPE_WAVEBANKSTREAMING_INVALIDCONTENT = TXACTNotificationType(18); // None, WaveBank
{$EXTERNALSYM XACTNOTIFICATIONTYPE_WAVEBANKSTREAMING_INVALIDCONTENT}
XACT_FLAG_NOTIFICATION_PERSIST = $01;
{$EXTERNALSYM XACT_FLAG_NOTIFICATION_PERSIST}
//------------------------------------------------------------------------------
// IXACTSoundBank
//------------------------------------------------------------------------------
XACT_FLAG_SOUNDBANK_STOP_IMMEDIATE = XACT_FLAG_STOP_IMMEDIATE;
{$EXTERNALSYM XACT_FLAG_SOUNDBANK_STOP_IMMEDIATE}
XACT_SOUNDBANKSTATE_INUSE = XACT_STATE_INUSE;
{$EXTERNALSYM XACT_SOUNDBANKSTATE_INUSE}
//------------------------------------------------------------------------------
// IXACTWaveBank
//------------------------------------------------------------------------------
XACT_WAVEBANKSTATE_INUSE = XACT_STATE_INUSE; // Currently in-use
{$EXTERNALSYM XACT_WAVEBANKSTATE_INUSE}
XACT_WAVEBANKSTATE_PREPARED = XACT_STATE_PREPARED; // Prepared
{$EXTERNALSYM XACT_WAVEBANKSTATE_PREPARED}
XACT_WAVEBANKSTATE_PREPAREFAILED = XACT_STATE_PREPAREFAILED; // Prepare failed.
{$EXTERNALSYM XACT_WAVEBANKSTATE_PREPAREFAILED}
//------------------------------------------------------------------------------
// IXACTCue
//------------------------------------------------------------------------------
// Cue Flags
XACT_FLAG_CUE_STOP_RELEASE = XACT_FLAG_STOP_RELEASE;
{$EXTERNALSYM XACT_FLAG_CUE_STOP_RELEASE}
XACT_FLAG_CUE_STOP_IMMEDIATE = XACT_FLAG_STOP_IMMEDIATE;
{$EXTERNALSYM XACT_FLAG_CUE_STOP_IMMEDIATE}
// Mutually exclusive states
XACT_CUESTATE_CREATED = XACT_STATE_CREATED; // Created, but nothing else
{$EXTERNALSYM XACT_CUESTATE_CREATED}
XACT_CUESTATE_PREPARING = XACT_STATE_PREPARING; // In the middle of preparing
{$EXTERNALSYM XACT_CUESTATE_PREPARING}
XACT_CUESTATE_PREPARED = XACT_STATE_PREPARED; // Prepared, but not yet played
{$EXTERNALSYM XACT_CUESTATE_PREPARED}
XACT_CUESTATE_PLAYING = XACT_STATE_PLAYING; // Playing (though could be paused)
{$EXTERNALSYM XACT_CUESTATE_PLAYING}
XACT_CUESTATE_STOPPING = XACT_STATE_STOPPING; // Stopping
{$EXTERNALSYM XACT_CUESTATE_STOPPING}
XACT_CUESTATE_STOPPED = XACT_STATE_STOPPED; // Stopped
{$EXTERNALSYM XACT_CUESTATE_STOPPED}
XACT_CUESTATE_PAUSED = XACT_STATE_PAUSED; // Paused (can be combined with other states)
{$EXTERNALSYM XACT_CUESTATE_PAUSED}
//------------------------------------------------------------------------------
// IXACTEngine
//------------------------------------------------------------------------------
// Engine flags
XACT_FLAG_ENGINE_CREATE_MANAGEDATA = XACT_FLAG_MANAGEDATA;
{$EXTERNALSYM XACT_FLAG_ENGINE_CREATE_MANAGEDATA}
XACT_FLAG_ENGINE_STOP_IMMEDIATE = XACT_FLAG_STOP_IMMEDIATE;
{$EXTERNALSYM XACT_FLAG_ENGINE_STOP_IMMEDIATE}
//------------------------------------------------------------------------------
// XACT specific error codes
//------------------------------------------------------------------------------
const
FACILITY_XACTENGINE = $AC7;
{$EXTERNALSYM FACILITY_XACTENGINE}
// #define XACTENGINEERROR(n) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_XACTENGINE, n)
// XACTENGINEERROR(n) = DWord((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or n;
XACTENGINE_E_OUTOFMEMORY = E_OUTOFMEMORY; // Out of memory
{$EXTERNALSYM XACTENGINE_E_OUTOFMEMORY}
XACTENGINE_E_INVALIDARG = E_INVALIDARG; // Invalid arg
{$EXTERNALSYM XACTENGINE_E_INVALIDARG}
XACTENGINE_E_NOTIMPL = E_NOTIMPL; // Not implemented
{$EXTERNALSYM XACTENGINE_E_NOTIMPL}
XACTENGINE_E_FAIL = E_FAIL; // Unknown error
{$EXTERNALSYM XACTENGINE_E_FAIL}
XACTENGINE_E_ALREADYINITIALIZED = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $001); // The engine is already initialized
{$EXTERNALSYM XACTENGINE_E_ALREADYINITIALIZED}
XACTENGINE_E_NOTINITIALIZED = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $002); // The engine has not been initialized
{$EXTERNALSYM XACTENGINE_E_NOTINITIALIZED}
XACTENGINE_E_EXPIRED = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $003); // The engine has expired (demo or pre-release version)
{$EXTERNALSYM XACTENGINE_E_EXPIRED}
XACTENGINE_E_NONOTIFICATIONCALLBACK = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $004); // No notification callback
{$EXTERNALSYM XACTENGINE_E_NONOTIFICATIONCALLBACK}
XACTENGINE_E_NOTIFICATIONREGISTERED = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $005); // Notification already registered
{$EXTERNALSYM XACTENGINE_E_NOTIFICATIONREGISTERED}
XACTENGINE_E_INVALIDUSAGE = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $006); // Invalid usage
{$EXTERNALSYM XACTENGINE_E_INVALIDUSAGE}
XACTENGINE_E_INVALIDDATA = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $007); // Invalid data
{$EXTERNALSYM XACTENGINE_E_INVALIDDATA}
XACTENGINE_E_INSTANCELIMITFAILTOPLAY = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $008); // Fail to play due to instance limit
{$EXTERNALSYM XACTENGINE_E_INSTANCELIMITFAILTOPLAY}
XACTENGINE_E_NOGLOBALSETTINGS = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $009); // Global Settings not loaded
{$EXTERNALSYM XACTENGINE_E_NOGLOBALSETTINGS}
XACTENGINE_E_INVALIDVARIABLEINDEX = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $00a); // Invalid variable index
{$EXTERNALSYM XACTENGINE_E_INVALIDVARIABLEINDEX}
XACTENGINE_E_INVALIDCATEGORY = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $00b); // Invalid category
{$EXTERNALSYM XACTENGINE_E_INVALIDCATEGORY}
XACTENGINE_E_INVALIDCUEINDEX = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $00c); // Invalid cue index
{$EXTERNALSYM XACTENGINE_E_INVALIDCUEINDEX}
XACTENGINE_E_INVALIDWAVEINDEX = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $00d); // Invalid wave index
{$EXTERNALSYM XACTENGINE_E_INVALIDWAVEINDEX}
XACTENGINE_E_INVALIDTRACKINDEX = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $00e); // Invalid track index
{$EXTERNALSYM XACTENGINE_E_INVALIDTRACKINDEX}
XACTENGINE_E_INVALIDSOUNDOFFSETORINDEX = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $00f); // Invalid sound offset or index
{$EXTERNALSYM XACTENGINE_E_INVALIDSOUNDOFFSETORINDEX}
XACTENGINE_E_READFILE = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $010); // Error reading a file
{$EXTERNALSYM XACTENGINE_E_READFILE}
XACTENGINE_E_UNKNOWNEVENT = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $011); // Unknown event type
{$EXTERNALSYM XACTENGINE_E_UNKNOWNEVENT}
XACTENGINE_E_INCALLBACK = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $012); // Invalid call of method of function from callback
{$EXTERNALSYM XACTENGINE_E_INCALLBACK}
XACTENGINE_E_NOWAVEBANK = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $013); // No wavebank exists for desired operation
{$EXTERNALSYM XACTENGINE_E_NOWAVEBANK}
XACTENGINE_E_SELECTVARIATION = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $014); // Unable to select a variation
{$EXTERNALSYM XACTENGINE_E_SELECTVARIATION}
XACTENGINE_E_MULTIPLEAUDITIONENGINES = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $015); // There can be only one audition engine
{$EXTERNALSYM XACTENGINE_E_MULTIPLEAUDITIONENGINES}
XACTENGINE_E_WAVEBANKNOTPREPARED = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $016); // The wavebank is not prepared
{$EXTERNALSYM XACTENGINE_E_WAVEBANKNOTPREPARED}
XACTENGINE_E_NORENDERER = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $017); // No audio device found on.
{$EXTERNALSYM XACTENGINE_E_NORENDERER}
XACTENGINE_E_INVALIDENTRYCOUNT = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $018); // Invalid entry count for channel maps
{$EXTERNALSYM XACTENGINE_E_INVALIDENTRYCOUNT}
XACTENGINE_E_SEEKTIMEBEYONDCUEEND = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $019); // Time offset for seeking is beyond the cue end.
{$EXTERNALSYM XACTENGINE_E_SEEKTIMEBEYONDCUEEND}
XACTENGINE_E_SEEKTIMEBEYONDWAVEEND = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $019); // Time offset for seeking is beyond the wave end.
{$EXTERNALSYM XACTENGINE_E_SEEKTIMEBEYONDWAVEEND}
XACTENGINE_E_NOFRIENDLYNAMES = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $01a); // Friendly names are not included in the bank.
{$EXTERNALSYM XACTENGINE_E_NOFRIENDLYNAMES}
XACTENGINE_E_AUDITION_WRITEFILE = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $101); // Error writing a file during auditioning
{$EXTERNALSYM XACTENGINE_E_AUDITION_WRITEFILE}
XACTENGINE_E_AUDITION_NOSOUNDBANK = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $102); // Missing a soundbank
{$EXTERNALSYM XACTENGINE_E_AUDITION_NOSOUNDBANK}
XACTENGINE_E_AUDITION_INVALIDRPCINDEX = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $103); // Missing an RPC curve
{$EXTERNALSYM XACTENGINE_E_AUDITION_INVALIDRPCINDEX}
XACTENGINE_E_AUDITION_MISSINGDATA = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $104); // Missing data for an audition command
{$EXTERNALSYM XACTENGINE_E_AUDITION_MISSINGDATA}
XACTENGINE_E_AUDITION_UNKNOWNCOMMAND = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $105); // Unknown command
{$EXTERNALSYM XACTENGINE_E_AUDITION_UNKNOWNCOMMAND}
XACTENGINE_E_AUDITION_INVALIDDSPINDEX = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $106); // Missing a DSP parameter
{$EXTERNALSYM XACTENGINE_E_AUDITION_INVALIDDSPINDEX}
XACTENGINE_E_AUDITION_MISSINGWAVE = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $107); // Wave does not exist in auditioned wavebank
{$EXTERNALSYM XACTENGINE_E_AUDITION_MISSINGWAVE}
XACTENGINE_E_AUDITION_CREATEDIRECTORYFAILED = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $108); // Failed to create a directory for streaming wavebank data
{$EXTERNALSYM XACTENGINE_E_AUDITION_CREATEDIRECTORYFAILED}
XACTENGINE_E_AUDITION_INVALIDSESSION = DWord(((1 shl 31) or (FACILITY_XACTENGINE shl 16)) or $109); // Invalid audition session
{$EXTERNALSYM XACTENGINE_E_AUDITION_INVALIDSESSION}
{*-========================================================================-_
| - XACT3D - |
| Copyright (c) Microsoft Corporation. All rights reserved. |
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
|VERSION: 0.1 MODEL: Unmanaged User-mode |
|CONTRACT: N / A EXCEPT: No Exceptions |
|PARENT: N / A MINREQ: Win2000, Xbox360 |
|PROJECT: XACT3D DIALECT: MS Visual C++ 7.0 |
|>------------------------------------------------------------------------<|
| DUTY: XACT 3D support |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
NOTES:
1. See X3DAudio.h for information regarding X3DAudio types. *}
//--------------<D-E-F-I-N-I-T-I-O-N-S>-------------------------------------//
const
// Supported speaker positions, represented as azimuth angles.
//
// Here's a picture of the azimuth angles for the 8 cardinal points,
// seen from above. The emitter's base position is at the origin 0.
//
// FRONT
// | 0 <-- azimuth
// |
// 7pi/4 \ | / pi/4
// \ | /
// LEFT \|/ RIGHT
// 3pi/2-------0-------pi/2
// /|\
// / | \
// 5pi/4 / | \ 3pi/4
// |
// | pi
// BACK
//
LEFT_AZIMUTH = (3*X3DAUDIO_PI/2);
{$EXTERNALSYM LEFT_AZIMUTH}
RIGHT_AZIMUTH = (X3DAUDIO_PI/2);
{$EXTERNALSYM RIGHT_AZIMUTH}
FRONT_LEFT_AZIMUTH = (7*X3DAUDIO_PI/4);
{$EXTERNALSYM FRONT_LEFT_AZIMUTH}
FRONT_RIGHT_AZIMUTH = (X3DAUDIO_PI/4);
{$EXTERNALSYM FRONT_RIGHT_AZIMUTH}
FRONT_CENTER_AZIMUTH = 0.0;
{$EXTERNALSYM FRONT_CENTER_AZIMUTH}
LOW_FREQUENCY_AZIMUTH = X3DAUDIO_2PI;
{$EXTERNALSYM LOW_FREQUENCY_AZIMUTH}
BACK_LEFT_AZIMUTH = (5*X3DAUDIO_PI/4);
{$EXTERNALSYM BACK_LEFT_AZIMUTH}
BACK_RIGHT_AZIMUTH = (3*X3DAUDIO_PI/4);
{$EXTERNALSYM BACK_RIGHT_AZIMUTH}
BACK_CENTER_AZIMUTH = X3DAUDIO_PI;
{$EXTERNALSYM BACK_CENTER_AZIMUTH}
FRONT_LEFT_OF_CENTER_AZIMUTH = (15*X3DAUDIO_PI/8);
{$EXTERNALSYM FRONT_LEFT_OF_CENTER_AZIMUTH}
FRONT_RIGHT_OF_CENTER_AZIMUTH = (X3DAUDIO_PI/8);
{$EXTERNALSYM FRONT_RIGHT_OF_CENTER_AZIMUTH}
//--------------<D-A-T-A---T-Y-P-E-S>---------------------------------------//
// Supported emitter channel layouts:
aStereoLayout: array[0..1] of Single =
(
LEFT_AZIMUTH,
RIGHT_AZIMUTH
);
{$EXTERNALSYM aStereoLayout}
a2Point1Layout: array[0..2] of Single =
(
LEFT_AZIMUTH,
RIGHT_AZIMUTH,
LOW_FREQUENCY_AZIMUTH
);
{$EXTERNALSYM a2Point1Layout}
aQuadLayout: array[0..3] of Single =
(
FRONT_LEFT_AZIMUTH,
FRONT_RIGHT_AZIMUTH,
BACK_LEFT_AZIMUTH,
BACK_RIGHT_AZIMUTH
);
{$EXTERNALSYM aQuadLayout}
a4Point1Layout: array[0..4] of Single =
(
FRONT_LEFT_AZIMUTH,
FRONT_RIGHT_AZIMUTH,
LOW_FREQUENCY_AZIMUTH,
BACK_LEFT_AZIMUTH,
BACK_RIGHT_AZIMUTH
);
{$EXTERNALSYM a4Point1Layout}
a5Point1Layout: array[0..5] of Single =
(
FRONT_LEFT_AZIMUTH,
FRONT_RIGHT_AZIMUTH,
FRONT_CENTER_AZIMUTH,
LOW_FREQUENCY_AZIMUTH,
BACK_LEFT_AZIMUTH,
BACK_RIGHT_AZIMUTH
);
{$EXTERNALSYM a5Point1Layout}
a7Point1Layout: array[0..7] of Single =
(
FRONT_LEFT_AZIMUTH,
FRONT_RIGHT_AZIMUTH,
FRONT_CENTER_AZIMUTH,
LOW_FREQUENCY_AZIMUTH,
BACK_LEFT_AZIMUTH,
BACK_RIGHT_AZIMUTH,
LEFT_AZIMUTH,
RIGHT_AZIMUTH
);
{$EXTERNALSYM a7Point1Layout}
const
DefaultCurvePoints: array[0..1] of TX3DAudioDistanceCurvePoint =
((Distance: 0.0; DSPSetting: 1.0), (Distance: 1.0; DSPSetting: 1.0));
DefaultCurve: TX3DAudioDistanceCurve = (pPoints: @DefaultCurvePoints; PointCount: 2);
//--------------<F-U-N-C-T-I-O-N-S>-----------------------------------------//
////
// DESCRIPTION:
// Initializes the 3D API's:
//
// REMARKS:
// This method only needs to be called once.
// X3DAudio will be initialized such that its speaker channel mask
// matches the format of the given XACT engine's final mix.
//
// PARAMETERS:
// pEngine - [in] XACT engine
// X3DInstance - [out] X3DAudio instance handle
//
// RETURN VALUE:
// HResult error code
////
function XACT3DInitialize(const pEngine: IXACTEngine; out X3DInstance: TX3DAudioHandle): HRESULT; cdecl;{$IFDEF SUPPORTS_INLINE} inline;{$ENDIF}
{$EXTERNALSYM XACT3DInitialize}
////
// DESCRIPTION:
// Calculates DSP settings with respect to 3D parameters:
//
// REMARKS:
// Note the following flags are always specified for XACT3D calculation:
// X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_EMITTER_ANGLE
//
// This means the caller must set at least the following fields:
// X3DAUDIO_LISTENER.OrientFront
// X3DAUDIO_LISTENER.OrientTop
// X3DAUDIO_LISTENER.Position
// X3DAUDIO_LISTENER.Velocity
//
// X3DAUDIO_EMITTER.OrientFront
// X3DAUDIO_EMITTER.OrientTop, if emitter is multi-channel
// X3DAUDIO_EMITTER.Position
// X3DAUDIO_EMITTER.Velocity
// X3DAUDIO_EMITTER.ChannelCount
// X3DAUDIO_EMITTER.CurveDistanceScaler
// X3DAUDIO_EMITTER.DopplerScaler
//
// X3DAUDIO_DSP_SETTINGS.pMatrixCoefficients, the caller need only allocate space for SrcChannelCount*DstChannelCount elements
// X3DAUDIO_DSP_SETTINGS.SrcChannelCount
// X3DAUDIO_DSP_SETTINGS.DstChannelCount
//
// If X3DAUDIO_EMITTER.pChannelAzimuths is left NULL for multi-channel emitters,
// a default channel radius and channel azimuth array will be applied below.
// Distance curves such as X3DAUDIO_EMITTER.pVolumeCurve should be
// left NULL as XACT's native RPCs will be used to define DSP behaviour
// with respect to normalized distance.
//
// See X3DAudio.h for information regarding X3DAudio types.
//
// PARAMETERS:
// X3DInstance - [in] X3DAudio instance handle, returned from XACT3DInitialize()
// pListener - [in] point of 3D audio reception
// pEmitter - [in] 3D audio source
// pDSPSettings - [out] receives calculation results, applied to an XACT cue via XACT3DApply()
//
// RETURN VALUE:
// HResult error code
////
function XACT3DCalculate (const X3DInstance: TX3DAudioHandle; const pListener: TX3DAudioListener;
var pEmitter: TX3DAudioEmitter; var pDSPSettings: TX3DAudioDspSettings): HRESULT; cdecl;{$IFDEF SUPPORTS_INLINE} inline;{$ENDIF}
{$EXTERNALSYM XACT3DCalculate}
////
// DESCRIPTION:
// Applies results from a call to XACT3DCalculate() to a cue.
//
// PARAMETERS:
// pDSPSettings - [in] calculation results generated by XACT3DCalculate()
// pCue - [in] cue to which to apply pDSPSettings
//
// RETURN VALUE:
// HResult error code
////
function XACT3DApply(const pDSPSettings: TX3DAudioDspSettings; const pCue: IXACTCue;
ChannelCount: LongWord): HRESULT; cdecl;{$IFDEF SUPPORTS_INLINE} inline;{$ENDIF}
{$EXTERNALSYM XACT3DApply}
implementation
{.$IFDEF XBOX}
function XACTCreateEngine(dwCreationFlags: DWORD; out ppEngine: IXACTEngine): HRESULT; stdcall; // inline
var
key: HKEY;
data: DWORD;
type_: DWORD;
dataSize: DWORD;
debug: Boolean;
audition: Boolean;
guid: TGUID;
begin
type_ := REG_DWORD;
dataSize := SizeOf(DWORD);
debug := (dwCreationFlags and XACT_FLAG_API_DEBUG_MODE) <> 0;
audition := (dwCreationFlags and XACT_FLAG_API_AUDITION_MODE) <> 0;
// If neither the debug nor audition flags are set, see if the debug registry key is set
if (not debug and not audition and
(RegOpenKeyEx(HKEY_LOCAL_MACHINE, XACT_DEBUGENGINE_REGISTRY_KEY, 0, KEY_READ, key) = ERROR_SUCCESS)) then
begin
if RegQueryValueEx(key, XACT_DEBUGENGINE_REGISTRY_VALUE, nil, @type_, @data, @dataSize) = ERROR_SUCCESS
then debug := (data <> 0);
RegCloseKey(key);
end;
if audition then guid := CLSID_XACTAuditionEngine
else if debug then guid := CLSID_XACTDebugEngine
else guid := CLSID_XACTEngine;
// Priority order: Audition, Debug, Retail
Result:= CoCreateInstance(guid, nil, CLSCTX_INPROC_SERVER, IID_IXACTEngine, ppEngine);
// If debug engine does not exist fallback to retail version
if FAILED(Result) and debug and not audition then
begin
Result := CoCreateInstance(CLSID_XACTEngine, nil, CLSCTX_INPROC_SERVER, IID_IXACTEngine, ppEngine);
end;
end;
{.$ENDIF XBOX}
(***************************************************************************
* File: xact2wb.h
* Content: XACT 2 wave bank definitions.
****************************************************************************)
procedure SwapBytes(_dw_: PDWORD); overload;
asm
mov edi, _dw_
// mov edi, dw
mov eax, [edi]
bswap eax
mov [edi], eax
end;
// dw = _byteswap_ulong(dw); //todo: add inline in pure pascal case
procedure SwapBytes(w: PWORD); overload;
asm
mov edi, w
mov ax, [edi]
xchg ah, al
mov [edi], ax
end;
// w = _byteswap_ushort(w); //todo: add inline in pure pascal case
(***************************************************************************
* File: xact3d.h
* Content: XACT 3D support.
****************************************************************************)
////
// DESCRIPTION:
// Initializes the 3D API's:
//
// REMARKS:
// This method only needs to be called once
// The number of bits set in SpeakerChannelMask should equal the number of
// channels expected on the final mix.
//
// PARAMETERS:
// SpeakerChannelMask - [in] speaker geometry configuration on the final mix, specifies assignment of channels to speaker positions, defined as per WAVEFORMATEXTENSIBLE.dwChannelMask, must be != 0
// Currently only SPEAKER_STEREO and SPEAKER_5POINT1 is supported by X3DAudio.
// pEngine - [in] pointer to the XACT engine
// X3DInstance - [out] Handle to the X3DAudio instance
//
// RETURN VALUE:
// HResult error code
////
function XACT3DInitialize(const pEngine: IXACTEngine; out X3DInstance: TX3DAudioHandle): HRESULT; cdecl;{$IFDEF SUPPORTS_INLINE} inline;{$ENDIF}
var
xactSpeedOfSoundID: TXACTVariableIndex;
nSpeedOfSound: TXACTVariableValue;
wfxFinalMixFormat: TWaveFormatExtensible;
begin
Result := S_OK;
if (pEngine = nil) then Result := E_POINTER;
if SUCCEEDED(Result) then
begin
xactSpeedOfSoundID := pEngine.GetGlobalVariableIndex('SpeedOfSound');
Result := pEngine.GetGlobalVariable(xactSpeedOfSoundID, nSpeedOfSound);
end;
if SUCCEEDED(Result) then
begin
Result := pEngine.GetFinalMixFormat(wfxFinalMixFormat);
if SUCCEEDED(Result)
then X3DAudioInitialize(wfxFinalMixFormat.dwChannelMask, nSpeedOfSound, X3DInstance);
end;
end;
////
// DESCRIPTION:
// Calculates DSP settings with respect to 3D parameters:
//
// PARAMETERS:
// X3DInstance - [in] X3DAudio instance (returned from XACT3DInitialize)
// pListener - [in] point of 3D audio reception
// pEmitter - [in] 3D audio source
// pDSPSettings - [out] receives calculation results, applied to an XACT cue via XACT3DApply
//
// RETURN VALUE:
// HResult error code
////
function XACT3DCalculate(const X3DInstance: TX3DAudioHandle; const pListener: TX3DAudioListener;
var pEmitter: TX3DAudioEmitter; var pDSPSettings: TX3DAudioDspSettings): HRESULT; cdecl;{$IFDEF SUPPORTS_INLINE} inline;{$ENDIF}
begin
Result := S_OK;
{ if (pListener = nil) or (pEmitter = nil) or (pDSPSettings = nil)
then Result := E_POINTER; }
// if(SUCCEEDED(Result) then
if (pEmitter.ChannelCount > 1) and (pEmitter.pChannelAzimuths = nil) then
begin
pEmitter.ChannelRadius := 1.0;
case pEmitter.ChannelCount of
2: pEmitter.pChannelAzimuths := @aStereoLayout[0];
3: pEmitter.pChannelAzimuths := @a2Point1Layout[0];
4: pEmitter.pChannelAzimuths := @aQuadLayout[0];
5: pEmitter.pChannelAzimuths := @a4Point1Layout[0];
6: pEmitter.pChannelAzimuths := @a5Point1Layout[0];
8: pEmitter.pChannelAzimuths := @a7Point1Layout[0];
else
Result := E_FAIL;
end;
end;
if SUCCEEDED(Result) then
begin
if (pEmitter.pVolumeCurve = nil) then pEmitter.pVolumeCurve := @DefaultCurve;
if (pEmitter.pLFECurve = nil) then pEmitter.pLFECurve := @DefaultCurve;
X3DAudioCalculate(X3DInstance, pListener, pEmitter,
X3DAUDIO_CALCULATE_MATRIX or X3DAUDIO_CALCULATE_DOPPLER or X3DAUDIO_CALCULATE_EMITTER_ANGLE,
pDSPSettings);
end;
end;
////
// DESCRIPTION:
// Applies a 3D calculation returned by XACT3DCalculate to a cue:
//
// PARAMETERS:
// pDSPSettings - [in] calculation results generated by XACT3DCalculate
// pCue - [in] cue to which to apply pDSPSettings
// ChannelCount - [in] should be set equal to pDSPSettings->SrcChannelCount.
//
// RETURN VALUE:
// HResult error code
////
function XACT3DApply(const pDSPSettings: TX3DAudioDspSettings; const pCue: IXACTCue;
ChannelCount: LongWord): HRESULT; cdecl;{$IFDEF SUPPORTS_INLINE} inline;{$ENDIF}
var
xactDistanceID: TXACTVariableIndex;
xactDopplerID: TXACTVariableIndex;
xactOrientationID: TXACTVariableIndex;
begin
{ Result := S_OK;
if (pDSPSettings = nil) or )pCue = nil) then Result := E_POINTER;
if SUCCEEDED(Result) then }
Result := pCue.SetMatrixCoefficients(pDSPSettings.SrcChannelCount, pDSPSettings.DstChannelCount, pDSPSettings.pMatrixCoefficients);
if SUCCEEDED(Result) then
begin
xactDistanceID := pCue.GetVariableIndex('Distance');
Result := pCue.SetVariable(xactDistanceID, pDSPSettings.EmitterToListenerDistance);
end;
if SUCCEEDED(Result) then
begin
xactDopplerID := pCue.GetVariableIndex('DopplerPitchScalar');
Result := pCue.SetVariable(xactDopplerID, pDSPSettings.DopplerFactor);
end;
if SUCCEEDED(Result) then
begin
xactOrientationID := pCue.GetVariableIndex('OrientationAngle');
Result := pCue.SetVariable(xactOrientationID, pDSPSettings.EmitterToListenerAngle * (180.0 / X3DAUDIO_PI));
end;
end;
end.