app-extensions.sgml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. <appendix>
  2. <title>Extensions</title>
  3. <para>
  4. Extensions are a way to provide for future expansion of the &AL; API.
  5. Typically, extensions are specified and proposed by a vendor, and
  6. can be treated as vendor neutral if no intellectual property
  7. restrictions apply. Extensions can also be specified as, or
  8. promoted to be, ARB extensions, which is usually the final step
  9. before adding a tried and true extension to the core API. ARB
  10. extensions, once specified, have mandatory presence for
  11. backwards compatibility. The handling of vendors-specific or
  12. multi-vendor extensions is left to the implementation. The IA-SIG
  13. I3DL2 Extension is an example of multi-vender extensions to
  14. the current &AL; core API.
  15. </para>
  16. <sect1>
  17. <title>Extension Query</title>
  18. <para>
  19. To use an extension, the application will have to obtain function addresses
  20. and enumeration values. Before an extension can be used, the application will
  21. have to verify
  22. the presence of an extension using IsExtensionPresent(). The application
  23. can then retrieve the address (function pointer) of an extension entry
  24. point using GetProcAddress. Extensions and entry points can be
  25. Context-specific, and the application can not count on an Extension being available
  26. based on the mere return of an entry point. The application also
  27. has to maintain pointers on a per-Context basis.
  28. <funcsynopsis>
  29. <funcprototype>
  30. <funcdef> &bool; <function>IsExtensionPresent</function></funcdef>
  31. <paramdef> const &ubyte; * <parameter>extName</parameter></paramdef>
  32. </funcprototype>
  33. </funcsynopsis>
  34. Returns TRUE if the given extension is supported for the current
  35. context, FALSE otherwise.
  36. </para>
  37. <![ %Annote [
  38. <note id="ann-bk000721-22"><title>Annotation (IsExtensionPresent)</title><para>
  39. This function is inspired by the GLU addition, but placed in
  40. the core API as we intend to avoid a separate ALU. This function
  41. avoids potential string overflow and string parsing issues (strstr)
  42. raised by GetString( EXTENSIONS ).
  43. </para></note>
  44. ]]>
  45. <![ %Annote [
  46. <note><title>Annotation/ EXTENSIONS</title><para>
  47. GetString( EXTENSIONS ) is supported as well, as it allows for
  48. easy archiving and priting of the list of supported extensions.
  49. </para></note>
  50. ]]>
  51. </sect1>
  52. <sect1>
  53. <title>Retrieving Function Entry Addresses</title>
  54. <para>
  55. <funcsynopsis><funcprototype>
  56. <funcdef> &void;* <function>GetProcAddress</function></funcdef>
  57. <paramdef> const &ubyte; * <parameter>funcName</parameter></paramdef>
  58. </funcprototype></funcsynopsis>
  59. Returns NULL if no entry point with the name funcName can be found.
  60. Implementations are free to return NULL if an entry point is present,
  61. but not applicable for the current context. However the specification
  62. does not guarantee this behavior.
  63. </para>
  64. <para>
  65. Applications can use GetProcAddress to obtain core API entry points,
  66. not just extensions. This is the recommended way to dynamically load
  67. and unload &AL; DLL's as sound drivers.
  68. </para>
  69. <![ %RFC [
  70. <note><title>RFC/bk000504:</title><para>
  71. Original spec required all addresses are Context independent.
  72. This matches the Linux &OGL; ABI specification, but imposes
  73. additional implementation constraints. For now, the specification
  74. does not guarantee this.
  75. </para></note>
  76. ]]>
  77. </sect1>
  78. <sect1>
  79. <title>Retrieving Enumeration Values</title>
  80. <para>
  81. To obtain enumeration values for extensions, the application has
  82. to use GetEnumValue of an extension token. Enumeration values are
  83. defined within the &AL; namespace and allocated according to
  84. specification of the core API and the extensions, thus they are
  85. context-independent.
  86. <funcsynopsis><funcprototype>
  87. <funcdef> &uint; <function> GetEnumValue </function></funcdef>
  88. <paramdef> const &ubyte;<parameter> enumName </parameter></paramdef>
  89. </funcprototype></funcsynopsis>
  90. Returns 0 if the enumeration can not be found. The presence of an
  91. enum value does not guarantee the applicability of an extension
  92. to the current context. A non-zero return indicates merely that
  93. the implementation is aware of the existence of this extension.
  94. Implementations should not attempt to return 0 to indicate that
  95. the extensions is not supported for the current context.
  96. </para>
  97. <![ %Annote [
  98. <note><title>Annotation/ enums with value zero</title><para>
  99. The literal value 0 is guaranteed for a number of AL
  100. enums, such as FALSE, NONE, ZERO. As with GL applications
  101. might employ sloppy use of this identity. It also means
  102. that enums with zero value can not be queried through
  103. GetEnumValue, a minor flaw given the constraints of
  104. ABI backward compatibility. The recommended value to
  105. compare GetEnumValue results with is NONE.
  106. </para></note>
  107. ]]>
  108. </sect1>
  109. <sect1>
  110. <title>Naming Conventions</title>
  111. <para>
  112. Extensions are required to use a postfix that separates the
  113. extension namespace from the core API's namespace.
  114. For example, an ARB-approved extension would use
  115. "_ARB" with tokens (ALenum), and "ARB" with commands (function
  116. names). A vendor specific extension uses a vendor-chosen
  117. postfix, e.g. Loki Extensions use "_LOKI" and "LOKI",
  118. respectively.
  119. </para>
  120. </sect1>
  121. <sect1>
  122. <title>ARB Extensions</title>
  123. <para>
  124. There are no ARB Extensions defined yet, as the ARB has
  125. yet to be installed.
  126. </para>
  127. </sect1>
  128. <![ %Ext1 [
  129. <sect1>
  130. <title>Other Extension</title>
  131. <para>
  132. For the time being this section
  133. will list externally proposed extensions, namely
  134. the extension based on the IASIG Level 2 guideline.
  135. </para>
  136. <sect2>
  137. <title>IA-SIG I3DL2 Extension</title>
  138. <para>
  139. The IA-SIG I3DL2 guideline defines a set of parameters to control
  140. the reverberation characteristics of the environment the listener
  141. is located in, as well as filtering or muffling effects applied to
  142. individual Sources (useful for simulating the effects of obstacles
  143. and partitions). These features are supported by a vendor neutral
  144. extension to &AL; (TBA).
  145. The
  146. <ulink
  147. url="http://www.iasig.org/wg/3dwg/3dwg.htm"
  148. type="http">IA-SIG 3D Level 2 rendering guideline</ulink>
  149. provides related information.
  150. </para>
  151. <![ %Scratch [
  152. <![ %RFC [
  153. <note id="rfc-bk000626-07"><title>RFC: Global Attributes</title><para>
  154. Do we need global setters for these:
  155. DIRECT_IASIG/DIRECT_HIGH_FREQUENCY_IASIG?
  156. ROOM_IASIG/ROOM_HIGH_FREQUENCY_IASIG?
  157. </para></note>
  158. ]]>
  159. <sect3>
  160. <title>Listener Environment Attributes</title>
  161. <para>
  162. <table>
  163. <title>ENV_ROOM Attribute</title>
  164. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  165. <thead>
  166. <row>
  167. <entry>&Par;</>
  168. <entry>&Sig;</>
  169. <entry>&Val</>
  170. <entry>&Def;</>
  171. </row>
  172. </thead>
  173. <tbody>
  174. <row>
  175. <entry>ENV_ROOM_EXT</>
  176. <entry>f</>
  177. <entry>[0.0, 1.0]</>
  178. <entry> 1.0f</>
  179. </row>
  180. </tbody>
  181. </tgroup>
  182. </table>
  183. Description: ???
  184. </para>
  185. <para>
  186. <table>
  187. <title>ENV_ROOM_HIGH_FREQUENCY Attribute</title>
  188. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  189. <thead>
  190. <row>
  191. <entry>&Par;</>
  192. <entry>&Sig;</>
  193. <entry>&Val</>
  194. <entry>&Def;</>
  195. </row>
  196. </thead>
  197. <tbody>
  198. <row>
  199. <entry>ENV_ROOM_HIGH_FREQUENCY_EXT</>
  200. <entry>f</>
  201. <entry>[0.0, 1.0]</>
  202. <entry> 0.1f ???</>
  203. </row>
  204. </tbody>
  205. </tgroup>
  206. </table>
  207. Description: ???
  208. </para>
  209. <para>
  210. <table>
  211. <title>ENV_DECAY_TIME Attribute</title>
  212. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  213. <thead>
  214. <row>
  215. <entry>&Par;</>
  216. <entry>&Sig;</>
  217. <entry>&Val</>
  218. <entry>&Def;</>
  219. </row>
  220. </thead>
  221. <tbody>
  222. <row>
  223. <entry>ENV_DECAY_TIME_EXT</>
  224. <entry>f</>
  225. <entry>[0.1, 20.0]</>
  226. <entry> 1.0f</>
  227. </row>
  228. </tbody>
  229. </tgroup>
  230. </table>
  231. Description: ???
  232. What's up with the defaults? Not a normalized range
  233. and a global Scale to set?
  234. </para>
  235. <para>
  236. <table>
  237. <title>NV_DECAY_HIGH_FREQUENCY_RATIO Attribute</title>
  238. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  239. <thead>
  240. <row>
  241. <entry>&Par;</>
  242. <entry>&Sig;</>
  243. <entry>&Val</>
  244. <entry>&Def;</>
  245. </row>
  246. </thead>
  247. <tbody>
  248. <row>
  249. <entry>ENV_DECAY_HIGH_FREQUENCY_RATIO_EXT</>
  250. <entry>f</>
  251. <entry>[0.1, 2.0]</>
  252. <entry> 0.5f</>
  253. </row>
  254. </tbody>
  255. </tgroup>
  256. </table>
  257. Description: ???
  258. What's up with the defaults? Not a normalized range
  259. and a global Scale to set?
  260. </para>
  261. <para>
  262. <table>
  263. <title>ENV_REFLECTIONS Attribute</title>
  264. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  265. <thead>
  266. <row>
  267. <entry>&Par;</>
  268. <entry>&Sig;</>
  269. <entry>&Val</>
  270. <entry>&Def;</>
  271. </row>
  272. </thead>
  273. <tbody>
  274. <row>
  275. <entry>ENV_REFLECTIONS_EXT</>
  276. <entry>f</>
  277. <entry>[0.1, 3.0]</>
  278. <entry> 1.0f</>
  279. </row>
  280. </tbody>
  281. </tgroup>
  282. </table>
  283. Description: ???
  284. What's up with the defaults? Not a normalized range
  285. and a global Scale to set?
  286. </para>
  287. <para>
  288. <table>
  289. <title>ENV_REFLECTIONS_DELAY Attribute</title>
  290. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  291. <thead>
  292. <row>
  293. <entry>&Par;</>
  294. <entry>&Sig;</>
  295. <entry>&Val</>
  296. <entry>&Def;</>
  297. </row>
  298. </thead>
  299. <tbody>
  300. <row>
  301. <entry>ENV_REFLECTIONS_DELAY_EXT</>
  302. <entry>f</>
  303. <entry>[0.0, 0.3]</>
  304. <entry> 0.02f</>
  305. </row>
  306. </tbody>
  307. </tgroup>
  308. </table>
  309. Description: ???
  310. What's up with the defaults? Not a normalized range
  311. and a global Scale to set?
  312. </para>
  313. <para>
  314. <table>
  315. <title>ENV_REVERB Attribute</title>
  316. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  317. <thead>
  318. <row>
  319. <entry>&Par;</>
  320. <entry>&Sig;</>
  321. <entry>&Val</>
  322. <entry>&Def;</>
  323. </row>
  324. </thead>
  325. <tbody>
  326. <row>
  327. <entry>ENV_REVERB_EXT</>
  328. <entry>f</>
  329. <entry>[0.0, 10.0]</>
  330. <entry> 1.0f</>
  331. </row>
  332. </tbody>
  333. </tgroup>
  334. </table>
  335. Description: ???
  336. What's up with the defaults? Not a normalized range
  337. and a global Scale to set?
  338. </para>
  339. <para>
  340. <table>
  341. <title>ENV_REVERB_DELAY Attribute</title>
  342. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  343. <thead>
  344. <row>
  345. <entry>&Par;</>
  346. <entry>&Sig;</>
  347. <entry>&Val</>
  348. <entry>&Def;</>
  349. </row>
  350. </thead>
  351. <tbody>
  352. <row>
  353. <entry>ENV_REVERB_DELAY_EXT</>
  354. <entry>f</>
  355. <entry>[0.0, 0.1]</>
  356. <entry> 0.04f</>
  357. </row>
  358. </tbody>
  359. </tgroup>
  360. </table>
  361. Description: ???
  362. What's up with the defaults? Not a normalized range
  363. and a global Scale to set?
  364. </para>
  365. <para>
  366. <table>
  367. <title>ENV_DIFFUSION Attribute</title>
  368. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  369. <thead>
  370. <row>
  371. <entry>&Par;</>
  372. <entry>&Sig;</>
  373. <entry>&Val</>
  374. <entry>&Def;</>
  375. </row>
  376. </thead>
  377. <tbody>
  378. <row>
  379. <entry>ENV_DIFFUSION_EXT</>
  380. <entry>f</>
  381. <entry>[0.0, 100.0]</>
  382. <entry> 100.0f</>
  383. </row>
  384. </tbody>
  385. </tgroup>
  386. </table>
  387. Description: ???
  388. What's up with the defaults? Not a normalized range
  389. and a global Scale to set?
  390. </para>
  391. <para>
  392. <table>
  393. <title>ENV_DENSITY Attribute</title>
  394. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  395. <thead>
  396. <row>
  397. <entry>&Par;</>
  398. <entry>&Sig;</>
  399. <entry>&Val</>
  400. <entry>&Def;</>
  401. </row>
  402. </thead>
  403. <tbody>
  404. <row>
  405. <entry>ENV_DENSITY_EXT</>
  406. <entry>f</>
  407. <entry>[0.0, 100.0]</>
  408. <entry> 100.0f</>
  409. </row>
  410. </tbody>
  411. </tgroup>
  412. </table>
  413. Description: ???
  414. What's up with the defaults? Not a normalized range
  415. and a global Scale to set?
  416. </para>
  417. <para>
  418. <table>
  419. <title>ENV_HIGH_FREQUENCY_REFERENCE Attribute</title>
  420. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  421. <thead>
  422. <row>
  423. <entry>&Par;</>
  424. <entry>&Sig;</>
  425. <entry>&Val</>
  426. <entry>&Def;</>
  427. </row>
  428. </thead>
  429. <tbody>
  430. <row>
  431. <entry>ENV_HIGH_FREQUENCY_REFERENCE_EXT</>
  432. <entry>f</>
  433. <entry>[20.0, 20000.0]</>
  434. <entry>5000.0</>
  435. </row>
  436. </tbody>
  437. </tgroup>
  438. </table>
  439. Description: ???
  440. What's up with the defaults? Not a normalized range
  441. and a global Scale to set?
  442. </para>
  443. </sect3>
  444. <sect3>
  445. <title>Source Environment Attributes</title>
  446. <para>
  447. TBA.
  448. </para>
  449. </sect3>
  450. ]]>
  451. </sect2>
  452. </sect1>
  453. ]]> <!-- Environment -->
  454. <![ %Ext2 [
  455. <sect1>
  456. <title>Compatibility Extensions</title>
  457. <para>
  458. The extensions described have at one point been in use for
  459. experimental purposes, proof of concept, or short term needs.
  460. They are preserved for backwards compatibility. Use is not
  461. recommended, avialability not guaranteed. Most of these will
  462. be officially dropped by the time API revision 2.0 is released.
  463. </para>
  464. <sect2>
  465. <title>Loki Buffer InternalFormat Extension</title>
  466. <para>
  467. &AL; currently does not provide a separate processing
  468. chain for multichannel data. To handle stereo samples,
  469. the following alternative entry point to BufferData
  470. has been defined.
  471. <funcsynopsis><funcprototype>
  472. <funcdef> &void; <function> BufferWriteData</function></funcdef>
  473. <paramdef> &uint; <parameter>bufferName</parameter></paramdef>
  474. <paramdef> &enum; <parameter>format</parameter></paramdef>
  475. <paramdef> &void;* <parameter> data </parameter></paramdef>
  476. <paramdef> &sizei; <parameter> size </parameter></paramdef>
  477. <paramdef> &uint; <parameter>frequency</parameter></paramdef>
  478. <paramdef> &enum; <parameter>internalFormat</parameter></paramdef>
  479. </funcprototype></funcsynopsis>
  480. Valid formats for internalFormat are FORMAT_MONO8, FORMAT_MONO16,
  481. FORMAT_STEREO8, and FORMAT_STEREO16.
  482. </para>
  483. </sect2>
  484. <sect2>
  485. <title>Loki BufferAppendData Extension</title>
  486. <para>
  487. Experimental implementation to append data to an existing
  488. buffer. Obsoleted by Buffer Queueing. TBA.
  489. </para>
  490. <![ %Annote [
  491. <note><title>Annotation (GenStreamingBuffers):</title><para>
  492. It is possible that a consistent implementation of this
  493. extension will require distinguishing streaming from
  494. regular buffers at creation time, instead of making
  495. this distinction implied by the use of BufferData vs.
  496. BufferAppendData.
  497. </para></note>
  498. ]]>
  499. <![ %RFC [
  500. <note id="rfc-bk0000507-09"><title>RFC: alBufferAppendData</title><para>
  501. Specify data to be filled into a streaming buffer.
  502. This takes the current position at the time of the
  503. call, and returns the number of samples written.
  504. ALsizei ALAPIENTRY alBufferAppendData( ALuint buffer,
  505. ALenum format,
  506. ALvoid* data,
  507. ALsizei size,
  508. ALuint freq );
  509. </para></note>
  510. ]]>
  511. <![ %RFC [
  512. <note id="rfc-briareaos0006XX-01"><title>RFC: GenStreamingBuffers</title><para>
  513. Currently there is a function call on the Linux side,
  514. alGenStreamingBuffers(), which generates a Buffer intended
  515. for streaming. The intent of this function was the provide
  516. a clear creation point for streaming buffers, rather than
  517. the previous behaviour of a Buffer "magically" becoming
  518. streaming Buffer the first time BufferAppendData() was
  519. called on it. However, it's hard to believe this anomaly
  520. in the API can be any better. What about
  521. DelStreamingBuffers()? IsStreamingBuffer()?
  522. </para><para>
  523. The design problem here is that we handle qualitatively different
  524. objects using the same API. Streaming and non-streaming buffers
  525. are fundamentally different. If we create an API that makes it
  526. easy to mistake one for the other, or worse, if we decide to
  527. quietly convert one type of object into another in some cases,
  528. we create a plethora of error cases for the implementation and
  529. the app coder to catch. Separating the Factory methods for the
  530. objects allows us to omit an specialization API that will
  531. accidentally be called more than once, and saves us handling
  532. different stages of "initialization state". AL should not have
  533. any notion of "partially initialized" or "incomplete" objects:
  534. misery and despair lie down that road. If necessary the entire
  535. API should be duplicated (after all, nobody handles 1D, 2D, and
  536. 3D textures using the same GL API hooks), but as the AL
  537. implementation has the ability to distinguish streaming and
  538. non-streamin buffers internally there might not be a need.
  539. Unless a concrete alternative is proposed to resolve the "anomaly"
  540. it will be the preferred method to avoid an API that is
  541. leaner at the expense of being more error-prone.
  542. </para></note>
  543. ]]>
  544. </sect2>
  545. <sect2>
  546. <title>Loki Decoding Callback Extension</title>
  547. <para>
  548. Experimental implementation to allow the application to
  549. specify a decoding callback for compression formats
  550. and codecs not supported by &AL;. This is supposed to
  551. be used if full uncompression by the application is prohibited
  552. by memory footprint, but streaming (by queueing) is not
  553. desired as the compressed data can be kept in memory
  554. in its entirety.
  555. </para>
  556. <para>
  557. If mixing can be done from the compressed data directly,
  558. several sources can use the sample without having to
  559. be synchronized. For compression formats not supported
  560. by AL, however, partial decompression has to be done by
  561. the application. This extension allows for the implementation
  562. to "pull" data, using apllication provided decompression
  563. code.
  564. </para>
  565. <para>
  566. The use of this callback by the &AL;
  567. implementation makes sense only if late decompression
  568. (incremerntal, on demand, as needed for mixing) is done,
  569. as full early compression (ahead-of-time) inside the
  570. implementation would exact a similar memory footprint.
  571. </para>
  572. <para>
  573. TBA.
  574. </para>
  575. <para>
  576. This extension forces execution of third party code
  577. during (possibly threaded) driver operation, and
  578. might also require state management with global
  579. variables for decoder state, which raises issues
  580. of thread safety and use for multiple buffers. This
  581. extension should be obsolete as soon as &AL;
  582. supports a reasonable set of state of the art
  583. compression and encoding schemes.
  584. </para>
  585. </sect2>
  586. <sect2>
  587. <title>Loki Infinite Loop Extension</title>
  588. <para>
  589. To support infinite looping, a boolean LOOP was introduced.
  590. With the introduction of buffer queueing and the request for
  591. support for a limited number of repetitions, this mechanism
  592. was redundant. This extension is not supported for
  593. buffer queue operations, attempts to use it will cause
  594. an ILLEGAL_OPERATION error. For backwards compatibility
  595. it is supported as the equivalent to
  596. <literallayout>
  597. Source( sName, PLAY_COUNT, MAX_INTEGER )
  598. </literallayout>
  599. For the query LOOP==TRUE, the comparison
  600. PLAY_COUNT!=MAX_INTEGER has to be executed on
  601. the queue, not the current value which is decremented
  602. for a PLAYING Source.
  603. <table>
  604. <title>Source LOOP_LOKI Attribute</title>
  605. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  606. <colspec colname=c1>
  607. <colspec colname=c2>
  608. <colspec colname=c3>
  609. <colspec colname=c4>
  610. <spanspec spanname=hspan namest=c1 nameend=c4 align=left>
  611. <thead>
  612. <row>
  613. <entry>&Par;</>
  614. <entry>&Sig;</>
  615. <entry>&Val</>
  616. <entry>&Def;</>
  617. </row>
  618. </thead>
  619. <tbody>
  620. <row>
  621. <entry>LOOP_LOKI</>
  622. <entry>b</>
  623. <entry> &TRUE; &FALSE;</>
  624. <entry> &FALSE; </>
  625. </row>
  626. </tbody>
  627. </tgroup>
  628. </table>
  629. Description:
  630. &TRUE; indicates that the Source will perform an inifinite
  631. loop over the content of the current Buffer it refers to.
  632. </para>
  633. </sect2>
  634. <sect2>
  635. <title>Loki Byte Offset Extension</title>
  636. <para>
  637. The following has been obsoleted by explicit Source State query.
  638. hack.
  639. </para>
  640. <para>
  641. <table>
  642. <title>Buffer BYTE Offset attribute</title>
  643. <tgroup cols="4" align="left" colsep=1 rowsep=1>
  644. <thead>
  645. <row>
  646. <entry>&Par;</>
  647. <entry>&Sig;</>
  648. <entry>&Val</>
  649. <entry>&Def;</>
  650. </row>
  651. </thead>
  652. <tbody>
  653. <row>
  654. <entry>BYTE_LOKI</>
  655. <entry>ui</>
  656. <entry> n/a </>
  657. <entry> n/a </>
  658. </row>
  659. </tbody>
  660. </tgroup>
  661. </table>
  662. Current byte for the buffer bound to the source interpreted
  663. as an offset from the beginning of the buffer.
  664. </para>
  665. </sect2>
  666. </sect1>
  667. ]]>
  668. <![ %Ext2 [
  669. <sect1>
  670. <title>Loop Point Extension</title>
  671. <para>
  672. In external file now.
  673. </para>
  674. </sect1>
  675. ]]>
  676. </appendix>