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,161 @@
1
+ /*
2
+ * sndio: sndio audio output
3
+ *
4
+ * Copyright (c) 2008 Christian Weisgerber <naddy@openbsd.org>,
5
+ * Alexandre Ratchov <alex@caoua.org>
6
+ *
7
+ * Permission to use, copy, modify, and distribute this software for any
8
+ * purpose with or without fee is hereby granted, provided that the above
9
+ * copyright notice and this permission notice appear in all copies.
10
+ *
11
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
+ */
19
+
20
+ #include "mpg123app.h"
21
+
22
+ #include <sndio.h>
23
+
24
+ #include "debug.h"
25
+
26
+ static int open_sndio(audio_output_t *ao)
27
+ {
28
+ struct sio_hdl *hdl;
29
+ struct sio_par par;
30
+
31
+ hdl = sio_open(ao->device /* NULL is fine */, SIO_PLAY, 0);
32
+ if (hdl == NULL)
33
+ return -1;
34
+
35
+ sio_initpar(&par);
36
+ par.rate = ao->rate;
37
+ par.pchan = ao->channels;
38
+ par.le = SIO_LE_NATIVE;
39
+ switch(ao->format) {
40
+ case MPG123_ENC_SIGNED_32:
41
+ par.sig = 1;
42
+ par.bits = 32;
43
+ break;
44
+ case MPG123_ENC_UNSIGNED_32:
45
+ par.sig = 0;
46
+ par.bits = 32;
47
+ break;
48
+ case MPG123_ENC_SIGNED_16:
49
+ case -1: /* query mode */
50
+ par.sig = 1;
51
+ par.bits = 16;
52
+ break;
53
+ case MPG123_ENC_UNSIGNED_16:
54
+ par.sig = 0;
55
+ par.bits = 16;
56
+ break;
57
+ case MPG123_ENC_UNSIGNED_8:
58
+ par.sig = 0;
59
+ par.bits = 8;
60
+ break;
61
+ case MPG123_ENC_SIGNED_8:
62
+ par.sig = 1;
63
+ par.bits = 8;
64
+ break;
65
+ default:
66
+ if (!AOQUIET)
67
+ error1("open_sndio: invalid sample format %d",
68
+ ao->format);
69
+ sio_close(hdl);
70
+ return -1;
71
+ }
72
+
73
+ if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par) ||
74
+ !sio_start(hdl)) {
75
+ sio_close(hdl);
76
+ return -1;
77
+ }
78
+ if ((par.bits != 8 && par.bits != 16 && par.bits != 32) ||
79
+ par.le != SIO_LE_NATIVE) {
80
+ sio_close(hdl);
81
+ return -1;
82
+ }
83
+ ao->rate = par.rate;
84
+ ao->channels = par.pchan;
85
+ switch (par.bits) {
86
+ case 8:
87
+ ao->format = par.sig ? MPG123_ENC_SIGNED_8 :
88
+ MPG123_ENC_UNSIGNED_8;
89
+ break;
90
+ case 16:
91
+ ao->format = par.sig ? MPG123_ENC_SIGNED_16 :
92
+ MPG123_ENC_UNSIGNED_16;
93
+ break;
94
+ case 32:
95
+ ao->format = par.sig ? MPG123_ENC_SIGNED_32 :
96
+ MPG123_ENC_UNSIGNED_32;
97
+ break;
98
+ }
99
+ ao->userptr = hdl;
100
+ return 0;
101
+ }
102
+
103
+ static int get_formats_sndio(audio_output_t *ao)
104
+ {
105
+ return (MPG123_ENC_SIGNED_32|MPG123_ENC_UNSIGNED_32|
106
+ MPG123_ENC_SIGNED_16|MPG123_ENC_UNSIGNED_16|
107
+ MPG123_ENC_UNSIGNED_8|MPG123_ENC_SIGNED_8);
108
+ }
109
+
110
+ static int write_sndio(audio_output_t *ao, unsigned char *buf, int len)
111
+ {
112
+ struct sio_hdl *hdl = (struct sio_hdl *)ao->userptr;
113
+ int count;
114
+
115
+ count = (int)sio_write(hdl, buf, len);
116
+ if (count == 0 && sio_eof(hdl))
117
+ return -1;
118
+ return count;
119
+ }
120
+
121
+ static void flush_sndio(audio_output_t *ao)
122
+ {
123
+ return;
124
+ }
125
+
126
+ static int close_sndio(audio_output_t *ao)
127
+ {
128
+ struct sio_hdl *hdl = (struct sio_hdl *)ao->userptr;
129
+
130
+ sio_close(hdl);
131
+ return 0;
132
+ }
133
+
134
+ static int init_sndio(audio_output_t* ao)
135
+ {
136
+ if (ao == NULL)
137
+ return -1;
138
+
139
+ /* Set callbacks */
140
+ ao->open = open_sndio;
141
+ ao->flush = flush_sndio; /* required */
142
+ ao->write = write_sndio;
143
+ ao->get_formats = get_formats_sndio;
144
+ ao->close = close_sndio;
145
+
146
+ /* Success */
147
+ return 0;
148
+ }
149
+
150
+ /*
151
+ Module information data structure
152
+ */
153
+ mpg123_module_t mpg123_output_module_info = {
154
+ /* api_version */ MPG123_MODULE_API_VERSION,
155
+ /* name */ "sndio",
156
+ /* description */ "Output audio using sndio library",
157
+ /* revision */ "$Rev:$",
158
+ /* handle */ NULL,
159
+
160
+ /* init_output */ init_sndio,
161
+ };
@@ -0,0 +1,281 @@
1
+ /*
2
+ sun: audio output for Sun systems
3
+
4
+ copyright ?-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 Michael Hipp
7
+ */
8
+
9
+ #include "mpg123app.h"
10
+
11
+ #ifdef HAVE_SYS_IOCTL_H
12
+ #include <sys/ioctl.h>
13
+ #endif
14
+
15
+ #ifdef HAVE_SUN_AUDIOIO_H
16
+ #include <sun/audioio.h>
17
+ #endif
18
+
19
+ #ifdef HAVE_SYS_AUDIOIO_H
20
+ #include <sys/audioio.h>
21
+ #endif
22
+
23
+ #ifdef HAVE_SYS_AUDIO_H
24
+ #include <sys/audio.h>
25
+ #endif
26
+
27
+ #ifdef HAVE_ASM_AUDIOIO_H
28
+ #include <asm/audioio.h>
29
+ #endif
30
+
31
+ #include <fcntl.h>
32
+ #include "debug.h"
33
+
34
+ static void set_format_helper(audio_output_t *ao, audio_info_t *ainfo)
35
+ {
36
+
37
+ switch(ao->format) {
38
+ case -1:
39
+ case MPG123_ENC_SIGNED_16:
40
+ default:
41
+ #ifndef AUDIO_ENCODING_LINEAR /* not supported */
42
+ #define AUDIO_ENCODING_LINEAR 3
43
+ #endif
44
+ ainfo->play.encoding = AUDIO_ENCODING_LINEAR;
45
+ ainfo->play.precision = 16;
46
+ break;
47
+ case MPG123_ENC_UNSIGNED_8:
48
+ #if defined(SOLARIS) || defined(SPARCLINUX)
49
+ ainfo->play.encoding = AUDIO_ENCODING_LINEAR8;
50
+ ainfo->play.precision = 8;
51
+ break;
52
+ #endif
53
+ case MPG123_ENC_SIGNED_8:
54
+ error("Linear signed 8 bit not supported!");
55
+ return;
56
+ case MPG123_ENC_ULAW_8:
57
+ ainfo->play.encoding = AUDIO_ENCODING_ULAW;
58
+ ainfo->play.precision = 8;
59
+ break;
60
+ case MPG123_ENC_ALAW_8:
61
+ ainfo->play.encoding = AUDIO_ENCODING_ALAW;
62
+ ainfo->play.precision = 8;
63
+ break;
64
+ }
65
+
66
+ }
67
+
68
+
69
+ static int reset_parameters_sun(audio_output_t *ao)
70
+ {
71
+ audio_info_t ainfo;
72
+
73
+ AUDIO_INITINFO(&ainfo);
74
+ if(ao->rate != -1) ainfo.play.sample_rate = ao->rate;
75
+
76
+ if(ao->channels >= 0) ainfo.play.channels = ao->channels;
77
+
78
+ set_format_helper(ao,&ainfo);
79
+ if(ioctl(ao->fn, AUDIO_SETINFO, &ainfo) == -1) return -1;
80
+
81
+ return 0;
82
+ }
83
+
84
+ static int rate_best_match(audio_output_t *ao)
85
+ {
86
+ audio_info_t ainfo;
87
+ AUDIO_INITINFO(&ainfo);
88
+
89
+ ainfo.play.sample_rate = ao->rate;
90
+ if(ioctl(ao->fn, AUDIO_SETINFO, &ainfo) < 0) {
91
+ ao->rate = 0;
92
+ return 0;
93
+ }
94
+ if(ioctl(ao->fn, AUDIO_GETINFO, &ainfo) < 0) {
95
+ return -1;
96
+ }
97
+
98
+ ao->rate = ainfo.play.sample_rate;
99
+ return 0;
100
+ }
101
+
102
+ static int set_rate(audio_output_t *ao)
103
+ {
104
+ audio_info_t ainfo;
105
+
106
+ if(ao->rate != -1) {
107
+ AUDIO_INITINFO(&ainfo);
108
+ ainfo.play.sample_rate = ao->rate;
109
+ if(ioctl(ao->fn, AUDIO_SETINFO, &ainfo) == -1) return -1;
110
+ return 0;
111
+ }
112
+
113
+ return -1;
114
+ }
115
+
116
+ static int set_channels(audio_output_t *ao)
117
+ {
118
+ audio_info_t ainfo;
119
+
120
+ AUDIO_INITINFO(&ainfo);
121
+ ainfo.play.channels = ao->channels;
122
+ if(ioctl(ao->fn, AUDIO_SETINFO, &ainfo) == -1)
123
+ return -1;
124
+
125
+ return 0;
126
+ }
127
+
128
+ static int set_format(audio_output_t *ao)
129
+ {
130
+ audio_info_t ainfo;
131
+
132
+ AUDIO_INITINFO(&ainfo);
133
+ set_format_helper(ao,&ainfo);
134
+ if(ioctl(ao->fn, AUDIO_SETINFO, &ainfo) == -1)
135
+ return -1;
136
+
137
+ return 0;
138
+ }
139
+
140
+ static int open_sun(audio_output_t *ao)
141
+ {
142
+ audio_info_t ainfo;
143
+
144
+ if(!ao->device) {
145
+ if(getenv("AUDIODEV")) {
146
+ ao->device = getenv("AUDIODEV");
147
+ } else {
148
+ ao->device = "/dev/audio";
149
+ }
150
+ }
151
+
152
+ ao->fn = open(ao->device,O_WRONLY);
153
+ if(ao->fn < 0) return ao->fn;
154
+
155
+ #if defined(SUNOS) && defined(AUDIO_GETDEV)
156
+ {
157
+ int type;
158
+ if(ioctl(ao->fn, AUDIO_GETDEV, &type) == -1) return -1;
159
+ if(type == AUDIO_DEV_UNKNOWN || type == AUDIO_DEV_AMD)
160
+ return -1;
161
+ }
162
+ #else
163
+ #if defined(SOLARIS) || defined(SPARCLINUX)
164
+ {
165
+ struct audio_device ad;
166
+ if(ioctl(ao->fn, AUDIO_GETDEV, &ad) == -1)
167
+ return -1;
168
+ if(!strstr(ad.name,"dbri") && !strstr(ad.name,"CS4231"))
169
+ warning1("Unknown sound system %s. But we try it.",ad.name);
170
+ }
171
+ #endif
172
+ #endif
173
+
174
+ if(reset_parameters_sun(ao) < 0) return -1;
175
+
176
+ AUDIO_INITINFO(&ainfo);
177
+
178
+ if(ao->flags > 0)
179
+ ainfo.play.port = 0;
180
+ if(ao->flags & AUDIO_OUT_INTERNAL_SPEAKER)
181
+ ainfo.play.port |= AUDIO_SPEAKER;
182
+ if(ao->flags & AUDIO_OUT_HEADPHONES)
183
+ ainfo.play.port |= AUDIO_HEADPHONE;
184
+ #ifdef AUDIO_LINE_OUT
185
+ if(ao->flags & AUDIO_OUT_LINE_OUT)
186
+ ainfo.play.port |= AUDIO_LINE_OUT;
187
+ #endif
188
+
189
+ if(ao->gain != -1)
190
+ ainfo.play.gain = ao->gain;
191
+
192
+ if(ioctl(ao->fn, AUDIO_SETINFO, &ainfo) == -1)
193
+ return -1;
194
+
195
+ return ao->fn;
196
+ }
197
+
198
+
199
+
200
+
201
+ static int get_formats_sun(audio_output_t *ao)
202
+ {
203
+ static int tab[][3] = {
204
+ { AUDIO_ENCODING_ULAW , 8, MPG123_ENC_ULAW_8 } ,
205
+ { AUDIO_ENCODING_ALAW , 8, MPG123_ENC_ALAW_8 } ,
206
+ { AUDIO_ENCODING_LINEAR , 16, MPG123_ENC_SIGNED_16 } ,
207
+ #if 0
208
+ #if defined(SOLARIS) || defined(SPARCLINUX)
209
+ { AUDIO_ENCODING_LINEAR8 , 8, MPG123_ENC_UNSIGNED_8 } ,
210
+ #endif
211
+ #endif
212
+ };
213
+
214
+ audio_info_t ainfo;
215
+ int i,fmts=0;
216
+
217
+ for(i=0;i<sizeof(tab)/sizeof(tab[0]);i++) {
218
+ AUDIO_INITINFO(&ainfo);
219
+ ainfo.play.encoding = tab[i][0];
220
+ ainfo.play.precision = tab[i][1];
221
+ #if 1
222
+ ainfo.play.sample_rate = ao->rate;
223
+ ainfo.play.channels = ao->channels;
224
+ #endif
225
+ if(ioctl(ao->fn, AUDIO_SETINFO, &ainfo) >= 0) {
226
+ fmts |= tab[i][2];
227
+ }
228
+ }
229
+ return fmts;
230
+ }
231
+
232
+ static int write_sun(audio_output_t *ao,unsigned char *buf,int len)
233
+ {
234
+ return write(ao->fn,buf,len);
235
+ }
236
+
237
+ static int close_sun(audio_output_t *ao)
238
+ {
239
+ close (ao->fn);
240
+ return 0;
241
+ }
242
+
243
+ static void flush_sun(audio_output_t *ao)
244
+ {
245
+ /*ioctl (ao->fn, I_FLUSH, FLUSHRW);*/
246
+ }
247
+
248
+
249
+ static int init_sun(audio_output_t* ao)
250
+ {
251
+ if (ao==NULL) return -1;
252
+
253
+ /* Set callbacks */
254
+ ao->open = open_sun;
255
+ ao->flush = flush_sun;
256
+ ao->write = write_sun;
257
+ ao->get_formats = get_formats_sun;
258
+ ao->close = close_sun;
259
+
260
+ /* Success */
261
+ return 0;
262
+ }
263
+
264
+
265
+
266
+
267
+
268
+ /*
269
+ Module information data structure
270
+ */
271
+ mpg123_module_t mpg123_output_module_info = {
272
+ /* api_version */ MPG123_MODULE_API_VERSION,
273
+ /* name */ "sun",
274
+ /* description */ "Audio output for Sun Audio.",
275
+ /* revision */ "$Rev: 1872 $",
276
+ /* handle */ NULL,
277
+
278
+ /* init_output */ init_sun,
279
+ };
280
+
281
+
@@ -0,0 +1,229 @@
1
+ /*
2
+ win32: audio output for Windows 32bit
3
+
4
+ copyright ?-2007 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
+
7
+ initially written (as it seems) by Tony Million
8
+ rewrite of basic functionality for callback-less and properly ringbuffered operation by ravenexp
9
+ */
10
+
11
+ #include "mpg123app.h"
12
+ #include <windows.h>
13
+ #include "debug.h"
14
+
15
+ /*
16
+ Buffer size and number of buffers in the playback ring
17
+ NOTE: This particular num/size combination performs best under heavy
18
+ loads for my system, however this may not be true for any hardware/OS out there.
19
+ Generally, BUFFER_SIZE < 8k || NUM_BUFFERS > 16 || NUM_BUFFERS < 4 are not recommended.
20
+ */
21
+ #define BUFFER_SIZE 0x10000
22
+ #define NUM_BUFFERS 8 /* total 512k roughly 2.5 sec of CD quality sound */
23
+
24
+ /* Buffer ring queue state */
25
+ struct queue_state
26
+ {
27
+ WAVEHDR buffer_headers[NUM_BUFFERS];
28
+ /* The next buffer to be filled and put in playback */
29
+ int next_buffer;
30
+ /* Buffer playback completion event */
31
+ HANDLE play_done_event;
32
+ HWAVEOUT waveout;
33
+ };
34
+
35
+ static int open_win32(struct audio_output_struct *ao)
36
+ {
37
+ struct queue_state* state;
38
+ int i;
39
+ MMRESULT res;
40
+ WAVEFORMATEX out_fmt;
41
+ UINT dev_id;
42
+
43
+ if(!ao) return -1;
44
+ if(ao->rate == -1) return 0;
45
+
46
+ /* Allocate queue state struct for this device */
47
+ state = calloc(1, sizeof(struct queue_state));
48
+ if(!state) return -1;
49
+
50
+ ao->userptr = state;
51
+ /* Allocate playback buffers */
52
+ for(i = 0; i < NUM_BUFFERS; i++)
53
+ if(!(state->buffer_headers[i].lpData = malloc(BUFFER_SIZE)))
54
+ ereturn(-1, "Out of memory for playback buffers.");
55
+
56
+ state->play_done_event = CreateEvent(0,FALSE,FALSE,0);
57
+ if(state->play_done_event == INVALID_HANDLE_VALUE) return -1;
58
+
59
+ /* FIXME: real device enumeration by capabilities? */
60
+ dev_id = WAVE_MAPPER; /* probably does the same thing */
61
+ ao->device = "WaveMapper";
62
+ /* FIXME: support for smth besides MPG123_ENC_SIGNED_16? */
63
+ out_fmt.wFormatTag = WAVE_FORMAT_PCM;
64
+ out_fmt.wBitsPerSample = 16;
65
+ out_fmt.nChannels = ao->channels;
66
+ out_fmt.nSamplesPerSec = ao->rate;
67
+ out_fmt.nBlockAlign = out_fmt.nChannels*out_fmt.wBitsPerSample/8;
68
+ out_fmt.nAvgBytesPerSec = out_fmt.nBlockAlign*out_fmt.nSamplesPerSec;
69
+ out_fmt.cbSize = 0;
70
+
71
+ res = waveOutOpen(&state->waveout, dev_id, &out_fmt,
72
+ (DWORD_PTR)state->play_done_event, 0, CALLBACK_EVENT);
73
+
74
+ switch(res)
75
+ {
76
+ case MMSYSERR_NOERROR:
77
+ break;
78
+ case MMSYSERR_ALLOCATED:
79
+ ereturn(-1, "Audio output device is already allocated.");
80
+ case MMSYSERR_NODRIVER:
81
+ ereturn(-1, "No device driver is present.");
82
+ case MMSYSERR_NOMEM:
83
+ ereturn(-1, "Unable to allocate or lock memory.");
84
+ case WAVERR_BADFORMAT:
85
+ ereturn(-1, "Unsupported waveform-audio format.");
86
+ default:
87
+ ereturn(-1, "Unable to open wave output device.");
88
+ }
89
+
90
+ /* Reset event from the "device open" message */
91
+ ResetEvent(state->play_done_event);
92
+ return 0;
93
+ }
94
+
95
+ static int get_formats_win32(struct audio_output_struct *ao)
96
+ {
97
+ /* FIXME: support for smth besides MPG123_ENC_SIGNED_16? */
98
+ return MPG123_ENC_SIGNED_16;
99
+ }
100
+
101
+ /* Stores audio data to the fixed size buffers and pushes them into the playback queue.
102
+ I have one grief with that: The last piece of a track may not reach the output,
103
+ only full buffers sent... But we don't get smooth audio otherwise. */
104
+ static int write_win32(struct audio_output_struct *ao, unsigned char *buf, int len)
105
+ {
106
+ struct queue_state* state;
107
+ MMRESULT res;
108
+ WAVEHDR* hdr;
109
+
110
+ int rest_len; /* Input data bytes left for next recursion. */
111
+ int bufill; /* Bytes we stuff into buffer now. */
112
+
113
+ if(!ao || !ao->userptr) return -1;
114
+ if(!buf || len <= 0) return 0;
115
+
116
+ state = (struct queue_state*)ao->userptr;
117
+ hdr = &state->buffer_headers[state->next_buffer];
118
+
119
+ /* Check buffer header and wait if it's being played.
120
+ Skip waiting if the buffer is not full yet */
121
+ while(hdr->dwBufferLength == BUFFER_SIZE && !(hdr->dwFlags & WHDR_DONE))
122
+ {
123
+ /* debug1("waiting for buffer %i...", state->next_buffer); */
124
+ WaitForSingleObject(state->play_done_event, INFINITE);
125
+ }
126
+
127
+ /* If it was a full buffer being played, clean up. */
128
+ if(hdr->dwFlags & WHDR_DONE)
129
+ {
130
+ waveOutUnprepareHeader(state->waveout, hdr, sizeof(WAVEHDR));
131
+ hdr->dwFlags = 0;
132
+ hdr->dwBufferLength = 0;
133
+ }
134
+
135
+ /* Now see how much we want to stuff in and then stuff it in. */
136
+ bufill = BUFFER_SIZE - hdr->dwBufferLength;
137
+ if(len < bufill) bufill = len;
138
+
139
+ rest_len = len - bufill;
140
+ memcpy(hdr->lpData + hdr->dwBufferLength, buf, bufill);
141
+ hdr->dwBufferLength += bufill;
142
+ if(hdr->dwBufferLength == BUFFER_SIZE)
143
+ { /* Send the buffer out when it's full. */
144
+ res = waveOutPrepareHeader(state->waveout, hdr, sizeof(WAVEHDR));
145
+ if(res != MMSYSERR_NOERROR) ereturn(-1, "Can't write to audio output device (prepare).");
146
+
147
+ res = waveOutWrite(state->waveout, hdr, sizeof(WAVEHDR));
148
+ if(res != MMSYSERR_NOERROR) ereturn(-1, "Can't write to audio output device.");
149
+
150
+ /* Cycle to the next buffer in the ring queue */
151
+ state->next_buffer = (state->next_buffer + 1) % NUM_BUFFERS;
152
+ }
153
+ /* I'd like to propagate error codes or something... but there are no catchable surprises left.
154
+ Anyhow: Here is the recursion that makes ravenexp happy;-) */
155
+ if(rest_len && write_win32(ao, buf + bufill, rest_len) < 0) /* Write the rest. */
156
+ return -1;
157
+ else
158
+ return len;
159
+ }
160
+
161
+ static void flush_win32(struct audio_output_struct *ao)
162
+ {
163
+ int i, z;
164
+ struct queue_state* state;
165
+
166
+ if(!ao || !ao->userptr) return;
167
+ state = (struct queue_state*)ao->userptr;
168
+
169
+ /* FIXME: The very last output buffer is not played. This could be a problem on the feeding side. */
170
+ i = 0;
171
+ z = state->next_buffer - 1;
172
+ for(i = 0; i < NUM_BUFFERS; i++)
173
+ {
174
+ if(!state->buffer_headers[i].dwFlags & WHDR_DONE)
175
+ WaitForSingleObject(state->play_done_event, INFINITE);
176
+
177
+ waveOutUnprepareHeader(state->waveout, &state->buffer_headers[i], sizeof(WAVEHDR));
178
+ state->buffer_headers[i].dwFlags = 0;
179
+ state->buffer_headers[i].dwBufferLength = 0;
180
+ z = (z + 1) % NUM_BUFFERS;
181
+ }
182
+ }
183
+
184
+ static int close_win32(struct audio_output_struct *ao)
185
+ {
186
+ int i;
187
+ struct queue_state* state;
188
+
189
+ if(!ao || !ao->userptr) return -1;
190
+ state = (struct queue_state*)ao->userptr;
191
+
192
+ flush_win32(ao);
193
+ waveOutClose(state->waveout);
194
+ CloseHandle(state->play_done_event);
195
+
196
+ for(i = 0; i < NUM_BUFFERS; i++) free(state->buffer_headers[i].lpData);
197
+
198
+ free(ao->userptr);
199
+ ao->userptr = 0;
200
+ return 0;
201
+ }
202
+
203
+ static int init_win32(audio_output_t* ao)
204
+ {
205
+ if(!ao) return -1;
206
+
207
+ /* Set callbacks */
208
+ ao->open = open_win32;
209
+ ao->flush = flush_win32;
210
+ ao->write = write_win32;
211
+ ao->get_formats = get_formats_win32;
212
+ ao->close = close_win32;
213
+
214
+ /* Success */
215
+ return 0;
216
+ }
217
+
218
+ /*
219
+ Module information data structure
220
+ */
221
+ mpg123_module_t mpg123_output_module_info = {
222
+ /* api_version */ MPG123_MODULE_API_VERSION,
223
+ /* name */ "win32",
224
+ /* description */ "Audio output for Windows (winmm).",
225
+ /* revision */ "$Rev:$",
226
+ /* handle */ NULL,
227
+
228
+ /* init_output */ init_win32,
229
+ };