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,297 @@
|
|
|
1
|
+
/*
|
|
2
|
+
alsa: sound output with Advanced Linux Sound Architecture 1.x API
|
|
3
|
+
|
|
4
|
+
copyright 2006-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
|
+
|
|
7
|
+
initially written by Clemens Ladisch <clemens@ladisch.de>
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include "mpg123app.h"
|
|
11
|
+
#include "audio.h"
|
|
12
|
+
#include "module.h"
|
|
13
|
+
#include <errno.h>
|
|
14
|
+
|
|
15
|
+
/* make ALSA 0.9.x compatible to the 1.0.x API */
|
|
16
|
+
#define ALSA_PCM_NEW_HW_PARAMS_API
|
|
17
|
+
#define ALSA_PCM_NEW_SW_PARAMS_API
|
|
18
|
+
|
|
19
|
+
#include <alsa/asoundlib.h>
|
|
20
|
+
|
|
21
|
+
#include "debug.h"
|
|
22
|
+
|
|
23
|
+
/* My laptop has probs playing low-sampled files with only 0.5s buffer... this should be a user setting -- ThOr */
|
|
24
|
+
#define BUFFER_LENGTH 0.5 /* in seconds */
|
|
25
|
+
|
|
26
|
+
static const struct {
|
|
27
|
+
snd_pcm_format_t alsa;
|
|
28
|
+
int mpg123;
|
|
29
|
+
} format_map[] = {
|
|
30
|
+
{ SND_PCM_FORMAT_S16, MPG123_ENC_SIGNED_16 },
|
|
31
|
+
{ SND_PCM_FORMAT_U16, MPG123_ENC_UNSIGNED_16 },
|
|
32
|
+
{ SND_PCM_FORMAT_U8, MPG123_ENC_UNSIGNED_8 },
|
|
33
|
+
{ SND_PCM_FORMAT_S8, MPG123_ENC_SIGNED_8 },
|
|
34
|
+
{ SND_PCM_FORMAT_A_LAW, MPG123_ENC_ALAW_8 },
|
|
35
|
+
{ SND_PCM_FORMAT_MU_LAW, MPG123_ENC_ULAW_8 },
|
|
36
|
+
{ SND_PCM_FORMAT_S32, MPG123_ENC_SIGNED_32 },
|
|
37
|
+
{ SND_PCM_FORMAT_U32, MPG123_ENC_UNSIGNED_32 },
|
|
38
|
+
#ifdef WORDS_BIGENDIAN
|
|
39
|
+
{ SND_PCM_FORMAT_S24_3BE, MPG123_ENC_SIGNED_24 },
|
|
40
|
+
{ SND_PCM_FORMAT_U24_3BE, MPG123_ENC_UNSIGNED_24 },
|
|
41
|
+
#else
|
|
42
|
+
{ SND_PCM_FORMAT_S24_3LE, MPG123_ENC_SIGNED_24 },
|
|
43
|
+
{ SND_PCM_FORMAT_U24_3LE, MPG123_ENC_UNSIGNED_24 },
|
|
44
|
+
#endif
|
|
45
|
+
{ SND_PCM_FORMAT_FLOAT, MPG123_ENC_FLOAT_32 },
|
|
46
|
+
{ SND_PCM_FORMAT_FLOAT64, MPG123_ENC_FLOAT_64 }
|
|
47
|
+
};
|
|
48
|
+
#define NUM_FORMATS (sizeof format_map / sizeof format_map[0])
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
static int rates_match(long int desired, unsigned int actual)
|
|
52
|
+
{
|
|
53
|
+
return actual * 100 > desired * (100 - AUDIO_RATE_TOLERANCE) &&
|
|
54
|
+
actual * 100 < desired * (100 + AUDIO_RATE_TOLERANCE);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static int initialize_device(audio_output_t *ao)
|
|
58
|
+
{
|
|
59
|
+
snd_pcm_hw_params_t *hw=NULL;
|
|
60
|
+
snd_pcm_sw_params_t *sw=NULL;
|
|
61
|
+
snd_pcm_uframes_t buffer_size;
|
|
62
|
+
snd_pcm_uframes_t period_size;
|
|
63
|
+
snd_pcm_format_t format;
|
|
64
|
+
snd_pcm_t *pcm=(snd_pcm_t*)ao->userptr;
|
|
65
|
+
unsigned int rate;
|
|
66
|
+
int i;
|
|
67
|
+
|
|
68
|
+
snd_pcm_hw_params_alloca(&hw); /* Ignore GCC warning here... alsa-lib>=1.0.16 doesn't trigger that anymore, too. */
|
|
69
|
+
if (snd_pcm_hw_params_any(pcm, hw) < 0) {
|
|
70
|
+
if(!AOQUIET) error("initialize_device(): no configuration available");
|
|
71
|
+
return -1;
|
|
72
|
+
}
|
|
73
|
+
if (snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) {
|
|
74
|
+
if(!AOQUIET) error("initialize_device(): device does not support interleaved access");
|
|
75
|
+
return -1;
|
|
76
|
+
}
|
|
77
|
+
format = SND_PCM_FORMAT_UNKNOWN;
|
|
78
|
+
for (i = 0; i < NUM_FORMATS; ++i) {
|
|
79
|
+
if (ao->format == format_map[i].mpg123) {
|
|
80
|
+
format = format_map[i].alsa;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (format == SND_PCM_FORMAT_UNKNOWN) {
|
|
85
|
+
if(!AOQUIET) error1("initialize_device(): invalid sample format %d", ao->format);
|
|
86
|
+
errno = EINVAL;
|
|
87
|
+
return -1;
|
|
88
|
+
}
|
|
89
|
+
if (snd_pcm_hw_params_set_format(pcm, hw, format) < 0) {
|
|
90
|
+
if(!AOQUIET) error1("initialize_device(): cannot set format %s", snd_pcm_format_name(format));
|
|
91
|
+
return -1;
|
|
92
|
+
}
|
|
93
|
+
if (snd_pcm_hw_params_set_channels(pcm, hw, ao->channels) < 0) {
|
|
94
|
+
if(!AOQUIET) error1("initialize_device(): cannot set %d channels", ao->channels);
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
97
|
+
rate = ao->rate;
|
|
98
|
+
if (snd_pcm_hw_params_set_rate_near(pcm, hw, &rate, NULL) < 0) {
|
|
99
|
+
if(!AOQUIET) error1("initialize_device(): cannot set rate %u", rate);
|
|
100
|
+
return -1;
|
|
101
|
+
}
|
|
102
|
+
if (!rates_match(ao->rate, rate)) {
|
|
103
|
+
if(!AOQUIET) error2("initialize_device(): rate %ld not available, using %u", ao->rate, rate);
|
|
104
|
+
/* return -1; */
|
|
105
|
+
}
|
|
106
|
+
buffer_size = rate * BUFFER_LENGTH;
|
|
107
|
+
if (snd_pcm_hw_params_set_buffer_size_near(pcm, hw, &buffer_size) < 0) {
|
|
108
|
+
if(!AOQUIET) error("initialize_device(): cannot set buffer size");
|
|
109
|
+
return -1;
|
|
110
|
+
}
|
|
111
|
+
period_size = buffer_size / 4;
|
|
112
|
+
if (snd_pcm_hw_params_set_period_size_near(pcm, hw, &period_size, NULL) < 0) {
|
|
113
|
+
if(!AOQUIET) error("initialize_device(): cannot set period size");
|
|
114
|
+
return -1;
|
|
115
|
+
}
|
|
116
|
+
if (snd_pcm_hw_params(pcm, hw) < 0) {
|
|
117
|
+
if(!AOQUIET) error("initialize_device(): cannot set hw params");
|
|
118
|
+
return -1;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
snd_pcm_sw_params_alloca(&sw);
|
|
122
|
+
if (snd_pcm_sw_params_current(pcm, sw) < 0) {
|
|
123
|
+
if(!AOQUIET) error("initialize_device(): cannot get sw params");
|
|
124
|
+
return -1;
|
|
125
|
+
}
|
|
126
|
+
/* start playing after the first write */
|
|
127
|
+
if (snd_pcm_sw_params_set_start_threshold(pcm, sw, 1) < 0) {
|
|
128
|
+
if(!AOQUIET) error("initialize_device(): cannot set start threshold");
|
|
129
|
+
return -1;
|
|
130
|
+
}
|
|
131
|
+
/* wake up on every interrupt */
|
|
132
|
+
if (snd_pcm_sw_params_set_avail_min(pcm, sw, 1) < 0) {
|
|
133
|
+
if(!AOQUIET) error("initialize_device(): cannot set min available");
|
|
134
|
+
return -1;
|
|
135
|
+
}
|
|
136
|
+
#if SND_LIB_VERSION < ((1<<16)|16)
|
|
137
|
+
/* Always write as many frames as possible (deprecated since alsa-lib 1.0.16) */
|
|
138
|
+
if (snd_pcm_sw_params_set_xfer_align(pcm, sw, 1) < 0) {
|
|
139
|
+
if(!AOQUIET) error("initialize_device(): cannot set transfer alignment");
|
|
140
|
+
return -1;
|
|
141
|
+
}
|
|
142
|
+
#endif
|
|
143
|
+
if (snd_pcm_sw_params(pcm, sw) < 0) {
|
|
144
|
+
if(!AOQUIET) error("initialize_device(): cannot set sw params");
|
|
145
|
+
return -1;
|
|
146
|
+
}
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
static void error_ignorer(const char *file, int line, const char *function, int err, const char *fmt,...)
|
|
151
|
+
{
|
|
152
|
+
/* I can make ALSA silent. */
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static int open_alsa(audio_output_t *ao)
|
|
156
|
+
{
|
|
157
|
+
const char *pcm_name;
|
|
158
|
+
snd_pcm_t *pcm=NULL;
|
|
159
|
+
debug1("open_alsa with %p", ao->userptr);
|
|
160
|
+
|
|
161
|
+
if(AOQUIET) snd_lib_error_set_handler(error_ignorer);
|
|
162
|
+
|
|
163
|
+
pcm_name = ao->device ? ao->device : "default";
|
|
164
|
+
if (snd_pcm_open(&pcm, pcm_name, SND_PCM_STREAM_PLAYBACK, 0) < 0) {
|
|
165
|
+
if(!AOQUIET) error1("cannot open device %s", pcm_name);
|
|
166
|
+
return -1;
|
|
167
|
+
}
|
|
168
|
+
ao->userptr = pcm;
|
|
169
|
+
if (ao->format != -1) {
|
|
170
|
+
/* we're going to play: initalize sample format */
|
|
171
|
+
return initialize_device(ao);
|
|
172
|
+
} else {
|
|
173
|
+
/* query mode; sample format will be set for each query */
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
static int get_formats_alsa(audio_output_t *ao)
|
|
180
|
+
{
|
|
181
|
+
snd_pcm_t *pcm=(snd_pcm_t*)ao->userptr;
|
|
182
|
+
snd_pcm_hw_params_t *hw;
|
|
183
|
+
unsigned int rate;
|
|
184
|
+
int supported_formats, i;
|
|
185
|
+
|
|
186
|
+
snd_pcm_hw_params_alloca(&hw);
|
|
187
|
+
if (snd_pcm_hw_params_any(pcm, hw) < 0) {
|
|
188
|
+
if(!AOQUIET) error("get_formats_alsa(): no configuration available");
|
|
189
|
+
return -1;
|
|
190
|
+
}
|
|
191
|
+
if (snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
|
|
192
|
+
return -1;
|
|
193
|
+
if (snd_pcm_hw_params_set_channels(pcm, hw, ao->channels) < 0)
|
|
194
|
+
return 0;
|
|
195
|
+
rate = ao->rate;
|
|
196
|
+
if (snd_pcm_hw_params_set_rate_near(pcm, hw, &rate, NULL) < 0)
|
|
197
|
+
return -1;
|
|
198
|
+
if (!rates_match(ao->rate, rate))
|
|
199
|
+
return 0;
|
|
200
|
+
supported_formats = 0;
|
|
201
|
+
for (i = 0; i < NUM_FORMATS; ++i) {
|
|
202
|
+
if (snd_pcm_hw_params_test_format(pcm, hw, format_map[i].alsa) == 0)
|
|
203
|
+
supported_formats |= format_map[i].mpg123;
|
|
204
|
+
}
|
|
205
|
+
return supported_formats;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
static int write_alsa(audio_output_t *ao, unsigned char *buf, int bytes)
|
|
209
|
+
{
|
|
210
|
+
snd_pcm_t *pcm=(snd_pcm_t*)ao->userptr;
|
|
211
|
+
snd_pcm_uframes_t frames;
|
|
212
|
+
snd_pcm_sframes_t written;
|
|
213
|
+
|
|
214
|
+
frames = snd_pcm_bytes_to_frames(pcm, bytes);
|
|
215
|
+
written = snd_pcm_writei(pcm, buf, frames);
|
|
216
|
+
if (written == -EINTR) /* interrupted system call */
|
|
217
|
+
written = 0;
|
|
218
|
+
else if (written == -EPIPE) { /* underrun */
|
|
219
|
+
if (snd_pcm_prepare(pcm) >= 0)
|
|
220
|
+
written = snd_pcm_writei(pcm, buf, frames);
|
|
221
|
+
}
|
|
222
|
+
if (written >= 0)
|
|
223
|
+
return snd_pcm_frames_to_bytes(pcm, written);
|
|
224
|
+
else
|
|
225
|
+
{
|
|
226
|
+
if(snd_pcm_state(pcm) == SND_PCM_STATE_SUSPENDED)
|
|
227
|
+
{
|
|
228
|
+
/* Iamnothappyabouthisnothappyreallynot. */
|
|
229
|
+
snd_pcm_resume(pcm);
|
|
230
|
+
if(snd_pcm_state(pcm) == SND_PCM_STATE_SUSPENDED)
|
|
231
|
+
{
|
|
232
|
+
error("device still suspended after resume hackery... giving up");
|
|
233
|
+
return -1;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
static void flush_alsa(audio_output_t *ao)
|
|
241
|
+
{
|
|
242
|
+
snd_pcm_t *pcm=(snd_pcm_t*)ao->userptr;
|
|
243
|
+
|
|
244
|
+
/* is this the optimal solution? - we should figure out what we really whant from this function */
|
|
245
|
+
|
|
246
|
+
debug("alsa drop");
|
|
247
|
+
snd_pcm_drop(pcm);
|
|
248
|
+
debug("alsa prepare");
|
|
249
|
+
snd_pcm_prepare(pcm);
|
|
250
|
+
debug("alsa flush done");
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
static int close_alsa(audio_output_t *ao)
|
|
254
|
+
{
|
|
255
|
+
snd_pcm_t *pcm=(snd_pcm_t*)ao->userptr;
|
|
256
|
+
debug1("close_alsa with %p", ao->userptr);
|
|
257
|
+
if(pcm != NULL) /* be really generous for being called without any device opening */
|
|
258
|
+
{
|
|
259
|
+
if (snd_pcm_state(pcm) == SND_PCM_STATE_RUNNING)
|
|
260
|
+
snd_pcm_drain(pcm);
|
|
261
|
+
ao->userptr = NULL; /* Should alsa do this or the module wrapper? */
|
|
262
|
+
return snd_pcm_close(pcm);
|
|
263
|
+
}
|
|
264
|
+
else return 0;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
static int init_alsa(audio_output_t* ao)
|
|
269
|
+
{
|
|
270
|
+
if (ao==NULL) return -1;
|
|
271
|
+
|
|
272
|
+
/* Set callbacks */
|
|
273
|
+
ao->open = open_alsa;
|
|
274
|
+
ao->flush = flush_alsa;
|
|
275
|
+
ao->write = write_alsa;
|
|
276
|
+
ao->get_formats = get_formats_alsa;
|
|
277
|
+
ao->close = close_alsa;
|
|
278
|
+
|
|
279
|
+
/* Success */
|
|
280
|
+
return 0;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
/*
|
|
286
|
+
Module information data structure
|
|
287
|
+
*/
|
|
288
|
+
mpg123_module_t mpg123_output_module_info = {
|
|
289
|
+
/* api_version */ MPG123_MODULE_API_VERSION,
|
|
290
|
+
/* name */ "alsa",
|
|
291
|
+
/* description */ "Output audio using Advanced Linux Sound Architecture (ALSA).",
|
|
292
|
+
/* revision */ "$Rev:$",
|
|
293
|
+
/* handle */ NULL,
|
|
294
|
+
|
|
295
|
+
/* init_output */ init_alsa,
|
|
296
|
+
};
|
|
297
|
+
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/*
|
|
2
|
+
arts: audio output via aRts Sound Daemon
|
|
3
|
+
|
|
4
|
+
copyright 2007-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
|
+
|
|
7
|
+
initially written by Stefan Lenselink (Stefan@lenselink.org)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
#include "mpg123app.h"
|
|
12
|
+
#include <artsc.h>
|
|
13
|
+
#include "debug.h"
|
|
14
|
+
|
|
15
|
+
typedef struct
|
|
16
|
+
{
|
|
17
|
+
arts_stream_t arse; /* That's short for ARts StrEam;-) */
|
|
18
|
+
} mpg123_arts_t;
|
|
19
|
+
|
|
20
|
+
static int open_arts(audio_output_t *ao)
|
|
21
|
+
{
|
|
22
|
+
short bits = 0;
|
|
23
|
+
if(!ao) return -1;
|
|
24
|
+
|
|
25
|
+
if(ao->format < 0)
|
|
26
|
+
{
|
|
27
|
+
ao->format = MPG123_ENC_SIGNED_16;
|
|
28
|
+
ao->rate = 44100;
|
|
29
|
+
ao->channels = 2;
|
|
30
|
+
}
|
|
31
|
+
/* Trial and error revealed these two formats to work with aRts. */
|
|
32
|
+
if(ao->format == MPG123_ENC_SIGNED_16) bits = 16;
|
|
33
|
+
else if(ao->format == MPG123_ENC_UNSIGNED_8) bits = 8;
|
|
34
|
+
else return -1;
|
|
35
|
+
|
|
36
|
+
/* Initialize the aRts lib*/
|
|
37
|
+
arts_init();
|
|
38
|
+
/* Open a stream to the aRts server */
|
|
39
|
+
((mpg123_arts_t*)ao->userptr)->arse = arts_play_stream( ao->rate, bits, ao->channels, "mpg123" );
|
|
40
|
+
/* Yeah, black box and all... it's still a pointer that is NULL on error. */
|
|
41
|
+
return (void*)((mpg123_arts_t*)ao->userptr)->arse == NULL ? -1 : 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static int get_formats_arts(audio_output_t *ao)
|
|
45
|
+
{
|
|
46
|
+
/* aRts runs not everything, but any rate. */
|
|
47
|
+
return MPG123_ENC_SIGNED_16|MPG123_ENC_UNSIGNED_8;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static int write_arts(audio_output_t *ao,unsigned char *buf,int len)
|
|
51
|
+
{
|
|
52
|
+
/* PIPE the PCM forward to the aRts Sound Daemon */
|
|
53
|
+
return arts_write( ((mpg123_arts_t*)ao->userptr)->arse , buf, len);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static int close_arts(audio_output_t *ao)
|
|
57
|
+
{
|
|
58
|
+
/* Close the connection! */
|
|
59
|
+
arts_close_stream( ((mpg123_arts_t*)ao->userptr)->arse );
|
|
60
|
+
/* Free the memory allocated*/
|
|
61
|
+
arts_free();
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static void flush_arts(audio_output_t *ao)
|
|
66
|
+
{
|
|
67
|
+
/* aRts doesn't have a flush statement! */
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static int deinit_arts(audio_output_t* ao)
|
|
71
|
+
{
|
|
72
|
+
if(ao->userptr)
|
|
73
|
+
{
|
|
74
|
+
free(ao->userptr);
|
|
75
|
+
ao->userptr = NULL;
|
|
76
|
+
}
|
|
77
|
+
arts_free();
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static int init_arts(audio_output_t* ao)
|
|
82
|
+
{
|
|
83
|
+
if (ao==NULL) return -1;
|
|
84
|
+
|
|
85
|
+
ao->userptr = malloc(sizeof(mpg123_arts_t));
|
|
86
|
+
if(ao->userptr == NULL)
|
|
87
|
+
{
|
|
88
|
+
error("Out of memory!");
|
|
89
|
+
return -1;
|
|
90
|
+
}
|
|
91
|
+
/* clear it to have a consistent state */
|
|
92
|
+
memset(ao->userptr, 0, sizeof(mpg123_arts_t));
|
|
93
|
+
/* Set callbacks */
|
|
94
|
+
ao->open = open_arts;
|
|
95
|
+
ao->flush = flush_arts;
|
|
96
|
+
ao->write = write_arts;
|
|
97
|
+
ao->get_formats = get_formats_arts;
|
|
98
|
+
ao->close = close_arts;
|
|
99
|
+
ao->deinit = deinit_arts;
|
|
100
|
+
/* Success */
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
Module information data structure
|
|
106
|
+
*/
|
|
107
|
+
mpg123_module_t mpg123_output_module_info = {
|
|
108
|
+
/* api_version */ MPG123_MODULE_API_VERSION,
|
|
109
|
+
/* name */ "arts",
|
|
110
|
+
/* description */ "Output audio using aRts Sound Daemon",
|
|
111
|
+
/* revision */ "$Rev: $",
|
|
112
|
+
/* handle */ NULL,
|
|
113
|
+
|
|
114
|
+
/* init_output */ init_arts,
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/*
|
|
2
|
+
coreaudio: audio output on MacOS X
|
|
3
|
+
|
|
4
|
+
copyright ?-2006 by the mpg123 project - free software under the terms of the GPL 2
|
|
5
|
+
see COPYING and AUTHORS files in distribution or http://mpg123.org
|
|
6
|
+
initially written by Guillaume Outters
|
|
7
|
+
modified by Nicholas J Humfrey to use SFIFO code
|
|
8
|
+
modified by Taihei Monma to use AudioUnit and AudioConverter APIs
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
#include "mpg123app.h"
|
|
13
|
+
|
|
14
|
+
#include <CoreServices/CoreServices.h>
|
|
15
|
+
#include <AudioUnit/AudioUnit.h>
|
|
16
|
+
#include <AudioToolbox/AudioToolbox.h>
|
|
17
|
+
#include <errno.h>
|
|
18
|
+
|
|
19
|
+
/* Including the sfifo code locally, to avoid module linkage issues. */
|
|
20
|
+
#define SFIFO_STATIC
|
|
21
|
+
#include "sfifo.c"
|
|
22
|
+
|
|
23
|
+
#include "debug.h"
|
|
24
|
+
|
|
25
|
+
#define FIFO_DURATION (0.5f) /* Duration of the ring buffer in seconds */
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
typedef struct mpg123_coreaudio
|
|
29
|
+
{
|
|
30
|
+
AudioConverterRef converter;
|
|
31
|
+
AudioUnit outputUnit;
|
|
32
|
+
int open;
|
|
33
|
+
char play;
|
|
34
|
+
int channels;
|
|
35
|
+
int bps;
|
|
36
|
+
int last_buffer;
|
|
37
|
+
int play_done;
|
|
38
|
+
int decode_done;
|
|
39
|
+
|
|
40
|
+
/* Convertion buffer */
|
|
41
|
+
unsigned char * buffer;
|
|
42
|
+
size_t buffer_size;
|
|
43
|
+
|
|
44
|
+
/* Ring buffer */
|
|
45
|
+
sfifo_t fifo;
|
|
46
|
+
|
|
47
|
+
} mpg123_coreaudio_t;
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
static OSStatus playProc(AudioConverterRef inAudioConverter,
|
|
52
|
+
UInt32 *ioNumberDataPackets,
|
|
53
|
+
AudioBufferList *outOutputData,
|
|
54
|
+
AudioStreamPacketDescription **outDataPacketDescription,
|
|
55
|
+
void* inClientData)
|
|
56
|
+
{
|
|
57
|
+
mpg123_coreaudio_t *ca = (mpg123_coreaudio_t *)inClientData;
|
|
58
|
+
long n;
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
if(ca->last_buffer) {
|
|
62
|
+
ca->play_done = 1;
|
|
63
|
+
return noErr;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for(n = 0; n < outOutputData->mNumberBuffers; n++)
|
|
67
|
+
{
|
|
68
|
+
unsigned int wanted = *ioNumberDataPackets * ca->channels * ca->bps;
|
|
69
|
+
unsigned char *dest;
|
|
70
|
+
unsigned int read;
|
|
71
|
+
if(ca->buffer_size < wanted) {
|
|
72
|
+
debug1("Allocating %d byte sample conversion buffer", wanted);
|
|
73
|
+
ca->buffer = realloc( ca->buffer, wanted);
|
|
74
|
+
ca->buffer_size = wanted;
|
|
75
|
+
}
|
|
76
|
+
dest = ca->buffer;
|
|
77
|
+
|
|
78
|
+
/* Only play if we have data left */
|
|
79
|
+
if ( sfifo_used( &ca->fifo ) < wanted ) {
|
|
80
|
+
if(!ca->decode_done) {
|
|
81
|
+
warning("Didn't have any audio data in callback (buffer underflow)");
|
|
82
|
+
return -1;
|
|
83
|
+
}
|
|
84
|
+
wanted = sfifo_used( &ca->fifo );
|
|
85
|
+
ca->last_buffer = 1;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Read audio from FIFO to SDL's buffer */
|
|
89
|
+
read = sfifo_read( &ca->fifo, dest, wanted );
|
|
90
|
+
|
|
91
|
+
if (wanted!=read)
|
|
92
|
+
warning2("Error reading from the ring buffer (wanted=%u, read=%u).\n", wanted, read);
|
|
93
|
+
|
|
94
|
+
outOutputData->mBuffers[n].mDataByteSize = read;
|
|
95
|
+
outOutputData->mBuffers[n].mData = dest;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return noErr;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static OSStatus convertProc(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags,
|
|
102
|
+
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber,
|
|
103
|
+
UInt32 inNumFrames, AudioBufferList *ioData)
|
|
104
|
+
{
|
|
105
|
+
AudioStreamPacketDescription* outPacketDescription = NULL;
|
|
106
|
+
mpg123_coreaudio_t* ca = (mpg123_coreaudio_t*)inRefCon;
|
|
107
|
+
OSStatus err= noErr;
|
|
108
|
+
|
|
109
|
+
err = AudioConverterFillComplexBuffer(ca->converter, playProc, inRefCon, &inNumFrames, ioData, outPacketDescription);
|
|
110
|
+
|
|
111
|
+
return err;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static int open_coreaudio(audio_output_t *ao)
|
|
115
|
+
{
|
|
116
|
+
mpg123_coreaudio_t* ca = (mpg123_coreaudio_t*)ao->userptr;
|
|
117
|
+
UInt32 size;
|
|
118
|
+
ComponentDescription desc;
|
|
119
|
+
Component comp;
|
|
120
|
+
AudioStreamBasicDescription inFormat;
|
|
121
|
+
AudioStreamBasicDescription outFormat;
|
|
122
|
+
AURenderCallbackStruct renderCallback;
|
|
123
|
+
Boolean outWritable;
|
|
124
|
+
|
|
125
|
+
/* Initialize our environment */
|
|
126
|
+
ca->play = 0;
|
|
127
|
+
ca->buffer = NULL;
|
|
128
|
+
ca->buffer_size = 0;
|
|
129
|
+
ca->last_buffer = 0;
|
|
130
|
+
ca->play_done = 0;
|
|
131
|
+
ca->decode_done = 0;
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
/* Get the default audio output unit */
|
|
135
|
+
desc.componentType = kAudioUnitType_Output;
|
|
136
|
+
desc.componentSubType = kAudioUnitSubType_DefaultOutput;
|
|
137
|
+
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
|
|
138
|
+
desc.componentFlags = 0;
|
|
139
|
+
desc.componentFlagsMask = 0;
|
|
140
|
+
comp = FindNextComponent(NULL, &desc);
|
|
141
|
+
if(comp == NULL) {
|
|
142
|
+
error("FindNextComponent failed");
|
|
143
|
+
return(-1);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if(OpenAComponent(comp, &(ca->outputUnit))) {
|
|
147
|
+
error("OpenAComponent failed");
|
|
148
|
+
return (-1);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if(AudioUnitInitialize(ca->outputUnit)) {
|
|
152
|
+
error("AudioUnitInitialize failed");
|
|
153
|
+
return (-1);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Specify the output PCM format */
|
|
157
|
+
AudioUnitGetPropertyInfo(ca->outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &size, &outWritable);
|
|
158
|
+
if(AudioUnitGetProperty(ca->outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &outFormat, &size)) {
|
|
159
|
+
error("AudioUnitGetProperty(kAudioUnitProperty_StreamFormat) failed");
|
|
160
|
+
return (-1);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if(AudioUnitSetProperty(ca->outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outFormat, size)) {
|
|
164
|
+
error("AudioUnitSetProperty(kAudioUnitProperty_StreamFormat) failed");
|
|
165
|
+
return (-1);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Specify the input PCM format */
|
|
169
|
+
ca->channels = ao->channels;
|
|
170
|
+
inFormat.mSampleRate = ao->rate;
|
|
171
|
+
inFormat.mChannelsPerFrame = ao->channels;
|
|
172
|
+
inFormat.mFormatID = kAudioFormatLinearPCM;
|
|
173
|
+
#ifdef _BIG_ENDIAN
|
|
174
|
+
inFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsBigEndian;
|
|
175
|
+
#else
|
|
176
|
+
inFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked;
|
|
177
|
+
#endif
|
|
178
|
+
|
|
179
|
+
switch(ao->format)
|
|
180
|
+
{
|
|
181
|
+
case MPG123_ENC_SIGNED_16:
|
|
182
|
+
inFormat.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
|
|
183
|
+
ca->bps = 2;
|
|
184
|
+
break;
|
|
185
|
+
case MPG123_ENC_SIGNED_8:
|
|
186
|
+
inFormat.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
|
|
187
|
+
ca->bps = 1;
|
|
188
|
+
break;
|
|
189
|
+
case MPG123_ENC_UNSIGNED_8:
|
|
190
|
+
ca->bps = 1;
|
|
191
|
+
break;
|
|
192
|
+
case MPG123_ENC_SIGNED_32:
|
|
193
|
+
inFormat.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
|
|
194
|
+
ca->bps = 4;
|
|
195
|
+
break;
|
|
196
|
+
case MPG123_ENC_FLOAT_32:
|
|
197
|
+
inFormat.mFormatFlags |= kLinearPCMFormatFlagIsFloat;
|
|
198
|
+
ca->bps = 4;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
inFormat.mBitsPerChannel = ca->bps << 3;
|
|
203
|
+
inFormat.mBytesPerPacket = ca->bps*inFormat.mChannelsPerFrame;
|
|
204
|
+
inFormat.mFramesPerPacket = 1;
|
|
205
|
+
inFormat.mBytesPerFrame = ca->bps*inFormat.mChannelsPerFrame;
|
|
206
|
+
|
|
207
|
+
/* Add our callback - but don't start it yet */
|
|
208
|
+
memset(&renderCallback, 0, sizeof(AURenderCallbackStruct));
|
|
209
|
+
renderCallback.inputProc = convertProc;
|
|
210
|
+
renderCallback.inputProcRefCon = ao->userptr;
|
|
211
|
+
if(AudioUnitSetProperty(ca->outputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &renderCallback, sizeof(AURenderCallbackStruct))) {
|
|
212
|
+
error("AudioUnitSetProperty(kAudioUnitProperty_SetRenderCallback) failed");
|
|
213
|
+
return(-1);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
/* Open an audio I/O stream and create converter */
|
|
218
|
+
if (ao->rate > 0 && ao->channels >0 ) {
|
|
219
|
+
int ringbuffer_len;
|
|
220
|
+
|
|
221
|
+
if(AudioConverterNew(&inFormat, &outFormat, &(ca->converter))) {
|
|
222
|
+
error("AudioConverterNew failed");
|
|
223
|
+
return(-1);
|
|
224
|
+
}
|
|
225
|
+
if(ao->channels == 1) {
|
|
226
|
+
SInt32 channelMap[2] = { 0, 0 };
|
|
227
|
+
if(AudioConverterSetProperty(ca->converter, kAudioConverterChannelMap, sizeof(channelMap), channelMap)) {
|
|
228
|
+
error("AudioConverterSetProperty(kAudioConverterChannelMap) failed");
|
|
229
|
+
return(-1);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* Initialise FIFO */
|
|
234
|
+
ringbuffer_len = ao->rate * FIFO_DURATION * ca->bps * ao->channels;
|
|
235
|
+
debug2( "Allocating %d byte ring-buffer (%f seconds)", ringbuffer_len, (float)FIFO_DURATION);
|
|
236
|
+
sfifo_init( &ca->fifo, ringbuffer_len );
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return(0);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
static int get_formats_coreaudio(audio_output_t *ao)
|
|
243
|
+
{
|
|
244
|
+
return MPG123_ENC_SIGNED_16|MPG123_ENC_SIGNED_8|MPG123_ENC_UNSIGNED_8|MPG123_ENC_SIGNED_32|MPG123_ENC_FLOAT_32;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
static int write_coreaudio(audio_output_t *ao, unsigned char *buf, int len)
|
|
248
|
+
{
|
|
249
|
+
mpg123_coreaudio_t* ca = (mpg123_coreaudio_t*)ao->userptr;
|
|
250
|
+
int written;
|
|
251
|
+
|
|
252
|
+
/* If there is no room, then sleep for half the length of the FIFO */
|
|
253
|
+
while (sfifo_space( &ca->fifo ) < len ) {
|
|
254
|
+
usleep( (FIFO_DURATION/2) * 1000000 );
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* Store converted audio in ring buffer */
|
|
258
|
+
written = sfifo_write( &ca->fifo, (char*)buf, len);
|
|
259
|
+
if (written != len) {
|
|
260
|
+
warning( "Failed to write audio to ring buffer" );
|
|
261
|
+
return -1;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* Start playback now that we have something to play */
|
|
265
|
+
if(!ca->play)
|
|
266
|
+
{
|
|
267
|
+
if(AudioOutputUnitStart(ca->outputUnit)) {
|
|
268
|
+
error("AudioOutputUnitStart failed");
|
|
269
|
+
return(-1);
|
|
270
|
+
}
|
|
271
|
+
ca->play = 1;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return len;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
static int close_coreaudio(audio_output_t *ao)
|
|
278
|
+
{
|
|
279
|
+
mpg123_coreaudio_t* ca = (mpg123_coreaudio_t*)ao->userptr;
|
|
280
|
+
|
|
281
|
+
if (ca) {
|
|
282
|
+
ca->decode_done = 1;
|
|
283
|
+
while(!ca->play_done && ca->play) usleep(10000);
|
|
284
|
+
|
|
285
|
+
/* No matter the error code, we want to close it (by brute force if necessary) */
|
|
286
|
+
AudioConverterDispose(ca->converter);
|
|
287
|
+
AudioOutputUnitStop(ca->outputUnit);
|
|
288
|
+
AudioUnitUninitialize(ca->outputUnit);
|
|
289
|
+
CloseComponent(ca->outputUnit);
|
|
290
|
+
|
|
291
|
+
/* Free the ring buffer */
|
|
292
|
+
sfifo_close( &ca->fifo );
|
|
293
|
+
|
|
294
|
+
/* Free the conversion buffer */
|
|
295
|
+
if (ca->buffer) {
|
|
296
|
+
free( ca->buffer );
|
|
297
|
+
ca->buffer = NULL;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return 0;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
static void flush_coreaudio(audio_output_t *ao)
|
|
306
|
+
{
|
|
307
|
+
mpg123_coreaudio_t* ca = (mpg123_coreaudio_t*)ao->userptr;
|
|
308
|
+
|
|
309
|
+
/* Stop playback */
|
|
310
|
+
if(AudioOutputUnitStop(ca->outputUnit)) {
|
|
311
|
+
error("AudioOutputUnitStop failed");
|
|
312
|
+
}
|
|
313
|
+
ca->play=0;
|
|
314
|
+
|
|
315
|
+
/* Empty out the ring buffer */
|
|
316
|
+
sfifo_flush( &ca->fifo );
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
static int deinit_coreaudio(audio_output_t* ao)
|
|
320
|
+
{
|
|
321
|
+
/* Free up memory */
|
|
322
|
+
if (ao->userptr) {
|
|
323
|
+
free( ao->userptr );
|
|
324
|
+
ao->userptr = NULL;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/* Success */
|
|
328
|
+
return 0;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
static int init_coreaudio(audio_output_t* ao)
|
|
332
|
+
{
|
|
333
|
+
if (ao==NULL) return -1;
|
|
334
|
+
|
|
335
|
+
/* Set callbacks */
|
|
336
|
+
ao->open = open_coreaudio;
|
|
337
|
+
ao->flush = flush_coreaudio;
|
|
338
|
+
ao->write = write_coreaudio;
|
|
339
|
+
ao->get_formats = get_formats_coreaudio;
|
|
340
|
+
ao->close = close_coreaudio;
|
|
341
|
+
ao->deinit = deinit_coreaudio;
|
|
342
|
+
|
|
343
|
+
/* Allocate memory for data structure */
|
|
344
|
+
ao->userptr = malloc( sizeof( mpg123_coreaudio_t ) );
|
|
345
|
+
if (ao->userptr==NULL) {
|
|
346
|
+
error("failed to malloc memory for 'mpg123_coreaudio_t'");
|
|
347
|
+
return -1;
|
|
348
|
+
}
|
|
349
|
+
memset( ao->userptr, 0, sizeof(mpg123_coreaudio_t) );
|
|
350
|
+
|
|
351
|
+
/* Success */
|
|
352
|
+
return 0;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
/*
|
|
358
|
+
Module information data structure
|
|
359
|
+
*/
|
|
360
|
+
mpg123_module_t mpg123_output_module_info = {
|
|
361
|
+
/* api_version */ MPG123_MODULE_API_VERSION,
|
|
362
|
+
/* name */ "coreaudio",
|
|
363
|
+
/* description */ "Output audio using Mac OS X's CoreAudio.",
|
|
364
|
+
/* revision */ "$Rev:$",
|
|
365
|
+
/* handle */ NULL,
|
|
366
|
+
|
|
367
|
+
/* init_output */ init_coreaudio,
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
|