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,56 @@
1
+ #include "compat.h"
2
+ #include <mpg123.h>
3
+ #include "debug.h"
4
+
5
+ int test_whence(const char* path, int scan_before)
6
+ {
7
+ int err = MPG123_OK;
8
+ mpg123_handle* mh = NULL;
9
+ off_t length, pos;
10
+
11
+ mh = mpg123_new(NULL, &err );
12
+ if(mh == NULL) return -1;
13
+
14
+ err = mpg123_open(mh, path );
15
+ if(err != MPG123_OK) return -1;
16
+
17
+ if(scan_before) mpg123_scan(mh);
18
+
19
+ pos = mpg123_seek( mh, 0, SEEK_END);
20
+ if(pos < 0){ error1("seek failed: %s", mpg123_strerror(mh)); return -1; }
21
+
22
+ pos = mpg123_tell(mh);
23
+ length = mpg123_length(mh);
24
+
25
+ /* Later: Read samples and compare different whence values with identical seek positions. */
26
+
27
+ mpg123_close(mh);
28
+ mpg123_delete(mh);
29
+
30
+ fprintf(stdout, "length %"OFF_P" vs. pos %"OFF_P"\n", length, pos);
31
+
32
+ return (pos == length) ? 0 : -1;
33
+ }
34
+
35
+
36
+ int main(int argc, char **argv)
37
+ {
38
+ int err = 0, errsum = 0;
39
+ if(argc < 2)
40
+ {
41
+ printf("Gimme a MPEG file name...\n");
42
+ return 0;
43
+ }
44
+ mpg123_init();
45
+ fprintf(stderr, "End seek without (explicit) scanning: ");
46
+ err = test_whence(argv[1], 0);
47
+ fprintf(stdout, "%s\n", err == 0 ? "PASS" : "FAIL");
48
+ errsum += err;
49
+ fprintf(stderr, "End seek with explicit scanning: ");
50
+ err = test_whence(argv[1], 1);
51
+ fprintf(stdout, "%s\n", err == 0 ? "PASS" : "FAIL");
52
+ errsum += err;
53
+ mpg123_exit();
54
+ printf("%s\n", errsum ? "FAIL" : "PASS");
55
+ return errsum;
56
+ }
@@ -0,0 +1,34 @@
1
+ /* Test strings generated by testtext.sh, using data from test.txt */
2
+
3
+ const unsigned char latin1[] =
4
+ { 0x47, 0x72, 0x6f, 0xdf, 0x65, 0x72, 0x20, 0x4d, 0xe4, 0x7a, 0x65, 0x6e, 0x2c, 0x20, 0x7a, 0x65, 0x69, 0x67, 0x65, 0x20, 0x64, 0x65, 0x69, 0x6e, 0x65, 0x20, 0x46, 0x6c, 0xfc, 0x67, 0x65, 0x6c, 0x20, 0xf6, 0x66, 0x74, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x6c, 0x21, 0x20, 0x46, 0x61, 0x6b, 0x74, 0x6f, 0x72, 0x20, 0xbc, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x74, 0x65, 0x2e, 0x0a,
5
+ 0x00 };
6
+
7
+ const unsigned char cp1252[] =
8
+ { 0x47, 0x72, 0x6f, 0xdf, 0x65, 0x72, 0x20, 0x4d, 0xe4, 0x7a, 0x65, 0x6e, 0x2c, 0x20, 0x7a, 0x65, 0x69, 0x67, 0x65, 0x20, 0x64, 0x65, 0x69, 0x6e, 0x65, 0x20, 0x46, 0x6c, 0xfc, 0x67, 0x65, 0x6c, 0x20, 0xf6, 0x66, 0x74, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x6c, 0x21, 0x20, 0x46, 0x61, 0x6b, 0x74, 0x6f, 0x72, 0x20, 0xbc, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x74, 0x65, 0x2e, 0x0a,
9
+ 0x00 };
10
+
11
+ const unsigned char utf8[] =
12
+ { 0x47, 0x72, 0x6f, 0xc3, 0x9f, 0x65, 0x72, 0x20, 0x4d, 0xc3, 0xa4, 0x7a, 0x65, 0x6e, 0x2c, 0x20, 0x7a, 0x65, 0x69, 0x67, 0x65, 0x20, 0x64, 0x65, 0x69, 0x6e, 0x65, 0x20, 0x46, 0x6c, 0xc3, 0xbc, 0x67, 0x65, 0x6c, 0x20, 0xc3, 0xb6, 0x66, 0x74, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x6c, 0x21, 0x20, 0x46, 0x61, 0x6b, 0x74, 0x6f, 0x72, 0x20, 0xc2, 0xbc, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x74, 0x65, 0x2e, 0x0a,
13
+ 0x00 };
14
+
15
+ const unsigned char utf16[] =
16
+ { 0xff, 0xfe, 0x47, 0x00, 0x72, 0x00, 0x6f, 0x00, 0xdf, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4d, 0x00, 0xe4, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x69, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6c, 0x00, 0xfc, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0xf6, 0x00, 0x66, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x21, 0x00, 0x20, 0x00, 0x46, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0xbc, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x62, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x0a, 0x00,
17
+ 0x00, 0x00 };
18
+
19
+ const unsigned char utf16bom_le[] =
20
+ { 0xff, 0xfe, 0x47, 0x00, 0x72, 0x00, 0x6f, 0x00, 0xdf, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4d, 0x00, 0xe4, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x69, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6c, 0x00, 0xfc, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0xf6, 0x00, 0x66, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x21, 0x00, 0x20, 0x00, 0x46, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0xbc, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x62, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x0a, 0x00,
21
+ 0x00, 0x00 };
22
+
23
+ const unsigned char utf16le[] =
24
+ { 0x47, 0x00, 0x72, 0x00, 0x6f, 0x00, 0xdf, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4d, 0x00, 0xe4, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x69, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6c, 0x00, 0xfc, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0xf6, 0x00, 0x66, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x21, 0x00, 0x20, 0x00, 0x46, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0xbc, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x62, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x0a, 0x00,
25
+ 0x00, 0x00 };
26
+
27
+ const unsigned char utf16bom_be[] =
28
+ { 0xfe, 0xff, 0x00, 0x47, 0x00, 0x72, 0x00, 0x6f, 0x00, 0xdf, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4d, 0x00, 0xe4, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x69, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6c, 0x00, 0xfc, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0xf6, 0x00, 0x66, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x21, 0x00, 0x20, 0x00, 0x46, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0xbc, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x62, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x0a,
29
+ 0x00, 0x00 };
30
+
31
+ const unsigned char utf16be[] =
32
+ { 0x00, 0x47, 0x00, 0x72, 0x00, 0x6f, 0x00, 0xdf, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4d, 0x00, 0xe4, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x69, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6c, 0x00, 0xfc, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0xf6, 0x00, 0x66, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x21, 0x00, 0x20, 0x00, 0x46, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0xbc, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x62, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x0a,
33
+ 0x00, 0x00 };
34
+
@@ -0,0 +1,80 @@
1
+ /*
2
+ text: Test text transformations in libmpg123 (conversion to UTF-8).
3
+
4
+ copyright 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 Thomas Orgis
7
+
8
+ arguments: decoder testfile.mpeg
9
+ */
10
+
11
+ #include <mpg123.h>
12
+ #include <compat.h>
13
+
14
+ #include "testtext.h"
15
+
16
+ int string_good(mpg123_string *sb)
17
+ {
18
+ /* Let's accept additional null bytes... */
19
+ if(sb->fill >= sizeof(utf8) && memcmp(utf8, sb->p, sizeof(utf8)) == 0
20
+ && (sb->fill <= sizeof(utf8) || sb->p[sizeof(utf8)] == 0) )
21
+ return 1;
22
+ else
23
+ return 0;
24
+ }
25
+
26
+ int check_string(const char* name, enum mpg123_text_encoding enc, const unsigned char* source, size_t source_size)
27
+ {
28
+ int ret = 0;
29
+ mpg123_string sb;
30
+ mpg123_init_string(&sb);
31
+ printf("Conversion of %s: ", name);
32
+ if( mpg123_store_utf8(&sb, enc, source, source_size)
33
+ && string_good(&sb) )
34
+ {
35
+ printf("PASS\n");
36
+ ret = 0;
37
+ }
38
+ else
39
+ {
40
+ printf("FAIL (%"SIZE_P" vs. %"SIZE_P")\n", (size_p)sb.fill, (size_p)sizeof(utf8));
41
+ ret = 1;
42
+ }
43
+
44
+ mpg123_free_string(&sb);
45
+ return ret;
46
+ }
47
+
48
+ /* We test: latin1, cp1252, utf8 and all of utf16be/le with and without BOM.
49
+ Everything should succeed -- except utf16le without BOM. */
50
+ int main()
51
+ {
52
+ int ret = 0;
53
+ mpg123_string trans_utf16le;
54
+
55
+ mpg123_init_string(&trans_utf16le);
56
+
57
+ /* First, all conversions that should work. */
58
+ ret += check_string("latin1", mpg123_text_latin1, latin1, sizeof(latin1));
59
+ ret += check_string("cp1252", mpg123_text_cp1252, cp1252, sizeof(cp1252));
60
+ ret += check_string("utf8", mpg123_text_utf8, utf8, sizeof(utf8));
61
+ ret += check_string("utf16bom_be", mpg123_text_utf16bom, utf16bom_be, sizeof(utf16bom_be));
62
+ ret += check_string("utf16bom_le", mpg123_text_utf16, utf16bom_le, sizeof(utf16bom_le));
63
+ ret += check_string("utf16be", mpg123_text_utf16be, utf16be, sizeof(utf16be));
64
+
65
+ /* Now test the non-supported string. */
66
+ printf("Let's see what happens with a non-BOM little endian UTF-16 string: ");
67
+ mpg123_store_utf8(&trans_utf16le, mpg123_text_utf16, utf16le, sizeof(utf16le));
68
+ if(string_good(&trans_utf16le))
69
+ {
70
+ ++ret;
71
+ printf("FAIL\n");
72
+ }
73
+ else printf("PASS\n");
74
+
75
+ mpg123_free_string(&trans_utf16le);
76
+
77
+ printf("\n%s\n", ret == 0 ? "PASS" : "FAIL");
78
+
79
+ return ret;
80
+ }
@@ -0,0 +1,464 @@
1
+ /*
2
+ wav.c: write wav files
3
+
4
+ copyright ?-2012 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
+ Geez, why are WAV RIFF headers are so secret? I got something together,
9
+ but wow... anyway, I hope someone will find this useful.
10
+ - Samuel Audet
11
+
12
+ minor simplifications and ugly AU/CDR format stuff by MH
13
+
14
+ It's not a very clean code ... Fix this!
15
+
16
+ ThOr: The usage of stdio streams means we loose control over what data is actually written. On a full disk, fwrite() happily suceeds for ages, only a fflush fails.
17
+ Now: Do we want to fflush() after every write? That defeats the purpose of buffered I/O. So, switching to good old write() is an option (kernel doing disk buffering anyway).
18
+
19
+ TODO: convert fully to tab indent
20
+ */
21
+
22
+ #include "mpg123app.h"
23
+ #include <errno.h>
24
+ #include "debug.h"
25
+
26
+ /* Create the two WAV headers. */
27
+
28
+ #define WAVE_FORMAT 1
29
+ #define RIFF_NAME RIFF
30
+ #include "wavhead.h"
31
+
32
+ #undef WAVE_FORMAT
33
+ #undef RIFF_NAME
34
+ #define WAVE_FORMAT 3
35
+ #define RIFF_NAME RIFF_FLOAT
36
+ #define FLOATOUT
37
+ #include "wavhead.h"
38
+
39
+ /* AU header struct... */
40
+
41
+ struct auhead {
42
+ byte magic[4];
43
+ byte headlen[4];
44
+ byte datalen[4];
45
+ byte encoding[4];
46
+ byte rate[4];
47
+ byte channels[4];
48
+ byte dummy[8];
49
+ } auhead = {
50
+ { 0x2e,0x73,0x6e,0x64 } , { 0x00,0x00,0x00,0x20 } ,
51
+ { 0xff,0xff,0xff,0xff } , { 0,0,0,0 } , { 0,0,0,0 } , { 0,0,0,0 } ,
52
+ { 0,0,0,0,0,0,0,0 }};
53
+
54
+
55
+ static FILE *wavfp;
56
+ static int header_written = 0; /* prevent writing multiple headers to stdout */
57
+ static long datalen = 0;
58
+ static int flipendian=0;
59
+ int bytes_per_sample = -1;
60
+ int floatwav = 0; /* If we write a floating point WAV file. */
61
+
62
+ /* Convertfunctions: */
63
+ /* always little endian */
64
+
65
+ static void long2littleendian(long inval,byte *outval,int b)
66
+ {
67
+ int i;
68
+ for(i=0;i<b;i++) {
69
+ outval[i] = (inval>>(i*8)) & 0xff;
70
+ }
71
+ }
72
+
73
+ /* always big endian */
74
+ static void long2bigendian(long inval,byte *outval,int b)
75
+ {
76
+ int i;
77
+ for(i=0;i<b;i++) {
78
+ outval[i] = (inval>>((b-i-1)*8)) & 0xff;
79
+ }
80
+ }
81
+
82
+ static long from_little(byte *inval, int b)
83
+ {
84
+ long ret = 0;
85
+ int i;
86
+ for(i=0;i<b;++i) ret += ((long)inval[i])<<(i*8);
87
+
88
+ return ret;
89
+ }
90
+
91
+ static int testEndian(void)
92
+ {
93
+ long i,a=0,b=0,c=0;
94
+ int ret = 0;
95
+
96
+ for(i=0;i<sizeof(long);i++) {
97
+ ((byte *)&a)[i] = i;
98
+ b<<=8;
99
+ b |= i;
100
+ c |= i << (i*8);
101
+ }
102
+ if(a == b)
103
+ ret = 1;
104
+ else if(a != c) {
105
+ error3("Strange endianness?? %08lx %08lx %08lx\n",a,b,c);
106
+ ret = -1;
107
+ }
108
+ return ret;
109
+ }
110
+
111
+ static int open_file(char *filename)
112
+ {
113
+ #if defined(HAVE_SETUID) && defined(HAVE_GETUID)
114
+ setuid(getuid()); /* dunno whether this helps. I'm not a security expert */
115
+ #endif
116
+ if(!strcmp("-",filename)) {
117
+ wavfp = stdout;
118
+ return 0;
119
+ }
120
+ else {
121
+ #ifdef WANT_WIN32_UNICODE
122
+ wchar_t *filenamew = NULL;
123
+ win32_utf8_wide(filename, &filenamew, NULL);
124
+ if(filenamew == NULL) {
125
+ wavfp = NULL;
126
+ } else {
127
+ wavfp = _wfopen(filenamew,L"wb");
128
+ free(filenamew);
129
+ }
130
+ #else
131
+ wavfp = fopen(filename,"wb");
132
+ #endif
133
+ if(!wavfp)
134
+ return -1;
135
+ else
136
+ {
137
+ /* Test if we actually can write at least a byte, only chance to catch a totally full disk early. */
138
+ char a = 'a';
139
+ if(fwrite(&a, 1, 1, wavfp) == 1 && !fflush(wavfp) && !fseek(wavfp, 0, SEEK_SET))
140
+ return 0;
141
+ else
142
+ {
143
+ error1("cannot even write a single byte: %s", strerror(errno));
144
+ fclose(wavfp);
145
+ return -1;
146
+ }
147
+ }
148
+ }
149
+ }
150
+
151
+ static int close_file()
152
+ {
153
+ if(wavfp != NULL && wavfp != stdout)
154
+ {
155
+ if(fclose(wavfp))
156
+ {
157
+ error1("problem closing the audio file, probably because of flushing to disk: %s\n", strerror(errno));
158
+ return -1;
159
+ }
160
+ else return 0;
161
+ }
162
+
163
+ wavfp = NULL;
164
+ return 0;
165
+ }
166
+
167
+ /* Wrapper over header writing; ensure that stdout doesn't get multiple headers. */
168
+ static int write_header(const void*ptr, size_t size)
169
+ {
170
+ if(wavfp == stdout)
171
+ {
172
+ if(header_written) return 0;
173
+
174
+ header_written = 1;
175
+ }
176
+ if(fwrite(ptr, size, 1, wavfp) != 1 || fflush(wavfp))
177
+ {
178
+ error1("cannot write header: %s", strerror(errno));
179
+ return -1;
180
+ }
181
+ else return 0;
182
+ }
183
+
184
+ int au_open(audio_output_t *ao)
185
+ {
186
+ if(ao->format < 0) ao->format = MPG123_ENC_SIGNED_16;
187
+
188
+ if(ao->format & MPG123_ENC_FLOAT)
189
+ {
190
+ error("AU file support for float values not there yet");
191
+ return -1;
192
+ }
193
+
194
+ flipendian = 0;
195
+
196
+ if(ao->rate < 0) ao->rate = 44100;
197
+ if(ao->channels < 0) ao->channels = 2;
198
+
199
+ switch(ao->format) {
200
+ case MPG123_ENC_SIGNED_16:
201
+ {
202
+ int endiantest = testEndian();
203
+ if(endiantest == -1) return -1;
204
+ flipendian = !endiantest; /* big end */
205
+ long2bigendian(3,auhead.encoding,sizeof(auhead.encoding));
206
+ }
207
+ break;
208
+ case MPG123_ENC_UNSIGNED_8:
209
+ ao->format = MPG123_ENC_ULAW_8;
210
+ case MPG123_ENC_ULAW_8:
211
+ long2bigendian(1,auhead.encoding,sizeof(auhead.encoding));
212
+ break;
213
+ default:
214
+ error("AU output is only a hack. This audio mode isn't supported yet.");
215
+ return -1;
216
+ }
217
+
218
+ long2bigendian(0xffffffff,auhead.datalen,sizeof(auhead.datalen));
219
+ long2bigendian(ao->rate,auhead.rate,sizeof(auhead.rate));
220
+ long2bigendian(ao->channels,auhead.channels,sizeof(auhead.channels));
221
+
222
+ if(open_file(ao->device) < 0)
223
+ return -1;
224
+
225
+ datalen = 0;
226
+
227
+ return write_header(&auhead, sizeof(auhead));
228
+ }
229
+
230
+ int cdr_open(audio_output_t *ao)
231
+ {
232
+ if(ao->format < 0 && ao->rate < 0 && ao->channels < 0)
233
+ {
234
+ /* param.force_stereo = 0; */
235
+ ao->format = MPG123_ENC_SIGNED_16;
236
+ ao->rate = 44100;
237
+ ao->channels = 2;
238
+ }
239
+ if(ao->format != MPG123_ENC_SIGNED_16 || ao->rate != 44100 || ao->channels != 2) {
240
+ fprintf(stderr,"Oops .. not forced to 16 bit, 44kHz?, stereo\n");
241
+ return -1;
242
+ }
243
+
244
+ flipendian = !testEndian(); /* big end */
245
+
246
+
247
+ if(open_file(ao->device) < 0)
248
+ return -1;
249
+
250
+ return 0;
251
+ }
252
+
253
+ int wav_open(audio_output_t *ao)
254
+ {
255
+ int bps;
256
+
257
+ if(ao->format < 0) ao->format = MPG123_ENC_SIGNED_16;
258
+
259
+ flipendian = 0;
260
+
261
+ /* standard MS PCM, and its format specific is BitsPerSample */
262
+ long2littleendian(1,RIFF.WAVE.fmt.FormatTag,sizeof(RIFF.WAVE.fmt.FormatTag));
263
+ floatwav = 0;
264
+ if(ao->format == MPG123_ENC_FLOAT_32)
265
+ {
266
+ floatwav = 1;
267
+ long2littleendian(3,RIFF_FLOAT.WAVE.fmt.FormatTag,sizeof(RIFF_FLOAT.WAVE.fmt.FormatTag));
268
+ long2littleendian(bps=32,RIFF_FLOAT.WAVE.fmt.BitsPerSample,sizeof(RIFF_FLOAT.WAVE.fmt.BitsPerSample));
269
+ flipendian = testEndian();
270
+ }
271
+ else if(ao->format == MPG123_ENC_SIGNED_32) {
272
+ long2littleendian(bps=32,RIFF.WAVE.fmt.BitsPerSample,sizeof(RIFF.WAVE.fmt.BitsPerSample));
273
+ flipendian = testEndian();
274
+ }
275
+ else if(ao->format == MPG123_ENC_SIGNED_24) {
276
+ long2littleendian(bps=24,RIFF.WAVE.fmt.BitsPerSample,sizeof(RIFF.WAVE.fmt.BitsPerSample));
277
+ flipendian = testEndian();
278
+ }
279
+ else if(ao->format == MPG123_ENC_SIGNED_16) {
280
+ long2littleendian(bps=16,RIFF.WAVE.fmt.BitsPerSample,sizeof(RIFF.WAVE.fmt.BitsPerSample));
281
+ flipendian = testEndian();
282
+ }
283
+ else if(ao->format == MPG123_ENC_UNSIGNED_8)
284
+ long2littleendian(bps=8,RIFF.WAVE.fmt.BitsPerSample,sizeof(RIFF.WAVE.fmt.BitsPerSample));
285
+ else
286
+ {
287
+ error("Format not supported.");
288
+ return -1;
289
+ }
290
+
291
+ if(ao->rate < 0) ao->rate = 44100;
292
+ if(ao->channels < 0) ao->channels = 2;
293
+
294
+ if(floatwav)
295
+ {
296
+ long2littleendian(ao->channels,RIFF_FLOAT.WAVE.fmt.Channels,sizeof(RIFF_FLOAT.WAVE.fmt.Channels));
297
+ long2littleendian(ao->rate,RIFF_FLOAT.WAVE.fmt.SamplesPerSec,sizeof(RIFF_FLOAT.WAVE.fmt.SamplesPerSec));
298
+ long2littleendian((int)(ao->channels * ao->rate * bps)>>3,
299
+ RIFF_FLOAT.WAVE.fmt.AvgBytesPerSec,sizeof(RIFF_FLOAT.WAVE.fmt.AvgBytesPerSec));
300
+ long2littleendian((int)(ao->channels * bps)>>3,
301
+ RIFF_FLOAT.WAVE.fmt.BlockAlign,sizeof(RIFF_FLOAT.WAVE.fmt.BlockAlign));
302
+ }
303
+ else
304
+ {
305
+ long2littleendian(ao->channels,RIFF.WAVE.fmt.Channels,sizeof(RIFF.WAVE.fmt.Channels));
306
+ long2littleendian(ao->rate,RIFF.WAVE.fmt.SamplesPerSec,sizeof(RIFF.WAVE.fmt.SamplesPerSec));
307
+ long2littleendian((int)(ao->channels * ao->rate * bps)>>3,
308
+ RIFF.WAVE.fmt.AvgBytesPerSec,sizeof(RIFF.WAVE.fmt.AvgBytesPerSec));
309
+ long2littleendian((int)(ao->channels * bps)>>3,
310
+ RIFF.WAVE.fmt.BlockAlign,sizeof(RIFF.WAVE.fmt.BlockAlign));
311
+ }
312
+
313
+ if(open_file(ao->device) < 0)
314
+ return -1;
315
+
316
+ if(floatwav)
317
+ {
318
+ long2littleendian(datalen,RIFF_FLOAT.WAVE.data.datalen,sizeof(RIFF_FLOAT.WAVE.data.datalen));
319
+ long2littleendian(datalen+sizeof(RIFF_FLOAT.WAVE),RIFF_FLOAT.WAVElen,sizeof(RIFF_FLOAT.WAVElen));
320
+ }
321
+ else
322
+ {
323
+ long2littleendian(datalen,RIFF.WAVE.data.datalen,sizeof(RIFF.WAVE.data.datalen));
324
+ long2littleendian(datalen+sizeof(RIFF.WAVE),RIFF.WAVElen,sizeof(RIFF.WAVElen));
325
+ }
326
+
327
+ if(!( ( floatwav && !write_header(&RIFF_FLOAT, sizeof(RIFF_FLOAT)))
328
+ || (!floatwav && !write_header(&RIFF, sizeof(RIFF))) ))
329
+ {
330
+ return -1;
331
+ }
332
+
333
+ datalen = 0;
334
+ bytes_per_sample = bps>>3;
335
+
336
+ return 0;
337
+ }
338
+
339
+ int wav_write(unsigned char *buf,int len)
340
+ {
341
+ int temp;
342
+ int i;
343
+
344
+ if(!wavfp)
345
+ return 0;
346
+
347
+ if(flipendian)
348
+ {
349
+ if(bytes_per_sample == 4) /* 32 bit */
350
+ {
351
+ if(len & 3)
352
+ {
353
+ error("Number of bytes no multiple of 4 (32bit)!");
354
+ return 0;
355
+ }
356
+ for(i=0;i<len;i+=4)
357
+ {
358
+ int j;
359
+ unsigned char tmp[4];
360
+ for(j = 0; j<=3; ++j) tmp[j] = buf[i+j];
361
+ for(j = 0; j<=3; ++j) buf[i+j] = tmp[3-j];
362
+ }
363
+ }
364
+ else /* 16 bit */
365
+ {
366
+ if(len & 1)
367
+ {
368
+ error("Odd number of bytes!");
369
+ return 0;
370
+ }
371
+ for(i=0;i<len;i+=2)
372
+ {
373
+ unsigned char tmp;
374
+ tmp = buf[i+0];
375
+ buf[i+0] = buf[i+1];
376
+ buf[i+1] = tmp;
377
+ }
378
+ }
379
+ }
380
+
381
+ temp = fwrite(buf, 1, len, wavfp);
382
+ if(temp <= 0)
383
+ return 0;
384
+ /* That would kill it of early when running out of disk space. */
385
+ #if 0
386
+ if(fflush(wavfp))
387
+ {
388
+ fprintf(stderr, "flushing failed: %s\n", strerror(errno));
389
+ return 0;
390
+ }
391
+ #endif
392
+ datalen += temp;
393
+
394
+ return temp;
395
+ }
396
+
397
+ int wav_close(void)
398
+ {
399
+ if(!wavfp) return 0;
400
+
401
+ /* flush before seeking to catch out-of-disk explicitly at least at the end */
402
+ if(fflush(wavfp))
403
+ {
404
+ error1("cannot flush WAV stream: %s", strerror(errno));
405
+ fclose(wavfp);
406
+ return -1;
407
+ }
408
+ if(fseek(wavfp, 0L, SEEK_SET) >= 0)
409
+ {
410
+ if(floatwav)
411
+ {
412
+ long2littleendian(datalen,RIFF_FLOAT.WAVE.data.datalen,sizeof(RIFF_FLOAT.WAVE.data.datalen));
413
+ long2littleendian(datalen+sizeof(RIFF_FLOAT.WAVE),RIFF_FLOAT.WAVElen,sizeof(RIFF_FLOAT.WAVElen));
414
+ long2littleendian(datalen/(from_little(RIFF_FLOAT.WAVE.fmt.Channels,2)*from_little(RIFF_FLOAT.WAVE.fmt.BitsPerSample,2)/8),
415
+ RIFF_FLOAT.WAVE.fact.samplelen,sizeof(RIFF_FLOAT.WAVE.fact.samplelen));
416
+ /* Always (over)writing the header here; also for stdout, when fseek worked, this overwrite works. */
417
+ fwrite(&RIFF_FLOAT, sizeof(RIFF_FLOAT),1,wavfp);
418
+ }
419
+ else
420
+ {
421
+ long2littleendian(datalen,RIFF.WAVE.data.datalen,sizeof(RIFF.WAVE.data.datalen));
422
+ long2littleendian(datalen+sizeof(RIFF.WAVE),RIFF.WAVElen,sizeof(RIFF.WAVElen));
423
+ /* Always (over)writing the header here; also for stdout, when fseek worked, this overwrite works. */
424
+ fwrite(&RIFF, sizeof(RIFF),1,wavfp);
425
+ }
426
+ }
427
+ else
428
+ warning("Cannot rewind WAV file. File-format isn't fully conform now.");
429
+
430
+ return close_file();
431
+ }
432
+
433
+ int au_close(void)
434
+ {
435
+ if(!wavfp)
436
+ return 0;
437
+
438
+ /* flush before seeking to catch out-of-disk explicitly at least at the end */
439
+ if(fflush(wavfp))
440
+ {
441
+ error1("cannot flush WAV stream: %s", strerror(errno));
442
+ fclose(wavfp);
443
+ return -1;
444
+ }
445
+ if(fseek(wavfp, 0L, SEEK_SET) >= 0) {
446
+ long2bigendian(datalen,auhead.datalen,sizeof(auhead.datalen));
447
+ /* Always (over)writing the header here; also for stdout, when fseek worked, this overwrite works. */
448
+ fwrite(&auhead, sizeof(auhead),1,wavfp);
449
+ }
450
+ else
451
+ warning("Cannot rewind AU file. File-format isn't fully conform now.");
452
+
453
+ return close_file();
454
+ }
455
+
456
+ int cdr_close(void)
457
+ {
458
+ if(!wavfp) return 0;
459
+
460
+ return close_file();
461
+ }
462
+
463
+
464
+