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,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
+ }