seal 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (421) hide show
  1. data/.yardopts +1 -0
  2. data/LICENSE +13 -0
  3. data/README.md +265 -0
  4. data/ext/seal/extconf.rb +45 -0
  5. data/include/al/al.h +724 -0
  6. data/include/al/alc.h +277 -0
  7. data/include/al/efx-presets.h +402 -0
  8. data/include/al/efx.h +758 -0
  9. data/include/mpg123/mpg123.h +1034 -0
  10. data/include/ogg/config_types.h +25 -0
  11. data/include/ogg/ogg.h +210 -0
  12. data/include/ogg/os_types.h +147 -0
  13. data/include/seal.h +23 -0
  14. data/include/seal/buf.h +143 -0
  15. data/include/seal/core.h +95 -0
  16. data/include/seal/efs.h +112 -0
  17. data/include/seal/err.h +93 -0
  18. data/include/seal/fmt.h +58 -0
  19. data/include/seal/listener.h +103 -0
  20. data/include/seal/raw.h +86 -0
  21. data/include/seal/rvb.h +520 -0
  22. data/include/seal/src.h +413 -0
  23. data/include/seal/stream.h +81 -0
  24. data/include/vorbis/codec.h +243 -0
  25. data/include/vorbis/vorbisfile.h +206 -0
  26. data/mpg123/AUTHORS +150 -0
  27. data/mpg123/COPYING +773 -0
  28. data/mpg123/ChangeLog +3 -0
  29. data/mpg123/INSTALL +111 -0
  30. data/mpg123/Makefile.am +99 -0
  31. data/mpg123/Makefile.in +1043 -0
  32. data/mpg123/NEWS +1200 -0
  33. data/mpg123/NEWS.libmpg123 +133 -0
  34. data/mpg123/README +203 -0
  35. data/mpg123/TODO +38 -0
  36. data/mpg123/aclocal.m4 +1168 -0
  37. data/mpg123/build/config.guess +1530 -0
  38. data/mpg123/build/config.sub +1782 -0
  39. data/mpg123/build/depcomp +707 -0
  40. data/mpg123/build/install-sh +527 -0
  41. data/mpg123/build/ltmain.sh +9655 -0
  42. data/mpg123/build/missing +330 -0
  43. data/mpg123/configure +20267 -0
  44. data/mpg123/configure.ac +2178 -0
  45. data/mpg123/doc/ACCURACY +2 -0
  46. data/mpg123/doc/BENCHMARKING +110 -0
  47. data/mpg123/doc/BUGS +3 -0
  48. data/mpg123/doc/CONTACT +17 -0
  49. data/mpg123/doc/LICENSE +22 -0
  50. data/mpg123/doc/Makefile.am +32 -0
  51. data/mpg123/doc/Makefile.in +490 -0
  52. data/mpg123/doc/PATENTS +39 -0
  53. data/mpg123/doc/README.3DNOW +56 -0
  54. data/mpg123/doc/README.gain +171 -0
  55. data/mpg123/doc/README.remote +218 -0
  56. data/mpg123/doc/ROAD_TO_LGPL +270 -0
  57. data/mpg123/doc/THANKS +13 -0
  58. data/mpg123/doc/TODO +63 -0
  59. data/mpg123/doc/doxy_examples.c +21 -0
  60. data/mpg123/doc/doxygen.conf +41 -0
  61. data/mpg123/doc/doxyhead.xhtml +12 -0
  62. data/mpg123/doc/examples/dump_seekindex.c +41 -0
  63. data/mpg123/doc/examples/extract_frames.c +92 -0
  64. data/mpg123/doc/examples/feedseek.c +238 -0
  65. data/mpg123/doc/examples/id3dump.c +178 -0
  66. data/mpg123/doc/examples/mpg123_to_wav.c +118 -0
  67. data/mpg123/doc/examples/mpglib.c +92 -0
  68. data/mpg123/doc/examples/scan.c +47 -0
  69. data/mpg123/doc/libmpg123_speed.txt +84 -0
  70. data/mpg123/equalize.dat +37 -0
  71. data/mpg123/libmpg123.pc.in +11 -0
  72. data/mpg123/m4/addrconfig.m4 +34 -0
  73. data/mpg123/m4/libtool.m4 +7982 -0
  74. data/mpg123/m4/ltoptions.m4 +384 -0
  75. data/mpg123/m4/ltsugar.m4 +123 -0
  76. data/mpg123/m4/ltversion.m4 +23 -0
  77. data/mpg123/m4/lt~obsolete.m4 +98 -0
  78. data/mpg123/makedll.sh +19 -0
  79. data/mpg123/man1/mpg123.1 +512 -0
  80. data/mpg123/mpg123.spec +68 -0
  81. data/mpg123/mpg123.spec.in +68 -0
  82. data/mpg123/ports/MSVC++/2005/libmpg123/libmpg123.vcproj +741 -0
  83. data/mpg123/ports/MSVC++/2008/dump_seekindex/dump_seekindex.vcproj +194 -0
  84. data/mpg123/ports/MSVC++/2008/feedseek/feedseek.vcproj +195 -0
  85. data/mpg123/ports/MSVC++/2008/libmpg123/libmpg123.vcproj +1357 -0
  86. data/mpg123/ports/MSVC++/2008/mpg123.sln +44 -0
  87. data/mpg123/ports/MSVC++/2008/mpglib/mpglib.vcproj +191 -0
  88. data/mpg123/ports/MSVC++/2008/scan/scan.vcproj +195 -0
  89. data/mpg123/ports/MSVC++/2008clr/2008clr.sln +81 -0
  90. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Program.cs +435 -0
  91. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Properties/AssemblyInfo.cs +36 -0
  92. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/ReplaceReaderclr.csproj +72 -0
  93. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Program.cs +331 -0
  94. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Properties/AssemblyInfo.cs +36 -0
  95. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/feedseekclr.csproj +71 -0
  96. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Program.cs +79 -0
  97. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Properties/AssemblyInfo.cs +36 -0
  98. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/scanclr.csproj +70 -0
  99. data/mpg123/ports/MSVC++/2008clr/mpg123clr/AssemblyInfo.cpp +76 -0
  100. data/mpg123/ports/MSVC++/2008clr/mpg123clr/ReadMe.txt +165 -0
  101. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.cpp +91 -0
  102. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.h +130 -0
  103. data/mpg123/ports/MSVC++/2008clr/mpg123clr/dllmain.cpp +19 -0
  104. data/mpg123/ports/MSVC++/2008clr/mpg123clr/enum.h +218 -0
  105. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.cpp +48 -0
  106. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.h +134 -0
  107. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.cpp +92 -0
  108. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.h +132 -0
  109. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.cpp +138 -0
  110. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.h +152 -0
  111. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.cpp +896 -0
  112. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.h +953 -0
  113. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.rc +102 -0
  114. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.vcproj +328 -0
  115. data/mpg123/ports/MSVC++/2008clr/mpg123clr/resource.h +14 -0
  116. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.cpp +8 -0
  117. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.h +38 -0
  118. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.cpp +166 -0
  119. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.h +265 -0
  120. data/mpg123/ports/MSVC++/2008clr/mpg123clr/targetver.h +24 -0
  121. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.cpp +67 -0
  122. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.h +111 -0
  123. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj +90 -0
  124. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj.filters +6 -0
  125. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj +95 -0
  126. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj.filters +6 -0
  127. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj +960 -0
  128. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj.user +3 -0
  129. data/mpg123/ports/MSVC++/2010/libmpg123/yasm.exe +0 -0
  130. data/mpg123/ports/MSVC++/2010/mpg123.sln +38 -0
  131. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj +93 -0
  132. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj.filters +6 -0
  133. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/CORE_FileIn.H +15 -0
  134. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/SourceFilter_MP3.H +139 -0
  135. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_Def.H +206 -0
  136. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_FileIn.H +167 -0
  137. data/mpg123/ports/MSVC++/CMP3Stream/README +4 -0
  138. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP +462 -0
  139. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Log.CPP +122 -0
  140. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Mutex.CPP +35 -0
  141. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/SourceFilter_MP3Stream.CPP +586 -0
  142. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/PLACE_LIBMPG123_SOURCES_HERE +0 -0
  143. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/libMPG123.vcproj +245 -0
  144. data/mpg123/ports/MSVC++/config.h +35 -0
  145. data/mpg123/ports/MSVC++/examples/feedseek.c +240 -0
  146. data/mpg123/ports/MSVC++/examples/scan.c +47 -0
  147. data/mpg123/ports/MSVC++/mpg123.h +46 -0
  148. data/mpg123/ports/MSVC++/msvc.c +59 -0
  149. data/mpg123/ports/README +26 -0
  150. data/mpg123/ports/Sony_PSP/Makefile.psp +38 -0
  151. data/mpg123/ports/Sony_PSP/README +11 -0
  152. data/mpg123/ports/Sony_PSP/config.h +368 -0
  153. data/mpg123/ports/Sony_PSP/readers.c.patch +2 -0
  154. data/mpg123/ports/Xcode/config.h +197 -0
  155. data/mpg123/ports/Xcode/mpg123.h +17 -0
  156. data/mpg123/ports/Xcode/mpg123.xcodeproj/project.pbxproj +670 -0
  157. data/mpg123/ports/mpg123_.pas +478 -0
  158. data/mpg123/scripts/benchmark-cpu.pl +56 -0
  159. data/mpg123/scripts/tag_lyrics.py +76 -0
  160. data/mpg123/src/Makefile.am +186 -0
  161. data/mpg123/src/Makefile.in +1097 -0
  162. data/mpg123/src/audio.c +725 -0
  163. data/mpg123/src/audio.h +106 -0
  164. data/mpg123/src/buffer.c +312 -0
  165. data/mpg123/src/buffer.h +45 -0
  166. data/mpg123/src/common.c +240 -0
  167. data/mpg123/src/common.h +29 -0
  168. data/mpg123/src/config.h.in +436 -0
  169. data/mpg123/src/control_generic.c +809 -0
  170. data/mpg123/src/equalizer.c +48 -0
  171. data/mpg123/src/genre.c +271 -0
  172. data/mpg123/src/genre.h +15 -0
  173. data/mpg123/src/getlopt.c +148 -0
  174. data/mpg123/src/getlopt.h +77 -0
  175. data/mpg123/src/httpget.c +700 -0
  176. data/mpg123/src/httpget.h +66 -0
  177. data/mpg123/src/legacy_module.c +74 -0
  178. data/mpg123/src/libmpg123/Makefile.am +141 -0
  179. data/mpg123/src/libmpg123/Makefile.in +919 -0
  180. data/mpg123/src/libmpg123/compat.c +138 -0
  181. data/mpg123/src/libmpg123/compat.h +178 -0
  182. data/mpg123/src/libmpg123/dct36_3dnow.S +505 -0
  183. data/mpg123/src/libmpg123/dct36_3dnowext.S +512 -0
  184. data/mpg123/src/libmpg123/dct64.c +174 -0
  185. data/mpg123/src/libmpg123/dct64_3dnow.S +712 -0
  186. data/mpg123/src/libmpg123/dct64_3dnowext.S +714 -0
  187. data/mpg123/src/libmpg123/dct64_altivec.c +315 -0
  188. data/mpg123/src/libmpg123/dct64_i386.c +336 -0
  189. data/mpg123/src/libmpg123/dct64_i486.c +342 -0
  190. data/mpg123/src/libmpg123/dct64_mmx.S +811 -0
  191. data/mpg123/src/libmpg123/dct64_neon.S +297 -0
  192. data/mpg123/src/libmpg123/dct64_neon_float.S +270 -0
  193. data/mpg123/src/libmpg123/dct64_sse.S +454 -0
  194. data/mpg123/src/libmpg123/dct64_sse_float.S +401 -0
  195. data/mpg123/src/libmpg123/dct64_x86_64.S +464 -0
  196. data/mpg123/src/libmpg123/dct64_x86_64_float.S +426 -0
  197. data/mpg123/src/libmpg123/debug.h +171 -0
  198. data/mpg123/src/libmpg123/decode.h +268 -0
  199. data/mpg123/src/libmpg123/dither.c +119 -0
  200. data/mpg123/src/libmpg123/dither.h +23 -0
  201. data/mpg123/src/libmpg123/equalizer.c +17 -0
  202. data/mpg123/src/libmpg123/equalizer_3dnow.S +70 -0
  203. data/mpg123/src/libmpg123/feature.c +106 -0
  204. data/mpg123/src/libmpg123/format.c +521 -0
  205. data/mpg123/src/libmpg123/frame.c +1046 -0
  206. data/mpg123/src/libmpg123/frame.h +410 -0
  207. data/mpg123/src/libmpg123/gapless.h +119 -0
  208. data/mpg123/src/libmpg123/getbits.h +100 -0
  209. data/mpg123/src/libmpg123/getcpuflags.S +91 -0
  210. data/mpg123/src/libmpg123/getcpuflags.h +47 -0
  211. data/mpg123/src/libmpg123/huffman.h +340 -0
  212. data/mpg123/src/libmpg123/icy.c +32 -0
  213. data/mpg123/src/libmpg123/icy.h +38 -0
  214. data/mpg123/src/libmpg123/icy2utf8.c +438 -0
  215. data/mpg123/src/libmpg123/icy2utf8.h +10 -0
  216. data/mpg123/src/libmpg123/id3.c +999 -0
  217. data/mpg123/src/libmpg123/id3.h +43 -0
  218. data/mpg123/src/libmpg123/index.c +134 -0
  219. data/mpg123/src/libmpg123/index.h +59 -0
  220. data/mpg123/src/libmpg123/intsym.h +256 -0
  221. data/mpg123/src/libmpg123/l12_integer_tables.h +278 -0
  222. data/mpg123/src/libmpg123/l2tables.h +164 -0
  223. data/mpg123/src/libmpg123/l3_integer_tables.h +1002 -0
  224. data/mpg123/src/libmpg123/layer1.c +155 -0
  225. data/mpg123/src/libmpg123/layer2.c +371 -0
  226. data/mpg123/src/libmpg123/layer3.c +2053 -0
  227. data/mpg123/src/libmpg123/lfs_alias.c +252 -0
  228. data/mpg123/src/libmpg123/lfs_wrap.c +751 -0
  229. data/mpg123/src/libmpg123/libmpg123.c +1607 -0
  230. data/mpg123/src/libmpg123/mangle.h +74 -0
  231. data/mpg123/src/libmpg123/mpeghead.h +87 -0
  232. data/mpg123/src/libmpg123/mpg123.h.in +1075 -0
  233. data/mpg123/src/libmpg123/mpg123lib_intern.h +338 -0
  234. data/mpg123/src/libmpg123/ntom.c +148 -0
  235. data/mpg123/src/libmpg123/optimize.c +964 -0
  236. data/mpg123/src/libmpg123/optimize.h +219 -0
  237. data/mpg123/src/libmpg123/parse.c +1179 -0
  238. data/mpg123/src/libmpg123/parse.h +25 -0
  239. data/mpg123/src/libmpg123/reader.h +137 -0
  240. data/mpg123/src/libmpg123/readers.c +1235 -0
  241. data/mpg123/src/libmpg123/sample.h +152 -0
  242. data/mpg123/src/libmpg123/stringbuf.c +163 -0
  243. data/mpg123/src/libmpg123/synth.c +816 -0
  244. data/mpg123/src/libmpg123/synth.h +196 -0
  245. data/mpg123/src/libmpg123/synth_3dnow.S +318 -0
  246. data/mpg123/src/libmpg123/synth_3dnowext.S +6 -0
  247. data/mpg123/src/libmpg123/synth_8bit.c +142 -0
  248. data/mpg123/src/libmpg123/synth_8bit.h +86 -0
  249. data/mpg123/src/libmpg123/synth_altivec.c +1057 -0
  250. data/mpg123/src/libmpg123/synth_arm.S +271 -0
  251. data/mpg123/src/libmpg123/synth_arm_accurate.S +287 -0
  252. data/mpg123/src/libmpg123/synth_i486.c +252 -0
  253. data/mpg123/src/libmpg123/synth_i586.S +336 -0
  254. data/mpg123/src/libmpg123/synth_i586_dither.S +375 -0
  255. data/mpg123/src/libmpg123/synth_mmx.S +125 -0
  256. data/mpg123/src/libmpg123/synth_mono.h +64 -0
  257. data/mpg123/src/libmpg123/synth_neon.S +123 -0
  258. data/mpg123/src/libmpg123/synth_neon_accurate.S +173 -0
  259. data/mpg123/src/libmpg123/synth_neon_float.S +149 -0
  260. data/mpg123/src/libmpg123/synth_neon_s32.S +168 -0
  261. data/mpg123/src/libmpg123/synth_ntom.h +213 -0
  262. data/mpg123/src/libmpg123/synth_real.c +404 -0
  263. data/mpg123/src/libmpg123/synth_s32.c +411 -0
  264. data/mpg123/src/libmpg123/synth_sse.S +6 -0
  265. data/mpg123/src/libmpg123/synth_sse3d.h +246 -0
  266. data/mpg123/src/libmpg123/synth_sse_accurate.S +294 -0
  267. data/mpg123/src/libmpg123/synth_sse_float.S +241 -0
  268. data/mpg123/src/libmpg123/synth_sse_s32.S +306 -0
  269. data/mpg123/src/libmpg123/synth_stereo_neon.S +175 -0
  270. data/mpg123/src/libmpg123/synth_stereo_neon_accurate.S +262 -0
  271. data/mpg123/src/libmpg123/synth_stereo_neon_float.S +220 -0
  272. data/mpg123/src/libmpg123/synth_stereo_neon_s32.S +247 -0
  273. data/mpg123/src/libmpg123/synth_stereo_sse_accurate.S +508 -0
  274. data/mpg123/src/libmpg123/synth_stereo_sse_float.S +416 -0
  275. data/mpg123/src/libmpg123/synth_stereo_sse_s32.S +540 -0
  276. data/mpg123/src/libmpg123/synth_stereo_x86_64.S +335 -0
  277. data/mpg123/src/libmpg123/synth_stereo_x86_64_accurate.S +454 -0
  278. data/mpg123/src/libmpg123/synth_stereo_x86_64_float.S +396 -0
  279. data/mpg123/src/libmpg123/synth_stereo_x86_64_s32.S +473 -0
  280. data/mpg123/src/libmpg123/synth_x86_64.S +244 -0
  281. data/mpg123/src/libmpg123/synth_x86_64_accurate.S +301 -0
  282. data/mpg123/src/libmpg123/synth_x86_64_float.S +259 -0
  283. data/mpg123/src/libmpg123/synth_x86_64_s32.S +312 -0
  284. data/mpg123/src/libmpg123/synths.h +52 -0
  285. data/mpg123/src/libmpg123/tabinit.c +294 -0
  286. data/mpg123/src/libmpg123/tabinit_mmx.S +210 -0
  287. data/mpg123/src/libmpg123/testcpu.c +35 -0
  288. data/mpg123/src/libmpg123/true.h +14 -0
  289. data/mpg123/src/local.c +63 -0
  290. data/mpg123/src/local.h +21 -0
  291. data/mpg123/src/metaprint.c +373 -0
  292. data/mpg123/src/metaprint.h +17 -0
  293. data/mpg123/src/module.c +306 -0
  294. data/mpg123/src/module.h +48 -0
  295. data/mpg123/src/mpg123.c +1405 -0
  296. data/mpg123/src/mpg123app.h +171 -0
  297. data/mpg123/src/output/Makefile.am +213 -0
  298. data/mpg123/src/output/Makefile.in +1238 -0
  299. data/mpg123/src/output/aix.c +300 -0
  300. data/mpg123/src/output/alib.c +209 -0
  301. data/mpg123/src/output/alsa.c +297 -0
  302. data/mpg123/src/output/arts.c +117 -0
  303. data/mpg123/src/output/coreaudio.c +370 -0
  304. data/mpg123/src/output/dummy.c +78 -0
  305. data/mpg123/src/output/esd.c +167 -0
  306. data/mpg123/src/output/hp.c +184 -0
  307. data/mpg123/src/output/jack.c +450 -0
  308. data/mpg123/src/output/mint.c +197 -0
  309. data/mpg123/src/output/nas.c +335 -0
  310. data/mpg123/src/output/openal.c +197 -0
  311. data/mpg123/src/output/os2.c +665 -0
  312. data/mpg123/src/output/oss.c +319 -0
  313. data/mpg123/src/output/portaudio.c +255 -0
  314. data/mpg123/src/output/pulse.c +164 -0
  315. data/mpg123/src/output/sdl.c +206 -0
  316. data/mpg123/src/output/sgi.c +213 -0
  317. data/mpg123/src/output/sndio.c +161 -0
  318. data/mpg123/src/output/sun.c +281 -0
  319. data/mpg123/src/output/win32.c +229 -0
  320. data/mpg123/src/playlist.c +596 -0
  321. data/mpg123/src/playlist.h +52 -0
  322. data/mpg123/src/resolver.c +319 -0
  323. data/mpg123/src/resolver.h +25 -0
  324. data/mpg123/src/sfifo.c +146 -0
  325. data/mpg123/src/sfifo.h +95 -0
  326. data/mpg123/src/streamdump.c +74 -0
  327. data/mpg123/src/streamdump.h +20 -0
  328. data/mpg123/src/term.c +479 -0
  329. data/mpg123/src/term.h +81 -0
  330. data/mpg123/src/tests/noise.c +52 -0
  331. data/mpg123/src/tests/plain_id3.c +109 -0
  332. data/mpg123/src/tests/seek_accuracy.c +261 -0
  333. data/mpg123/src/tests/seek_whence.c +56 -0
  334. data/mpg123/src/tests/testtext.h +34 -0
  335. data/mpg123/src/tests/text.c +80 -0
  336. data/mpg123/src/wav.c +464 -0
  337. data/mpg123/src/wavhead.h +68 -0
  338. data/mpg123/src/win32_net.c +599 -0
  339. data/mpg123/src/win32_support.c +191 -0
  340. data/mpg123/src/win32_support.h +152 -0
  341. data/mpg123/src/xfermem.c +321 -0
  342. data/mpg123/src/xfermem.h +74 -0
  343. data/mpg123/windows-builds.sh +137 -0
  344. data/msvc/lib/OpenAL32.lib +0 -0
  345. data/spec/fixtures/heal.ogg +0 -0
  346. data/spec/fixtures/tone_up.wav +0 -0
  347. data/spec/seal/buffer_spec.rb +37 -0
  348. data/spec/seal/core_spec.rb +29 -0
  349. data/spec/seal/effect_slot_spec.rb +38 -0
  350. data/spec/seal/listener_spec.rb +33 -0
  351. data/spec/seal/reverb_spec.rb +51 -0
  352. data/spec/seal/source_spec.rb +370 -0
  353. data/spec/seal/stream_spec.rb +38 -0
  354. data/spec/spec_helper.rb +45 -0
  355. data/spec/support/attribute_examples.rb +75 -0
  356. data/spec/support/audio_object_with_format.rb +27 -0
  357. data/spec/support/movable_object.rb +22 -0
  358. data/src/libogg/bitwise.c +857 -0
  359. data/src/libogg/framing.c +2093 -0
  360. data/src/libvorbis/backends.h +144 -0
  361. data/src/libvorbis/bitrate.c +253 -0
  362. data/src/libvorbis/bitrate.h +59 -0
  363. data/src/libvorbis/block.c +1046 -0
  364. data/src/libvorbis/codebook.c +484 -0
  365. data/src/libvorbis/codebook.h +119 -0
  366. data/src/libvorbis/codec_internal.h +167 -0
  367. data/src/libvorbis/envelope.c +375 -0
  368. data/src/libvorbis/envelope.h +80 -0
  369. data/src/libvorbis/floor0.c +221 -0
  370. data/src/libvorbis/floor1.c +1100 -0
  371. data/src/libvorbis/highlevel.h +58 -0
  372. data/src/libvorbis/info.c +668 -0
  373. data/src/libvorbis/lookup.c +94 -0
  374. data/src/libvorbis/lookup.h +32 -0
  375. data/src/libvorbis/lookup_data.h +192 -0
  376. data/src/libvorbis/lpc.c +160 -0
  377. data/src/libvorbis/lpc.h +29 -0
  378. data/src/libvorbis/lsp.c +456 -0
  379. data/src/libvorbis/lsp.h +28 -0
  380. data/src/libvorbis/mapping0.c +816 -0
  381. data/src/libvorbis/masking.h +785 -0
  382. data/src/libvorbis/mdct.c +563 -0
  383. data/src/libvorbis/mdct.h +71 -0
  384. data/src/libvorbis/misc.h +57 -0
  385. data/src/libvorbis/os.h +186 -0
  386. data/src/libvorbis/psy.c +1206 -0
  387. data/src/libvorbis/psy.h +154 -0
  388. data/src/libvorbis/registry.c +45 -0
  389. data/src/libvorbis/registry.h +32 -0
  390. data/src/libvorbis/res0.c +889 -0
  391. data/src/libvorbis/scales.h +90 -0
  392. data/src/libvorbis/sharedbook.c +579 -0
  393. data/src/libvorbis/smallft.c +1255 -0
  394. data/src/libvorbis/smallft.h +34 -0
  395. data/src/libvorbis/synthesis.c +184 -0
  396. data/src/libvorbis/vorbisfile.c +2337 -0
  397. data/src/libvorbis/window.c +2135 -0
  398. data/src/libvorbis/window.h +26 -0
  399. data/src/rubyext.c +2329 -0
  400. data/src/seal/buf.c +124 -0
  401. data/src/seal/core.c +283 -0
  402. data/src/seal/efs.c +74 -0
  403. data/src/seal/err.c +118 -0
  404. data/src/seal/fmt.c +86 -0
  405. data/src/seal/listener.c +111 -0
  406. data/src/seal/mpg.c +174 -0
  407. data/src/seal/mpg.h +24 -0
  408. data/src/seal/ov.c +180 -0
  409. data/src/seal/ov.h +22 -0
  410. data/src/seal/raw.c +59 -0
  411. data/src/seal/reader.c +102 -0
  412. data/src/seal/reader.h +59 -0
  413. data/src/seal/rvb.c +368 -0
  414. data/src/seal/src.c +654 -0
  415. data/src/seal/stream.c +109 -0
  416. data/src/seal/threading.c +66 -0
  417. data/src/seal/threading.h +20 -0
  418. data/src/seal/wav.c +297 -0
  419. data/src/seal/wav.h +23 -0
  420. data/src/win32api.rb +29 -0
  421. metadata +563 -0
