ahi.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2005 Karoly Balogh for Genesi S.a.r.l.
  4. ahi.library interface unit for MorphOS/PowerPC
  5. Based on work of Nils Sjoholm member of the Amiga RTL
  6. development team.
  7. MorphOS port was done on a free Pegasos II/G4 machine
  8. provided by Genesi S.a.r.l. <www.genesi.lu>
  9. See the file COPYING.FPC, included in this distribution,
  10. for details about the copyright.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. **********************************************************************}
  15. {$PACKRECORDS 2}
  16. unit AHI;
  17. interface
  18. uses exec, utility;
  19. var
  20. AHIBase: PLibrary;
  21. type
  22. PFixed = ^Fixed;
  23. Fixed = LONGINT;
  24. { A fixed-point value, 16 bits
  25. to the left of the point and
  26. 16 bits to the right }
  27. type
  28. Psposition = ^sposition;
  29. sposition = Fixed;
  30. { AHIAudioCtrl }
  31. { Lots of private data follows! }
  32. PAHIAudioCtrl = ^tAHIAudioCtrl;
  33. tAHIAudioCtrl = record
  34. ahiac_UserData : Pointer;
  35. end;
  36. { AHISoundMessage }
  37. PAHISoundMessage = ^tAHISoundMessage;
  38. tAHISoundMessage = record
  39. ahism_Channel : Word;
  40. end;
  41. { AHIRecordMessage }
  42. PAHIRecordMessage = ^tAHIRecordMessage;
  43. tAHIRecordMessage = record
  44. ahirm_Type : Cardinal; { Format of buffer (object) }
  45. ahirm_Buffer : Pointer; { Pointer to the sample array }
  46. ahirm_Length : Cardinal; { Number of sample frames in buffer }
  47. end;
  48. { AHISampleInfo }
  49. PAHISampleInfo = ^tAHISampleInfo;
  50. tAHISampleInfo = record
  51. ahisi_Type : Cardinal; { Format of samples }
  52. ahisi_Address : Pointer; { Address to array of samples }
  53. ahisi_Length : Cardinal; { Number of samples in array }
  54. end;
  55. { AHIAudioModeRequester }
  56. PAHIAudioModeRequester = ^tAHIAudioModeRequester;
  57. tAHIAudioModeRequester = record
  58. ahiam_AudioID : Cardinal; { Selected audio mode }
  59. ahiam_MixFreq : Cardinal; { Selected mixing/sampling frequency }
  60. ahiam_LeftEdge : WORD; { Coordinates of requester on exit }
  61. ahiam_TopEdge : WORD;
  62. ahiam_Width : WORD;
  63. ahiam_Height : WORD;
  64. ahiam_InfoOpened : Boolean; { Info window opened on exit? }
  65. ahiam_InfoLeftEdge : WORD; { Last coordinates of Info window }
  66. ahiam_InfoTopEdge : WORD;
  67. ahiam_InfoWidth : WORD;
  68. ahiam_InfoHeight : WORD;
  69. ahiam_UserData : Pointer; { You can store your own data here }
  70. { Lots of private data follows! }
  71. end;
  72. { AHIEffMasterVolume }
  73. PAHIEffMasterVolume = ^tAHIEffMasterVolume;
  74. tAHIEffMasterVolume = record
  75. ahie_Effect : Cardinal; { Set to AHIET_MASTERVOLUME }
  76. ahiemv_Volume : Fixed; { See autodocs for range! }
  77. end;
  78. { AHIEffOutputBuffer }
  79. PAHIEffOutputBuffer = ^tAHIEffOutputBuffer;
  80. tAHIEffOutputBuffer = record
  81. ahie_Effect : Cardinal; { Set to AHIET_OUTPUTBUFFER }
  82. ahieob_Func : PHook;
  83. { These fields are filled by AHI }
  84. ahieob_Type : Cardinal; { Format of buffer }
  85. ahieob_Buffer : Pointer; { Pointer to the sample array }
  86. ahieob_Length : Cardinal; { Number of sample frames in buffer }
  87. end;
  88. { AHIEffDSPMask (V4) }
  89. PAHIEffDSPMask = ^tAHIEffDSPMask;
  90. tAHIEffDSPMask = record
  91. ahie_Effect : Cardinal; { Set to AHIET_DSPMASK }
  92. ahiedm_Channels : Word; { Number of elements in array }
  93. ahiedm_Mask : array[0..0] of Byte; { Here follows the array }
  94. end;
  95. const
  96. AHIEDM_WET = 0;
  97. AHIEDM_DRY = 1;
  98. { AHIEffDSPEcho (V4) }
  99. type
  100. PAHIDSPEcho = ^tAHIDSPEcho;
  101. tAHIDSPEcho = record
  102. ahie_Effect : Cardinal; { Set to AHIET_DSPECHO }
  103. ahiede_Delay : Cardinal; { In samples }
  104. ahiede_Feedback : Fixed;
  105. ahiede_Mix : Fixed;
  106. ahiede_Cross : Fixed;
  107. end;
  108. { AHIEffChannelInfo (V4) }
  109. PAHIEffChannelInfo = ^tAHIEffChannelInfo;
  110. tAHIEffChannelInfo = record
  111. ahie_Effect : Cardinal; { Set to AHIET_CHANNELINFO }
  112. ahieci_Func : PHook;
  113. ahieci_Channels : Word;
  114. ahieci_Pad : Word;
  115. { The rest is filled by AHI }
  116. ahieci_Offset : array[0..0] of Cardinal; { The array follows }
  117. end;
  118. { TAGS }
  119. const
  120. AHI_TagBase = TAG_USER;
  121. AHI_TagBaseR = AHI_TagBase or $8000;
  122. { AHI_AllocAudioA tags }
  123. { Desired audio mode }
  124. AHIA_AudioID = AHI_TagBase + 1;
  125. { Suggested mixing frequency }
  126. AHIA_MixFreq = AHI_TagBase + 2;
  127. { Suggested number of channels }
  128. AHIA_Channels = AHI_TagBase + 3;
  129. { Number of sounds to use }
  130. AHIA_Sounds = AHI_TagBase + 4;
  131. { End-of-Sound Hook }
  132. AHIA_SoundFunc = AHI_TagBase + 5;
  133. { Player Hook }
  134. AHIA_PlayerFunc = AHI_TagBase + 6;
  135. { Frequency for player Hook (Fixed) }
  136. AHIA_PlayerFreq = AHI_TagBase + 7;
  137. { Minimum Frequency for player Hook }
  138. AHIA_MinPlayerFreq = AHI_TagBase + 8;
  139. { Maximum Frequency for player Hook }
  140. AHIA_MaxPlayerFreq = AHI_TagBase + 9;
  141. { Sample recording Hook }
  142. AHIA_RecordFunc = AHI_TagBase + 10;
  143. { What to put in ahiac_UserData }
  144. AHIA_UserData = AHI_TagBase + 11;
  145. { AHI_PlayA tags (V4) }
  146. { All command tags should be... }
  147. AHIP_BeginChannel = AHI_TagBase + 40;
  148. { ... enclosed by these tags. }
  149. AHIP_EndChannel = AHI_TagBase + 41;
  150. AHIP_Freq = AHI_TagBase + 50;
  151. AHIP_Vol = AHI_TagBase + 51;
  152. AHIP_Pan = AHI_TagBase + 52;
  153. AHIP_Sound = AHI_TagBase + 53;
  154. AHIP_Offset = AHI_TagBase + 54;
  155. AHIP_Length = AHI_TagBase + 55;
  156. AHIP_LoopFreq = AHI_TagBase + 60;
  157. AHIP_LoopVol = AHI_TagBase + 61;
  158. AHIP_LoopPan = AHI_TagBase + 62;
  159. AHIP_LoopSound = AHI_TagBase + 63;
  160. AHIP_LoopOffset = AHI_TagBase + 64;
  161. AHIP_LoopLength = AHI_TagBase + 65;
  162. { AHI_ControlAudioA tags }
  163. { Booleanean }
  164. AHIC_Play = AHI_TagBase + 80;
  165. { Booleanean }
  166. AHIC_Record = AHI_TagBase + 81;
  167. AHIC_MonitorVolume = AHI_TagBase + 82;
  168. { ti_Data is pointer to Fixed (LONG) }
  169. AHIC_MonitorVolume_Query = AHI_TagBase + 83;
  170. { ti_Data is pointer to Cardinal }
  171. AHIC_MixFreq_Query = AHI_TagBase + 84;
  172. { --- New for V2, they will be ignored by V1 --- }
  173. AHIC_InputGain = AHI_TagBase + 85;
  174. { ti_Data is pointer to Fixed (LONG) }
  175. AHIC_InputGain_Query = AHI_TagBase + 86;
  176. AHIC_OutputVolume = AHI_TagBase + 87;
  177. { ti_Data is pointer to Fixed (LONG) }
  178. AHIC_OutputVolume_Query = AHI_TagBase + 88;
  179. AHIC_Input = AHI_TagBase + 89;
  180. { ti_Data is pointer to Cardinal }
  181. AHIC_Input_Query = AHI_TagBase + 90;
  182. AHIC_Output = AHI_TagBase + 91;
  183. { ti_Data is pointer to Cardinal }
  184. AHIC_Output_Query = AHI_TagBase + 92;
  185. { AHI_GetAudioAttrsA tags }
  186. AHIDB_AudioID = AHI_TagBase + 100;
  187. { Pointer to name of driver }
  188. AHIDB_Driver = AHI_TagBaseR + 101;
  189. { Private! }
  190. AHIDB_Flags = AHI_TagBase + 102;
  191. { Booleanean }
  192. AHIDB_Volume = AHI_TagBase + 103;
  193. { Booleanean }
  194. AHIDB_Panning = AHI_TagBase + 104;
  195. { Booleanean }
  196. AHIDB_Stereo = AHI_TagBase + 105;
  197. { Booleanean }
  198. AHIDB_HiFi = AHI_TagBase + 106;
  199. { Booleanean }
  200. AHIDB_PingPong = AHI_TagBase + 107;
  201. { Private! }
  202. AHIDB_MultTable = AHI_TagBase + 108;
  203. { Pointer to name of this mode }
  204. AHIDB_Name = AHI_TagBaseR + 109;
  205. { Output bits }
  206. AHIDB_Bits = AHI_TagBase + 110;
  207. { Max supported channels }
  208. AHIDB_MaxChannels = AHI_TagBase + 111;
  209. { Min mixing freq. supported }
  210. AHIDB_MinMixFreq = AHI_TagBase + 112;
  211. { Max mixing freq. supported }
  212. AHIDB_MaxMixFreq = AHI_TagBase + 113;
  213. { Booleanean }
  214. AHIDB_Record = AHI_TagBase + 114;
  215. AHIDB_Frequencies = AHI_TagBase + 115;
  216. { ti_Data is frequency index }
  217. AHIDB_FrequencyArg = AHI_TagBase + 116;
  218. AHIDB_Frequency = AHI_TagBase + 117;
  219. { Pointer to driver author name }
  220. AHIDB_Author = AHI_TagBase + 118;
  221. { Pointer to driver copyright notice }
  222. AHIDB_Copyright = AHI_TagBase + 119;
  223. { Pointer to driver version string }
  224. AHIDB_Version = AHI_TagBase + 120;
  225. { Pointer to driver annotation text }
  226. AHIDB_Annotation = AHI_TagBase + 121;
  227. { Specifies the string buffer size }
  228. AHIDB_BufferLen = AHI_TagBase + 122;
  229. { ti_Data is frequency! }
  230. AHIDB_IndexArg = AHI_TagBase + 123;
  231. AHIDB_Index = AHI_TagBase + 124;
  232. { Booleanean }
  233. AHIDB_Realtime = AHI_TagBase + 125;
  234. { It's sample frames }
  235. AHIDB_MaxPlaySamples = AHI_TagBase + 126;
  236. { It's sample frames }
  237. AHIDB_MaxRecordSamples = AHI_TagBase + 127;
  238. { Booleanean }
  239. AHIDB_FullDuplex = AHI_TagBase + 129;
  240. { --- New for V2, they will be ignored by V1 --- }
  241. AHIDB_MinMonitorVolume = AHI_TagBase + 130;
  242. AHIDB_MaxMonitorVolume = AHI_TagBase + 131;
  243. AHIDB_MinInputGain = AHI_TagBase + 132;
  244. AHIDB_MaxInputGain = AHI_TagBase + 133;
  245. AHIDB_MinOutputVolume = AHI_TagBase + 134;
  246. AHIDB_MaxOutputVolume = AHI_TagBase + 135;
  247. AHIDB_Inputs = AHI_TagBase + 136;
  248. { ti_Data is input index }
  249. AHIDB_InputArg = AHI_TagBase + 137;
  250. AHIDB_Input = AHI_TagBase + 138;
  251. AHIDB_Outputs = AHI_TagBase + 139;
  252. { ti_Data is input index }
  253. AHIDB_OutputArg = AHI_TagBase + 140;
  254. AHIDB_Output = AHI_TagBase + 141;
  255. { --- New for V4, they will be ignored by V2 and earlier --- }
  256. { Private! }
  257. AHIDB_Data = AHI_TagBaseR + 142;
  258. { AHI_BestAudioIDA tags }
  259. { --- New for V4, they will be ignored by V2 and earlier --- }
  260. AHIB_Dizzy = AHI_TagBase + 190;
  261. { AHI_AudioRequestA tags }
  262. { Window control }
  263. { Parent window }
  264. AHIR_Window = AHI_TagBase + 200;
  265. { Screen to open on if no window }
  266. AHIR_Screen = AHI_TagBase + 201;
  267. { Name of public screen }
  268. AHIR_PubScreenName = AHI_TagBase + 202;
  269. { Allocate private IDCMP? }
  270. AHIR_PrivateIDCMP = AHI_TagBase + 203;
  271. { Function to handle IntuiMessages }
  272. AHIR_IntuiMsgFunc = AHI_TagBase + 204;
  273. { Block input in AHIR_Window? }
  274. AHIR_SleepWindow = AHI_TagBase + 205;
  275. { What to put in ahiam_UserData }
  276. AHIR_UserData = AHI_TagBase + 206;
  277. { Text display }
  278. { Text font to use for gadget text }
  279. AHIR_TextAttr = AHI_TagBase + 220;
  280. { Locale to use for text }
  281. AHIR_Locale = AHI_TagBase + 221;
  282. { Title of requester }
  283. AHIR_TitleText = AHI_TagBase + 222;
  284. { Positive gadget text }
  285. AHIR_PositiveText = AHI_TagBase + 223;
  286. { Negative gadget text }
  287. AHIR_NegativeText = AHI_TagBase + 224;
  288. { Initial settings }
  289. { Initial requester coordinates }
  290. AHIR_InitialLeftEdge = AHI_TagBase + 240;
  291. AHIR_InitialTopEdge = AHI_TagBase + 241;
  292. { Initial requester dimensions }
  293. AHIR_InitialWidth = AHI_TagBase + 242;
  294. AHIR_InitialHeight = AHI_TagBase + 243;
  295. { Initial audio mode id }
  296. AHIR_InitialAudioID = AHI_TagBase + 244;
  297. { Initial mixing/sampling frequency }
  298. AHIR_InitialMixFreq = AHI_TagBase + 245;
  299. { Info window initially opened? }
  300. AHIR_InitialInfoOpened = AHI_TagBase + 246;
  301. { Initial Info window coords. }
  302. AHIR_InitialInfoLeftEdge = AHI_TagBase + 247;
  303. AHIR_InitialInfoTopEdge = AHI_TagBase + 248;
  304. { Not used! }
  305. AHIR_InitialInfoWidth = AHI_TagBase + 249;
  306. { Not used! }
  307. AHIR_InitialInfoHeight = AHI_TagBase + 250;
  308. { Options }
  309. { Allow selection of mixing frequency? }
  310. AHIR_DoMixFreq = AHI_TagBase + 260;
  311. { Allow selection of default mode? (V4) }
  312. AHIR_DoDefaultMode = AHI_TagBase + 261;
  313. { Filtering }
  314. { Pointer to filter taglist }
  315. AHIR_FilterTags = AHI_TagBase + 270;
  316. { Function to filter mode id's }
  317. AHIR_FilterFunc = AHI_TagBase + 271;
  318. { DEFS }
  319. AHINAME : PChar = 'ahi.device';
  320. { Invalid Audio ID }
  321. AHI_INVALID_ID = not (0);
  322. { Only for AHI_AllocAudioA()! }
  323. AHI_DEFAULT_ID = $00000000;
  324. { Special sample render Audio ID }
  325. AHI_LOOPBACK_ID = $00000001;
  326. { Only for AHI_AllocAudioA()! }
  327. AHI_DEFAULT_FREQ = 0;
  328. { Special frequency for AHI_SetFreq() }
  329. AHI_MIXFREQ = not (0);
  330. { Turns a channel off }
  331. AHI_NOSOUND = $ffff;
  332. { Set#? Flags }
  333. AHISF_IMM = 1 shl 0;
  334. AHISB_IMM = 0;
  335. { Effect Types }
  336. { OR with effect to disable }
  337. AHIET_CANCEL = 1 shl 31;
  338. AHIET_MASTERVOLUME = 1;
  339. AHIET_OUTPUTBUFFER = 2;
  340. { --- New for V4 --- }
  341. AHIET_DSPMASK = 3;
  342. AHIET_DSPECHO = 4;
  343. AHIET_CHANNELINFO = 5;
  344. { Sound Types }
  345. { Private }
  346. AHIST_NOTYPE = not (0);
  347. { 8 or 16 bit sample }
  348. AHIST_SAMPLE = 0;
  349. { Dynamic sample }
  350. AHIST_DYNAMICSAMPLE = 1;
  351. { The input from your sampler }
  352. AHIST_INPUT = 1 shl 29;
  353. { Private }
  354. AHIST_BW = 1 shl 30;
  355. { Sample types }
  356. { Note that only AHIST_M8S, AHIST_S8S, AHIST_M16S and AHIST_S16S
  357. are supported by AHI_LoadSound(). }
  358. { Mono, 8 bit signed (BYTE) }
  359. AHIST_M8S = 0;
  360. { Mono, 16 bit signed (WORD) }
  361. AHIST_M16S = 1;
  362. { Stereo, 8 bit signed (2×BYTE) }
  363. AHIST_S8S = 2;
  364. { Stereo, 16 bit signed (2×WORD) }
  365. AHIST_S16S = 3;
  366. { Mono, 32 bit signed (LONG) }
  367. AHIST_M32S = 8;
  368. { Stereo, 32 bit signed (2×LONG) }
  369. AHIST_S32S = 10;
  370. { OBSOLETE! }
  371. AHIST_M8U = 4;
  372. { Error codes }
  373. { No error }
  374. AHIE_OK = 0;
  375. { Out of memory }
  376. AHIE_NOMEM = 1;
  377. { Unknown sound type }
  378. AHIE_BADSOUNDTYPE = 2;
  379. { Unknown/unsupported sample type }
  380. AHIE_BADSAMPLETYPE = 3;
  381. { User-triggered abortion }
  382. AHIE_ABORTED = 4;
  383. { Error, but unknown }
  384. AHIE_UNKNOWN = 5;
  385. { CMD_WRITE/CMD_READ failure }
  386. AHIE_HALFDUPLEX = 6;
  387. { DEVICE INTERFACE DEFINITIONS FOLLOWS }
  388. { Device units }
  389. AHI_DEFAULT_UNIT = 0;
  390. AHI_NO_UNIT = 255;
  391. { The preference file }
  392. ID_AHIU = $41484955;
  393. ID_AHIG = $41484947;
  394. type
  395. PAHIUnitPrefs = ^tAHIUnitPrefs;
  396. tAHIUnitPrefs = record
  397. ahiup_Unit : Byte;
  398. ahiup_Pad : Byte;
  399. ahiup_Channels : Word;
  400. ahiup_AudioMode : Cardinal;
  401. ahiup_Frequency : Cardinal;
  402. ahiup_MonitorVolume : Fixed;
  403. ahiup_InputGain : Fixed;
  404. ahiup_OutputVolume : Fixed;
  405. ahiup_Input : Cardinal;
  406. ahiup_Output : Cardinal;
  407. end;
  408. PAHIGlobalPrefs = ^tAHIGlobalPrefs;
  409. tAHIGlobalPrefs = record
  410. ahigp_DebugLevel : Word; { Range: 0-3 (for None, Low,}
  411. ahigp_DisableSurround : Boolean; { High and All) }
  412. ahigp_DisableEcho : Boolean;
  413. ahigp_FastEcho : Boolean;
  414. ahigp_MaxCPU : Fixed;
  415. ahigp_ClipMasterVolume : Boolean;
  416. end;
  417. { Debug levels }
  418. const
  419. AHI_DEBUG_NONE = 0;
  420. AHI_DEBUG_LOW = 1;
  421. AHI_DEBUG_HIGH = 2;
  422. AHI_DEBUG_ALL = 3;
  423. { AHIRequest }
  424. type
  425. PAHIRequest = ^tAHIRequest;
  426. tAHIRequest = record
  427. ahir_Std : tIOStdReq; { Standard IO request }
  428. ahir_Version : Word; { Needed version }
  429. { --- New for V4, they will be ignored by V2 and earlier --- }
  430. ahir_Pad1 : Word;
  431. ahir_Private : array[0..1] of Cardinal; { Hands off! }
  432. ahir_Type : Cardinal; { Sample format }
  433. ahir_Frequency : Cardinal; { Sample/Record frequency }
  434. ahir_Volume : Fixed; { Sample volume }
  435. ahir_Position : Fixed; { Stereo position }
  436. ahir_Link : PAHIRequest; { For double buffering }
  437. end;
  438. { Flags for OpenDevice() }
  439. const
  440. AHIDF_NOMODESCAN = 1 shl 0;
  441. AHIDB_NOMODESCAN = 0;
  442. function AHI_AllocAudioA(tagList : pTagItem location 'a1') : pAHIAudioCtrl;
  443. SysCall AHIBase 042;
  444. procedure AHI_FreeAudio(AudioCtrl : pAHIAudioCtrl location 'a2');
  445. SysCall AHIBase 048;
  446. procedure AHI_KillAudio;
  447. SysCall AHIBase 054;
  448. function AHI_ControlAudioA(AudioCtrl : pAHIAudioCtrl location 'a2'; tagList : pTagItem location 'a1') : Cardinal;
  449. SysCall AHIBase 060;
  450. procedure AHI_SetVol(Channel : Word location 'd0'; Volume : LongInt location 'd1'; Pan : LongInt location 'd2'; AudioCtrl : pAHIAudioCtrl location 'a2'; Flags : Cardinal location 'd3');
  451. SysCall AHIBase 066;
  452. procedure AHI_SetFreq(Channel : Word location 'd0'; Freq : Cardinal location 'd1'; AudioCtrl : pAHIAudioCtrl location 'a2'; Flags : Cardinal location 'd2');
  453. SysCall AHIBase 072;
  454. procedure AHI_SetSound(Channel : Word location 'd0'; Sound : Word location 'd1'; Offset : Cardinal location 'd2'; Length : LongInt location 'd3'; AudioCtrl : pAHIAudioCtrl location 'a2'; Flags : Cardinal location 'd4');
  455. SysCall AHIBase 078;
  456. function AHI_SetEffect(Effect : Pointer location 'a0'; AudioCtrl : pAHIAudioCtrl location 'a2') : Cardinal;
  457. SysCall AHIBase 084;
  458. function AHI_LoadSound(Sound : Word location 'd0'; SType : Cardinal location 'd1'; Info : Pointer location 'a0'; AudioCtrl : pAHIAudioCtrl location 'a2') : Cardinal;
  459. SysCall AHIBase 090;
  460. procedure AHI_UnloadSound(Sound : Word location 'd0'; Audioctrl : pAHIAudioCtrl location 'a2');
  461. SysCall AHIBase 096;
  462. function AHI_NextAudioID(Last_ID : Cardinal location 'd0') : Cardinal;
  463. SysCall AHIBase 102;
  464. function AHI_GetAudioAttrsA(ID : Cardinal location 'd0'; Audioctrl : pAHIAudioCtrl location 'a2'; tagList : pTagItem location 'a1') : BOOLEAN;
  465. SysCall AHIBase 108;
  466. function AHI_BestAudioIDA(tagList : pTagItem location 'a1') : Cardinal;
  467. SysCall AHIBase 114;
  468. function AHI_AllocAudioRequestA(tagList : pTagItem location 'a0') : pAHIAudioModeRequester;
  469. SysCall AHIBase 120;
  470. function AHI_AudioRequestA(Requester : pAHIAudioModeRequester location 'a0'; tagList : pTagItem location 'a1') : BOOLEAN;
  471. SysCall AHIBase 126;
  472. procedure AHI_FreeAudioRequest(Requester : pAHIAudioModeRequester location 'a0');
  473. SysCall AHIBase 132;
  474. procedure AHI_PlayA(Audioctrl : pAHIAudioCtrl location 'a2'; tagList : pTagItem location 'a1');
  475. SysCall AHIBase 138;
  476. function AHI_SampleFrameSize(SampleType : Cardinal location 'd0') : Cardinal;
  477. SysCall AHIBase 144;
  478. function AHI_AddAudioMode(a0arg : pTagItem location 'a0') : Cardinal;
  479. SysCall AHIBase 150;
  480. function AHI_RemoveAudioMode(d0arg : Cardinal location 'd0') : Cardinal;
  481. SysCall AHIBase 156;
  482. function AHI_LoadModeFile(a0arg : PChar location 'a0') : Cardinal;
  483. SysCall AHIBase 162;
  484. {
  485. Functions and procedures with tags
  486. }
  487. function AHI_AllocAudio(tagList : array of DWord): pAHIAudioCtrl;
  488. function AHI_ControlAudio(AudioCtrl : pAHIAudioCtrl; tagList : array Of DWord) : Cardinal;
  489. function AHI_GetAudioAttrs(ID : CARDINAL; Audioctrl : pAHIAudioCtrl; taglist : array of DWord) : Boolean;
  490. function AHI_BestAudioID(taglist : array of DWord) : Cardinal;
  491. function AHI_AllocAudioRequest(taglist : array of DWord) : pAHIAudioModeRequester;
  492. function AHI_AudioRequest(Requester : pAHIAudioModeRequester; taglist : array of DWord) : Boolean;
  493. procedure AHI_Play(Audioctrl : pAHIAudioCtrl; taglist : array of DWord);
  494. function InitAHILibrary : boolean;
  495. implementation
  496. function AHI_AllocAudio(tagList : array of DWord): pAHIAudioCtrl;
  497. begin
  498. AHI_AllocAudio:=AHI_AllocAudioA(@taglist);
  499. end;
  500. function AHI_AllocAudioRequest(taglist : array of DWord) : pAHIAudioModeRequester;
  501. begin
  502. AHI_AllocAudioRequest:=AHI_AllocAudioRequestA(@taglist);
  503. end;
  504. function AHI_AudioRequest(Requester : pAHIAudioModeRequester; taglist : array of DWord) : Boolean;
  505. begin
  506. AHI_AudioRequest:=AHI_AudioRequestA(Requester,@taglist);
  507. end;
  508. function AHI_BestAudioID(taglist : array of DWord) : longword;
  509. begin
  510. AHI_BestAudioID:=AHI_BestAudioIDA(@taglist);
  511. end;
  512. function AHI_ControlAudio(AudioCtrl : pAHIAudioCtrl; taglist : array of DWord) : longword;
  513. begin
  514. AHI_ControlAudio:=AHI_ControlAudioA(AudioCtrl,@taglist);
  515. end;
  516. function AHI_GetAudioAttrs(ID : longword; Audioctrl : pAHIAudioCtrl; taglist : array of DWord) : Boolean;
  517. begin
  518. AHI_GetAudioAttrs:=AHI_GetAudioAttrsA(ID,Audioctrl,@taglist);
  519. end;
  520. procedure AHI_Play(Audioctrl : pAHIAudioCtrl; taglist : array of DWord);
  521. begin
  522. AHI_PlayA(Audioctrl,@taglist);
  523. end;
  524. const
  525. { Change VERSION and LIBVERSION to proper values }
  526. VERSION : string[2] = '0';
  527. LIBVERSION : longword = 0;
  528. var
  529. ahi_exit : Pointer;
  530. procedure CloseAHILibrary;
  531. begin
  532. ExitProc := ahi_exit;
  533. if AHIBase <> nil then begin
  534. CloseLibrary(PLibrary(AHIBase));
  535. AHIBase := nil;
  536. end;
  537. end;
  538. function InitAHILibrary : boolean;
  539. begin
  540. AHIBase := nil;
  541. AHIBase := OpenLibrary(AHINAME,LIBVERSION);
  542. if AHIBase <> nil then begin
  543. ahi_exit := ExitProc;
  544. ExitProc := @CloseAhiLibrary;
  545. InitAhiLibrary:=True;
  546. end else begin
  547. InitAhiLibrary:=False;
  548. end;
  549. end;
  550. end. (* UNIT AHI *)