seal 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,964 @@
1
+ /*
2
+ optimize: get a grip on the different optimizations
3
+
4
+ copyright 2006-9 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, inspired by 3DNow stuff in mpg123.[hc]
7
+
8
+ Currently, this file contains the struct and function to choose an optimization variant and works only when OPT_MULTI is in effect.
9
+ */
10
+
11
+ #include "mpg123lib_intern.h" /* includes optimize.h */
12
+ #include "debug.h"
13
+
14
+ /* Must match the enum dectype! */
15
+
16
+ /*
17
+ It SUCKS having to define these names that way, but compile-time intialization of string arrays is a bitch.
18
+ GCC doesn't see constant stuff when it's wiggling in front of it!
19
+ Anyhow: Have a script for that:
20
+ names="generic generic_dither i386 i486 i586 i586_dither MMX 3DNow 3DNowExt AltiVec SSE x86-64"
21
+ for i in $names; do echo "##define dn_${i/-/_} \"$i\""; done
22
+ echo -n "static const char* decname[] =
23
+ {
24
+ \"auto\"
25
+ "
26
+ for i in $names; do echo -n ", dn_${i/-/_}"; done
27
+ echo "
28
+ , \"nodec\"
29
+ };"
30
+ */
31
+ #define dn_generic "generic"
32
+ #define dn_generic_dither "generic_dither"
33
+ #define dn_i386 "i386"
34
+ #define dn_i486 "i486"
35
+ #define dn_i586 "i586"
36
+ #define dn_i586_dither "i586_dither"
37
+ #define dn_MMX "MMX"
38
+ #define dn_3DNow "3DNow"
39
+ #define dn_3DNowExt "3DNowExt"
40
+ #define dn_AltiVec "AltiVec"
41
+ #define dn_SSE "SSE"
42
+ #define dn_x86_64 "x86-64"
43
+ #define dn_ARM "ARM"
44
+ #define dn_NEON "NEON"
45
+ static const char* decname[] =
46
+ {
47
+ "auto"
48
+ , dn_generic, dn_generic_dither, dn_i386, dn_i486, dn_i586, dn_i586_dither, dn_MMX, dn_3DNow, dn_3DNowExt, dn_AltiVec, dn_SSE, dn_x86_64, dn_ARM, dn_NEON
49
+ , "nodec"
50
+ };
51
+
52
+ #if (defined OPT_X86) && (defined OPT_MULTI)
53
+ #include "getcpuflags.h"
54
+ static struct cpuflags cpu_flags;
55
+ #else
56
+ /* Faking stuff for non-multi builds. The same code for synth function choice is used.
57
+ Just no runtime dependency of result... */
58
+ #define cpu_flags nothing
59
+ #define cpu_i586(s) 1
60
+ #define cpu_fpu(s) 1
61
+ #define cpu_mmx(s) 1
62
+ #define cpu_3dnow(s) 1
63
+ #define cpu_3dnowext(s) 1
64
+ #define cpu_sse(s) 1
65
+ #define cpu_sse2(s) 1
66
+ #define cpu_sse3(s) 1
67
+ #endif
68
+
69
+ /* Ugly macros to build conditional synth function array values. */
70
+
71
+ #ifndef NO_8BIT
72
+ #define IF8(synth) synth,
73
+ #else
74
+ #define IF8(synth)
75
+ #endif
76
+
77
+ #ifndef NO_REAL
78
+ #define IFREAL(synth) synth,
79
+ #else
80
+ #define IFREAL(synth)
81
+ #endif
82
+
83
+ #ifndef NO_32BIT
84
+ #define IF32(synth) synth
85
+ #else
86
+ #define IF32(synth)
87
+ #endif
88
+
89
+ #ifndef NO_16BIT
90
+ # define OUT_SYNTHS(synth_16, synth_8, synth_real, synth_32) { synth_16, IF8(synth_8) IFREAL(synth_real) IF32(synth_32) }
91
+ #else
92
+ # define OUT_SYNTHS(synth_16, synth_8, synth_real, synth_32) { IF8(synth_8) IFREAL(synth_real) IF32(synth_32) }
93
+ #endif
94
+
95
+ /* The call of left and right plain synth, wrapped.
96
+ This may be replaced by a direct stereo optimized synth. */
97
+ static int synth_stereo_wrap(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
98
+ {
99
+ int clip;
100
+ clip = (fr->synth)(bandPtr_l, 0, fr, 0);
101
+ clip += (fr->synth)(bandPtr_r, 1, fr, 1);
102
+ return clip;
103
+ }
104
+
105
+ static const struct synth_s synth_base =
106
+ {
107
+ { /* plain */
108
+ OUT_SYNTHS(synth_1to1, synth_1to1_8bit, synth_1to1_real, synth_1to1_s32)
109
+ # ifndef NO_DOWNSAMPLE
110
+ ,OUT_SYNTHS(synth_2to1, synth_2to1_8bit, synth_2to1_real, synth_2to1_s32)
111
+ ,OUT_SYNTHS(synth_4to1, synth_4to1_8bit, synth_4to1_real, synth_4to1_s32)
112
+ # endif
113
+ # ifndef NO_NTOM
114
+ ,OUT_SYNTHS(synth_ntom, synth_ntom_8bit, synth_ntom_real, synth_ntom_s32)
115
+ # endif
116
+ },
117
+ { /* stereo, by default only wrappers over plain synth */
118
+ OUT_SYNTHS(synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap)
119
+ # ifndef NO_DOWNSAMPLE
120
+ ,OUT_SYNTHS(synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap)
121
+ ,OUT_SYNTHS(synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap)
122
+ # endif
123
+ # ifndef NO_NTOM
124
+ ,OUT_SYNTHS(synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap, synth_stereo_wrap)
125
+ # endif
126
+ },
127
+ { /* mono2stereo */
128
+ OUT_SYNTHS(synth_1to1_m2s, synth_1to1_8bit_m2s, synth_1to1_real_m2s, synth_1to1_s32_m2s)
129
+ # ifndef NO_DOWNSAMPLE
130
+ ,OUT_SYNTHS(synth_2to1_m2s, synth_2to1_8bit_m2s, synth_2to1_real_m2s, synth_2to1_s32_m2s)
131
+ ,OUT_SYNTHS(synth_4to1_m2s, synth_4to1_8bit_m2s, synth_4to1_real_m2s, synth_4to1_s32_m2s)
132
+ # endif
133
+ # ifndef NO_NTOM
134
+ ,OUT_SYNTHS(synth_ntom_m2s, synth_ntom_8bit_m2s, synth_ntom_real_m2s, synth_ntom_s32_m2s)
135
+ # endif
136
+ },
137
+ { /* mono*/
138
+ OUT_SYNTHS(synth_1to1_mono, synth_1to1_8bit_mono, synth_1to1_real_mono, synth_1to1_s32_mono)
139
+ # ifndef NO_DOWNSAMPLE
140
+ ,OUT_SYNTHS(synth_2to1_mono, synth_2to1_8bit_mono, synth_2to1_real_mono, synth_2to1_s32_mono)
141
+ ,OUT_SYNTHS(synth_4to1_mono, synth_4to1_8bit_mono, synth_4to1_real_mono, synth_4to1_s32_mono)
142
+ # endif
143
+ # ifndef NO_NTOM
144
+ ,OUT_SYNTHS(synth_ntom_mono, synth_ntom_8bit_mono, synth_ntom_real_mono, synth_ntom_s32_mono)
145
+ #endif
146
+ }
147
+ };
148
+
149
+ #ifdef OPT_X86
150
+ /* More plain synths for i386 */
151
+ const func_synth plain_i386[r_limit][f_limit] =
152
+ { /* plain */
153
+ OUT_SYNTHS(synth_1to1_i386, synth_1to1_8bit_i386, synth_1to1_real_i386, synth_1to1_s32_i386)
154
+ # ifndef NO_DOWNSAMPLE
155
+ ,OUT_SYNTHS(synth_2to1_i386, synth_2to1_8bit_i386, synth_2to1_real_i386, synth_2to1_s32_i386)
156
+ ,OUT_SYNTHS(synth_4to1_i386, synth_4to1_8bit_i386, synth_4to1_real_i386, synth_4to1_s32_i386)
157
+ # endif
158
+ # ifndef NO_NTOM
159
+ ,OUT_SYNTHS(synth_ntom, synth_ntom_8bit, synth_ntom_real, synth_ntom_s32)
160
+ # endif
161
+ };
162
+ #endif
163
+
164
+
165
+ enum optdec defdec(void){ return defopt; }
166
+
167
+ enum optcla decclass(const enum optdec type)
168
+ {
169
+ return (type == mmx || type == sse || type == dreidnowext || type == x86_64 || type == neon) ? mmxsse : normal;
170
+ }
171
+
172
+
173
+ static int find_synth(func_synth synth, const func_synth synths[r_limit][f_limit])
174
+ {
175
+ enum synth_resample ri;
176
+ enum synth_format fi;
177
+ for(ri=0; ri<r_limit; ++ri)
178
+ for(fi=0; fi<f_limit; ++fi)
179
+ if(synth == synths[ri][fi])
180
+ return TRUE;
181
+
182
+ return FALSE;
183
+ }
184
+
185
+ /* Determine what kind of decoder is actually active
186
+ This depends on runtime choices which may cause fallback to i386 or generic code. */
187
+ static int find_dectype(mpg123_handle *fr)
188
+ {
189
+ enum optdec type = nodec;
190
+ /* Direct and indirect usage, 1to1 stereo decoding.
191
+ Concentrating on the plain stereo synth should be fine, mono stuff is derived. */
192
+ func_synth basic_synth = fr->synth;
193
+ #ifndef NO_8BIT
194
+ #ifndef NO_16BIT
195
+ if(basic_synth == synth_1to1_8bit_wrap)
196
+ basic_synth = fr->synths.plain[r_1to1][f_16]; /* That is what's really below the surface. */
197
+ #endif
198
+ #endif
199
+
200
+ if(FALSE) ; /* Just to initialize the else if ladder. */
201
+ #ifndef NO_16BIT
202
+ #ifdef OPT_3DNOWEXT
203
+ else if(basic_synth == synth_1to1_3dnowext) type = dreidnowext;
204
+ #endif
205
+ #ifdef OPT_SSE
206
+ else if(basic_synth == synth_1to1_sse) type = sse;
207
+ #endif
208
+ #ifdef OPT_3DNOW
209
+ else if(basic_synth == synth_1to1_3dnow) type = dreidnow;
210
+ #endif
211
+ #ifdef OPT_MMX
212
+ else if(basic_synth == synth_1to1_mmx) type = mmx;
213
+ #endif
214
+ #ifdef OPT_I586_DITHER
215
+ else if(basic_synth == synth_1to1_i586_dither) type = ifuenf_dither;
216
+ #endif
217
+ #ifdef OPT_I586
218
+ else if(basic_synth == synth_1to1_i586) type = ifuenf;
219
+ #endif
220
+ #ifdef OPT_ALTIVEC
221
+ else if(basic_synth == synth_1to1_altivec) type = altivec;
222
+ #endif
223
+ #ifdef OPT_X86_64
224
+ else if(basic_synth == synth_1to1_x86_64) type = x86_64;
225
+ #endif
226
+ #ifdef OPT_ARM
227
+ else if(basic_synth == synth_1to1_arm) type = arm;
228
+ #endif
229
+ #ifdef OPT_NEON
230
+ else if(basic_synth == synth_1to1_neon) type = neon;
231
+ #endif
232
+ #ifdef OPT_GENERIC_DITHER
233
+ else if(basic_synth == synth_1to1_dither) type = generic_dither;
234
+ #endif
235
+ #ifdef OPT_DITHER /* either i586 or generic! */
236
+ #ifndef NO_DOWNSAMPLE
237
+ else if
238
+ (
239
+ basic_synth == synth_2to1_dither
240
+ || basic_synth == synth_4to1_dither
241
+ ) type = generic_dither;
242
+ #endif
243
+ #endif
244
+ #endif /* 16bit */
245
+
246
+ #ifndef NO_REAL
247
+ #ifdef OPT_SSE
248
+ else if(basic_synth == synth_1to1_real_sse) type = sse;
249
+ #endif
250
+ #ifdef OPT_X86_64
251
+ else if(basic_synth == synth_1to1_real_x86_64) type = x86_64;
252
+ #endif
253
+ #ifdef OPT_ALTIVEC
254
+ else if(basic_synth == synth_1to1_real_altivec) type = altivec;
255
+ #endif
256
+ #ifdef OPT_NEON
257
+ else if(basic_synth == synth_1to1_real_neon) type = neon;
258
+ #endif
259
+
260
+ #endif /* real */
261
+
262
+ #ifndef NO_32BIT
263
+ #ifdef OPT_SSE
264
+ else if(basic_synth == synth_1to1_s32_sse) type = sse;
265
+ #endif
266
+ #ifdef OPT_X86_64
267
+ else if(basic_synth == synth_1to1_s32_x86_64) type = x86_64;
268
+ #endif
269
+ #ifdef OPT_ALTIVEC
270
+ else if(basic_synth == synth_1to1_s32_altivec) type = altivec;
271
+ #endif
272
+ #ifdef OPT_NEON
273
+ else if(basic_synth == synth_1to1_s32_neon) type = neon;
274
+ #endif
275
+ #endif /* 32bit */
276
+
277
+ #ifdef OPT_X86
278
+ else if(find_synth(basic_synth, plain_i386))
279
+ type = idrei;
280
+ #endif
281
+
282
+ else if(find_synth(basic_synth, synth_base.plain))
283
+ type = generic;
284
+
285
+
286
+
287
+ #ifdef OPT_I486
288
+ /* i486 is special ... the specific code is in use for 16bit 1to1 stereo
289
+ otherwise we have i386 active... but still, the distinction doesn't matter*/
290
+ type = ivier;
291
+ #endif
292
+
293
+ if(type != nodec)
294
+ {
295
+ fr->cpu_opts.type = type;
296
+ fr->cpu_opts.class = decclass(type);
297
+
298
+ debug3("determined active decoder type %i (%s) of class %i", type, decname[type], fr->cpu_opts.class);
299
+ return MPG123_OK;
300
+ }
301
+ else
302
+ {
303
+ if(NOQUIET) error("Unable to determine active decoder type -- this is SERIOUS b0rkage!");
304
+
305
+ fr->err = MPG123_BAD_DECODER_SETUP;
306
+ return MPG123_ERR;
307
+ }
308
+ }
309
+
310
+ /* set synth functions for current frame, optimizations handled by opt_* macros */
311
+ int set_synth_functions(mpg123_handle *fr)
312
+ {
313
+ enum synth_resample resample = r_none;
314
+ enum synth_format basic_format = f_none; /* Default is always 16bit, or whatever. */
315
+
316
+ /* Select the basic output format, different from 16bit: 8bit, real. */
317
+ if(FALSE){}
318
+ #ifndef NO_16BIT
319
+ else if(fr->af.encoding & MPG123_ENC_16)
320
+ basic_format = f_16;
321
+ #endif
322
+ #ifndef NO_8BIT
323
+ else if(fr->af.encoding & MPG123_ENC_8)
324
+ basic_format = f_8;
325
+ #endif
326
+ #ifndef NO_REAL
327
+ else if(fr->af.encoding & MPG123_ENC_FLOAT)
328
+ basic_format = f_real;
329
+ #endif
330
+ #ifndef NO_32BIT
331
+ /* 24 bit integer means decoding to 32 bit first. */
332
+ else if(fr->af.encoding & MPG123_ENC_32 || fr->af.encoding & MPG123_ENC_24)
333
+ basic_format = f_32;
334
+ #endif
335
+
336
+ /* Make sure the chosen format is compiled into this lib. */
337
+ if(basic_format == f_none)
338
+ {
339
+ if(NOQUIET) error("set_synth_functions: This output format is disabled in this build!");
340
+
341
+ return -1;
342
+ }
343
+
344
+ /* Be explicit about downsampling variant. */
345
+ switch(fr->down_sample)
346
+ {
347
+ case 0: resample = r_1to1; break;
348
+ #ifndef NO_DOWNSAMPLE
349
+ case 1: resample = r_2to1; break;
350
+ case 2: resample = r_4to1; break;
351
+ #endif
352
+ #ifndef NO_NTOM
353
+ case 3: resample = r_ntom; break;
354
+ #endif
355
+ }
356
+
357
+ if(resample == r_none)
358
+ {
359
+ if(NOQUIET) error("set_synth_functions: This resampling mode is not supported in this build!");
360
+
361
+ return -1;
362
+ }
363
+
364
+ debug2("selecting synth: resample=%i format=%i", resample, basic_format);
365
+ /* Finally selecting the synth functions for stereo / mono. */
366
+ fr->synth = fr->synths.plain[resample][basic_format];
367
+ fr->synth_stereo = fr->synths.stereo[resample][basic_format];
368
+ fr->synth_mono = fr->af.channels==2
369
+ ? fr->synths.mono2stereo[resample][basic_format] /* Mono MPEG file decoded to stereo. */
370
+ : fr->synths.mono[resample][basic_format]; /* Mono MPEG file decoded to mono. */
371
+
372
+ if(find_dectype(fr) != MPG123_OK) /* Actually determine the currently active decoder breed. */
373
+ {
374
+ fr->err = MPG123_BAD_DECODER_SETUP;
375
+ return MPG123_ERR;
376
+ }
377
+
378
+ if(frame_buffers(fr) != 0)
379
+ {
380
+ fr->err = MPG123_NO_BUFFERS;
381
+ if(NOQUIET) error("Failed to set up decoder buffers!");
382
+
383
+ return MPG123_ERR;
384
+ }
385
+
386
+ #ifndef NO_8BIT
387
+ if(basic_format == f_8)
388
+ {
389
+ if(make_conv16to8_table(fr) != 0)
390
+ {
391
+ if(NOQUIET) error("Failed to set up conv16to8 table!");
392
+ /* it's a bit more work to get proper error propagation up */
393
+ return -1;
394
+ }
395
+ }
396
+ #endif
397
+
398
+ #ifdef OPT_MMXORSSE
399
+ /* Special treatment for MMX, SSE and 3DNowExt stuff.
400
+ The real-decoding SSE for x86-64 uses normal tables! */
401
+ if(fr->cpu_opts.class == mmxsse
402
+ # ifndef NO_REAL
403
+ && basic_format != f_real
404
+ # endif
405
+ # ifndef NO_32BIT
406
+ && basic_format != f_32
407
+ # endif
408
+ # ifdef ACCURATE_ROUNDING
409
+ && fr->cpu_opts.type != sse
410
+ && fr->cpu_opts.type != x86_64
411
+ && fr->cpu_opts.type != neon
412
+ # endif
413
+ )
414
+ {
415
+ #ifndef NO_LAYER3
416
+ init_layer3_stuff(fr, init_layer3_gainpow2_mmx);
417
+ #endif
418
+ #ifndef NO_LAYER12
419
+ init_layer12_stuff(fr, init_layer12_table_mmx);
420
+ #endif
421
+ fr->make_decode_tables = make_decode_tables_mmx;
422
+ }
423
+ else
424
+ #endif
425
+ {
426
+ #ifndef NO_LAYER3
427
+ init_layer3_stuff(fr, init_layer3_gainpow2);
428
+ #endif
429
+ #ifndef NO_LAYER12
430
+ init_layer12_stuff(fr, init_layer12_table);
431
+ #endif
432
+ fr->make_decode_tables = make_decode_tables;
433
+ }
434
+
435
+ /* We allocated the table buffers just now, so (re)create the tables. */
436
+ fr->make_decode_tables(fr);
437
+
438
+ return 0;
439
+ }
440
+
441
+ int frame_cpu_opt(mpg123_handle *fr, const char* cpu)
442
+ {
443
+ const char* chosen = ""; /* the chosen decoder opt as string */
444
+ enum optdec want_dec = nodec;
445
+ int done = 0;
446
+ int auto_choose = 0;
447
+ #ifdef OPT_DITHER
448
+ int dithered = FALSE; /* If some dithered decoder is chosen. */
449
+ #endif
450
+
451
+ want_dec = dectype(cpu);
452
+ auto_choose = want_dec == autodec;
453
+ /* Fill whole array of synth functions with generic code first. */
454
+ fr->synths = synth_base;
455
+
456
+ #ifndef OPT_MULTI
457
+ {
458
+ if(!auto_choose && want_dec != defopt)
459
+ {
460
+ if(NOQUIET) error2("you wanted decoder type %i, I only have %i", want_dec, defopt);
461
+ }
462
+ auto_choose = TRUE; /* There will be only one choice anyway. */
463
+ }
464
+ #endif
465
+
466
+ fr->cpu_opts.type = nodec;
467
+ /* covers any i386+ cpu; they actually differ only in the synth_1to1 function, mostly... */
468
+ #ifdef OPT_X86
469
+
470
+ #ifdef OPT_MULTI
471
+ #ifndef NO_LAYER3
472
+ #if (defined OPT_3DNOW || defined OPT_3DNOWEXT)
473
+ fr->cpu_opts.the_dct36 = dct36;
474
+ #endif
475
+ #endif
476
+ #endif
477
+
478
+ if(cpu_i586(cpu_flags))
479
+ {
480
+ # ifdef OPT_MULTI
481
+ debug2("standard flags: 0x%08x\textended flags: 0x%08x", cpu_flags.std, cpu_flags.ext);
482
+ # endif
483
+ #ifdef OPT_SSE
484
+ if( !done && (auto_choose || want_dec == sse)
485
+ && cpu_sse(cpu_flags) && cpu_mmx(cpu_flags) )
486
+ {
487
+ chosen = "SSE";
488
+ fr->cpu_opts.type = sse;
489
+ # ifndef NO_16BIT
490
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_sse;
491
+ # ifdef ACCURATE_ROUNDING
492
+ fr->synths.stereo[r_1to1][f_16] = synth_1to1_stereo_sse;
493
+ # endif
494
+ # endif
495
+ # ifndef NO_REAL
496
+ fr->synths.plain[r_1to1][f_real] = synth_1to1_real_sse;
497
+ fr->synths.stereo[r_1to1][f_real] = synth_1to1_real_stereo_sse;
498
+ # endif
499
+ # ifndef NO_32BIT
500
+ fr->synths.plain[r_1to1][f_32] = synth_1to1_s32_sse;
501
+ fr->synths.stereo[r_1to1][f_32] = synth_1to1_s32_stereo_sse;
502
+ # endif
503
+ done = 1;
504
+ }
505
+ #endif
506
+ # ifdef OPT_3DNOWEXT
507
+ if( !done && (auto_choose || want_dec == dreidnowext )
508
+ && cpu_3dnow(cpu_flags)
509
+ && cpu_3dnowext(cpu_flags)
510
+ && cpu_mmx(cpu_flags) )
511
+ {
512
+ chosen = "3DNowExt";
513
+ fr->cpu_opts.type = dreidnowext;
514
+ #ifdef OPT_MULTI
515
+ # ifndef NO_LAYER3
516
+ /* The DCT36 is _bad_, at least compared to gcc 4.4-built C code. */
517
+ /* fr->cpu_opts.the_dct36 = dct36_3dnowext; */
518
+ # endif
519
+ #endif
520
+ # ifndef NO_16BIT
521
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_3dnowext;
522
+ # endif
523
+ done = 1;
524
+ }
525
+ #endif
526
+ #ifdef OPT_3DNOW
527
+ if( !done && (auto_choose || want_dec == dreidnow)
528
+ && cpu_3dnow(cpu_flags) && cpu_mmx(cpu_flags) )
529
+ {
530
+ chosen = "3DNow";
531
+ fr->cpu_opts.type = dreidnow;
532
+ #ifdef OPT_MULTI
533
+ # ifndef NO_LAYER3
534
+ /* The DCT36 is _bad_, at least compared to gcc 4.4-built C code. */
535
+ /* fr->cpu_opts.the_dct36 = dct36_3dnow; */
536
+ # endif
537
+ #endif
538
+ # ifndef NO_16BIT
539
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_3dnow;
540
+ # endif
541
+ done = 1;
542
+ }
543
+ #endif
544
+ #ifdef OPT_MMX
545
+ if( !done && (auto_choose || want_dec == mmx)
546
+ && cpu_mmx(cpu_flags) )
547
+ {
548
+ chosen = "MMX";
549
+ fr->cpu_opts.type = mmx;
550
+ # ifndef NO_16BIT
551
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_mmx;
552
+ # endif
553
+ done = 1;
554
+ }
555
+ #endif
556
+ #ifdef OPT_I586
557
+ if(!done && (auto_choose || want_dec == ifuenf))
558
+ {
559
+ chosen = "i586/pentium";
560
+ fr->cpu_opts.type = ifuenf;
561
+ # ifndef NO_16BIT
562
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_i586;
563
+ # endif
564
+ done = 1;
565
+ }
566
+ #endif
567
+ #ifdef OPT_I586_DITHER
568
+ if(!done && (auto_choose || want_dec == ifuenf_dither))
569
+ {
570
+ chosen = "dithered i586/pentium";
571
+ fr->cpu_opts.type = ifuenf_dither;
572
+ dithered = TRUE;
573
+ # ifndef NO_16BIT
574
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_i586_dither;
575
+ # ifndef NO_DOWNSAMPLE
576
+ fr->synths.plain[r_2to1][f_16] = synth_2to1_dither;
577
+ fr->synths.plain[r_4to1][f_16] = synth_4to1_dither;
578
+ # endif
579
+ # endif
580
+ done = 1;
581
+ }
582
+ #endif
583
+ }
584
+ #ifdef OPT_I486
585
+ /* That won't cooperate in multi opt mode - forcing i486 in layer3.c
586
+ But still... here it is... maybe for real use in future. */
587
+ if(!done && (auto_choose || want_dec == ivier))
588
+ {
589
+ chosen = "i486";
590
+ fr->cpu_opts.type = ivier;
591
+ done = 1;
592
+ }
593
+ #endif
594
+ #ifdef OPT_I386
595
+ if(!done && (auto_choose || want_dec == idrei))
596
+ {
597
+ chosen = "i386";
598
+ fr->cpu_opts.type = idrei;
599
+ done = 1;
600
+ }
601
+ #endif
602
+
603
+ if(done)
604
+ {
605
+ /*
606
+ We have chosen some x86 decoder... fillup some i386 stuff.
607
+ There is an open question about using dithered synth_1to1 for 8bit wrappers.
608
+ For quality it won't make sense, but wrapped i586_dither wrapped may still be faster...
609
+ */
610
+ enum synth_resample ri;
611
+ enum synth_format fi;
612
+ # ifndef NO_8BIT
613
+ # ifndef NO_16BIT /* possibility to use a 16->8 wrapper... */
614
+ if(fr->synths.plain[r_1to1][f_16] != synth_base.plain[r_1to1][f_16])
615
+ {
616
+ fr->synths.plain[r_1to1][f_8] = synth_1to1_8bit_wrap;
617
+ fr->synths.mono[r_1to1][f_8] = synth_1to1_8bit_wrap_mono;
618
+ fr->synths.mono2stereo[r_1to1][f_8] = synth_1to1_8bit_wrap_m2s;
619
+ }
620
+ # endif
621
+ # endif
622
+ for(ri=0; ri<r_limit; ++ri)
623
+ for(fi=0; fi<f_limit; ++fi)
624
+ {
625
+ if(fr->synths.plain[ri][fi] == synth_base.plain[ri][fi])
626
+ fr->synths.plain[ri][fi] = plain_i386[ri][fi];
627
+ }
628
+ }
629
+
630
+ #endif /* OPT_X86 */
631
+
632
+ #ifdef OPT_X86_64
633
+ if(!done && (auto_choose || want_dec == x86_64))
634
+ {
635
+ chosen = "x86-64 (SSE)";
636
+ fr->cpu_opts.type = x86_64;
637
+ # ifndef NO_16BIT
638
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_x86_64;
639
+ fr->synths.stereo[r_1to1][f_16] = synth_1to1_stereo_x86_64;
640
+ # endif
641
+ # ifndef NO_REAL
642
+ fr->synths.plain[r_1to1][f_real] = synth_1to1_real_x86_64;
643
+ fr->synths.stereo[r_1to1][f_real] = synth_1to1_real_stereo_x86_64;
644
+ # endif
645
+ # ifndef NO_32BIT
646
+ fr->synths.plain[r_1to1][f_32] = synth_1to1_s32_x86_64;
647
+ fr->synths.stereo[r_1to1][f_32] = synth_1to1_s32_stereo_x86_64;
648
+ # endif
649
+ done = 1;
650
+ }
651
+ #endif
652
+
653
+ #ifdef OPT_GENERIC_DITHER
654
+ if(!done && (auto_choose || want_dec == generic_dither))
655
+ {
656
+ chosen = "dithered generic";
657
+ fr->cpu_opts.type = generic_dither;
658
+ dithered = TRUE;
659
+ # ifndef NO_16BIT
660
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_dither;
661
+ # ifndef NO_DOWNSAMPLE
662
+ fr->synths.plain[r_2to1][f_16] = synth_2to1_dither;
663
+ fr->synths.plain[r_4to1][f_16] = synth_4to1_dither;
664
+ # endif
665
+ # endif
666
+ done = 1;
667
+ }
668
+ #endif
669
+
670
+ # ifdef OPT_ALTIVEC
671
+ if(!done && (auto_choose || want_dec == altivec))
672
+ {
673
+ chosen = "AltiVec";
674
+ fr->cpu_opts.type = altivec;
675
+ # ifndef NO_16BIT
676
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_altivec;
677
+ fr->synths.stereo[r_1to1][f_16] = synth_1to1_stereo_altivec;
678
+ # endif
679
+ # ifndef NO_REAL
680
+ fr->synths.plain[r_1to1][f_real] = synth_1to1_real_altivec;
681
+ fr->synths.stereo[r_1to1][f_real] = synth_1to1_real_stereo_altivec;
682
+ # endif
683
+ # ifndef NO_32BIT
684
+ fr->synths.plain[r_1to1][f_32] = synth_1to1_s32_altivec;
685
+ fr->synths.stereo[r_1to1][f_32] = synth_1to1_s32_stereo_altivec;
686
+ # endif
687
+ done = 1;
688
+ }
689
+ # endif
690
+
691
+ # ifdef OPT_NEON
692
+ if(!done && (auto_choose || want_dec == neon))
693
+ {
694
+ chosen = "NEON";
695
+ fr->cpu_opts.type = neon;
696
+ # ifndef NO_16BIT
697
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_neon;
698
+ fr->synths.stereo[r_1to1][f_16] = synth_1to1_stereo_neon;
699
+ # endif
700
+ # ifndef NO_REAL
701
+ fr->synths.plain[r_1to1][f_real] = synth_1to1_real_neon;
702
+ fr->synths.stereo[r_1to1][f_real] = synth_1to1_real_stereo_neon;
703
+ # endif
704
+ # ifndef NO_32BIT
705
+ fr->synths.plain[r_1to1][f_32] = synth_1to1_s32_neon;
706
+ fr->synths.stereo[r_1to1][f_32] = synth_1to1_s32_stereo_neon;
707
+ # endif
708
+ done = 1;
709
+ }
710
+ # endif
711
+
712
+ # ifdef OPT_ARM
713
+ if(!done && (auto_choose || want_dec == arm))
714
+ {
715
+ chosen = "ARM";
716
+ fr->cpu_opts.type = arm;
717
+ # ifndef NO_16BIT
718
+ fr->synths.plain[r_1to1][f_16] = synth_1to1_arm;
719
+ # endif
720
+ done = 1;
721
+ }
722
+ # endif
723
+
724
+ # ifdef OPT_GENERIC
725
+ if(!done && (auto_choose || want_dec == generic))
726
+ {
727
+ chosen = "generic";
728
+ fr->cpu_opts.type = generic;
729
+ done = 1;
730
+ }
731
+ # endif
732
+
733
+ fr->cpu_opts.class = decclass(fr->cpu_opts.type);
734
+
735
+ # ifndef NO_8BIT
736
+ # ifndef NO_16BIT /* possibility to use a 16->8 wrapper... */
737
+ /* Last chance to use some optimized routine via generic wrappers (for 8bit). */
738
+ if( fr->cpu_opts.type != ifuenf_dither
739
+ && fr->cpu_opts.type != generic_dither
740
+ && fr->synths.plain[r_1to1][f_16] != synth_base.plain[r_1to1][f_16] )
741
+ {
742
+ fr->synths.plain[r_1to1][f_8] = synth_1to1_8bit_wrap;
743
+ fr->synths.mono[r_1to1][f_8] = synth_1to1_8bit_wrap_mono;
744
+ fr->synths.mono2stereo[r_1to1][f_8] = synth_1to1_8bit_wrap_m2s;
745
+ }
746
+ # endif
747
+ # endif
748
+
749
+ #ifdef OPT_DITHER
750
+ if(done && dithered)
751
+ {
752
+ /* run-time dither noise table generation */
753
+ if(!frame_dither_init(fr))
754
+ {
755
+ if(NOQUIET) error("Dither noise setup failed!");
756
+ return 0;
757
+ }
758
+ }
759
+ #endif
760
+
761
+ if(done)
762
+ {
763
+ if(VERBOSE) fprintf(stderr, "Decoder: %s\n", chosen);
764
+ return 1;
765
+ }
766
+ else
767
+ {
768
+ if(NOQUIET) error("Could not set optimization!");
769
+ return 0;
770
+ }
771
+ }
772
+
773
+ enum optdec dectype(const char* decoder)
774
+ {
775
+ enum optdec dt;
776
+ if( (decoder == NULL)
777
+ || (decoder[0] == 0) )
778
+ return autodec;
779
+
780
+ for(dt=autodec; dt<nodec; ++dt)
781
+ if(!strcasecmp(decoder, decname[dt])) return dt;
782
+
783
+ return nodec; /* If we found nothing... */
784
+ }
785
+
786
+ #ifdef OPT_MULTI
787
+
788
+ /* same number of entries as full list, but empty at beginning */
789
+ static const char *mpg123_supported_decoder_list[] =
790
+ {
791
+ #ifdef OPT_SSE
792
+ NULL,
793
+ #endif
794
+ #ifdef OPT_3DNOWEXT
795
+ NULL,
796
+ #endif
797
+ #ifdef OPT_3DNOW
798
+ NULL,
799
+ #endif
800
+ #ifdef OPT_MMX
801
+ NULL,
802
+ #endif
803
+ #ifdef OPT_I586
804
+ NULL,
805
+ #endif
806
+ #ifdef OPT_I586_DITHER
807
+ NULL,
808
+ #endif
809
+ #ifdef OPT_I486
810
+ NULL,
811
+ #endif
812
+ #ifdef OPT_I386
813
+ NULL,
814
+ #endif
815
+ #ifdef OPT_ALTIVEC
816
+ NULL,
817
+ #endif
818
+ #ifdef OPT_X86_64
819
+ NULL,
820
+ #endif
821
+ #ifdef OPT_ARM
822
+ NULL,
823
+ #endif
824
+ #ifdef OPT_NEON
825
+ NULL,
826
+ #endif
827
+ #ifdef OPT_GENERIC_FLOAT
828
+ NULL,
829
+ #endif
830
+ # ifdef OPT_GENERIC
831
+ NULL,
832
+ # endif
833
+ # ifdef OPT_GENERIC_DITHER
834
+ NULL,
835
+ # endif
836
+ NULL
837
+ };
838
+ #endif
839
+
840
+ static const char *mpg123_decoder_list[] =
841
+ {
842
+ #ifdef OPT_SSE
843
+ dn_SSE,
844
+ #endif
845
+ #ifdef OPT_3DNOWEXT
846
+ dn_3DNowExt,
847
+ #endif
848
+ #ifdef OPT_3DNOW
849
+ dn_3DNow,
850
+ #endif
851
+ #ifdef OPT_MMX
852
+ dn_MMX,
853
+ #endif
854
+ #ifdef OPT_I586
855
+ dn_i586,
856
+ #endif
857
+ #ifdef OPT_I586_DITHER
858
+ dn_i586_dither,
859
+ #endif
860
+ #ifdef OPT_I486
861
+ dn_i486,
862
+ #endif
863
+ #ifdef OPT_I386
864
+ dn_i386,
865
+ #endif
866
+ #ifdef OPT_ALTIVEC
867
+ dn_AltiVec,
868
+ #endif
869
+ #ifdef OPT_X86_64
870
+ dn_x86_64,
871
+ #endif
872
+ #ifdef OPT_ARM
873
+ dn_ARM,
874
+ #endif
875
+ #ifdef OPT_NEON
876
+ dn_NEON,
877
+ #endif
878
+ #ifdef OPT_GENERIC
879
+ dn_generic,
880
+ #endif
881
+ #ifdef OPT_GENERIC_DITHER
882
+ dn_generic_dither,
883
+ #endif
884
+ NULL
885
+ };
886
+
887
+ void check_decoders(void )
888
+ {
889
+ #ifndef OPT_MULTI
890
+ /* In non-multi mode, only the full list (one entry) is used. */
891
+ return;
892
+ #else
893
+ const char **d = mpg123_supported_decoder_list;
894
+ #ifdef OPT_X86
895
+ getcpuflags(&cpu_flags);
896
+ if(cpu_i586(cpu_flags))
897
+ {
898
+ /* not yet: if(cpu_sse2(cpu_flags)) printf(" SSE2");
899
+ if(cpu_sse3(cpu_flags)) printf(" SSE3"); */
900
+ #ifdef OPT_SSE
901
+ if(cpu_sse(cpu_flags)) *(d++) = decname[sse];
902
+ #endif
903
+ #ifdef OPT_3DNOWEXT
904
+ if(cpu_3dnowext(cpu_flags)) *(d++) = decname[dreidnowext];
905
+ #endif
906
+ #ifdef OPT_3DNOW
907
+ if(cpu_3dnow(cpu_flags)) *(d++) = decname[dreidnow];
908
+ #endif
909
+ #ifdef OPT_MMX
910
+ if(cpu_mmx(cpu_flags)) *(d++) = decname[mmx];
911
+ #endif
912
+ #ifdef OPT_I586
913
+ *(d++) = decname[ifuenf];
914
+ #endif
915
+ #ifdef OPT_I586_DITHER
916
+ *(d++) = decname[ifuenf_dither];
917
+ #endif
918
+ }
919
+ #endif
920
+ /* just assume that the i486 built is run on a i486 cpu... */
921
+ #ifdef OPT_I486
922
+ *(d++) = decname[ivier];
923
+ #endif
924
+ #ifdef OPT_ALTIVEC
925
+ *(d++) = decname[altivec];
926
+ #endif
927
+ /* every supported x86 can do i386, any cpu can do generic */
928
+ #ifdef OPT_I386
929
+ *(d++) = decname[idrei];
930
+ #endif
931
+ #ifdef OPT_X86_64
932
+ *(d++) = decname[x86_64];
933
+ #endif
934
+ #ifdef OPT_ARM
935
+ *(d++) = decname[arm];
936
+ #endif
937
+ #ifdef OPT_NEON
938
+ *(d++) = decname[neon];
939
+ #endif
940
+ #ifdef OPT_GENERIC
941
+ *(d++) = decname[generic];
942
+ #endif
943
+ #ifdef OPT_GENERIC_DITHER
944
+ *(d++) = decname[generic_dither];
945
+ #endif
946
+ #endif /* ndef OPT_MULTI */
947
+ }
948
+
949
+ const char* attribute_align_arg mpg123_current_decoder(mpg123_handle *mh)
950
+ {
951
+ if(mh == NULL) return NULL;
952
+
953
+ return decname[mh->cpu_opts.type];
954
+ }
955
+
956
+ const char attribute_align_arg **mpg123_decoders(void){ return mpg123_decoder_list; }
957
+ const char attribute_align_arg **mpg123_supported_decoders(void)
958
+ {
959
+ #ifdef OPT_MULTI
960
+ return mpg123_supported_decoder_list;
961
+ #else
962
+ return mpg123_decoder_list;
963
+ #endif
964
+ }