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.
- data/.yardopts +1 -0
- data/LICENSE +13 -0
- data/README.md +265 -0
- data/ext/seal/extconf.rb +45 -0
- data/include/al/al.h +724 -0
- data/include/al/alc.h +277 -0
- data/include/al/efx-presets.h +402 -0
- data/include/al/efx.h +758 -0
- data/include/mpg123/mpg123.h +1034 -0
- data/include/ogg/config_types.h +25 -0
- data/include/ogg/ogg.h +210 -0
- data/include/ogg/os_types.h +147 -0
- data/include/seal.h +23 -0
- data/include/seal/buf.h +143 -0
- data/include/seal/core.h +95 -0
- data/include/seal/efs.h +112 -0
- data/include/seal/err.h +93 -0
- data/include/seal/fmt.h +58 -0
- data/include/seal/listener.h +103 -0
- data/include/seal/raw.h +86 -0
- data/include/seal/rvb.h +520 -0
- data/include/seal/src.h +413 -0
- data/include/seal/stream.h +81 -0
- data/include/vorbis/codec.h +243 -0
- data/include/vorbis/vorbisfile.h +206 -0
- data/mpg123/AUTHORS +150 -0
- data/mpg123/COPYING +773 -0
- data/mpg123/ChangeLog +3 -0
- data/mpg123/INSTALL +111 -0
- data/mpg123/Makefile.am +99 -0
- data/mpg123/Makefile.in +1043 -0
- data/mpg123/NEWS +1200 -0
- data/mpg123/NEWS.libmpg123 +133 -0
- data/mpg123/README +203 -0
- data/mpg123/TODO +38 -0
- data/mpg123/aclocal.m4 +1168 -0
- data/mpg123/build/config.guess +1530 -0
- data/mpg123/build/config.sub +1782 -0
- data/mpg123/build/depcomp +707 -0
- data/mpg123/build/install-sh +527 -0
- data/mpg123/build/ltmain.sh +9655 -0
- data/mpg123/build/missing +330 -0
- data/mpg123/configure +20267 -0
- data/mpg123/configure.ac +2178 -0
- data/mpg123/doc/ACCURACY +2 -0
- data/mpg123/doc/BENCHMARKING +110 -0
- data/mpg123/doc/BUGS +3 -0
- data/mpg123/doc/CONTACT +17 -0
- data/mpg123/doc/LICENSE +22 -0
- data/mpg123/doc/Makefile.am +32 -0
- data/mpg123/doc/Makefile.in +490 -0
- data/mpg123/doc/PATENTS +39 -0
- data/mpg123/doc/README.3DNOW +56 -0
- data/mpg123/doc/README.gain +171 -0
- data/mpg123/doc/README.remote +218 -0
- data/mpg123/doc/ROAD_TO_LGPL +270 -0
- data/mpg123/doc/THANKS +13 -0
- data/mpg123/doc/TODO +63 -0
- data/mpg123/doc/doxy_examples.c +21 -0
- data/mpg123/doc/doxygen.conf +41 -0
- data/mpg123/doc/doxyhead.xhtml +12 -0
- data/mpg123/doc/examples/dump_seekindex.c +41 -0
- data/mpg123/doc/examples/extract_frames.c +92 -0
- data/mpg123/doc/examples/feedseek.c +238 -0
- data/mpg123/doc/examples/id3dump.c +178 -0
- data/mpg123/doc/examples/mpg123_to_wav.c +118 -0
- data/mpg123/doc/examples/mpglib.c +92 -0
- data/mpg123/doc/examples/scan.c +47 -0
- data/mpg123/doc/libmpg123_speed.txt +84 -0
- data/mpg123/equalize.dat +37 -0
- data/mpg123/libmpg123.pc.in +11 -0
- data/mpg123/m4/addrconfig.m4 +34 -0
- data/mpg123/m4/libtool.m4 +7982 -0
- data/mpg123/m4/ltoptions.m4 +384 -0
- data/mpg123/m4/ltsugar.m4 +123 -0
- data/mpg123/m4/ltversion.m4 +23 -0
- data/mpg123/m4/lt~obsolete.m4 +98 -0
- data/mpg123/makedll.sh +19 -0
- data/mpg123/man1/mpg123.1 +512 -0
- data/mpg123/mpg123.spec +68 -0
- data/mpg123/mpg123.spec.in +68 -0
- data/mpg123/ports/MSVC++/2005/libmpg123/libmpg123.vcproj +741 -0
- data/mpg123/ports/MSVC++/2008/dump_seekindex/dump_seekindex.vcproj +194 -0
- data/mpg123/ports/MSVC++/2008/feedseek/feedseek.vcproj +195 -0
- data/mpg123/ports/MSVC++/2008/libmpg123/libmpg123.vcproj +1357 -0
- data/mpg123/ports/MSVC++/2008/mpg123.sln +44 -0
- data/mpg123/ports/MSVC++/2008/mpglib/mpglib.vcproj +191 -0
- data/mpg123/ports/MSVC++/2008/scan/scan.vcproj +195 -0
- data/mpg123/ports/MSVC++/2008clr/2008clr.sln +81 -0
- data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Program.cs +435 -0
- data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Properties/AssemblyInfo.cs +36 -0
- data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/ReplaceReaderclr.csproj +72 -0
- data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Program.cs +331 -0
- data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Properties/AssemblyInfo.cs +36 -0
- data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/feedseekclr.csproj +71 -0
- data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Program.cs +79 -0
- data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Properties/AssemblyInfo.cs +36 -0
- data/mpg123/ports/MSVC++/2008clr/examples/scanclr/scanclr.csproj +70 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/AssemblyInfo.cpp +76 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/ReadMe.txt +165 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.cpp +91 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.h +130 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/dllmain.cpp +19 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/enum.h +218 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.cpp +48 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.h +134 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.cpp +92 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.h +132 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.cpp +138 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.h +152 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.cpp +896 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.h +953 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.rc +102 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.vcproj +328 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/resource.h +14 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.cpp +8 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.h +38 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.cpp +166 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.h +265 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/targetver.h +24 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.cpp +67 -0
- data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.h +111 -0
- data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj +90 -0
- data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj.filters +6 -0
- data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj +95 -0
- data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj.filters +6 -0
- data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj +960 -0
- data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj.user +3 -0
- data/mpg123/ports/MSVC++/2010/libmpg123/yasm.exe +0 -0
- data/mpg123/ports/MSVC++/2010/mpg123.sln +38 -0
- data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj +93 -0
- data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj.filters +6 -0
- data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/CORE_FileIn.H +15 -0
- data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/SourceFilter_MP3.H +139 -0
- data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_Def.H +206 -0
- data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_FileIn.H +167 -0
- data/mpg123/ports/MSVC++/CMP3Stream/README +4 -0
- data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP +462 -0
- data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Log.CPP +122 -0
- data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Mutex.CPP +35 -0
- data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/SourceFilter_MP3Stream.CPP +586 -0
- data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/PLACE_LIBMPG123_SOURCES_HERE +0 -0
- data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/libMPG123.vcproj +245 -0
- data/mpg123/ports/MSVC++/config.h +35 -0
- data/mpg123/ports/MSVC++/examples/feedseek.c +240 -0
- data/mpg123/ports/MSVC++/examples/scan.c +47 -0
- data/mpg123/ports/MSVC++/mpg123.h +46 -0
- data/mpg123/ports/MSVC++/msvc.c +59 -0
- data/mpg123/ports/README +26 -0
- data/mpg123/ports/Sony_PSP/Makefile.psp +38 -0
- data/mpg123/ports/Sony_PSP/README +11 -0
- data/mpg123/ports/Sony_PSP/config.h +368 -0
- data/mpg123/ports/Sony_PSP/readers.c.patch +2 -0
- data/mpg123/ports/Xcode/config.h +197 -0
- data/mpg123/ports/Xcode/mpg123.h +17 -0
- data/mpg123/ports/Xcode/mpg123.xcodeproj/project.pbxproj +670 -0
- data/mpg123/ports/mpg123_.pas +478 -0
- data/mpg123/scripts/benchmark-cpu.pl +56 -0
- data/mpg123/scripts/tag_lyrics.py +76 -0
- data/mpg123/src/Makefile.am +186 -0
- data/mpg123/src/Makefile.in +1097 -0
- data/mpg123/src/audio.c +725 -0
- data/mpg123/src/audio.h +106 -0
- data/mpg123/src/buffer.c +312 -0
- data/mpg123/src/buffer.h +45 -0
- data/mpg123/src/common.c +240 -0
- data/mpg123/src/common.h +29 -0
- data/mpg123/src/config.h.in +436 -0
- data/mpg123/src/control_generic.c +809 -0
- data/mpg123/src/equalizer.c +48 -0
- data/mpg123/src/genre.c +271 -0
- data/mpg123/src/genre.h +15 -0
- data/mpg123/src/getlopt.c +148 -0
- data/mpg123/src/getlopt.h +77 -0
- data/mpg123/src/httpget.c +700 -0
- data/mpg123/src/httpget.h +66 -0
- data/mpg123/src/legacy_module.c +74 -0
- data/mpg123/src/libmpg123/Makefile.am +141 -0
- data/mpg123/src/libmpg123/Makefile.in +919 -0
- data/mpg123/src/libmpg123/compat.c +138 -0
- data/mpg123/src/libmpg123/compat.h +178 -0
- data/mpg123/src/libmpg123/dct36_3dnow.S +505 -0
- data/mpg123/src/libmpg123/dct36_3dnowext.S +512 -0
- data/mpg123/src/libmpg123/dct64.c +174 -0
- data/mpg123/src/libmpg123/dct64_3dnow.S +712 -0
- data/mpg123/src/libmpg123/dct64_3dnowext.S +714 -0
- data/mpg123/src/libmpg123/dct64_altivec.c +315 -0
- data/mpg123/src/libmpg123/dct64_i386.c +336 -0
- data/mpg123/src/libmpg123/dct64_i486.c +342 -0
- data/mpg123/src/libmpg123/dct64_mmx.S +811 -0
- data/mpg123/src/libmpg123/dct64_neon.S +297 -0
- data/mpg123/src/libmpg123/dct64_neon_float.S +270 -0
- data/mpg123/src/libmpg123/dct64_sse.S +454 -0
- data/mpg123/src/libmpg123/dct64_sse_float.S +401 -0
- data/mpg123/src/libmpg123/dct64_x86_64.S +464 -0
- data/mpg123/src/libmpg123/dct64_x86_64_float.S +426 -0
- data/mpg123/src/libmpg123/debug.h +171 -0
- data/mpg123/src/libmpg123/decode.h +268 -0
- data/mpg123/src/libmpg123/dither.c +119 -0
- data/mpg123/src/libmpg123/dither.h +23 -0
- data/mpg123/src/libmpg123/equalizer.c +17 -0
- data/mpg123/src/libmpg123/equalizer_3dnow.S +70 -0
- data/mpg123/src/libmpg123/feature.c +106 -0
- data/mpg123/src/libmpg123/format.c +521 -0
- data/mpg123/src/libmpg123/frame.c +1046 -0
- data/mpg123/src/libmpg123/frame.h +410 -0
- data/mpg123/src/libmpg123/gapless.h +119 -0
- data/mpg123/src/libmpg123/getbits.h +100 -0
- data/mpg123/src/libmpg123/getcpuflags.S +91 -0
- data/mpg123/src/libmpg123/getcpuflags.h +47 -0
- data/mpg123/src/libmpg123/huffman.h +340 -0
- data/mpg123/src/libmpg123/icy.c +32 -0
- data/mpg123/src/libmpg123/icy.h +38 -0
- data/mpg123/src/libmpg123/icy2utf8.c +438 -0
- data/mpg123/src/libmpg123/icy2utf8.h +10 -0
- data/mpg123/src/libmpg123/id3.c +999 -0
- data/mpg123/src/libmpg123/id3.h +43 -0
- data/mpg123/src/libmpg123/index.c +134 -0
- data/mpg123/src/libmpg123/index.h +59 -0
- data/mpg123/src/libmpg123/intsym.h +256 -0
- data/mpg123/src/libmpg123/l12_integer_tables.h +278 -0
- data/mpg123/src/libmpg123/l2tables.h +164 -0
- data/mpg123/src/libmpg123/l3_integer_tables.h +1002 -0
- data/mpg123/src/libmpg123/layer1.c +155 -0
- data/mpg123/src/libmpg123/layer2.c +371 -0
- data/mpg123/src/libmpg123/layer3.c +2053 -0
- data/mpg123/src/libmpg123/lfs_alias.c +252 -0
- data/mpg123/src/libmpg123/lfs_wrap.c +751 -0
- data/mpg123/src/libmpg123/libmpg123.c +1607 -0
- data/mpg123/src/libmpg123/mangle.h +74 -0
- data/mpg123/src/libmpg123/mpeghead.h +87 -0
- data/mpg123/src/libmpg123/mpg123.h.in +1075 -0
- data/mpg123/src/libmpg123/mpg123lib_intern.h +338 -0
- data/mpg123/src/libmpg123/ntom.c +148 -0
- data/mpg123/src/libmpg123/optimize.c +964 -0
- data/mpg123/src/libmpg123/optimize.h +219 -0
- data/mpg123/src/libmpg123/parse.c +1179 -0
- data/mpg123/src/libmpg123/parse.h +25 -0
- data/mpg123/src/libmpg123/reader.h +137 -0
- data/mpg123/src/libmpg123/readers.c +1235 -0
- data/mpg123/src/libmpg123/sample.h +152 -0
- data/mpg123/src/libmpg123/stringbuf.c +163 -0
- data/mpg123/src/libmpg123/synth.c +816 -0
- data/mpg123/src/libmpg123/synth.h +196 -0
- data/mpg123/src/libmpg123/synth_3dnow.S +318 -0
- data/mpg123/src/libmpg123/synth_3dnowext.S +6 -0
- data/mpg123/src/libmpg123/synth_8bit.c +142 -0
- data/mpg123/src/libmpg123/synth_8bit.h +86 -0
- data/mpg123/src/libmpg123/synth_altivec.c +1057 -0
- data/mpg123/src/libmpg123/synth_arm.S +271 -0
- data/mpg123/src/libmpg123/synth_arm_accurate.S +287 -0
- data/mpg123/src/libmpg123/synth_i486.c +252 -0
- data/mpg123/src/libmpg123/synth_i586.S +336 -0
- data/mpg123/src/libmpg123/synth_i586_dither.S +375 -0
- data/mpg123/src/libmpg123/synth_mmx.S +125 -0
- data/mpg123/src/libmpg123/synth_mono.h +64 -0
- data/mpg123/src/libmpg123/synth_neon.S +123 -0
- data/mpg123/src/libmpg123/synth_neon_accurate.S +173 -0
- data/mpg123/src/libmpg123/synth_neon_float.S +149 -0
- data/mpg123/src/libmpg123/synth_neon_s32.S +168 -0
- data/mpg123/src/libmpg123/synth_ntom.h +213 -0
- data/mpg123/src/libmpg123/synth_real.c +404 -0
- data/mpg123/src/libmpg123/synth_s32.c +411 -0
- data/mpg123/src/libmpg123/synth_sse.S +6 -0
- data/mpg123/src/libmpg123/synth_sse3d.h +246 -0
- data/mpg123/src/libmpg123/synth_sse_accurate.S +294 -0
- data/mpg123/src/libmpg123/synth_sse_float.S +241 -0
- data/mpg123/src/libmpg123/synth_sse_s32.S +306 -0
- data/mpg123/src/libmpg123/synth_stereo_neon.S +175 -0
- data/mpg123/src/libmpg123/synth_stereo_neon_accurate.S +262 -0
- data/mpg123/src/libmpg123/synth_stereo_neon_float.S +220 -0
- data/mpg123/src/libmpg123/synth_stereo_neon_s32.S +247 -0
- data/mpg123/src/libmpg123/synth_stereo_sse_accurate.S +508 -0
- data/mpg123/src/libmpg123/synth_stereo_sse_float.S +416 -0
- data/mpg123/src/libmpg123/synth_stereo_sse_s32.S +540 -0
- data/mpg123/src/libmpg123/synth_stereo_x86_64.S +335 -0
- data/mpg123/src/libmpg123/synth_stereo_x86_64_accurate.S +454 -0
- data/mpg123/src/libmpg123/synth_stereo_x86_64_float.S +396 -0
- data/mpg123/src/libmpg123/synth_stereo_x86_64_s32.S +473 -0
- data/mpg123/src/libmpg123/synth_x86_64.S +244 -0
- data/mpg123/src/libmpg123/synth_x86_64_accurate.S +301 -0
- data/mpg123/src/libmpg123/synth_x86_64_float.S +259 -0
- data/mpg123/src/libmpg123/synth_x86_64_s32.S +312 -0
- data/mpg123/src/libmpg123/synths.h +52 -0
- data/mpg123/src/libmpg123/tabinit.c +294 -0
- data/mpg123/src/libmpg123/tabinit_mmx.S +210 -0
- data/mpg123/src/libmpg123/testcpu.c +35 -0
- data/mpg123/src/libmpg123/true.h +14 -0
- data/mpg123/src/local.c +63 -0
- data/mpg123/src/local.h +21 -0
- data/mpg123/src/metaprint.c +373 -0
- data/mpg123/src/metaprint.h +17 -0
- data/mpg123/src/module.c +306 -0
- data/mpg123/src/module.h +48 -0
- data/mpg123/src/mpg123.c +1405 -0
- data/mpg123/src/mpg123app.h +171 -0
- data/mpg123/src/output/Makefile.am +213 -0
- data/mpg123/src/output/Makefile.in +1238 -0
- data/mpg123/src/output/aix.c +300 -0
- data/mpg123/src/output/alib.c +209 -0
- data/mpg123/src/output/alsa.c +297 -0
- data/mpg123/src/output/arts.c +117 -0
- data/mpg123/src/output/coreaudio.c +370 -0
- data/mpg123/src/output/dummy.c +78 -0
- data/mpg123/src/output/esd.c +167 -0
- data/mpg123/src/output/hp.c +184 -0
- data/mpg123/src/output/jack.c +450 -0
- data/mpg123/src/output/mint.c +197 -0
- data/mpg123/src/output/nas.c +335 -0
- data/mpg123/src/output/openal.c +197 -0
- data/mpg123/src/output/os2.c +665 -0
- data/mpg123/src/output/oss.c +319 -0
- data/mpg123/src/output/portaudio.c +255 -0
- data/mpg123/src/output/pulse.c +164 -0
- data/mpg123/src/output/sdl.c +206 -0
- data/mpg123/src/output/sgi.c +213 -0
- data/mpg123/src/output/sndio.c +161 -0
- data/mpg123/src/output/sun.c +281 -0
- data/mpg123/src/output/win32.c +229 -0
- data/mpg123/src/playlist.c +596 -0
- data/mpg123/src/playlist.h +52 -0
- data/mpg123/src/resolver.c +319 -0
- data/mpg123/src/resolver.h +25 -0
- data/mpg123/src/sfifo.c +146 -0
- data/mpg123/src/sfifo.h +95 -0
- data/mpg123/src/streamdump.c +74 -0
- data/mpg123/src/streamdump.h +20 -0
- data/mpg123/src/term.c +479 -0
- data/mpg123/src/term.h +81 -0
- data/mpg123/src/tests/noise.c +52 -0
- data/mpg123/src/tests/plain_id3.c +109 -0
- data/mpg123/src/tests/seek_accuracy.c +261 -0
- data/mpg123/src/tests/seek_whence.c +56 -0
- data/mpg123/src/tests/testtext.h +34 -0
- data/mpg123/src/tests/text.c +80 -0
- data/mpg123/src/wav.c +464 -0
- data/mpg123/src/wavhead.h +68 -0
- data/mpg123/src/win32_net.c +599 -0
- data/mpg123/src/win32_support.c +191 -0
- data/mpg123/src/win32_support.h +152 -0
- data/mpg123/src/xfermem.c +321 -0
- data/mpg123/src/xfermem.h +74 -0
- data/mpg123/windows-builds.sh +137 -0
- data/msvc/lib/OpenAL32.lib +0 -0
- data/spec/fixtures/heal.ogg +0 -0
- data/spec/fixtures/tone_up.wav +0 -0
- data/spec/seal/buffer_spec.rb +37 -0
- data/spec/seal/core_spec.rb +29 -0
- data/spec/seal/effect_slot_spec.rb +38 -0
- data/spec/seal/listener_spec.rb +33 -0
- data/spec/seal/reverb_spec.rb +51 -0
- data/spec/seal/source_spec.rb +370 -0
- data/spec/seal/stream_spec.rb +38 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/support/attribute_examples.rb +75 -0
- data/spec/support/audio_object_with_format.rb +27 -0
- data/spec/support/movable_object.rb +22 -0
- data/src/libogg/bitwise.c +857 -0
- data/src/libogg/framing.c +2093 -0
- data/src/libvorbis/backends.h +144 -0
- data/src/libvorbis/bitrate.c +253 -0
- data/src/libvorbis/bitrate.h +59 -0
- data/src/libvorbis/block.c +1046 -0
- data/src/libvorbis/codebook.c +484 -0
- data/src/libvorbis/codebook.h +119 -0
- data/src/libvorbis/codec_internal.h +167 -0
- data/src/libvorbis/envelope.c +375 -0
- data/src/libvorbis/envelope.h +80 -0
- data/src/libvorbis/floor0.c +221 -0
- data/src/libvorbis/floor1.c +1100 -0
- data/src/libvorbis/highlevel.h +58 -0
- data/src/libvorbis/info.c +668 -0
- data/src/libvorbis/lookup.c +94 -0
- data/src/libvorbis/lookup.h +32 -0
- data/src/libvorbis/lookup_data.h +192 -0
- data/src/libvorbis/lpc.c +160 -0
- data/src/libvorbis/lpc.h +29 -0
- data/src/libvorbis/lsp.c +456 -0
- data/src/libvorbis/lsp.h +28 -0
- data/src/libvorbis/mapping0.c +816 -0
- data/src/libvorbis/masking.h +785 -0
- data/src/libvorbis/mdct.c +563 -0
- data/src/libvorbis/mdct.h +71 -0
- data/src/libvorbis/misc.h +57 -0
- data/src/libvorbis/os.h +186 -0
- data/src/libvorbis/psy.c +1206 -0
- data/src/libvorbis/psy.h +154 -0
- data/src/libvorbis/registry.c +45 -0
- data/src/libvorbis/registry.h +32 -0
- data/src/libvorbis/res0.c +889 -0
- data/src/libvorbis/scales.h +90 -0
- data/src/libvorbis/sharedbook.c +579 -0
- data/src/libvorbis/smallft.c +1255 -0
- data/src/libvorbis/smallft.h +34 -0
- data/src/libvorbis/synthesis.c +184 -0
- data/src/libvorbis/vorbisfile.c +2337 -0
- data/src/libvorbis/window.c +2135 -0
- data/src/libvorbis/window.h +26 -0
- data/src/rubyext.c +2329 -0
- data/src/seal/buf.c +124 -0
- data/src/seal/core.c +283 -0
- data/src/seal/efs.c +74 -0
- data/src/seal/err.c +118 -0
- data/src/seal/fmt.c +86 -0
- data/src/seal/listener.c +111 -0
- data/src/seal/mpg.c +174 -0
- data/src/seal/mpg.h +24 -0
- data/src/seal/ov.c +180 -0
- data/src/seal/ov.h +22 -0
- data/src/seal/raw.c +59 -0
- data/src/seal/reader.c +102 -0
- data/src/seal/reader.h +59 -0
- data/src/seal/rvb.c +368 -0
- data/src/seal/src.c +654 -0
- data/src/seal/stream.c +109 -0
- data/src/seal/threading.c +66 -0
- data/src/seal/threading.h +20 -0
- data/src/seal/wav.c +297 -0
- data/src/seal/wav.h +23 -0
- data/src/win32api.rb +29 -0
- 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 */
|