Ada计算机图形DirectX之xact3wb

----------------------------------------
-- Microsoft DirectX Ada Binding Lib  --
-- File : xact3wb.ads                 --
-- Translator:Dongfeng.Gu,2018/11/05  --
-- Mail: 515639@qq.com                --
-- 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: 515639@qq.com                --
-- 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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值