seal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. data/.yardopts +1 -0
  2. data/LICENSE +13 -0
  3. data/README.md +265 -0
  4. data/ext/seal/extconf.rb +45 -0
  5. data/include/al/al.h +724 -0
  6. data/include/al/alc.h +277 -0
  7. data/include/al/efx-presets.h +402 -0
  8. data/include/al/efx.h +758 -0
  9. data/include/mpg123/mpg123.h +1034 -0
  10. data/include/ogg/config_types.h +25 -0
  11. data/include/ogg/ogg.h +210 -0
  12. data/include/ogg/os_types.h +147 -0
  13. data/include/seal.h +23 -0
  14. data/include/seal/buf.h +143 -0
  15. data/include/seal/core.h +95 -0
  16. data/include/seal/efs.h +112 -0
  17. data/include/seal/err.h +93 -0
  18. data/include/seal/fmt.h +58 -0
  19. data/include/seal/listener.h +103 -0
  20. data/include/seal/raw.h +86 -0
  21. data/include/seal/rvb.h +520 -0
  22. data/include/seal/src.h +413 -0
  23. data/include/seal/stream.h +81 -0
  24. data/include/vorbis/codec.h +243 -0
  25. data/include/vorbis/vorbisfile.h +206 -0
  26. data/mpg123/AUTHORS +150 -0
  27. data/mpg123/COPYING +773 -0
  28. data/mpg123/ChangeLog +3 -0
  29. data/mpg123/INSTALL +111 -0
  30. data/mpg123/Makefile.am +99 -0
  31. data/mpg123/Makefile.in +1043 -0
  32. data/mpg123/NEWS +1200 -0
  33. data/mpg123/NEWS.libmpg123 +133 -0
  34. data/mpg123/README +203 -0
  35. data/mpg123/TODO +38 -0
  36. data/mpg123/aclocal.m4 +1168 -0
  37. data/mpg123/build/config.guess +1530 -0
  38. data/mpg123/build/config.sub +1782 -0
  39. data/mpg123/build/depcomp +707 -0
  40. data/mpg123/build/install-sh +527 -0
  41. data/mpg123/build/ltmain.sh +9655 -0
  42. data/mpg123/build/missing +330 -0
  43. data/mpg123/configure +20267 -0
  44. data/mpg123/configure.ac +2178 -0
  45. data/mpg123/doc/ACCURACY +2 -0
  46. data/mpg123/doc/BENCHMARKING +110 -0
  47. data/mpg123/doc/BUGS +3 -0
  48. data/mpg123/doc/CONTACT +17 -0
  49. data/mpg123/doc/LICENSE +22 -0
  50. data/mpg123/doc/Makefile.am +32 -0
  51. data/mpg123/doc/Makefile.in +490 -0
  52. data/mpg123/doc/PATENTS +39 -0
  53. data/mpg123/doc/README.3DNOW +56 -0
  54. data/mpg123/doc/README.gain +171 -0
  55. data/mpg123/doc/README.remote +218 -0
  56. data/mpg123/doc/ROAD_TO_LGPL +270 -0
  57. data/mpg123/doc/THANKS +13 -0
  58. data/mpg123/doc/TODO +63 -0
  59. data/mpg123/doc/doxy_examples.c +21 -0
  60. data/mpg123/doc/doxygen.conf +41 -0
  61. data/mpg123/doc/doxyhead.xhtml +12 -0
  62. data/mpg123/doc/examples/dump_seekindex.c +41 -0
  63. data/mpg123/doc/examples/extract_frames.c +92 -0
  64. data/mpg123/doc/examples/feedseek.c +238 -0
  65. data/mpg123/doc/examples/id3dump.c +178 -0
  66. data/mpg123/doc/examples/mpg123_to_wav.c +118 -0
  67. data/mpg123/doc/examples/mpglib.c +92 -0
  68. data/mpg123/doc/examples/scan.c +47 -0
  69. data/mpg123/doc/libmpg123_speed.txt +84 -0
  70. data/mpg123/equalize.dat +37 -0
  71. data/mpg123/libmpg123.pc.in +11 -0
  72. data/mpg123/m4/addrconfig.m4 +34 -0
  73. data/mpg123/m4/libtool.m4 +7982 -0
  74. data/mpg123/m4/ltoptions.m4 +384 -0
  75. data/mpg123/m4/ltsugar.m4 +123 -0
  76. data/mpg123/m4/ltversion.m4 +23 -0
  77. data/mpg123/m4/lt~obsolete.m4 +98 -0
  78. data/mpg123/makedll.sh +19 -0
  79. data/mpg123/man1/mpg123.1 +512 -0
  80. data/mpg123/mpg123.spec +68 -0
  81. data/mpg123/mpg123.spec.in +68 -0
  82. data/mpg123/ports/MSVC++/2005/libmpg123/libmpg123.vcproj +741 -0
  83. data/mpg123/ports/MSVC++/2008/dump_seekindex/dump_seekindex.vcproj +194 -0
  84. data/mpg123/ports/MSVC++/2008/feedseek/feedseek.vcproj +195 -0
  85. data/mpg123/ports/MSVC++/2008/libmpg123/libmpg123.vcproj +1357 -0
  86. data/mpg123/ports/MSVC++/2008/mpg123.sln +44 -0
  87. data/mpg123/ports/MSVC++/2008/mpglib/mpglib.vcproj +191 -0
  88. data/mpg123/ports/MSVC++/2008/scan/scan.vcproj +195 -0
  89. data/mpg123/ports/MSVC++/2008clr/2008clr.sln +81 -0
  90. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Program.cs +435 -0
  91. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Properties/AssemblyInfo.cs +36 -0
  92. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/ReplaceReaderclr.csproj +72 -0
  93. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Program.cs +331 -0
  94. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Properties/AssemblyInfo.cs +36 -0
  95. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/feedseekclr.csproj +71 -0
  96. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Program.cs +79 -0
  97. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Properties/AssemblyInfo.cs +36 -0
  98. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/scanclr.csproj +70 -0
  99. data/mpg123/ports/MSVC++/2008clr/mpg123clr/AssemblyInfo.cpp +76 -0
  100. data/mpg123/ports/MSVC++/2008clr/mpg123clr/ReadMe.txt +165 -0
  101. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.cpp +91 -0
  102. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.h +130 -0
  103. data/mpg123/ports/MSVC++/2008clr/mpg123clr/dllmain.cpp +19 -0
  104. data/mpg123/ports/MSVC++/2008clr/mpg123clr/enum.h +218 -0
  105. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.cpp +48 -0
  106. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.h +134 -0
  107. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.cpp +92 -0
  108. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.h +132 -0
  109. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.cpp +138 -0
  110. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.h +152 -0
  111. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.cpp +896 -0
  112. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.h +953 -0
  113. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.rc +102 -0
  114. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.vcproj +328 -0
  115. data/mpg123/ports/MSVC++/2008clr/mpg123clr/resource.h +14 -0
  116. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.cpp +8 -0
  117. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.h +38 -0
  118. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.cpp +166 -0
  119. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.h +265 -0
  120. data/mpg123/ports/MSVC++/2008clr/mpg123clr/targetver.h +24 -0
  121. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.cpp +67 -0
  122. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.h +111 -0
  123. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj +90 -0
  124. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj.filters +6 -0
  125. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj +95 -0
  126. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj.filters +6 -0
  127. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj +960 -0
  128. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj.user +3 -0
  129. data/mpg123/ports/MSVC++/2010/libmpg123/yasm.exe +0 -0
  130. data/mpg123/ports/MSVC++/2010/mpg123.sln +38 -0
  131. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj +93 -0
  132. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj.filters +6 -0
  133. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/CORE_FileIn.H +15 -0
  134. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/SourceFilter_MP3.H +139 -0
  135. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_Def.H +206 -0
  136. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_FileIn.H +167 -0
  137. data/mpg123/ports/MSVC++/CMP3Stream/README +4 -0
  138. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP +462 -0
  139. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Log.CPP +122 -0
  140. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Mutex.CPP +35 -0
  141. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/SourceFilter_MP3Stream.CPP +586 -0
  142. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/PLACE_LIBMPG123_SOURCES_HERE +0 -0
  143. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/libMPG123.vcproj +245 -0
  144. data/mpg123/ports/MSVC++/config.h +35 -0
  145. data/mpg123/ports/MSVC++/examples/feedseek.c +240 -0
  146. data/mpg123/ports/MSVC++/examples/scan.c +47 -0
  147. data/mpg123/ports/MSVC++/mpg123.h +46 -0
  148. data/mpg123/ports/MSVC++/msvc.c +59 -0
  149. data/mpg123/ports/README +26 -0
  150. data/mpg123/ports/Sony_PSP/Makefile.psp +38 -0
  151. data/mpg123/ports/Sony_PSP/README +11 -0
  152. data/mpg123/ports/Sony_PSP/config.h +368 -0
  153. data/mpg123/ports/Sony_PSP/readers.c.patch +2 -0
  154. data/mpg123/ports/Xcode/config.h +197 -0
  155. data/mpg123/ports/Xcode/mpg123.h +17 -0
  156. data/mpg123/ports/Xcode/mpg123.xcodeproj/project.pbxproj +670 -0
  157. data/mpg123/ports/mpg123_.pas +478 -0
  158. data/mpg123/scripts/benchmark-cpu.pl +56 -0
  159. data/mpg123/scripts/tag_lyrics.py +76 -0
  160. data/mpg123/src/Makefile.am +186 -0
  161. data/mpg123/src/Makefile.in +1097 -0
  162. data/mpg123/src/audio.c +725 -0
  163. data/mpg123/src/audio.h +106 -0
  164. data/mpg123/src/buffer.c +312 -0
  165. data/mpg123/src/buffer.h +45 -0
  166. data/mpg123/src/common.c +240 -0
  167. data/mpg123/src/common.h +29 -0
  168. data/mpg123/src/config.h.in +436 -0
  169. data/mpg123/src/control_generic.c +809 -0
  170. data/mpg123/src/equalizer.c +48 -0
  171. data/mpg123/src/genre.c +271 -0
  172. data/mpg123/src/genre.h +15 -0
  173. data/mpg123/src/getlopt.c +148 -0
  174. data/mpg123/src/getlopt.h +77 -0
  175. data/mpg123/src/httpget.c +700 -0
  176. data/mpg123/src/httpget.h +66 -0
  177. data/mpg123/src/legacy_module.c +74 -0
  178. data/mpg123/src/libmpg123/Makefile.am +141 -0
  179. data/mpg123/src/libmpg123/Makefile.in +919 -0
  180. data/mpg123/src/libmpg123/compat.c +138 -0
  181. data/mpg123/src/libmpg123/compat.h +178 -0
  182. data/mpg123/src/libmpg123/dct36_3dnow.S +505 -0
  183. data/mpg123/src/libmpg123/dct36_3dnowext.S +512 -0
  184. data/mpg123/src/libmpg123/dct64.c +174 -0
  185. data/mpg123/src/libmpg123/dct64_3dnow.S +712 -0
  186. data/mpg123/src/libmpg123/dct64_3dnowext.S +714 -0
  187. data/mpg123/src/libmpg123/dct64_altivec.c +315 -0
  188. data/mpg123/src/libmpg123/dct64_i386.c +336 -0
  189. data/mpg123/src/libmpg123/dct64_i486.c +342 -0
  190. data/mpg123/src/libmpg123/dct64_mmx.S +811 -0
  191. data/mpg123/src/libmpg123/dct64_neon.S +297 -0
  192. data/mpg123/src/libmpg123/dct64_neon_float.S +270 -0
  193. data/mpg123/src/libmpg123/dct64_sse.S +454 -0
  194. data/mpg123/src/libmpg123/dct64_sse_float.S +401 -0
  195. data/mpg123/src/libmpg123/dct64_x86_64.S +464 -0
  196. data/mpg123/src/libmpg123/dct64_x86_64_float.S +426 -0
  197. data/mpg123/src/libmpg123/debug.h +171 -0
  198. data/mpg123/src/libmpg123/decode.h +268 -0
  199. data/mpg123/src/libmpg123/dither.c +119 -0
  200. data/mpg123/src/libmpg123/dither.h +23 -0
  201. data/mpg123/src/libmpg123/equalizer.c +17 -0
  202. data/mpg123/src/libmpg123/equalizer_3dnow.S +70 -0
  203. data/mpg123/src/libmpg123/feature.c +106 -0
  204. data/mpg123/src/libmpg123/format.c +521 -0
  205. data/mpg123/src/libmpg123/frame.c +1046 -0
  206. data/mpg123/src/libmpg123/frame.h +410 -0
  207. data/mpg123/src/libmpg123/gapless.h +119 -0
  208. data/mpg123/src/libmpg123/getbits.h +100 -0
  209. data/mpg123/src/libmpg123/getcpuflags.S +91 -0
  210. data/mpg123/src/libmpg123/getcpuflags.h +47 -0
  211. data/mpg123/src/libmpg123/huffman.h +340 -0
  212. data/mpg123/src/libmpg123/icy.c +32 -0
  213. data/mpg123/src/libmpg123/icy.h +38 -0
  214. data/mpg123/src/libmpg123/icy2utf8.c +438 -0
  215. data/mpg123/src/libmpg123/icy2utf8.h +10 -0
  216. data/mpg123/src/libmpg123/id3.c +999 -0
  217. data/mpg123/src/libmpg123/id3.h +43 -0
  218. data/mpg123/src/libmpg123/index.c +134 -0
  219. data/mpg123/src/libmpg123/index.h +59 -0
  220. data/mpg123/src/libmpg123/intsym.h +256 -0
  221. data/mpg123/src/libmpg123/l12_integer_tables.h +278 -0
  222. data/mpg123/src/libmpg123/l2tables.h +164 -0
  223. data/mpg123/src/libmpg123/l3_integer_tables.h +1002 -0
  224. data/mpg123/src/libmpg123/layer1.c +155 -0
  225. data/mpg123/src/libmpg123/layer2.c +371 -0
  226. data/mpg123/src/libmpg123/layer3.c +2053 -0
  227. data/mpg123/src/libmpg123/lfs_alias.c +252 -0
  228. data/mpg123/src/libmpg123/lfs_wrap.c +751 -0
  229. data/mpg123/src/libmpg123/libmpg123.c +1607 -0
  230. data/mpg123/src/libmpg123/mangle.h +74 -0
  231. data/mpg123/src/libmpg123/mpeghead.h +87 -0
  232. data/mpg123/src/libmpg123/mpg123.h.in +1075 -0
  233. data/mpg123/src/libmpg123/mpg123lib_intern.h +338 -0
  234. data/mpg123/src/libmpg123/ntom.c +148 -0
  235. data/mpg123/src/libmpg123/optimize.c +964 -0
  236. data/mpg123/src/libmpg123/optimize.h +219 -0
  237. data/mpg123/src/libmpg123/parse.c +1179 -0
  238. data/mpg123/src/libmpg123/parse.h +25 -0
  239. data/mpg123/src/libmpg123/reader.h +137 -0
  240. data/mpg123/src/libmpg123/readers.c +1235 -0
  241. data/mpg123/src/libmpg123/sample.h +152 -0
  242. data/mpg123/src/libmpg123/stringbuf.c +163 -0
  243. data/mpg123/src/libmpg123/synth.c +816 -0
  244. data/mpg123/src/libmpg123/synth.h +196 -0
  245. data/mpg123/src/libmpg123/synth_3dnow.S +318 -0
  246. data/mpg123/src/libmpg123/synth_3dnowext.S +6 -0
  247. data/mpg123/src/libmpg123/synth_8bit.c +142 -0
  248. data/mpg123/src/libmpg123/synth_8bit.h +86 -0
  249. data/mpg123/src/libmpg123/synth_altivec.c +1057 -0
  250. data/mpg123/src/libmpg123/synth_arm.S +271 -0
  251. data/mpg123/src/libmpg123/synth_arm_accurate.S +287 -0
  252. data/mpg123/src/libmpg123/synth_i486.c +252 -0
  253. data/mpg123/src/libmpg123/synth_i586.S +336 -0
  254. data/mpg123/src/libmpg123/synth_i586_dither.S +375 -0
  255. data/mpg123/src/libmpg123/synth_mmx.S +125 -0
  256. data/mpg123/src/libmpg123/synth_mono.h +64 -0
  257. data/mpg123/src/libmpg123/synth_neon.S +123 -0
  258. data/mpg123/src/libmpg123/synth_neon_accurate.S +173 -0
  259. data/mpg123/src/libmpg123/synth_neon_float.S +149 -0
  260. data/mpg123/src/libmpg123/synth_neon_s32.S +168 -0
  261. data/mpg123/src/libmpg123/synth_ntom.h +213 -0
  262. data/mpg123/src/libmpg123/synth_real.c +404 -0
  263. data/mpg123/src/libmpg123/synth_s32.c +411 -0
  264. data/mpg123/src/libmpg123/synth_sse.S +6 -0
  265. data/mpg123/src/libmpg123/synth_sse3d.h +246 -0
  266. data/mpg123/src/libmpg123/synth_sse_accurate.S +294 -0
  267. data/mpg123/src/libmpg123/synth_sse_float.S +241 -0
  268. data/mpg123/src/libmpg123/synth_sse_s32.S +306 -0
  269. data/mpg123/src/libmpg123/synth_stereo_neon.S +175 -0
  270. data/mpg123/src/libmpg123/synth_stereo_neon_accurate.S +262 -0
  271. data/mpg123/src/libmpg123/synth_stereo_neon_float.S +220 -0
  272. data/mpg123/src/libmpg123/synth_stereo_neon_s32.S +247 -0
  273. data/mpg123/src/libmpg123/synth_stereo_sse_accurate.S +508 -0
  274. data/mpg123/src/libmpg123/synth_stereo_sse_float.S +416 -0
  275. data/mpg123/src/libmpg123/synth_stereo_sse_s32.S +540 -0
  276. data/mpg123/src/libmpg123/synth_stereo_x86_64.S +335 -0
  277. data/mpg123/src/libmpg123/synth_stereo_x86_64_accurate.S +454 -0
  278. data/mpg123/src/libmpg123/synth_stereo_x86_64_float.S +396 -0
  279. data/mpg123/src/libmpg123/synth_stereo_x86_64_s32.S +473 -0
  280. data/mpg123/src/libmpg123/synth_x86_64.S +244 -0
  281. data/mpg123/src/libmpg123/synth_x86_64_accurate.S +301 -0
  282. data/mpg123/src/libmpg123/synth_x86_64_float.S +259 -0
  283. data/mpg123/src/libmpg123/synth_x86_64_s32.S +312 -0
  284. data/mpg123/src/libmpg123/synths.h +52 -0
  285. data/mpg123/src/libmpg123/tabinit.c +294 -0
  286. data/mpg123/src/libmpg123/tabinit_mmx.S +210 -0
  287. data/mpg123/src/libmpg123/testcpu.c +35 -0
  288. data/mpg123/src/libmpg123/true.h +14 -0
  289. data/mpg123/src/local.c +63 -0
  290. data/mpg123/src/local.h +21 -0
  291. data/mpg123/src/metaprint.c +373 -0
  292. data/mpg123/src/metaprint.h +17 -0
  293. data/mpg123/src/module.c +306 -0
  294. data/mpg123/src/module.h +48 -0
  295. data/mpg123/src/mpg123.c +1405 -0
  296. data/mpg123/src/mpg123app.h +171 -0
  297. data/mpg123/src/output/Makefile.am +213 -0
  298. data/mpg123/src/output/Makefile.in +1238 -0
  299. data/mpg123/src/output/aix.c +300 -0
  300. data/mpg123/src/output/alib.c +209 -0
  301. data/mpg123/src/output/alsa.c +297 -0
  302. data/mpg123/src/output/arts.c +117 -0
  303. data/mpg123/src/output/coreaudio.c +370 -0
  304. data/mpg123/src/output/dummy.c +78 -0
  305. data/mpg123/src/output/esd.c +167 -0
  306. data/mpg123/src/output/hp.c +184 -0
  307. data/mpg123/src/output/jack.c +450 -0
  308. data/mpg123/src/output/mint.c +197 -0
  309. data/mpg123/src/output/nas.c +335 -0
  310. data/mpg123/src/output/openal.c +197 -0
  311. data/mpg123/src/output/os2.c +665 -0
  312. data/mpg123/src/output/oss.c +319 -0
  313. data/mpg123/src/output/portaudio.c +255 -0
  314. data/mpg123/src/output/pulse.c +164 -0
  315. data/mpg123/src/output/sdl.c +206 -0
  316. data/mpg123/src/output/sgi.c +213 -0
  317. data/mpg123/src/output/sndio.c +161 -0
  318. data/mpg123/src/output/sun.c +281 -0
  319. data/mpg123/src/output/win32.c +229 -0
  320. data/mpg123/src/playlist.c +596 -0
  321. data/mpg123/src/playlist.h +52 -0
  322. data/mpg123/src/resolver.c +319 -0
  323. data/mpg123/src/resolver.h +25 -0
  324. data/mpg123/src/sfifo.c +146 -0
  325. data/mpg123/src/sfifo.h +95 -0
  326. data/mpg123/src/streamdump.c +74 -0
  327. data/mpg123/src/streamdump.h +20 -0
  328. data/mpg123/src/term.c +479 -0
  329. data/mpg123/src/term.h +81 -0
  330. data/mpg123/src/tests/noise.c +52 -0
  331. data/mpg123/src/tests/plain_id3.c +109 -0
  332. data/mpg123/src/tests/seek_accuracy.c +261 -0
  333. data/mpg123/src/tests/seek_whence.c +56 -0
  334. data/mpg123/src/tests/testtext.h +34 -0
  335. data/mpg123/src/tests/text.c +80 -0
  336. data/mpg123/src/wav.c +464 -0
  337. data/mpg123/src/wavhead.h +68 -0
  338. data/mpg123/src/win32_net.c +599 -0
  339. data/mpg123/src/win32_support.c +191 -0
  340. data/mpg123/src/win32_support.h +152 -0
  341. data/mpg123/src/xfermem.c +321 -0
  342. data/mpg123/src/xfermem.h +74 -0
  343. data/mpg123/windows-builds.sh +137 -0
  344. data/msvc/lib/OpenAL32.lib +0 -0
  345. data/spec/fixtures/heal.ogg +0 -0
  346. data/spec/fixtures/tone_up.wav +0 -0
  347. data/spec/seal/buffer_spec.rb +37 -0
  348. data/spec/seal/core_spec.rb +29 -0
  349. data/spec/seal/effect_slot_spec.rb +38 -0
  350. data/spec/seal/listener_spec.rb +33 -0
  351. data/spec/seal/reverb_spec.rb +51 -0
  352. data/spec/seal/source_spec.rb +370 -0
  353. data/spec/seal/stream_spec.rb +38 -0
  354. data/spec/spec_helper.rb +45 -0
  355. data/spec/support/attribute_examples.rb +75 -0
  356. data/spec/support/audio_object_with_format.rb +27 -0
  357. data/spec/support/movable_object.rb +22 -0
  358. data/src/libogg/bitwise.c +857 -0
  359. data/src/libogg/framing.c +2093 -0
  360. data/src/libvorbis/backends.h +144 -0
  361. data/src/libvorbis/bitrate.c +253 -0
  362. data/src/libvorbis/bitrate.h +59 -0
  363. data/src/libvorbis/block.c +1046 -0
  364. data/src/libvorbis/codebook.c +484 -0
  365. data/src/libvorbis/codebook.h +119 -0
  366. data/src/libvorbis/codec_internal.h +167 -0
  367. data/src/libvorbis/envelope.c +375 -0
  368. data/src/libvorbis/envelope.h +80 -0
  369. data/src/libvorbis/floor0.c +221 -0
  370. data/src/libvorbis/floor1.c +1100 -0
  371. data/src/libvorbis/highlevel.h +58 -0
  372. data/src/libvorbis/info.c +668 -0
  373. data/src/libvorbis/lookup.c +94 -0
  374. data/src/libvorbis/lookup.h +32 -0
  375. data/src/libvorbis/lookup_data.h +192 -0
  376. data/src/libvorbis/lpc.c +160 -0
  377. data/src/libvorbis/lpc.h +29 -0
  378. data/src/libvorbis/lsp.c +456 -0
  379. data/src/libvorbis/lsp.h +28 -0
  380. data/src/libvorbis/mapping0.c +816 -0
  381. data/src/libvorbis/masking.h +785 -0
  382. data/src/libvorbis/mdct.c +563 -0
  383. data/src/libvorbis/mdct.h +71 -0
  384. data/src/libvorbis/misc.h +57 -0
  385. data/src/libvorbis/os.h +186 -0
  386. data/src/libvorbis/psy.c +1206 -0
  387. data/src/libvorbis/psy.h +154 -0
  388. data/src/libvorbis/registry.c +45 -0
  389. data/src/libvorbis/registry.h +32 -0
  390. data/src/libvorbis/res0.c +889 -0
  391. data/src/libvorbis/scales.h +90 -0
  392. data/src/libvorbis/sharedbook.c +579 -0
  393. data/src/libvorbis/smallft.c +1255 -0
  394. data/src/libvorbis/smallft.h +34 -0
  395. data/src/libvorbis/synthesis.c +184 -0
  396. data/src/libvorbis/vorbisfile.c +2337 -0
  397. data/src/libvorbis/window.c +2135 -0
  398. data/src/libvorbis/window.h +26 -0
  399. data/src/rubyext.c +2329 -0
  400. data/src/seal/buf.c +124 -0
  401. data/src/seal/core.c +283 -0
  402. data/src/seal/efs.c +74 -0
  403. data/src/seal/err.c +118 -0
  404. data/src/seal/fmt.c +86 -0
  405. data/src/seal/listener.c +111 -0
  406. data/src/seal/mpg.c +174 -0
  407. data/src/seal/mpg.h +24 -0
  408. data/src/seal/ov.c +180 -0
  409. data/src/seal/ov.h +22 -0
  410. data/src/seal/raw.c +59 -0
  411. data/src/seal/reader.c +102 -0
  412. data/src/seal/reader.h +59 -0
  413. data/src/seal/rvb.c +368 -0
  414. data/src/seal/src.c +654 -0
  415. data/src/seal/stream.c +109 -0
  416. data/src/seal/threading.c +66 -0
  417. data/src/seal/threading.h +20 -0
  418. data/src/seal/wav.c +297 -0
  419. data/src/seal/wav.h +23 -0
  420. data/src/win32api.rb +29 -0
  421. metadata +563 -0
