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,68 @@
1
+ /*
2
+ wavhead.h: wav file header, to be included twice for integer and float wavs
3
+
4
+ copyright ?-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
5
+ see COPYING and AUTHORS files in distribution or http://mpg123.org
6
+ initially written by Samuel Audet
7
+ */
8
+
9
+ struct
10
+ {
11
+ byte riffheader[4];
12
+ byte WAVElen[4]; /* should this include riffheader or not? */
13
+ struct
14
+ {
15
+ byte WAVEID[4];
16
+ byte fmtheader[4];
17
+ byte fmtlen[4];
18
+ struct
19
+ {
20
+ byte FormatTag[2];
21
+ byte Channels[2];
22
+ byte SamplesPerSec[4];
23
+ byte AvgBytesPerSec[4];
24
+ byte BlockAlign[2];
25
+ byte BitsPerSample[2]; /* format specific for PCM */
26
+ #ifdef FLOATOUT
27
+ byte cbSize[2];
28
+ #endif
29
+ } fmt;
30
+ #ifdef FLOATOUT
31
+ byte factheader[4];
32
+ byte factlen[4];
33
+ struct
34
+ {
35
+ byte samplelen[4];
36
+ } fact;
37
+ #endif
38
+ struct
39
+ {
40
+ byte dataheader[4];
41
+ byte datalen[4];
42
+ /* from here you insert your PCM data */
43
+ } data;
44
+ } WAVE;
45
+ } RIFF_NAME =
46
+ {
47
+ { 'R','I','F','F' } ,
48
+ { sizeof(RIFF_NAME.WAVE),0,0,0 } ,
49
+ {
50
+ { 'W','A','V','E' },
51
+ { 'f','m','t',' ' },
52
+ { sizeof(RIFF_NAME.WAVE.fmt),0,0,0 } ,
53
+ {
54
+ {WAVE_FORMAT,0} , {0,0},{0,0,0,0},{0,0,0,0},{0,0},{0,0}
55
+ #ifdef FLOATOUT
56
+ ,{0,0}
57
+ #endif
58
+ } ,
59
+ #ifdef FLOATOUT
60
+ { 'f','a','c','t' },
61
+ { sizeof(RIFF_NAME.WAVE.fact),0,0,0 },
62
+ {
63
+ {0,0,0,0} /* to be filled later, like datalen and wavelen */
64
+ },
65
+ #endif
66
+ { { 'd','a','t','a' } , {0,0,0,0} }
67
+ }
68
+ };
@@ -0,0 +1,599 @@
1
+ #include "config.h"
2
+ #include "mpg123.h"
3
+ #include "mpg123app.h"
4
+ #include "httpget.h"
5
+ #include "debug.h"
6
+ #include "resolver.h"
7
+ #include "compat.h"
8
+ #include <errno.h>
9
+
10
+ #if defined (WANT_WIN32_SOCKETS)
11
+ #ifdef DEBUG
12
+ #define msgme(x) win32_net_msg(x,__FILE__,__LINE__)
13
+ #define msgme1 win32_net_msg(1,__FILE__,__LINE__)
14
+ #define msgme_sock_err(x) if ((x)==SOCKET_ERROR) {msgme1;}
15
+ #else
16
+ #define msgme(x) x
17
+ #define msgme1 do{} while(0)
18
+ #define msgme_sock_err(x) x
19
+ #endif
20
+ struct ws_local
21
+ {
22
+ int inited;
23
+ SOCKET local_socket; /*stores last connet in win32_net_open_connection*/
24
+ WSADATA wsadata;
25
+ };
26
+
27
+ static struct ws_local ws;
28
+ #ifdef DEBUG
29
+ static void win32_net_msg (const int err, const char * const filedata, const int linedata)
30
+ {
31
+ char *errbuff;
32
+ int lc_err;
33
+ if (err)
34
+ {
35
+ lc_err = WSAGetLastError();
36
+ FormatMessage(
37
+ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
38
+ NULL,
39
+ lc_err,
40
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
41
+ (LPTSTR) &errbuff,
42
+ 0,
43
+ NULL );
44
+ fprintf(stderr, "[%s:%d] [WSA2: %d] %s", filedata, linedata, lc_err, errbuff);
45
+ LocalFree (errbuff);
46
+ }
47
+ }
48
+ #endif
49
+
50
+ void win32_net_init (void)
51
+ {
52
+ ws.inited = 1;
53
+ switch ((WSAStartup(MAKEWORD(2,2), &ws.wsadata)))
54
+ {
55
+ case WSASYSNOTREADY: debug("WSAStartup failed with WSASYSNOTREADY"); break;
56
+ case WSAVERNOTSUPPORTED: debug("WSAStartup failed with WSAVERNOTSUPPORTED"); break;
57
+ case WSAEINPROGRESS: debug("WSAStartup failed with WSAEINPROGRESS"); break;
58
+ case WSAEPROCLIM: debug("WSAStartup failed with WSAEPROCLIM"); break;
59
+ case WSAEFAULT: debug("WSAStartup failed with WSAEFAULT"); break;
60
+ default:
61
+ break;
62
+ }
63
+ }
64
+
65
+ void win32_net_deinit (void)
66
+ {
67
+ debug("Begin winsock cleanup");
68
+ if (ws.inited)
69
+ {
70
+ if (ws.inited >= 2 && ws.local_socket != SOCKET_ERROR)
71
+ {
72
+ debug1("ws.local_socket = %"SIZE_P"", (size_p)ws.local_socket);
73
+ msgme_sock_err(shutdown(ws.local_socket, SD_BOTH));
74
+ win32_net_close(ws.local_socket);
75
+ }
76
+ WSACleanup();
77
+ ws.inited = 0;
78
+ }
79
+ }
80
+
81
+ void win32_net_close (int sock)
82
+ {
83
+ msgme_sock_err(closesocket(ws.local_socket));
84
+ }
85
+
86
+ static void win32_net_nonblock(int sock)
87
+ {
88
+ u_long mode = 1;
89
+ msgme_sock_err(ioctlsocket(ws.local_socket, FIONBIO, &mode));
90
+ }
91
+
92
+ static void win32_net_block(int sock)
93
+ {
94
+ u_long mode = 0;
95
+ msgme_sock_err(ioctlsocket(ws.local_socket, FIONBIO, &mode));
96
+ }
97
+
98
+ ssize_t win32_net_read (int fildes, void *buf, size_t nbyte)
99
+ {
100
+ debug1("Attempting to read %"SIZE_P" bytes from network.", (size_p)nbyte);
101
+ ssize_t ret;
102
+ msgme_sock_err(ret = (ssize_t) recv(ws.local_socket, buf, nbyte, 0));
103
+ debug1("Read %"SSIZE_P" bytes from network.", (ssize_p)ret);
104
+
105
+ return ret;
106
+ }
107
+
108
+ static int get_sock_ch (int sock)
109
+ {
110
+ char c;
111
+ int ret;
112
+ msgme_sock_err(ret = recv (ws.local_socket, &c, 1, 0));
113
+ if (ret == 1)
114
+ return (((int) c)&0xff);
115
+ return -1;
116
+ }
117
+ /* Addapted from from newlib*/
118
+ char *win32_net_fgets(char *s, int n, int stream)
119
+ {
120
+ char c = 0;
121
+ char *buf;
122
+ buf = s;
123
+ debug1("Pseudo net fgets attempts to read %d bytes from network.", n - 1);
124
+ while (--n > 0 && (c = get_sock_ch (stream)) != -1)
125
+ {
126
+ *s++ = c;
127
+ if (c == '\n' || c == '\r')
128
+ break;
129
+ }
130
+ debug1("Pseudo net fgets got %"SIZE_P" bytes.", (size_p)(s - buf));
131
+ if (c == -1 && s == buf)
132
+ {
133
+ debug("Pseudo net fgets met a premature end.");
134
+ return NULL;
135
+ }
136
+ *s = 0;
137
+ return buf;
138
+ }
139
+
140
+ ssize_t win32_net_write (int fildes, const void *buf, size_t nbyte)
141
+ {
142
+ debug1("Attempting to write %"SIZE_P" bytes to network.", (size_p)nbyte);
143
+ ssize_t ret;
144
+ msgme_sock_err((ret = (ssize_t) send(ws.local_socket, buf, nbyte, 0)));
145
+ debug1("wrote %"SSIZE_P" bytes to network.", (ssize_t)ret);
146
+
147
+ return ret;
148
+ }
149
+
150
+ off_t win32_net_lseek (int a, off_t b, int c)
151
+ {
152
+ debug("lseek on a socket called!");
153
+ return -1;
154
+ }
155
+
156
+ void win32_net_replace (mpg123_handle *fr)
157
+ {
158
+ debug("win32_net_replace ran");
159
+ mpg123_replace_reader(fr, win32_net_read, win32_net_lseek);
160
+ }
161
+
162
+ static int win32_net_timeout_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen)
163
+ {
164
+ debug("win32_net_timeout_connect ran");
165
+ if(param.timeout > 0)
166
+ {
167
+ int err;
168
+ win32_net_nonblock(ws.local_socket);
169
+ err = connect(ws.local_socket, serv_addr, addrlen);
170
+ if(err != SOCKET_ERROR)
171
+ {
172
+ debug("immediately successful");
173
+ win32_net_block(ws.local_socket);
174
+ return 0;
175
+ }
176
+ else if(WSAGetLastError() == WSAEWOULDBLOCK) /*WSAEINPROGRESS would not work here for some reason*/
177
+ {
178
+ struct timeval tv;
179
+ fd_set fds;
180
+ tv.tv_sec = param.timeout;
181
+ tv.tv_usec = 0;
182
+
183
+ debug("in progress, waiting...");
184
+
185
+ FD_ZERO(&fds);
186
+ FD_SET(ws.local_socket, &fds);
187
+ err = select(ws.local_socket+1, NULL, &fds, NULL, &tv);
188
+ if(err != SOCKET_ERROR)
189
+ {
190
+ socklen_t len = sizeof(err);
191
+ if((getsockopt(ws.local_socket, SOL_SOCKET, SO_ERROR, (char *)&err, &len) != SOCKET_ERROR)
192
+ && (err == 0) )
193
+ {
194
+ debug("non-blocking connect has been successful");
195
+ win32_net_block(ws.local_socket);
196
+ return 0;
197
+ }
198
+ else
199
+ {
200
+ //error1("connection error: %s", msgme(err));
201
+ return -1;
202
+ }
203
+ }
204
+ else if(err == 0)
205
+ {
206
+ error("connection timed out");
207
+ return -1;
208
+ }
209
+ else
210
+ {
211
+ /*error1("error from select(): %s", strerror(errno));*/
212
+ debug("error from select():");
213
+ msgme1;
214
+ return -1;
215
+ }
216
+ }
217
+ else
218
+ {
219
+ /*error1("connection failed: %s", strerror(errno));*/
220
+ debug("connection failed: ");
221
+ msgme1;
222
+ return err;
223
+ }
224
+ }
225
+ else
226
+ {
227
+ if(connect(ws.local_socket, serv_addr, addrlen) == SOCKET_ERROR)
228
+ {
229
+ /*error1("connecton failed: %s", strerror(errno));*/
230
+ debug("connecton failed");
231
+ msgme1;
232
+ return -1;
233
+ }
234
+ else {
235
+ debug("win32_net_timeout_connect succeed");
236
+ return 0; /* _good_ */
237
+ }
238
+ }
239
+ }
240
+
241
+ static int win32_net_open_connection(mpg123_string *host, mpg123_string *port)
242
+ {
243
+ struct addrinfo hints;
244
+ struct addrinfo *addr, *addrlist;
245
+ SOCKET addrcount;
246
+ ws.local_socket = SOCKET_ERROR;
247
+
248
+ if(param.verbose>1) fprintf(stderr, "Note: Attempting new-style connection to %s\n", host->p);
249
+ memset(&hints, 0, sizeof(struct addrinfo));
250
+ hints.ai_family = AF_UNSPEC; /* We accept both IPv4 and IPv6 ... and perhaps IPv8;-) */
251
+ hints.ai_socktype = SOCK_STREAM;
252
+ hints.ai_protocol = IPPROTO_TCP;
253
+
254
+ debug2("Atempt resolve/connect to %s:%s", host->p, port->p);
255
+ msgme(addrcount = getaddrinfo(host->p, port->p, &hints, &addrlist));
256
+
257
+ if(addrcount == INVALID_SOCKET)
258
+ {
259
+ error3("Resolving %s:%s: %s", host->p, port->p, gai_strerror(addrcount));
260
+ return -1;
261
+ }
262
+
263
+ addr = addrlist;
264
+ while(addr != NULL)
265
+ {
266
+ ws.local_socket = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
267
+ if (ws.local_socket == INVALID_SOCKET)
268
+ {
269
+ msgme1;
270
+ }
271
+ else
272
+ {
273
+ if(win32_net_timeout_connect(ws.local_socket, addr->ai_addr, addr->ai_addrlen) == 0)
274
+ break;
275
+ debug("win32_net_timeout_connect error, closing socket");
276
+ win32_net_close(ws.local_socket);
277
+ ws.local_socket=SOCKET_ERROR;
278
+ }
279
+ addr=addr->ai_next;
280
+ }
281
+ if(ws.local_socket == SOCKET_ERROR) {error2("Cannot resolve/connect to %s:%s!", host->p, port->p);}
282
+ else
283
+ {
284
+ ws.inited = 2;
285
+ }
286
+
287
+ freeaddrinfo(addrlist);
288
+ return 1;
289
+ }
290
+
291
+ static size_t win32_net_readstring (mpg123_string *string, size_t maxlen, FILE *f)
292
+ {
293
+ debug2("Attempting readstring on %d for %"SIZE_P" bytes", f ? fileno(f) : -1, (size_p)maxlen);
294
+ int err;
295
+ string->fill = 0;
296
+ while(maxlen == 0 || string->fill < maxlen)
297
+ {
298
+ if(string->size-string->fill < 1)
299
+ if(!mpg123_grow_string(string, string->fill+4096))
300
+ {
301
+ error("Cannot allocate memory for reading.");
302
+ string->fill = 0;
303
+ return 0;
304
+ }
305
+ err = win32_net_read(0,string->p+string->fill,1); /*fd is ignored */
306
+ /* Whoa... reading one byte at a time... one could ensure the line break in another way, but more work. */
307
+ if( err == 1)
308
+ {
309
+ string->fill++;
310
+ if(string->p[string->fill-1] == '\n') break;
311
+ }
312
+ else if(errno != EINTR)
313
+ {
314
+ error("Error reading from socket or unexpected EOF.");
315
+ string->fill = 0;
316
+ /* bail out to prevent endless loop */
317
+ return 0;
318
+ }
319
+ }
320
+
321
+ if(!mpg123_grow_string(string, string->fill+1))
322
+ {
323
+ string->fill=0;
324
+ }
325
+ else
326
+ {
327
+ string->p[string->fill] = 0;
328
+ string->fill++;
329
+ }
330
+ return string->fill;
331
+ }
332
+
333
+ static int win32_net_writestring (int fd, mpg123_string *string)
334
+ {
335
+ size_t result, bytes;
336
+ char *ptr = string->p;
337
+ bytes = string->fill ? string->fill-1 : 0;
338
+
339
+ while(bytes)
340
+ {
341
+ result = win32_net_write(ws.local_socket, ptr, bytes);
342
+ if(result < 0 && WSAGetLastError() != WSAEINTR)
343
+ {
344
+ perror ("writing http string");
345
+ return FALSE;
346
+ }
347
+ else if(result == 0)
348
+ {
349
+ error("write: socket closed unexpectedly");
350
+ return FALSE;
351
+ }
352
+ ptr += result;
353
+ bytes -= result;
354
+ }
355
+ return TRUE;
356
+ }
357
+
358
+ static int win32_net_resolve_redirect(mpg123_string *response, mpg123_string *request_url, mpg123_string *purl)
359
+ {
360
+ debug1("request_url:%s", request_url->p);
361
+ /* initialized with full old url */
362
+ if(!mpg123_copy_string(request_url, purl)) return FALSE;
363
+
364
+ /* We may strip it down to a prefix ot totally. */
365
+ if(strncasecmp(response->p, "Location: http://", 17))
366
+ { /* OK, only partial strip, need prefix for relative path. */
367
+ char* ptmp = NULL;
368
+ /* though it's not RFC (?), accept relative URIs as wget does */
369
+ fprintf(stderr, "NOTE: no complete URL in redirect, constructing one\n");
370
+ /* not absolute uri, could still be server-absolute */
371
+ /* I prepend a part of the request... out of the request */
372
+ if(response->p[10] == '/')
373
+ {
374
+ /* only prepend http://server/ */
375
+ /* I null the first / after http:// */
376
+ ptmp = strchr(purl->p+7,'/');
377
+ if(ptmp != NULL){ purl->fill = ptmp-purl->p+1; purl->p[purl->fill-1] = 0; }
378
+ }
379
+ else
380
+ {
381
+ /* prepend http://server/path/ */
382
+ /* now we want the last / */
383
+ ptmp = strrchr(purl->p+7, '/');
384
+ if(ptmp != NULL){ purl->fill = ptmp-purl->p+2; purl->p[purl->fill-1] = 0; }
385
+ }
386
+ }
387
+ else purl->fill = 0;
388
+
389
+ debug1("prefix=%s", purl->fill ? purl->p : "");
390
+ if(!mpg123_add_string(purl, response->p+10)) return FALSE;
391
+
392
+ debug1(" purl: %s", purl->p);
393
+ debug1("old request_url: %s", request_url->p);
394
+
395
+ return TRUE;
396
+ }
397
+
398
+ int win32_net_http_open(char* url, struct httpdata *hd)
399
+ {
400
+ mpg123_string purl, host, port, path;
401
+ mpg123_string request, response, request_url;
402
+ mpg123_string httpauth1;
403
+ ws.local_socket = SOCKET_ERROR;
404
+ int oom = 0;
405
+ int relocate, numrelocs = 0;
406
+ int got_location = FALSE;
407
+ /*
408
+ workaround for http://www.global24music.com/rautemusik/files/extreme/isdn.pls
409
+ this site's apache gives me a relocation to the same place when I give the port in Host request field
410
+ for the record: Apache/2.0.51 (Fedora)
411
+ */
412
+ int try_without_port = 0;
413
+ mpg123_init_string(&purl);
414
+ mpg123_init_string(&host);
415
+ mpg123_init_string(&port);
416
+ mpg123_init_string(&path);
417
+ mpg123_init_string(&request);
418
+ mpg123_init_string(&response);
419
+ mpg123_init_string(&request_url);
420
+ mpg123_init_string(&httpauth1);
421
+
422
+ /* Get initial info for proxy server. Once. */
423
+ if(hd->proxystate == PROXY_UNKNOWN && !proxy_init(hd)) goto exit;
424
+
425
+ if(!translate_url(url, &purl)){ oom=1; goto exit; }
426
+
427
+ /* Don't confuse the different auth strings... */
428
+ if(!split_url(&purl, &httpauth1, NULL, NULL, NULL) ){ oom=1; goto exit; }
429
+
430
+ /* "GET http://" 11
431
+ * " HTTP/1.0\r\nUser-Agent: <PACKAGE_NAME>/<PACKAGE_VERSION>\r\n"
432
+ * 26 + PACKAGE_NAME + PACKAGE_VERSION
433
+ * accept header + accept_length()
434
+ * "Authorization: Basic \r\n" 23
435
+ * "\r\n" 2
436
+ * ... plus the other predefined header lines
437
+ */
438
+ /* Just use this estimate as first guess to reduce malloc calls in string library. */
439
+ {
440
+ size_t length_estimate = 62 + strlen(PACKAGE_NAME) + strlen(PACKAGE_VERSION)
441
+ + accept_length() + strlen(CONN_HEAD) + strlen(icy_yes) + purl.fill;
442
+ if( !mpg123_grow_string(&request, length_estimate)
443
+ || !mpg123_grow_string(&response,4096) )
444
+ {
445
+ oom=1; goto exit;
446
+ }
447
+ }
448
+
449
+ do
450
+ {
451
+ /* Storing the request url, with http:// prepended if needed. */
452
+ /* used to be url here... seemed wrong to me (when loop advanced...) */
453
+ if(strncasecmp(purl.p, "http://", 7) != 0) mpg123_set_string(&request_url, "http://");
454
+ else mpg123_set_string(&request_url, "");
455
+
456
+ mpg123_add_string(&request_url, purl.p);
457
+
458
+ if (hd->proxystate >= PROXY_HOST)
459
+ {
460
+ /* We will connect to proxy, full URL goes into the request. */
461
+ if( !mpg123_copy_string(&hd->proxyhost, &host)
462
+ || !mpg123_copy_string(&hd->proxyport, &port)
463
+ || !mpg123_set_string(&request, "GET ")
464
+ || !mpg123_add_string(&request, request_url.p) )
465
+ {
466
+ oom=1; goto exit;
467
+ }
468
+ }
469
+ else
470
+ {
471
+ /* We will connect to the host from the URL and only the path goes into the request. */
472
+ if(!split_url(&purl, NULL, &host, &port, &path)){ oom=1; goto exit; }
473
+ if( !mpg123_set_string(&request, "GET ")
474
+ || !mpg123_add_string(&request, path.p) )
475
+ {
476
+ oom=1; goto exit;
477
+ }
478
+ }
479
+
480
+ if(!fill_request(&request, &host, &port, &httpauth1, &try_without_port)){ oom=1; goto exit; }
481
+
482
+ httpauth1.fill = 0; /* We use the auth data from the URL only once. */
483
+ debug2("attempting to open_connection to %s:%s", host.p, port.p);
484
+ win32_net_open_connection(&host, &port);
485
+ if(ws.local_socket == SOCKET_ERROR)
486
+ {
487
+ error1("Unable to establish connection to %s", host.fill ? host.p : "");
488
+ goto exit;
489
+ }
490
+ debug("win32_net_open_connection succeed");
491
+ #define http_failure win32_net_close(ws.local_socket); ws.local_socket=SOCKET_ERROR; goto exit;
492
+
493
+ if(param.verbose > 2) fprintf(stderr, "HTTP request:\n%s\n",request.p);
494
+ if(!win32_net_writestring(ws.local_socket, &request)){ http_failure; }
495
+ debug("Skipping fdopen for WSA sockets");
496
+ relocate = FALSE;
497
+ /* Arbitrary length limit here... */
498
+ #define safe_readstring \
499
+ win32_net_readstring(&response, SIZE_MAX/16, NULL); \
500
+ if(response.fill > SIZE_MAX/16) /* > because of appended zero. */ \
501
+ { \
502
+ error("HTTP response line exceeds max. length"); \
503
+ http_failure; \
504
+ } \
505
+ else if(response.fill == 0) \
506
+ { \
507
+ error("readstring failed"); \
508
+ http_failure; \
509
+ } \
510
+ if(param.verbose > 2) fprintf(stderr, "HTTP in: %s", response.p);
511
+ safe_readstring;
512
+
513
+ {
514
+ char *sptr;
515
+ if((sptr = strchr(response.p, ' ')))
516
+ {
517
+ if(response.fill > sptr-response.p+2)
518
+ switch (sptr[1])
519
+ {
520
+ case '3':
521
+ relocate = TRUE;
522
+ case '2':
523
+ break;
524
+ default:
525
+ fprintf (stderr, "HTTP request failed: %s", sptr+1); /* '\n' is included */
526
+ http_failure;
527
+ }
528
+ else{ error("Too short response,"); http_failure; }
529
+ }
530
+ }
531
+
532
+ /* If we are relocated, we need to look out for a Location header. */
533
+ got_location = FALSE;
534
+
535
+ do
536
+ {
537
+ safe_readstring; /* Think about that: Should we really error out when we get nothing? Could be that the server forgot the trailing empty line... */
538
+ if (!strncasecmp(response.p, "Location: ", 10))
539
+ { /* It is a redirection! */
540
+ if(!win32_net_resolve_redirect(&response, &request_url, &purl)){ oom=1, http_failure; }
541
+
542
+ if(!strcmp(purl.p, request_url.p))
543
+ {
544
+ warning("relocated to very same place! trying request again without host port");
545
+ try_without_port = 1;
546
+ }
547
+ got_location = TRUE;
548
+ }
549
+ else
550
+ { /* We got a header line (or the closing empty line). */
551
+ char *tmp;
552
+ debug1("searching for header values... %s", response.p);
553
+ /* Not sure if I want to bail out on error here. */
554
+ /* Also: What text encoding are these strings in? Doesn't need to be plain ASCII... */
555
+ get_header_string(&response, "content-type", &hd->content_type);
556
+ get_header_string(&response, "icy-name", &hd->icy_name);
557
+ get_header_string(&response, "icy-url", &hd->icy_url);
558
+
559
+ /* watch out for icy-metaint */
560
+ if((tmp = get_header_val("icy-metaint", &response)))
561
+ {
562
+ hd->icy_interval = (off_t) atol(tmp); /* atoll ? */
563
+ debug1("got icy-metaint %li", (long int)hd->icy_interval);
564
+ }
565
+ }
566
+ } while(response.p[0] != '\r' && response.p[0] != '\n');
567
+ } while(relocate && got_location && purl.fill && numrelocs++ < HTTP_MAX_RELOCATIONS);
568
+ if(relocate)
569
+ {
570
+ if(!got_location)
571
+ error("Server meant to redirect but failed to provide a location!");
572
+ else
573
+ error1("Too many HTTP relocations (%i).", numrelocs);
574
+
575
+ http_failure;
576
+ }
577
+
578
+ exit: /* The end as well as the exception handling point... */
579
+ if(oom) error("Apparently, I ran out of memory or had some bad input data...");
580
+
581
+ mpg123_free_string(&purl);
582
+ mpg123_free_string(&host);
583
+ mpg123_free_string(&port);
584
+ mpg123_free_string(&path);
585
+ mpg123_free_string(&request);
586
+ mpg123_free_string(&response);
587
+ mpg123_free_string(&request_url);
588
+ mpg123_free_string(&httpauth1);
589
+ if (ws.local_socket == SOCKET_ERROR || oom)
590
+ return -1;
591
+ else
592
+ return 1;
593
+ }
594
+ #else
595
+ int win32_net_http_open(char* url, struct httpdata *hd)
596
+ {
597
+ return -1;
598
+ }
599
+ #endif /*WANT_WIN32_SOCKETS */