ahi_sub.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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_sub.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. 15 Jan 2003.
  17. Changed cardinal > longword.
  18. Added startcode for unit.
  19. 12 Feb 2003.
  20. [email protected] Nils Sjoholm
  21. }
  22. {$I useamigasmartlink.inc}
  23. {$ifdef use_amiga_smartlink}
  24. {$smartlink on}
  25. {$endif use_amiga_smartlink}
  26. UNIT AHI_SUB;
  27. INTERFACE
  28. USES Exec, ahi, utility;
  29. {
  30. $VER: ahi_sub.h 4.1 (2.4.97)
  31. ahi/[driver].audio definitions
  32. (C) Copyright 1994-1997 Martin Blom
  33. All Rights Reserved.
  34. (TAB SIZE: 8)
  35. }
  36. { AHIAudioCtrlDrv }
  37. type
  38. PAHIAudioCtrlDrv = ^tAHIAudioCtrlDrv;
  39. tAHIAudioCtrlDrv = record
  40. ahiac_AudioCtrl : tAHIAudioCtrl;
  41. ahiac_Flags : ULONG; { See below for definition }
  42. ahiac_SoundFunc : PHook; { AHIA_SoundFunc }
  43. ahiac_PlayerFunc : PHook; { AHIA_PlayerFunc }
  44. ahiac_PlayerFreq : Fixed; { AHIA_PlayerFreq }
  45. ahiac_MinPlayerFreq : Fixed; { AHIA_MinPlayerFreq }
  46. ahiac_MaxPlayerFreq : Fixed; { AHIA_MaxPlayerFreq }
  47. ahiac_MixFreq : ULONG; { AHIA_MixFreq }
  48. ahiac_Channels : UWORD; { AHIA_Channels }
  49. ahiac_Sounds : UWORD; { AHIA_Sounds }
  50. ahiac_DriverData : APTR; { Unused. Store whatever you want here. }
  51. ahiac_MixerFunc : PHook; { Mixing routine Hook }
  52. ahiac_SamplerFunc : PHook; { Sampler routine Hook }
  53. ahiac_Obsolete : ULONG;
  54. ahiac_BuffSamples : ULONG; { Samples to mix this pass. }
  55. ahiac_MinBuffSamples : ULONG; { Min. samples to mix each pass. }
  56. ahiac_MaxBuffSamples : ULONG; { Max. samples to mix each pass. }
  57. ahiac_BuffSize : ULONG; { Buffer size ahiac_MixerFunc needs. }
  58. ahiac_BuffType : ULONG; { Buffer format (V2) }
  59. ahiac_PreTimer : function :BOOL; { Call before mixing (V4) }
  60. ahiac_PostTimer : procedure; { Call after mixing (V4) }
  61. end;
  62. { The rest is PRIVATE! Hands off! They may change any time.
  63. [lots of private stuff] }
  64. { TAGS }
  65. const
  66. AHIDB_UserBase = AHI_TagBase + 500; { Use for driver specific tags }
  67. { DEFS }
  68. { AHIsub_AllocAudio return flags }
  69. AHISF_ERROR = 1 shl 0;
  70. AHISF_MIXING = 1 shl 1;
  71. AHISF_TIMING = 1 shl 2;
  72. AHISF_KNOWSTEREO = 1 shl 3;
  73. AHISF_KNOWHIFI = 1 shl 4;
  74. AHISF_CANRECORD = 1 shl 5;
  75. AHISF_CANPOSTPROCESS = 1 shl 6;
  76. AHISB_ERROR = 0;
  77. AHISB_MIXING = 1;
  78. AHISB_TIMING = 2;
  79. AHISB_KNOWSTEREO = 3;
  80. AHISB_KNOWHIFI = 4;
  81. AHISB_CANRECORD = 5;
  82. AHISB_CANPOSTPROCESS = 6;
  83. { AHIsub_Start() and AHIsub_Stop() flags }
  84. AHISF_PLAY = 1 shl 0;
  85. AHISF_RECORD = 1 shl 1;
  86. AHISB_PLAY = 0;
  87. AHISB_RECORD = 1;
  88. { ahiac_Flags }
  89. AHIACF_VOL = 1 shl 0;
  90. AHIACF_PAN = 1 shl 1;
  91. AHIACF_STEREO = 1 shl 2;
  92. AHIACF_HIFI = 1 shl 3;
  93. AHIACF_PINGPONG = 1 shl 4;
  94. AHIACF_RECORD = 1 shl 5;
  95. AHIACF_MULTTAB = 1 shl 6; { Private! }
  96. AHIACB_VOL = 0;
  97. AHIACB_PAN = 1;
  98. AHIACB_STEREO = 2;
  99. AHIACB_HIFI = 3;
  100. AHIACB_PINGPONG = 4;
  101. AHIACB_RECORD = 5;
  102. AHIACB_MULTTAB = 6; { Private! }
  103. { AHIsub_Set#? and AHIsub_(Un)LoadSound return code }
  104. AHIS_UNKNOWN = not (0);
  105. { IFF chunk names for the audio mode file }
  106. ID_AHIM = $4148494D; { AHI Modes }
  107. ID_AUDN = $4155544E; { AUDio driver Name }
  108. ID_AUDD = $41554444; { AUDio driver Data }
  109. ID_AUDM = $4155444D; { AUDio Mode }
  110. VAR AHIsubBase : pLibrary;
  111. const
  112. AHI_SUBNAME : PChar = 'ahi_sub.library';
  113. FUNCTION AHIsub_AllocAudio(tagList : pTagItem; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  114. PROCEDURE AHIsub_Disable(AudioCtrl : pAHIAudioCtrlDrv);
  115. PROCEDURE AHIsub_Enable(AudioCtrl : pAHIAudioCtrlDrv);
  116. PROCEDURE AHIsub_FreeAudio(AudioCtrl : pAHIAudioCtrlDrv);
  117. FUNCTION AHIsub_GetAttr(Attribute : longword; Argument : LONGINT; d2arg : LONGINT; tagList : pTagItem; AudioCtrl : pAHIAudioCtrlDrv) : LONGINT;
  118. FUNCTION AHIsub_HardwareControl(Attribute : longword; Argument : LONGINT; AudioCtrl : pAHIAudioCtrlDrv) : LONGINT;
  119. FUNCTION AHIsub_LoadSound(Sound : WORD; _Type : longword; Info : POINTER; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  120. FUNCTION AHIsub_SetEffect(Effect : POINTER; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  121. FUNCTION AHIsub_SetFreq(Channel : WORD; Freq : longword; AudioCtrl : pAHIAudioCtrlDrv; Flags : longword) : longword;
  122. FUNCTION AHIsub_SetSound(Channel : WORD; Sound : WORD; Offset : longword; Length : LONGINT; AudioCtrl : pAHIAudioCtrlDrv; Flags : longword) : longword;
  123. FUNCTION AHIsub_SetVol(Channel : WORD; Volume : LONGINT; Pan : LONGINT; AudioCtrl : pAHIAudioCtrlDrv; Flags : longword) : longword;
  124. FUNCTION AHIsub_Start(Flags : longword; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  125. FUNCTION AHIsub_Stop(Flags : longword; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  126. FUNCTION AHIsub_UnloadSound(Sound : WORD; Audioctrl : pAHIAudioCtrlDrv) : longword;
  127. FUNCTION AHIsub_Update(Flags : longword; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  128. {You can remove this include and use a define instead}
  129. {$I useautoopenlib.inc}
  130. {$ifdef use_init_openlib}
  131. procedure InitAHI_SUBLibrary;
  132. {$endif use_init_openlib}
  133. {This is a variable that knows how the unit is compiled}
  134. var
  135. AHI_SUBIsCompiledHow : longint;
  136. IMPLEMENTATION
  137. uses
  138. {$ifndef dont_use_openlib}
  139. msgbox,
  140. {$endif dont_use_openlib}
  141. tagsarray;
  142. FUNCTION AHIsub_AllocAudio(tagList : pTagItem; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  143. BEGIN
  144. ASM
  145. MOVE.L A6,-(A7)
  146. MOVEA.L tagList,A1
  147. MOVEA.L AudioCtrl,A2
  148. MOVEA.L AHIsubBase,A6
  149. JSR -030(A6)
  150. MOVEA.L (A7)+,A6
  151. MOVE.L D0,@RESULT
  152. END;
  153. END;
  154. PROCEDURE AHIsub_Disable(AudioCtrl : pAHIAudioCtrlDrv);
  155. BEGIN
  156. ASM
  157. MOVE.L A6,-(A7)
  158. MOVEA.L AudioCtrl,A2
  159. MOVEA.L AHIsubBase,A6
  160. JSR -042(A6)
  161. MOVEA.L (A7)+,A6
  162. END;
  163. END;
  164. PROCEDURE AHIsub_Enable(AudioCtrl : pAHIAudioCtrlDrv);
  165. BEGIN
  166. ASM
  167. MOVE.L A6,-(A7)
  168. MOVEA.L AudioCtrl,A2
  169. MOVEA.L AHIsubBase,A6
  170. JSR -048(A6)
  171. MOVEA.L (A7)+,A6
  172. END;
  173. END;
  174. PROCEDURE AHIsub_FreeAudio(AudioCtrl : pAHIAudioCtrlDrv);
  175. BEGIN
  176. ASM
  177. MOVE.L A6,-(A7)
  178. MOVEA.L AudioCtrl,A2
  179. MOVEA.L AHIsubBase,A6
  180. JSR -036(A6)
  181. MOVEA.L (A7)+,A6
  182. END;
  183. END;
  184. FUNCTION AHIsub_GetAttr(Attribute : longword; Argument : LONGINT; d2arg : LONGINT; tagList : pTagItem; AudioCtrl : pAHIAudioCtrlDrv) : LONGINT;
  185. BEGIN
  186. ASM
  187. MOVE.L A6,-(A7)
  188. MOVE.L Attribute,D0
  189. MOVE.L Argument,D1
  190. MOVE.L d2arg,D2
  191. MOVEA.L tagList,A1
  192. MOVEA.L AudioCtrl,A2
  193. MOVEA.L AHIsubBase,A6
  194. JSR -108(A6)
  195. MOVEA.L (A7)+,A6
  196. MOVE.L D0,@RESULT
  197. END;
  198. END;
  199. FUNCTION AHIsub_HardwareControl(Attribute : longword; Argument : LONGINT; AudioCtrl : pAHIAudioCtrlDrv) : LONGINT;
  200. BEGIN
  201. ASM
  202. MOVE.L A6,-(A7)
  203. MOVE.L Attribute,D0
  204. MOVE.L Argument,D1
  205. MOVEA.L AudioCtrl,A2
  206. MOVEA.L AHIsubBase,A6
  207. JSR -114(A6)
  208. MOVEA.L (A7)+,A6
  209. MOVE.L D0,@RESULT
  210. END;
  211. END;
  212. FUNCTION AHIsub_LoadSound(Sound : WORD; _Type : longword; Info : POINTER; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  213. BEGIN
  214. ASM
  215. MOVE.L A6,-(A7)
  216. MOVE.L Sound,D0
  217. MOVE.L _Type,D1
  218. MOVEA.L Info,A0
  219. MOVEA.L AudioCtrl,A2
  220. MOVEA.L AHIsubBase,A6
  221. JSR -096(A6)
  222. MOVEA.L (A7)+,A6
  223. MOVE.L D0,@RESULT
  224. END;
  225. END;
  226. FUNCTION AHIsub_SetEffect(Effect : POINTER; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  227. BEGIN
  228. ASM
  229. MOVE.L A6,-(A7)
  230. MOVEA.L Effect,A0
  231. MOVEA.L AudioCtrl,A2
  232. MOVEA.L AHIsubBase,A6
  233. JSR -090(A6)
  234. MOVEA.L (A7)+,A6
  235. MOVE.L D0,@RESULT
  236. END;
  237. END;
  238. FUNCTION AHIsub_SetFreq(Channel : WORD; Freq : longword; AudioCtrl : pAHIAudioCtrlDrv; Flags : longword) : longword;
  239. BEGIN
  240. ASM
  241. MOVE.L A6,-(A7)
  242. MOVE.L Channel,D0
  243. MOVE.L Freq,D1
  244. MOVEA.L AudioCtrl,A2
  245. MOVE.L Flags,D2
  246. MOVEA.L AHIsubBase,A6
  247. JSR -078(A6)
  248. MOVEA.L (A7)+,A6
  249. MOVE.L D0,@RESULT
  250. END;
  251. END;
  252. FUNCTION AHIsub_SetSound(Channel : WORD; Sound : WORD; Offset : longword; Length : LONGINT; AudioCtrl : pAHIAudioCtrlDrv; Flags : longword) : longword;
  253. BEGIN
  254. ASM
  255. MOVE.L A6,-(A7)
  256. MOVE.L Channel,D0
  257. MOVE.L Sound,D1
  258. MOVE.L Offset,D2
  259. MOVE.L Length,D3
  260. MOVEA.L AudioCtrl,A2
  261. MOVE.L Flags,D4
  262. MOVEA.L AHIsubBase,A6
  263. JSR -084(A6)
  264. MOVEA.L (A7)+,A6
  265. MOVE.L D0,@RESULT
  266. END;
  267. END;
  268. FUNCTION AHIsub_SetVol(Channel : WORD; Volume : LONGINT; Pan : LONGINT; AudioCtrl : pAHIAudioCtrlDrv; Flags : longword) : longword;
  269. BEGIN
  270. ASM
  271. MOVE.L A6,-(A7)
  272. MOVE.L Channel,D0
  273. MOVE.L Volume,D1
  274. MOVE.L Pan,D2
  275. MOVEA.L AudioCtrl,A2
  276. MOVE.L Flags,D3
  277. MOVEA.L AHIsubBase,A6
  278. JSR -072(A6)
  279. MOVEA.L (A7)+,A6
  280. MOVE.L D0,@RESULT
  281. END;
  282. END;
  283. FUNCTION AHIsub_Start(Flags : longword; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  284. BEGIN
  285. ASM
  286. MOVE.L A6,-(A7)
  287. MOVE.L Flags,D0
  288. MOVEA.L AudioCtrl,A2
  289. MOVEA.L AHIsubBase,A6
  290. JSR -054(A6)
  291. MOVEA.L (A7)+,A6
  292. MOVE.L D0,@RESULT
  293. END;
  294. END;
  295. FUNCTION AHIsub_Stop(Flags : longword; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  296. BEGIN
  297. ASM
  298. MOVE.L A6,-(A7)
  299. MOVE.L Flags,D0
  300. MOVEA.L AudioCtrl,A2
  301. MOVEA.L AHIsubBase,A6
  302. JSR -066(A6)
  303. MOVEA.L (A7)+,A6
  304. MOVE.L D0,@RESULT
  305. END;
  306. END;
  307. FUNCTION AHIsub_UnloadSound(Sound : WORD; Audioctrl : pAHIAudioCtrlDrv) : longword;
  308. BEGIN
  309. ASM
  310. MOVE.L A6,-(A7)
  311. MOVE.L Sound,D0
  312. MOVEA.L Audioctrl,A2
  313. MOVEA.L AHIsubBase,A6
  314. JSR -102(A6)
  315. MOVEA.L (A7)+,A6
  316. MOVE.L D0,@RESULT
  317. END;
  318. END;
  319. FUNCTION AHIsub_Update(Flags : longword; AudioCtrl : pAHIAudioCtrlDrv) : longword;
  320. BEGIN
  321. ASM
  322. MOVE.L A6,-(A7)
  323. MOVE.L Flags,D0
  324. MOVEA.L AudioCtrl,A2
  325. MOVEA.L AHIsubBase,A6
  326. JSR -060(A6)
  327. MOVEA.L (A7)+,A6
  328. MOVE.L D0,@RESULT
  329. END;
  330. END;
  331. const
  332. { Change VERSION and LIBVERSION to proper values }
  333. VERSION : string[2] = '0';
  334. LIBVERSION : longword = 0;
  335. {$ifdef use_init_openlib}
  336. {$Info Compiling initopening of ahi_sub.library}
  337. {$Info don't forget to use InitAHI_SUBLibrary in the beginning of your program}
  338. var
  339. ahi_sub_exit : Pointer;
  340. procedure Closeahi_subLibrary;
  341. begin
  342. ExitProc := ahi_sub_exit;
  343. if AHIsubBase <> nil then begin
  344. CloseLibrary(AHIsubBase);
  345. AHIsubBase := nil;
  346. end;
  347. end;
  348. procedure InitAHI_SUBLibrary;
  349. begin
  350. AHIsubBase := nil;
  351. AHIsubBase := OpenLibrary(AHI_SUBNAME,LIBVERSION);
  352. if AHIsubBase <> nil then begin
  353. ahi_sub_exit := ExitProc;
  354. ExitProc := @Closeahi_subLibrary;
  355. end else begin
  356. MessageBox('FPC Pascal Error',
  357. 'Can''t open ahi_sub.library version ' + VERSION + #10 +
  358. 'Deallocating resources and closing down',
  359. 'Oops');
  360. halt(20);
  361. end;
  362. end;
  363. begin
  364. AHI_SUBIsCompiledHow := 2;
  365. {$endif use_init_openlib}
  366. {$ifdef use_auto_openlib}
  367. {$Info Compiling autoopening of ahi_sub.library}
  368. var
  369. ahi_sub_exit : Pointer;
  370. procedure Closeahi_subLibrary;
  371. begin
  372. ExitProc := ahi_sub_exit;
  373. if AHIsubBase <> nil then begin
  374. CloseLibrary(AHIsubBase);
  375. AHIsubBase := nil;
  376. end;
  377. end;
  378. begin
  379. AHIsubBase := nil;
  380. AHIsubBase := OpenLibrary(AHI_SUBNAME,LIBVERSION);
  381. if AHIsubBase <> nil then begin
  382. ahi_sub_exit := ExitProc;
  383. ExitProc := @Closeahi_subLibrary;
  384. AHI_SUBIsCompiledHow := 1;
  385. end else begin
  386. MessageBox('FPC Pascal Error',
  387. 'Can''t open ahi_sub.library version ' + VERSION + #10 +
  388. 'Deallocating resources and closing down',
  389. 'Oops');
  390. halt(20);
  391. end;
  392. {$endif use_auto_openlib}
  393. {$ifdef dont_use_openlib}
  394. begin
  395. AHI_SUBIsCompiledHow := 3;
  396. {$Warning No autoopening of ahi_sub.library compiled}
  397. {$Warning Make sure you open ahi_sub.library yourself}
  398. {$endif dont_use_openlib}
  399. END. (* UNIT AHI_SUB *)