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,197 @@
1
+ /*
2
+ openal.c: audio output on OpenAL
3
+
4
+ copyright 1995-2009 by the mpg123 project - free software under the terms of the LGPL 2.1
5
+ see COPYING and AUTHORS files in distribution or http://mpg123.org
6
+ initially written by Taihei Monma
7
+ */
8
+
9
+
10
+ #include "mpg123app.h"
11
+
12
+ #ifdef OPENAL_SUBDIR_OPENAL
13
+ #include <OpenAL/al.h>
14
+ #include <OpenAL/alc.h>
15
+ #elif defined(OPENAL_SUBDIR_AL)
16
+ #include <AL/al.h>
17
+ #include <AL/alc.h>
18
+ #else
19
+ #include <al.h>
20
+ #include <alc.h>
21
+ #endif
22
+ #include <errno.h>
23
+ #include <unistd.h>
24
+
25
+ #include "debug.h"
26
+
27
+ #define NUM_BUFFERS 16
28
+
29
+ #ifndef AL_FORMAT_MONO_FLOAT32
30
+ #define AL_FORMAT_MONO_FLOAT32 0x10010
31
+ #endif
32
+ #ifndef AL_FORMAT_STEREO_FLOAT32
33
+ #define AL_FORMAT_STEREO_FLOAT32 0x10011
34
+ #endif
35
+
36
+ typedef struct
37
+ {
38
+ ALCdevice *device;
39
+ ALCcontext *context;
40
+ ALuint source, buffer;
41
+ ALenum format;
42
+ ALsizei rate;
43
+ } mpg123_openal_t;
44
+
45
+
46
+ static int open_openal(audio_output_t *ao)
47
+ {
48
+ mpg123_openal_t* al = (mpg123_openal_t*)ao->userptr;
49
+
50
+ al->device = alcOpenDevice(NULL);
51
+ al->context = alcCreateContext(al->device, NULL);
52
+ alcMakeContextCurrent(al->context);
53
+ alGenSources(1, &al->source);
54
+
55
+ al->rate = ao->rate;
56
+ if(ao->format == MPG123_ENC_SIGNED_16 && ao->channels == 2) al->format = AL_FORMAT_STEREO16;
57
+ else if(ao->format == MPG123_ENC_SIGNED_16 && ao->channels == 1) al->format = AL_FORMAT_MONO16;
58
+ else if(ao->format == MPG123_ENC_UNSIGNED_8 && ao->channels == 2) al->format = AL_FORMAT_STEREO8;
59
+ else if(ao->format == MPG123_ENC_UNSIGNED_8 && ao->channels == 1) al->format = AL_FORMAT_MONO8;
60
+ else if(ao->format == MPG123_ENC_FLOAT_32 && ao->channels == 2) al->format = AL_FORMAT_STEREO_FLOAT32;
61
+ else if(ao->format == MPG123_ENC_FLOAT_32 && ao->channels == 1) al->format = AL_FORMAT_MONO_FLOAT32;
62
+
63
+ return 0;
64
+ }
65
+
66
+ static int get_formats_openal(audio_output_t *ao)
67
+ {
68
+ return MPG123_ENC_SIGNED_16|MPG123_ENC_UNSIGNED_8|((alIsExtensionPresent((ALubyte*)"AL_EXT_float32") == AL_TRUE) ? MPG123_ENC_FLOAT_32 : 0);
69
+ }
70
+
71
+ static int write_openal(audio_output_t *ao, unsigned char *buf, int len)
72
+ {
73
+ ALint state, n;
74
+ mpg123_openal_t* al = (mpg123_openal_t*)ao->userptr;
75
+
76
+ alGetSourcei(al->source, AL_BUFFERS_QUEUED, &n);
77
+ if(n < NUM_BUFFERS)
78
+ {
79
+ alGenBuffers(1, &al->buffer);
80
+ }
81
+ else
82
+ {
83
+ alGetSourcei(al->source, AL_SOURCE_STATE, &state);
84
+ if(state != AL_PLAYING)
85
+ {
86
+ alSourcePlay(al->source);
87
+ }
88
+ while(alGetSourcei(al->source, AL_BUFFERS_PROCESSED, &n), n == 0)
89
+ {
90
+ usleep(10000);
91
+ }
92
+ alSourceUnqueueBuffers(al->source, 1, &al->buffer);
93
+ }
94
+
95
+ alBufferData(al->buffer, al->format, buf, len, al->rate);
96
+ alSourceQueueBuffers(al->source, 1, &al->buffer);
97
+
98
+ return len;
99
+ }
100
+
101
+ static int close_openal(audio_output_t *ao)
102
+ {
103
+ ALint state, n;
104
+ mpg123_openal_t* al = (mpg123_openal_t*)ao->userptr;
105
+
106
+ if (al)
107
+ {
108
+ /* wait until all buffers are consumed */
109
+ while(alGetSourcei(al->source, AL_SOURCE_STATE, &state), state == AL_PLAYING)
110
+ {
111
+ usleep(10000);
112
+ }
113
+ /* free all processed buffers */
114
+ while(alGetSourcei(al->source, AL_BUFFERS_PROCESSED, &n), n > 0)
115
+ {
116
+ alSourceUnqueueBuffers(al->source, 1, &al->buffer);
117
+ alDeleteBuffers(1, &al->buffer);
118
+ }
119
+ alDeleteSources(1, &al->source);
120
+ alcMakeContextCurrent(NULL);
121
+ alcDestroyContext(al->context);
122
+ alcCloseDevice(al->device);
123
+ }
124
+
125
+ return 0;
126
+ }
127
+
128
+ static void flush_openal(audio_output_t *ao)
129
+ {
130
+ ALint n;
131
+ mpg123_openal_t* al = (mpg123_openal_t*)ao->userptr;
132
+
133
+ if (al)
134
+ {
135
+ /* stop playing and flush all buffers */
136
+ alSourceStop(al->source);
137
+ while(alGetSourcei(al->source, AL_BUFFERS_PROCESSED, &n), n > 0)
138
+ {
139
+ alSourceUnqueueBuffers(al->source, 1, &al->buffer);
140
+ alDeleteBuffers(1, &al->buffer);
141
+ }
142
+ }
143
+ }
144
+
145
+ static int deinit_openal(audio_output_t* ao)
146
+ {
147
+ /* Free up memory */
148
+ if(ao->userptr)
149
+ {
150
+ free( ao->userptr );
151
+ ao->userptr = NULL;
152
+ }
153
+
154
+ /* Success */
155
+ return 0;
156
+ }
157
+
158
+ static int init_openal(audio_output_t* ao)
159
+ {
160
+ if (ao==NULL) return -1;
161
+
162
+ /* Set callbacks */
163
+ ao->open = open_openal;
164
+ ao->flush = flush_openal;
165
+ ao->write = write_openal;
166
+ ao->get_formats = get_formats_openal;
167
+ ao->close = close_openal;
168
+ ao->deinit = deinit_openal;
169
+
170
+ /* Allocate memory for data structure */
171
+ ao->userptr = malloc( sizeof( mpg123_openal_t ) );
172
+ if(ao->userptr==NULL)
173
+ {
174
+ error("failed to malloc memory for 'mpg123_openal_t'");
175
+ return -1;
176
+ }
177
+ memset( ao->userptr, 0, sizeof(mpg123_openal_t) );
178
+
179
+ /* Success */
180
+ return 0;
181
+ }
182
+
183
+
184
+ /*
185
+ Module information data structure
186
+ */
187
+ mpg123_module_t mpg123_output_module_info = {
188
+ /* api_version */ MPG123_MODULE_API_VERSION,
189
+ /* name */ "openal",
190
+ /* description */ "Output audio using OpenAL.",
191
+ /* revision */ "$Rev:$",
192
+ /* handle */ NULL,
193
+
194
+ /* init_output */ init_openal,
195
+ };
196
+
197
+
@@ -0,0 +1,665 @@
1
+ /*
2
+ os2: OS/2 RealTime DART Engine
3
+
4
+ copyright 1998-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
5
+ see COPYING and AUTHORS files in distribution or http://mpg123.org
6
+ initially written by Samuel Audet
7
+ */
8
+
9
+ #define INCL_OS2MM
10
+ #define INCL_DOS
11
+ #define INCL_VIO
12
+ #define INCL_KBD
13
+ #include <os2.h>
14
+ #include <os2me.h>
15
+ #include <stdlib.h>
16
+ #include <ctype.h>
17
+
18
+ /* I guess this #ifndef could be removed now... */
19
+ #ifndef MPG123_INCLUDED
20
+ #include "mpg123app.h"
21
+ #endif
22
+ #include "debug.h"
23
+
24
+ /* complementary audio parameters */
25
+ int numbuffers = 5; /* total audio buffers, _bare_ minimum = 4 (cuz of prio boost check) */
26
+ int audiobufsize = 4884;
27
+ int lockdevice = FALSE;
28
+ USHORT volume = 100;
29
+ char *boostprio = NULL;
30
+ char *normalprio = NULL;
31
+ unsigned char boostclass = 3, normalclass = 2;
32
+ signed char boostdelta = 0, normaldelta = 31;
33
+ unsigned char mmerror[160] = {0};
34
+ int playingframe;
35
+
36
+ /* audio buffers */
37
+ static ULONG ulMCIBuffers;
38
+
39
+ static MCI_AMP_OPEN_PARMS maop = {0};
40
+ static MCI_MIXSETUP_PARMS mmp = {0};
41
+ static MCI_BUFFER_PARMS mbp = {0};
42
+ static MCI_GENERIC_PARMS mgp = {0};
43
+ static MCI_SET_PARMS msp = {0};
44
+ static MCI_STATUS_PARMS mstatp = {0};
45
+ static MCI_MIX_BUFFER *MixBuffers = NULL;
46
+
47
+ typedef struct
48
+ {
49
+ MCI_MIX_BUFFER *NextBuffer;
50
+ int frameNum;
51
+ } BUFFERINFO;
52
+
53
+ BUFFERINFO *bufferinfo = NULL;
54
+
55
+
56
+ static HEV dataplayed = 0;
57
+ static ULONG resetcount;
58
+ static BOOL paused = FALSE;
59
+
60
+ static MCI_MIX_BUFFER *tobefilled, *playingbuffer = NULL, playedbuffer;
61
+ static void *pBufferplayed;
62
+
63
+ static BOOL nomoredata,nobuffermode,justflushed;
64
+
65
+ static TIB *mainthread; /* thread info to set thread priority */
66
+
67
+ ULONG keyboardtid;
68
+
69
+
70
+ static LONG APIENTRY DARTEvent(ULONG ulStatus, MCI_MIX_BUFFER *PlayedBuffer, ULONG ulFlags)
71
+ {
72
+ switch(ulFlags)
73
+ {
74
+ case MIX_STREAM_ERROR | MIX_WRITE_COMPLETE: /* error occur in device */
75
+
76
+ if ( ulStatus == ERROR_DEVICE_UNDERRUN)
77
+ /* Write buffers to rekick off the amp mixer. */
78
+ mmp.pmixWrite( mmp.ulMixHandle, MixBuffers, ulMCIBuffers );
79
+ break;
80
+
81
+ case MIX_WRITE_COMPLETE: /* for playback */
82
+
83
+ playingbuffer = ((BUFFERINFO *) PlayedBuffer->ulUserParm)->NextBuffer;
84
+
85
+ /* the next three lines are only useful to audio_playing_samples() */
86
+ playedbuffer = *PlayedBuffer;
87
+ playedbuffer.pBuffer = pBufferplayed;
88
+ memcpy(playedbuffer.pBuffer, PlayedBuffer->pBuffer, PlayedBuffer->ulBufferLength);
89
+
90
+ /* just too bad, the decoder fell behind... here we just keep the
91
+ buffer to be filled in front of the playing one so that when the
92
+ decoder kicks back in, we'll hear it in at the right time */
93
+ if(tobefilled == playingbuffer)
94
+ {
95
+ tobefilled = ((BUFFERINFO *) playingbuffer->ulUserParm)->NextBuffer;
96
+ nomoredata = TRUE;
97
+ }
98
+ else
99
+ {
100
+ playingframe = ((BUFFERINFO *) playingbuffer->ulUserParm)->frameNum;
101
+
102
+ /* if we're about to be short of decoder's data
103
+ (2nd ahead buffer not filled), let's boost its priority! */
104
+ if(tobefilled == ( (BUFFERINFO *) ((BUFFERINFO *) playingbuffer->ulUserParm)->NextBuffer->ulUserParm)->NextBuffer)
105
+ DosSetPriority(PRTYS_THREAD,boostclass,boostdelta,mainthread->tib_ptib2->tib2_ultid);
106
+ }
107
+
108
+ /* empty the played buffer in case it doesn't get filled back */
109
+ memset(PlayedBuffer->pBuffer,0,PlayedBuffer->ulBufferLength);
110
+
111
+ DosPostEventSem(dataplayed);
112
+
113
+ mmp.pmixWrite( mmp.ulMixHandle, PlayedBuffer, 1 );
114
+ break;
115
+
116
+ } /* end switch */
117
+
118
+ return( TRUE );
119
+
120
+ } /* end DARTEvent */
121
+
122
+
123
+ static void MciError(ULONG ulError)
124
+ {
125
+ unsigned char buffer[128];
126
+ ULONG rc;
127
+
128
+ rc = mciGetErrorString(ulError, buffer, sizeof(buffer));
129
+
130
+ if (rc == MCIERR_SUCCESS)
131
+ sprintf(mmerror,"MCI Error %d: %s",ULONG_LOWD(ulError),buffer);
132
+ else
133
+ sprintf(mmerror,"MCI Error %d: Cannot query error message.",ULONG_LOWD(rc));
134
+
135
+ error1("%s",mmerror);
136
+ }
137
+
138
+
139
+ static int set_volume(audio_output_t *ao, USHORT setvolume)
140
+ {
141
+ if(setvolume > 100) setvolume = 100;
142
+ volume = setvolume; /* useful when device is closed and reopened */
143
+
144
+ if(maop.usDeviceID)
145
+ {
146
+ memset(&msp,0,sizeof(msp));
147
+ msp.ulAudio = MCI_SET_AUDIO_ALL;
148
+ msp.ulLevel = setvolume;
149
+
150
+ mciSendCommand(maop.usDeviceID, MCI_SET,
151
+ MCI_WAIT | MCI_SET_AUDIO | MCI_SET_VOLUME,
152
+ &msp, 0);
153
+ }
154
+ return setvolume;
155
+ }
156
+
157
+
158
+ int open_os2(audio_output_t *ao)
159
+ {
160
+ ULONG rc,i;
161
+ char *temp;
162
+ ULONG openflags;
163
+ PPIB ppib;
164
+ USHORT bits;
165
+
166
+ if(maop.usDeviceID) return (maop.usDeviceID);
167
+
168
+ if(!ao) return -1;
169
+
170
+ if(!ao->device) ao->device = "0";
171
+
172
+ if(ao->rate < 0) ao->rate = 44100;
173
+ if(ao->channels < 0) ao->channels = 2;
174
+ if(ao->format < 0) ao->format = MPG123_ENC_SIGNED_16;
175
+
176
+ if(ao->format == MPG123_ENC_SIGNED_16)
177
+ bits = 16;
178
+ else if(ao->format == MPG123_ENC_UNSIGNED_8)
179
+ bits = 8;
180
+ else return -1;
181
+
182
+ /* open the mixer device */
183
+ memset (&maop, 0, sizeof(maop));
184
+ maop.usDeviceID = 0;
185
+ maop.pszDeviceType = (PSZ) MAKEULONG(MCI_DEVTYPE_AUDIO_AMPMIX, atoi(ao->device));
186
+
187
+ openflags = MCI_WAIT | MCI_OPEN_TYPE_ID;
188
+ if(!lockdevice) openflags |= MCI_OPEN_SHAREABLE;
189
+
190
+ rc = mciSendCommand(0, MCI_OPEN, openflags, &maop, 0);
191
+
192
+ if (ULONG_LOWD(rc) != MCIERR_SUCCESS)
193
+ {
194
+ MciError(rc);
195
+ maop.usDeviceID = 0;
196
+ return(-1);
197
+ }
198
+
199
+ /* volume in ao->gain ?? */
200
+
201
+ /* Set the MCI_MIXSETUP_PARMS data structure to match the audio stream. */
202
+
203
+ memset(&mmp, 0, sizeof(mmp));
204
+
205
+ mmp.ulBitsPerSample = bits;
206
+ mmp.ulFormatTag = MCI_WAVE_FORMAT_PCM;
207
+ mmp.ulSamplesPerSec = ao->rate;
208
+ mmp.ulChannels = ao->channels;
209
+
210
+ /* Setup the mixer for playback of wave data */
211
+ mmp.ulFormatMode = MCI_PLAY;
212
+ mmp.ulDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
213
+ mmp.pmixEvent = DARTEvent;
214
+
215
+ rc = mciSendCommand( maop.usDeviceID,
216
+ MCI_MIXSETUP,
217
+ MCI_WAIT | MCI_MIXSETUP_INIT,
218
+ &mmp,
219
+ 0 );
220
+
221
+ if ( ULONG_LOWD(rc) != MCIERR_SUCCESS )
222
+ {
223
+ MciError(rc);
224
+ maop.usDeviceID = 0;
225
+ return(-1);
226
+ }
227
+
228
+ volume = set_volume(ao,volume);
229
+
230
+ /* Set up the BufferParms data structure and allocate
231
+ * device buffers from the Amp-Mixer */
232
+
233
+ memset(&mbp, 0, sizeof(mbp));
234
+ free(MixBuffers);
235
+ free(bufferinfo);
236
+ if(numbuffers < 5) numbuffers = 5;
237
+ if(numbuffers > 200) numbuffers = 200;
238
+ MixBuffers = calloc(numbuffers, sizeof(*MixBuffers));
239
+ bufferinfo = calloc(numbuffers, sizeof(*bufferinfo));
240
+
241
+ ulMCIBuffers = numbuffers;
242
+ mbp.ulNumBuffers = ulMCIBuffers;
243
+ /* mbp.ulBufferSize = mmp.ulBufferSize; */
244
+ /* I don't like this... they must be smaller than 64KB or else the
245
+ engine needs major rewrite */
246
+ mbp.ulBufferSize = audiobufsize;
247
+ mbp.pBufList = MixBuffers;
248
+
249
+ rc = mciSendCommand( maop.usDeviceID,
250
+ MCI_BUFFER,
251
+ MCI_WAIT | MCI_ALLOCATE_MEMORY,
252
+ (PVOID) &mbp,
253
+ 0 );
254
+
255
+ if ( ULONG_LOWD(rc) != MCIERR_SUCCESS )
256
+ {
257
+ MciError(rc);
258
+ maop.usDeviceID = 0;
259
+ return(-1);
260
+ }
261
+
262
+ pBufferplayed = playedbuffer.pBuffer = calloc(1,audiobufsize);
263
+
264
+ ulMCIBuffers = mbp.ulNumBuffers; /* never know! */
265
+
266
+ /* Fill all device buffers with zeros and set linked list */
267
+
268
+ for(i = 0; i < ulMCIBuffers; i++)
269
+ {
270
+ MixBuffers[i].ulFlags = 0;
271
+ MixBuffers[i].ulBufferLength = mbp.ulBufferSize;
272
+ memset(MixBuffers[i].pBuffer, 0, MixBuffers[i].ulBufferLength);
273
+
274
+ MixBuffers[i].ulUserParm = (ULONG) &bufferinfo[i];
275
+ bufferinfo[i].NextBuffer = &MixBuffers[i+1];
276
+ }
277
+
278
+ bufferinfo[i-1].NextBuffer = &MixBuffers[0];
279
+
280
+ /* Create a semaphore to know when data has been played by the DART thread */
281
+ DosCreateEventSem(NULL,&dataplayed,0,FALSE);
282
+
283
+ playingbuffer = &MixBuffers[0];
284
+ tobefilled = &MixBuffers[1];
285
+ playingframe = 0;
286
+ nomoredata = TRUE;
287
+ nobuffermode = FALSE;
288
+ justflushed = FALSE;
289
+
290
+ if(boostprio)
291
+ {
292
+ temp = alloca(strlen(boostprio)+1);
293
+ strcpy(temp,boostprio);
294
+
295
+ boostdelta = atoi(temp+1);
296
+ *(temp+1) = 0;
297
+ boostclass = atoi(temp);
298
+ }
299
+ if(boostclass > 4) boostdelta = 3;
300
+ if(boostdelta > 31) boostdelta = 31;
301
+ if(boostdelta < -31) boostdelta = -31;
302
+
303
+
304
+ if(normalprio)
305
+ {
306
+ temp = alloca(strlen(normalprio)+1);
307
+ strcpy(temp,normalprio);
308
+
309
+ normaldelta = atoi(temp+1);
310
+ *(temp+1) = 0;
311
+ normalclass = atoi(temp);
312
+ }
313
+ if(normalclass > 4) normaldelta = 3;
314
+ if(normaldelta > 31) normaldelta = 31;
315
+ if(normaldelta < -31) normaldelta = -31;
316
+
317
+
318
+ DosGetInfoBlocks(&mainthread,&ppib); /* ppib not needed, but makes some DOSCALLS.DLL crash */
319
+ DosSetPriority(PRTYS_THREAD,boostclass,boostdelta,mainthread->tib_ptib2->tib2_ultid);
320
+
321
+ /* Write buffers to kick off the amp mixer. see DARTEvent() */
322
+ rc = mmp.pmixWrite( mmp.ulMixHandle,
323
+ MixBuffers,
324
+ ulMCIBuffers );
325
+
326
+ return maop.usDeviceID;
327
+ }
328
+
329
+
330
+ static int write_os2(audio_output_t *ao,unsigned char *buf,int len)
331
+ {
332
+ /* if we're too quick, let's wait */
333
+ if(nobuffermode)
334
+ {
335
+ MCI_MIX_BUFFER *temp = playingbuffer;
336
+
337
+ while(
338
+ (tobefilled != (temp = ((BUFFERINFO *) temp->ulUserParm)->NextBuffer)) &&
339
+ (tobefilled != (temp = ((BUFFERINFO *) temp->ulUserParm)->NextBuffer)) &&
340
+ (tobefilled != (temp = ((BUFFERINFO *) temp->ulUserParm)->NextBuffer)) )
341
+ {
342
+ DosResetEventSem(dataplayed,&resetcount);
343
+ DosWaitEventSem(dataplayed, -1);
344
+ temp = playingbuffer;
345
+ }
346
+
347
+ } else {
348
+ while(tobefilled == playingbuffer)
349
+ {
350
+ DosResetEventSem(dataplayed,&resetcount);
351
+ DosWaitEventSem(dataplayed, -1);
352
+ }
353
+ }
354
+
355
+ if (justflushed) {
356
+ justflushed = FALSE;
357
+ } else {
358
+ nomoredata = FALSE;
359
+
360
+ memcpy(tobefilled->pBuffer, buf, len);
361
+ tobefilled->ulBufferLength = len;
362
+ // ((BUFFERINFO *) tobefilled->ulUserParm)->frameNum = fr->frameNum;
363
+
364
+ /* if we're out of the water (3rd ahead buffer filled),
365
+ let's reduce our priority */
366
+ if(tobefilled == ( (BUFFERINFO *) ( (BUFFERINFO *) ((BUFFERINFO *) playingbuffer->ulUserParm)->NextBuffer->ulUserParm)->NextBuffer->ulUserParm)->NextBuffer)
367
+ DosSetPriority(PRTYS_THREAD,normalclass,normaldelta,mainthread->tib_ptib2->tib2_ultid);
368
+
369
+ tobefilled = ((BUFFERINFO *) tobefilled->ulUserParm)->NextBuffer;
370
+ }
371
+
372
+ return len;
373
+ }
374
+
375
+ #if 0
376
+ static int write_os2(audio_output_t *ao,unsigned char *buf,int len)
377
+ {
378
+ if(len > audiobufsize || !playingbuffer) return -1;
379
+
380
+ if(mmp.ulBitsPerSample == 16)
381
+ ao->format = MPG123_ENC_SIGNED_16;
382
+ else if(mmp.ulBitsPerSample == 8)
383
+ ao->format = MPG123_ENC_UNSIGNED_8;
384
+ else return -1;
385
+
386
+ ao->rate = mmp.ulSamplesPerSec;
387
+ ao->channels = mmp.ulChannels;
388
+
389
+ if(buf && len)
390
+ {
391
+ ULONG rc;
392
+ int upto;
393
+
394
+ mstatp.ulItem = MCI_STATUS_POSITION;
395
+
396
+ rc = mciSendCommand( maop.usDeviceID,
397
+ MCI_STATUS,
398
+ MCI_STATUS_ITEM | MCI_WAIT,
399
+ &mstatp,
400
+ 0 );
401
+
402
+ if ( ULONG_LOWD(rc) != MCIERR_SUCCESS )
403
+ {
404
+ MciError(rc);
405
+ maop.usDeviceID = 0;
406
+ return(-1);
407
+ }
408
+
409
+ /* this is hypocrite...
410
+ DART returns the value in ulReturn instead of ulValue,
411
+ also it returns in milliseconds and not MMTIME... arg */
412
+
413
+ upto = (mstatp.ulReturn-playedbuffer.ulTime) * mmp.ulSamplesPerSec / 1000;
414
+ upto *= mmp.ulChannels * (mmp.ulBitsPerSample>>3);
415
+
416
+ /* if a timing problem occurs, let's at least not crash */
417
+ if(upto > playingbuffer->ulBufferLength)
418
+ upto = playingbuffer->ulBufferLength;
419
+
420
+ if(len < upto) {
421
+ memcpy(buf,(char *) (playingbuffer->pBuffer)+upto-len, len);
422
+ } else {
423
+ memcpy(buf,(char *) playedbuffer.pBuffer+playedbuffer.ulBufferLength-(len-upto),len-upto);
424
+ memcpy(buf+(len-upto),playingbuffer->pBuffer,upto);
425
+ }
426
+ }
427
+
428
+ return 0;
429
+ }
430
+ #endif
431
+
432
+ /*
433
+ static int audio_nobuffermode(audio_output_t *ao, int setnobuffermode)
434
+ {
435
+ nobuffermode = setnobuffermode;
436
+ return TRUE;
437
+ }
438
+
439
+ int audio_trash_buffers(audio_output_t *ao)
440
+ {
441
+ int i;
442
+
443
+ justflushed = TRUE;
444
+
445
+ // Fill all device buffers with zeros
446
+ for(i = 0; i < ulMCIBuffers; i++)
447
+ memset(MixBuffers[i].pBuffer, 0, MixBuffers[i].ulBufferLength);
448
+
449
+ tobefilled = ((BUFFERINFO *) playingbuffer->ulUserParm)->NextBuffer;
450
+ nomoredata = TRUE;
451
+
452
+ return TRUE;
453
+ }
454
+ */
455
+
456
+ static int close_os2(audio_output_t *ao)
457
+ {
458
+ ULONG rc;
459
+
460
+ if(!maop.usDeviceID)
461
+ return 0;
462
+
463
+ while(!nomoredata)
464
+ {
465
+ DosResetEventSem(dataplayed,&resetcount);
466
+ DosWaitEventSem(dataplayed, -1);
467
+ }
468
+
469
+ playingbuffer = NULL;
470
+
471
+ DosCloseEventSem(dataplayed);
472
+ dataplayed = 0;
473
+
474
+ free(pBufferplayed);
475
+
476
+ rc = mciSendCommand( maop.usDeviceID,
477
+ MCI_BUFFER,
478
+ MCI_WAIT | MCI_DEALLOCATE_MEMORY,
479
+ &mbp,
480
+ 0 );
481
+
482
+ if ( ULONG_LOWD(rc) != MCIERR_SUCCESS )
483
+ {
484
+ MciError(rc);
485
+ return(-1);
486
+ }
487
+
488
+ free(bufferinfo);
489
+ free(MixBuffers);
490
+ bufferinfo = NULL;
491
+ MixBuffers = NULL;
492
+
493
+ memset(&mbp, 0, sizeof(mbp));
494
+
495
+ rc = mciSendCommand( maop.usDeviceID,
496
+ MCI_CLOSE,
497
+ MCI_WAIT ,
498
+ &mgp,
499
+ 0 );
500
+
501
+ if ( ULONG_LOWD(rc) != MCIERR_SUCCESS )
502
+ {
503
+ MciError(rc);
504
+ return(-1);
505
+ }
506
+
507
+ memset(&maop, 0, sizeof(maop));
508
+
509
+ return 0;
510
+ }
511
+
512
+
513
+ /*
514
+ * get formats for specific channel/rate parameters
515
+ */
516
+ int get_formats_os2(audio_output_t *ao)
517
+ {
518
+ int fmts = 0;
519
+ ULONG rc;
520
+ MCI_MIXSETUP_PARMS mmptemp = {0};
521
+
522
+ mmp.ulDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
523
+ mmp.pmixEvent = DARTEvent;
524
+
525
+ mmptemp.ulFormatMode = MCI_PLAY;
526
+ mmptemp.ulSamplesPerSec = ao->rate;
527
+ mmptemp.ulChannels = ao->channels;
528
+
529
+ mmptemp.ulFormatTag = MCI_WAVE_FORMAT_PCM;
530
+ mmptemp.ulBitsPerSample = 16;
531
+ rc = mciSendCommand( maop.usDeviceID,
532
+ MCI_MIXSETUP,
533
+ MCI_WAIT | MCI_MIXSETUP_QUERYMODE,
534
+ &mmptemp,
535
+ 0 );
536
+
537
+ if((ULONG_LOWD(rc) == MCIERR_SUCCESS) && (rc != 0x4000)) /* undocumented */
538
+ fmts = fmts | MPG123_ENC_SIGNED_16;
539
+
540
+ mmptemp.ulFormatTag = MCI_WAVE_FORMAT_PCM;
541
+ mmptemp.ulBitsPerSample = 8;
542
+ rc = mciSendCommand( maop.usDeviceID,
543
+ MCI_MIXSETUP,
544
+ MCI_WAIT | MCI_MIXSETUP_QUERYMODE,
545
+ &mmptemp,
546
+ 0 );
547
+
548
+ if((ULONG_LOWD(rc) == MCIERR_SUCCESS) && (rc != 0x4000)) /* undocumented */
549
+ fmts = fmts | MPG123_ENC_UNSIGNED_8;
550
+
551
+ mmptemp.ulFormatTag = MCI_WAVE_FORMAT_ALAW;
552
+ mmptemp.ulBitsPerSample = 8;
553
+ rc = mciSendCommand( maop.usDeviceID,
554
+ MCI_MIXSETUP,
555
+ MCI_WAIT | MCI_MIXSETUP_QUERYMODE,
556
+ &mmptemp,
557
+ 0 );
558
+
559
+ if((ULONG_LOWD(rc) == MCIERR_SUCCESS) && (rc != 0x4000)) /* undocumented */
560
+ fmts = fmts | MPG123_ENC_ALAW_8;
561
+
562
+ mmptemp.ulFormatTag = MCI_WAVE_FORMAT_MULAW;
563
+ mmptemp.ulBitsPerSample = 8;
564
+ rc = mciSendCommand( maop.usDeviceID,
565
+ MCI_MIXSETUP,
566
+ MCI_WAIT | MCI_MIXSETUP_QUERYMODE,
567
+ &mmptemp,
568
+ 0 );
569
+
570
+ if((ULONG_LOWD(rc) == MCIERR_SUCCESS) && (rc != 0x4000)) /* undocumented */
571
+ fmts = fmts | MPG123_ENC_ULAW_8;
572
+
573
+ return fmts;
574
+ }
575
+
576
+ static int get_devices_os2(char *info, int deviceid)
577
+ {
578
+ char buffer[128];
579
+ MCI_SYSINFO_PARMS mip;
580
+
581
+ if(deviceid && info)
582
+ {
583
+ MCI_SYSINFO_LOGDEVICE mid;
584
+
585
+ mip.pszReturn = buffer;
586
+ mip.ulRetSize = sizeof(buffer);
587
+ mip.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
588
+ mip.ulNumber = deviceid;
589
+
590
+ mciSendCommand(0,
591
+ MCI_SYSINFO,
592
+ MCI_WAIT | MCI_SYSINFO_INSTALLNAME,
593
+ &mip,
594
+ 0);
595
+
596
+ mip.ulItem = MCI_SYSINFO_QUERY_DRIVER;
597
+ mip.pSysInfoParm = &mid;
598
+ strcpy(mid.szInstallName,buffer);
599
+
600
+ mciSendCommand(0,
601
+ MCI_SYSINFO,
602
+ MCI_WAIT | MCI_SYSINFO_ITEM,
603
+ &mip,
604
+ 0);
605
+
606
+ strcpy(info,mid.szProductInfo);
607
+ return deviceid;
608
+
609
+ } else {
610
+ int number;
611
+
612
+ mip.pszReturn = buffer;
613
+ mip.ulRetSize = sizeof(buffer);
614
+ mip.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
615
+
616
+ mciSendCommand(0,
617
+ MCI_SYSINFO,
618
+ MCI_WAIT | MCI_SYSINFO_QUANTITY,
619
+ &mip,
620
+ 0);
621
+
622
+ number = atoi(mip.pszReturn);
623
+ return number;
624
+ }
625
+ }
626
+
627
+
628
+ static void flush_os2(audio_output_t *ao)
629
+ {
630
+ }
631
+
632
+
633
+ static int init_os2(audio_output_t* ao)
634
+ {
635
+ if (ao==NULL) return -1;
636
+
637
+ /* Set callbacks */
638
+ ao->open = open_os2;
639
+ ao->flush = flush_os2;
640
+ ao->write = write_os2;
641
+ ao->get_formats = get_formats_os2;
642
+ ao->close = close_os2;
643
+
644
+ /* Success */
645
+ return 0;
646
+ }
647
+
648
+
649
+
650
+
651
+
652
+ /*
653
+ Module information data structure
654
+ */
655
+ mpg123_module_t mpg123_output_module_info = {
656
+ /* api_version */ MPG123_MODULE_API_VERSION,
657
+ /* name */ "os2",
658
+ /* description */ "Audio output for OS2.",
659
+ /* revision */ "$Rev:$",
660
+ /* handle */ NULL,
661
+
662
+ /* init_output */ init_os2,
663
+ };
664
+
665
+