@@ -0,0 +1,1046 @@
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: PCM data vector blocking, windowing and dis/reassembly
14
+ last mod: $Id: block.c 17561 2010-10-23 10:34:24Z xiphmont $
15
+
16
+ Handle windowing, overlap-add, etc of the PCM vectors. This is made
17
+ more amusing by Vorbis' current two allowed block sizes.
18
+
19
+ ********************************************************************/
20
+
21
+ #include <stdio.h>
22
+ #include <stdlib.h>
23
+ #include <string.h>
24
+ #include <ogg/ogg.h>
25
+ #include "vorbis/codec.h"
26
+ #include "codec_internal.h"
27
+
28
+ #include "window.h"
29
+ #include "mdct.h"
30
+ #include "lpc.h"
31
+ #include "registry.h"
32
+ #include "misc.h"
33
+
34
+ static int ilog2(unsigned int v){
35
+ int ret=0;
36
+ if(v)--v;
37
+ while(v){
38
+ ret++;
39
+ v>>=1;
40
+ }
41
+ return(ret);
42
+ }
43
+
44
+ /* pcm accumulator examples (not exhaustive):
45
+
46
+ <-------------- lW ---------------->
47
+ <--------------- W ---------------->
48
+ : .....|..... _______________ |
49
+ : .''' | '''_--- | |\ |
50
+ :.....''' |_____--- '''......| | \_______|
51
+ :.................|__________________|_______|__|______|
52
+ |<------ Sl ------>| > Sr < |endW
53
+ |beginSl |endSl | |endSr
54
+ |beginW |endlW |beginSr
55
+
56
+
57
+ |< lW >|
58
+ <--------------- W ---------------->
59
+ | | .. ______________ |
60
+ | | ' `/ | ---_ |
61
+ |___.'___/`. | ---_____|
62
+ |_______|__|_______|_________________|
63
+ | >|Sl|< |<------ Sr ----->|endW
64
+ | | |endSl |beginSr |endSr
65
+ |beginW | |endlW
66
+ mult[0] |beginSl mult[n]
67
+
68
+ <-------------- lW ----------------->
69
+ |<--W-->|
70
+ : .............. ___ | |
71
+ : .''' |`/ \ | |
72
+ :.....''' |/`....\|...|
73
+ :.........................|___|___|___|
74
+ |Sl |Sr |endW
75
+ | | |endSr
76
+ | |beginSr
77
+ | |endSl
78
+ |beginSl
79
+ |beginW
80
+ */
81
+
82
+ /* block abstraction setup *********************************************/
83
+
84
+ #ifndef WORD_ALIGN
85
+ #define WORD_ALIGN 8
86
+ #endif
87
+
88
+ int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){
89
+ int i;
90
+ memset(vb,0,sizeof(*vb));
91
+ vb->vd=v;
92
+ vb->localalloc=0;
93
+ vb->localstore=NULL;
94
+ if(v->analysisp){
95
+ vorbis_block_internal *vbi=
96
+ vb->internal=_ogg_calloc(1,sizeof(vorbis_block_internal));
97
+ vbi->ampmax=-9999;
98
+
99
+ for(i=0;i<PACKETBLOBS;i++){
100
+ if(i==PACKETBLOBS/2){
101
+ vbi->packetblob[i]=&vb->opb;
102
+ }else{
103
+ vbi->packetblob[i]=
104
+ _ogg_calloc(1,sizeof(oggpack_buffer));
105
+ }
106
+ oggpack_writeinit(vbi->packetblob[i]);
107
+ }
108
+ }
109
+
110
+ return(0);
111
+ }
112
+
113
+ void *_vorbis_block_alloc(vorbis_block *vb,long bytes){
114
+ bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1);
115
+ if(bytes+vb->localtop>vb->localalloc){
116
+ /* can't just _ogg_realloc... there are outstanding pointers */
117
+ if(vb->localstore){
118
+ struct alloc_chain *link=_ogg_malloc(sizeof(*link));
119
+ vb->totaluse+=vb->localtop;
120
+ link->next=vb->reap;
121
+ link->ptr=vb->localstore;
122
+ vb->reap=link;
123
+ }
124
+ /* highly conservative */
125
+ vb->localalloc=bytes;
126
+ vb->localstore=_ogg_malloc(vb->localalloc);
127
+ vb->localtop=0;
128
+ }
129
+ {
130
+ void *ret=(void *)(((char *)vb->localstore)+vb->localtop);
131
+ vb->localtop+=bytes;
132
+ return ret;
133
+ }
134
+ }
135
+
136
+ /* reap the chain, pull the ripcord */
137
+ void _vorbis_block_ripcord(vorbis_block *vb){
138
+ /* reap the chain */
139
+ struct alloc_chain *reap=vb->reap;
140
+ while(reap){
141
+ struct alloc_chain *next=reap->next;
142
+ _ogg_free(reap->ptr);
143
+ memset(reap,0,sizeof(*reap));
144
+ _ogg_free(reap);
145
+ reap=next;
146
+ }
147
+ /* consolidate storage */
148
+ if(vb->totaluse){
149
+ vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc);
150
+ vb->localalloc+=vb->totaluse;
151
+ vb->totaluse=0;
152
+ }
153
+
154
+ /* pull the ripcord */
155
+ vb->localtop=0;
156
+ vb->reap=NULL;
157
+ }
158
+
159
+ int vorbis_block_clear(vorbis_block *vb){
160
+ int i;
161
+ vorbis_block_internal *vbi=vb->internal;
162
+
163
+ _vorbis_block_ripcord(vb);
164
+ if(vb->localstore)_ogg_free(vb->localstore);
165
+
166
+ if(vbi){
167
+ for(i=0;i<PACKETBLOBS;i++){
168
+ oggpack_writeclear(vbi->packetblob[i]);
169
+ if(i!=PACKETBLOBS/2)_ogg_free(vbi->packetblob[i]);
170
+ }
171
+ _ogg_free(vbi);
172
+ }
173
+ memset(vb,0,sizeof(*vb));
174
+ return(0);
175
+ }
176
+
177
+ /* Analysis side code, but directly related to blocking. Thus it's
178
+ here and not in analysis.c (which is for analysis transforms only).
179
+ The init is here because some of it is shared */
180
+
181
+ static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){
182
+ int i;
183
+ codec_setup_info *ci=vi->codec_setup;
184
+ private_state *b=NULL;
185
+ int hs;
186
+
187
+ if(ci==NULL) return 1;
188
+ hs=ci->halfrate_flag;
189
+
190
+ memset(v,0,sizeof(*v));
191
+ b=v->backend_state=_ogg_calloc(1,sizeof(*b));
192
+
193
+ v->vi=vi;
194
+ b->modebits=ilog2(ci->modes);
195
+
196
+ b->transform[0]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[0]));
197
+ b->transform[1]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[1]));
198
+
199
+ /* MDCT is tranform 0 */
200
+
201
+ b->transform[0][0]=_ogg_calloc(1,sizeof(mdct_lookup));
202
+ b->transform[1][0]=_ogg_calloc(1,sizeof(mdct_lookup));
203
+ mdct_init(b->transform[0][0],ci->blocksizes[0]>>hs);
204
+ mdct_init(b->transform[1][0],ci->blocksizes[1]>>hs);
205
+
206
+ /* Vorbis I uses only window type 0 */
207
+ b->window[0]=ilog2(ci->blocksizes[0])-6;
208
+ b->window[1]=ilog2(ci->blocksizes[1])-6;
209
+
210
+ if(encp){ /* encode/decode differ here */
211
+
212
+ /* analysis always needs an fft */
213
+ drft_init(&b->fft_look[0],ci->blocksizes[0]);
214
+ drft_init(&b->fft_look[1],ci->blocksizes[1]);
215
+
216
+ /* finish the codebooks */
217
+ if(!ci->fullbooks){
218
+ ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks));
219
+ for(i=0;i<ci->books;i++)
220
+ vorbis_book_init_encode(ci->fullbooks+i,ci->book_param[i]);
221
+ }
222
+
223
+ b->psy=_ogg_calloc(ci->psys,sizeof(*b->psy));
224
+ for(i=0;i<ci->psys;i++){
225
+ _vp_psy_init(b->psy+i,
226
+ ci->psy_param[i],
227
+ &ci->psy_g_param,
228
+ ci->blocksizes[ci->psy_param[i]->blockflag]/2,
229
+ vi->rate);
230
+ }
231
+
232
+ v->analysisp=1;
233
+ }else{
234
+ /* finish the codebooks */
235
+ if(!ci->fullbooks){
236
+ ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks));
237
+ for(i=0;i<ci->books;i++){
238
+ if(ci->book_param[i]==NULL)
239
+ goto abort_books;
240
+ if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i]))
241
+ goto abort_books;
242
+ /* decode codebooks are now standalone after init */
243
+ vorbis_staticbook_destroy(ci->book_param[i]);
244
+ ci->book_param[i]=NULL;
245
+ }
246
+ }
247
+ }
248
+
249
+ /* initialize the storage vectors. blocksize[1] is small for encode,
250
+ but the correct size for decode */
251
+ v->pcm_storage=ci->blocksizes[1];
252
+ v->pcm=_ogg_malloc(vi->channels*sizeof(*v->pcm));
253
+ v->pcmret=_ogg_malloc(vi->channels*sizeof(*v->pcmret));
254
+ {
255
+ int i;
256
+ for(i=0;i<vi->channels;i++)
257
+ v->pcm[i]=_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i]));
258
+ }
259
+
260
+ /* all 1 (large block) or 0 (small block) */
261
+ /* explicitly set for the sake of clarity */
262
+ v->lW=0; /* previous window size */
263
+ v->W=0; /* current window size */
264
+
265
+ /* all vector indexes */
266
+ v->centerW=ci->blocksizes[1]/2;
267
+
268
+ v->pcm_current=v->centerW;
269
+
270
+ /* initialize all the backend lookups */
271
+ b->flr=_ogg_calloc(ci->floors,sizeof(*b->flr));
272
+ b->residue=_ogg_calloc(ci->residues,sizeof(*b->residue));
273
+
274
+ for(i=0;i<ci->floors;i++)
275
+ b->flr[i]=_floor_P[ci->floor_type[i]]->
276
+ look(v,ci->floor_param[i]);
277
+
278
+ for(i=0;i<ci->residues;i++)
279
+ b->residue[i]=_residue_P[ci->residue_type[i]]->
280
+ look(v,ci->residue_param[i]);
281
+
282
+ return 0;
283
+ abort_books:
284
+ for(i=0;i<ci->books;i++){
285
+ if(ci->book_param[i]!=NULL){
286
+ vorbis_staticbook_destroy(ci->book_param[i]);
287
+ ci->book_param[i]=NULL;
288
+ }
289
+ }
290
+ vorbis_dsp_clear(v);
291
+ return -1;
292
+ }
293
+
294
+ /* arbitrary settings and spec-mandated numbers get filled in here */
295
+ int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi){
296
+ private_state *b=NULL;
297
+
298
+ if(_vds_shared_init(v,vi,1))return 1;
299
+ b=v->backend_state;
300
+ b->psy_g_look=_vp_global_look(vi);
301
+
302
+ /* Initialize the envelope state storage */
303
+ b->ve=_ogg_calloc(1,sizeof(*b->ve));
304
+ _ve_envelope_init(b->ve,vi);
305
+
306
+ vorbis_bitrate_init(vi,&b->bms);
307
+
308
+ /* compressed audio packets start after the headers
309
+ with sequence number 3 */
310
+ v->sequence=3;
311
+
312
+ return(0);
313
+ }
314
+
315
+ void vorbis_dsp_clear(vorbis_dsp_state *v){
316
+ int i;
317
+ if(v){
318
+ vorbis_info *vi=v->vi;
319
+ codec_setup_info *ci=(vi?vi->codec_setup:NULL);
320
+ private_state *b=v->backend_state;
321
+
322
+ if(b){
323
+
324
+ if(b->ve){
325
+ _ve_envelope_clear(b->ve);
326
+ _ogg_free(b->ve);
327
+ }
328
+
329
+ if(b->transform[0]){
330
+ mdct_clear(b->transform[0][0]);
331
+ _ogg_free(b->transform[0][0]);
332
+ _ogg_free(b->transform[0]);
333
+ }
334
+ if(b->transform[1]){
335
+ mdct_clear(b->transform[1][0]);
336
+ _ogg_free(b->transform[1][0]);
337
+ _ogg_free(b->transform[1]);
338
+ }
339
+
340
+ if(b->flr){
341
+ if(ci)
342
+ for(i=0;i<ci->floors;i++)
343
+ _floor_P[ci->floor_type[i]]->
344
+ free_look(b->flr[i]);
345
+ _ogg_free(b->flr);
346
+ }
347
+ if(b->residue){
348
+ if(ci)
349
+ for(i=0;i<ci->residues;i++)
350
+ _residue_P[ci->residue_type[i]]->
351
+ free_look(b->residue[i]);
352
+ _ogg_free(b->residue);
353
+ }
354
+ if(b->psy){
355
+ if(ci)
356
+ for(i=0;i<ci->psys;i++)
357
+ _vp_psy_clear(b->psy+i);
358
+ _ogg_free(b->psy);
359
+ }
360
+
361
+ if(b->psy_g_look)_vp_global_free(b->psy_g_look);
362
+ vorbis_bitrate_clear(&b->bms);
363
+
364
+ drft_clear(&b->fft_look[0]);
365
+ drft_clear(&b->fft_look[1]);
366
+
367
+ }
368
+
369
+ if(v->pcm){
370
+ if(vi)
371
+ for(i=0;i<vi->channels;i++)
372
+ if(v->pcm[i])_ogg_free(v->pcm[i]);
373
+ _ogg_free(v->pcm);
374
+ if(v->pcmret)_ogg_free(v->pcmret);
375
+ }
376
+
377
+ if(b){
378
+ /* free header, header1, header2 */
379
+ if(b->header)_ogg_free(b->header);
380
+ if(b->header1)_ogg_free(b->header1);
381
+ if(b->header2)_ogg_free(b->header2);
382
+ _ogg_free(b);
383
+ }
384
+
385
+ memset(v,0,sizeof(*v));
386
+ }
387
+ }
388
+
389
+ float **vorbis_analysis_buffer(vorbis_dsp_state *v, int vals){
390
+ int i;
391
+ vorbis_info *vi=v->vi;
392
+ private_state *b=v->backend_state;
393
+
394
+ /* free header, header1, header2 */
395
+ if(b->header)_ogg_free(b->header);b->header=NULL;
396
+ if(b->header1)_ogg_free(b->header1);b->header1=NULL;
397
+ if(b->header2)_ogg_free(b->header2);b->header2=NULL;
398
+
399
+ /* Do we have enough storage space for the requested buffer? If not,
400
+ expand the PCM (and envelope) storage */
401
+
402
+ if(v->pcm_current+vals>=v->pcm_storage){
403
+ v->pcm_storage=v->pcm_current+vals*2;
404
+
405
+ for(i=0;i<vi->channels;i++){
406
+ v->pcm[i]=_ogg_realloc(v->pcm[i],v->pcm_storage*sizeof(*v->pcm[i]));
407
+ }
408
+ }
409
+
410
+ for(i=0;i<vi->channels;i++)
411
+ v->pcmret[i]=v->pcm[i]+v->pcm_current;
412
+
413
+ return(v->pcmret);
414
+ }
415
+
416
+ static void _preextrapolate_helper(vorbis_dsp_state *v){
417
+ int i;
418
+ int order=16;
419
+ float *lpc=alloca(order*sizeof(*lpc));
420
+ float *work=alloca(v->pcm_current*sizeof(*work));
421
+ long j;
422
+ v->preextrapolate=1;
423
+
424
+ if(v->pcm_current-v->centerW>order*2){ /* safety */
425
+ for(i=0;i<v->vi->channels;i++){
426
+ /* need to run the extrapolation in reverse! */
427
+ for(j=0;j<v->pcm_current;j++)
428
+ work[j]=v->pcm[i][v->pcm_current-j-1];
429
+
430
+ /* prime as above */
431
+ vorbis_lpc_from_data(work,lpc,v->pcm_current-v->centerW,order);
432
+
433
+ #if 0
434
+ if(v->vi->channels==2){
435
+ if(i==0)
436
+ _analysis_output("predataL",0,work,v->pcm_current-v->centerW,0,0,0);
437
+ else
438
+ _analysis_output("predataR",0,work,v->pcm_current-v->centerW,0,0,0);
439
+ }else{
440
+ _analysis_output("predata",0,work,v->pcm_current-v->centerW,0,0,0);
441
+ }
442
+ #endif
443
+
444
+ /* run the predictor filter */
445
+ vorbis_lpc_predict(lpc,work+v->pcm_current-v->centerW-order,
446
+ order,
447
+ work+v->pcm_current-v->centerW,
448
+ v->centerW);
449
+
450
+ for(j=0;j<v->pcm_current;j++)
451
+ v->pcm[i][v->pcm_current-j-1]=work[j];
452
+
453
+ }
454
+ }
455
+ }
456
+
457
+
458
+ /* call with val<=0 to set eof */
459
+
460
+ int vorbis_analysis_wrote(vorbis_dsp_state *v, int vals){
461
+ vorbis_info *vi=v->vi;
462
+ codec_setup_info *ci=vi->codec_setup;
463
+
464
+ if(vals<=0){
465
+ int order=32;
466
+ int i;
467
+ float *lpc=alloca(order*sizeof(*lpc));
468
+
469
+ /* if it wasn't done earlier (very short sample) */
470
+ if(!v->preextrapolate)
471
+ _preextrapolate_helper(v);
472
+
473
+ /* We're encoding the end of the stream. Just make sure we have
474
+ [at least] a few full blocks of zeroes at the end. */
475
+ /* actually, we don't want zeroes; that could drop a large
476
+ amplitude off a cliff, creating spread spectrum noise that will
477
+ suck to encode. Extrapolate for the sake of cleanliness. */
478
+
479
+ vorbis_analysis_buffer(v,ci->blocksizes[1]*3);
480
+ v->eofflag=v->pcm_current;
481
+ v->pcm_current+=ci->blocksizes[1]*3;
482
+
483
+ for(i=0;i<vi->channels;i++){
484
+ if(v->eofflag>order*2){
485
+ /* extrapolate with LPC to fill in */
486
+ long n;
487
+
488
+ /* make a predictor filter */
489
+ n=v->eofflag;
490
+ if(n>ci->blocksizes[1])n=ci->blocksizes[1];
491
+ vorbis_lpc_from_data(v->pcm[i]+v->eofflag-n,lpc,n,order);
492
+
493
+ /* run the predictor filter */
494
+ vorbis_lpc_predict(lpc,v->pcm[i]+v->eofflag-order,order,
495
+ v->pcm[i]+v->eofflag,v->pcm_current-v->eofflag);
496
+ }else{
497
+ /* not enough data to extrapolate (unlikely to happen due to
498
+ guarding the overlap, but bulletproof in case that
499
+ assumtion goes away). zeroes will do. */
500
+ memset(v->pcm[i]+v->eofflag,0,
501
+ (v->pcm_current-v->eofflag)*sizeof(*v->pcm[i]));
502
+
503
+ }
504
+ }
505
+ }else{
506
+
507
+ if(v->pcm_current+vals>v->pcm_storage)
508
+ return(OV_EINVAL);
509
+
510
+ v->pcm_current+=vals;
511
+
512
+ /* we may want to reverse extrapolate the beginning of a stream
513
+ too... in case we're beginning on a cliff! */
514
+ /* clumsy, but simple. It only runs once, so simple is good. */
515
+ if(!v->preextrapolate && v->pcm_current-v->centerW>ci->blocksizes[1])
516
+ _preextrapolate_helper(v);
517
+
518
+ }
519
+ return(0);
520
+ }
521
+
522
+ /* do the deltas, envelope shaping, pre-echo and determine the size of
523
+ the next block on which to continue analysis */
524
+ int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb){
525
+ int i;
526
+ vorbis_info *vi=v->vi;
527
+ codec_setup_info *ci=vi->codec_setup;
528
+ private_state *b=v->backend_state;
529
+ vorbis_look_psy_global *g=b->psy_g_look;
530
+ long beginW=v->centerW-ci->blocksizes[v->W]/2,centerNext;
531
+ vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal;
532
+
533
+ /* check to see if we're started... */
534
+ if(!v->preextrapolate)return(0);
535
+
536
+ /* check to see if we're done... */
537
+ if(v->eofflag==-1)return(0);
538
+
539
+ /* By our invariant, we have lW, W and centerW set. Search for
540
+ the next boundary so we can determine nW (the next window size)
541
+ which lets us compute the shape of the current block's window */
542
+
543
+ /* we do an envelope search even on a single blocksize; we may still
544
+ be throwing more bits at impulses, and envelope search handles
545
+ marking impulses too. */
546
+ {
547
+ long bp=_ve_envelope_search(v);
548
+ if(bp==-1){
549
+
550
+ if(v->eofflag==0)return(0); /* not enough data currently to search for a
551
+ full long block */
552
+ v->nW=0;
553
+ }else{
554
+
555
+ if(ci->blocksizes[0]==ci->blocksizes[1])
556
+ v->nW=0;
557
+ else
558
+ v->nW=bp;
559
+ }
560
+ }
561
+
562
+ centerNext=v->centerW+ci->blocksizes[v->W]/4+ci->blocksizes[v->nW]/4;
563
+
564
+ {
565
+ /* center of next block + next block maximum right side. */
566
+
567
+ long blockbound=centerNext+ci->blocksizes[v->nW]/2;
568
+ if(v->pcm_current<blockbound)return(0); /* not enough data yet;
569
+ although this check is
570
+ less strict that the
571
+ _ve_envelope_search,
572
+ the search is not run
573
+ if we only use one
574
+ block size */
575
+
576
+
577
+ }
578
+
579
+ /* fill in the block. Note that for a short window, lW and nW are *short*
580
+ regardless of actual settings in the stream */
581
+
582
+ _vorbis_block_ripcord(vb);
583
+ vb->lW=v->lW;
584
+ vb->W=v->W;
585
+ vb->nW=v->nW;
586
+
587
+ if(v->W){
588
+ if(!v->lW || !v->nW){
589
+ vbi->blocktype=BLOCKTYPE_TRANSITION;
590
+ /*fprintf(stderr,"-");*/
591
+ }else{
592
+ vbi->blocktype=BLOCKTYPE_LONG;
593
+ /*fprintf(stderr,"_");*/
594
+ }
595
+ }else{
596
+ if(_ve_envelope_mark(v)){
597
+ vbi->blocktype=BLOCKTYPE_IMPULSE;
598
+ /*fprintf(stderr,"|");*/
599
+
600
+ }else{
601
+ vbi->blocktype=BLOCKTYPE_PADDING;
602
+ /*fprintf(stderr,".");*/
603
+
604
+ }
605
+ }
606
+
607
+ vb->vd=v;
608
+ vb->sequence=v->sequence++;
609
+ vb->granulepos=v->granulepos;
610
+ vb->pcmend=ci->blocksizes[v->W];
611
+
612
+ /* copy the vectors; this uses the local storage in vb */
613
+
614
+ /* this tracks 'strongest peak' for later psychoacoustics */
615
+ /* moved to the global psy state; clean this mess up */
616
+ if(vbi->ampmax>g->ampmax)g->ampmax=vbi->ampmax;
617
+ g->ampmax=_vp_ampmax_decay(g->ampmax,v);
618
+ vbi->ampmax=g->ampmax;
619
+
620
+ vb->pcm=_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels);
621
+ vbi->pcmdelay=_vorbis_block_alloc(vb,sizeof(*vbi->pcmdelay)*vi->channels);
622
+ for(i=0;i<vi->channels;i++){
623
+ vbi->pcmdelay[i]=
624
+ _vorbis_block_alloc(vb,(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i]));
625
+ memcpy(vbi->pcmdelay[i],v->pcm[i],(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i]));
626
+ vb->pcm[i]=vbi->pcmdelay[i]+beginW;
627
+
628
+ /* before we added the delay
629
+ vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i]));
630
+ memcpy(vb->pcm[i],v->pcm[i]+beginW,ci->blocksizes[v->W]*sizeof(*vb->pcm[i]));
631
+ */
632
+
633
+ }
634
+
635
+ /* handle eof detection: eof==0 means that we've not yet received EOF
636
+ eof>0 marks the last 'real' sample in pcm[]
637
+ eof<0 'no more to do'; doesn't get here */
638
+
639
+ if(v->eofflag){
640
+ if(v->centerW>=v->eofflag){
641
+ v->eofflag=-1;
642
+ vb->eofflag=1;
643
+ return(1);
644
+ }
645
+ }
646
+
647
+ /* advance storage vectors and clean up */
648
+ {
649
+ int new_centerNext=ci->blocksizes[1]/2;
650
+ int movementW=centerNext-new_centerNext;
651
+
652
+ if(movementW>0){
653
+
654
+ _ve_envelope_shift(b->ve,movementW);
655
+ v->pcm_current-=movementW;
656
+
657
+ for(i=0;i<vi->channels;i++)
658
+ memmove(v->pcm[i],v->pcm[i]+movementW,
659
+ v->pcm_current*sizeof(*v->pcm[i]));
660
+
661
+
662
+ v->lW=v->W;
663
+ v->W=v->nW;
664
+ v->centerW=new_centerNext;
665
+
666
+ if(v->eofflag){
667
+ v->eofflag-=movementW;
668
+ if(v->eofflag<=0)v->eofflag=-1;
669
+ /* do not add padding to end of stream! */
670
+ if(v->centerW>=v->eofflag){
671
+ v->granulepos+=movementW-(v->centerW-v->eofflag);
672
+ }else{
673
+ v->granulepos+=movementW;
674
+ }
675
+ }else{
676
+ v->granulepos+=movementW;
677
+ }
678
+ }
679
+ }
680
+
681
+ /* done */
682
+ return(1);
683
+ }
684
+
685
+ int vorbis_synthesis_restart(vorbis_dsp_state *v){
686
+ vorbis_info *vi=v->vi;
687
+ codec_setup_info *ci;
688
+ int hs;
689
+
690
+ if(!v->backend_state)return -1;
691
+ if(!vi)return -1;
692
+ ci=vi->codec_setup;
693
+ if(!ci)return -1;
694
+ hs=ci->halfrate_flag;
695
+
696
+ v->centerW=ci->blocksizes[1]>>(hs+1);
697
+ v->pcm_current=v->centerW>>hs;
698
+
699
+ v->pcm_returned=-1;
700
+ v->granulepos=-1;
701
+ v->sequence=-1;
702
+ v->eofflag=0;
703
+ ((private_state *)(v->backend_state))->sample_count=-1;
704
+
705
+ return(0);
706
+ }
707
+
708
+ int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){
709
+ if(_vds_shared_init(v,vi,0)){
710
+ vorbis_dsp_clear(v);
711
+ return 1;
712
+ }
713
+ vorbis_synthesis_restart(v);
714
+ return 0;
715
+ }
716
+
717
+ /* Unlike in analysis, the window is only partially applied for each
718
+ block. The time domain envelope is not yet handled at the point of
719
+ calling (as it relies on the previous block). */
720
+
721
+ int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){
722
+ vorbis_info *vi=v->vi;
723
+ codec_setup_info *ci=vi->codec_setup;
724
+ private_state *b=v->backend_state;
725
+ int hs=ci->halfrate_flag;
726
+ int i,j;
727
+
728
+ if(!vb)return(OV_EINVAL);
729
+ if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL);
730
+
731
+ v->lW=v->W;
732
+ v->W=vb->W;
733
+ v->nW=-1;
734
+
735
+ if((v->sequence==-1)||
736
+ (v->sequence+1 != vb->sequence)){
737
+ v->granulepos=-1; /* out of sequence; lose count */
738
+ b->sample_count=-1;
739
+ }
740
+
741
+ v->sequence=vb->sequence;
742
+
743
+ if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly
744
+ was called on block */
745
+ int n=ci->blocksizes[v->W]>>(hs+1);
746
+ int n0=ci->blocksizes[0]>>(hs+1);
747
+ int n1=ci->blocksizes[1]>>(hs+1);
748
+
749
+ int thisCenter;
750
+ int prevCenter;
751
+
752
+ v->glue_bits+=vb->glue_bits;
753
+ v->time_bits+=vb->time_bits;
754
+ v->floor_bits+=vb->floor_bits;
755
+ v->res_bits+=vb->res_bits;
756
+
757
+ if(v->centerW){
758
+ thisCenter=n1;
759
+ prevCenter=0;
760
+ }else{
761
+ thisCenter=0;
762
+ prevCenter=n1;
763
+ }
764
+
765
+ /* v->pcm is now used like a two-stage double buffer. We don't want
766
+ to have to constantly shift *or* adjust memory usage. Don't
767
+ accept a new block until the old is shifted out */
768
+
769
+ for(j=0;j<vi->channels;j++){
770
+ /* the overlap/add section */
771
+ if(v->lW){
772
+ if(v->W){
773
+ /* large/large */
774
+ float *w=_vorbis_window_get(b->window[1]-hs);
775
+ float *pcm=v->pcm[j]+prevCenter;
776
+ float *p=vb->pcm[j];
777
+ for(i=0;i<n1;i++)
778
+ pcm[i]=pcm[i]*w[n1-i-1] + p[i]*w[i];
779
+ }else{
780
+ /* large/small */
781
+ float *w=_vorbis_window_get(b->window[0]-hs);
782
+ float *pcm=v->pcm[j]+prevCenter+n1/2-n0/2;
783
+ float *p=vb->pcm[j];
784
+ for(i=0;i<n0;i++)
785
+ pcm[i]=pcm[i]*w[n0-i-1] +p[i]*w[i];
786
+ }
787
+ }else{
788
+ if(v->W){
789
+ /* small/large */
790
+ float *w=_vorbis_window_get(b->window[0]-hs);
791
+ float *pcm=v->pcm[j]+prevCenter;
792
+ float *p=vb->pcm[j]+n1/2-n0/2;
793
+ for(i=0;i<n0;i++)
794
+ pcm[i]=pcm[i]*w[n0-i-1] +p[i]*w[i];
795
+ for(;i<n1/2+n0/2;i++)
796
+ pcm[i]=p[i];
797
+ }else{
798
+ /* small/small */
799
+ float *w=_vorbis_window_get(b->window[0]-hs);
800
+ float *pcm=v->pcm[j]+prevCenter;
801
+ float *p=vb->pcm[j];
802
+ for(i=0;i<n0;i++)
803
+ pcm[i]=pcm[i]*w[n0-i-1] +p[i]*w[i];
804
+ }
805
+ }
806
+
807
+ /* the copy section */
808
+ {
809
+ float *pcm=v->pcm[j]+thisCenter;
810
+ float *p=vb->pcm[j]+n;
811
+ for(i=0;i<n;i++)
812
+ pcm[i]=p[i];
813
+ }
814
+ }
815
+
816
+ if(v->centerW)
817
+ v->centerW=0;
818
+ else
819
+ v->centerW=n1;
820
+
821
+ /* deal with initial packet state; we do this using the explicit
822
+ pcm_returned==-1 flag otherwise we're sensitive to first block
823
+ being short or long */
824
+
825
+ if(v->pcm_returned==-1){
826
+ v->pcm_returned=thisCenter;
827
+ v->pcm_current=thisCenter;
828
+ }else{
829
+ v->pcm_returned=prevCenter;
830
+ v->pcm_current=prevCenter+
831
+ ((ci->blocksizes[v->lW]/4+
832
+ ci->blocksizes[v->W]/4)>>hs);
833
+ }
834
+
835
+ }
836
+
837
+ /* track the frame number... This is for convenience, but also
838
+ making sure our last packet doesn't end with added padding. If
839
+ the last packet is partial, the number of samples we'll have to
840
+ return will be past the vb->granulepos.
841
+
842
+ This is not foolproof! It will be confused if we begin
843
+ decoding at the last page after a seek or hole. In that case,
844
+ we don't have a starting point to judge where the last frame
845
+ is. For this reason, vorbisfile will always try to make sure
846
+ it reads the last two marked pages in proper sequence */
847
+
848
+ if(b->sample_count==-1){
849
+ b->sample_count=0;
850
+ }else{
851
+ b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4;
852
+ }
853
+
854
+ if(v->granulepos==-1){
855
+ if(vb->granulepos!=-1){ /* only set if we have a position to set to */
856
+
857
+ v->granulepos=vb->granulepos;
858
+
859
+ /* is this a short page? */
860
+ if(b->sample_count>v->granulepos){
861
+ /* corner case; if this is both the first and last audio page,
862
+ then spec says the end is cut, not beginning */
863
+ long extra=b->sample_count-vb->granulepos;
864
+
865
+ /* we use ogg_int64_t for granule positions because a
866
+ uint64 isn't universally available. Unfortunately,
867
+ that means granposes can be 'negative' and result in
868
+ extra being negative */
869
+ if(extra<0)
870
+ extra=0;
871
+
872
+ if(vb->eofflag){
873
+ /* trim the end */
874
+ /* no preceding granulepos; assume we started at zero (we'd
875
+ have to in a short single-page stream) */
876
+ /* granulepos could be -1 due to a seek, but that would result
877
+ in a long count, not short count */
878
+
879
+ /* Guard against corrupt/malicious frames that set EOP and
880
+ a backdated granpos; don't rewind more samples than we
881
+ actually have */
882
+ if(extra > (v->pcm_current - v->pcm_returned)<<hs)
883
+ extra = (v->pcm_current - v->pcm_returned)<<hs;
884
+
885
+ v->pcm_current-=extra>>hs;
886
+ }else{
887
+ /* trim the beginning */
888
+ v->pcm_returned+=extra>>hs;
889
+ if(v->pcm_returned>v->pcm_current)
890
+ v->pcm_returned=v->pcm_current;
891
+ }
892
+
893
+ }
894
+
895
+ }
896
+ }else{
897
+ v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4;
898
+ if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){
899
+
900
+ if(v->granulepos>vb->granulepos){
901
+ long extra=v->granulepos-vb->granulepos;
902
+
903
+ if(extra)
904
+ if(vb->eofflag){
905
+ /* partial last frame. Strip the extra samples off */
906
+
907
+ /* Guard against corrupt/malicious frames that set EOP and
908
+ a backdated granpos; don't rewind more samples than we
909
+ actually have */
910
+ if(extra > (v->pcm_current - v->pcm_returned)<<hs)
911
+ extra = (v->pcm_current - v->pcm_returned)<<hs;
912
+
913
+ /* we use ogg_int64_t for granule positions because a
914
+ uint64 isn't universally available. Unfortunately,
915
+ that means granposes can be 'negative' and result in
916
+ extra being negative */
917
+ if(extra<0)
918
+ extra=0;
919
+
920
+ v->pcm_current-=extra>>hs;
921
+ } /* else {Shouldn't happen *unless* the bitstream is out of
922
+ spec. Either way, believe the bitstream } */
923
+ } /* else {Shouldn't happen *unless* the bitstream is out of
924
+ spec. Either way, believe the bitstream } */
925
+ v->granulepos=vb->granulepos;
926
+ }
927
+ }
928
+
929
+ /* Update, cleanup */
930
+
931
+ if(vb->eofflag)v->eofflag=1;
932
+ return(0);
933
+
934
+ }
935
+
936
+ /* pcm==NULL indicates we just want the pending samples, no more */
937
+ int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm){
938
+ vorbis_info *vi=v->vi;
939
+
940
+ if(v->pcm_returned>-1 && v->pcm_returned<v->pcm_current){
941
+ if(pcm){
942
+ int i;
943
+ for(i=0;i<vi->channels;i++)
944
+ v->pcmret[i]=v->pcm[i]+v->pcm_returned;
945
+ *pcm=v->pcmret;
946
+ }
947
+ return(v->pcm_current-v->pcm_returned);
948
+ }
949
+ return(0);
950
+ }
951
+
952
+ int vorbis_synthesis_read(vorbis_dsp_state *v,int n){
953
+ if(n && v->pcm_returned+n>v->pcm_current)return(OV_EINVAL);
954
+ v->pcm_returned+=n;
955
+ return(0);
956
+ }
957
+
958
+ /* intended for use with a specific vorbisfile feature; we want access
959
+ to the [usually synthetic/postextrapolated] buffer and lapping at
960
+ the end of a decode cycle, specifically, a half-short-block worth.
961
+ This funtion works like pcmout above, except it will also expose
962
+ this implicit buffer data not normally decoded. */
963
+ int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm){
964
+ vorbis_info *vi=v->vi;
965
+ codec_setup_info *ci=vi->codec_setup;
966
+ int hs=ci->halfrate_flag;
967
+
968
+ int n=ci->blocksizes[v->W]>>(hs+1);
969
+ int n0=ci->blocksizes[0]>>(hs+1);
970
+ int n1=ci->blocksizes[1]>>(hs+1);
971
+ int i,j;
972
+
973
+ if(v->pcm_returned<0)return 0;
974
+
975
+ /* our returned data ends at pcm_returned; because the synthesis pcm
976
+ buffer is a two-fragment ring, that means our data block may be
977
+ fragmented by buffering, wrapping or a short block not filling
978
+ out a buffer. To simplify things, we unfragment if it's at all
979
+ possibly needed. Otherwise, we'd need to call lapout more than
980
+ once as well as hold additional dsp state. Opt for
981
+ simplicity. */
982
+
983
+ /* centerW was advanced by blockin; it would be the center of the
984
+ *next* block */
985
+ if(v->centerW==n1){
986
+ /* the data buffer wraps; swap the halves */
987
+ /* slow, sure, small */
988
+ for(j=0;j<vi->channels;j++){
989
+ float *p=v->pcm[j];
990
+ for(i=0;i<n1;i++){
991
+ float temp=p[i];
992
+ p[i]=p[i+n1];
993
+ p[i+n1]=temp;
994
+ }
995
+ }
996
+
997
+ v->pcm_current-=n1;
998
+ v->pcm_returned-=n1;
999
+ v->centerW=0;
1000
+ }
1001
+
1002
+ /* solidify buffer into contiguous space */
1003
+ if((v->lW^v->W)==1){
1004
+ /* long/short or short/long */
1005
+ for(j=0;j<vi->channels;j++){
1006
+ float *s=v->pcm[j];
1007
+ float *d=v->pcm[j]+(n1-n0)/2;
1008
+ for(i=(n1+n0)/2-1;i>=0;--i)
1009
+ d[i]=s[i];
1010
+ }
1011
+ v->pcm_returned+=(n1-n0)/2;
1012
+ v->pcm_current+=(n1-n0)/2;
1013
+ }else{
1014
+ if(v->lW==0){
1015
+ /* short/short */
1016
+ for(j=0;j<vi->channels;j++){
1017
+ float *s=v->pcm[j];
1018
+ float *d=v->pcm[j]+n1-n0;
1019
+ for(i=n0-1;i>=0;--i)
1020
+ d[i]=s[i];
1021
+ }
1022
+ v->pcm_returned+=n1-n0;
1023
+ v->pcm_current+=n1-n0;
1024
+ }
1025
+ }
1026
+
1027
+ if(pcm){
1028
+ int i;
1029
+ for(i=0;i<vi->channels;i++)
1030
+ v->pcmret[i]=v->pcm[i]+v->pcm_returned;
1031
+ *pcm=v->pcmret;
1032
+ }
1033
+
1034
+ return(n1+n-v->pcm_returned);
1035
+
1036
+ }
1037
+
1038
+ float *vorbis_window(vorbis_dsp_state *v,int W){
1039
+ vorbis_info *vi=v->vi;
1040
+ codec_setup_info *ci=vi->codec_setup;
1041
+ int hs=ci->halfrate_flag;
1042
+ private_state *b=v->backend_state;
1043
+
1044
+ if(b->window[W]-1<0)return NULL;
1045
+ return _vorbis_window_get(b->window[W]-hs);
1046
+ }