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,74 @@
|
|
|
1
|
+
/*
|
|
2
|
+
xfermem: unidirectional fast pipe
|
|
3
|
+
|
|
4
|
+
copyright ?-2006 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 Oliver Fromme
|
|
7
|
+
old timestamp: Sat Mar 29 04:41:34 MET 1997
|
|
8
|
+
|
|
9
|
+
This is a stand-alone module which implements a unidirectional,
|
|
10
|
+
fast pipe using mmap(). Its primary use is to transfer large
|
|
11
|
+
amounts of data from a parent process to its child process,
|
|
12
|
+
with a buffer in between which decouples blocking conditions
|
|
13
|
+
on both sides. Control information is transferred between the
|
|
14
|
+
processes through a socketpair. See xftest.c for an example on
|
|
15
|
+
how to use this module.
|
|
16
|
+
|
|
17
|
+
note: xftest not there anymore
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#ifndef _XFERMEM_H_
|
|
21
|
+
#define _XFERMEM_H_
|
|
22
|
+
|
|
23
|
+
#ifndef TRUE
|
|
24
|
+
#define FALSE 0
|
|
25
|
+
#define TRUE 1
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
typedef struct {
|
|
29
|
+
size_t freeindex; /* [W] next free index */
|
|
30
|
+
size_t readindex; /* [R] next index to read */
|
|
31
|
+
int fd[2];
|
|
32
|
+
int wakeme[2];
|
|
33
|
+
byte *data;
|
|
34
|
+
byte *metadata;
|
|
35
|
+
size_t size;
|
|
36
|
+
size_t metasize;
|
|
37
|
+
long rate;
|
|
38
|
+
int channels;
|
|
39
|
+
int format;
|
|
40
|
+
int justwait;
|
|
41
|
+
} txfermem;
|
|
42
|
+
/*
|
|
43
|
+
* [W] -- May be written to by the writing process only!
|
|
44
|
+
* [R] -- May be written to by the reading process only!
|
|
45
|
+
* All other entries are initialized once.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
void xfermem_init (txfermem **xf, size_t bufsize, size_t msize, size_t skipbuf);
|
|
49
|
+
void xfermem_init_writer (txfermem *xf);
|
|
50
|
+
void xfermem_init_reader (txfermem *xf);
|
|
51
|
+
|
|
52
|
+
size_t xfermem_get_freespace (txfermem *xf);
|
|
53
|
+
size_t xfermem_get_usedspace (txfermem *xf);
|
|
54
|
+
#define XF_CMD_WAKEUP_INFO 0x04
|
|
55
|
+
#define XF_CMD_WAKEUP 0x02
|
|
56
|
+
#define XF_CMD_TERMINATE 0x03
|
|
57
|
+
#define XF_CMD_AUDIOCAP 0x05
|
|
58
|
+
#define XF_CMD_RESYNC 0x06
|
|
59
|
+
#define XF_CMD_ABORT 0x07
|
|
60
|
+
#define XF_WRITER 0
|
|
61
|
+
#define XF_READER 1
|
|
62
|
+
int xfermem_getcmd (int fd, int block);
|
|
63
|
+
int xfermem_putcmd (int fd, byte cmd);
|
|
64
|
+
int xfermem_block (int fd, txfermem *xf);
|
|
65
|
+
int xfermem_sigblock (int fd, txfermem *xf, int pid, int signal);
|
|
66
|
+
/* returns TRUE for being interrupted */
|
|
67
|
+
int xfermem_write(txfermem *xf, byte *buffer, size_t bytes);
|
|
68
|
+
|
|
69
|
+
void xfermem_done (txfermem *xf);
|
|
70
|
+
#define xfermem_done_writer xfermem_init_reader
|
|
71
|
+
#define xfermem_done_reader xfermem_init_writer
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
#endif
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
# A dirty script to create some windows binaries (shared, static, debug, ...) using the MSYS environment.
|
|
4
|
+
|
|
5
|
+
# give build type as command line argument
|
|
6
|
+
# x86 or x86_64-cross
|
|
7
|
+
build_type=$1
|
|
8
|
+
test -z "$build_type" && build_type=x86
|
|
9
|
+
|
|
10
|
+
echo "build type: $build_type"
|
|
11
|
+
case $build_type in
|
|
12
|
+
x86)
|
|
13
|
+
decoder=x86
|
|
14
|
+
strip=strip
|
|
15
|
+
hostopt=
|
|
16
|
+
;;
|
|
17
|
+
x86_64-cross)
|
|
18
|
+
decoder=x86-64
|
|
19
|
+
strip=x86_64-w64-mingw32-strip
|
|
20
|
+
hostopt="--host=x86_64-w64-mingw32 --build=`./build/config.guess`"
|
|
21
|
+
;;
|
|
22
|
+
*)
|
|
23
|
+
echo "Unknown build type!"
|
|
24
|
+
exit 1
|
|
25
|
+
;;
|
|
26
|
+
esac
|
|
27
|
+
|
|
28
|
+
temp="$PWD/tmp"
|
|
29
|
+
final="$PWD/releases"
|
|
30
|
+
txt="README COPYING NEWS"
|
|
31
|
+
# let's try with modules
|
|
32
|
+
opts=""
|
|
33
|
+
#opts="--with-audio=win32 --disable-modules"
|
|
34
|
+
|
|
35
|
+
# Get the version for the build from configure.ac .
|
|
36
|
+
version=`sed -n 's/^AC_INIT([^,]*, \[\([^,]*\)\], .*$/\1/p' < configure.ac`
|
|
37
|
+
echo "Building binaries for version $version"
|
|
38
|
+
|
|
39
|
+
prepare_dir()
|
|
40
|
+
{
|
|
41
|
+
test -e "$final" || mkdir "$final"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
prepare_unix2dos()
|
|
45
|
+
{
|
|
46
|
+
echo "preparing unix2dos tool"
|
|
47
|
+
# I'll include documentation in DOS-style, with the help of this little unix2dos variant.
|
|
48
|
+
test -x "unix2dos" || echo "
|
|
49
|
+
#include <unistd.h>
|
|
50
|
+
#include <stdio.h>
|
|
51
|
+
int main()
|
|
52
|
+
{
|
|
53
|
+
char buf[1000];
|
|
54
|
+
ssize_t got;
|
|
55
|
+
while((got=read(0, buf, 1000))>0)
|
|
56
|
+
{
|
|
57
|
+
ssize_t end=0;
|
|
58
|
+
ssize_t pos=0;
|
|
59
|
+
for(end=0;end<got;++end)
|
|
60
|
+
{
|
|
61
|
+
if(buf[end] == '\n')
|
|
62
|
+
{
|
|
63
|
+
write(1, buf+pos, end-pos);
|
|
64
|
+
write(1, \"\r\n\", 2);
|
|
65
|
+
pos=end+1;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
write(1, buf+pos, end-pos);
|
|
69
|
+
}
|
|
70
|
+
}" > unix2dos.c && gcc -O -o unix2dos unix2dos.c
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
mpg123_build()
|
|
74
|
+
{
|
|
75
|
+
cpu=$1
|
|
76
|
+
stat=$2
|
|
77
|
+
debug=$3
|
|
78
|
+
myopts=$opts
|
|
79
|
+
if test "$stat" = "y"; then
|
|
80
|
+
echo "static build (stat=$stat)" &&
|
|
81
|
+
name=mpg123-$version-static-$cpu
|
|
82
|
+
myopts="$myopts --disable-shared"
|
|
83
|
+
else
|
|
84
|
+
echo "dynamic build (stat=$stat)" &&
|
|
85
|
+
name=mpg123-$version-$cpu
|
|
86
|
+
fi &&
|
|
87
|
+
if test "$debug" = "y"; then
|
|
88
|
+
echo "Debugging build!"
|
|
89
|
+
name=$name-debug
|
|
90
|
+
myopts="$myopts --enable-debug"
|
|
91
|
+
fi &&
|
|
92
|
+
tmp=$temp-$name &&
|
|
93
|
+
echo "REMOVING $tmp!" &&
|
|
94
|
+
sleep 5 &&
|
|
95
|
+
if test -e Makefile; then make clean; fi &&
|
|
96
|
+
rm -rvf $tmp &&
|
|
97
|
+
./configure $hostopt --prefix=$tmp --with-module-suffix=.dll $myopts --with-cpu=$cpu && make && make install &&
|
|
98
|
+
rm -rf "$final/$name" &&
|
|
99
|
+
mkdir "$final/$name" &&
|
|
100
|
+
cp -v "$tmp/bin/mpg123.exe" "$final/$name" &&
|
|
101
|
+
if test "$debug" = y; then
|
|
102
|
+
echo "Not stripping the debug build..."
|
|
103
|
+
else
|
|
104
|
+
$strip --strip-unneeded "$final/$name/"*.exe
|
|
105
|
+
fi &&
|
|
106
|
+
if test "$stat" = "y"; then
|
|
107
|
+
echo "No DLL there..."
|
|
108
|
+
else
|
|
109
|
+
cp -v "$tmp/bin/libmpg123"*.dll "$tmp/include/mpg123.h" "$final/$name" &&
|
|
110
|
+
cp -v "src/libmpg123/.libs/libmpg123"*.dll.def "$final/$name" &&
|
|
111
|
+
if test "$debug" = y; then
|
|
112
|
+
echo "Not stripping the debug build..."
|
|
113
|
+
else
|
|
114
|
+
$strip --strip-unneeded "$final/$name/"*.dll || exit 1
|
|
115
|
+
fi
|
|
116
|
+
for i in $tmp/lib/mpg123/*.dll
|
|
117
|
+
do
|
|
118
|
+
if test -e "$i"; then
|
|
119
|
+
plugdir="$final/$name/plugins"
|
|
120
|
+
mkdir -p "$plugdir" &&
|
|
121
|
+
cp -v "$i" "$plugdir"
|
|
122
|
+
fi
|
|
123
|
+
done
|
|
124
|
+
fi &&
|
|
125
|
+
for i in $txt
|
|
126
|
+
do
|
|
127
|
+
echo "text file $i -> $final/$name/$i.txt"
|
|
128
|
+
./unix2dos < "$i" > "$final/$name/$i.txt"
|
|
129
|
+
done
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
prepare_dir &&
|
|
133
|
+
prepare_unix2dos &&
|
|
134
|
+
mpg123_build $decoder y n &&
|
|
135
|
+
mpg123_build $decoder n n &&
|
|
136
|
+
mpg123_build $decoder n y &&
|
|
137
|
+
echo "Hurray! Note: Please do not forget to copy the libltdl DLL from MSYS to the dynamic build directories... " || echo "Bleh..."
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Buffer do
|
|
4
|
+
it_behaves_like 'an audio object with format'
|
|
5
|
+
|
|
6
|
+
describe 'size after reading' do
|
|
7
|
+
context 'from the WAVE file' do
|
|
8
|
+
subject { Buffer.new(WAV_PATH) }
|
|
9
|
+
its(:size) { should eq 2250 }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context 'from the Ogg Vorbise file' do
|
|
13
|
+
subject { Buffer.new(OV_PATH) }
|
|
14
|
+
its(:size) { should eq 85342 }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'cannot be changed if it is being used by a source' do
|
|
19
|
+
error_pattern = /Invalid operation/
|
|
20
|
+
source = Source.new
|
|
21
|
+
another_source = Source.new
|
|
22
|
+
buffer = Buffer.new(WAV_PATH)
|
|
23
|
+
|
|
24
|
+
source.buffer = buffer
|
|
25
|
+
another_source.buffer = buffer
|
|
26
|
+
# Being used by two sources.
|
|
27
|
+
expect { buffer.load(WAV_PATH) }.to raise_error error_pattern
|
|
28
|
+
|
|
29
|
+
source.buffer = nil
|
|
30
|
+
# Still being used by one more source.
|
|
31
|
+
expect { buffer.load(WAV_PATH) }.to raise_error error_pattern
|
|
32
|
+
|
|
33
|
+
another_source.buffer = nil
|
|
34
|
+
# Not being used by any source.
|
|
35
|
+
expect { buffer.load(WAV_PATH) }.to_not raise_error
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Seal do
|
|
4
|
+
it 'should initialize and finalize correctly on default device' do
|
|
5
|
+
expect do
|
|
6
|
+
Seal.startup
|
|
7
|
+
Seal.cleanup
|
|
8
|
+
end.to_not raise_error
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it 'should fail when trying to initialize non-existing device' do
|
|
12
|
+
expect { Seal.startup 'foo42' }.to raise_error SealError
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'has only one instance of Listener' do
|
|
16
|
+
Seal.listener.should be Seal.listener
|
|
17
|
+
Seal.listener.should be_a Listener
|
|
18
|
+
expect { Seal::Listener.new }.to raise_error NoMethodError
|
|
19
|
+
expect { Seal::Listener.allocate }.to raise_error TypeError
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'defines a limit on the number of effect slots per source' do
|
|
23
|
+
Seal.per_source_effect_limit.should be_an Integer
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'defines a version string' do
|
|
27
|
+
Seal::VERSION.should match /\d\.\d\.\d/
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe EffectSlot do
|
|
4
|
+
before(:each) { GC.start }
|
|
5
|
+
|
|
6
|
+
describe 'by default' do
|
|
7
|
+
its(:auto?) { should be_true }
|
|
8
|
+
its(:effect) { should be_nil }
|
|
9
|
+
its(:gain) { should eq 1.0 }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it_validates 'the boolean attribute', :auto
|
|
13
|
+
it_validates 'the float attribute', :gain, "[0, 1]"
|
|
14
|
+
|
|
15
|
+
it 'can initialize with an effect' do
|
|
16
|
+
reverb = Reverb.new
|
|
17
|
+
effect_slot = EffectSlot.new(reverb)
|
|
18
|
+
effect_slot.effect.should be reverb
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'can set an effect' do
|
|
22
|
+
effect_slot = subject
|
|
23
|
+
reverb = Reverb.new
|
|
24
|
+
effect_slot.effect = reverb
|
|
25
|
+
effect_slot.effect.should be reverb
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'has a limited number of sources it can feed concurrently' do
|
|
29
|
+
effect_slot = subject
|
|
30
|
+
sources = []
|
|
31
|
+
Seal.per_source_effect_limit.times do |i|
|
|
32
|
+
sources << Source.new
|
|
33
|
+
effect_slot.feed(i, sources[-1])
|
|
34
|
+
end
|
|
35
|
+
expect { effect_slot.feed(sources.size, Source.new) }.to raise_error \
|
|
36
|
+
/Invalid parameter value/
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Listener do
|
|
4
|
+
subject { LISTENER }
|
|
5
|
+
|
|
6
|
+
it_behaves_like 'a movable object'
|
|
7
|
+
|
|
8
|
+
describe 'by default' do
|
|
9
|
+
its(:gain) { should eq 1.0 }
|
|
10
|
+
its(:orientation) { should eq [[0, 0, -1], [0, 1, 0]] }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'can change its orientation' do
|
|
14
|
+
old_orientation = LISTENER.orientation
|
|
15
|
+
LISTENER.orientation = [0, 1, 0], [3, 0, 0]
|
|
16
|
+
LISTENER.orientation[0].should eq [0, 1, 0]
|
|
17
|
+
LISTENER.orientation[1].should eq [3, 0, 0]
|
|
18
|
+
LISTENER.orientation = old_orientation
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "validates the float attribute 'gain' is in [0, +inf.)" do
|
|
22
|
+
old_gain = LISTENER.gain
|
|
23
|
+
LISTENER.gain = 0.34767
|
|
24
|
+
LISTENER.gain.should be_within(TOLERANCE).of 0.34767
|
|
25
|
+
LISTENER.gain = 10
|
|
26
|
+
error_pattern = /Invalid parameter value/
|
|
27
|
+
expect { LISTENER.gain = -0.1 }.to raise_error error_pattern
|
|
28
|
+
expect { LISTENER.gain = -1.3 }.to raise_error error_pattern
|
|
29
|
+
expect { LISTENER.gain = -3203 }.to raise_error error_pattern
|
|
30
|
+
LISTENER.gain.should eq 10
|
|
31
|
+
LISTENER.gain = old_gain
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Reverb do
|
|
4
|
+
describe 'by default' do
|
|
5
|
+
its(:air_absorbtion_hfgain) { should be_within(TOLERANCE).of 0.994 }
|
|
6
|
+
its(:decay_time) { should be_within(TOLERANCE).of 1.49 }
|
|
7
|
+
its(:diffusion) { should be_within(TOLERANCE).of 1.0 }
|
|
8
|
+
its(:density) { should be_within(TOLERANCE).of 1.0 }
|
|
9
|
+
its(:gain) { should be_within(TOLERANCE).of 0.32 }
|
|
10
|
+
its(:hfdecay_limited?) { should be_true }
|
|
11
|
+
its(:hfdecay_ratio) { should be_within(TOLERANCE).of 0.83 }
|
|
12
|
+
its(:hfgain) { should be_within(TOLERANCE).of 0.89 }
|
|
13
|
+
its(:late_delay) { should be_within(TOLERANCE).of 0.011 }
|
|
14
|
+
its(:late_gain) { should be_within(TOLERANCE).of 1.26 }
|
|
15
|
+
its(:reflections_delay) { should be_within(TOLERANCE).of 0.007 }
|
|
16
|
+
its(:reflections_gain) { should be_within(TOLERANCE).of 0.05 }
|
|
17
|
+
its(:room_rolloff_factor) { should be_within(TOLERANCE).of 0 }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it_validates 'the boolean attribute', :hfdecay_limited
|
|
21
|
+
it_validates 'the float attribute', :air_absorbtion_hfgain, '[0.892, 1]'
|
|
22
|
+
it_validates 'the float attribute', :decay_time, '[0.1, 20]'
|
|
23
|
+
it_validates 'the float attribute', :density, '[0, 1]'
|
|
24
|
+
it_validates 'the float attribute', :diffusion, '[0, 1]'
|
|
25
|
+
it_validates 'the float attribute', :gain, '[0, 1]'
|
|
26
|
+
it_validates 'the float attribute', :hfdecay_ratio, '[0.1, 2]'
|
|
27
|
+
it_validates 'the float attribute', :hfgain, '[0, 1]'
|
|
28
|
+
it_validates 'the float attribute', :late_delay, '[0, 0.1]'
|
|
29
|
+
it_validates 'the float attribute', :late_gain, '[0, 10]'
|
|
30
|
+
it_validates 'the float attribute', :reflections_delay, '[0, 0.3]'
|
|
31
|
+
it_validates 'the float attribute', :reflections_gain, '[0, 3.16]'
|
|
32
|
+
it_validates 'the float attribute', :room_rolloff_factor, '[0, 10]'
|
|
33
|
+
|
|
34
|
+
it 'can load different reverb presets' do
|
|
35
|
+
test_load_presets = -> a_module do
|
|
36
|
+
a_module.constants.each do |const_sym|
|
|
37
|
+
constant = a_module.const_get const_sym
|
|
38
|
+
case constant
|
|
39
|
+
when Module
|
|
40
|
+
test_load_presets.call(constant)
|
|
41
|
+
else
|
|
42
|
+
expect do
|
|
43
|
+
reverb = Reverb.new(constant)
|
|
44
|
+
reverb.load(constant)
|
|
45
|
+
end.to_not raise_error
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
test_load_presets.call(Reverb::Preset)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
include Source::State
|
|
4
|
+
include Source::Type
|
|
5
|
+
|
|
6
|
+
describe Source do
|
|
7
|
+
let(:source) { Source.new }
|
|
8
|
+
let(:stream) { Stream.new(WAV_PATH) }
|
|
9
|
+
let(:buffer) { Buffer.new(WAV_PATH) }
|
|
10
|
+
|
|
11
|
+
it_behaves_like 'a movable object'
|
|
12
|
+
|
|
13
|
+
describe 'by default' do
|
|
14
|
+
its(:auto?) { should be_true }
|
|
15
|
+
its(:buffer) { should be_nil }
|
|
16
|
+
its(:chunk_size) { should eq 36864 }
|
|
17
|
+
its(:gain) { should be_within(TOLERANCE).of(1.0) }
|
|
18
|
+
its(:looping) { should be_false }
|
|
19
|
+
its(:pitch) { should be_within(TOLERANCE).of(1.0) }
|
|
20
|
+
its(:queue_size) { should eq 3 }
|
|
21
|
+
its(:relative) { should be_false }
|
|
22
|
+
its(:state) { should be INITIAL }
|
|
23
|
+
its(:stream) { should be_nil }
|
|
24
|
+
its (:type) { should be UNDETERMINED }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it_validates 'the boolean attribute', :relative
|
|
28
|
+
it_validates 'the boolean attribute', :auto
|
|
29
|
+
it_validates 'the float attribute', :pitch, "[0, +inf.)"
|
|
30
|
+
it_validates 'the float attribute', :gain, "[0, +inf.)"
|
|
31
|
+
|
|
32
|
+
it 'validates its queue size is in [2, 63]' do
|
|
33
|
+
error_pattern = /Invalid parameter value/
|
|
34
|
+
expect { source.queue_size = -130 }.to raise_error error_pattern
|
|
35
|
+
expect { source.queue_size = 0 }.to raise_error error_pattern
|
|
36
|
+
expect { source.queue_size = 1 }.to raise_error error_pattern
|
|
37
|
+
source.queue_size = 2
|
|
38
|
+
source.queue_size.should eq 2
|
|
39
|
+
source.queue_size = 32
|
|
40
|
+
source.queue_size.should eq 32
|
|
41
|
+
source.queue_size = 63
|
|
42
|
+
source.queue_size.should eq 63
|
|
43
|
+
expect { source.queue_size = 64 }.to raise_error error_pattern
|
|
44
|
+
expect { source.queue_size = 1203 }.to raise_error error_pattern
|
|
45
|
+
source.queue_size.should eq 63
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'validates it has an auto-adjusting chunk size in [9216, 16773120]' do
|
|
49
|
+
error_pattern = /Invalid parameter value/
|
|
50
|
+
expect { source.chunk_size = 0 }.to raise_error error_pattern
|
|
51
|
+
expect { source.chunk_size = 432 }.to raise_error error_pattern
|
|
52
|
+
expect { source.chunk_size = 9215 }.to raise_error error_pattern
|
|
53
|
+
source.chunk_size = 9216
|
|
54
|
+
source.chunk_size.should eq 9216
|
|
55
|
+
# It should be automatically adjusted to a smaller multiple of 9216.
|
|
56
|
+
source.chunk_size = 9217
|
|
57
|
+
source.chunk_size.should eq 9216
|
|
58
|
+
source.chunk_size = 32768
|
|
59
|
+
source.chunk_size.should eq 27648
|
|
60
|
+
source.chunk_size = 294912
|
|
61
|
+
source.chunk_size.should eq 294912
|
|
62
|
+
source.chunk_size = 16773119
|
|
63
|
+
source.chunk_size.should eq 16763904
|
|
64
|
+
source.chunk_size = 16773120
|
|
65
|
+
source.chunk_size.should eq 16773120
|
|
66
|
+
expect { source.chunk_size = 16773121 }.to raise_error error_pattern
|
|
67
|
+
expect { source.chunk_size = 234923428 }.to raise_error error_pattern
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context 'with a buffer' do
|
|
71
|
+
before(:each) { source.buffer = buffer }
|
|
72
|
+
|
|
73
|
+
it 'cannot also have a stream unless buffer is detached' do
|
|
74
|
+
error_pattern = /attach a stream to a static source/
|
|
75
|
+
expect { source.stream = stream }.to raise_error error_pattern
|
|
76
|
+
source.play
|
|
77
|
+
expect { source.stream = stream }.to raise_error error_pattern
|
|
78
|
+
source.pause
|
|
79
|
+
expect { source.stream = stream }.to raise_error error_pattern
|
|
80
|
+
source.stop
|
|
81
|
+
expect { source.stream = stream }.to raise_error error_pattern
|
|
82
|
+
source.buffer = nil
|
|
83
|
+
expect { source.stream = stream }.to_not raise_error
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'cannot change its buffer while playing' do
|
|
87
|
+
source.play
|
|
88
|
+
expect { source.buffer = buffer }.to raise_error /Invalid operation/
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'cannot change its buffer while paused' do
|
|
92
|
+
source.play
|
|
93
|
+
source.pause
|
|
94
|
+
expect { source.buffer = buffer }.to raise_error /Invalid operation/
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'can change its buffer while stopped' do
|
|
98
|
+
source.play
|
|
99
|
+
source.stop
|
|
100
|
+
expect { source.buffer = buffer }.to_not raise_error
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it 'can change its buffer while in initial state' do
|
|
104
|
+
expect { source.buffer = buffer }.to_not raise_error
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'can share its buffer' do
|
|
108
|
+
expect do
|
|
109
|
+
another_source = Source.new
|
|
110
|
+
another_source.buffer = source.buffer
|
|
111
|
+
another_source.play
|
|
112
|
+
source.play
|
|
113
|
+
end.to_not raise_error
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
context 'with a stream' do
|
|
118
|
+
let(:another_stream) { Stream.new(WAV_PATH) }
|
|
119
|
+
|
|
120
|
+
before(:each) { source.stream = stream }
|
|
121
|
+
|
|
122
|
+
it 'can set the same stream to itself' do
|
|
123
|
+
expect { source.stream = stream }.to_not raise_error
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it 'cannot also have a buffer unless stream is detached' do
|
|
127
|
+
error_pattern = /attach a buffer to a streaming source/
|
|
128
|
+
expect { source.buffer = buffer }.to raise_error error_pattern
|
|
129
|
+
source.play
|
|
130
|
+
expect { source.buffer = buffer }.to raise_error error_pattern
|
|
131
|
+
source.pause
|
|
132
|
+
expect { source.buffer = buffer }.to raise_error error_pattern
|
|
133
|
+
source.stop
|
|
134
|
+
expect { source.buffer = buffer }.to raise_error error_pattern
|
|
135
|
+
source.stream = nil
|
|
136
|
+
expect { source.buffer = buffer }.to_not raise_error
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'cannot have a closed stream' do
|
|
140
|
+
another_stream.close
|
|
141
|
+
expect { source.stream = another_stream }.to raise_error \
|
|
142
|
+
/uninitialized stream/
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it 'can only change its stream to one with compatible format' do
|
|
146
|
+
expect { source.stream = another_stream }.to_not raise_error
|
|
147
|
+
expect { source.stream = Stream.new(OV_PATH) }.to raise_error \
|
|
148
|
+
/different audio format/
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it 'can change to another stream in any state' do
|
|
152
|
+
expect do
|
|
153
|
+
source.stream = another_stream
|
|
154
|
+
source.play
|
|
155
|
+
source.stream = another_stream
|
|
156
|
+
source.pause
|
|
157
|
+
source.stream = another_stream
|
|
158
|
+
source.stop
|
|
159
|
+
source.stream = another_stream
|
|
160
|
+
end.to_not raise_error
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it 'can share its stream' do
|
|
164
|
+
expect do
|
|
165
|
+
another_source = Source.new
|
|
166
|
+
another_source.stream = stream
|
|
167
|
+
another_source.play
|
|
168
|
+
source.play
|
|
169
|
+
source.stream = another_stream
|
|
170
|
+
another_source.stream = another_stream
|
|
171
|
+
end.to_not raise_error
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it 'fails to perform if stream is closed' do
|
|
175
|
+
error_pattern = /uninitialized stream/
|
|
176
|
+
stream.close
|
|
177
|
+
expect { source.update }.to raise_error error_pattern
|
|
178
|
+
expect { source.stop }.to raise_error error_pattern
|
|
179
|
+
expect { source.play }.to raise_error error_pattern
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
describe 'automatic streaming' do
|
|
184
|
+
let(:source) do
|
|
185
|
+
Source.new.tap do |source|
|
|
186
|
+
source.stream = Stream.new(OV_PATH)
|
|
187
|
+
source.looping = true
|
|
188
|
+
source.pitch = 3
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it 'continues in the background' do
|
|
193
|
+
source.play
|
|
194
|
+
sleep(0.5)
|
|
195
|
+
source.state.should be PLAYING
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
it 'can be disabled (taking effect upon the next play call)' do
|
|
199
|
+
source.play
|
|
200
|
+
source.auto = false
|
|
201
|
+
sleep(0.5)
|
|
202
|
+
# Not stopping streaming until the next play call.
|
|
203
|
+
source.state.should be PLAYING
|
|
204
|
+
source.play
|
|
205
|
+
sleep(0.5)
|
|
206
|
+
source.state.should be STOPPED
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
describe 'looping' do
|
|
211
|
+
example 'as undetermined type' do
|
|
212
|
+
source.looping?.should be_false
|
|
213
|
+
source.looping = true
|
|
214
|
+
source.looping.should be_true
|
|
215
|
+
source.looping = false
|
|
216
|
+
source.looping?.should be_false
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
example 'as streaming type' do
|
|
220
|
+
source.looping = true
|
|
221
|
+
source.stream = stream
|
|
222
|
+
source.looping?.should be_true
|
|
223
|
+
source.looping = false
|
|
224
|
+
source.looping?.should be_false
|
|
225
|
+
source.looping = true
|
|
226
|
+
source.looping?.should be_true
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
example 'as static type' do
|
|
230
|
+
source.looping = true
|
|
231
|
+
source.buffer = buffer
|
|
232
|
+
source.looping?.should be_true
|
|
233
|
+
source.looping = false
|
|
234
|
+
source.looping?.should be_false
|
|
235
|
+
source.looping = true
|
|
236
|
+
source.looping?.should be_true
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# This example depends on the length of the test audio file.
|
|
240
|
+
it 'is true if and only if source repeats' do
|
|
241
|
+
source.stream = stream
|
|
242
|
+
source.pitch = 2
|
|
243
|
+
source.play
|
|
244
|
+
sleep(0.3)
|
|
245
|
+
source.state.should be STOPPED
|
|
246
|
+
source.looping = true
|
|
247
|
+
source.play
|
|
248
|
+
sleep(0.3)
|
|
249
|
+
source.state.should be PLAYING
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
describe 'type' do
|
|
254
|
+
it 'should initially be undetermined' do
|
|
255
|
+
source.type.should be UNDETERMINED
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
it 'should be streaming if it has a stream' do
|
|
259
|
+
source.stream = stream
|
|
260
|
+
source.type.should be STREAMING
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it 'should be static if it has a buffer' do
|
|
264
|
+
source.buffer = buffer
|
|
265
|
+
source.type.should be STATIC
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it 'should be undetermined after detaching' do
|
|
269
|
+
source.stream = stream
|
|
270
|
+
source.stream = nil
|
|
271
|
+
source.type.should be UNDETERMINED
|
|
272
|
+
source.buffer = buffer
|
|
273
|
+
source.buffer = nil
|
|
274
|
+
source.type.should be UNDETERMINED
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
describe 'state transition' do
|
|
279
|
+
before :each do
|
|
280
|
+
source.tap { |source| source.stream = stream }
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
example 'from initial state' do
|
|
284
|
+
source.state.should be INITIAL
|
|
285
|
+
source.stop
|
|
286
|
+
source.state.should be INITIAL
|
|
287
|
+
source.pause
|
|
288
|
+
source.state.should be INITIAL
|
|
289
|
+
source.rewind
|
|
290
|
+
source.state.should be INITIAL
|
|
291
|
+
source.play
|
|
292
|
+
source.state.should be PLAYING
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
example 'from playing state' do
|
|
296
|
+
source.play
|
|
297
|
+
source.state.should be PLAYING
|
|
298
|
+
source.rewind
|
|
299
|
+
source.state.should be INITIAL
|
|
300
|
+
source.play
|
|
301
|
+
source.stop
|
|
302
|
+
source.state.should be STOPPED
|
|
303
|
+
source.play
|
|
304
|
+
source.pause
|
|
305
|
+
source.state.should be PAUSED
|
|
306
|
+
source.play
|
|
307
|
+
source.play
|
|
308
|
+
source.state.should be PLAYING
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
example 'from paused state' do
|
|
312
|
+
source.play
|
|
313
|
+
source.pause
|
|
314
|
+
source.state.should be PAUSED
|
|
315
|
+
source.play
|
|
316
|
+
source.state.should be PLAYING
|
|
317
|
+
source.pause
|
|
318
|
+
source.rewind
|
|
319
|
+
source.state.should be INITIAL
|
|
320
|
+
source.play
|
|
321
|
+
source.pause
|
|
322
|
+
source.stop
|
|
323
|
+
source.state.should be STOPPED
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
example 'from stopped state' do
|
|
327
|
+
source.play
|
|
328
|
+
source.stop
|
|
329
|
+
source.state.should be STOPPED
|
|
330
|
+
source.pause
|
|
331
|
+
source.state.should be STOPPED
|
|
332
|
+
source.play
|
|
333
|
+
source.state.should be PLAYING
|
|
334
|
+
source.stop
|
|
335
|
+
source.rewind
|
|
336
|
+
source.state.should be INITIAL
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
context 'when detaching' do
|
|
340
|
+
example 'from initial state' do
|
|
341
|
+
source.state.should be INITIAL
|
|
342
|
+
source.stream = nil
|
|
343
|
+
source.state.should be INITIAL
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
example 'from playing state' do
|
|
347
|
+
source.play
|
|
348
|
+
source.state.should be PLAYING
|
|
349
|
+
source.stream = nil
|
|
350
|
+
source.state.should be INITIAL
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
example 'from paused state' do
|
|
354
|
+
source.play
|
|
355
|
+
source.pause
|
|
356
|
+
source.state.should be PAUSED
|
|
357
|
+
source.stream = nil
|
|
358
|
+
source.state.should be INITIAL
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
example 'from stopped state' do
|
|
362
|
+
source.play
|
|
363
|
+
source.stop
|
|
364
|
+
source.state.should be STOPPED
|
|
365
|
+
source.stream = nil
|
|
366
|
+
source.state.should be INITIAL
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
end
|