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,809 @@
|
|
|
1
|
+
/*
|
|
2
|
+
control_generic.c: control interface for frontends and real console warriors
|
|
3
|
+
|
|
4
|
+
copyright 1997-99,2004-8 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 Andreas Neuhaus and Michael Hipp
|
|
7
|
+
reworked by Thomas Orgis - it was the entry point for eventually becoming maintainer...
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include "mpg123app.h"
|
|
11
|
+
#include <stdarg.h>
|
|
12
|
+
#include <ctype.h>
|
|
13
|
+
#if !defined (WIN32) || defined (__CYGWIN__)
|
|
14
|
+
#include <sys/wait.h>
|
|
15
|
+
#include <sys/socket.h>
|
|
16
|
+
#endif
|
|
17
|
+
#include <fcntl.h>
|
|
18
|
+
#include <errno.h>
|
|
19
|
+
#include <string.h>
|
|
20
|
+
|
|
21
|
+
#include "common.h"
|
|
22
|
+
#include "buffer.h"
|
|
23
|
+
#include "genre.h"
|
|
24
|
+
#include "playlist.h"
|
|
25
|
+
#define MODE_STOPPED 0
|
|
26
|
+
#define MODE_PLAYING 1
|
|
27
|
+
#define MODE_PAUSED 2
|
|
28
|
+
|
|
29
|
+
extern int buffer_pid;
|
|
30
|
+
extern audio_output_t *ao;
|
|
31
|
+
|
|
32
|
+
#ifdef FIFO
|
|
33
|
+
#include <sys/stat.h>
|
|
34
|
+
int control_file = STDIN_FILENO;
|
|
35
|
+
#else
|
|
36
|
+
#define control_file STDIN_FILENO
|
|
37
|
+
#ifdef WANT_WIN32_FIFO
|
|
38
|
+
#error Control interface does not work on win32 stdin
|
|
39
|
+
#endif /* WANT_WIN32_FIFO */
|
|
40
|
+
#endif
|
|
41
|
+
FILE *outstream;
|
|
42
|
+
static int mode = MODE_STOPPED;
|
|
43
|
+
static int init = 0;
|
|
44
|
+
|
|
45
|
+
#include "debug.h"
|
|
46
|
+
|
|
47
|
+
void generic_sendmsg (const char *fmt, ...)
|
|
48
|
+
{
|
|
49
|
+
va_list ap;
|
|
50
|
+
fprintf(outstream, "@");
|
|
51
|
+
va_start(ap, fmt);
|
|
52
|
+
vfprintf(outstream, fmt, ap);
|
|
53
|
+
va_end(ap);
|
|
54
|
+
fprintf(outstream, "\n");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Split up a number of lines separated by \n, \r, both or just zero byte
|
|
58
|
+
and print out each line with specified prefix. */
|
|
59
|
+
static void generic_send_lines(const char* fmt, mpg123_string *inlines)
|
|
60
|
+
{
|
|
61
|
+
size_t i;
|
|
62
|
+
int hadcr = 0, hadlf = 0;
|
|
63
|
+
char *lines = NULL;
|
|
64
|
+
char *line = NULL;
|
|
65
|
+
size_t len = 0;
|
|
66
|
+
|
|
67
|
+
if(inlines != NULL && inlines->fill)
|
|
68
|
+
{
|
|
69
|
+
lines = inlines->p;
|
|
70
|
+
len = inlines->fill;
|
|
71
|
+
}
|
|
72
|
+
else return;
|
|
73
|
+
|
|
74
|
+
line = lines;
|
|
75
|
+
for(i=0; i<len; ++i)
|
|
76
|
+
{
|
|
77
|
+
if(lines[i] == '\n' || lines[i] == '\r' || lines[i] == 0)
|
|
78
|
+
{
|
|
79
|
+
char save = lines[i]; /* saving, changing, restoring a byte in the data */
|
|
80
|
+
if(save == '\n') ++hadlf;
|
|
81
|
+
if(save == '\r') ++hadcr;
|
|
82
|
+
if((hadcr || hadlf) && hadlf % 2 == 0 && hadcr % 2 == 0) line = "";
|
|
83
|
+
|
|
84
|
+
if(line)
|
|
85
|
+
{
|
|
86
|
+
lines[i] = 0;
|
|
87
|
+
generic_sendmsg(fmt, line);
|
|
88
|
+
line = NULL;
|
|
89
|
+
lines[i] = save;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
{
|
|
94
|
+
hadlf = hadcr = 0;
|
|
95
|
+
if(line == NULL) line = lines+i;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
void generic_sendstat (mpg123_handle *fr)
|
|
101
|
+
{
|
|
102
|
+
off_t current_frame, frames_left;
|
|
103
|
+
double current_seconds, seconds_left;
|
|
104
|
+
if(!mpg123_position(fr, 0, xfermem_get_usedspace(buffermem), ¤t_frame, &frames_left, ¤t_seconds, &seconds_left))
|
|
105
|
+
generic_sendmsg("F %"OFF_P" %"OFF_P" %3.2f %3.2f", (off_p)current_frame, (off_p)frames_left, current_seconds, seconds_left);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static void generic_sendv1(mpg123_id3v1 *v1, const char *prefix)
|
|
109
|
+
{
|
|
110
|
+
int i;
|
|
111
|
+
char info[125] = "";
|
|
112
|
+
memcpy(info, v1->title, 30);
|
|
113
|
+
memcpy(info+30, v1->artist, 30);
|
|
114
|
+
memcpy(info+60, v1->album, 30);
|
|
115
|
+
memcpy(info+90, v1->year, 4);
|
|
116
|
+
memcpy(info+94, v1->comment, 30);
|
|
117
|
+
|
|
118
|
+
for(i=0;i<124; ++i) if(info[i] == 0) info[i] = ' ';
|
|
119
|
+
info[i] = 0;
|
|
120
|
+
generic_sendmsg("%s ID3:%s%s", prefix, info, (v1->genre<=genre_count) ? genre_table[v1->genre] : "Unknown");
|
|
121
|
+
generic_sendmsg("%s ID3.genre:%i", prefix, v1->genre);
|
|
122
|
+
if(v1->comment[28] == 0 && v1->comment[29] != 0)
|
|
123
|
+
generic_sendmsg("%s ID3.track:%i", prefix, (unsigned char)v1->comment[29]);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
static void generic_sendinfoid3(mpg123_handle *mh)
|
|
127
|
+
{
|
|
128
|
+
mpg123_id3v1 *v1;
|
|
129
|
+
mpg123_id3v2 *v2;
|
|
130
|
+
if(MPG123_OK != mpg123_id3(mh, &v1, &v2))
|
|
131
|
+
{
|
|
132
|
+
error1("Cannot get ID3 data: %s", mpg123_strerror(mh));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if(v1 != NULL)
|
|
136
|
+
{
|
|
137
|
+
generic_sendv1(v1, "I");
|
|
138
|
+
}
|
|
139
|
+
if(v2 != NULL)
|
|
140
|
+
{
|
|
141
|
+
generic_send_lines("I ID3v2.title:%s", v2->title);
|
|
142
|
+
generic_send_lines("I ID3v2.artist:%s", v2->artist);
|
|
143
|
+
generic_send_lines("I ID3v2.album:%s", v2->album);
|
|
144
|
+
generic_send_lines("I ID3v2.year:%s", v2->year);
|
|
145
|
+
generic_send_lines("I ID3v2.comment:%s", v2->comment);
|
|
146
|
+
generic_send_lines("I ID3v2.genre:%s", v2->genre);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
void generic_sendalltag(mpg123_handle *mh)
|
|
151
|
+
{
|
|
152
|
+
mpg123_id3v1 *v1;
|
|
153
|
+
mpg123_id3v2 *v2;
|
|
154
|
+
generic_sendmsg("T {");
|
|
155
|
+
if(MPG123_OK != mpg123_id3(mh, &v1, &v2))
|
|
156
|
+
{
|
|
157
|
+
error1("Cannot get ID3 data: %s", mpg123_strerror(mh));
|
|
158
|
+
v2 = NULL;
|
|
159
|
+
v1 = NULL;
|
|
160
|
+
}
|
|
161
|
+
if(v1 != NULL) generic_sendv1(v1, "T");
|
|
162
|
+
|
|
163
|
+
if(v2 != NULL)
|
|
164
|
+
{
|
|
165
|
+
size_t i;
|
|
166
|
+
for(i=0; i<v2->texts; ++i)
|
|
167
|
+
{
|
|
168
|
+
char id[5];
|
|
169
|
+
memcpy(id, v2->text[i].id, 4);
|
|
170
|
+
id[4] = 0;
|
|
171
|
+
generic_sendmsg("T ID3v2.%s:", id);
|
|
172
|
+
generic_send_lines("T =%s", &v2->text[i].text);
|
|
173
|
+
}
|
|
174
|
+
for(i=0; i<v2->extras; ++i)
|
|
175
|
+
{
|
|
176
|
+
char id[5];
|
|
177
|
+
memcpy(id, v2->extra[i].id, 4);
|
|
178
|
+
id[4] = 0;
|
|
179
|
+
generic_sendmsg("T ID3v2.%s desc(%s):",
|
|
180
|
+
id,
|
|
181
|
+
v2->extra[i].description.fill ? v2->extra[i].description.p : "" );
|
|
182
|
+
generic_send_lines("T =%s", &v2->extra[i].text);
|
|
183
|
+
}
|
|
184
|
+
for(i=0; i<v2->comments; ++i)
|
|
185
|
+
{
|
|
186
|
+
char id[5];
|
|
187
|
+
char lang[4];
|
|
188
|
+
memcpy(id, v2->comment_list[i].id, 4);
|
|
189
|
+
id[4] = 0;
|
|
190
|
+
memcpy(lang, v2->comment_list[i].lang, 3);
|
|
191
|
+
lang[3] = 0;
|
|
192
|
+
generic_sendmsg("T ID3v2.%s lang(%s) desc(%s):",
|
|
193
|
+
id, lang,
|
|
194
|
+
v2->comment_list[i].description.fill ? v2->comment_list[i].description.p : "");
|
|
195
|
+
generic_send_lines("T =%s", &v2->comment_list[i].text);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
generic_sendmsg("T }");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
void generic_sendinfo (char *filename)
|
|
202
|
+
{
|
|
203
|
+
char *s, *t;
|
|
204
|
+
s = strrchr(filename, '/');
|
|
205
|
+
if (!s)
|
|
206
|
+
s = filename;
|
|
207
|
+
else
|
|
208
|
+
s++;
|
|
209
|
+
t = strrchr(s, '.');
|
|
210
|
+
if (t)
|
|
211
|
+
*t = 0;
|
|
212
|
+
generic_sendmsg("I %s", s);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
static void generic_load(mpg123_handle *fr, char *arg, int state)
|
|
216
|
+
{
|
|
217
|
+
if(param.usebuffer)
|
|
218
|
+
{
|
|
219
|
+
buffer_resync();
|
|
220
|
+
if(mode == MODE_PAUSED && state != MODE_PAUSED) buffer_start();
|
|
221
|
+
}
|
|
222
|
+
if(mode != MODE_STOPPED)
|
|
223
|
+
{
|
|
224
|
+
close_track();
|
|
225
|
+
mode = MODE_STOPPED;
|
|
226
|
+
}
|
|
227
|
+
if(!open_track(arg))
|
|
228
|
+
{
|
|
229
|
+
generic_sendmsg("E Error opening stream: %s", arg);
|
|
230
|
+
generic_sendmsg("P 0");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
mpg123_seek(fr, 0, SEEK_SET); /* This finds ID3v2 at beginning. */
|
|
234
|
+
if(mpg123_meta_check(fr) & MPG123_NEW_ID3)
|
|
235
|
+
{
|
|
236
|
+
generic_sendinfoid3(fr);
|
|
237
|
+
mpg123_meta_free(fr);
|
|
238
|
+
}
|
|
239
|
+
else generic_sendinfo(arg);
|
|
240
|
+
|
|
241
|
+
if(htd.icy_name.fill) generic_sendmsg("I ICY-NAME: %s", htd.icy_name.p);
|
|
242
|
+
if(htd.icy_url.fill) generic_sendmsg("I ICY-URL: %s", htd.icy_url.p);
|
|
243
|
+
|
|
244
|
+
mode = state;
|
|
245
|
+
init = 1;
|
|
246
|
+
generic_sendmsg(mode == MODE_PAUSED ? "P 1" : "P 2");
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
static void generic_loadlist(mpg123_handle *fr, char *arg)
|
|
250
|
+
{
|
|
251
|
+
/* arguments are two: first the index to play, then the URL */
|
|
252
|
+
long entry;
|
|
253
|
+
long i = 0;
|
|
254
|
+
char *file = NULL;
|
|
255
|
+
char *thefile = NULL;
|
|
256
|
+
|
|
257
|
+
/* I feel retarted with string parsing outside Perl. */
|
|
258
|
+
while(*arg && isspace(*arg)) ++arg;
|
|
259
|
+
entry = atol(arg);
|
|
260
|
+
while(*arg && !isspace(*arg)) ++arg;
|
|
261
|
+
while(*arg && isspace(*arg)) ++arg;
|
|
262
|
+
if(!*arg)
|
|
263
|
+
{
|
|
264
|
+
generic_sendmsg("E empty list name");
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* Now got the plain playlist path in arg. On to evil manupulation of mpg123's playlist code. */
|
|
269
|
+
param.listname = arg;
|
|
270
|
+
param.listentry = 0; /* The playlist shall not filter. */
|
|
271
|
+
prepare_playlist(0, NULL);
|
|
272
|
+
while((file = get_next_file()))
|
|
273
|
+
{
|
|
274
|
+
++i;
|
|
275
|
+
/* semantics: 0 brings you to the last track */
|
|
276
|
+
if(entry == 0 || entry == i) thefile = file;
|
|
277
|
+
|
|
278
|
+
generic_sendmsg("I LISTENTRY %li: %s", i, file);
|
|
279
|
+
}
|
|
280
|
+
if(!i) generic_sendmsg("I LIST EMPTY");
|
|
281
|
+
|
|
282
|
+
/* If we have something to play, play it. */
|
|
283
|
+
if(thefile) generic_load(fr, thefile, MODE_PLAYING);
|
|
284
|
+
|
|
285
|
+
free_playlist(); /* Free memory after it is not needed anymore. */
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
int control_generic (mpg123_handle *fr)
|
|
289
|
+
{
|
|
290
|
+
struct timeval tv;
|
|
291
|
+
fd_set fds;
|
|
292
|
+
int n;
|
|
293
|
+
|
|
294
|
+
/* ThOr */
|
|
295
|
+
char alive = 1;
|
|
296
|
+
char silent = 0;
|
|
297
|
+
|
|
298
|
+
/* responses to stderr for frontends needing audio data from stdout */
|
|
299
|
+
if (param.remote_err)
|
|
300
|
+
outstream = stderr;
|
|
301
|
+
else
|
|
302
|
+
outstream = stdout;
|
|
303
|
+
|
|
304
|
+
#ifndef WIN32
|
|
305
|
+
setlinebuf(outstream);
|
|
306
|
+
#else /* perhaps just use setvbuf as it's C89 */
|
|
307
|
+
/*
|
|
308
|
+
fprintf(outstream, "You are on Win32 and want to use the control interface... tough luck: We need a replacement for select on STDIN first.\n");
|
|
309
|
+
return 0;
|
|
310
|
+
setvbuf(outstream, (char*)NULL, _IOLBF, 0);
|
|
311
|
+
*/
|
|
312
|
+
#endif
|
|
313
|
+
/* the command behaviour is different, so is the ID */
|
|
314
|
+
/* now also with version for command availability */
|
|
315
|
+
fprintf(outstream, "@R MPG123 (ThOr) v7\n");
|
|
316
|
+
#ifdef FIFO
|
|
317
|
+
if(param.fifo)
|
|
318
|
+
{
|
|
319
|
+
if(param.fifo[0] == 0)
|
|
320
|
+
{
|
|
321
|
+
error("You wanted an empty FIFO name??");
|
|
322
|
+
return 1;
|
|
323
|
+
}
|
|
324
|
+
#ifndef WANT_WIN32_FIFO
|
|
325
|
+
unlink(param.fifo);
|
|
326
|
+
if(mkfifo(param.fifo, 0666) == -1)
|
|
327
|
+
{
|
|
328
|
+
error2("Failed to create FIFO at %s (%s)", param.fifo, strerror(errno));
|
|
329
|
+
return 1;
|
|
330
|
+
}
|
|
331
|
+
debug("going to open named pipe ... blocking until someone gives command");
|
|
332
|
+
#endif /* WANT_WIN32_FIFO */
|
|
333
|
+
#ifdef WANT_WIN32_FIFO
|
|
334
|
+
control_file = win32_fifo_mkfifo(param.fifo);
|
|
335
|
+
#else
|
|
336
|
+
control_file = open(param.fifo,O_RDONLY);
|
|
337
|
+
#endif /* WANT_WIN32_FIFO */
|
|
338
|
+
debug("opened");
|
|
339
|
+
}
|
|
340
|
+
#endif
|
|
341
|
+
|
|
342
|
+
while (alive)
|
|
343
|
+
{
|
|
344
|
+
tv.tv_sec = 0;
|
|
345
|
+
tv.tv_usec = 0;
|
|
346
|
+
FD_ZERO(&fds);
|
|
347
|
+
FD_SET(control_file, &fds);
|
|
348
|
+
/* play frame if no command needs to be processed */
|
|
349
|
+
if (mode == MODE_PLAYING) {
|
|
350
|
+
#ifdef WANT_WIN32_FIFO
|
|
351
|
+
n = win32_fifo_read_peek(&tv);
|
|
352
|
+
#else
|
|
353
|
+
n = select(32, &fds, NULL, NULL, &tv);
|
|
354
|
+
#endif
|
|
355
|
+
if (n == 0) {
|
|
356
|
+
if (!play_frame())
|
|
357
|
+
{
|
|
358
|
+
/* When the track ended, user may want to keep it open (to seek back),
|
|
359
|
+
so there is a decision between stopping and pausing at the end. */
|
|
360
|
+
if(param.keep_open)
|
|
361
|
+
{
|
|
362
|
+
mode = MODE_PAUSED;
|
|
363
|
+
/* Hm, buffer should be stopped already, shouldn't it? */
|
|
364
|
+
if(param.usebuffer) buffer_stop();
|
|
365
|
+
generic_sendmsg("P 1");
|
|
366
|
+
}
|
|
367
|
+
else
|
|
368
|
+
{
|
|
369
|
+
mode = MODE_STOPPED;
|
|
370
|
+
close_track();
|
|
371
|
+
generic_sendmsg("P 0");
|
|
372
|
+
}
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
if (init) {
|
|
376
|
+
print_remote_header(fr);
|
|
377
|
+
init = 0;
|
|
378
|
+
}
|
|
379
|
+
if(silent == 0)
|
|
380
|
+
{
|
|
381
|
+
generic_sendstat(fr);
|
|
382
|
+
if(mpg123_meta_check(fr) & MPG123_NEW_ICY)
|
|
383
|
+
{
|
|
384
|
+
char *meta;
|
|
385
|
+
if(mpg123_icy(fr, &meta) == MPG123_OK)
|
|
386
|
+
generic_sendmsg("I ICY-META: %s", meta != NULL ? meta : "<nil>");
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
/* wait for command */
|
|
393
|
+
while (1) {
|
|
394
|
+
#ifdef WANT_WIN32_FIFO
|
|
395
|
+
n = win32_fifo_read_peek(NULL);
|
|
396
|
+
#else
|
|
397
|
+
n = select(32, &fds, NULL, NULL, NULL);
|
|
398
|
+
#endif
|
|
399
|
+
if (n > 0)
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* on error */
|
|
405
|
+
if (n < 0) {
|
|
406
|
+
fprintf(stderr, "Error waiting for command: %s\n", strerror(errno));
|
|
407
|
+
return 1;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/* read & process commands */
|
|
411
|
+
if (n > 0)
|
|
412
|
+
{
|
|
413
|
+
short int len = 1; /* length of buffer */
|
|
414
|
+
char *cmd, *arg; /* variables for parsing, */
|
|
415
|
+
char *comstr = NULL; /* gcc thinks that this could be used uninitialited... */
|
|
416
|
+
char buf[REMOTE_BUFFER_SIZE];
|
|
417
|
+
short int counter;
|
|
418
|
+
char *next_comstr = buf; /* have it initialized for first command */
|
|
419
|
+
|
|
420
|
+
/* read as much as possible, maybe multiple commands */
|
|
421
|
+
/* When there is nothing to read (EOF) or even an error, it is the end */
|
|
422
|
+
#ifdef WANT_WIN32_FIFO
|
|
423
|
+
len = win32_fifo_read(buf,REMOTE_BUFFER_SIZE);
|
|
424
|
+
#else
|
|
425
|
+
len = read(control_file, buf, REMOTE_BUFFER_SIZE);
|
|
426
|
+
#endif
|
|
427
|
+
if(len < 1)
|
|
428
|
+
{
|
|
429
|
+
#ifdef FIFO
|
|
430
|
+
if(len == 0 && param.fifo)
|
|
431
|
+
{
|
|
432
|
+
debug("fifo ended... reopening");
|
|
433
|
+
#ifdef WANT_WIN32_FIFO
|
|
434
|
+
win32_fifo_mkfifo(param.fifo);
|
|
435
|
+
#else
|
|
436
|
+
close(control_file);
|
|
437
|
+
control_file = open(param.fifo,O_RDONLY|O_NONBLOCK);
|
|
438
|
+
#endif
|
|
439
|
+
if(control_file < 0){ error1("open of fifo failed... %s", strerror(errno)); break; }
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
#endif
|
|
443
|
+
if(len < 0) error1("command read error: %s", strerror(errno));
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
debug1("read %i bytes of commands", len);
|
|
448
|
+
/* one command on a line - separation by \n -> C strings in a row */
|
|
449
|
+
for(counter = 0; counter < len; ++counter)
|
|
450
|
+
{
|
|
451
|
+
/* line end is command end */
|
|
452
|
+
if( (buf[counter] == '\n') || (buf[counter] == '\r') )
|
|
453
|
+
{
|
|
454
|
+
debug1("line end at counter=%i", counter);
|
|
455
|
+
buf[counter] = 0; /* now it's a properly ending C string */
|
|
456
|
+
comstr = next_comstr;
|
|
457
|
+
|
|
458
|
+
/* skip the additional line ender of \r\n or \n\r */
|
|
459
|
+
if( (counter < (len - 1)) && ((buf[counter+1] == '\n') || (buf[counter+1] == '\r')) ) buf[++counter] = 0;
|
|
460
|
+
|
|
461
|
+
/* next "real" char is first of next command */
|
|
462
|
+
next_comstr = buf + counter+1;
|
|
463
|
+
|
|
464
|
+
/* directly process the command now */
|
|
465
|
+
debug1("interpreting command: %s", comstr);
|
|
466
|
+
if(strlen(comstr) == 0) continue;
|
|
467
|
+
|
|
468
|
+
/* PAUSE */
|
|
469
|
+
if (!strcasecmp(comstr, "P") || !strcasecmp(comstr, "PAUSE")) {
|
|
470
|
+
if(mode != MODE_STOPPED)
|
|
471
|
+
{
|
|
472
|
+
if (mode == MODE_PLAYING) {
|
|
473
|
+
mode = MODE_PAUSED;
|
|
474
|
+
if(param.usebuffer) buffer_stop();
|
|
475
|
+
generic_sendmsg("P 1");
|
|
476
|
+
} else {
|
|
477
|
+
mode = MODE_PLAYING;
|
|
478
|
+
if(param.usebuffer) buffer_start();
|
|
479
|
+
generic_sendmsg("P 2");
|
|
480
|
+
}
|
|
481
|
+
} else generic_sendmsg("P 0");
|
|
482
|
+
continue;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/* STOP */
|
|
486
|
+
if (!strcasecmp(comstr, "S") || !strcasecmp(comstr, "STOP")) {
|
|
487
|
+
if (mode != MODE_STOPPED) {
|
|
488
|
+
if(param.usebuffer)
|
|
489
|
+
{
|
|
490
|
+
buffer_stop();
|
|
491
|
+
buffer_resync();
|
|
492
|
+
}
|
|
493
|
+
close_track();
|
|
494
|
+
mode = MODE_STOPPED;
|
|
495
|
+
generic_sendmsg("P 0");
|
|
496
|
+
} else generic_sendmsg("P 0");
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/* SILENCE */
|
|
501
|
+
if(!strcasecmp(comstr, "SILENCE")) {
|
|
502
|
+
silent = 1;
|
|
503
|
+
generic_sendmsg("silence");
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
if(!strcasecmp(comstr, "T") || !strcasecmp(comstr, "TAG")) {
|
|
508
|
+
generic_sendalltag(fr);
|
|
509
|
+
continue;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
if(!strcasecmp(comstr, "SCAN"))
|
|
513
|
+
{
|
|
514
|
+
if(mode != MODE_STOPPED)
|
|
515
|
+
{
|
|
516
|
+
if(mpg123_scan(fr) == MPG123_OK)
|
|
517
|
+
generic_sendmsg("SCAN done");
|
|
518
|
+
else
|
|
519
|
+
generic_sendmsg("E %s", mpg123_strerror(fr));
|
|
520
|
+
}
|
|
521
|
+
else generic_sendmsg("E No track loaded!");
|
|
522
|
+
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
if(!strcasecmp(comstr, "SAMPLE"))
|
|
527
|
+
{
|
|
528
|
+
off_t pos = mpg123_tell(fr);
|
|
529
|
+
off_t len = mpg123_length(fr);
|
|
530
|
+
/* I need to have portable printf specifiers that do not truncate the type... more autoconf... */
|
|
531
|
+
if(len < 0) generic_sendmsg("E %s", mpg123_strerror(fr));
|
|
532
|
+
else generic_sendmsg("SAMPLE %li %li", (long)pos, (long)len);
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if(!strcasecmp(comstr, "SHOWEQ"))
|
|
537
|
+
{
|
|
538
|
+
int i;
|
|
539
|
+
generic_sendmsg("SHOWEQ {");
|
|
540
|
+
for(i=0; i<32; ++i)
|
|
541
|
+
{
|
|
542
|
+
generic_sendmsg("SHOWEQ %i : %i : %f", MPG123_LEFT, i, mpg123_geteq(fr, MPG123_LEFT, i));
|
|
543
|
+
generic_sendmsg("SHOWEQ %i : %i : %f", MPG123_RIGHT, i, mpg123_geteq(fr, MPG123_RIGHT, i));
|
|
544
|
+
}
|
|
545
|
+
generic_sendmsg("SHOWEQ }");
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
if(!strcasecmp(comstr, "STATE"))
|
|
550
|
+
{
|
|
551
|
+
long val;
|
|
552
|
+
generic_sendmsg("STATE {");
|
|
553
|
+
/* Get some state information bits and display them. */
|
|
554
|
+
if(mpg123_getstate(fr, MPG123_ACCURATE, &val, NULL) == MPG123_OK)
|
|
555
|
+
generic_sendmsg("STATE accurate %li", val);
|
|
556
|
+
|
|
557
|
+
generic_sendmsg("STATE }");
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/* QUIT */
|
|
562
|
+
if (!strcasecmp(comstr, "Q") || !strcasecmp(comstr, "QUIT")){
|
|
563
|
+
alive = FALSE; continue;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/* some HELP */
|
|
567
|
+
if (!strcasecmp(comstr, "H") || !strcasecmp(comstr, "HELP")) {
|
|
568
|
+
generic_sendmsg("H {");
|
|
569
|
+
generic_sendmsg("H HELP/H: command listing (LONG/SHORT forms), command case insensitve");
|
|
570
|
+
generic_sendmsg("H LOAD/L <trackname>: load and start playing resource <trackname>");
|
|
571
|
+
generic_sendmsg("H LOADPAUSED/LP <trackname>: load but do not start playing resource <trackname>");
|
|
572
|
+
generic_sendmsg("H LOADLIST <entry> <url>: load a playlist from given <url>, and display its entries, optionally load and play one of these specificed by the integer <entry> (<0: just list, 0: play last track, >0:play track with that position in list)");
|
|
573
|
+
generic_sendmsg("H PAUSE/P: pause playback");
|
|
574
|
+
generic_sendmsg("H STOP/S: stop playback (closes file)");
|
|
575
|
+
generic_sendmsg("H JUMP/J <frame>|<+offset>|<-offset>|<[+|-]seconds>s: jump to mpeg frame <frame> or change position by offset, same in seconds if number followed by \"s\"");
|
|
576
|
+
generic_sendmsg("H VOLUME/V <percent>: set volume in % (0..100...); float value");
|
|
577
|
+
generic_sendmsg("H RVA off|(mix|radio)|(album|audiophile): set rva mode");
|
|
578
|
+
generic_sendmsg("H EQ/E <channel> <band> <value>: set equalizer value for frequency band 0 to 31 on channel %i (left) or %i (right) or %i (both)", MPG123_LEFT, MPG123_RIGHT, MPG123_LR);
|
|
579
|
+
generic_sendmsg("H EQFILE <filename>: load EQ settings from a file");
|
|
580
|
+
generic_sendmsg("H SHOWEQ: show all equalizer settings (as <channel> <band> <value> lines in a SHOWEQ block (like TAG))");
|
|
581
|
+
generic_sendmsg("H SEEK/K <sample>|<+offset>|<-offset>: jump to output sample position <samples> or change position by offset");
|
|
582
|
+
generic_sendmsg("H SCAN: scan through the file, building seek index");
|
|
583
|
+
generic_sendmsg("H SAMPLE: print out the sample position and total number of samples");
|
|
584
|
+
generic_sendmsg("H SEQ <bass> <mid> <treble>: simple eq setting...");
|
|
585
|
+
generic_sendmsg("H PITCH <[+|-]value>: adjust playback speed (+0.01 is 1 %% faster)");
|
|
586
|
+
generic_sendmsg("H SILENCE: be silent during playback (meaning silence in text form)");
|
|
587
|
+
generic_sendmsg("H STATE: Print auxiliary state info in several lines (just try it to see what info is there).");
|
|
588
|
+
generic_sendmsg("H TAG/T: Print all available (ID3) tag info, for ID3v2 that gives output of all collected text fields, using the ID3v2.3/4 4-character names.");
|
|
589
|
+
generic_sendmsg("H The output is multiple lines, begin marked by \"@T {\", end by \"@T }\".");
|
|
590
|
+
generic_sendmsg("H ID3v1 data is like in the @I info lines (see below), just with \"@T\" in front.");
|
|
591
|
+
generic_sendmsg("H An ID3v2 data field is introduced via ([ ... ] means optional):");
|
|
592
|
+
generic_sendmsg("H @T ID3v2.<NAME>[ [lang(<LANG>)] desc(<description>)]:");
|
|
593
|
+
generic_sendmsg("H The lines of data follow with \"=\" prefixed:");
|
|
594
|
+
generic_sendmsg("H @T =<one line of content in UTF-8 encoding>");
|
|
595
|
+
generic_sendmsg("H meaning of the @S stream info:");
|
|
596
|
+
generic_sendmsg("H %s", remote_header_help);
|
|
597
|
+
generic_sendmsg("H The @I lines after loading a track give some ID3 info, the format:");
|
|
598
|
+
generic_sendmsg("H @I ID3:artist album year comment genretext");
|
|
599
|
+
generic_sendmsg("H where artist,album and comment are exactly 30 characters each, year is 4 characters, genre text unspecified.");
|
|
600
|
+
generic_sendmsg("H You will encounter \"@I ID3.genre:<number>\" and \"@I ID3.track:<number>\".");
|
|
601
|
+
generic_sendmsg("H Then, there is an excerpt of ID3v2 info in the structure");
|
|
602
|
+
generic_sendmsg("H @I ID3v2.title:Blabla bla Bla");
|
|
603
|
+
generic_sendmsg("H for every line of the \"title\" data field. Likewise for other fields (author, album, etc).");
|
|
604
|
+
generic_sendmsg("H }");
|
|
605
|
+
continue;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/* commands with arguments */
|
|
609
|
+
cmd = NULL;
|
|
610
|
+
arg = NULL;
|
|
611
|
+
cmd = strtok(comstr," \t"); /* get the main command */
|
|
612
|
+
arg = strtok(NULL,""); /* get the args */
|
|
613
|
+
|
|
614
|
+
if (cmd && strlen(cmd) && arg && strlen(arg))
|
|
615
|
+
{
|
|
616
|
+
/* Simple EQ: SEQ <BASS> <MID> <TREBLE> */
|
|
617
|
+
if (!strcasecmp(cmd, "SEQ")) {
|
|
618
|
+
double b,m,t;
|
|
619
|
+
int cn;
|
|
620
|
+
if(sscanf(arg, "%lf %lf %lf", &b, &m, &t) == 3)
|
|
621
|
+
{
|
|
622
|
+
/* Consider adding mpg123_seq()... but also, on could define a nicer courve for that. */
|
|
623
|
+
if ((t >= 0) && (t <= 3))
|
|
624
|
+
for(cn=0; cn < 1; ++cn) mpg123_eq(fr, MPG123_LEFT|MPG123_RIGHT, cn, b);
|
|
625
|
+
|
|
626
|
+
if ((m >= 0) && (m <= 3))
|
|
627
|
+
for(cn=1; cn < 2; ++cn) mpg123_eq(fr, MPG123_LEFT|MPG123_RIGHT, cn, m);
|
|
628
|
+
|
|
629
|
+
if ((b >= 0) && (b <= 3))
|
|
630
|
+
for(cn=2; cn < 32; ++cn) mpg123_eq(fr, MPG123_LEFT|MPG123_RIGHT, cn, t);
|
|
631
|
+
|
|
632
|
+
generic_sendmsg("bass: %f mid: %f treble: %f", b, m, t);
|
|
633
|
+
}
|
|
634
|
+
else generic_sendmsg("E invalid arguments for SEQ: %s", arg);
|
|
635
|
+
continue;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/* Equalizer control :) (JMG) */
|
|
639
|
+
if (!strcasecmp(cmd, "E") || !strcasecmp(cmd, "EQ")) {
|
|
640
|
+
double e; /* ThOr: equalizer is of type real... whatever that is */
|
|
641
|
+
int c, v;
|
|
642
|
+
/*generic_sendmsg("%s",updown);*/
|
|
643
|
+
if(sscanf(arg, "%i %i %lf", &c, &v, &e) == 3)
|
|
644
|
+
{
|
|
645
|
+
if(mpg123_eq(fr, c, v, e) == MPG123_OK)
|
|
646
|
+
generic_sendmsg("%i : %i : %f", c, v, e);
|
|
647
|
+
else
|
|
648
|
+
generic_sendmsg("E failed to set eq: %s", mpg123_strerror(fr));
|
|
649
|
+
}
|
|
650
|
+
else generic_sendmsg("E invalid arguments for EQ: %s", arg);
|
|
651
|
+
continue;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
if(!strcasecmp(cmd, "EQFILE"))
|
|
655
|
+
{
|
|
656
|
+
equalfile = arg;
|
|
657
|
+
if(load_equalizer(fr) == 0)
|
|
658
|
+
generic_sendmsg("EQFILE done");
|
|
659
|
+
else
|
|
660
|
+
generic_sendmsg("E failed to parse given eq file");
|
|
661
|
+
|
|
662
|
+
continue;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/* SEEK to a sample offset */
|
|
666
|
+
if(!strcasecmp(cmd, "K") || !strcasecmp(cmd, "SEEK"))
|
|
667
|
+
{
|
|
668
|
+
off_t soff;
|
|
669
|
+
char *spos = arg;
|
|
670
|
+
int whence = SEEK_SET;
|
|
671
|
+
if(mode == MODE_STOPPED)
|
|
672
|
+
{
|
|
673
|
+
generic_sendmsg("E No track loaded!");
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
soff = (off_t) atobigint(spos);
|
|
678
|
+
if(spos[0] == '-' || spos[0] == '+') whence = SEEK_CUR;
|
|
679
|
+
if(0 > (soff = mpg123_seek(fr, soff, whence)))
|
|
680
|
+
{
|
|
681
|
+
generic_sendmsg("E Error while seeking: %s", mpg123_strerror(fr));
|
|
682
|
+
mpg123_seek(fr, 0, SEEK_SET);
|
|
683
|
+
}
|
|
684
|
+
if(param.usebuffer) buffer_resync();
|
|
685
|
+
|
|
686
|
+
generic_sendmsg("K %li", (long)mpg123_tell(fr));
|
|
687
|
+
continue;
|
|
688
|
+
}
|
|
689
|
+
/* JUMP */
|
|
690
|
+
if (!strcasecmp(cmd, "J") || !strcasecmp(cmd, "JUMP")) {
|
|
691
|
+
char *spos;
|
|
692
|
+
off_t offset;
|
|
693
|
+
double secs;
|
|
694
|
+
|
|
695
|
+
spos = arg;
|
|
696
|
+
if(mode == MODE_STOPPED)
|
|
697
|
+
{
|
|
698
|
+
generic_sendmsg("E No track loaded!");
|
|
699
|
+
continue;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
if(spos[strlen(spos)-1] == 's' && sscanf(arg, "%lf", &secs) == 1) offset = mpg123_timeframe(fr, secs);
|
|
703
|
+
else offset = atol(spos);
|
|
704
|
+
/* totally replaced that stuff - it never fully worked
|
|
705
|
+
a bit usure about why +pos -> spos+1 earlier... */
|
|
706
|
+
if (spos[0] == '-' || spos[0] == '+') offset += framenum;
|
|
707
|
+
|
|
708
|
+
if(0 > (framenum = mpg123_seek_frame(fr, offset, SEEK_SET)))
|
|
709
|
+
{
|
|
710
|
+
generic_sendmsg("E Error while seeking");
|
|
711
|
+
mpg123_seek_frame(fr, 0, SEEK_SET);
|
|
712
|
+
}
|
|
713
|
+
if(param.usebuffer) buffer_resync();
|
|
714
|
+
|
|
715
|
+
generic_sendmsg("J %d", framenum);
|
|
716
|
+
continue;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/* VOLUME in percent */
|
|
720
|
+
if(!strcasecmp(cmd, "V") || !strcasecmp(cmd, "VOLUME"))
|
|
721
|
+
{
|
|
722
|
+
double v;
|
|
723
|
+
mpg123_volume(fr, atof(arg)/100);
|
|
724
|
+
mpg123_getvolume(fr, &v, NULL, NULL); /* Necessary? */
|
|
725
|
+
generic_sendmsg("V %f%%", v * 100);
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
/* PITCH (playback speed) in percent */
|
|
730
|
+
if(!strcasecmp(cmd, "PITCH"))
|
|
731
|
+
{
|
|
732
|
+
double p;
|
|
733
|
+
if(sscanf(arg, "%lf", &p) == 1)
|
|
734
|
+
{
|
|
735
|
+
set_pitch(fr, ao, p);
|
|
736
|
+
generic_sendmsg("PITCH %f", param.pitch);
|
|
737
|
+
}
|
|
738
|
+
else generic_sendmsg("E invalid arguments for PITCH: %s", arg);
|
|
739
|
+
continue;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/* RVA mode */
|
|
743
|
+
if(!strcasecmp(cmd, "RVA"))
|
|
744
|
+
{
|
|
745
|
+
if(!strcasecmp(arg, "off")) param.rva = MPG123_RVA_OFF;
|
|
746
|
+
else if(!strcasecmp(arg, "mix") || !strcasecmp(arg, "radio")) param.rva = MPG123_RVA_MIX;
|
|
747
|
+
else if(!strcasecmp(arg, "album") || !strcasecmp(arg, "audiophile")) param.rva = MPG123_RVA_ALBUM;
|
|
748
|
+
mpg123_volume_change(fr, 0.);
|
|
749
|
+
generic_sendmsg("RVA %s", rva_name[param.rva]);
|
|
750
|
+
continue;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/* LOAD - actually play */
|
|
754
|
+
if (!strcasecmp(cmd, "L") || !strcasecmp(cmd, "LOAD")){ generic_load(fr, arg, MODE_PLAYING); continue; }
|
|
755
|
+
|
|
756
|
+
if (!strcasecmp(cmd, "L") || !strcasecmp(cmd, "LOADLIST")){ generic_loadlist(fr, arg); continue; }
|
|
757
|
+
|
|
758
|
+
/* LOADPAUSED */
|
|
759
|
+
if (!strcasecmp(cmd, "LP") || !strcasecmp(cmd, "LOADPAUSED")){ generic_load(fr, arg, MODE_PAUSED); continue; }
|
|
760
|
+
|
|
761
|
+
/* no command matched */
|
|
762
|
+
generic_sendmsg("E Unknown command: %s", cmd); /* unknown command */
|
|
763
|
+
} /* end commands with arguments */
|
|
764
|
+
else generic_sendmsg("E Unknown command or no arguments: %s", comstr); /* unknown command */
|
|
765
|
+
|
|
766
|
+
} /* end of single command processing */
|
|
767
|
+
} /* end of scanning the command buffer */
|
|
768
|
+
|
|
769
|
+
/*
|
|
770
|
+
when last command had no \n... should I discard it?
|
|
771
|
+
Ideally, I should remember the part and wait for next
|
|
772
|
+
read() to get the rest up to a \n. But that can go
|
|
773
|
+
to infinity. Too long commands too quickly are just
|
|
774
|
+
bad. Cannot/Won't change that. So, discard the unfinished
|
|
775
|
+
command and have fingers crossed that the rest of this
|
|
776
|
+
unfinished one qualifies as "unknown".
|
|
777
|
+
*/
|
|
778
|
+
if(buf[len-1] != 0)
|
|
779
|
+
{
|
|
780
|
+
char lasti = buf[len-1];
|
|
781
|
+
buf[len-1] = 0;
|
|
782
|
+
generic_sendmsg("E Unfinished command: %s%c", comstr, lasti);
|
|
783
|
+
}
|
|
784
|
+
} /* end command reading & processing */
|
|
785
|
+
} /* end main (alive) loop */
|
|
786
|
+
debug("going to end");
|
|
787
|
+
/* quit gracefully */
|
|
788
|
+
#ifndef NOXFERMEM
|
|
789
|
+
if (param.usebuffer) {
|
|
790
|
+
kill(buffer_pid, SIGINT);
|
|
791
|
+
xfermem_done_writer(buffermem);
|
|
792
|
+
waitpid(buffer_pid, NULL, 0);
|
|
793
|
+
xfermem_done(buffermem);
|
|
794
|
+
}
|
|
795
|
+
#endif
|
|
796
|
+
debug("closing control");
|
|
797
|
+
#ifdef FIFO
|
|
798
|
+
#if WANT_WIN32_FIFO
|
|
799
|
+
win32_fifo_close();
|
|
800
|
+
#else
|
|
801
|
+
close(control_file); /* be it FIFO or STDIN */
|
|
802
|
+
if(param.fifo) unlink(param.fifo);
|
|
803
|
+
#endif /* WANT_WIN32_FIFO */
|
|
804
|
+
#endif
|
|
805
|
+
debug("control_generic returning");
|
|
806
|
+
return 0;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/* EOF */
|