ahi.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. {
  2. This file is part of the Free Pascal run time library.
  3. A file in Amiga system run time library.
  4. Copyright (c) 2003 by Nils Sjöholm.
  5. member of the Amiga RTL development team.
  6. This is a unit for ahi.library
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. {
  14. History:
  15. First version of this unit.
  16. 14 Jan 2003.
  17. Changed cardinal > longword.
  18. Added startcode for unit.
  19. 12 Feb 2003.
  20. [email protected] Nils Sjoholm
  21. }
  22. {$mode objfpc}
  23. {$I useamigasmartlink.inc}
  24. {$ifdef use_amiga_smartlink}
  25. {$smartlink on}
  26. {$endif use_amiga_smartlink}
  27. UNIT AHI;
  28. INTERFACE
  29. USES Exec,utility;
  30. VAR AHIBase : pLibrary;
  31. {
  32. $VER: ahi.h 4.2 (27.4.97)
  33. ahi.device definitions
  34. (C) Copyright 1994-1997 Martin Blom
  35. All Rights Reserved.
  36. (TAB SIZE: 8)
  37. }
  38. type
  39. PFixed = ^Fixed;
  40. Fixed = LONGINT;
  41. { A fixed-point value, 16 bits
  42. to the left of the point and
  43. 16 bits to the right }
  44. type
  45. Psposition = ^sposition;
  46. sposition = Fixed;
  47. { AHIAudioCtrl }
  48. { Lots of private data follows! }
  49. PAHIAudioCtrl = ^tAHIAudioCtrl;
  50. tAHIAudioCtrl = record
  51. ahiac_UserData : APTR;
  52. end;
  53. { AHISoundMessage }
  54. PAHISoundMessage = ^tAHISoundMessage;
  55. tAHISoundMessage = record
  56. ahism_Channel : UWORD;
  57. end;
  58. { AHIRecordMessage }
  59. PAHIRecordMessage = ^tAHIRecordMessage;
  60. tAHIRecordMessage = record
  61. ahirm_Type : ULONG; { Format of buffer (object) }
  62. ahirm_Buffer : APTR; { Pointer to the sample array }
  63. ahirm_Length : ULONG; { Number of sample frames in buffer }
  64. end;
  65. { AHISampleInfo }
  66. PAHISampleInfo = ^tAHISampleInfo;
  67. tAHISampleInfo = record
  68. ahisi_Type : ULONG; { Format of samples }
  69. ahisi_Address : APTR; { Address to array of samples }
  70. ahisi_Length : ULONG; { Number of samples in array }
  71. end;
  72. { AHIAudioModeRequester }
  73. PAHIAudioModeRequester = ^tAHIAudioModeRequester;
  74. tAHIAudioModeRequester = record
  75. ahiam_AudioID : ULONG; { Selected audio mode }
  76. ahiam_MixFreq : ULONG; { Selected mixing/sampling frequency }
  77. ahiam_LeftEdge : WORD; { Coordinates of requester on exit }
  78. ahiam_TopEdge : WORD;
  79. ahiam_Width : WORD;
  80. ahiam_Height : WORD;
  81. ahiam_InfoOpened : BOOL; { Info window opened on exit? }
  82. ahiam_InfoLeftEdge : WORD; { Last coordinates of Info window }
  83. ahiam_InfoTopEdge : WORD;
  84. ahiam_InfoWidth : WORD;
  85. ahiam_InfoHeight : WORD;
  86. ahiam_UserData : APTR; { You can store your own data here }
  87. { Lots of private data follows! }
  88. end;
  89. { AHIEffMasterVolume }
  90. PAHIEffMasterVolume = ^tAHIEffMasterVolume;
  91. tAHIEffMasterVolume = record
  92. ahie_Effect : ULONG; { Set to AHIET_MASTERVOLUME }
  93. ahiemv_Volume : Fixed; { See autodocs for range! }
  94. end;
  95. { AHIEffOutputBuffer }
  96. PAHIEffOutputBuffer = ^tAHIEffOutputBuffer;
  97. tAHIEffOutputBuffer = record
  98. ahie_Effect : ULONG; { Set to AHIET_OUTPUTBUFFER }
  99. ahieob_Func : PHook;
  100. { These fields are filled by AHI }
  101. ahieob_Type : ULONG; { Format of buffer }
  102. ahieob_Buffer : APTR; { Pointer to the sample array }
  103. ahieob_Length : ULONG; { Number of sample frames in buffer }
  104. end;
  105. { AHIEffDSPMask (V4) }
  106. PAHIEffDSPMask = ^tAHIEffDSPMask;
  107. tAHIEffDSPMask = record
  108. ahie_Effect : ULONG; { Set to AHIET_DSPMASK }
  109. ahiedm_Channels : UWORD; { Number of elements in array }
  110. ahiedm_Mask : array[0..0] of UBYTE; { Here follows the array }
  111. end;
  112. const
  113. AHIEDM_WET = 0;
  114. AHIEDM_DRY = 1;
  115. { AHIEffDSPEcho (V4) }
  116. type
  117. PAHIDSPEcho = ^tAHIDSPEcho;
  118. tAHIDSPEcho = record
  119. ahie_Effect : ULONG; { Set to AHIET_DSPECHO }
  120. ahiede_Delay : ULONG; { In samples }
  121. ahiede_Feedback : Fixed;
  122. ahiede_Mix : Fixed;
  123. ahiede_Cross : Fixed;
  124. end;
  125. { AHIEffChannelInfo (V4) }
  126. PAHIEffChannelInfo = ^tAHIEffChannelInfo;
  127. tAHIEffChannelInfo = record
  128. ahie_Effect : ULONG; { Set to AHIET_CHANNELINFO }
  129. ahieci_Func : PHook;
  130. ahieci_Channels : UWORD;
  131. ahieci_Pad : UWORD;
  132. { The rest is filled by AHI }
  133. ahieci_Offset : array[0..0] of ULONG; { The array follows }
  134. end;
  135. { TAGS }
  136. const
  137. AHI_TagBase = TAG_USER;
  138. AHI_TagBaseR = AHI_TagBase or $8000;
  139. { AHI_AllocAudioA tags }
  140. { Desired audio mode }
  141. AHIA_AudioID = AHI_TagBase + 1;
  142. { Suggested mixing frequency }
  143. AHIA_MixFreq = AHI_TagBase + 2;
  144. { Suggested number of channels }
  145. AHIA_Channels = AHI_TagBase + 3;
  146. { Number of sounds to use }
  147. AHIA_Sounds = AHI_TagBase + 4;
  148. { End-of-Sound Hook }
  149. AHIA_SoundFunc = AHI_TagBase + 5;
  150. { Player Hook }
  151. AHIA_PlayerFunc = AHI_TagBase + 6;
  152. { Frequency for player Hook (Fixed) }
  153. AHIA_PlayerFreq = AHI_TagBase + 7;
  154. { Minimum Frequency for player Hook }
  155. AHIA_MinPlayerFreq = AHI_TagBase + 8;
  156. { Maximum Frequency for player Hook }
  157. AHIA_MaxPlayerFreq = AHI_TagBase + 9;
  158. { Sample recording Hook }
  159. AHIA_RecordFunc = AHI_TagBase + 10;
  160. { What to put in ahiac_UserData }
  161. AHIA_UserData = AHI_TagBase + 11;
  162. { AHI_PlayA tags (V4) }
  163. { All command tags should be... }
  164. AHIP_BeginChannel = AHI_TagBase + 40;
  165. { ... enclosed by these tags. }
  166. AHIP_EndChannel = AHI_TagBase + 41;
  167. AHIP_Freq = AHI_TagBase + 50;
  168. AHIP_Vol = AHI_TagBase + 51;
  169. AHIP_Pan = AHI_TagBase + 52;
  170. AHIP_Sound = AHI_TagBase + 53;
  171. AHIP_Offset = AHI_TagBase + 54;
  172. AHIP_Length = AHI_TagBase + 55;
  173. AHIP_LoopFreq = AHI_TagBase + 60;
  174. AHIP_LoopVol = AHI_TagBase + 61;
  175. AHIP_LoopPan = AHI_TagBase + 62;
  176. AHIP_LoopSound = AHI_TagBase + 63;
  177. AHIP_LoopOffset = AHI_TagBase + 64;
  178. AHIP_LoopLength = AHI_TagBase + 65;
  179. { AHI_ControlAudioA tags }
  180. { Boolean }
  181. AHIC_Play = AHI_TagBase + 80;
  182. { Boolean }
  183. AHIC_Record = AHI_TagBase + 81;
  184. AHIC_MonitorVolume = AHI_TagBase + 82;
  185. { ti_Data is pointer to Fixed (LONG) }
  186. AHIC_MonitorVolume_Query = AHI_TagBase + 83;
  187. { ti_Data is pointer to ULONG }
  188. AHIC_MixFreq_Query = AHI_TagBase + 84;
  189. { --- New for V2, they will be ignored by V1 --- }
  190. AHIC_InputGain = AHI_TagBase + 85;
  191. { ti_Data is pointer to Fixed (LONG) }
  192. AHIC_InputGain_Query = AHI_TagBase + 86;
  193. AHIC_OutputVolume = AHI_TagBase + 87;
  194. { ti_Data is pointer to Fixed (LONG) }
  195. AHIC_OutputVolume_Query = AHI_TagBase + 88;
  196. AHIC_Input = AHI_TagBase + 89;
  197. { ti_Data is pointer to ULONG }
  198. AHIC_Input_Query = AHI_TagBase + 90;
  199. AHIC_Output = AHI_TagBase + 91;
  200. { ti_Data is pointer to ULONG }
  201. AHIC_Output_Query = AHI_TagBase + 92;
  202. { AHI_GetAudioAttrsA tags }
  203. AHIDB_AudioID = AHI_TagBase + 100;
  204. { Pointer to name of driver }
  205. AHIDB_Driver = AHI_TagBaseR + 101;
  206. { Private! }
  207. AHIDB_Flags = AHI_TagBase + 102;
  208. { Boolean }
  209. AHIDB_Volume = AHI_TagBase + 103;
  210. { Boolean }
  211. AHIDB_Panning = AHI_TagBase + 104;
  212. { Boolean }
  213. AHIDB_Stereo = AHI_TagBase + 105;
  214. { Boolean }
  215. AHIDB_HiFi = AHI_TagBase + 106;
  216. { Boolean }
  217. AHIDB_PingPong = AHI_TagBase + 107;
  218. { Private! }
  219. AHIDB_MultTable = AHI_TagBase + 108;
  220. { Pointer to name of this mode }
  221. AHIDB_Name = AHI_TagBaseR + 109;
  222. { Output bits }
  223. AHIDB_Bits = AHI_TagBase + 110;
  224. { Max supported channels }
  225. AHIDB_MaxChannels = AHI_TagBase + 111;
  226. { Min mixing freq. supported }
  227. AHIDB_MinMixFreq = AHI_TagBase + 112;
  228. { Max mixing freq. supported }
  229. AHIDB_MaxMixFreq = AHI_TagBase + 113;
  230. { Boolean }
  231. AHIDB_Record = AHI_TagBase + 114;
  232. AHIDB_Frequencies = AHI_TagBase + 115;
  233. { ti_Data is frequency index }
  234. AHIDB_FrequencyArg = AHI_TagBase + 116;
  235. AHIDB_Frequency = AHI_TagBase + 117;
  236. { Pointer to driver author name }
  237. AHIDB_Author = AHI_TagBase + 118;
  238. { Pointer to driver copyright notice }
  239. AHIDB_Copyright = AHI_TagBase + 119;
  240. { Pointer to driver version string }
  241. AHIDB_Version = AHI_TagBase + 120;
  242. { Pointer to driver annotation text }
  243. AHIDB_Annotation = AHI_TagBase + 121;
  244. { Specifies the string buffer size }
  245. AHIDB_BufferLen = AHI_TagBase + 122;
  246. { ti_Data is frequency! }
  247. AHIDB_IndexArg = AHI_TagBase + 123;
  248. AHIDB_Index = AHI_TagBase + 124;
  249. { Boolean }
  250. AHIDB_Realtime = AHI_TagBase + 125;
  251. { It's sample frames }
  252. AHIDB_MaxPlaySamples = AHI_TagBase + 126;
  253. { It's sample frames }
  254. AHIDB_MaxRecordSamples = AHI_TagBase + 127;
  255. { Boolean }
  256. AHIDB_FullDuplex = AHI_TagBase + 129;
  257. { --- New for V2, they will be ignored by V1 --- }
  258. AHIDB_MinMonitorVolume = AHI_TagBase + 130;
  259. AHIDB_MaxMonitorVolume = AHI_TagBase + 131;
  260. AHIDB_MinInputGain = AHI_TagBase + 132;
  261. AHIDB_MaxInputGain = AHI_TagBase + 133;
  262. AHIDB_MinOutputVolume = AHI_TagBase + 134;
  263. AHIDB_MaxOutputVolume = AHI_TagBase + 135;
  264. AHIDB_Inputs = AHI_TagBase + 136;
  265. { ti_Data is input index }
  266. AHIDB_InputArg = AHI_TagBase + 137;
  267. AHIDB_Input = AHI_TagBase + 138;
  268. AHIDB_Outputs = AHI_TagBase + 139;
  269. { ti_Data is input index }
  270. AHIDB_OutputArg = AHI_TagBase + 140;
  271. AHIDB_Output = AHI_TagBase + 141;
  272. { --- New for V4, they will be ignored by V2 and earlier --- }
  273. { Private! }
  274. AHIDB_Data = AHI_TagBaseR + 142;
  275. { AHI_BestAudioIDA tags }
  276. { --- New for V4, they will be ignored by V2 and earlier --- }
  277. AHIB_Dizzy = AHI_TagBase + 190;
  278. { AHI_AudioRequestA tags }
  279. { Window control }
  280. { Parent window }
  281. AHIR_Window = AHI_TagBase + 200;
  282. { Screen to open on if no window }
  283. AHIR_Screen = AHI_TagBase + 201;
  284. { Name of public screen }
  285. AHIR_PubScreenName = AHI_TagBase + 202;
  286. { Allocate private IDCMP? }
  287. AHIR_PrivateIDCMP = AHI_TagBase + 203;
  288. { Function to handle IntuiMessages }
  289. AHIR_IntuiMsgFunc = AHI_TagBase + 204;
  290. { Block input in AHIR_Window? }
  291. AHIR_SleepWindow = AHI_TagBase + 205;
  292. { What to put in ahiam_UserData }
  293. AHIR_UserData = AHI_TagBase + 206;
  294. { Text display }
  295. { Text font to use for gadget text }
  296. AHIR_TextAttr = AHI_TagBase + 220;
  297. { Locale to use for text }
  298. AHIR_Locale = AHI_TagBase + 221;
  299. { Title of requester }
  300. AHIR_TitleText = AHI_TagBase + 222;
  301. { Positive gadget text }
  302. AHIR_PositiveText = AHI_TagBase + 223;
  303. { Negative gadget text }
  304. AHIR_NegativeText = AHI_TagBase + 224;
  305. { Initial settings }
  306. { Initial requester coordinates }
  307. AHIR_InitialLeftEdge = AHI_TagBase + 240;
  308. AHIR_InitialTopEdge = AHI_TagBase + 241;
  309. { Initial requester dimensions }
  310. AHIR_InitialWidth = AHI_TagBase + 242;
  311. AHIR_InitialHeight = AHI_TagBase + 243;
  312. { Initial audio mode id }
  313. AHIR_InitialAudioID = AHI_TagBase + 244;
  314. { Initial mixing/sampling frequency }
  315. AHIR_InitialMixFreq = AHI_TagBase + 245;
  316. { Info window initially opened? }
  317. AHIR_InitialInfoOpened = AHI_TagBase + 246;
  318. { Initial Info window coords. }
  319. AHIR_InitialInfoLeftEdge = AHI_TagBase + 247;
  320. AHIR_InitialInfoTopEdge = AHI_TagBase + 248;
  321. { Not used! }
  322. AHIR_InitialInfoWidth = AHI_TagBase + 249;
  323. { Not used! }
  324. AHIR_InitialInfoHeight = AHI_TagBase + 250;
  325. { Options }
  326. { Allow selection of mixing frequency? }
  327. AHIR_DoMixFreq = AHI_TagBase + 260;
  328. { Allow selection of default mode? (V4) }
  329. AHIR_DoDefaultMode = AHI_TagBase + 261;
  330. { Filtering }
  331. { Pointer to filter taglist }
  332. AHIR_FilterTags = AHI_TagBase + 270;
  333. { Function to filter mode id's }
  334. AHIR_FilterFunc = AHI_TagBase + 271;
  335. { DEFS }
  336. AHINAME : PChar = 'ahi.device';
  337. { Invalid Audio ID }
  338. AHI_INVALID_ID = not (0);
  339. { Only for AHI_AllocAudioA()! }
  340. AHI_DEFAULT_ID = $00000000;
  341. { Special sample render Audio ID }
  342. AHI_LOOPBACK_ID = $00000001;
  343. { Only for AHI_AllocAudioA()! }
  344. AHI_DEFAULT_FREQ = 0;
  345. { Special frequency for AHI_SetFreq() }
  346. AHI_MIXFREQ = not (0);
  347. { Turns a channel off }
  348. AHI_NOSOUND = $ffff;
  349. { Set#? Flags }
  350. AHISF_IMM = 1 shl 0;
  351. AHISB_IMM = 0;
  352. { Effect Types }
  353. { OR with effect to disable }
  354. AHIET_CANCEL = 1 shl 31;
  355. AHIET_MASTERVOLUME = 1;
  356. AHIET_OUTPUTBUFFER = 2;
  357. { --- New for V4 --- }
  358. AHIET_DSPMASK = 3;
  359. AHIET_DSPECHO = 4;
  360. AHIET_CHANNELINFO = 5;
  361. { Sound Types }
  362. { Private }
  363. AHIST_NOTYPE = not (0);
  364. { 8 or 16 bit sample }
  365. AHIST_SAMPLE = 0;
  366. { Dynamic sample }
  367. AHIST_DYNAMICSAMPLE = 1;
  368. { The input from your sampler }
  369. AHIST_INPUT = 1 shl 29;
  370. { Private }
  371. AHIST_BW = 1 shl 30;
  372. { Sample types }
  373. { Note that only AHIST_M8S, AHIST_S8S, AHIST_M16S and AHIST_S16S
  374. are supported by AHI_LoadSound(). }
  375. { Mono, 8 bit signed (BYTE) }
  376. AHIST_M8S = 0;
  377. { Mono, 16 bit signed (WORD) }
  378. AHIST_M16S = 1;
  379. { Stereo, 8 bit signed (2×BYTE) }
  380. AHIST_S8S = 2;
  381. { Stereo, 16 bit signed (2×WORD) }
  382. AHIST_S16S = 3;
  383. { Mono, 32 bit signed (LONG) }
  384. AHIST_M32S = 8;
  385. { Stereo, 32 bit signed (2×LONG) }
  386. AHIST_S32S = 10;
  387. { OBSOLETE! }
  388. AHIST_M8U = 4;
  389. { Error codes }
  390. { No error }
  391. AHIE_OK = 0;
  392. { Out of memory }
  393. AHIE_NOMEM = 1;
  394. { Unknown sound type }
  395. AHIE_BADSOUNDTYPE = 2;
  396. { Unknown/unsupported sample type }
  397. AHIE_BADSAMPLETYPE = 3;
  398. { User-triggered abortion }
  399. AHIE_ABORTED = 4;
  400. { Error, but unknown }
  401. AHIE_UNKNOWN = 5;
  402. { CMD_WRITE/CMD_READ failure }
  403. AHIE_HALFDUPLEX = 6;
  404. { DEVICE INTERFACE DEFINITIONS FOLLOWS }
  405. { Device units }
  406. AHI_DEFAULT_UNIT = 0;
  407. AHI_NO_UNIT = 255;
  408. { The preference file }
  409. ID_AHIU = $41484955;
  410. ID_AHIG = $41484947;
  411. type
  412. PAHIUnitPrefs = ^tAHIUnitPrefs;
  413. tAHIUnitPrefs = record
  414. ahiup_Unit : UBYTE;
  415. ahiup_Pad : UBYTE;
  416. ahiup_Channels : UWORD;
  417. ahiup_AudioMode : ULONG;
  418. ahiup_Frequency : ULONG;
  419. ahiup_MonitorVolume : Fixed;
  420. ahiup_InputGain : Fixed;
  421. ahiup_OutputVolume : Fixed;
  422. ahiup_Input : ULONG;
  423. ahiup_Output : ULONG;
  424. end;
  425. PAHIGlobalPrefs = ^tAHIGlobalPrefs;
  426. tAHIGlobalPrefs = record
  427. ahigp_DebugLevel : UWORD; { Range: 0-3 (for None, Low,}
  428. ahigp_DisableSurround : BOOL; { High and All) }
  429. ahigp_DisableEcho : BOOL;
  430. ahigp_FastEcho : BOOL;
  431. ahigp_MaxCPU : Fixed;
  432. ahigp_ClipMasterVolume : BOOL;
  433. end;
  434. { Debug levels }
  435. const
  436. AHI_DEBUG_NONE = 0;
  437. AHI_DEBUG_LOW = 1;
  438. AHI_DEBUG_HIGH = 2;
  439. AHI_DEBUG_ALL = 3;
  440. { AHIRequest }
  441. type
  442. PAHIRequest = ^tAHIRequest;
  443. tAHIRequest = record
  444. ahir_Std : tIOStdReq; { Standard IO request }
  445. ahir_Version : UWORD; { Needed version }
  446. { --- New for V4, they will be ignored by V2 and earlier --- }
  447. ahir_Pad1 : UWORD;
  448. ahir_Private : array[0..1] of ULONG; { Hands off! }
  449. ahir_Type : ULONG; { Sample format }
  450. ahir_Frequency : ULONG; { Sample/Record frequency }
  451. ahir_Volume : Fixed; { Sample volume }
  452. ahir_Position : Fixed; { Stereo position }
  453. ahir_Link : PAHIRequest; { For double buffering }
  454. end;
  455. { Flags for OpenDevice() }
  456. const
  457. AHIDF_NOMODESCAN = 1 shl 0;
  458. AHIDB_NOMODESCAN = 0;
  459. FUNCTION AHI_AddAudioMode(a0arg : pTagItem) : longword;
  460. FUNCTION AHI_AllocAudioA(tagList : pTagItem) : pAHIAudioCtrl;
  461. FUNCTION AHI_AllocAudioRequestA(tagList : pTagItem) : pAHIAudioModeRequester;
  462. FUNCTION AHI_AudioRequestA(Requester : pAHIAudioModeRequester; tagList : pTagItem) : BOOLEAN;
  463. FUNCTION AHI_BestAudioIDA(tagList : pTagItem) : longword;
  464. FUNCTION AHI_ControlAudioA(AudioCtrl : pAHIAudioCtrl; tagList : pTagItem) : longword;
  465. PROCEDURE AHI_FreeAudio(AudioCtrl : pAHIAudioCtrl);
  466. PROCEDURE AHI_FreeAudioRequest(Requester : pAHIAudioModeRequester);
  467. FUNCTION AHI_GetAudioAttrsA(ID : longword; Audioctrl : pAHIAudioCtrl; tagList : pTagItem) : BOOLEAN;
  468. PROCEDURE AHI_KillAudio;
  469. FUNCTION AHI_LoadModeFile(a0arg : pCHAR) : longword;
  470. FUNCTION AHI_LoadSound(Sound : WORD; _Type : longword; Info : POINTER; AudioCtrl : pAHIAudioCtrl) : longword;
  471. FUNCTION AHI_NextAudioID(Last_ID : longword) : longword;
  472. PROCEDURE AHI_PlayA(Audioctrl : pAHIAudioCtrl; tagList : pTagItem);
  473. FUNCTION AHI_RemoveAudioMode(d0arg : longword) : longword;
  474. FUNCTION AHI_SampleFrameSize(SampleType : longword) : longword;
  475. FUNCTION AHI_SetEffect(Effect : POINTER; AudioCtrl : pAHIAudioCtrl) : longword;
  476. PROCEDURE AHI_SetFreq(Channel : WORD; Freq : longword; AudioCtrl : pAHIAudioCtrl; Flags : longword);
  477. PROCEDURE AHI_SetSound(Channel : WORD; Sound : WORD; Offset : longword; len : LONGINT; AudioCtrl : pAHIAudioCtrl; Flags : longword);
  478. PROCEDURE AHI_SetVol(Channel : WORD; Volume : LONGINT; Pan : LONGINT; AudioCtrl : pAHIAudioCtrl; Flags : longword);
  479. PROCEDURE AHI_UnloadSound(Sound : WORD; Audioctrl : pAHIAudioCtrl);
  480. {
  481. Functions and procedures with array of const go here
  482. }
  483. FUNCTION AHI_AllocAudio(const tagList : Array Of Const) : pAHIAudioCtrl;
  484. FUNCTION AHI_AllocAudioRequest(const tagList : Array Of Const) : pAHIAudioModeRequester;
  485. FUNCTION AHI_AudioRequest(Requester : pAHIAudioModeRequester; const tagList : Array Of Const) : BOOLEAN;
  486. FUNCTION AHI_BestAudioID(const tagList : Array Of Const) : longword;
  487. FUNCTION AHI_ControlAudio(AudioCtrl : pAHIAudioCtrl; const tagList : Array Of Const) : longword;
  488. FUNCTION AHI_GetAudioAttrs(ID : longword; Audioctrl : pAHIAudioCtrl; const tagList : Array Of Const) : BOOLEAN;
  489. PROCEDURE AHI_Play(Audioctrl : pAHIAudioCtrl; const tagList : Array Of Const);
  490. {You can remove this include and use a define instead}
  491. {$I useautoopenlib.inc}
  492. {$ifdef use_init_openlib}
  493. procedure InitAHILibrary;
  494. {$endif use_init_openlib}
  495. {This is a variable that knows how the unit is compiled}
  496. var
  497. AHIIsCompiledHow : longint;
  498. IMPLEMENTATION
  499. uses
  500. {$ifndef dont_use_openlib}
  501. msgbox,
  502. {$endif dont_use_openlib}
  503. tagsarray;
  504. FUNCTION AHI_AddAudioMode(a0arg : pTagItem) : longword;
  505. BEGIN
  506. ASM
  507. MOVE.L A6,-(A7)
  508. MOVEA.L a0arg,A0
  509. MOVEA.L AHIBase,A6
  510. JSR -150(A6)
  511. MOVEA.L (A7)+,A6
  512. MOVE.L D0,@RESULT
  513. END;
  514. END;
  515. FUNCTION AHI_AllocAudioA(tagList : pTagItem) : pAHIAudioCtrl;
  516. BEGIN
  517. ASM
  518. MOVE.L A6,-(A7)
  519. MOVEA.L tagList,A1
  520. MOVEA.L AHIBase,A6
  521. JSR -042(A6)
  522. MOVEA.L (A7)+,A6
  523. MOVE.L D0,@RESULT
  524. END;
  525. END;
  526. FUNCTION AHI_AllocAudioRequestA(tagList : pTagItem) : pAHIAudioModeRequester;
  527. BEGIN
  528. ASM
  529. MOVE.L A6,-(A7)
  530. MOVEA.L tagList,A0
  531. MOVEA.L AHIBase,A6
  532. JSR -120(A6)
  533. MOVEA.L (A7)+,A6
  534. MOVE.L D0,@RESULT
  535. END;
  536. END;
  537. FUNCTION AHI_AudioRequestA(Requester : pAHIAudioModeRequester; tagList : pTagItem) : BOOLEAN;
  538. BEGIN
  539. ASM
  540. MOVE.L A6,-(A7)
  541. MOVEA.L Requester,A0
  542. MOVEA.L tagList,A1
  543. MOVEA.L AHIBase,A6
  544. JSR -126(A6)
  545. MOVEA.L (A7)+,A6
  546. TST.W D0
  547. BEQ.B @end
  548. MOVEQ #1,D0
  549. @end: MOVE.B D0,@RESULT
  550. END;
  551. END;
  552. FUNCTION AHI_BestAudioIDA(tagList : pTagItem) : longword;
  553. BEGIN
  554. ASM
  555. MOVE.L A6,-(A7)
  556. MOVEA.L tagList,A1
  557. MOVEA.L AHIBase,A6
  558. JSR -114(A6)
  559. MOVEA.L (A7)+,A6
  560. MOVE.L D0,@RESULT
  561. END;
  562. END;
  563. FUNCTION AHI_ControlAudioA(AudioCtrl : pAHIAudioCtrl; tagList : pTagItem) : longword;
  564. BEGIN
  565. ASM
  566. MOVE.L A6,-(A7)
  567. MOVEA.L AudioCtrl,A2
  568. MOVEA.L tagList,A1
  569. MOVEA.L AHIBase,A6
  570. JSR -060(A6)
  571. MOVEA.L (A7)+,A6
  572. MOVE.L D0,@RESULT
  573. END;
  574. END;
  575. PROCEDURE AHI_FreeAudio(AudioCtrl : pAHIAudioCtrl);
  576. BEGIN
  577. ASM
  578. MOVE.L A6,-(A7)
  579. MOVEA.L AudioCtrl,A2
  580. MOVEA.L AHIBase,A6
  581. JSR -048(A6)
  582. MOVEA.L (A7)+,A6
  583. END;
  584. END;
  585. PROCEDURE AHI_FreeAudioRequest(Requester : pAHIAudioModeRequester);
  586. BEGIN
  587. ASM
  588. MOVE.L A6,-(A7)
  589. MOVEA.L Requester,A0
  590. MOVEA.L AHIBase,A6
  591. JSR -132(A6)
  592. MOVEA.L (A7)+,A6
  593. END;
  594. END;
  595. FUNCTION AHI_GetAudioAttrsA(ID : longword; Audioctrl : pAHIAudioCtrl; tagList : pTagItem) : BOOLEAN;
  596. BEGIN
  597. ASM
  598. MOVE.L A6,-(A7)
  599. MOVE.L ID,D0
  600. MOVEA.L Audioctrl,A2
  601. MOVEA.L tagList,A1
  602. MOVEA.L AHIBase,A6
  603. JSR -108(A6)
  604. MOVEA.L (A7)+,A6
  605. TST.W D0
  606. BEQ.B @end
  607. MOVEQ #1,D0
  608. @end: MOVE.B D0,@RESULT
  609. END;
  610. END;
  611. PROCEDURE AHI_KillAudio;
  612. BEGIN
  613. ASM
  614. MOVE.L A6,-(A7)
  615. MOVEA.L AHIBase,A6
  616. JSR -054(A6)
  617. MOVEA.L (A7)+,A6
  618. END;
  619. END;
  620. FUNCTION AHI_LoadModeFile(a0arg : pCHAR) : longword;
  621. BEGIN
  622. ASM
  623. MOVE.L A6,-(A7)
  624. MOVEA.L a0arg,A0
  625. MOVEA.L AHIBase,A6
  626. JSR -162(A6)
  627. MOVEA.L (A7)+,A6
  628. MOVE.L D0,@RESULT
  629. END;
  630. END;
  631. FUNCTION AHI_LoadSound(Sound : WORD; _Type : longword; Info : POINTER; AudioCtrl : pAHIAudioCtrl) : longword;
  632. BEGIN
  633. ASM
  634. MOVE.L A6,-(A7)
  635. MOVE.L Sound,D0
  636. MOVE.L _Type,D1
  637. MOVEA.L Info,A0
  638. MOVEA.L AudioCtrl,A2
  639. MOVEA.L AHIBase,A6
  640. JSR -090(A6)
  641. MOVEA.L (A7)+,A6
  642. MOVE.L D0,@RESULT
  643. END;
  644. END;
  645. FUNCTION AHI_NextAudioID(Last_ID : longword) : longword;
  646. BEGIN
  647. ASM
  648. MOVE.L A6,-(A7)
  649. MOVE.L Last_ID,D0
  650. MOVEA.L AHIBase,A6
  651. JSR -102(A6)
  652. MOVEA.L (A7)+,A6
  653. MOVE.L D0,@RESULT
  654. END;
  655. END;
  656. PROCEDURE AHI_PlayA(Audioctrl : pAHIAudioCtrl; tagList : pTagItem);
  657. BEGIN
  658. ASM
  659. MOVE.L A6,-(A7)
  660. MOVEA.L Audioctrl,A2
  661. MOVEA.L tagList,A1
  662. MOVEA.L AHIBase,A6
  663. JSR -138(A6)
  664. MOVEA.L (A7)+,A6
  665. END;
  666. END;
  667. FUNCTION AHI_RemoveAudioMode(d0arg : longword) : longword;
  668. BEGIN
  669. ASM
  670. MOVE.L A6,-(A7)
  671. MOVE.L d0arg,D0
  672. MOVEA.L AHIBase,A6
  673. JSR -156(A6)
  674. MOVEA.L (A7)+,A6
  675. MOVE.L D0,@RESULT
  676. END;
  677. END;
  678. FUNCTION AHI_SampleFrameSize(SampleType : longword) : longword;
  679. BEGIN
  680. ASM
  681. MOVE.L A6,-(A7)
  682. MOVE.L SampleType,D0
  683. MOVEA.L AHIBase,A6
  684. JSR -144(A6)
  685. MOVEA.L (A7)+,A6
  686. MOVE.L D0,@RESULT
  687. END;
  688. END;
  689. FUNCTION AHI_SetEffect(Effect : POINTER; AudioCtrl : pAHIAudioCtrl) : longword;
  690. BEGIN
  691. ASM
  692. MOVE.L A6,-(A7)
  693. MOVEA.L Effect,A0
  694. MOVEA.L AudioCtrl,A2
  695. MOVEA.L AHIBase,A6
  696. JSR -084(A6)
  697. MOVEA.L (A7)+,A6
  698. MOVE.L D0,@RESULT
  699. END;
  700. END;
  701. PROCEDURE AHI_SetFreq(Channel : WORD; Freq : longword; AudioCtrl : pAHIAudioCtrl; Flags : longword);
  702. BEGIN
  703. ASM
  704. MOVE.L A6,-(A7)
  705. MOVE.L Channel,D0
  706. MOVE.L Freq,D1
  707. MOVEA.L AudioCtrl,A2
  708. MOVE.L Flags,D2
  709. MOVEA.L AHIBase,A6
  710. JSR -072(A6)
  711. MOVEA.L (A7)+,A6
  712. END;
  713. END;
  714. PROCEDURE AHI_SetSound(Channel : WORD; Sound : WORD; Offset : longword; len : LONGINT; AudioCtrl : pAHIAudioCtrl; Flags : longword);
  715. BEGIN
  716. ASM
  717. MOVE.L A6,-(A7)
  718. MOVE.L Channel,D0
  719. MOVE.L Sound,D1
  720. MOVE.L Offset,D2
  721. MOVE.L len,D3
  722. MOVEA.L AudioCtrl,A2
  723. MOVE.L Flags,D4
  724. MOVEA.L AHIBase,A6
  725. JSR -078(A6)
  726. MOVEA.L (A7)+,A6
  727. END;
  728. END;
  729. PROCEDURE AHI_SetVol(Channel : WORD; Volume : LONGINT; Pan : LONGINT; AudioCtrl : pAHIAudioCtrl; Flags : longword);
  730. BEGIN
  731. ASM
  732. MOVE.L A6,-(A7)
  733. MOVE.L Channel,D0
  734. MOVE.L Volume,D1
  735. MOVE.L Pan,D2
  736. MOVEA.L AudioCtrl,A2
  737. MOVE.L Flags,D3
  738. MOVEA.L AHIBase,A6
  739. JSR -066(A6)
  740. MOVEA.L (A7)+,A6
  741. END;
  742. END;
  743. PROCEDURE AHI_UnloadSound(Sound : WORD; Audioctrl : pAHIAudioCtrl);
  744. BEGIN
  745. ASM
  746. MOVE.L A6,-(A7)
  747. MOVE.L Sound,D0
  748. MOVEA.L Audioctrl,A2
  749. MOVEA.L AHIBase,A6
  750. JSR -096(A6)
  751. MOVEA.L (A7)+,A6
  752. END;
  753. END;
  754. {
  755. Functions and procedures with array of const go here
  756. }
  757. FUNCTION AHI_AllocAudio(const tagList : Array Of Const) : pAHIAudioCtrl;
  758. begin
  759. AHI_AllocAudio := AHI_AllocAudioA(readintags(tagList));
  760. end;
  761. FUNCTION AHI_AllocAudioRequest(const tagList : Array Of Const) : pAHIAudioModeRequester;
  762. begin
  763. AHI_AllocAudioRequest := AHI_AllocAudioRequestA(readintags(tagList));
  764. end;
  765. FUNCTION AHI_AudioRequest(Requester : pAHIAudioModeRequester; const tagList : Array Of Const) : BOOLEAN;
  766. begin
  767. AHI_AudioRequest := AHI_AudioRequestA(Requester , readintags(tagList));
  768. end;
  769. FUNCTION AHI_BestAudioID(const tagList : Array Of Const) : longword;
  770. begin
  771. AHI_BestAudioID := AHI_BestAudioIDA(readintags(tagList));
  772. end;
  773. FUNCTION AHI_ControlAudio(AudioCtrl : pAHIAudioCtrl; const tagList : Array Of Const) : longword;
  774. begin
  775. AHI_ControlAudio := AHI_ControlAudioA(AudioCtrl , readintags(tagList));
  776. end;
  777. FUNCTION AHI_GetAudioAttrs(ID : longword; Audioctrl : pAHIAudioCtrl; const tagList : Array Of Const) : BOOLEAN;
  778. begin
  779. AHI_GetAudioAttrs := AHI_GetAudioAttrsA(ID , Audioctrl , readintags(tagList));
  780. end;
  781. PROCEDURE AHI_Play(Audioctrl : pAHIAudioCtrl; const tagList : Array Of Const);
  782. begin
  783. AHI_PlayA(Audioctrl , readintags(tagList));
  784. end;
  785. const
  786. { Change VERSION and LIBVERSION to proper values }
  787. VERSION : string[2] = '0';
  788. LIBVERSION : longword = 0;
  789. {$ifdef use_init_openlib}
  790. {$Info Compiling initopening of ahi.library}
  791. {$Info don't forget to use InitAHILibrary in the beginning of your program}
  792. var
  793. ahi_exit : Pointer;
  794. procedure CloseahiLibrary;
  795. begin
  796. ExitProc := ahi_exit;
  797. if AHIBase <> nil then begin
  798. CloseLibrary(AHIBase);
  799. AHIBase := nil;
  800. end;
  801. end;
  802. procedure InitAHILibrary;
  803. begin
  804. AHIBase := nil;
  805. AHIBase := OpenLibrary(AHINAME,LIBVERSION);
  806. if AHIBase <> nil then begin
  807. ahi_exit := ExitProc;
  808. ExitProc := @CloseahiLibrary;
  809. end else begin
  810. MessageBox('FPC Pascal Error',
  811. 'Can''t open ahi.library version ' + VERSION + #10 +
  812. 'Deallocating resources and closing down',
  813. 'Oops');
  814. halt(20);
  815. end;
  816. end;
  817. begin
  818. AHIIsCompiledHow := 2;
  819. {$endif use_init_openlib}
  820. {$ifdef use_auto_openlib}
  821. {$Info Compiling autoopening of ahi.library}
  822. var
  823. ahi_exit : Pointer;
  824. procedure CloseahiLibrary;
  825. begin
  826. ExitProc := ahi_exit;
  827. if AHIBase <> nil then begin
  828. CloseLibrary(AHIBase);
  829. AHIBase := nil;
  830. end;
  831. end;
  832. begin
  833. AHIBase := nil;
  834. AHIBase := OpenLibrary(AHINAME,LIBVERSION);
  835. if AHIBase <> nil then begin
  836. ahi_exit := ExitProc;
  837. ExitProc := @CloseahiLibrary;
  838. AHIIsCompiledHow := 1;
  839. end else begin
  840. MessageBox('FPC Pascal Error',
  841. 'Can''t open ahi.library version ' + VERSION + #10 +
  842. 'Deallocating resources and closing down',
  843. 'Oops');
  844. halt(20);
  845. end;
  846. {$endif use_auto_openlib}
  847. {$ifdef dont_use_openlib}
  848. begin
  849. AHIIsCompiledHow := 3;
  850. {$Warning No autoopening of ahi.library compiled}
  851. {$Warning Make sure you open ahi.library yourself}
  852. {$endif dont_use_openlib}
  853. END. (* UNIT AHI *)