@@ -0,0 +1,368 @@
1
+ #include <al/al.h>
2
+ #include <al/efx.h>
3
+ #include <al/efx-presets.h>
4
+ #include <seal/rvb.h>
5
+ #include <seal/core.h>
6
+ #include <seal/err.h>
7
+
8
+ static
9
+ void
10
+ load_properties(seal_rvb_t* rvb, EFXEAXREVERBPROPERTIES properties)
11
+ {
12
+ seal_set_rvb_density(rvb, properties.flDensity);
13
+ seal_set_rvb_diffusion(rvb, properties.flDiffusion);
14
+ seal_set_rvb_gain(rvb, properties.flGain);
15
+ seal_set_rvb_hfgain(rvb, properties.flGainHF);
16
+ seal_set_rvb_decay_time(rvb, properties.flDecayTime);
17
+ seal_set_rvb_hfdecay_ratio(rvb, properties.flDecayHFRatio);
18
+ seal_set_rvb_reflections_gain(rvb, properties.flReflectionsGain);
19
+ seal_set_rvb_reflections_delay(rvb, properties.flReflectionsDelay);
20
+ seal_set_rvb_late_gain(rvb, properties.flLateReverbGain);
21
+ seal_set_rvb_late_delay(rvb, properties.flLateReverbDelay);
22
+ seal_set_rvb_air_absorbtion_hfgain(rvb, properties.flAirAbsorptionGainHF);
23
+ seal_set_rvb_room_rolloff_factor(rvb, properties.flRoomRolloffFactor);
24
+ seal_set_rvb_hfdecay_limited(rvb, properties.iDecayHFLimit);
25
+ }
26
+
27
+ seal_err_t
28
+ seal_init_rvb(seal_rvb_t* rvb)
29
+ {
30
+ seal_err_t err;
31
+
32
+ if ((err = _seal_init_obj(rvb, alGenEffects)) != SEAL_OK)
33
+ return err;
34
+ alEffecti(rvb->id, AL_EFFECT_TYPE, AL_EFFECT_REVERB);
35
+
36
+ return _seal_get_openal_err();
37
+ }
38
+
39
+ seal_err_t
40
+ seal_destroy_rvb(seal_rvb_t* rvb)
41
+ {
42
+ return _seal_destroy_obj(rvb, alDeleteEffects, alIsEffect);
43
+ }
44
+
45
+ /* A macro tied very closely to `seal_load_rvb'. */
46
+ #define CASE_LOAD(rvb, preset) \
47
+ case SEAL_##preset##_REVERB: \
48
+ { \
49
+ EFXEAXREVERBPROPERTIES __properties__ = EFX_REVERB_PRESET_##preset; \
50
+ load_properties(rvb, __properties__); \
51
+ break; \
52
+ }
53
+
54
+ seal_err_t
55
+ seal_load_rvb(seal_rvb_t* rvb, seal_rvb_preset_t preset)
56
+ {
57
+ switch (preset) {
58
+ /* Default presets */
59
+ CASE_LOAD(rvb, GENERIC)
60
+ CASE_LOAD(rvb, PADDEDCELL)
61
+ CASE_LOAD(rvb, ROOM)
62
+ CASE_LOAD(rvb, BATHROOM)
63
+ CASE_LOAD(rvb, LIVINGROOM)
64
+ CASE_LOAD(rvb, STONEROOM)
65
+ CASE_LOAD(rvb, AUDITORIUM)
66
+ CASE_LOAD(rvb, CONCERTHALL)
67
+ CASE_LOAD(rvb, CAVE)
68
+ CASE_LOAD(rvb, ARENA)
69
+ CASE_LOAD(rvb, HANGAR)
70
+ CASE_LOAD(rvb, CARPETEDHALLWAY)
71
+ CASE_LOAD(rvb, HALLWAY)
72
+ CASE_LOAD(rvb, STONECORRIDOR)
73
+ CASE_LOAD(rvb, ALLEY)
74
+ CASE_LOAD(rvb, FOREST)
75
+ CASE_LOAD(rvb, CITY)
76
+ CASE_LOAD(rvb, MOUNTAINS)
77
+ CASE_LOAD(rvb, QUARRY)
78
+ CASE_LOAD(rvb, PLAIN)
79
+ CASE_LOAD(rvb, PARKINGLOT)
80
+ CASE_LOAD(rvb, SEWERPIPE)
81
+ CASE_LOAD(rvb, UNDERWATER)
82
+ CASE_LOAD(rvb, DRUGGED)
83
+ CASE_LOAD(rvb, DIZZY)
84
+ CASE_LOAD(rvb, PSYCHOTIC)
85
+
86
+ /* Castle presets */
87
+ CASE_LOAD(rvb, CASTLE_SMALLROOM)
88
+ CASE_LOAD(rvb, CASTLE_SHORTPASSAGE)
89
+ CASE_LOAD(rvb, CASTLE_MEDIUMROOM)
90
+ CASE_LOAD(rvb, CASTLE_LARGEROOM)
91
+ CASE_LOAD(rvb, CASTLE_LONGPASSAGE)
92
+ CASE_LOAD(rvb, CASTLE_HALL)
93
+ CASE_LOAD(rvb, CASTLE_CUPBOARD)
94
+ CASE_LOAD(rvb, CASTLE_COURTYARD)
95
+ CASE_LOAD(rvb, CASTLE_ALCOVE)
96
+
97
+ /* Factory presets */
98
+ CASE_LOAD(rvb, FACTORY_SMALLROOM)
99
+ CASE_LOAD(rvb, FACTORY_SHORTPASSAGE)
100
+ CASE_LOAD(rvb, FACTORY_MEDIUMROOM)
101
+ CASE_LOAD(rvb, FACTORY_LARGEROOM)
102
+ CASE_LOAD(rvb, FACTORY_LONGPASSAGE)
103
+ CASE_LOAD(rvb, FACTORY_HALL)
104
+ CASE_LOAD(rvb, FACTORY_CUPBOARD)
105
+ CASE_LOAD(rvb, FACTORY_COURTYARD)
106
+ CASE_LOAD(rvb, FACTORY_ALCOVE)
107
+
108
+ /* Ice palace presets */
109
+ CASE_LOAD(rvb, ICEPALACE_SMALLROOM)
110
+ CASE_LOAD(rvb, ICEPALACE_SHORTPASSAGE)
111
+ CASE_LOAD(rvb, ICEPALACE_MEDIUMROOM)
112
+ CASE_LOAD(rvb, ICEPALACE_LARGEROOM)
113
+ CASE_LOAD(rvb, ICEPALACE_LONGPASSAGE)
114
+ CASE_LOAD(rvb, ICEPALACE_HALL)
115
+ CASE_LOAD(rvb, ICEPALACE_CUPBOARD)
116
+ CASE_LOAD(rvb, ICEPALACE_COURTYARD)
117
+ CASE_LOAD(rvb, ICEPALACE_ALCOVE)
118
+
119
+ /* Space station presets */
120
+ CASE_LOAD(rvb, SPACESTATION_SMALLROOM)
121
+ CASE_LOAD(rvb, SPACESTATION_SHORTPASSAGE)
122
+ CASE_LOAD(rvb, SPACESTATION_MEDIUMROOM)
123
+ CASE_LOAD(rvb, SPACESTATION_LARGEROOM)
124
+ CASE_LOAD(rvb, SPACESTATION_LONGPASSAGE)
125
+ CASE_LOAD(rvb, SPACESTATION_HALL)
126
+ CASE_LOAD(rvb, SPACESTATION_CUPBOARD)
127
+ CASE_LOAD(rvb, SPACESTATION_ALCOVE)
128
+
129
+ /* Wooden Galleon presets */
130
+ CASE_LOAD(rvb, WOODEN_SMALLROOM)
131
+ CASE_LOAD(rvb, WOODEN_SHORTPASSAGE)
132
+ CASE_LOAD(rvb, WOODEN_MEDIUMROOM)
133
+ CASE_LOAD(rvb, WOODEN_LARGEROOM)
134
+ CASE_LOAD(rvb, WOODEN_LONGPASSAGE)
135
+ CASE_LOAD(rvb, WOODEN_HALL)
136
+ CASE_LOAD(rvb, WOODEN_CUPBOARD)
137
+ CASE_LOAD(rvb, WOODEN_COURTYARD)
138
+ CASE_LOAD(rvb, WOODEN_ALCOVE)
139
+
140
+ /* Sports presets */
141
+ CASE_LOAD(rvb, SPORT_EMPTYSTADIUM)
142
+ CASE_LOAD(rvb, SPORT_SQUASHCOURT)
143
+ CASE_LOAD(rvb, SPORT_SMALLSWIMMINGPOOL)
144
+ CASE_LOAD(rvb, SPORT_LARGESWIMMINGPOOL)
145
+ CASE_LOAD(rvb, SPORT_GYMNASIUM)
146
+ CASE_LOAD(rvb, SPORT_FULLSTADIUM)
147
+ CASE_LOAD(rvb, SPORT_STADIUMTANNOY)
148
+
149
+ /* Prefab presets */
150
+ CASE_LOAD(rvb, PREFAB_WORKSHOP)
151
+ CASE_LOAD(rvb, PREFAB_SCHOOLROOM)
152
+ CASE_LOAD(rvb, PREFAB_PRACTISEROOM)
153
+ CASE_LOAD(rvb, PREFAB_OUTHOUSE)
154
+ CASE_LOAD(rvb, PREFAB_CARAVAN)
155
+
156
+ /* Dome presets */
157
+ CASE_LOAD(rvb, DOME_TOMB)
158
+ CASE_LOAD(rvb, DOME_SAINTPAULS)
159
+
160
+ /* Pipe presets. */
161
+ CASE_LOAD(rvb, PIPE_SMALL)
162
+ CASE_LOAD(rvb, PIPE_LONGTHIN)
163
+ CASE_LOAD(rvb, PIPE_LARGE)
164
+ CASE_LOAD(rvb, PIPE_RESONANT)
165
+
166
+ /* Outdoors presets */
167
+ CASE_LOAD(rvb, OUTDOORS_BACKYARD)
168
+ CASE_LOAD(rvb, OUTDOORS_ROLLINGPLAINS)
169
+ CASE_LOAD(rvb, OUTDOORS_DEEPCANYON)
170
+ CASE_LOAD(rvb, OUTDOORS_CREEK)
171
+ CASE_LOAD(rvb, OUTDOORS_VALLEY)
172
+
173
+ /* Mood presets */
174
+ CASE_LOAD(rvb, MOOD_HEAVEN)
175
+ CASE_LOAD(rvb, MOOD_HELL)
176
+ CASE_LOAD(rvb, MOOD_MEMORY)
177
+
178
+ /* Driving presets */
179
+ CASE_LOAD(rvb, DRIVING_COMMENTATOR)
180
+ CASE_LOAD(rvb, DRIVING_PITGARAGE)
181
+ CASE_LOAD(rvb, DRIVING_INCAR_RACER)
182
+ CASE_LOAD(rvb, DRIVING_INCAR_SPORTS)
183
+ CASE_LOAD(rvb, DRIVING_INCAR_LUXURY)
184
+ CASE_LOAD(rvb, DRIVING_FULLGRANDSTAND)
185
+ CASE_LOAD(rvb, DRIVING_EMPTYGRANDSTAND)
186
+ CASE_LOAD(rvb, DRIVING_TUNNEL)
187
+
188
+ /* City presets */
189
+ CASE_LOAD(rvb, CITY_STREETS)
190
+ CASE_LOAD(rvb, CITY_SUBWAY)
191
+ CASE_LOAD(rvb, CITY_MUSEUM)
192
+ CASE_LOAD(rvb, CITY_LIBRARY)
193
+ CASE_LOAD(rvb, CITY_UNDERPASS)
194
+ CASE_LOAD(rvb, CITY_ABANDONED)
195
+
196
+ /* Misc. presets */
197
+ CASE_LOAD(rvb, DUSTYROOM)
198
+ CASE_LOAD(rvb, CHAPEL)
199
+ CASE_LOAD(rvb, SMALLWATERROOM)
200
+ default:
201
+ return SEAL_BAD_PRESET;
202
+ }
203
+ return SEAL_OK;
204
+ }
205
+
206
+ seal_err_t
207
+ seal_set_rvb_density(seal_rvb_t* rvb, float density)
208
+ {
209
+ return _seal_setf(rvb, AL_REVERB_DENSITY, density, alEffectf);
210
+ }
211
+
212
+ seal_err_t
213
+ seal_set_rvb_diffusion(seal_rvb_t* rvb, float diffusion)
214
+ {
215
+ return _seal_setf(rvb, AL_REVERB_DIFFUSION, diffusion, alEffectf);
216
+ }
217
+
218
+ seal_err_t
219
+ seal_set_rvb_gain(seal_rvb_t* rvb, float gain)
220
+ {
221
+ return _seal_setf(rvb, AL_REVERB_GAIN, gain, alEffectf);
222
+ }
223
+
224
+ seal_err_t
225
+ seal_set_rvb_hfgain(seal_rvb_t* rvb, float hfgain)
226
+ {
227
+ return _seal_setf(rvb, AL_REVERB_GAINHF, hfgain, alEffectf);
228
+ }
229
+
230
+ seal_err_t
231
+ seal_set_rvb_decay_time(seal_rvb_t* rvb, float time)
232
+ {
233
+ return _seal_setf(rvb, AL_REVERB_DECAY_TIME, time, alEffectf);
234
+ }
235
+
236
+ seal_err_t
237
+ seal_set_rvb_hfdecay_ratio(seal_rvb_t* rvb, float ratio)
238
+ {
239
+ return _seal_setf(rvb, AL_REVERB_DECAY_HFRATIO, ratio, alEffectf);
240
+ }
241
+
242
+ seal_err_t
243
+ seal_set_rvb_reflections_gain(seal_rvb_t* rvb, float gain)
244
+ {
245
+ return _seal_setf(rvb, AL_REVERB_REFLECTIONS_GAIN, gain, alEffectf);
246
+ }
247
+
248
+ seal_err_t
249
+ seal_set_rvb_reflections_delay(seal_rvb_t* rvb, float delay)
250
+ {
251
+ return _seal_setf(rvb, AL_REVERB_REFLECTIONS_DELAY, delay, alEffectf);
252
+ }
253
+
254
+ seal_err_t
255
+ seal_set_rvb_late_gain(seal_rvb_t* rvb, float gain)
256
+ {
257
+ return _seal_setf(rvb, AL_REVERB_LATE_REVERB_GAIN, gain, alEffectf);
258
+ }
259
+
260
+ seal_err_t
261
+ seal_set_rvb_late_delay(seal_rvb_t* rvb, float delay)
262
+ {
263
+ return _seal_setf(rvb, AL_REVERB_LATE_REVERB_DELAY, delay, alEffectf);
264
+ }
265
+
266
+ seal_err_t
267
+ seal_set_rvb_air_absorbtion_hfgain(seal_rvb_t* rvb, float hfgain)
268
+ {
269
+ return _seal_setf(rvb, AL_REVERB_AIR_ABSORPTION_GAINHF, hfgain,
270
+ alEffectf);
271
+ }
272
+
273
+ seal_err_t
274
+ seal_set_rvb_room_rolloff_factor(seal_rvb_t* rvb, float factor)
275
+ {
276
+ return _seal_setf(rvb, AL_REVERB_ROOM_ROLLOFF_FACTOR, factor, alEffectf);
277
+ }
278
+
279
+ seal_err_t
280
+ seal_set_rvb_hfdecay_limited(seal_rvb_t* rvb, char limited)
281
+ {
282
+ return _seal_seti(rvb, AL_REVERB_DECAY_HFLIMIT, limited, alEffecti);
283
+ }
284
+
285
+ seal_err_t
286
+ seal_get_rvb_density(seal_rvb_t* rvb, float* pdensity)
287
+ {
288
+ return _seal_getf(rvb, AL_REVERB_DENSITY, pdensity, alGetEffectf);
289
+ }
290
+
291
+ seal_err_t
292
+ seal_get_rvb_diffusion(seal_rvb_t* rvb, float* pdiffusion)
293
+ {
294
+ return _seal_getf(rvb, AL_REVERB_DIFFUSION, pdiffusion, alGetEffectf);
295
+ }
296
+
297
+ seal_err_t
298
+ seal_get_rvb_gain(seal_rvb_t* rvb, float* pgain)
299
+ {
300
+ return _seal_getf(rvb, AL_REVERB_GAIN, pgain, alGetEffectf);
301
+ }
302
+
303
+ seal_err_t
304
+ seal_get_rvb_hfgain(seal_rvb_t* rvb, float* phfgain)
305
+ {
306
+ return _seal_getf(rvb, AL_REVERB_GAINHF, phfgain, alGetEffectf);
307
+ }
308
+
309
+ seal_err_t
310
+ seal_get_rvb_decay_time(seal_rvb_t* rvb, float* ptime)
311
+ {
312
+ return _seal_getf(rvb, AL_REVERB_DECAY_TIME, ptime, alGetEffectf);
313
+ }
314
+
315
+ seal_err_t
316
+ seal_get_rvb_hfdecay_ratio(seal_rvb_t* rvb, float* pratio)
317
+ {
318
+ return _seal_getf(rvb, AL_REVERB_DECAY_HFRATIO, pratio, alGetEffectf);
319
+ }
320
+
321
+ seal_err_t
322
+ seal_get_rvb_reflections_gain(seal_rvb_t* rvb, float* pgain)
323
+ {
324
+ return _seal_getf(rvb, AL_REVERB_REFLECTIONS_GAIN, pgain,
325
+ alGetEffectf);
326
+ }
327
+
328
+ seal_err_t
329
+ seal_get_rvb_reflections_delay(seal_rvb_t* rvb, float* pdelay)
330
+ {
331
+ return _seal_getf(rvb, AL_REVERB_REFLECTIONS_DELAY, pdelay,
332
+ alGetEffectf);
333
+ }
334
+
335
+ seal_err_t
336
+ seal_get_rvb_late_gain(seal_rvb_t* rvb, float* pgain)
337
+ {
338
+ return _seal_getf(rvb, AL_REVERB_LATE_REVERB_GAIN, pgain,
339
+ alGetEffectf);
340
+ }
341
+
342
+ seal_err_t
343
+ seal_get_rvb_late_delay(seal_rvb_t* rvb, float* pdelay)
344
+ {
345
+ return _seal_getf(rvb, AL_REVERB_LATE_REVERB_DELAY, pdelay,
346
+ alGetEffectf);
347
+ }
348
+
349
+ seal_err_t
350
+ seal_get_rvb_air_absorbtion_hfgain(seal_rvb_t* rvb, float* phfgain)
351
+ {
352
+ return _seal_getf(rvb, AL_REVERB_AIR_ABSORPTION_GAINHF, phfgain,
353
+ alGetEffectf);
354
+ }
355
+
356
+ seal_err_t
357
+ seal_get_rvb_room_rolloff_factor(seal_rvb_t* rvb, float* pfactor)
358
+ {
359
+ return _seal_getf(rvb, AL_REVERB_ROOM_ROLLOFF_FACTOR, pfactor,
360
+ alGetEffectf);
361
+ }
362
+
363
+ seal_err_t
364
+ seal_is_rvb_hfdecay_limited(seal_rvb_t* rvb, char* plimited)
365
+ {
366
+ return _seal_getb(rvb, AL_REVERB_DECAY_HFLIMIT, plimited,
367
+ alGetEffecti);
368
+ }
@@ -0,0 +1,654 @@
1
+ /*
2
+ * src.c is part of the Scorched End Audio Library (SEAL) and is licensed
3
+ * under the terms of the GNU Lesser General Public License. See COPYING
4
+ * attached with the library.
5
+ */
6
+
7
+ #include <string.h>
8
+ #include <stdlib.h>
9
+ #include <al/al.h>
10
+ #include <al/efx.h>
11
+ #include <seal/src.h>
12
+ #include <seal/core.h>
13
+ #include <seal/buf.h>
14
+ #include <seal/stream.h>
15
+ #include <seal/efs.h>
16
+ #include <seal/err.h>
17
+ #include "threading.h"
18
+
19
+ typedef void queue_op_t(unsigned int, int, unsigned int*);
20
+
21
+ enum
22
+ {
23
+ /* 2^24=16777216. */
24
+ CHUNK_STORAGE_CAP = 16777216,
25
+ /* LCM(36, 1024)=9216. */
26
+ MIN_CHUNK_SIZE = 9216
27
+ };
28
+
29
+ static const size_t MIN_QUEUE_SIZE = 2;
30
+ static const size_t MAX_QUEUE_SIZE = 63;
31
+ static const size_t DEFAULT_QUEUE_SIZE = 3;
32
+ static const size_t DEFAULT_CHUNK_SIZE = MIN_CHUNK_SIZE << 2;
33
+ static const size_t MAX_CHUNK_SIZE = CHUNK_STORAGE_CAP -
34
+ CHUNK_STORAGE_CAP % MIN_CHUNK_SIZE;
35
+
36
+ static
37
+ seal_err_t
38
+ check_val_limit(int val, int lower_bound, int upper_bound)
39
+ {
40
+ if (val < lower_bound)
41
+ return SEAL_BAD_VAL;
42
+ else if (val > upper_bound)
43
+ return SEAL_BAD_VAL;
44
+ else
45
+ return SEAL_OK;
46
+ }
47
+
48
+ static
49
+ seal_err_t
50
+ operate(seal_src_t* src, void (*op)(unsigned int))
51
+ {
52
+ op(src->id);
53
+
54
+ return _seal_get_openal_err();
55
+ }
56
+
57
+ static
58
+ seal_err_t
59
+ set3f(seal_src_t* src, int key, float x, float y, float z)
60
+ {
61
+ alSource3f(src->id, key, x, y, z);
62
+
63
+ return _seal_get_openal_err();
64
+ }
65
+
66
+ static
67
+ seal_err_t
68
+ get3f(seal_src_t* src, int key, float* px, float* py, float* pz)
69
+ {
70
+ alGetSource3f(src->id, key, px, py, pz);
71
+
72
+ return _seal_get_openal_err();
73
+ }
74
+
75
+ static
76
+ void
77
+ wait4updater(seal_src_t* src)
78
+ {
79
+ if (src->updater != 0) {
80
+ _seal_join_thread(src->updater);
81
+ src->updater = 0;
82
+ }
83
+ }
84
+
85
+ static
86
+ void*
87
+ update(void* args)
88
+ {
89
+ seal_src_t* src = args;
90
+ seal_err_t err = SEAL_OK;
91
+
92
+ while (alIsSource(src->id)) {
93
+ seal_src_state_t state;
94
+ err = seal_get_src_state(src, &state);
95
+ if (err != SEAL_OK || state != SEAL_PLAYING)
96
+ break;
97
+ if ((err = seal_update_src(src)) != SEAL_OK)
98
+ break;
99
+ _seal_sleep(50);
100
+ }
101
+
102
+ return (void*) err;
103
+ }
104
+
105
+ static
106
+ seal_err_t
107
+ queue_op(seal_src_t* src, int nbufs, unsigned int* bufs, queue_op_t* op)
108
+ {
109
+ op(src->id, nbufs, bufs);
110
+
111
+ return _seal_get_openal_err();
112
+ }
113
+
114
+ static
115
+ seal_err_t
116
+ queue_bufs(seal_src_t* src, int nbufs, unsigned int* bufs)
117
+ {
118
+ return queue_op(src, nbufs, bufs, (queue_op_t*) alSourceQueueBuffers);
119
+ }
120
+
121
+ static
122
+ seal_err_t
123
+ unqueue_bufs(seal_src_t* src, int nbufs, unsigned int* bufs)
124
+ {
125
+ return queue_op(src, nbufs, bufs, alSourceUnqueueBuffers);
126
+ }
127
+
128
+ static
129
+ seal_err_t
130
+ clean_queue(seal_src_t* src)
131
+ {
132
+ int nbufs_processed;
133
+ unsigned int* bufs;
134
+ seal_err_t err;
135
+
136
+ /* Do not let the updater touch anything when cleaning the queue. */
137
+ wait4updater(src);
138
+ err = _seal_geti(src, AL_BUFFERS_PROCESSED, &nbufs_processed,
139
+ alGetSourcei);
140
+ if (err != SEAL_OK)
141
+ return err;
142
+
143
+ bufs = malloc(sizeof (unsigned int) * nbufs_processed);
144
+ if (bufs == 0)
145
+ return SEAL_CANNOT_ALLOC_MEM;
146
+
147
+ if ((err = unqueue_bufs(src, nbufs_processed, bufs)) == SEAL_OK)
148
+ err = _seal_delete_objs(nbufs_processed, bufs, alDeleteBuffers);
149
+
150
+ free(bufs);
151
+
152
+ return err;
153
+ }
154
+
155
+ /*
156
+ * Stopping a source will mark all the buffers in its queue processed so that
157
+ * they can be unqueued.
158
+ */
159
+ static
160
+ seal_err_t
161
+ stop_then_clean_queue(seal_src_t* src)
162
+ {
163
+ seal_err_t err;
164
+
165
+ if ((err = operate(src, alSourceStop)) != SEAL_OK)
166
+ return err;
167
+
168
+ return clean_queue(src);
169
+ }
170
+
171
+ static
172
+ seal_err_t
173
+ restart_queuing(seal_src_t* src)
174
+ {
175
+ seal_err_t err;
176
+
177
+ if ((err = stop_then_clean_queue(src)) != SEAL_OK)
178
+ return err;
179
+
180
+ return seal_rewind_stream(src->stream);
181
+ }
182
+
183
+ static
184
+ seal_err_t
185
+ empty_queue(seal_src_t* src)
186
+ {
187
+ seal_err_t err;
188
+
189
+ /* Need to be playing first in order to become stopped. */
190
+ if ((err = operate(src, alSourcePlay)) != SEAL_OK)
191
+ return err;
192
+
193
+ return stop_then_clean_queue(src);
194
+ }
195
+
196
+ static
197
+ seal_err_t
198
+ ensure_queue_empty(seal_src_t* src)
199
+ {
200
+ if (src->stream != 0)
201
+ return empty_queue(src);
202
+
203
+ return SEAL_OK;
204
+ }
205
+
206
+ seal_err_t
207
+ seal_init_src(seal_src_t* src)
208
+ {
209
+ seal_err_t err = _seal_init_obj(src, alGenSources);
210
+
211
+ if (err == SEAL_OK) {
212
+ src->buf = 0;
213
+ src->stream = 0;
214
+ src->updater = 0;
215
+ src->chunk_size = DEFAULT_CHUNK_SIZE;
216
+ src->queue_size = DEFAULT_QUEUE_SIZE;
217
+ src->looping = 0;
218
+ src->automatic = 1;
219
+ }
220
+
221
+ return err;
222
+ }
223
+
224
+ seal_err_t
225
+ seal_destroy_src(seal_src_t* src)
226
+ {
227
+ seal_err_t err;
228
+
229
+ if (alIsSource(src->id)) {
230
+ if ((err = ensure_queue_empty(src)) != SEAL_OK)
231
+ return err;
232
+ err = _seal_delete_objs(1, &src->id, alDeleteSources);
233
+ if (err != SEAL_OK)
234
+ return err;
235
+ }
236
+
237
+ return SEAL_OK;
238
+ }
239
+
240
+ seal_err_t
241
+ seal_play_src(seal_src_t* src)
242
+ {
243
+ if (src->stream != 0) {
244
+ seal_src_state_t state;
245
+ seal_err_t err = seal_get_src_state(src, &state);
246
+ if (err != SEAL_OK)
247
+ return err;
248
+ if (state == SEAL_PLAYING) {
249
+ /* Source and its updater will be stopped after this. */
250
+ if ((err = restart_queuing(src)) != SEAL_OK)
251
+ return err;
252
+ } else {
253
+ /* In case the old updater is not done. */
254
+ wait4updater(src);
255
+ }
256
+ /* Stream some data so plackback can start immediately. */
257
+ if ((err = seal_update_src(src)) != SEAL_OK)
258
+ return err;
259
+ if (src->automatic)
260
+ src->updater = _seal_create_thread(update, src);
261
+ }
262
+
263
+ return operate(src, alSourcePlay);
264
+ }
265
+
266
+ seal_err_t
267
+ seal_pause_src(seal_src_t* src)
268
+ {
269
+ return operate(src, alSourcePause);
270
+ }
271
+
272
+ seal_err_t
273
+ seal_stop_src(seal_src_t* src)
274
+ {
275
+ seal_err_t err;
276
+
277
+ if ((err = operate(src, alSourceStop)) == SEAL_OK && src->stream != 0)
278
+ /* Already stopped so all buffers are proccessed. */
279
+ if ((err = clean_queue(src)) == SEAL_OK)
280
+ err = seal_rewind_stream(src->stream);
281
+
282
+ return err;
283
+ }
284
+
285
+ seal_err_t
286
+ seal_rewind_src(seal_src_t* src)
287
+ {
288
+ if (src->stream != 0) {
289
+ seal_src_state_t state;
290
+ seal_err_t err = seal_get_src_state(src, &state);
291
+ if (err != SEAL_OK)
292
+ return err;
293
+ if (state == SEAL_PLAYING || state == SEAL_PAUSED)
294
+ if ((err = restart_queuing(src)) != SEAL_OK)
295
+ return err;
296
+ }
297
+
298
+ return operate(src, alSourceRewind);
299
+ }
300
+
301
+ seal_err_t
302
+ seal_detach_src_audio(seal_src_t* src)
303
+ {
304
+ seal_err_t err;
305
+
306
+ if ((err = ensure_queue_empty(src)) != SEAL_OK)
307
+ return err;
308
+
309
+ /* Sets the state to `SEAL_INITIAL' for consistency. */
310
+ if ((err = operate(src, alSourceRewind)) != SEAL_OK)
311
+ return err;
312
+
313
+ if ((err = _seal_seti(src, AL_BUFFER, AL_NONE, alSourcei)) == SEAL_OK) {
314
+ src->buf = 0;
315
+ src->stream = 0;
316
+ }
317
+
318
+ return err;
319
+ }
320
+
321
+ seal_err_t
322
+ seal_set_src_buf(seal_src_t* src, seal_buf_t* buf)
323
+ {
324
+ seal_err_t err;
325
+
326
+ /* Make sure `src' is not currently a streaming source. */
327
+ if (src->stream != 0)
328
+ return SEAL_MIXING_SRC_TYPE;
329
+
330
+ /* Carry the previous looping state over for static sources. */
331
+ err = _seal_seti(src, AL_LOOPING, src->looping, alSourcei);
332
+ if (err != SEAL_OK)
333
+ return err;
334
+
335
+ if ((err = _seal_seti(src, AL_BUFFER, buf->id, alSourcei)) == SEAL_OK)
336
+ src->buf = buf;
337
+
338
+ return err;
339
+ }
340
+
341
+ seal_err_t
342
+ seal_set_src_stream(seal_src_t* src, seal_stream_t* stream)
343
+ {
344
+ seal_err_t err;
345
+
346
+ if (stream == src->stream)
347
+ return SEAL_OK;
348
+ /* Make sure `src' is not currently a static source. */
349
+ if (src->buf != 0)
350
+ return SEAL_MIXING_SRC_TYPE;
351
+ /* Cannot associate an unopened stream. */
352
+ if (stream->id == 0)
353
+ return SEAL_STREAM_UNOPENED;
354
+ /* Cannot associate a stream with a different audio format. */
355
+ if (src->stream != 0 && memcmp(&stream->attr, &src->stream->attr,
356
+ sizeof (seal_raw_attr_t)) != 0)
357
+ return SEAL_MIXING_STREAM_FMT;
358
+
359
+ /* Never use AL_LOOPING for streaming sources. */
360
+ if ((err = _seal_seti(src, AL_LOOPING, 0, alSourcei)) != SEAL_OK)
361
+ return err;
362
+
363
+ src->stream = stream;
364
+
365
+ /* Immediately update the queue to become `AL_STREAMING'. */
366
+ return seal_update_src(src);
367
+ }
368
+
369
+ seal_err_t
370
+ seal_update_src(seal_src_t* src)
371
+ {
372
+ unsigned int buf;
373
+ size_t nbytes_streamed;
374
+ seal_raw_t raw;
375
+ seal_err_t err;
376
+
377
+ if (!alIsSource(src->id))
378
+ return SEAL_OK;
379
+
380
+ if (src->stream == 0)
381
+ return SEAL_OK;
382
+ /* If another updater is running. */
383
+ if (src->updater != 0 && !_seal_calling_thread_is(src->updater))
384
+ return SEAL_OK;
385
+
386
+ /* Set the desired size of each chunk. */
387
+ raw.size = src->chunk_size;
388
+
389
+ for (;;) {
390
+ int nqueued, nprocessed;
391
+
392
+ err = _seal_geti(src, AL_BUFFERS_QUEUED, &nqueued, alGetSourcei);
393
+ if (err != SEAL_OK)
394
+ return err;
395
+ err = _seal_geti(src, AL_BUFFERS_PROCESSED, &nprocessed,
396
+ alGetSourcei);
397
+ if (err != SEAL_OK)
398
+ return err;
399
+
400
+ /* Remove processed buffers from the queue if possible. */
401
+ if (nprocessed > 0) {
402
+ if ((err = unqueue_bufs(src, 1, &buf)) != SEAL_OK)
403
+ return err;
404
+ /* The queue is full even after the removal. */
405
+ if ((size_t) nqueued >= src->queue_size) {
406
+ err = _seal_delete_objs(1, &buf, alDeleteBuffers);
407
+ if (err != SEAL_OK)
408
+ return err;
409
+ continue;
410
+ }
411
+ /* The queue is too short. */
412
+ } else if ((size_t) nqueued < src->queue_size) {
413
+ if ((err = _seal_gen_objs(1, &buf, alGenBuffers)) != SEAL_OK)
414
+ return err;
415
+ /* The queue is full and nothing is processed. */
416
+ } else {
417
+ return SEAL_OK;
418
+ }
419
+
420
+ start_streaming:
421
+ err = seal_stream(src->stream, &raw, &nbytes_streamed);
422
+ if (err != SEAL_OK)
423
+ break;
424
+ if (nbytes_streamed > 0) {
425
+ /* Fill or refill the current buffer. */
426
+ err = _seal_raw2buf(buf, &raw);
427
+ free(raw.data);
428
+ if (err != SEAL_OK)
429
+ break;
430
+ if ((err = queue_bufs(src, 1, &buf)) != SEAL_OK)
431
+ break;
432
+ /* Rewind the stream if looping. */
433
+ } else if (src->looping) {
434
+ seal_rewind_stream(src->stream);
435
+ raw.size = src->chunk_size;
436
+ goto start_streaming;
437
+ /* End of stream reached. */
438
+ } else {
439
+ break;
440
+ }
441
+ } /* for (;;) */
442
+
443
+ if (err == SEAL_OK)
444
+ return _seal_delete_objs(1, &buf, alDeleteBuffers);
445
+ else {
446
+ _seal_delete_objs(1, &buf, alDeleteBuffers);
447
+ return err;
448
+ }
449
+ }
450
+
451
+ seal_err_t
452
+ seal_set_src_queue_size(seal_src_t* src, size_t size)
453
+ {
454
+ seal_err_t err;
455
+
456
+ err = check_val_limit(size, MIN_QUEUE_SIZE, MAX_QUEUE_SIZE);
457
+ if (err == SEAL_OK)
458
+ src->queue_size = size;
459
+
460
+ return err;
461
+ }
462
+
463
+ seal_err_t
464
+ seal_set_src_chunk_size(seal_src_t* src, size_t size)
465
+ {
466
+ seal_err_t err;
467
+
468
+ err = check_val_limit(size, MIN_CHUNK_SIZE, MAX_CHUNK_SIZE);
469
+ if (err == SEAL_OK)
470
+ src->chunk_size = size / MIN_CHUNK_SIZE * MIN_CHUNK_SIZE;
471
+
472
+ return err;
473
+ }
474
+
475
+ seal_err_t
476
+ seal_set_src_pos(seal_src_t* src, float x, float y, float z)
477
+ {
478
+ return set3f(src, AL_POSITION, x, y, z);
479
+ }
480
+
481
+ seal_err_t
482
+ seal_set_src_vel(seal_src_t* src, float x, float y, float z)
483
+ {
484
+ return set3f(src, AL_VELOCITY, x, y, z);
485
+ }
486
+
487
+ seal_err_t
488
+ seal_set_src_pitch(seal_src_t* src, float pitch)
489
+ {
490
+ return _seal_setf(src, AL_PITCH, pitch, alSourcef);
491
+ }
492
+
493
+ seal_err_t
494
+ seal_set_src_gain(seal_src_t* src, float gain)
495
+ {
496
+ return _seal_setf(src, AL_GAIN, gain, alSourcef);
497
+ }
498
+
499
+ seal_err_t
500
+ seal_set_src_auto(seal_src_t* src, char automatic)
501
+ {
502
+ src->automatic = automatic != 0;
503
+
504
+ return SEAL_OK;
505
+ }
506
+
507
+ seal_err_t
508
+ seal_set_src_relative(seal_src_t* src, char relative)
509
+ {
510
+ return _seal_seti(src, AL_SOURCE_RELATIVE, relative != 0, alSourcei);
511
+ }
512
+
513
+ seal_err_t
514
+ seal_set_src_looping(seal_src_t* src, char looping)
515
+ {
516
+ looping = looping != 0;
517
+ /*
518
+ * Streaming does not work with OpenAL's looping as the queuing buffers
519
+ * will never become `processed' when `AL_LOOPING' is true, so set
520
+ * `AL_LOOPING' only for static sources.
521
+ */
522
+ if (src->stream == 0) {
523
+ seal_err_t err = _seal_seti(src, AL_LOOPING, looping, alSourcei);
524
+ if (err != SEAL_OK)
525
+ return err;
526
+ }
527
+
528
+ src->looping = looping;
529
+
530
+ return SEAL_OK;
531
+ }
532
+
533
+ seal_buf_t*
534
+ seal_get_src_buf(seal_src_t* src)
535
+ {
536
+ return src->buf;
537
+ }
538
+
539
+ seal_stream_t*
540
+ seal_get_src_stream(seal_src_t* src)
541
+ {
542
+ return src->stream;
543
+ }
544
+
545
+ seal_err_t
546
+ seal_get_src_queue_size(seal_src_t* src, size_t* psize)
547
+ {
548
+ *psize = src->queue_size;
549
+
550
+ return SEAL_OK;
551
+ }
552
+
553
+ seal_err_t
554
+ seal_get_src_chunk_size(seal_src_t* src, size_t* psize)
555
+ {
556
+ *psize = src->chunk_size;
557
+
558
+ return SEAL_OK;
559
+ }
560
+
561
+ seal_err_t
562
+ seal_get_src_pos(seal_src_t* src, float* px, float* py, float* pz)
563
+ {
564
+ return get3f(src, AL_POSITION, px, py, pz);
565
+ }
566
+
567
+ seal_err_t
568
+ seal_get_src_vel(seal_src_t* src, float* px, float* py, float* pz)
569
+ {
570
+ return get3f(src, AL_VELOCITY, px, py, pz);
571
+ }
572
+
573
+ seal_err_t
574
+ seal_get_src_pitch(seal_src_t* src, float* ppitch)
575
+ {
576
+ return _seal_getf(src, AL_PITCH, ppitch, alGetSourcef);
577
+ }
578
+
579
+ seal_err_t
580
+ seal_get_src_gain(seal_src_t* src, float* pgain)
581
+ {
582
+ return _seal_getf(src, AL_GAIN, pgain, alGetSourcef);
583
+ }
584
+
585
+ seal_err_t
586
+ seal_is_src_auto(seal_src_t* src, char* pauto)
587
+ {
588
+ *pauto = src->automatic;
589
+
590
+ return SEAL_OK;
591
+ }
592
+
593
+ seal_err_t
594
+ seal_is_src_relative(seal_src_t* src, char* prelative)
595
+ {
596
+ return _seal_getb(src, AL_SOURCE_RELATIVE, prelative, alGetSourcei);
597
+ }
598
+
599
+ seal_err_t
600
+ seal_is_src_looping(seal_src_t* src, char* plooping)
601
+ {
602
+ *plooping = src->looping;
603
+
604
+ return SEAL_OK;
605
+ }
606
+
607
+ seal_err_t
608
+ seal_get_src_type(seal_src_t* src, seal_src_type_t* ptype)
609
+ {
610
+ int type;
611
+ seal_err_t err;
612
+
613
+ err = _seal_geti(src, AL_SOURCE_TYPE, &type, alGetSourcei);
614
+ if (err == SEAL_OK) {
615
+ switch (type) {
616
+ case AL_STATIC:
617
+ *ptype = SEAL_STATIC;
618
+ break;
619
+ case AL_STREAMING:
620
+ *ptype = SEAL_STREAMING;
621
+ break;
622
+ default:
623
+ *ptype = SEAL_UNDETERMINED;
624
+ }
625
+ }
626
+
627
+ return err;
628
+ }
629
+
630
+ seal_err_t
631
+ seal_get_src_state(seal_src_t* src, seal_src_state_t* pstate)
632
+ {
633
+ int state;
634
+ seal_err_t err;
635
+
636
+ err = _seal_geti(src, AL_SOURCE_STATE, &state, alGetSourcei);
637
+ if (err == SEAL_OK) {
638
+ switch (state) {
639
+ case AL_PLAYING:
640
+ *pstate = SEAL_PLAYING;
641
+ break;
642
+ case AL_PAUSED:
643
+ *pstate = SEAL_PAUSED;
644
+ break;
645
+ case AL_STOPPED:
646
+ *pstate = SEAL_STOPPED;
647
+ break;
648
+ default:
649
+ *pstate = SEAL_INITIAL;
650
+ }
651
+ }
652
+
653
+ return err;
654
+ }