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,71 @@
1
+ /********************************************************************
2
+ * *
3
+ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7
+ * *
8
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
9
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
10
+ * *
11
+ ********************************************************************
12
+
13
+ function: modified discrete cosine transform prototypes
14
+ last mod: $Id: mdct.h 16227 2009-07-08 06:58:46Z xiphmont $
15
+
16
+ ********************************************************************/
17
+
18
+ #ifndef _OGG_mdct_H_
19
+ #define _OGG_mdct_H_
20
+
21
+ #include "vorbis/codec.h"
22
+
23
+
24
+
25
+
26
+
27
+ /*#define MDCT_INTEGERIZED <- be warned there could be some hurt left here*/
28
+ #ifdef MDCT_INTEGERIZED
29
+
30
+ #define DATA_TYPE int
31
+ #define REG_TYPE register int
32
+ #define TRIGBITS 14
33
+ #define cPI3_8 6270
34
+ #define cPI2_8 11585
35
+ #define cPI1_8 15137
36
+
37
+ #define FLOAT_CONV(x) ((int)((x)*(1<<TRIGBITS)+.5))
38
+ #define MULT_NORM(x) ((x)>>TRIGBITS)
39
+ #define HALVE(x) ((x)>>1)
40
+
41
+ #else
42
+
43
+ #define DATA_TYPE float
44
+ #define REG_TYPE float
45
+ #define cPI3_8 .38268343236508977175F
46
+ #define cPI2_8 .70710678118654752441F
47
+ #define cPI1_8 .92387953251128675613F
48
+
49
+ #define FLOAT_CONV(x) (x)
50
+ #define MULT_NORM(x) (x)
51
+ #define HALVE(x) ((x)*.5f)
52
+
53
+ #endif
54
+
55
+
56
+ typedef struct {
57
+ int n;
58
+ int log2n;
59
+
60
+ DATA_TYPE *trig;
61
+ int *bitrev;
62
+
63
+ DATA_TYPE scale;
64
+ } mdct_lookup;
65
+
66
+ extern void mdct_init(mdct_lookup *lookup,int n);
67
+ extern void mdct_clear(mdct_lookup *l);
68
+ extern void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out);
69
+ extern void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out);
70
+
71
+ #endif
@@ -0,0 +1,57 @@
1
+ /********************************************************************
2
+ * *
3
+ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7
+ * *
8
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
9
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
10
+ * *
11
+ ********************************************************************
12
+
13
+ function: miscellaneous prototypes
14
+ last mod: $Id: misc.h 16227 2009-07-08 06:58:46Z xiphmont $
15
+
16
+ ********************************************************************/
17
+
18
+ #ifndef _V_RANDOM_H_
19
+ #define _V_RANDOM_H_
20
+ #include "vorbis/codec.h"
21
+
22
+ extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes);
23
+ extern void _vorbis_block_ripcord(vorbis_block *vb);
24
+
25
+ #ifdef ANALYSIS
26
+ extern int analysis_noisy;
27
+ extern void _analysis_output(char *base,int i,float *v,int n,int bark,int dB,
28
+ ogg_int64_t off);
29
+ extern void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,
30
+ ogg_int64_t off);
31
+ #endif
32
+
33
+ #ifdef DEBUG_MALLOC
34
+
35
+ #define _VDBG_GRAPHFILE "malloc.m"
36
+ #undef _VDBG_GRAPHFILE
37
+ extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line);
38
+ extern void _VDBG_free(void *ptr,char *file,long line);
39
+
40
+ #ifndef MISC_C
41
+ #undef _ogg_malloc
42
+ #undef _ogg_calloc
43
+ #undef _ogg_realloc
44
+ #undef _ogg_free
45
+
46
+ #define _ogg_malloc(x) _VDBG_malloc(NULL,(x),__FILE__,__LINE__)
47
+ #define _ogg_calloc(x,y) _VDBG_malloc(NULL,(x)*(y),__FILE__,__LINE__)
48
+ #define _ogg_realloc(x,y) _VDBG_malloc((x),(y),__FILE__,__LINE__)
49
+ #define _ogg_free(x) _VDBG_free((x),__FILE__,__LINE__)
50
+ #endif
51
+ #endif
52
+
53
+ #endif
54
+
55
+
56
+
57
+
@@ -0,0 +1,186 @@
1
+ #ifndef _OS_H
2
+ #define _OS_H
3
+ /********************************************************************
4
+ * *
5
+ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
6
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
7
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
8
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
9
+ * *
10
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
11
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
12
+ * *
13
+ ********************************************************************
14
+
15
+ function: #ifdef jail to whip a few platforms into the UNIX ideal.
16
+ last mod: $Id: os.h 16227 2009-07-08 06:58:46Z xiphmont $
17
+
18
+ ********************************************************************/
19
+
20
+ #ifdef HAVE_CONFIG_H
21
+ #include "config.h"
22
+ #endif
23
+
24
+ #include <math.h>
25
+ #include <ogg/os_types.h>
26
+
27
+ #include "misc.h"
28
+
29
+ #ifndef _V_IFDEFJAIL_H_
30
+ # define _V_IFDEFJAIL_H_
31
+
32
+ # ifdef __GNUC__
33
+ # define STIN static __inline__
34
+ # elif _WIN32
35
+ # define STIN static __inline
36
+ # else
37
+ # define STIN static
38
+ # endif
39
+
40
+ #ifdef DJGPP
41
+ # define rint(x) (floor((x)+0.5f))
42
+ #endif
43
+
44
+ #ifndef M_PI
45
+ # define M_PI (3.1415926536f)
46
+ #endif
47
+
48
+ #if defined(_WIN32) && !defined(__SYMBIAN32__)
49
+ # include <malloc.h>
50
+ # define rint(x) (floor((x)+0.5f))
51
+ # define NO_FLOAT_MATH_LIB
52
+ # define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b))
53
+ #endif
54
+
55
+ #if defined(__SYMBIAN32__) && defined(__WINS__)
56
+ void *_alloca(size_t size);
57
+ # define alloca _alloca
58
+ #endif
59
+
60
+ #ifndef FAST_HYPOT
61
+ # define FAST_HYPOT hypot
62
+ #endif
63
+
64
+ #endif
65
+
66
+ #ifdef HAVE_ALLOCA_H
67
+ # include <alloca.h>
68
+ #endif
69
+
70
+ #ifdef USE_MEMORY_H
71
+ # include <memory.h>
72
+ #endif
73
+
74
+ #ifndef min
75
+ # define min(x,y) ((x)>(y)?(y):(x))
76
+ #endif
77
+
78
+ #ifndef max
79
+ # define max(x,y) ((x)<(y)?(y):(x))
80
+ #endif
81
+
82
+
83
+ /* Special i386 GCC implementation */
84
+ #if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__)
85
+ # define VORBIS_FPU_CONTROL
86
+ /* both GCC and MSVC are kinda stupid about rounding/casting to int.
87
+ Because of encapsulation constraints (GCC can't see inside the asm
88
+ block and so we end up doing stupid things like a store/load that
89
+ is collectively a noop), we do it this way */
90
+
91
+ /* we must set up the fpu before this works!! */
92
+
93
+ typedef ogg_int16_t vorbis_fpu_control;
94
+
95
+ static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
96
+ ogg_int16_t ret;
97
+ ogg_int16_t temp;
98
+ __asm__ __volatile__("fnstcw %0\n\t"
99
+ "movw %0,%%dx\n\t"
100
+ "andw $62463,%%dx\n\t"
101
+ "movw %%dx,%1\n\t"
102
+ "fldcw %1\n\t":"=m"(ret):"m"(temp): "dx");
103
+ *fpu=ret;
104
+ }
105
+
106
+ static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
107
+ __asm__ __volatile__("fldcw %0":: "m"(fpu));
108
+ }
109
+
110
+ /* assumes the FPU is in round mode! */
111
+ static inline int vorbis_ftoi(double f){ /* yes, double! Otherwise,
112
+ we get extra fst/fld to
113
+ truncate precision */
114
+ int i;
115
+ __asm__("fistl %0": "=m"(i) : "t"(f));
116
+ return(i);
117
+ }
118
+ #endif /* Special i386 GCC implementation */
119
+
120
+
121
+ /* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the
122
+ * 64 bit compiler */
123
+ #if defined(_MSC_VER) && !defined(_WIN64) && !defined(_WIN32_WCE)
124
+ # define VORBIS_FPU_CONTROL
125
+
126
+ typedef ogg_int16_t vorbis_fpu_control;
127
+
128
+ static __inline int vorbis_ftoi(double f){
129
+ int i;
130
+ __asm{
131
+ fld f
132
+ fistp i
133
+ }
134
+ return i;
135
+ }
136
+
137
+ static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
138
+ }
139
+
140
+ static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
141
+ }
142
+
143
+ #endif /* Special MSVC 32 bit implementation */
144
+
145
+
146
+ /* Optimized code path for x86_64 builds. Uses SSE2 intrinsics. This can be
147
+ done safely because all x86_64 CPUs supports SSE2. */
148
+ #if (defined(_MSC_VER) && defined(_WIN64)) || (defined(__GNUC__) && defined (__x86_64__))
149
+ # define VORBIS_FPU_CONTROL
150
+
151
+ typedef ogg_int16_t vorbis_fpu_control;
152
+
153
+ #include <emmintrin.h>
154
+ static __inline int vorbis_ftoi(double f){
155
+ return _mm_cvtsd_si32(_mm_load_sd(&f));
156
+ }
157
+
158
+ static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
159
+ }
160
+
161
+ static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
162
+ }
163
+
164
+ #endif /* Special MSVC x64 implementation */
165
+
166
+
167
+ /* If no special implementation was found for the current compiler / platform,
168
+ use the default implementation here: */
169
+ #ifndef VORBIS_FPU_CONTROL
170
+
171
+ typedef int vorbis_fpu_control;
172
+
173
+ static int vorbis_ftoi(double f){
174
+ /* Note: MSVC and GCC (at least on some systems) round towards zero, thus,
175
+ the floor() call is required to ensure correct roudning of
176
+ negative numbers */
177
+ return (int)floor(f+.5);
178
+ }
179
+
180
+ /* We don't have special code for this compiler/arch, so do it the slow way */
181
+ # define vorbis_fpu_setround(vorbis_fpu_control) {}
182
+ # define vorbis_fpu_restore(vorbis_fpu_control) {}
183
+
184
+ #endif /* default implementation */
185
+
186
+ #endif /* _OS_H */
@@ -0,0 +1,1206 @@
1
+ /********************************************************************
2
+ * *
3
+ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7
+ * *
8
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
9
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
10
+ * *
11
+ ********************************************************************
12
+
13
+ function: psychoacoustics not including preecho
14
+ last mod: $Id: psy.c 18077 2011-09-02 02:49:00Z giles $
15
+
16
+ ********************************************************************/
17
+
18
+ #include <stdlib.h>
19
+ #include <math.h>
20
+ #include <string.h>
21
+ #include "vorbis/codec.h"
22
+ #include "codec_internal.h"
23
+
24
+ #include "masking.h"
25
+ #include "psy.h"
26
+ #include "os.h"
27
+ #include "lpc.h"
28
+ #include "smallft.h"
29
+ #include "scales.h"
30
+ #include "misc.h"
31
+
32
+ #define NEGINF -9999.f
33
+ static const double stereo_threshholds[]={0.0, .5, 1.0, 1.5, 2.5, 4.5, 8.5, 16.5, 9e10};
34
+ static const double stereo_threshholds_limited[]={0.0, .5, 1.0, 1.5, 2.0, 2.5, 4.5, 8.5, 9e10};
35
+
36
+ vorbis_look_psy_global *_vp_global_look(vorbis_info *vi){
37
+ codec_setup_info *ci=vi->codec_setup;
38
+ vorbis_info_psy_global *gi=&ci->psy_g_param;
39
+ vorbis_look_psy_global *look=_ogg_calloc(1,sizeof(*look));
40
+
41
+ look->channels=vi->channels;
42
+
43
+ look->ampmax=-9999.;
44
+ look->gi=gi;
45
+ return(look);
46
+ }
47
+
48
+ void _vp_global_free(vorbis_look_psy_global *look){
49
+ if(look){
50
+ memset(look,0,sizeof(*look));
51
+ _ogg_free(look);
52
+ }
53
+ }
54
+
55
+ void _vi_gpsy_free(vorbis_info_psy_global *i){
56
+ if(i){
57
+ memset(i,0,sizeof(*i));
58
+ _ogg_free(i);
59
+ }
60
+ }
61
+
62
+ void _vi_psy_free(vorbis_info_psy *i){
63
+ if(i){
64
+ memset(i,0,sizeof(*i));
65
+ _ogg_free(i);
66
+ }
67
+ }
68
+
69
+ static void min_curve(float *c,
70
+ float *c2){
71
+ int i;
72
+ for(i=0;i<EHMER_MAX;i++)if(c2[i]<c[i])c[i]=c2[i];
73
+ }
74
+ static void max_curve(float *c,
75
+ float *c2){
76
+ int i;
77
+ for(i=0;i<EHMER_MAX;i++)if(c2[i]>c[i])c[i]=c2[i];
78
+ }
79
+
80
+ static void attenuate_curve(float *c,float att){
81
+ int i;
82
+ for(i=0;i<EHMER_MAX;i++)
83
+ c[i]+=att;
84
+ }
85
+
86
+ static float ***setup_tone_curves(float curveatt_dB[P_BANDS],float binHz,int n,
87
+ float center_boost, float center_decay_rate){
88
+ int i,j,k,m;
89
+ float ath[EHMER_MAX];
90
+ float workc[P_BANDS][P_LEVELS][EHMER_MAX];
91
+ float athc[P_LEVELS][EHMER_MAX];
92
+ float *brute_buffer=alloca(n*sizeof(*brute_buffer));
93
+
94
+ float ***ret=_ogg_malloc(sizeof(*ret)*P_BANDS);
95
+
96
+ memset(workc,0,sizeof(workc));
97
+
98
+ for(i=0;i<P_BANDS;i++){
99
+ /* we add back in the ATH to avoid low level curves falling off to
100
+ -infinity and unnecessarily cutting off high level curves in the
101
+ curve limiting (last step). */
102
+
103
+ /* A half-band's settings must be valid over the whole band, and
104
+ it's better to mask too little than too much */
105
+ int ath_offset=i*4;
106
+ for(j=0;j<EHMER_MAX;j++){
107
+ float min=999.;
108
+ for(k=0;k<4;k++)
109
+ if(j+k+ath_offset<MAX_ATH){
110
+ if(min>ATH[j+k+ath_offset])min=ATH[j+k+ath_offset];
111
+ }else{
112
+ if(min>ATH[MAX_ATH-1])min=ATH[MAX_ATH-1];
113
+ }
114
+ ath[j]=min;
115
+ }
116
+
117
+ /* copy curves into working space, replicate the 50dB curve to 30
118
+ and 40, replicate the 100dB curve to 110 */
119
+ for(j=0;j<6;j++)
120
+ memcpy(workc[i][j+2],tonemasks[i][j],EHMER_MAX*sizeof(*tonemasks[i][j]));
121
+ memcpy(workc[i][0],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0]));
122
+ memcpy(workc[i][1],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0]));
123
+
124
+ /* apply centered curve boost/decay */
125
+ for(j=0;j<P_LEVELS;j++){
126
+ for(k=0;k<EHMER_MAX;k++){
127
+ float adj=center_boost+abs(EHMER_OFFSET-k)*center_decay_rate;
128
+ if(adj<0. && center_boost>0)adj=0.;
129
+ if(adj>0. && center_boost<0)adj=0.;
130
+ workc[i][j][k]+=adj;
131
+ }
132
+ }
133
+
134
+ /* normalize curves so the driving amplitude is 0dB */
135
+ /* make temp curves with the ATH overlayed */
136
+ for(j=0;j<P_LEVELS;j++){
137
+ attenuate_curve(workc[i][j],curveatt_dB[i]+100.-(j<2?2:j)*10.-P_LEVEL_0);
138
+ memcpy(athc[j],ath,EHMER_MAX*sizeof(**athc));
139
+ attenuate_curve(athc[j],+100.-j*10.f-P_LEVEL_0);
140
+ max_curve(athc[j],workc[i][j]);
141
+ }
142
+
143
+ /* Now limit the louder curves.
144
+
145
+ the idea is this: We don't know what the playback attenuation
146
+ will be; 0dB SL moves every time the user twiddles the volume
147
+ knob. So that means we have to use a single 'most pessimal' curve
148
+ for all masking amplitudes, right? Wrong. The *loudest* sound
149
+ can be in (we assume) a range of ...+100dB] SL. However, sounds
150
+ 20dB down will be in a range ...+80], 40dB down is from ...+60],
151
+ etc... */
152
+
153
+ for(j=1;j<P_LEVELS;j++){
154
+ min_curve(athc[j],athc[j-1]);
155
+ min_curve(workc[i][j],athc[j]);
156
+ }
157
+ }
158
+
159
+ for(i=0;i<P_BANDS;i++){
160
+ int hi_curve,lo_curve,bin;
161
+ ret[i]=_ogg_malloc(sizeof(**ret)*P_LEVELS);
162
+
163
+ /* low frequency curves are measured with greater resolution than
164
+ the MDCT/FFT will actually give us; we want the curve applied
165
+ to the tone data to be pessimistic and thus apply the minimum
166
+ masking possible for a given bin. That means that a single bin
167
+ could span more than one octave and that the curve will be a
168
+ composite of multiple octaves. It also may mean that a single
169
+ bin may span > an eighth of an octave and that the eighth
170
+ octave values may also be composited. */
171
+
172
+ /* which octave curves will we be compositing? */
173
+ bin=floor(fromOC(i*.5)/binHz);
174
+ lo_curve= ceil(toOC(bin*binHz+1)*2);
175
+ hi_curve= floor(toOC((bin+1)*binHz)*2);
176
+ if(lo_curve>i)lo_curve=i;
177
+ if(lo_curve<0)lo_curve=0;
178
+ if(hi_curve>=P_BANDS)hi_curve=P_BANDS-1;
179
+
180
+ for(m=0;m<P_LEVELS;m++){
181
+ ret[i][m]=_ogg_malloc(sizeof(***ret)*(EHMER_MAX+2));
182
+
183
+ for(j=0;j<n;j++)brute_buffer[j]=999.;
184
+
185
+ /* render the curve into bins, then pull values back into curve.
186
+ The point is that any inherent subsampling aliasing results in
187
+ a safe minimum */
188
+ for(k=lo_curve;k<=hi_curve;k++){
189
+ int l=0;
190
+
191
+ for(j=0;j<EHMER_MAX;j++){
192
+ int lo_bin= fromOC(j*.125+k*.5-2.0625)/binHz;
193
+ int hi_bin= fromOC(j*.125+k*.5-1.9375)/binHz+1;
194
+
195
+ if(lo_bin<0)lo_bin=0;
196
+ if(lo_bin>n)lo_bin=n;
197
+ if(lo_bin<l)l=lo_bin;
198
+ if(hi_bin<0)hi_bin=0;
199
+ if(hi_bin>n)hi_bin=n;
200
+
201
+ for(;l<hi_bin && l<n;l++)
202
+ if(brute_buffer[l]>workc[k][m][j])
203
+ brute_buffer[l]=workc[k][m][j];
204
+ }
205
+
206
+ for(;l<n;l++)
207
+ if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
208
+ brute_buffer[l]=workc[k][m][EHMER_MAX-1];
209
+
210
+ }
211
+
212
+ /* be equally paranoid about being valid up to next half ocatve */
213
+ if(i+1<P_BANDS){
214
+ int l=0;
215
+ k=i+1;
216
+ for(j=0;j<EHMER_MAX;j++){
217
+ int lo_bin= fromOC(j*.125+i*.5-2.0625)/binHz;
218
+ int hi_bin= fromOC(j*.125+i*.5-1.9375)/binHz+1;
219
+
220
+ if(lo_bin<0)lo_bin=0;
221
+ if(lo_bin>n)lo_bin=n;
222
+ if(lo_bin<l)l=lo_bin;
223
+ if(hi_bin<0)hi_bin=0;
224
+ if(hi_bin>n)hi_bin=n;
225
+
226
+ for(;l<hi_bin && l<n;l++)
227
+ if(brute_buffer[l]>workc[k][m][j])
228
+ brute_buffer[l]=workc[k][m][j];
229
+ }
230
+
231
+ for(;l<n;l++)
232
+ if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
233
+ brute_buffer[l]=workc[k][m][EHMER_MAX-1];
234
+
235
+ }
236
+
237
+
238
+ for(j=0;j<EHMER_MAX;j++){
239
+ int bin=fromOC(j*.125+i*.5-2.)/binHz;
240
+ if(bin<0){
241
+ ret[i][m][j+2]=-999.;
242
+ }else{
243
+ if(bin>=n){
244
+ ret[i][m][j+2]=-999.;
245
+ }else{
246
+ ret[i][m][j+2]=brute_buffer[bin];
247
+ }
248
+ }
249
+ }
250
+
251
+ /* add fenceposts */
252
+ for(j=0;j<EHMER_OFFSET;j++)
253
+ if(ret[i][m][j+2]>-200.f)break;
254
+ ret[i][m][0]=j;
255
+
256
+ for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--)
257
+ if(ret[i][m][j+2]>-200.f)
258
+ break;
259
+ ret[i][m][1]=j;
260
+
261
+ }
262
+ }
263
+
264
+ return(ret);
265
+ }
266
+
267
+ void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,
268
+ vorbis_info_psy_global *gi,int n,long rate){
269
+ long i,j,lo=-99,hi=1;
270
+ long maxoc;
271
+ memset(p,0,sizeof(*p));
272
+
273
+ p->eighth_octave_lines=gi->eighth_octave_lines;
274
+ p->shiftoc=rint(log(gi->eighth_octave_lines*8.f)/log(2.f))-1;
275
+
276
+ p->firstoc=toOC(.25f*rate*.5/n)*(1<<(p->shiftoc+1))-gi->eighth_octave_lines;
277
+ maxoc=toOC((n+.25f)*rate*.5/n)*(1<<(p->shiftoc+1))+.5f;
278
+ p->total_octave_lines=maxoc-p->firstoc+1;
279
+ p->ath=_ogg_malloc(n*sizeof(*p->ath));
280
+
281
+ p->octave=_ogg_malloc(n*sizeof(*p->octave));
282
+ p->bark=_ogg_malloc(n*sizeof(*p->bark));
283
+ p->vi=vi;
284
+ p->n=n;
285
+ p->rate=rate;
286
+
287
+ /* AoTuV HF weighting */
288
+ p->m_val = 1.;
289
+ if(rate < 26000) p->m_val = 0;
290
+ else if(rate < 38000) p->m_val = .94; /* 32kHz */
291
+ else if(rate > 46000) p->m_val = 1.275; /* 48kHz */
292
+
293
+ /* set up the lookups for a given blocksize and sample rate */
294
+
295
+ for(i=0,j=0;i<MAX_ATH-1;i++){
296
+ int endpos=rint(fromOC((i+1)*.125-2.)*2*n/rate);
297
+ float base=ATH[i];
298
+ if(j<endpos){
299
+ float delta=(ATH[i+1]-base)/(endpos-j);
300
+ for(;j<endpos && j<n;j++){
301
+ p->ath[j]=base+100.;
302
+ base+=delta;
303
+ }
304
+ }
305
+ }
306
+
307
+ for(;j<n;j++){
308
+ p->ath[j]=p->ath[j-1];
309
+ }
310
+
311
+ for(i=0;i<n;i++){
312
+ float bark=toBARK(rate/(2*n)*i);
313
+
314
+ for(;lo+vi->noisewindowlomin<i &&
315
+ toBARK(rate/(2*n)*lo)<(bark-vi->noisewindowlo);lo++);
316
+
317
+ for(;hi<=n && (hi<i+vi->noisewindowhimin ||
318
+ toBARK(rate/(2*n)*hi)<(bark+vi->noisewindowhi));hi++);
319
+
320
+ p->bark[i]=((lo-1)<<16)+(hi-1);
321
+
322
+ }
323
+
324
+ for(i=0;i<n;i++)
325
+ p->octave[i]=toOC((i+.25f)*.5*rate/n)*(1<<(p->shiftoc+1))+.5f;
326
+
327
+ p->tonecurves=setup_tone_curves(vi->toneatt,rate*.5/n,n,
328
+ vi->tone_centerboost,vi->tone_decay);
329
+
330
+ /* set up rolling noise median */
331
+ p->noiseoffset=_ogg_malloc(P_NOISECURVES*sizeof(*p->noiseoffset));
332
+ for(i=0;i<P_NOISECURVES;i++)
333
+ p->noiseoffset[i]=_ogg_malloc(n*sizeof(**p->noiseoffset));
334
+
335
+ for(i=0;i<n;i++){
336
+ float halfoc=toOC((i+.5)*rate/(2.*n))*2.;
337
+ int inthalfoc;
338
+ float del;
339
+
340
+ if(halfoc<0)halfoc=0;
341
+ if(halfoc>=P_BANDS-1)halfoc=P_BANDS-1;
342
+ inthalfoc=(int)halfoc;
343
+ del=halfoc-inthalfoc;
344
+
345
+ for(j=0;j<P_NOISECURVES;j++)
346
+ p->noiseoffset[j][i]=
347
+ p->vi->noiseoff[j][inthalfoc]*(1.-del) +
348
+ p->vi->noiseoff[j][inthalfoc+1]*del;
349
+
350
+ }
351
+ #if 0
352
+ {
353
+ static int ls=0;
354
+ _analysis_output_always("noiseoff0",ls,p->noiseoffset[0],n,1,0,0);
355
+ _analysis_output_always("noiseoff1",ls,p->noiseoffset[1],n,1,0,0);
356
+ _analysis_output_always("noiseoff2",ls++,p->noiseoffset[2],n,1,0,0);
357
+ }
358
+ #endif
359
+ }
360
+
361
+ void _vp_psy_clear(vorbis_look_psy *p){
362
+ int i,j;
363
+ if(p){
364
+ if(p->ath)_ogg_free(p->ath);
365
+ if(p->octave)_ogg_free(p->octave);
366
+ if(p->bark)_ogg_free(p->bark);
367
+ if(p->tonecurves){
368
+ for(i=0;i<P_BANDS;i++){
369
+ for(j=0;j<P_LEVELS;j++){
370
+ _ogg_free(p->tonecurves[i][j]);
371
+ }
372
+ _ogg_free(p->tonecurves[i]);
373
+ }
374
+ _ogg_free(p->tonecurves);
375
+ }
376
+ if(p->noiseoffset){
377
+ for(i=0;i<P_NOISECURVES;i++){
378
+ _ogg_free(p->noiseoffset[i]);
379
+ }
380
+ _ogg_free(p->noiseoffset);
381
+ }
382
+ memset(p,0,sizeof(*p));
383
+ }
384
+ }
385
+
386
+ /* octave/(8*eighth_octave_lines) x scale and dB y scale */
387
+ static void seed_curve(float *seed,
388
+ const float **curves,
389
+ float amp,
390
+ int oc, int n,
391
+ int linesper,float dBoffset){
392
+ int i,post1;
393
+ int seedptr;
394
+ const float *posts,*curve;
395
+
396
+ int choice=(int)((amp+dBoffset-P_LEVEL_0)*.1f);
397
+ choice=max(choice,0);
398
+ choice=min(choice,P_LEVELS-1);
399
+ posts=curves[choice];
400
+ curve=posts+2;
401
+ post1=(int)posts[1];
402
+ seedptr=oc+(posts[0]-EHMER_OFFSET)*linesper-(linesper>>1);
403
+
404
+ for(i=posts[0];i<post1;i++){
405
+ if(seedptr>0){
406
+ float lin=amp+curve[i];
407
+ if(seed[seedptr]<lin)seed[seedptr]=lin;
408
+ }
409
+ seedptr+=linesper;
410
+ if(seedptr>=n)break;
411
+ }
412
+ }
413
+
414
+ static void seed_loop(vorbis_look_psy *p,
415
+ const float ***curves,
416
+ const float *f,
417
+ const float *flr,
418
+ float *seed,
419
+ float specmax){
420
+ vorbis_info_psy *vi=p->vi;
421
+ long n=p->n,i;
422
+ float dBoffset=vi->max_curve_dB-specmax;
423
+
424
+ /* prime the working vector with peak values */
425
+
426
+ for(i=0;i<n;i++){
427
+ float max=f[i];
428
+ long oc=p->octave[i];
429
+ while(i+1<n && p->octave[i+1]==oc){
430
+ i++;
431
+ if(f[i]>max)max=f[i];
432
+ }
433
+
434
+ if(max+6.f>flr[i]){
435
+ oc=oc>>p->shiftoc;
436
+
437
+ if(oc>=P_BANDS)oc=P_BANDS-1;
438
+ if(oc<0)oc=0;
439
+
440
+ seed_curve(seed,
441
+ curves[oc],
442
+ max,
443
+ p->octave[i]-p->firstoc,
444
+ p->total_octave_lines,
445
+ p->eighth_octave_lines,
446
+ dBoffset);
447
+ }
448
+ }
449
+ }
450
+
451
+ static void seed_chase(float *seeds, int linesper, long n){
452
+ long *posstack=alloca(n*sizeof(*posstack));
453
+ float *ampstack=alloca(n*sizeof(*ampstack));
454
+ long stack=0;
455
+ long pos=0;
456
+ long i;
457
+
458
+ for(i=0;i<n;i++){
459
+ if(stack<2){
460
+ posstack[stack]=i;
461
+ ampstack[stack++]=seeds[i];
462
+ }else{
463
+ while(1){
464
+ if(seeds[i]<ampstack[stack-1]){
465
+ posstack[stack]=i;
466
+ ampstack[stack++]=seeds[i];
467
+ break;
468
+ }else{
469
+ if(i<posstack[stack-1]+linesper){
470
+ if(stack>1 && ampstack[stack-1]<=ampstack[stack-2] &&
471
+ i<posstack[stack-2]+linesper){
472
+ /* we completely overlap, making stack-1 irrelevant. pop it */
473
+ stack--;
474
+ continue;
475
+ }
476
+ }
477
+ posstack[stack]=i;
478
+ ampstack[stack++]=seeds[i];
479
+ break;
480
+
481
+ }
482
+ }
483
+ }
484
+ }
485
+
486
+ /* the stack now contains only the positions that are relevant. Scan
487
+ 'em straight through */
488
+
489
+ for(i=0;i<stack;i++){
490
+ long endpos;
491
+ if(i<stack-1 && ampstack[i+1]>ampstack[i]){
492
+ endpos=posstack[i+1];
493
+ }else{
494
+ endpos=posstack[i]+linesper+1; /* +1 is important, else bin 0 is
495
+ discarded in short frames */
496
+ }
497
+ if(endpos>n)endpos=n;
498
+ for(;pos<endpos;pos++)
499
+ seeds[pos]=ampstack[i];
500
+ }
501
+
502
+ /* there. Linear time. I now remember this was on a problem set I
503
+ had in Grad Skool... I didn't solve it at the time ;-) */
504
+
505
+ }
506
+
507
+ /* bleaugh, this is more complicated than it needs to be */
508
+ #include<stdio.h>
509
+ static void max_seeds(vorbis_look_psy *p,
510
+ float *seed,
511
+ float *flr){
512
+ long n=p->total_octave_lines;
513
+ int linesper=p->eighth_octave_lines;
514
+ long linpos=0;
515
+ long pos;
516
+
517
+ seed_chase(seed,linesper,n); /* for masking */
518
+
519
+ pos=p->octave[0]-p->firstoc-(linesper>>1);
520
+
521
+ while(linpos+1<p->n){
522
+ float minV=seed[pos];
523
+ long end=((p->octave[linpos]+p->octave[linpos+1])>>1)-p->firstoc;
524
+ if(minV>p->vi->tone_abs_limit)minV=p->vi->tone_abs_limit;
525
+ while(pos+1<=end){
526
+ pos++;
527
+ if((seed[pos]>NEGINF && seed[pos]<minV) || minV==NEGINF)
528
+ minV=seed[pos];
529
+ }
530
+
531
+ end=pos+p->firstoc;
532
+ for(;linpos<p->n && p->octave[linpos]<=end;linpos++)
533
+ if(flr[linpos]<minV)flr[linpos]=minV;
534
+ }
535
+
536
+ {
537
+ float minV=seed[p->total_octave_lines-1];
538
+ for(;linpos<p->n;linpos++)
539
+ if(flr[linpos]<minV)flr[linpos]=minV;
540
+ }
541
+
542
+ }
543
+
544
+ static void bark_noise_hybridmp(int n,const long *b,
545
+ const float *f,
546
+ float *noise,
547
+ const float offset,
548
+ const int fixed){
549
+
550
+ float *N=alloca(n*sizeof(*N));
551
+ float *X=alloca(n*sizeof(*N));
552
+ float *XX=alloca(n*sizeof(*N));
553
+ float *Y=alloca(n*sizeof(*N));
554
+ float *XY=alloca(n*sizeof(*N));
555
+
556
+ float tN, tX, tXX, tY, tXY;
557
+ int i;
558
+
559
+ int lo, hi;
560
+ float R=0.f;
561
+ float A=0.f;
562
+ float B=0.f;
563
+ float D=1.f;
564
+ float w, x, y;
565
+
566
+ tN = tX = tXX = tY = tXY = 0.f;
567
+
568
+ y = f[0] + offset;
569
+ if (y < 1.f) y = 1.f;
570
+
571
+ w = y * y * .5;
572
+
573
+ tN += w;
574
+ tX += w;
575
+ tY += w * y;
576
+
577
+ N[0] = tN;
578
+ X[0] = tX;
579
+ XX[0] = tXX;
580
+ Y[0] = tY;
581
+ XY[0] = tXY;
582
+
583
+ for (i = 1, x = 1.f; i < n; i++, x += 1.f) {
584
+
585
+ y = f[i] + offset;
586
+ if (y < 1.f) y = 1.f;
587
+
588
+ w = y * y;
589
+
590
+ tN += w;
591
+ tX += w * x;
592
+ tXX += w * x * x;
593
+ tY += w * y;
594
+ tXY += w * x * y;
595
+
596
+ N[i] = tN;
597
+ X[i] = tX;
598
+ XX[i] = tXX;
599
+ Y[i] = tY;
600
+ XY[i] = tXY;
601
+ }
602
+
603
+ for (i = 0, x = 0.f;; i++, x += 1.f) {
604
+
605
+ lo = b[i] >> 16;
606
+ if( lo>=0 ) break;
607
+ hi = b[i] & 0xffff;
608
+
609
+ tN = N[hi] + N[-lo];
610
+ tX = X[hi] - X[-lo];
611
+ tXX = XX[hi] + XX[-lo];
612
+ tY = Y[hi] + Y[-lo];
613
+ tXY = XY[hi] - XY[-lo];
614
+
615
+ A = tY * tXX - tX * tXY;
616
+ B = tN * tXY - tX * tY;
617
+ D = tN * tXX - tX * tX;
618
+ R = (A + x * B) / D;
619
+ if (R < 0.f)
620
+ R = 0.f;
621
+
622
+ noise[i] = R - offset;
623
+ }
624
+
625
+ for ( ;; i++, x += 1.f) {
626
+
627
+ lo = b[i] >> 16;
628
+ hi = b[i] & 0xffff;
629
+ if(hi>=n)break;
630
+
631
+ tN = N[hi] - N[lo];
632
+ tX = X[hi] - X[lo];
633
+ tXX = XX[hi] - XX[lo];
634
+ tY = Y[hi] - Y[lo];
635
+ tXY = XY[hi] - XY[lo];
636
+
637
+ A = tY * tXX - tX * tXY;
638
+ B = tN * tXY - tX * tY;
639
+ D = tN * tXX - tX * tX;
640
+ R = (A + x * B) / D;
641
+ if (R < 0.f) R = 0.f;
642
+
643
+ noise[i] = R - offset;
644
+ }
645
+ for ( ; i < n; i++, x += 1.f) {
646
+
647
+ R = (A + x * B) / D;
648
+ if (R < 0.f) R = 0.f;
649
+
650
+ noise[i] = R - offset;
651
+ }
652
+
653
+ if (fixed <= 0) return;
654
+
655
+ for (i = 0, x = 0.f;; i++, x += 1.f) {
656
+ hi = i + fixed / 2;
657
+ lo = hi - fixed;
658
+ if(lo>=0)break;
659
+
660
+ tN = N[hi] + N[-lo];
661
+ tX = X[hi] - X[-lo];
662
+ tXX = XX[hi] + XX[-lo];
663
+ tY = Y[hi] + Y[-lo];
664
+ tXY = XY[hi] - XY[-lo];
665
+
666
+
667
+ A = tY * tXX - tX * tXY;
668
+ B = tN * tXY - tX * tY;
669
+ D = tN * tXX - tX * tX;
670
+ R = (A + x * B) / D;
671
+
672
+ if (R - offset < noise[i]) noise[i] = R - offset;
673
+ }
674
+ for ( ;; i++, x += 1.f) {
675
+
676
+ hi = i + fixed / 2;
677
+ lo = hi - fixed;
678
+ if(hi>=n)break;
679
+
680
+ tN = N[hi] - N[lo];
681
+ tX = X[hi] - X[lo];
682
+ tXX = XX[hi] - XX[lo];
683
+ tY = Y[hi] - Y[lo];
684
+ tXY = XY[hi] - XY[lo];
685
+
686
+ A = tY * tXX - tX * tXY;
687
+ B = tN * tXY - tX * tY;
688
+ D = tN * tXX - tX * tX;
689
+ R = (A + x * B) / D;
690
+
691
+ if (R - offset < noise[i]) noise[i] = R - offset;
692
+ }
693
+ for ( ; i < n; i++, x += 1.f) {
694
+ R = (A + x * B) / D;
695
+ if (R - offset < noise[i]) noise[i] = R - offset;
696
+ }
697
+ }
698
+
699
+ void _vp_noisemask(vorbis_look_psy *p,
700
+ float *logmdct,
701
+ float *logmask){
702
+
703
+ int i,n=p->n;
704
+ float *work=alloca(n*sizeof(*work));
705
+
706
+ bark_noise_hybridmp(n,p->bark,logmdct,logmask,
707
+ 140.,-1);
708
+
709
+ for(i=0;i<n;i++)work[i]=logmdct[i]-logmask[i];
710
+
711
+ bark_noise_hybridmp(n,p->bark,work,logmask,0.,
712
+ p->vi->noisewindowfixed);
713
+
714
+ for(i=0;i<n;i++)work[i]=logmdct[i]-work[i];
715
+
716
+ #if 0
717
+ {
718
+ static int seq=0;
719
+
720
+ float work2[n];
721
+ for(i=0;i<n;i++){
722
+ work2[i]=logmask[i]+work[i];
723
+ }
724
+
725
+ if(seq&1)
726
+ _analysis_output("median2R",seq/2,work,n,1,0,0);
727
+ else
728
+ _analysis_output("median2L",seq/2,work,n,1,0,0);
729
+
730
+ if(seq&1)
731
+ _analysis_output("envelope2R",seq/2,work2,n,1,0,0);
732
+ else
733
+ _analysis_output("envelope2L",seq/2,work2,n,1,0,0);
734
+ seq++;
735
+ }
736
+ #endif
737
+
738
+ for(i=0;i<n;i++){
739
+ int dB=logmask[i]+.5;
740
+ if(dB>=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1;
741
+ if(dB<0)dB=0;
742
+ logmask[i]= work[i]+p->vi->noisecompand[dB];
743
+ }
744
+
745
+ }
746
+
747
+ void _vp_tonemask(vorbis_look_psy *p,
748
+ float *logfft,
749
+ float *logmask,
750
+ float global_specmax,
751
+ float local_specmax){
752
+
753
+ int i,n=p->n;
754
+
755
+ float *seed=alloca(sizeof(*seed)*p->total_octave_lines);
756
+ float att=local_specmax+p->vi->ath_adjatt;
757
+ for(i=0;i<p->total_octave_lines;i++)seed[i]=NEGINF;
758
+
759
+ /* set the ATH (floating below localmax, not global max by a
760
+ specified att) */
761
+ if(att<p->vi->ath_maxatt)att=p->vi->ath_maxatt;
762
+
763
+ for(i=0;i<n;i++)
764
+ logmask[i]=p->ath[i]+att;
765
+
766
+ /* tone masking */
767
+ seed_loop(p,(const float ***)p->tonecurves,logfft,logmask,seed,global_specmax);
768
+ max_seeds(p,seed,logmask);
769
+
770
+ }
771
+
772
+ void _vp_offset_and_mix(vorbis_look_psy *p,
773
+ float *noise,
774
+ float *tone,
775
+ int offset_select,
776
+ float *logmask,
777
+ float *mdct,
778
+ float *logmdct){
779
+ int i,n=p->n;
780
+ float de, coeffi, cx;/* AoTuV */
781
+ float toneatt=p->vi->tone_masteratt[offset_select];
782
+
783
+ cx = p->m_val;
784
+
785
+ for(i=0;i<n;i++){
786
+ float val= noise[i]+p->noiseoffset[offset_select][i];
787
+ if(val>p->vi->noisemaxsupp)val=p->vi->noisemaxsupp;
788
+ logmask[i]=max(val,tone[i]+toneatt);
789
+
790
+
791
+ /* AoTuV */
792
+ /** @ M1 **
793
+ The following codes improve a noise problem.
794
+ A fundamental idea uses the value of masking and carries out
795
+ the relative compensation of the MDCT.
796
+ However, this code is not perfect and all noise problems cannot be solved.
797
+ by Aoyumi @ 2004/04/18
798
+ */
799
+
800
+ if(offset_select == 1) {
801
+ coeffi = -17.2; /* coeffi is a -17.2dB threshold */
802
+ val = val - logmdct[i]; /* val == mdct line value relative to floor in dB */
803
+
804
+ if(val > coeffi){
805
+ /* mdct value is > -17.2 dB below floor */
806
+
807
+ de = 1.0-((val-coeffi)*0.005*cx);
808
+ /* pro-rated attenuation:
809
+ -0.00 dB boost if mdct value is -17.2dB (relative to floor)
810
+ -0.77 dB boost if mdct value is 0dB (relative to floor)
811
+ -1.64 dB boost if mdct value is +17.2dB (relative to floor)
812
+ etc... */
813
+
814
+ if(de < 0) de = 0.0001;
815
+ }else
816
+ /* mdct value is <= -17.2 dB below floor */
817
+
818
+ de = 1.0-((val-coeffi)*0.0003*cx);
819
+ /* pro-rated attenuation:
820
+ +0.00 dB atten if mdct value is -17.2dB (relative to floor)
821
+ +0.45 dB atten if mdct value is -34.4dB (relative to floor)
822
+ etc... */
823
+
824
+ mdct[i] *= de;
825
+
826
+ }
827
+ }
828
+ }
829
+
830
+ float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){
831
+ vorbis_info *vi=vd->vi;
832
+ codec_setup_info *ci=vi->codec_setup;
833
+ vorbis_info_psy_global *gi=&ci->psy_g_param;
834
+
835
+ int n=ci->blocksizes[vd->W]/2;
836
+ float secs=(float)n/vi->rate;
837
+
838
+ amp+=secs*gi->ampmax_att_per_sec;
839
+ if(amp<-9999)amp=-9999;
840
+ return(amp);
841
+ }
842
+
843
+ static float FLOOR1_fromdB_LOOKUP[256]={
844
+ 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F,
845
+ 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F,
846
+ 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F,
847
+ 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F,
848
+ 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F,
849
+ 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F,
850
+ 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F,
851
+ 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F,
852
+ 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F,
853
+ 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F,
854
+ 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F,
855
+ 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F,
856
+ 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F,
857
+ 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F,
858
+ 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F,
859
+ 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F,
860
+ 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F,
861
+ 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F,
862
+ 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F,
863
+ 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F,
864
+ 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F,
865
+ 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F,
866
+ 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F,
867
+ 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F,
868
+ 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F,
869
+ 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F,
870
+ 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F,
871
+ 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
872
+ 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
873
+ 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
874
+ 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
875
+ 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
876
+ 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
877
+ 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
878
+ 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
879
+ 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
880
+ 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
881
+ 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
882
+ 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
883
+ 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
884
+ 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
885
+ 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
886
+ 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
887
+ 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
888
+ 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
889
+ 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
890
+ 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
891
+ 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
892
+ 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
893
+ 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
894
+ 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
895
+ 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
896
+ 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
897
+ 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
898
+ 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
899
+ 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
900
+ 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
901
+ 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
902
+ 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
903
+ 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
904
+ 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
905
+ 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
906
+ 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
907
+ 0.82788260F, 0.88168307F, 0.9389798F, 1.F,
908
+ };
909
+
910
+ /* this is for per-channel noise normalization */
911
+ static int apsort(const void *a, const void *b){
912
+ float f1=**(float**)a;
913
+ float f2=**(float**)b;
914
+ return (f1<f2)-(f1>f2);
915
+ }
916
+
917
+ static void flag_lossless(int limit, float prepoint, float postpoint, float *mdct,
918
+ float *floor, int *flag, int i, int jn){
919
+ int j;
920
+ for(j=0;j<jn;j++){
921
+ float point = j>=limit-i ? postpoint : prepoint;
922
+ float r = fabs(mdct[j])/floor[j];
923
+ if(r<point)
924
+ flag[j]=0;
925
+ else
926
+ flag[j]=1;
927
+ }
928
+ }
929
+
930
+ /* Overload/Side effect: On input, the *q vector holds either the
931
+ quantized energy (for elements with the flag set) or the absolute
932
+ values of the *r vector (for elements with flag unset). On output,
933
+ *q holds the quantized energy for all elements */
934
+ static float noise_normalize(vorbis_look_psy *p, int limit, float *r, float *q, float *f, int *flags, float acc, int i, int n, int *out){
935
+
936
+ vorbis_info_psy *vi=p->vi;
937
+ float **sort = alloca(n*sizeof(*sort));
938
+ int j,count=0;
939
+ int start = (vi->normal_p ? vi->normal_start-i : n);
940
+ if(start>n)start=n;
941
+
942
+ /* force classic behavior where only energy in the current band is considered */
943
+ acc=0.f;
944
+
945
+ /* still responsible for populating *out where noise norm not in
946
+ effect. There's no need to [re]populate *q in these areas */
947
+ for(j=0;j<start;j++){
948
+ if(!flags || !flags[j]){ /* lossless coupling already quantized.
949
+ Don't touch; requantizing based on
950
+ energy would be incorrect. */
951
+ float ve = q[j]/f[j];
952
+ if(r[j]<0)
953
+ out[j] = -rint(sqrt(ve));
954
+ else
955
+ out[j] = rint(sqrt(ve));
956
+ }
957
+ }
958
+
959
+ /* sort magnitudes for noise norm portion of partition */
960
+ for(;j<n;j++){
961
+ if(!flags || !flags[j]){ /* can't noise norm elements that have
962
+ already been loslessly coupled; we can
963
+ only account for their energy error */
964
+ float ve = q[j]/f[j];
965
+ /* Despite all the new, more capable coupling code, for now we
966
+ implement noise norm as it has been up to this point. Only
967
+ consider promotions to unit magnitude from 0. In addition
968
+ the only energy error counted is quantizations to zero. */
969
+ /* also-- the original point code only applied noise norm at > pointlimit */
970
+ if(ve<.25f && (!flags || j>=limit-i)){
971
+ acc += ve;
972
+ sort[count++]=q+j; /* q is fabs(r) for unflagged element */
973
+ }else{
974
+ /* For now: no acc adjustment for nonzero quantization. populate *out and q as this value is final. */
975
+ if(r[j]<0)
976
+ out[j] = -rint(sqrt(ve));
977
+ else
978
+ out[j] = rint(sqrt(ve));
979
+ q[j] = out[j]*out[j]*f[j];
980
+ }
981
+ }/* else{
982
+ again, no energy adjustment for error in nonzero quant-- for now
983
+ }*/
984
+ }
985
+
986
+ if(count){
987
+ /* noise norm to do */
988
+ qsort(sort,count,sizeof(*sort),apsort);
989
+ for(j=0;j<count;j++){
990
+ int k=sort[j]-q;
991
+ if(acc>=vi->normal_thresh){
992
+ out[k]=unitnorm(r[k]);
993
+ acc-=1.f;
994
+ q[k]=f[k];
995
+ }else{
996
+ out[k]=0;
997
+ q[k]=0.f;
998
+ }
999
+ }
1000
+ }
1001
+
1002
+ return acc;
1003
+ }
1004
+
1005
+ /* Noise normalization, quantization and coupling are not wholly
1006
+ seperable processes in depth>1 coupling. */
1007
+ void _vp_couple_quantize_normalize(int blobno,
1008
+ vorbis_info_psy_global *g,
1009
+ vorbis_look_psy *p,
1010
+ vorbis_info_mapping0 *vi,
1011
+ float **mdct,
1012
+ int **iwork,
1013
+ int *nonzero,
1014
+ int sliding_lowpass,
1015
+ int ch){
1016
+
1017
+ int i;
1018
+ int n = p->n;
1019
+ int partition=(p->vi->normal_p ? p->vi->normal_partition : 16);
1020
+ int limit = g->coupling_pointlimit[p->vi->blockflag][blobno];
1021
+ float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]];
1022
+ float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]];
1023
+ #if 0
1024
+ float de=0.1*p->m_val; /* a blend of the AoTuV M2 and M3 code here and below */
1025
+ #endif
1026
+
1027
+ /* mdct is our raw mdct output, floor not removed. */
1028
+ /* inout passes in the ifloor, passes back quantized result */
1029
+
1030
+ /* unquantized energy (negative indicates amplitude has negative sign) */
1031
+ float **raw = alloca(ch*sizeof(*raw));
1032
+
1033
+ /* dual pupose; quantized energy (if flag set), othersize fabs(raw) */
1034
+ float **quant = alloca(ch*sizeof(*quant));
1035
+
1036
+ /* floor energy */
1037
+ float **floor = alloca(ch*sizeof(*floor));
1038
+
1039
+ /* flags indicating raw/quantized status of elements in raw vector */
1040
+ int **flag = alloca(ch*sizeof(*flag));
1041
+
1042
+ /* non-zero flag working vector */
1043
+ int *nz = alloca(ch*sizeof(*nz));
1044
+
1045
+ /* energy surplus/defecit tracking */
1046
+ float *acc = alloca((ch+vi->coupling_steps)*sizeof(*acc));
1047
+
1048
+ /* The threshold of a stereo is changed with the size of n */
1049
+ if(n > 1000)
1050
+ postpoint=stereo_threshholds_limited[g->coupling_postpointamp[blobno]];
1051
+
1052
+ raw[0] = alloca(ch*partition*sizeof(**raw));
1053
+ quant[0] = alloca(ch*partition*sizeof(**quant));
1054
+ floor[0] = alloca(ch*partition*sizeof(**floor));
1055
+ flag[0] = alloca(ch*partition*sizeof(**flag));
1056
+
1057
+ for(i=1;i<ch;i++){
1058
+ raw[i] = &raw[0][partition*i];
1059
+ quant[i] = &quant[0][partition*i];
1060
+ floor[i] = &floor[0][partition*i];
1061
+ flag[i] = &flag[0][partition*i];
1062
+ }
1063
+ for(i=0;i<ch+vi->coupling_steps;i++)
1064
+ acc[i]=0.f;
1065
+
1066
+ for(i=0;i<n;i+=partition){
1067
+ int k,j,jn = partition > n-i ? n-i : partition;
1068
+ int step,track = 0;
1069
+
1070
+ memcpy(nz,nonzero,sizeof(*nz)*ch);
1071
+
1072
+ /* prefill */
1073
+ memset(flag[0],0,ch*partition*sizeof(**flag));
1074
+ for(k=0;k<ch;k++){
1075
+ int *iout = &iwork[k][i];
1076
+ if(nz[k]){
1077
+
1078
+ for(j=0;j<jn;j++)
1079
+ floor[k][j] = FLOOR1_fromdB_LOOKUP[iout[j]];
1080
+
1081
+ flag_lossless(limit,prepoint,postpoint,&mdct[k][i],floor[k],flag[k],i,jn);
1082
+
1083
+ for(j=0;j<jn;j++){
1084
+ quant[k][j] = raw[k][j] = mdct[k][i+j]*mdct[k][i+j];
1085
+ if(mdct[k][i+j]<0.f) raw[k][j]*=-1.f;
1086
+ floor[k][j]*=floor[k][j];
1087
+ }
1088
+
1089
+ acc[track]=noise_normalize(p,limit,raw[k],quant[k],floor[k],NULL,acc[track],i,jn,iout);
1090
+
1091
+ }else{
1092
+ for(j=0;j<jn;j++){
1093
+ floor[k][j] = 1e-10f;
1094
+ raw[k][j] = 0.f;
1095
+ quant[k][j] = 0.f;
1096
+ flag[k][j] = 0;
1097
+ iout[j]=0;
1098
+ }
1099
+ acc[track]=0.f;
1100
+ }
1101
+ track++;
1102
+ }
1103
+
1104
+ /* coupling */
1105
+ for(step=0;step<vi->coupling_steps;step++){
1106
+ int Mi = vi->coupling_mag[step];
1107
+ int Ai = vi->coupling_ang[step];
1108
+ int *iM = &iwork[Mi][i];
1109
+ int *iA = &iwork[Ai][i];
1110
+ float *reM = raw[Mi];
1111
+ float *reA = raw[Ai];
1112
+ float *qeM = quant[Mi];
1113
+ float *qeA = quant[Ai];
1114
+ float *floorM = floor[Mi];
1115
+ float *floorA = floor[Ai];
1116
+ int *fM = flag[Mi];
1117
+ int *fA = flag[Ai];
1118
+
1119
+ if(nz[Mi] || nz[Ai]){
1120
+ nz[Mi] = nz[Ai] = 1;
1121
+
1122
+ for(j=0;j<jn;j++){
1123
+
1124
+ if(j<sliding_lowpass-i){
1125
+ if(fM[j] || fA[j]){
1126
+ /* lossless coupling */
1127
+
1128
+ reM[j] = fabs(reM[j])+fabs(reA[j]);
1129
+ qeM[j] = qeM[j]+qeA[j];
1130
+ fM[j]=fA[j]=1;
1131
+
1132
+ /* couple iM/iA */
1133
+ {
1134
+ int A = iM[j];
1135
+ int B = iA[j];
1136
+
1137
+ if(abs(A)>abs(B)){
1138
+ iA[j]=(A>0?A-B:B-A);
1139
+ }else{
1140
+ iA[j]=(B>0?A-B:B-A);
1141
+ iM[j]=B;
1142
+ }
1143
+
1144
+ /* collapse two equivalent tuples to one */
1145
+ if(iA[j]>=abs(iM[j])*2){
1146
+ iA[j]= -iA[j];
1147
+ iM[j]= -iM[j];
1148
+ }
1149
+
1150
+ }
1151
+
1152
+ }else{
1153
+ /* lossy (point) coupling */
1154
+ if(j<limit-i){
1155
+ /* dipole */
1156
+ reM[j] += reA[j];
1157
+ qeM[j] = fabs(reM[j]);
1158
+ }else{
1159
+ #if 0
1160
+ /* AoTuV */
1161
+ /** @ M2 **
1162
+ The boost problem by the combination of noise normalization and point stereo is eased.
1163
+ However, this is a temporary patch.
1164
+ by Aoyumi @ 2004/04/18
1165
+ */
1166
+ float derate = (1.0 - de*((float)(j-limit+i) / (float)(n-limit)));
1167
+ /* elliptical */
1168
+ if(reM[j]+reA[j]<0){
1169
+ reM[j] = - (qeM[j] = (fabs(reM[j])+fabs(reA[j]))*derate*derate);
1170
+ }else{
1171
+ reM[j] = (qeM[j] = (fabs(reM[j])+fabs(reA[j]))*derate*derate);
1172
+ }
1173
+ #else
1174
+ /* elliptical */
1175
+ if(reM[j]+reA[j]<0){
1176
+ reM[j] = - (qeM[j] = fabs(reM[j])+fabs(reA[j]));
1177
+ }else{
1178
+ reM[j] = (qeM[j] = fabs(reM[j])+fabs(reA[j]));
1179
+ }
1180
+ #endif
1181
+
1182
+ }
1183
+ reA[j]=qeA[j]=0.f;
1184
+ fA[j]=1;
1185
+ iA[j]=0;
1186
+ }
1187
+ }
1188
+ floorM[j]=floorA[j]=floorM[j]+floorA[j];
1189
+ }
1190
+ /* normalize the resulting mag vector */
1191
+ acc[track]=noise_normalize(p,limit,raw[Mi],quant[Mi],floor[Mi],flag[Mi],acc[track],i,jn,iM);
1192
+ track++;
1193
+ }
1194
+ }
1195
+ }
1196
+
1197
+ for(i=0;i<vi->coupling_steps;i++){
1198
+ /* make sure coupling a zero and a nonzero channel results in two
1199
+ nonzero channels. */
1200
+ if(nonzero[vi->coupling_mag[i]] ||
1201
+ nonzero[vi->coupling_ang[i]]){
1202
+ nonzero[vi->coupling_mag[i]]=1;
1203
+ nonzero[vi->coupling_ang[i]]=1;
1204
+ }
1205
+ }
1206
+ }