Unix.OpenAL.Mod 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. MODULE OpenAL; (** AUTHOR "fnecati"; PURPOSE "OpenAL cross platform audio library"; *)
  2. IMPORT
  3. SYSTEM, Unix, Modules, Strings, KernelLog;
  4. CONST
  5. libname="libopenal.so";
  6. TYPE
  7. String256*=ARRAY 256 OF CHAR;
  8. PString256*= POINTER TO ARRAY OF String256;
  9. ALbyte * = CHAR; (* 1-byte signed *)
  10. ALshort * = INTEGER; (* 2-byte signed *)
  11. ALint * = LONGINT; (* 4-byte signed *)
  12. ALfloat * = REAL;
  13. ALdouble * = LONGREAL;
  14. ALboolean * = BOOLEAN;
  15. ALubyte * = CHAR; (* 1-byte unsigned *)
  16. ALushort * = INTEGER; (* 2-byte unsigned *)
  17. ALuint * = LONGINT; (* 4-byte signed *)
  18. ALsizei * = LONGINT; (* 4-byte signed *)
  19. ALenum * = LONGINT;
  20. PALboolean * = ADDRESS; (* TO ALboolean;*)
  21. PALfloat * = ADDRESS; (* TO ALfloat;*)
  22. PALdouble * = ADDRESS; (* TO ALdouble;*)
  23. PALbyte * = ADDRESS; (* TO ALbyte;*)
  24. PALshort * = ADDRESS; (* TO ALshort;*)
  25. PALint * = ADDRESS; (* TO ALint; *)
  26. PALubyte * = ADDRESS; (* TO ALubyte; *)
  27. PALushort * = ADDRESS; (* TO ALushort; *)
  28. PALuint * = ADDRESS; (* TO ALuint; *)
  29. CONST
  30. AL_INVALID * = (-1);
  31. AL_NONE * = 0; (* "no distance model" or "no buffer" *)
  32. AL_FALSE * = 0;
  33. AL_TRUE * = 1;
  34. AL_SOURCE_ABSOLUTE * = 201H;
  35. AL_SOURCE_RELATIVE * = 202H; (** Indicate Source has relative coordinates. *)
  36. (**
  37. * Directional source, inner cone angle, in degrees.
  38. * Range: [0-360]
  39. * Default: 360
  40. *)
  41. AL_CONE_INNER_ANGLE * = 1001H;
  42. (**
  43. * Directional source, outer cone angle, in degrees.
  44. * Range: [0-360]
  45. * Default: 360
  46. *)
  47. AL_CONE_OUTER_ANGLE * = 1002H;
  48. (**
  49. * Specify the pitch to be applied, either at source,
  50. * or on mixer results, at listener.
  51. * Range: [0.5-2.0]
  52. * Default: 1.0
  53. *)
  54. AL_PITCH * = 1003H;
  55. (**
  56. * Specify the current location in three dimensional space.
  57. * OpenAL, like OpenGL, uses a right handed coordinate system,
  58. * where in a frontal default view X (thumb) points right,
  59. * Y points up (index finger), and Z points towards the
  60. * viewer/camera (middle finger).
  61. * To switch from a left handed coordinate system, flip the
  62. * sign on the Z coordinate.
  63. * Listener position is always in the world coordinate system.
  64. *)
  65. AL_POSITION * = 1004H;
  66. AL_DIRECTION * = 1005H; (** Specify the current direction. *)
  67. AL_VELOCITY * = 1006H; (** Specify the current velocity in three dimensional space. *)
  68. (**
  69. * Indicate whether source is looping.
  70. * Type: ALboolean?
  71. * Range: [AL_TRUE, AL_FALSE]
  72. * Default: FALSE.
  73. *)
  74. AL_LOOPING * = 1007H;
  75. (**
  76. * Indicate the buffer to provide sound samples.
  77. * Type: ALuint.
  78. * Range: any valid Buffer id.
  79. *)
  80. AL_BUFFER * = 1009H;
  81. (**
  82. * Indicate the gain (volume amplification) applied.
  83. * Type: ALfloat.
  84. * Range: ]0.0- ]
  85. * A value of 1.0 means un-attenuated/unchanged.
  86. * Each division by 2 equals an attenuation of -6dB.
  87. * Each multiplicaton with 2 equals an amplification of +6dB.
  88. * A value of 0.0 is meaningless with respect to a logarithmic
  89. * scale; it is interpreted as zero volume - the channel
  90. * is effectively disabled.
  91. *)
  92. AL_GAIN * = 100AH;
  93. (*
  94. * Indicate minimum source attenuation
  95. * Type: ALfloat
  96. * Range: [0.0 - 1.0]
  97. *
  98. * Logarthmic
  99. *)
  100. AL_MIN_GAIN * = 100DH;
  101. (**
  102. * Indicate maximum source attenuation
  103. * Type: ALfloat
  104. * Range: [0.0 - 1.0]
  105. *
  106. * Logarthmic
  107. *)
  108. AL_MAX_GAIN * = 100EH;
  109. (** Indicate listener orientation. at/up *)
  110. AL_ORIENTATION * = 100FH;
  111. (* AL_CHANNEL_MASK * = 3000H; *)
  112. (** Source state information. *)
  113. AL_SOURCE_STATE * = 1010H;
  114. AL_INITIAL * = 1011H;
  115. AL_PLAYING * = 1012H;
  116. AL_PAUSED * = 1013H;
  117. AL_STOPPED * = 1014H;
  118. (** Buffer Queue params *)
  119. AL_BUFFERS_QUEUED * = 1015H;
  120. AL_BUFFERS_PROCESSED * = 1016H;
  121. (** Source buffer position information *)
  122. AL_SEC_OFFSET * = 1024H;
  123. AL_SAMPLE_OFFSET * = 1025H;
  124. AL_BYTE_OFFSET * = 1026H;
  125. (*
  126. * Source type (Static, Streaming or undetermined)
  127. * Source is Static if a Buffer has been attached using AL_BUFFER
  128. * Source is Streaming if one or more Buffers have been attached using alSourceQueueBuffers
  129. * Source is undetermined when it has the NULL buffer attached
  130. *)
  131. AL_SOURCE_TYPE * = 1027H;
  132. AL_STATIC * = 1028H;
  133. AL_STREAMING * = 1029H;
  134. AL_UNDETERMINED * = 1030H;
  135. (** Sound samples: format specifier. *)
  136. AL_FORMAT_MONO8 * = 1100H;
  137. AL_FORMAT_MONO16 * = 1101H;
  138. AL_FORMAT_STEREO8 * = 1102H;
  139. AL_FORMAT_STEREO16 * = 1103H;
  140. (**
  141. * source specific reference distance
  142. * Type: ALfloat
  143. * Range: 0.0 - +inf
  144. *
  145. * At 0.0, no distance attenuation occurs. Default is
  146. * 1.0.
  147. *)
  148. AL_REFERENCE_DISTANCE * = 1020H;
  149. (**
  150. * source specific rolloff factor
  151. * Type: ALfloat
  152. * Range: 0.0 - +inf
  153. *
  154. *)
  155. AL_ROLLOFF_FACTOR * = 1021H;
  156. (**
  157. * Directional source, outer cone gain.
  158. *
  159. * Default: 0.0
  160. * Range: [0.0 - 1.0]
  161. * Logarithmic
  162. *)
  163. AL_CONE_OUTER_GAIN * = 1022H;
  164. (**
  165. * Indicate distance above which sources are not
  166. * attenuated using the inverse clamped distance model.
  167. *
  168. * Default: +inf
  169. * Type: ALfloat
  170. * Range: 0.0 - +inf
  171. *)
  172. AL_MAX_DISTANCE * = 1023H;
  173. (**
  174. * Sound samples: frequency, in units of Hertz [Hz].
  175. * This is the number of samples per second. Half of the
  176. * sample frequency marks the maximum significant
  177. * frequency component.
  178. *)
  179. AL_FREQUENCY * = 2001H;
  180. AL_BITS * = 2002H;
  181. AL_CHANNELS * = 2003H;
  182. AL_SIZE * = 2004H;
  183. (* AL_DATA * = 2005H;*)
  184. (**
  185. * Buffer state.
  186. *
  187. * Not supported for public use (yet).
  188. *)
  189. AL_UNUSED * = 2010H;
  190. AL_PENDING * = 2011H;
  191. AL_PROCESSED * = 2012H;
  192. (** Errors: No Error. *)
  193. AL_NO_ERROR * = AL_FALSE;
  194. AL_INVALID_NAME * = 0A001H; (** Invalid Name paramater passed to AL call. *)
  195. AL_INVALID_ENUM * = 0A002H; (** Invalid parameter passed to AL call. *)
  196. AL_INVALID_VALUE * = 0A003H; (** Invalid enum parameter value. *)
  197. AL_INVALID_OPERATION * = 0A004H; (** Illegal call. *)
  198. AL_OUT_OF_MEMORY * = 0A005H;
  199. (** Context strings: Vendor Name. *)
  200. AL_VENDOR * = 0B001H;
  201. AL_VERSION * = 0B002H;
  202. AL_RENDERER * = 0B003H;
  203. AL_EXTENSIONS * = 0B004H;
  204. AL_DOPPLER_FACTOR * = 0C000H; (** Doppler scale. Default 1.0 *)
  205. AL_DOPPLER_VELOCITY * = 0C001H; (** Tweaks speed of propagation. *)
  206. AL_SPEED_OF_SOUND * = 0C003H; (** Speed of Sound in units per second *)
  207. (**
  208. * Distance models
  209. *
  210. * used in conjunction with DistanceModel
  211. *
  212. * implicit: NONE, which disances distance attenuation.
  213. *)
  214. AL_DISTANCE_MODEL * = 0D000H;
  215. AL_INVERSE_DISTANCE * = 0D001H;
  216. AL_INVERSE_DISTANCE_CLAMPED * = 0D002H;
  217. AL_LINEAR_DISTANCE * = 0D003H;
  218. AL_LINEAR_DISTANCE_CLAMPED * = 0D004H;
  219. AL_EXPONENT_DISTANCE * = 0D005H;
  220. AL_EXPONENT_DISTANCE_CLAMPED * = 0D006H;
  221. (* **************** *)
  222. (* **************** *)
  223. (* AL Context API types *)
  224. TYPE
  225. ALCbyte * = CHAR; (* 1-byte signed *)
  226. ALCshort * = INTEGER; (* 2-byte signed *)
  227. ALCint * = LONGINT; (* 4-byte signed *)
  228. ALCfloat * = REAL;
  229. ALCdouble * = LONGREAL;
  230. ALCboolean * = BOOLEAN;
  231. ALCubyte * = CHAR; (* 1-byte unsigned *)
  232. ALCushort * = INTEGER; (* 2-byte unsigned *)
  233. ALCuint * = LONGINT; (* 4-byte signed *)
  234. ALCsizei * = LONGINT; (* 4-byte signed *)
  235. ALCenum * = LONGINT;
  236. ALCcontext * = ADDRESS;
  237. ALCdevice * = ADDRESS;
  238. PALCboolean * = ADDRESS; (* TO ALCBoolean; *)
  239. PALCfloat * = ADDRESS; (* TO ALCfloat; *)
  240. PALCdouble * = ADDRESS; (* TO ALCDouble; *)
  241. PALCbyte * = ADDRESS; (* TO ALCbyte; *)
  242. PALCshort * = ADDRESS; (* TO ALCshort; *)
  243. PALCint * = ADDRESS; (* TO ALCint; *)
  244. PALCubyte * = ADDRESS; (* TO ALCubyte; *)
  245. PALCushort * = ADDRESS; (* TO ALCushort; *)
  246. PALCuint * = ADDRESS; (* TO ALCuint; *)
  247. CONST
  248. ALC_INVALID * = (-1);
  249. ALC_FALSE * = AL_FALSE;
  250. ALC_TRUE * = AL_TRUE;
  251. (** The Specifier string for default device *)
  252. ALC_MAJOR_VERSION * = 1000H;
  253. ALC_MINOR_VERSION * = 1001H;
  254. ALC_ATTRIBUTES_SIZE * = 1002H;
  255. ALC_ALL_ATTRIBUTES * = 1003H;
  256. ALC_DEFAULT_DEVICE_SPECIFIER * = 1004H;
  257. ALC_DEVICE_SPECIFIER * = 1005H;
  258. ALC_EXTENSIONS * = 1006H;
  259. (** Capture extension *)
  260. ALC_CAPTURE_DEVICE_SPECIFIER * = 310H;
  261. ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER * = 311H;
  262. ALC_CAPTURE_SAMPLES * = 312H;
  263. ALC_FREQUENCY * = 1007H; (* followed by <int> Hz *)
  264. ALC_REFRESH * = 1008H; (* followed by <int> Hz *)
  265. ALC_SYNC * = 1009H; (* followed by AL_TRUE, AL_FALSE *)
  266. ALC_MONO_SOURCES * = 1010H; (* followed by <int> Num of requested Mono (3D) Sources *)
  267. ALC_STEREO_SOURCES * = 1011H; (* followed by <int> Num of requested Stereo Sources *)
  268. (** errors *)
  269. ALC_NO_ERROR * = ALC_FALSE;
  270. ALC_INVALID_DEVICE * = 0A001H;
  271. ALC_INVALID_CONTEXT * = 0A002H;
  272. ALC_INVALID_ENUM * = 0A003H;
  273. ALC_INVALID_VALUE * = 0A004H;
  274. ALC_OUT_OF_MEMORY * = 0A005H;
  275. (*!************ alext.h *********)
  276. (****************************)
  277. AL_FORMAT_IMA_ADPCM_MONO16_EXT * =10000H;
  278. AL_FORMAT_IMA_ADPCM_STEREO16_EXT * =10001H;
  279. AL_FORMAT_WAVE_EXT * =10002H;
  280. AL_FORMAT_VORBIS_EXT * =10003H;
  281. AL_FORMAT_QUAD8_LOKI * =10004H;
  282. AL_FORMAT_QUAD16_LOKI * =10005H;
  283. AL_FORMAT_MONO_FLOAT32 * =10010H;
  284. AL_FORMAT_STEREO_FLOAT32 * =10011H;
  285. AL_FORMAT_MONO_DOUBLE_EXT * =10012H;
  286. AL_FORMAT_STEREO_DOUBLE_EXT * =10013H;
  287. ALC_CHAN_MAIN_LOKI * =500001H;
  288. ALC_CHAN_PCM_LOKI * =500002H;
  289. ALC_CHAN_CD_LOKI * =500003H;
  290. ALC_DEFAULT_ALL_DEVICES_SPECIFIER * =1012H;
  291. ALC_ALL_DEVICES_SPECIFIER * =1013H;
  292. AL_FORMAT_QUAD8 * =1204H;
  293. AL_FORMAT_QUAD16 * =1205H;
  294. AL_FORMAT_QUAD32 * =1206H;
  295. AL_FORMAT_REAR8 * =1207H;
  296. AL_FORMAT_REAR16 * =1208H;
  297. AL_FORMAT_REAR32 * =1209H;
  298. AL_FORMAT_51CHN8 * =120AH;
  299. AL_FORMAT_51CHN16 * =120BH;
  300. AL_FORMAT_51CHN32 * =120CH;
  301. AL_FORMAT_61CHN8 * =120DH;
  302. AL_FORMAT_61CHN16 * =120EH;
  303. AL_FORMAT_61CHN32 * =120FH;
  304. AL_FORMAT_71CHN8 * =1210H;
  305. AL_FORMAT_71CHN16 * =1211H;
  306. AL_FORMAT_71CHN32 * =1212H;
  307. AL_FORMAT_MONO_MULAW * =10014H;
  308. AL_FORMAT_STEREO_MULAW * =10015H;
  309. AL_FORMAT_QUAD_MULAW * =10021H;
  310. AL_FORMAT_REAR_MULAW * =10022H;
  311. AL_FORMAT_51CHN_MULAW * =10023H;
  312. AL_FORMAT_61CHN_MULAW * =10024H;
  313. AL_FORMAT_71CHN_MULAW * =10025H;
  314. AL_FORMAT_MONO_IMA4 * =1300H;
  315. AL_FORMAT_STEREO_IMA4 * =1301H;
  316. ALC_CONNECTED * =313H;
  317. AL_SOURCE_DISTANCE_MODEL* = 200H;
  318. AL_BYTE_RW_OFFSETS_SOFT* = 1031H;
  319. AL_SAMPLE_RW_OFFSETS_SOFT* = 1032H;
  320. AL_LOOP_POINTS_SOFT * = 2015H;
  321. VAR
  322. oallib: ADDRESS;
  323. (* Renderer State management *)
  324. alEnable-: PROCEDURE { C } (capability : ALenum);
  325. alDisable -: PROCEDURE { C } (capability : ALenum);
  326. alIsEnabled-: PROCEDURE { C } (capability : ALenum) : ALboolean;
  327. (* alHint-: PROCEDURE { C } (target, mode : ALenum); *)
  328. (* State retrieval *)
  329. alGetBoolean- : PROCEDURE { C } (param : ALenum) : ALboolean;
  330. alGetInteger-: PROCEDURE { C } (param : ALenum) : ALint;
  331. alGetFloat-: PROCEDURE { C } (param : ALenum) : ALfloat;
  332. alGetDouble-: PROCEDURE { C } (param : ALenum) : ALdouble;
  333. alGetBooleanv-: PROCEDURE { C } (param : ALenum; VAR data : ALboolean);
  334. alGetIntegerv-: PROCEDURE { C } (param : ALenum; VAR data : ALint);
  335. alGetFloatv-: PROCEDURE { C } (param : ALenum; VAR data : ALfloat);
  336. alGetDoublev-: PROCEDURE { C } (param : ALenum; VAR data : ALdouble);
  337. alGetString-: PROCEDURE { C } (param : ALenum) : PALubyte;
  338. (*
  339. * Error support.
  340. * Obtain the most recent error generated in the AL state machine.
  341. *)
  342. alGetError-: PROCEDURE { C } () : ALenum;
  343. (*
  344. * Extension support.
  345. * Query for the presence of an extension, and obtain any appropriate
  346. * function pointers and enum values.
  347. *)
  348. alIsExtensionPresent-: PROCEDURE { C } (CONST fname : ARRAY OF CHAR) : ALboolean;
  349. alGetProcAddress-: PROCEDURE { C } (CONST fname : ARRAY OF CHAR): ADDRESS;
  350. alGetEnumValue-: PROCEDURE { C } (VAR ename : ALubyte) : ALenum;
  351. (* LISTENER
  352. Listener represents the location and orientation of the
  353. 'user' in 3D-space.
  354. Properties include: -
  355. Gain AL_GAIN ALfloat
  356. Position AL_POSITION ALfloat[3]
  357. Velocity AL_VELOCITY ALfloat[3]
  358. Orientation AL_ORIENTATION ALfloat[6] (Forward then Up vectors)
  359. *)
  360. (* Set Listener parameters *)
  361. alListenerf-: PROCEDURE { C } (param : ALenum; value : ALfloat);
  362. alListener3f-: PROCEDURE { C } (param : ALenum; v1, v2, v3 : ALfloat);
  363. alListenerfv-: PROCEDURE { C } (param : ALenum; values : PALfloat);
  364. alListeneri-: PROCEDURE { C } (param : ALenum; value : ALint);
  365. alListener3i-: PROCEDURE { C } (param : ALenum; v1, v2, v3 : ALint);
  366. alListeneriv-: PROCEDURE { C } (param : ALenum; values : PALint);
  367. (* Get Listener parameters *)
  368. alGetListenerf-: PROCEDURE { C } (param : ALenum; VAR value : ALfloat);
  369. alGetListener3f-: PROCEDURE { C } (param : ALenum; VAR v1, v2, v3 : ALfloat);
  370. alGetListenerfv-: PROCEDURE { C } (param : ALenum; values : PALfloat);
  371. alGetListeneri-: PROCEDURE { C } (param : ALenum; VAR value : ALint);
  372. alGetListener3i-: PROCEDURE { C } (param : ALenum; VAR v1, v2, v3: ALint);
  373. alGetListeneriv-: PROCEDURE { C } (param : ALenum; values : PALint);
  374. (*
  375. SOURCE
  376. Sources represent individual sound objects in 3D-space.
  377. Sources take the PCM data provided in the specified Buffer,
  378. apply Source-specific modifications, and then
  379. submit them to be mixed according to spatial arrangement etc.
  380. Properties include: -
  381. Gain AL_GAIN ALfloat
  382. Min Gain AL_MIN_GAIN ALfloat
  383. Max Gain AL_MAX_GAIN ALfloat
  384. Position AL_POSITION ALfloat[3]
  385. Velocity AL_VELOCITY ALfloat[3]
  386. Direction AL_DIRECTION ALfloat[3]
  387. Head Relative Mode AL_SOURCE_RELATIVE ALint (AL_TRUE or AL_FALSE)
  388. Reference Distance AL_REFERENCE_DISTANCE ALfloat
  389. Max Distance AL_MAX_DISTANCE ALfloat
  390. RollOff Factor AL_ROLLOFF_FACTOR ALfloat
  391. Inner Angle AL_CONE_INNER_ANGLE ALint or ALfloat
  392. Outer Angle AL_CONE_OUTER_ANGLE ALint or ALfloat
  393. Cone Outer Gain AL_CONE_OUTER_GAIN ALint or ALfloat
  394. Pitch AL_PITCH ALfloat
  395. Looping AL_LOOPING ALint (AL_TRUE or AL_FALSE)
  396. MS Offset AL_MSEC_OFFSET ALint or ALfloat
  397. Byte Offset AL_BYTE_OFFSET ALint or ALfloat
  398. Sample Offset AL_SAMPLE_OFFSET ALint or ALfloat
  399. Attached Buffer AL_BUFFER ALint
  400. State (Query only) AL_SOURCE_STATE ALint
  401. Buffers Queued (Query only) AL_BUFFERS_QUEUED ALint
  402. Buffers Processed (Query only) AL_BUFFERS_PROCESSED ALint
  403. *)
  404. (* Create Source objects *)
  405. alGenSources-: PROCEDURE { C } (n : ALsizei; sources : PALuint);
  406. (* Delete Source objects *)
  407. alDeleteSources-: PROCEDURE { C } (n : ALsizei; sources : PALuint);
  408. (* Verify a handle is a valid Source *)
  409. alIsSource-: PROCEDURE { C } (id : ALuint) : ALboolean;
  410. (* Set Source parameters *)
  411. alSourcef-: PROCEDURE { C } (source : ALuint; param : ALenum; value : ALfloat);
  412. alSource3f-: PROCEDURE { C } (source : ALuint; param : ALenum; v1, v2, v3 : ALfloat);
  413. alSourcefv-: PROCEDURE { C } (source : ALuint; param : ALenum; values : PALfloat);
  414. alSourcei-: PROCEDURE { C } (source : ALuint; param : ALenum; value : ALint);
  415. alSource3i-: PROCEDURE { C } (source : ALuint; param : ALenum; v1, v2, v3 : ALint);
  416. alSourceiv-: PROCEDURE { C } (source : ALuint; param : ALenum; values : PALint);
  417. (* Get Source parameters *)
  418. alGetSourcef-: PROCEDURE { C } (source : ALuint; param : ALenum; VAR value : ALfloat);
  419. alGetSource3f-: PROCEDURE { C } (source : ALuint; param : ALenum; VAR v1, v2, v3 : ALfloat);
  420. alGetSourcefv-: PROCEDURE { C } (source : ALuint; param : ALenum; values : PALfloat);
  421. alGetSourcei-: PROCEDURE { C } (source : ALuint; param : ALenum; VAR value : ALint);
  422. alGetSource3i-: PROCEDURE { C } (source : ALuint; param : ALenum; VAR v1, v2, v3 : ALint);
  423. alGetSourceiv-: PROCEDURE { C } (source : ALuint; param : ALenum; values : PALint);
  424. (* Source vector based playback calls *)
  425. (* Play, replay, or resume (if paused) a list of Sources *)
  426. alSourcePlayv-: PROCEDURE { C } (n : ALsizei; sources : PALuint);
  427. (* Pause a list of Sources *)
  428. alSourcePausev-: PROCEDURE { C } (n : ALsizei; sources : PALuint);
  429. (* Stop a list of Sources *)
  430. alSourceStopv-: PROCEDURE { C } (n : ALsizei; sources : PALuint);
  431. (* Rewind a list of Sources *)
  432. alSourceRewindv-: PROCEDURE { C } (n : ALsizei; sources : PALuint);
  433. (* Source based playback calls *)
  434. (* Play, replay, or resume a Source *)
  435. alSourcePlay-: PROCEDURE { C } ( source : ALuint);
  436. (* Pause a Source *)
  437. alSourcePause-: PROCEDURE { C } ( source : ALuint);
  438. (* Stop a Source *)
  439. alSourceStop-: PROCEDURE { C } (source : ALuint);
  440. (* Rewind a Source (set playback postiton to beginning) *)
  441. alSourceRewind-: PROCEDURE { C } (source : ALuint);
  442. (* Source Queuing *)
  443. alSourceQueueBuffers-: PROCEDURE { C } (source : ALuint; n : ALsizei; buffers : PALuint);
  444. alSourceUnqueueBuffers-: PROCEDURE { C } (source : ALuint; n : ALsizei; buffers : PALuint);
  445. (*
  446. BUFFER
  447. Buffer objects are storage space for sample data.
  448. Buffers are referred to by Sources. One Buffer can be used
  449. by multiple Sources.
  450. Properties include: -
  451. Frequency (Query only) AL_FREQUENCY ALint
  452. Size (Query only) AL_SIZE ALint
  453. Bits (Query only) AL_BITS ALint
  454. Channels (Query only) AL_CHANNELS ALint
  455. *)
  456. (* Create Buffer objects *)
  457. alGenBuffers-: PROCEDURE { C } (n : ALsizei; buffers : PALuint);
  458. (* Delete Buffer objects *)
  459. alDeleteBuffers-: PROCEDURE { C } (n : ALsizei; buffers : PALuint);
  460. (* Verify a handle is a valid Buffer *)
  461. alIsBuffer-: PROCEDURE { C } (buffer : ALuint) : ALboolean;
  462. (* Specify the data to be copied into a buffer *)
  463. alBufferData-: PROCEDURE { C } (buffer : ALuint; format : ALenum; data: ADDRESS ; size, freq : ALsizei);
  464. (* Set Buffer parameters *)
  465. alBufferf-: PROCEDURE { C } (buffer : ALuint; param : ALenum; value : ALfloat);
  466. alBuffer3f-: PROCEDURE { C } (buffer : ALuint; param : ALenum; v1, v2, v3: ALfloat);
  467. alBufferfv-: PROCEDURE { C } (buffer : ALuint; param : ALenum; value : PALfloat);
  468. alBufferi-: PROCEDURE { C } (buffer : ALuint; param : ALenum; value : ALint);
  469. alBuffer3i-: PROCEDURE { C } (buffer : ALuint; param : ALenum; v1, v2, v3 : ALint);
  470. alBufferiv-: PROCEDURE { C } (buffer : ALuint; param : ALenum; value : PALint);
  471. (* Get Buffer parameters *)
  472. alGetBufferf-: PROCEDURE { C } (buffer : ALuint; param : ALenum; VAR value : ALfloat);
  473. alGetBuffer3f-: PROCEDURE { C } (buffer : ALuint; param : ALenum; VAR v1, v2, v3: ALfloat);
  474. alGetBufferfv-: PROCEDURE { C } (buffer : ALuint; param : ALenum; value : PALfloat);
  475. alGetBufferi-: PROCEDURE { C } (buffer : ALuint; param : ALenum; VAR value : ALint);
  476. alGetBuffer3i-: PROCEDURE { C } (buffer : ALuint; param : ALenum; VAR v1, v2, v3 : ALint);
  477. alGetBufferiv-: PROCEDURE { C } (buffer : ALuint; param : ALenum; value : PALint);
  478. (* Global Parameters *)
  479. alDistanceModel-: PROCEDURE { C } (value : ALenum);
  480. alDopplerFactor-: PROCEDURE { C } (value : ALfloat);
  481. alSpeedOfSound-: PROCEDURE { C } (value : ALfloat);
  482. alDopplerVelocity-: PROCEDURE { C } (value : ALfloat);
  483. (* Device Management *)
  484. (*! alcOpenDevice-: PROCEDURE { C } (CONST deviceName : ARRAY OF CHAR) : ALCdevice; *)
  485. alcOpenDeviceXXX-: PROCEDURE { C } (deviceName : ADDRESS) : ALCdevice;
  486. alcCloseDevice-: PROCEDURE { C } (device : ALCdevice): ALCboolean;
  487. (* Context Management *)
  488. alcCreateContext-: PROCEDURE { C } (device : ALCdevice; attrList : PALCint) : ALCcontext;
  489. alcMakeContextCurrent-: PROCEDURE { C } ( context : ALCcontext) : ALCboolean;
  490. alcProcessContext-: PROCEDURE { C } (context : ALCcontext);
  491. alcGetCurrentContext-: PROCEDURE { C } () : ALCcontext;
  492. alcGetContextsDevice-: PROCEDURE { C } (context : ALCcontext) : ALCdevice;
  493. alcSuspendContext-: PROCEDURE { C } (context : ALCcontext);
  494. alcDestroyContext-: PROCEDURE { C } (context : ALCcontext);
  495. (* Error support.
  496. * Obtain the most recent Context error
  497. *)
  498. alcGetError-: PROCEDURE { C } (device : ALCdevice) : ALCenum;
  499. (*
  500. * Extension support.
  501. * Query for the presence of an extension, and obtain any appropriate
  502. * function pointers and enum values.
  503. *)
  504. (*! alcIsExtensionPresent- : PROCEDURE { C } (device : ALCdevice; CONST extName : ARRAY OF CHAR) : ALCboolean; *)
  505. alcIsExtensionPresentXXX- : PROCEDURE { C } (device : ALCdevice; extName : ADDRESS) : ALCboolean;
  506. (*! alcGetProcAddress-: PROCEDURE { C } (device : ALCdevice; CONST funcName: ARRAY OF CHAR): ADDRESS; *)
  507. alcGetProcAddressXXX-: PROCEDURE { C } (device : ALCdevice; funcName: ADDRESS): ADDRESS;
  508. alcGetEnumValue-: PROCEDURE { C } (device : ALCdevice; VAR enumName : ALCubyte) : ALCenum;
  509. (* Query functions *)
  510. alcGetString-: PROCEDURE { C } (device : ALCdevice; param : ALCenum) : LONGINT;
  511. alcGetIntegerv -: PROCEDURE { C } ( device : ALCdevice; param : ALCenum; size : ALCsizei; data : PALCint);
  512. (* Capture functions *)
  513. (*! alcCaptureOpenDevice-: PROCEDURE { C } (CONST devicename: ARRAY OF CHAR; frequency: ALCuint; format: ALCenum; buffersize: ALCsizei): ALCdevice; *)
  514. alcCaptureOpenDeviceXXX-: PROCEDURE { C } (devicename: ADDRESS;
  515. frequency: ALCuint; format: ALCenum; buffersize: ALCsizei): ALCdevice;
  516. alcCaptureCloseDevice-: PROCEDURE { C } (device: ALCdevice): ALCboolean;
  517. alcCaptureStart-: PROCEDURE { C } (device: ALCdevice);
  518. alcCaptureStop-: PROCEDURE { C } (device: ALCdevice);
  519. alcCaptureSamples-: PROCEDURE { C } (device: ALCdevice; buffer: ADDRESS; samples: ALCsizei);
  520. (*
  521. (* extensions *)
  522. alBufferDataStatic-: PROCEDURE { C } (buffer: ALint; format: ALenum; data: ADDRESS; lenx: ALsizei; freq: ALsizei);
  523. alcSetThreadContext-: PROCEDURE { C }(context: ALCcontext ): ALCboolean;
  524. alcGetThreadContext-: PROCEDURE { C } (): ALCcontext;
  525. alBufferSubDataSOFT-: PROCEDURE { C } (buffer: ALuint; format: ALenum; data: ADDRESS; offset: ALsizei; lengthx: ALsizei);
  526. *)
  527. PROCEDURE LoadFunctions;
  528. BEGIN
  529. oallib := Unix.Dlopen(libname, 2 );
  530. ASSERT(oallib # 0, 103);
  531. Unix.Dlsym( oallib, "alEnable", ADDRESSOF( alEnable));
  532. Unix.Dlsym( oallib, "alDisable", ADDRESSOF( alDisable));
  533. Unix.Dlsym( oallib, "alIsEnabled", ADDRESSOF( alIsEnabled));
  534. Unix.Dlsym( oallib, "alGetBoolean", ADDRESSOF( alGetBoolean));
  535. Unix.Dlsym( oallib, "alGetInteger", ADDRESSOF( alGetInteger));
  536. Unix.Dlsym( oallib, "alGetFloat", ADDRESSOF( alGetFloat));
  537. Unix.Dlsym( oallib, "alGetDouble", ADDRESSOF( alGetDouble));
  538. Unix.Dlsym( oallib, "alGetBooleanv", ADDRESSOF( alGetBooleanv));
  539. Unix.Dlsym( oallib, "alGetIntegerv", ADDRESSOF( alGetIntegerv));
  540. Unix.Dlsym( oallib, "alGetFloatv", ADDRESSOF( alGetFloatv));
  541. Unix.Dlsym( oallib, "alGetDoublev", ADDRESSOF( alGetDoublev));
  542. Unix.Dlsym( oallib, "alGetString", ADDRESSOF( alGetString));
  543. Unix.Dlsym( oallib, "alGetError", ADDRESSOF( alGetError));
  544. Unix.Dlsym( oallib, "alIsExtensionPresent", ADDRESSOF( alIsExtensionPresent));
  545. Unix.Dlsym( oallib, "alGetProcAddress", ADDRESSOF( alGetProcAddress));
  546. Unix.Dlsym( oallib, "alGetEnumValue", ADDRESSOF( alGetEnumValue));
  547. Unix.Dlsym( oallib, "alListenerf", ADDRESSOF( alListenerf));
  548. Unix.Dlsym( oallib, "alListener3f", ADDRESSOF( alListener3f));
  549. Unix.Dlsym( oallib, "alListenerfv", ADDRESSOF( alListenerfv));
  550. Unix.Dlsym( oallib, "alListeneri", ADDRESSOF( alListeneri));
  551. Unix.Dlsym( oallib, "alListener3i", ADDRESSOF( alListener3i));
  552. Unix.Dlsym( oallib, "alListeneriv", ADDRESSOF( alListeneriv));
  553. Unix.Dlsym( oallib, "alGetListenerf", ADDRESSOF( alGetListenerf));
  554. Unix.Dlsym( oallib, "alGetListener3f", ADDRESSOF( alGetListener3f));
  555. Unix.Dlsym( oallib, "alGetListenerfv", ADDRESSOF( alGetListenerfv));
  556. Unix.Dlsym( oallib, "alGetListeneri", ADDRESSOF( alGetListeneri));
  557. Unix.Dlsym( oallib, "alGetListener3i", ADDRESSOF( alGetListener3i));
  558. Unix.Dlsym( oallib, "alGetListeneriv", ADDRESSOF( alGetListeneriv));
  559. Unix.Dlsym( oallib, "alGenSources", ADDRESSOF( alGenSources));
  560. Unix.Dlsym( oallib, "alDeleteSources", ADDRESSOF( alDeleteSources));
  561. Unix.Dlsym( oallib, "alIsSource", ADDRESSOF( alIsSource));
  562. Unix.Dlsym( oallib, "alSourcei", ADDRESSOF( alSourcei));
  563. Unix.Dlsym( oallib, "alSourcef", ADDRESSOF( alSourcef));
  564. Unix.Dlsym( oallib, "alSource3f", ADDRESSOF( alSource3f));
  565. Unix.Dlsym( oallib, "alSourcefv", ADDRESSOF( alSourcefv));
  566. Unix.Dlsym( oallib, "alSourcei", ADDRESSOF( alSourcei));
  567. Unix.Dlsym( oallib, "alSource3i", ADDRESSOF( alSource3i));
  568. Unix.Dlsym( oallib, "alSourceiv", ADDRESSOF( alSourceiv));
  569. Unix.Dlsym( oallib, "alGetSourcef", ADDRESSOF( alGetSourcef));
  570. Unix.Dlsym( oallib, "alGetSource3f", ADDRESSOF( alGetSource3f));
  571. Unix.Dlsym( oallib, "alGetSourcefv", ADDRESSOF( alGetSourcefv));
  572. Unix.Dlsym( oallib, "alGetSourcei", ADDRESSOF( alGetSourcei));
  573. Unix.Dlsym( oallib, "alGetSource3i", ADDRESSOF( alGetSource3i));
  574. Unix.Dlsym( oallib, "alGetSourceiv", ADDRESSOF( alGetSourceiv));
  575. Unix.Dlsym( oallib, "alSourcePlayv", ADDRESSOF( alSourcePlayv));
  576. Unix.Dlsym( oallib, "alSourcePausev", ADDRESSOF( alSourcePausev));
  577. Unix.Dlsym( oallib, "alSourceStopv", ADDRESSOF( alSourceStopv));
  578. Unix.Dlsym( oallib, "alSourceRewindv", ADDRESSOF( alSourceRewindv));
  579. Unix.Dlsym( oallib, "alSourcePlay", ADDRESSOF( alSourcePlay));
  580. Unix.Dlsym( oallib, "alSourcePause", ADDRESSOF( alSourcePause));
  581. Unix.Dlsym( oallib, "alSourceStop", ADDRESSOF( alSourceStop));
  582. Unix.Dlsym( oallib, "alSourceRewind", ADDRESSOF( alSourceRewind));
  583. Unix.Dlsym( oallib, "alGenBuffers", ADDRESSOF( alGenBuffers));
  584. Unix.Dlsym( oallib, "alDeleteBuffers", ADDRESSOF( alDeleteBuffers));
  585. Unix.Dlsym( oallib, "alIsBuffer", ADDRESSOF( alIsBuffer));
  586. Unix.Dlsym( oallib, "alBufferData", ADDRESSOF( alBufferData));
  587. Unix.Dlsym( oallib, "alBufferf", ADDRESSOF( alBufferf));
  588. Unix.Dlsym( oallib, "alBuffer3f", ADDRESSOF( alBuffer3f));
  589. Unix.Dlsym( oallib, "alBufferfv", ADDRESSOF( alBufferfv));
  590. Unix.Dlsym( oallib, "alBufferi", ADDRESSOF( alBufferi));
  591. Unix.Dlsym( oallib, "alBuffer3i", ADDRESSOF( alBuffer3i));
  592. Unix.Dlsym( oallib, "alBufferiv", ADDRESSOF( alBufferiv));
  593. Unix.Dlsym( oallib, "alGetBufferf", ADDRESSOF( alGetBufferf));
  594. Unix.Dlsym( oallib, "alGetBuffer3f", ADDRESSOF( alGetBuffer3f));
  595. Unix.Dlsym( oallib, "alGetBufferfv", ADDRESSOF( alGetBufferfv));
  596. Unix.Dlsym( oallib, "alGetBufferi", ADDRESSOF( alGetBufferi));
  597. Unix.Dlsym( oallib, "alGetBuffer3i", ADDRESSOF( alGetBuffer3i));
  598. Unix.Dlsym( oallib, "alGetBufferiv", ADDRESSOF( alGetBufferiv));
  599. Unix.Dlsym( oallib, "alSourceQueueBuffers", ADDRESSOF( alSourceQueueBuffers));
  600. Unix.Dlsym( oallib, "alSourceUnqueueBuffers", ADDRESSOF( alSourceUnqueueBuffers));
  601. Unix.Dlsym( oallib, "alDistanceModel", ADDRESSOF( alDistanceModel));
  602. Unix.Dlsym( oallib, "alDopplerFactor", ADDRESSOF( alDopplerFactor));
  603. Unix.Dlsym( oallib, "alSpeedOfSound", ADDRESSOF( alSpeedOfSound));
  604. Unix.Dlsym( oallib, "alDopplerVelocity", ADDRESSOF( alDopplerVelocity));
  605. Unix.Dlsym( oallib, "alcOpenDevice", ADDRESSOF( alcOpenDeviceXXX));
  606. Unix.Dlsym( oallib, "alcCloseDevice", ADDRESSOF( alcCloseDevice));
  607. Unix.Dlsym( oallib, "alcCreateContext", ADDRESSOF( alcCreateContext));
  608. Unix.Dlsym( oallib, "alcMakeContextCurrent", ADDRESSOF( alcMakeContextCurrent));
  609. Unix.Dlsym( oallib, "alcProcessContext", ADDRESSOF( alcProcessContext));
  610. Unix.Dlsym( oallib, "alcGetCurrentContext", ADDRESSOF( alcGetCurrentContext));
  611. Unix.Dlsym( oallib, "alcGetContextsDevice", ADDRESSOF( alcGetContextsDevice));
  612. Unix.Dlsym( oallib, "alcSuspendContext", ADDRESSOF( alcSuspendContext));
  613. Unix.Dlsym( oallib, "alcDestroyContext", ADDRESSOF( alcDestroyContext));
  614. Unix.Dlsym( oallib, "alcGetError", ADDRESSOF( alcGetError));
  615. Unix.Dlsym( oallib, "alcGetString", ADDRESSOF( alcGetString));
  616. Unix.Dlsym( oallib, "alcGetIntegerv", ADDRESSOF( alcGetIntegerv));
  617. Unix.Dlsym( oallib, "alcIsExtensionPresent", ADDRESSOF( alcIsExtensionPresentXXX));
  618. Unix.Dlsym( oallib, "alcGetProcAddress", ADDRESSOF( alcGetProcAddressXXX));
  619. Unix.Dlsym( oallib, "alcGetEnumValue", ADDRESSOF( alcGetEnumValue));
  620. Unix.Dlsym( oallib, "alcCaptureOpenDevice", ADDRESSOF( alcCaptureOpenDeviceXXX));
  621. Unix.Dlsym( oallib, "alcCaptureCloseDevice", ADDRESSOF( alcCaptureCloseDevice));
  622. Unix.Dlsym( oallib, "alcCaptureStart", ADDRESSOF( alcCaptureStart));
  623. Unix.Dlsym( oallib, "alcCaptureStop", ADDRESSOF( alcCaptureStop));
  624. Unix.Dlsym( oallib, "alcCaptureSamples", ADDRESSOF( alcCaptureSamples));
  625. (*
  626. (* extensions *)
  627. Unix.Dlsym( oallib, "alBufferDataStatic", ADDRESSOF( alBufferDataStatic));
  628. Unix.Dlsym( oallib, "alcSetThreadContext", ADDRESSOF( alcSetThreadContext));
  629. Unix.Dlsym( oallib, "alcGetThreadContext", ADDRESSOF( alcGetThreadContext));
  630. Unix.Dlsym( oallib, "alBufferSubDataSOFT", ADDRESSOF( alBufferSubDataSOFT));
  631. *)
  632. END LoadFunctions;
  633. PROCEDURE OnClose;
  634. BEGIN
  635. IF oallib # 0 THEN
  636. Unix.Dlclose(oallib);
  637. KernelLog.String(libname); KernelLog.String(' unloaded.'); KernelLog.Ln;
  638. END;
  639. END OnClose;
  640. (* utilities, and wrappers *)
  641. PROCEDURE alcOpenDevice*( CONST deviceName: ARRAY OF CHAR ): ALCdevice;
  642. VAR dev: ALCdevice;
  643. BEGIN
  644. dev := alcOpenDeviceXXX( ADDRESSOF( deviceName[0] ) );
  645. RETURN dev
  646. END alcOpenDevice;
  647. PROCEDURE alcCaptureOpenDevice*( CONST deviceName: ARRAY OF CHAR;
  648. frequency: ALCuint; format: ALCenum; buffersize: ALCsizei): ALCdevice;
  649. VAR dev: ALCdevice;
  650. BEGIN
  651. dev := alcCaptureOpenDeviceXXX( ADDRESSOF( deviceName[0] ), frequency, format, buffersize );
  652. RETURN dev
  653. END alcCaptureOpenDevice;
  654. PROCEDURE alcIsExtensionPresent* (device : ALCdevice; CONST extName : ARRAY OF CHAR) : ALCboolean;
  655. VAR res: ALCboolean;
  656. BEGIN
  657. res := alcIsExtensionPresentXXX(device, ADDRESSOF(extName[0]));
  658. RETURN res;
  659. END alcIsExtensionPresent;
  660. PROCEDURE alcGetProcAddress* (device : ALCdevice; CONST funcName: ARRAY OF CHAR): ADDRESS;
  661. VAR adr: ADDRESS;
  662. BEGIN
  663. adr := alcGetProcAddressXXX (device, ADDRESSOF(funcName[0]));
  664. RETURN adr;
  665. END alcGetProcAddress;
  666. (* Get string from address *)
  667. PROCEDURE GetStringFromAddr(adr: ADDRESS): Strings.String;
  668. VAR sadr, sadr1: ADDRESS;
  669. i, cnt: LONGINT;
  670. ch: CHAR;
  671. s: Strings.String;
  672. BEGIN
  673. sadr := adr;
  674. (* find length *)
  675. cnt :=0;
  676. sadr1 := sadr;
  677. IF sadr1 # 0 THEN
  678. SYSTEM.GET(sadr1,ch);
  679. WHILE (ch # 0X) DO INC(cnt); INC(sadr1); SYSTEM.GET(sadr1,ch); END;
  680. END;
  681. IF cnt = 0 THEN (* empty string *)
  682. NEW(s,1); s[0]:=0X; RETURN s
  683. END;
  684. NEW(s, cnt+1);
  685. i:=0;
  686. sadr1 := sadr;
  687. SYSTEM.GET(sadr1,ch);
  688. WHILE (i< cnt) & (ch # 0X) DO
  689. s^[i] := ch; INC(i); INC(sadr1);
  690. SYSTEM.GET(sadr1,ch);
  691. END;
  692. RETURN s;
  693. END GetStringFromAddr;
  694. PROCEDURE ALGetString*( name: ALCenum): Strings.String;
  695. VAR sadr: LONGINT;
  696. BEGIN
  697. sadr := alGetString( name);
  698. RETURN GetStringFromAddr(sadr);
  699. END ALGetString;
  700. PROCEDURE ALCGetString*(device: ALCdevice; name: ALCenum): Strings.String;
  701. VAR sadr: LONGINT;
  702. BEGIN
  703. sadr := alcGetString(device, name);
  704. RETURN GetStringFromAddr(sadr);
  705. END ALCGetString;
  706. PROCEDURE GetDevStringFromAddr(adr: LONGINT): Strings.String;
  707. VAR sadr, sadr1: LONGINT;
  708. i, cnt: LONGINT;
  709. ch: CHAR;
  710. s: Strings.String;
  711. BEGIN
  712. sadr := adr;
  713. (* find length *)
  714. cnt :=0;
  715. sadr1 := sadr;
  716. IF sadr1 # 0 THEN
  717. SYSTEM.GET(sadr1,ch);
  718. WHILE (ch # 0X) DO INC(cnt); INC(sadr1); SYSTEM.GET(sadr1,ch); END;
  719. END;
  720. IF cnt = 0 THEN (* empty string or end of list *)
  721. RETURN NIL
  722. END;
  723. (* copy chars to string *)
  724. NEW(s, cnt+1);
  725. i:=0;
  726. sadr1 := sadr;
  727. SYSTEM.GET(sadr1,ch);
  728. WHILE (i< cnt) & (ch # 0X) DO
  729. s^[i] := ch; INC(i); INC(sadr1);
  730. SYSTEM.GET(sadr1,ch);
  731. END;
  732. RETURN s;
  733. END GetDevStringFromAddr;
  734. (** go through device list, (each device terminated with a single NULL, list terminated with double NULL *)
  735. PROCEDURE ALCGetDeviceList*(device: ALCdevice; name: ALCenum): PString256;
  736. VAR sadr, sadr0: LONGINT;
  737. slen, index: LONGINT;
  738. str: Strings.String;
  739. dynstr: PString256;
  740. BEGIN
  741. (* count the number of devices in the list *)
  742. sadr0 := alcGetString(device, name);
  743. sadr := sadr0;
  744. str := GetDevStringFromAddr(sadr);
  745. index := 0;
  746. WHILE (str # NIL) & (index<10) DO (* limit the count *)
  747. slen := Strings.Length(str^);
  748. sadr := sadr + slen +1;
  749. str := GetDevStringFromAddr(sadr);
  750. INC(index);
  751. END;
  752. (* copy to string list *)
  753. NEW(dynstr, index);
  754. sadr0 := alcGetString(device, name);
  755. sadr := sadr0;
  756. str := GetDevStringFromAddr(sadr);
  757. index := 0;
  758. WHILE (str # NIL) & (index<10) DO
  759. COPY(str^, dynstr^[index]);
  760. slen := Strings.Length(str^);
  761. sadr := sadr + slen +1;
  762. str := GetDevStringFromAddr(sadr);
  763. INC(index);
  764. END;
  765. RETURN dynstr;
  766. END ALCGetDeviceList;
  767. BEGIN
  768. LoadFunctions;
  769. Modules.InstallTermHandler(OnClose) ;
  770. END OpenAL.
  771. SystemTools.Free OpenAL~