----------------------------------------
-- Microsoft DirectX Ada Binding Lib --
-- File : xact3wb.ads --
-- Translator:Dongfeng.Gu,2018/11/05 --
-- Mail: [email protected] --
-- Progress:100% --
----------------------------------------
with win32; use win32;
with win32.rpcdce;
with win32.Winerror; use win32.Winerror;
with win32.winbase;
with win32.windef; use win32.windef;
with win32.winnt; use win32.winnt;
with win32.objbase; use win32.objbase;
with win32.crt.Limits; use win32.crt.Limits;
with Interfaces.C;
package xact3wb is
WAVEBANK_HEADER_SIGNATURE : constant String:= "DNBW"&Character'First; -- WaveBank RIFF chunk signature;
WAVEBANK_HEADER_VERSION : constant := 44; -- Current wavebank file version;
WAVEBANK_BANKNAME_LENGTH : constant := 64; -- Wave bank friendly name length, in characters;
WAVEBANK_ENTRYNAME_LENGTH : constant := 64; -- Wave bank entry friendly name length, in characters;
WAVEBANK_MAX_DATA_SEGMENT_SIZE : constant := 16#FFFFFFFF#; -- Maximum wave bank data segment size, in bytes;
WAVEBANK_MAX_COMPACT_DATA_SEGMENT_SIZE : constant := 16#001FFFFF#; -- Maximum compact wave bank data segment size, in bytes;
subtype WAVEBANKOFFSET is DWORD;
WAVEBANK_TYPE_BUFFER : constant := 16#00000000#; -- In-memory buffer;
WAVEBANK_TYPE_STREAMING : constant := 16#00000001#; -- Streaming;
WAVEBANK_TYPE_MASK : constant := 16#00000001#;
WAVEBANK_FLAGS_ENTRYNAMES : constant := 16#00010000#; -- Bank includes entry names;
WAVEBANK_FLAGS_COMPACT : constant := 16#00020000#; -- Bank uses compact format;
WAVEBANK_FLAGS_SYNC_DISABLED : constant := 16#00040000#; -- Bank is disabled for audition sync;
WAVEBANK_FLAGS_SEEKTABLES : constant := 16#00080000#; -- Bank includes seek tables.;
WAVEBANK_FLAGS_MASK : constant := 16#000F0000#;
WAVEBANKENTRY_FLAGS_READAHEAD : constant := 16#00000001#; -- Enable stream read-ahead;
WAVEBANKENTRY_FLAGS_LOOPCACHE : constant := 16#00000002#; -- One or more looping sounds use this wave;
WAVEBANKENTRY_FLAGS_REMOVELOOPTAIL : constant := 16#00000004#; -- Remove data after the end of the loop region;
WAVEBANKENTRY_FLAGS_IGNORELOOP : constant := 16#00000008#; -- Used internally when the loop region can't be used;
WAVEBANKENTRY_FLAGS_MASK : constant := 16#00000008#;
WAVEBANKMINIFORMAT_TAG_PCM : constant := 16#0#; -- PCM data;
WAVEBANKMINIFORMAT_TAG_XMA : constant := 16#1#; -- XMA data;
WAVEBANKMINIFORMAT_TAG_ADPCM : constant := 16#2#; -- ADPCM data;
WAVEBANKMINIFORMAT_TAG_WMA : constant := 16#3#; -- WMA data;
WAVEBANKMINIFORMAT_BITDEPTH_8 : constant := 16#0#; -- 8-bit data (PCM only);
WAVEBANKMINIFORMAT_BITDEPTH_16 : constant := 16#1#; -- 16-bit data (PCM only);
WAVEBANKENTRY_XMASTREAMS_MAX : constant := 3; -- enough for 5.1 channel audio;
WAVEBANKENTRY_XMACHANNELS_MAX : constant := 6; -- enough for 5.1 channel audio (cf. XAUDIOCHANNEL_SOURCEMAX);
WAVEBANK_DVD_SECTOR_SIZE : constant := 2048;
WAVEBANK_DVD_BLOCK_SIZE : constant := (WAVEBANK_DVD_SECTOR_SIZE * 16);
WAVEBANK_ALIGNMENT_MIN : constant := 4; -- Minimum alignment;
WAVEBANK_ALIGNMENT_DVD : constant := WAVEBANK_DVD_SECTOR_SIZE; -- DVD-optimized alignment;
type WAVEBANKSEGIDX is (WAVEBANK_SEGIDX_BANKDATA,
WAVEBANK_SEGIDX_ENTRYMETADATA,
WAVEBANK_SEGIDX_SEEKTABLES,
WAVEBANK_SEGIDX_ENTRYNAMES,
WAVEBANK_SEGIDX_ENTRYWAVEDATA,
WAVEBANK_SEGIDX_COUNT);
for WAVEBANKSEGIDX use (WAVEBANK_SEGIDX_BANKDATA=>0,
WAVEBANK_SEGIDX_ENTRYMETADATA=>1,
WAVEBANK_SEGIDX_SEEKTABLES=>2,
WAVEBANK_SEGIDX_ENTRYNAMES=>3,
WAVEBANK_SEGIDX_ENTRYWAVEDATA=>4,
WAVEBANK_SEGIDX_COUNT=>5);
type LPWAVEBANKSEGIDX is access WAVEBANKSEGIDX;
type LPCWAVEBANKSEGIDX is access constant WAVEBANKSEGIDX;
-- xact3.h:126,namespace
package XACTWaveBank is
procedure SwapBytes(dw:access DWORD) with Inline_Always;
procedure SwapBytes(w:access WORD) with Inline_Always;
end XACTWaveBank;
type WAVEBANKREGION is record
dwOffset: DWORD;
dwLength: DWORD;
end record;
type LPWAVEBANKREGION is access all WAVEBANKREGION;
type LPCWAVEBANKREGION is access constant WAVEBANKREGION;
type WAVEBANKREGION_Array is array(Natural range<>) of WAVEBANKREGION;
type WAVEBANKSAMPLEREGION is record
dwStartSample: DWORD;
dwTotalSamples: DWORD;
end record;
type LPWAVEBANKSAMPLEREGION is access all WAVEBANKSAMPLEREGION;
type LPCWAVEBANKSAMPLEREGION is access constant WAVEBANKSAMPLEREGION;
type WAVEBANKHEADER is record
dwSignature: DWORD;
dwVersion: DWORD;
dwHeaderVersion: DWORD;
Segments: WAVEBANKREGION_Array(0..5-1);
end record;
type LPWAVEBANKHEADER is access all WAVEBANKHEADER;
type LPCWAVEBANKHEADER is access constant WAVEBANKHEADER;
MAX_WMA_AVG_BYTES_PER_SEC_ENTRIES : constant := 7;
aWMAAvgBytesPerSec:constant DWORD_Array:=(12000,
24000,
4000,
6000,
8000,
20000,
2500);
MAX_WMA_BLOCK_ALIGN_ENTRIES : constant := 17;
aWMABlockAlign:constant DWORD_Array:=(929,
1487,
1280,
2230,
8917,
8192,
4459,
5945,
2304,
1536,
1485,
1008,
2731,
4096,
6827,
5462,
1280
);
pragma Implicit_Packing;
type WAVEBANKMINIWAVEFORMAT(b:Boolean:=True) is record
case b is
when True=>
wFormatTag:Bits2;
nChannels:Bits3;
nSamplesPerSec:Bits18;
wBlockAlign:Bits8;
wBitsPerSample:Bits1;
when False=>
dwValue:DWORD;
end case;
end record with Unchecked_Union,size=>32;
type LPWAVEBANKMINIWAVEFORMAT is access all WAVEBANKMINIWAVEFORMAT;
type LPCWAVEBANKMINIWAVEFORMAT is access constant WAVEBANKMINIWAVEFORMAT;
type WAVEBANKENTRY_UNNAMED_UNION_1(b:Boolean:=True) is record
case b is
when True=>
dwFlags:Bits4;
Duration:Bits28;
when False=>
dwFlagsAndDuration:DWORD;
end case;
end record with Unchecked_Union,size=>32;
type WAVEBANKENTRY is record
u1:WAVEBANKENTRY_UNNAMED_UNION_1;
Format:WAVEBANKMINIWAVEFORMAT;
PlayRegion:WAVEBANKREGION;
LoopRegion:WAVEBANKSAMPLEREGION;
end record;
type LPWAVEBANKENTRY is access all WAVEBANKENTRY;
type LPCWAVEBANKENTRY is access constant WAVEBANKENTRY;
pragma Implicit_Packing;
type WAVEBANKENTRYCOMPACT is record
dwOffset: Bits21;
dwLengthDeviation: Bits11;
end record with size=>32;
type LPWAVEBANKENTRYCOMPACT is access all WAVEBANKENTRYCOMPACT;
type LPCWAVEBANKENTRYCOMPACT is access constant WAVEBANKENTRYCOMPACT;
type WAVEBANKDATA is record
dwFlags: DWORD;
dwEntryCount: DWORD;
szBankName: CHAR_Array(0..WAVEBANK_BANKNAME_LENGTH-1);
dwEntryMetaDataElementSize: DWORD;
dwEntryNameElementSize: DWORD;
dwAlignment: DWORD;
CompactFormat: WAVEBANKMINIWAVEFORMAT;
BuildTime: winbase.FILETIME;
end record;
type LPWAVEBANKDATA is access all WAVEBANKDATA;
type LPCWAVEBANKDATA is access constant WAVEBANKDATA;
--
-- THE END.
--
end xact3wb;
----------------------------------------
-- Microsoft DirectX Ada Binding Lib --
-- File : xact3wb.adb --
-- Translator:Dongfeng.Gu,2018/11/05 --
-- Mail: [email protected] --
-- Progress:100% --
----------------------------------------
with Machine_Code; use Machine_Code;
package body xact3wb is
package body XACTWaveBank is
NL:constant string:=ASCII.HT&ASCII.LF;
procedure SwapBytes(dw:access DWORD) is
begin
asm(
Inputs=>(LPDWORD'Asm_Input("edi",dw)),
template=>"movl (%%edi),%%eax"&NL&
"bswap %%eax"&NL&
"movl %%eax,(%%edi)",
outputs=>No_Output_Operands,
Volatile=>True
);
end SwapBytes;
procedure SwapBytes(w:access WORD) is
begin
asm(
Inputs=>(LPWORD'Asm_Input("edi",w)),
Template=>("movw (%%edi), %%ax"&NL&
"xchg %%al,%%ah"&NL&
"movw %%ax, (%%edi)"&NL
),
Outputs=>No_Output_Operands,
Volatile=>True
);
end SwapBytes;
end XACTWaveBank;
end xact3wb;