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,152 @@
|
|
|
1
|
+
/*
|
|
2
|
+
sample.h: The conversion from internal data to output samples of differing formats.
|
|
3
|
+
|
|
4
|
+
copyright 2007-9 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 Thomas Orgis, taking WRITE_SAMPLE from decode.c
|
|
7
|
+
Later added the end-conversion specific macros here, too.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#ifndef SAMPLE_H
|
|
11
|
+
#define SAMPLE_H
|
|
12
|
+
|
|
13
|
+
/* mpg123lib_intern.h is included already, right? */
|
|
14
|
+
|
|
15
|
+
/* Special case is fixed point math... which does work, but not that nice yet. */
|
|
16
|
+
#ifdef REAL_IS_FIXED
|
|
17
|
+
static inline short idiv_signed_rounded(long x, int shift)
|
|
18
|
+
{
|
|
19
|
+
x >>= (shift - 1);
|
|
20
|
+
x += (x & 1);
|
|
21
|
+
return (short)(x >> 1);
|
|
22
|
+
}
|
|
23
|
+
# define REAL_PLUS_32767 ( 32767 << 15 )
|
|
24
|
+
# define REAL_MINUS_32768 ( -32768 << 15 )
|
|
25
|
+
# define REAL_TO_SHORT(x) (idiv_signed_rounded(x, 15))
|
|
26
|
+
/* No better code (yet). */
|
|
27
|
+
# define REAL_TO_SHORT_ACCURATE(x) REAL_TO_SHORT(x)
|
|
28
|
+
/* This is just here for completeness, it is not used! */
|
|
29
|
+
# define REAL_TO_S32(x) (x)
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
/* From now on for single precision float... double precision is a possible option once we added some bits. But, it would be rather insane. */
|
|
33
|
+
#ifndef REAL_TO_SHORT
|
|
34
|
+
|
|
35
|
+
/* Define the accurate rounding function. */
|
|
36
|
+
# if (defined REAL_IS_FLOAT) && (defined IEEE_FLOAT)
|
|
37
|
+
/* This function is only available for IEEE754 single-precision values
|
|
38
|
+
This is nearly identical to proper rounding, just -+0.5 is rounded to 0 */
|
|
39
|
+
static inline short ftoi16(float x)
|
|
40
|
+
{
|
|
41
|
+
union
|
|
42
|
+
{
|
|
43
|
+
float f;
|
|
44
|
+
int32_t i;
|
|
45
|
+
} u_fi;
|
|
46
|
+
u_fi.f = x + 12582912.0f; /* Magic Number: 2^23 + 2^22 */
|
|
47
|
+
return (short)u_fi.i;
|
|
48
|
+
}
|
|
49
|
+
# define REAL_TO_SHORT_ACCURATE(x) ftoi16(x)
|
|
50
|
+
# else
|
|
51
|
+
/* The "proper" rounding, plain C, a bit slow. */
|
|
52
|
+
# define REAL_TO_SHORT_ACCURATE(x) (short)((x)>0.0?(x)+0.5:(x)-0.5)
|
|
53
|
+
# endif
|
|
54
|
+
|
|
55
|
+
/* Now define the normal rounding. */
|
|
56
|
+
# ifdef ACCURATE_ROUNDING
|
|
57
|
+
# define REAL_TO_SHORT(x) REAL_TO_SHORT_ACCURATE(x)
|
|
58
|
+
# else
|
|
59
|
+
/* Non-accurate rounding... simple truncation. Fastest, most LSB errors. */
|
|
60
|
+
# define REAL_TO_SHORT(x) (short)(x)
|
|
61
|
+
# endif
|
|
62
|
+
|
|
63
|
+
#endif /* REAL_TO_SHORT */
|
|
64
|
+
|
|
65
|
+
/* We should add dithering for S32, too? */
|
|
66
|
+
#ifndef REAL_TO_S32
|
|
67
|
+
# ifdef ACCURATE_ROUNDING
|
|
68
|
+
# define REAL_TO_S32(x) (int32_t)((x)>0.0?(x)+0.5:(x)-0.5)
|
|
69
|
+
# else
|
|
70
|
+
# define REAL_TO_S32(x) (int32_t)(x)
|
|
71
|
+
# endif
|
|
72
|
+
#endif
|
|
73
|
+
|
|
74
|
+
#ifndef REAL_PLUS_32767
|
|
75
|
+
# define REAL_PLUS_32767 32767.0
|
|
76
|
+
#endif
|
|
77
|
+
#ifndef REAL_MINUS_32768
|
|
78
|
+
# define REAL_MINUS_32768 -32768.0
|
|
79
|
+
#endif
|
|
80
|
+
#ifndef REAL_PLUS_S32
|
|
81
|
+
# define REAL_PLUS_S32 2147483647.0
|
|
82
|
+
#endif
|
|
83
|
+
#ifndef REAL_MINUS_S32
|
|
84
|
+
# define REAL_MINUS_S32 -2147483648.0
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
/* The actual storage of a decoded sample is separated in the following macros.
|
|
89
|
+
We can handle different types, we could also handle dithering here. */
|
|
90
|
+
|
|
91
|
+
#ifdef NEWOLD_WRITE_SAMPLE
|
|
92
|
+
|
|
93
|
+
/* This is the old new mpg123 WRITE_SAMPLE, fixed for newer GCC by MPlayer folks.
|
|
94
|
+
Makes a huge difference on old machines. */
|
|
95
|
+
#if WORDS_BIGENDIAN
|
|
96
|
+
#define MANTISSA_OFFSET 1
|
|
97
|
+
#else
|
|
98
|
+
#define MANTISSA_OFFSET 0
|
|
99
|
+
#endif
|
|
100
|
+
#define WRITE_SHORT_SAMPLE(samples,sum,clip) { \
|
|
101
|
+
union { double dtemp; int itemp[2]; } u; int v; \
|
|
102
|
+
u.dtemp = ((((65536.0 * 65536.0 * 16)+(65536.0 * 0.5))* 65536.0)) + (sum);\
|
|
103
|
+
v = u.itemp[MANTISSA_OFFSET] - 0x80000000; \
|
|
104
|
+
if( v > 32767) { *(samples) = 0x7fff; (clip)++; } \
|
|
105
|
+
else if( v < -32768) { *(samples) = -0x8000; (clip)++; } \
|
|
106
|
+
else { *(samples) = v; } \
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#else
|
|
110
|
+
/* Macro to produce a short (signed 16bit) output sample from internal representation,
|
|
111
|
+
which may be float, double or indeed some integer for fixed point handling. */
|
|
112
|
+
#define WRITE_SHORT_SAMPLE(samples,sum,clip) \
|
|
113
|
+
if( (sum) > REAL_PLUS_32767) { *(samples) = 0x7fff; (clip)++; } \
|
|
114
|
+
else if( (sum) < REAL_MINUS_32768) { *(samples) = -0x8000; (clip)++; } \
|
|
115
|
+
else { *(samples) = REAL_TO_SHORT(sum); }
|
|
116
|
+
#endif
|
|
117
|
+
|
|
118
|
+
/* Same as above, but always using accurate rounding. Would we want softer clipping here, too? */
|
|
119
|
+
#define WRITE_SHORT_SAMPLE_ACCURATE(samples,sum,clip) \
|
|
120
|
+
if( (sum) > REAL_PLUS_32767) { *(samples) = 0x7fff; (clip)++; } \
|
|
121
|
+
else if( (sum) < REAL_MINUS_32768) { *(samples) = -0x8000; (clip)++; } \
|
|
122
|
+
else { *(samples) = REAL_TO_SHORT_ACCURATE(sum); }
|
|
123
|
+
|
|
124
|
+
/*
|
|
125
|
+
32bit signed
|
|
126
|
+
We do clipping with the same old borders... but different conversion.
|
|
127
|
+
We see here that we need extra work for non-16bit output... we optimized for 16bit.
|
|
128
|
+
-0x7fffffff-1 is the minimum 32 bit signed integer value expressed so that MSVC
|
|
129
|
+
does not give a compile time warning.
|
|
130
|
+
*/
|
|
131
|
+
#define WRITE_S32_SAMPLE(samples,sum,clip) \
|
|
132
|
+
{ \
|
|
133
|
+
real tmpsum = REAL_MUL((sum),S32_RESCALE); \
|
|
134
|
+
if( tmpsum > REAL_PLUS_S32 ){ *(samples) = 0x7fffffff; (clip)++; } \
|
|
135
|
+
else if( tmpsum < REAL_MINUS_S32 ) { *(samples) = -0x7fffffff-1; (clip)++; } \
|
|
136
|
+
else { *(samples) = REAL_TO_S32(tmpsum); } \
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* Produce an 8bit sample, via 16bit intermediate. */
|
|
140
|
+
#define WRITE_8BIT_SAMPLE(samples,sum,clip) \
|
|
141
|
+
{ \
|
|
142
|
+
short write_8bit_tmp; \
|
|
143
|
+
if( (sum) > REAL_PLUS_32767) { write_8bit_tmp = 0x7fff; (clip)++; } \
|
|
144
|
+
else if( (sum) < REAL_MINUS_32768) { write_8bit_tmp = -0x8000; (clip)++; } \
|
|
145
|
+
else { write_8bit_tmp = REAL_TO_SHORT(sum); } \
|
|
146
|
+
*(samples) = fr->conv16to8[write_8bit_tmp>>AUSHIFT]; \
|
|
147
|
+
}
|
|
148
|
+
#ifndef REAL_IS_FIXED
|
|
149
|
+
#define WRITE_REAL_SAMPLE(samples,sum,clip) *(samples) = ((real)1./SHORT_SCALE)*(sum)
|
|
150
|
+
#endif
|
|
151
|
+
|
|
152
|
+
#endif
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/*
|
|
2
|
+
stringbuf: mimicking a bit of C++ to more safely handle strings
|
|
3
|
+
|
|
4
|
+
copyright 2006-10 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 Thomas Orgis
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include "mpg123lib_intern.h"
|
|
10
|
+
#include "config.h"
|
|
11
|
+
#include "mpg123.h"
|
|
12
|
+
#include "compat.h"
|
|
13
|
+
#include <string.h>
|
|
14
|
+
#include "debug.h"
|
|
15
|
+
|
|
16
|
+
void attribute_align_arg mpg123_init_string(mpg123_string* sb)
|
|
17
|
+
{
|
|
18
|
+
sb->p = NULL;
|
|
19
|
+
sb->size = 0;
|
|
20
|
+
sb->fill = 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
void attribute_align_arg mpg123_free_string(mpg123_string* sb)
|
|
24
|
+
{
|
|
25
|
+
if(sb->p != NULL) free(sb->p);
|
|
26
|
+
mpg123_init_string(sb);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
int attribute_align_arg mpg123_grow_string(mpg123_string* sb, size_t new)
|
|
30
|
+
{
|
|
31
|
+
if(sb->size < new) return mpg123_resize_string(sb, new);
|
|
32
|
+
else return 1;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
int attribute_align_arg mpg123_resize_string(mpg123_string* sb, size_t new)
|
|
36
|
+
{
|
|
37
|
+
debug3("resizing string pointer %p from %lu to %lu", (void*) sb->p, (unsigned long)sb->size, (unsigned long)new);
|
|
38
|
+
if(new == 0)
|
|
39
|
+
{
|
|
40
|
+
if(sb->size && sb->p != NULL) free(sb->p);
|
|
41
|
+
mpg123_init_string(sb);
|
|
42
|
+
return 1;
|
|
43
|
+
}
|
|
44
|
+
if(sb->size != new)
|
|
45
|
+
{
|
|
46
|
+
char* t;
|
|
47
|
+
debug("really!");
|
|
48
|
+
t = (char*) safe_realloc(sb->p, new*sizeof(char));
|
|
49
|
+
debug1("safe_realloc returned %p", (void*) t);
|
|
50
|
+
if(t != NULL)
|
|
51
|
+
{
|
|
52
|
+
sb->p = t;
|
|
53
|
+
sb->size = new;
|
|
54
|
+
return 1;
|
|
55
|
+
}
|
|
56
|
+
else return 0;
|
|
57
|
+
}
|
|
58
|
+
else return 1; /* success */
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
int attribute_align_arg mpg123_copy_string(mpg123_string* from, mpg123_string* to)
|
|
62
|
+
{
|
|
63
|
+
size_t fill;
|
|
64
|
+
char *text;
|
|
65
|
+
if(to == NULL) return -1;
|
|
66
|
+
|
|
67
|
+
debug2("called copy_string with %p -> %p", (void*)from, (void*)to);
|
|
68
|
+
if(from == NULL)
|
|
69
|
+
{
|
|
70
|
+
fill = 0;
|
|
71
|
+
text = NULL;
|
|
72
|
+
}
|
|
73
|
+
else
|
|
74
|
+
{
|
|
75
|
+
fill = from->fill;
|
|
76
|
+
text = from->p;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if(mpg123_resize_string(to, fill))
|
|
80
|
+
{
|
|
81
|
+
memcpy(to->p, text, fill);
|
|
82
|
+
to->fill = fill;
|
|
83
|
+
return 1;
|
|
84
|
+
}
|
|
85
|
+
else return 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
int attribute_align_arg mpg123_add_string(mpg123_string* sb, const char* stuff)
|
|
89
|
+
{
|
|
90
|
+
debug1("adding %s", stuff);
|
|
91
|
+
return mpg123_add_substring(sb, stuff, 0, strlen(stuff));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
int attribute_align_arg mpg123_add_substring(mpg123_string *sb, const char *stuff, size_t from, size_t count)
|
|
95
|
+
{
|
|
96
|
+
debug("adding a substring");
|
|
97
|
+
if(sb->fill) /* includes zero byte... */
|
|
98
|
+
{
|
|
99
|
+
if( (SIZE_MAX - sb->fill >= count) /* Avoid overflow. */
|
|
100
|
+
&& (sb->size >= sb->fill+count || mpg123_grow_string(sb, sb->fill+count)) )
|
|
101
|
+
{
|
|
102
|
+
memcpy(sb->p+sb->fill-1, stuff+from, count);
|
|
103
|
+
sb->fill += count;
|
|
104
|
+
sb->p[sb->fill-1] = 0; /* Terminate! */
|
|
105
|
+
}
|
|
106
|
+
else return 0;
|
|
107
|
+
}
|
|
108
|
+
else
|
|
109
|
+
{
|
|
110
|
+
if( count < SIZE_MAX && mpg123_grow_string(sb, count+1) )
|
|
111
|
+
{
|
|
112
|
+
memcpy(sb->p, stuff+from, count);
|
|
113
|
+
sb->fill = count+1;
|
|
114
|
+
sb->p[sb->fill-1] = 0; /* Terminate! */
|
|
115
|
+
}
|
|
116
|
+
else return 0;
|
|
117
|
+
}
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
int attribute_align_arg mpg123_set_substring(mpg123_string* sb, const char* stuff, size_t from, size_t count)
|
|
122
|
+
{
|
|
123
|
+
sb->fill = 0;
|
|
124
|
+
return mpg123_add_substring(sb, stuff, from, count);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
int attribute_align_arg mpg123_set_string(mpg123_string* sb, const char* stuff)
|
|
128
|
+
{
|
|
129
|
+
sb->fill = 0;
|
|
130
|
+
return mpg123_add_string(sb, stuff);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
size_t attribute_align_arg mpg123_strlen(mpg123_string *sb, int utf8)
|
|
134
|
+
{
|
|
135
|
+
size_t i;
|
|
136
|
+
size_t bytelen;
|
|
137
|
+
|
|
138
|
+
/* Notions of empty string. If there's only a single character, it has to be the trailing zero, and if the first is the trailing zero anyway, we got empty. */
|
|
139
|
+
if(sb->fill < 2 || sb->p[0] == 0) return 0;
|
|
140
|
+
|
|
141
|
+
/* Find the first non-null character from the back.
|
|
142
|
+
We already established that the first character is non-null
|
|
143
|
+
That at fill-2 has to be null, though. */
|
|
144
|
+
for(i=sb->fill-2; i>0; --i)
|
|
145
|
+
if(sb->p[i] != 0) break;
|
|
146
|
+
|
|
147
|
+
/* For simple byte strings, we are done now. */
|
|
148
|
+
bytelen = i+1;
|
|
149
|
+
|
|
150
|
+
if(!utf8) return bytelen;
|
|
151
|
+
else
|
|
152
|
+
{
|
|
153
|
+
/* Work out the actual count of UTF8 bytes.
|
|
154
|
+
This employs no particular encoding error checking. */
|
|
155
|
+
size_t len = 0;
|
|
156
|
+
for(i=0; i<bytelen; ++i)
|
|
157
|
+
{
|
|
158
|
+
/* Every byte that is not a continuation byte ( 0xc0 == 10xx xxxx ) stands for a character. */
|
|
159
|
+
if((sb->p[i] & 0xc0) != 0x80) len++;
|
|
160
|
+
}
|
|
161
|
+
return len;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,816 @@
|
|
|
1
|
+
/*
|
|
2
|
+
synth.c: The functions for synthesizing samples, at the end of decoding.
|
|
3
|
+
|
|
4
|
+
copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
|
|
5
|
+
see COPYING and AUTHORS files in distribution or http://mpg123.org
|
|
6
|
+
initially written by Michael Hipp, heavily dissected and rearranged by Thomas Orgis
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include "mpg123lib_intern.h"
|
|
10
|
+
#include "sample.h"
|
|
11
|
+
#include "debug.h"
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
Part 1: All synth functions that produce signed short.
|
|
15
|
+
That is:
|
|
16
|
+
- synth_1to1 with cpu-specific variants (synth_1to1_i386, synth_1to1_i586 ...)
|
|
17
|
+
- synth_1to1_mono and synth_1to1_m2s; which use fr->synths.plain[r_1to1][f_16].
|
|
18
|
+
Nearly every decoder variant has it's own synth_1to1, while the mono conversion is shared.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
#define SAMPLE_T short
|
|
22
|
+
#define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE(samples,sum,clip)
|
|
23
|
+
|
|
24
|
+
/* Part 1a: All straight 1to1 decoding functions */
|
|
25
|
+
#define BLOCK 0x40 /* One decoding block is 64 samples. */
|
|
26
|
+
|
|
27
|
+
#define SYNTH_NAME synth_1to1
|
|
28
|
+
#include "synth.h"
|
|
29
|
+
#undef SYNTH_NAME
|
|
30
|
+
|
|
31
|
+
/* Mono-related synths; they wrap over _some_ synth_1to1. */
|
|
32
|
+
#define SYNTH_NAME fr->synths.plain[r_1to1][f_16]
|
|
33
|
+
#define MONO_NAME synth_1to1_mono
|
|
34
|
+
#define MONO2STEREO_NAME synth_1to1_m2s
|
|
35
|
+
#include "synth_mono.h"
|
|
36
|
+
#undef SYNTH_NAME
|
|
37
|
+
#undef MONO_NAME
|
|
38
|
+
#undef MONO2STEREO_NAME
|
|
39
|
+
|
|
40
|
+
/* Now we have possibly some special synth_1to1 ...
|
|
41
|
+
... they produce signed short; the mono functions defined above work on the special synths, too. */
|
|
42
|
+
|
|
43
|
+
#ifdef OPT_GENERIC_DITHER
|
|
44
|
+
#define SYNTH_NAME synth_1to1_dither
|
|
45
|
+
/* We need the accurate sample writing... */
|
|
46
|
+
#undef WRITE_SAMPLE
|
|
47
|
+
#define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE_ACCURATE(samples,sum,clip)
|
|
48
|
+
|
|
49
|
+
#define USE_DITHER
|
|
50
|
+
#include "synth.h"
|
|
51
|
+
#undef USE_DITHER
|
|
52
|
+
#undef SYNTH_NAME
|
|
53
|
+
|
|
54
|
+
#undef WRITE_SAMPLE
|
|
55
|
+
#define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE(samples,sum,clip)
|
|
56
|
+
|
|
57
|
+
#endif
|
|
58
|
+
|
|
59
|
+
#ifdef OPT_X86
|
|
60
|
+
/* The i386-specific C code, here as short variant, later 8bit and float. */
|
|
61
|
+
#define NO_AUTOINCREMENT
|
|
62
|
+
#define SYNTH_NAME synth_1to1_i386
|
|
63
|
+
#include "synth.h"
|
|
64
|
+
#undef SYNTH_NAME
|
|
65
|
+
/* i386 uses the normal mono functions. */
|
|
66
|
+
#undef NO_AUTOINCREMENT
|
|
67
|
+
#endif
|
|
68
|
+
|
|
69
|
+
#undef BLOCK /* Following functions are so special that they don't need this. */
|
|
70
|
+
|
|
71
|
+
#ifdef OPT_I586
|
|
72
|
+
/* This is defined in assembler. */
|
|
73
|
+
int synth_1to1_i586_asm(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin);
|
|
74
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
75
|
+
int synth_1to1_i586(real *bandPtr, int channel, mpg123_handle *fr, int final)
|
|
76
|
+
{
|
|
77
|
+
int ret;
|
|
78
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
79
|
+
|
|
80
|
+
ret = synth_1to1_i586_asm(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, &fr->bo, fr->decwin);
|
|
81
|
+
if(final) fr->buffer.fill += 128;
|
|
82
|
+
return ret;
|
|
83
|
+
}
|
|
84
|
+
#endif
|
|
85
|
+
|
|
86
|
+
#ifdef OPT_I586_DITHER
|
|
87
|
+
/* This is defined in assembler. */
|
|
88
|
+
int synth_1to1_i586_asm_dither(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin, float *dithernoise);
|
|
89
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
90
|
+
int synth_1to1_i586_dither(real *bandPtr, int channel, mpg123_handle *fr, int final)
|
|
91
|
+
{
|
|
92
|
+
int ret;
|
|
93
|
+
int bo_dither[2]; /* Temporary workaround? Could expand the asm code. */
|
|
94
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
95
|
+
|
|
96
|
+
/* Applying this hack, to change the asm only bit by bit (adding dithernoise pointer). */
|
|
97
|
+
bo_dither[0] = fr->bo;
|
|
98
|
+
bo_dither[1] = fr->ditherindex;
|
|
99
|
+
ret = synth_1to1_i586_asm_dither(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, bo_dither, fr->decwin, fr->dithernoise);
|
|
100
|
+
fr->bo = bo_dither[0];
|
|
101
|
+
fr->ditherindex = bo_dither[1];
|
|
102
|
+
|
|
103
|
+
if(final) fr->buffer.fill += 128;
|
|
104
|
+
return ret;
|
|
105
|
+
}
|
|
106
|
+
#endif
|
|
107
|
+
|
|
108
|
+
#ifdef OPT_3DNOW
|
|
109
|
+
/* Those are defined in assembler. */
|
|
110
|
+
void do_equalizer_3dnow(real *bandPtr,int channel, real equalizer[2][32]);
|
|
111
|
+
int synth_1to1_3dnow_asm(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin);
|
|
112
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
113
|
+
int synth_1to1_3dnow(real *bandPtr, int channel, mpg123_handle *fr, int final)
|
|
114
|
+
{
|
|
115
|
+
int ret;
|
|
116
|
+
|
|
117
|
+
if(fr->have_eq_settings) do_equalizer_3dnow(bandPtr,channel,fr->equalizer);
|
|
118
|
+
|
|
119
|
+
/* this is in asm, can be dither or not */
|
|
120
|
+
/* uh, is this return from pointer correct? */
|
|
121
|
+
ret = (int) synth_1to1_3dnow_asm(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, &fr->bo, fr->decwin);
|
|
122
|
+
if(final) fr->buffer.fill += 128;
|
|
123
|
+
return ret;
|
|
124
|
+
}
|
|
125
|
+
#endif
|
|
126
|
+
|
|
127
|
+
#ifdef OPT_MMX
|
|
128
|
+
/* This is defined in assembler. */
|
|
129
|
+
int synth_1to1_MMX(real *bandPtr, int channel, short *out, short *buffs, int *bo, float *decwins);
|
|
130
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
131
|
+
int synth_1to1_mmx(real *bandPtr, int channel, mpg123_handle *fr, int final)
|
|
132
|
+
{
|
|
133
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
134
|
+
|
|
135
|
+
/* in asm */
|
|
136
|
+
synth_1to1_MMX(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins);
|
|
137
|
+
if(final) fr->buffer.fill += 128;
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
#endif
|
|
141
|
+
|
|
142
|
+
#ifdef OPT_SSE
|
|
143
|
+
#ifdef ACCURATE_ROUNDING
|
|
144
|
+
/* This is defined in assembler. */
|
|
145
|
+
int synth_1to1_sse_accurate_asm(real *window, real *b0, short *samples, int bo1);
|
|
146
|
+
int synth_1to1_s_sse_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
|
|
147
|
+
void dct64_real_sse(real *out0, real *out1, real *samples);
|
|
148
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
149
|
+
int synth_1to1_sse(real *bandPtr,int channel, mpg123_handle *fr, int final)
|
|
150
|
+
{
|
|
151
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
152
|
+
real *b0, **buf;
|
|
153
|
+
int clip;
|
|
154
|
+
int bo1;
|
|
155
|
+
|
|
156
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
157
|
+
|
|
158
|
+
if(!channel)
|
|
159
|
+
{
|
|
160
|
+
fr->bo--;
|
|
161
|
+
fr->bo &= 0xf;
|
|
162
|
+
buf = fr->real_buffs[0];
|
|
163
|
+
}
|
|
164
|
+
else
|
|
165
|
+
{
|
|
166
|
+
samples++;
|
|
167
|
+
buf = fr->real_buffs[1];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if(fr->bo & 0x1)
|
|
171
|
+
{
|
|
172
|
+
b0 = buf[0];
|
|
173
|
+
bo1 = fr->bo;
|
|
174
|
+
dct64_real_sse(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
|
|
175
|
+
}
|
|
176
|
+
else
|
|
177
|
+
{
|
|
178
|
+
b0 = buf[1];
|
|
179
|
+
bo1 = fr->bo+1;
|
|
180
|
+
dct64_real_sse(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
clip = synth_1to1_sse_accurate_asm(fr->decwin, b0, samples, bo1);
|
|
184
|
+
|
|
185
|
+
if(final) fr->buffer.fill += 128;
|
|
186
|
+
|
|
187
|
+
return clip;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
int synth_1to1_stereo_sse(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
|
|
191
|
+
{
|
|
192
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
193
|
+
|
|
194
|
+
real *b0l, *b0r, **bufl, **bufr;
|
|
195
|
+
int bo1;
|
|
196
|
+
int clip;
|
|
197
|
+
|
|
198
|
+
if(fr->have_eq_settings)
|
|
199
|
+
{
|
|
200
|
+
do_equalizer(bandPtr_l,0,fr->equalizer);
|
|
201
|
+
do_equalizer(bandPtr_r,1,fr->equalizer);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
fr->bo--;
|
|
205
|
+
fr->bo &= 0xf;
|
|
206
|
+
bufl = fr->real_buffs[0];
|
|
207
|
+
bufr = fr->real_buffs[1];
|
|
208
|
+
|
|
209
|
+
if(fr->bo & 0x1)
|
|
210
|
+
{
|
|
211
|
+
b0l = bufl[0];
|
|
212
|
+
b0r = bufr[0];
|
|
213
|
+
bo1 = fr->bo;
|
|
214
|
+
dct64_real_sse(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
|
|
215
|
+
dct64_real_sse(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
|
|
216
|
+
}
|
|
217
|
+
else
|
|
218
|
+
{
|
|
219
|
+
b0l = bufl[1];
|
|
220
|
+
b0r = bufr[1];
|
|
221
|
+
bo1 = fr->bo+1;
|
|
222
|
+
dct64_real_sse(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
|
|
223
|
+
dct64_real_sse(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
clip = synth_1to1_s_sse_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
|
|
227
|
+
|
|
228
|
+
fr->buffer.fill += 128;
|
|
229
|
+
|
|
230
|
+
return clip;
|
|
231
|
+
}
|
|
232
|
+
#else
|
|
233
|
+
/* This is defined in assembler. */
|
|
234
|
+
void synth_1to1_sse_asm(real *bandPtr, int channel, short *samples, short *buffs, int *bo, real *decwin);
|
|
235
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
236
|
+
int synth_1to1_sse(real *bandPtr, int channel, mpg123_handle *fr, int final)
|
|
237
|
+
{
|
|
238
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
239
|
+
|
|
240
|
+
synth_1to1_sse_asm(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins);
|
|
241
|
+
if(final) fr->buffer.fill += 128;
|
|
242
|
+
return 0;
|
|
243
|
+
}
|
|
244
|
+
#endif
|
|
245
|
+
#endif
|
|
246
|
+
|
|
247
|
+
#ifdef OPT_3DNOWEXT
|
|
248
|
+
/* This is defined in assembler. */
|
|
249
|
+
void synth_1to1_3dnowext_asm(real *bandPtr, int channel, short *samples, short *buffs, int *bo, real *decwin);
|
|
250
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
251
|
+
int synth_1to1_3dnowext(real *bandPtr, int channel, mpg123_handle *fr, int final)
|
|
252
|
+
{
|
|
253
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
254
|
+
|
|
255
|
+
synth_1to1_3dnowext_asm(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins);
|
|
256
|
+
if(final) fr->buffer.fill += 128;
|
|
257
|
+
return 0;
|
|
258
|
+
}
|
|
259
|
+
#endif
|
|
260
|
+
|
|
261
|
+
#ifdef OPT_X86_64
|
|
262
|
+
#ifdef ACCURATE_ROUNDING
|
|
263
|
+
/* Assembler routines. */
|
|
264
|
+
int synth_1to1_x86_64_accurate_asm(real *window, real *b0, short *samples, int bo1);
|
|
265
|
+
int synth_1to1_s_x86_64_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
|
|
266
|
+
void dct64_real_x86_64(real *out0, real *out1, real *samples);
|
|
267
|
+
/* Hull for C mpg123 API */
|
|
268
|
+
int synth_1to1_x86_64(real *bandPtr,int channel, mpg123_handle *fr, int final)
|
|
269
|
+
{
|
|
270
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
271
|
+
|
|
272
|
+
real *b0, **buf;
|
|
273
|
+
int bo1;
|
|
274
|
+
int clip;
|
|
275
|
+
|
|
276
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
277
|
+
|
|
278
|
+
if(!channel)
|
|
279
|
+
{
|
|
280
|
+
fr->bo--;
|
|
281
|
+
fr->bo &= 0xf;
|
|
282
|
+
buf = fr->real_buffs[0];
|
|
283
|
+
}
|
|
284
|
+
else
|
|
285
|
+
{
|
|
286
|
+
samples++;
|
|
287
|
+
buf = fr->real_buffs[1];
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if(fr->bo & 0x1)
|
|
291
|
+
{
|
|
292
|
+
b0 = buf[0];
|
|
293
|
+
bo1 = fr->bo;
|
|
294
|
+
dct64_real_x86_64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
|
|
295
|
+
}
|
|
296
|
+
else
|
|
297
|
+
{
|
|
298
|
+
b0 = buf[1];
|
|
299
|
+
bo1 = fr->bo+1;
|
|
300
|
+
dct64_real_x86_64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
clip = synth_1to1_x86_64_accurate_asm(fr->decwin, b0, samples, bo1);
|
|
304
|
+
|
|
305
|
+
if(final) fr->buffer.fill += 128;
|
|
306
|
+
|
|
307
|
+
return clip;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
int synth_1to1_stereo_x86_64(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
|
|
311
|
+
{
|
|
312
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
313
|
+
|
|
314
|
+
real *b0l, *b0r, **bufl, **bufr;
|
|
315
|
+
int bo1;
|
|
316
|
+
int clip;
|
|
317
|
+
|
|
318
|
+
if(fr->have_eq_settings)
|
|
319
|
+
{
|
|
320
|
+
do_equalizer(bandPtr_l,0,fr->equalizer);
|
|
321
|
+
do_equalizer(bandPtr_r,1,fr->equalizer);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
fr->bo--;
|
|
325
|
+
fr->bo &= 0xf;
|
|
326
|
+
bufl = fr->real_buffs[0];
|
|
327
|
+
bufr = fr->real_buffs[1];
|
|
328
|
+
|
|
329
|
+
if(fr->bo & 0x1)
|
|
330
|
+
{
|
|
331
|
+
b0l = bufl[0];
|
|
332
|
+
b0r = bufr[0];
|
|
333
|
+
bo1 = fr->bo;
|
|
334
|
+
dct64_real_x86_64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
|
|
335
|
+
dct64_real_x86_64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
|
|
336
|
+
}
|
|
337
|
+
else
|
|
338
|
+
{
|
|
339
|
+
b0l = bufl[1];
|
|
340
|
+
b0r = bufr[1];
|
|
341
|
+
bo1 = fr->bo+1;
|
|
342
|
+
dct64_real_x86_64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
|
|
343
|
+
dct64_real_x86_64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
clip = synth_1to1_s_x86_64_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
|
|
347
|
+
|
|
348
|
+
fr->buffer.fill += 128;
|
|
349
|
+
|
|
350
|
+
return clip;
|
|
351
|
+
}
|
|
352
|
+
#else
|
|
353
|
+
/* This is defined in assembler. */
|
|
354
|
+
int synth_1to1_x86_64_asm(short *window, short *b0, short *samples, int bo1);
|
|
355
|
+
int synth_1to1_s_x86_64_asm(short *window, short *b0l, short *b0r, short *samples, int bo1);
|
|
356
|
+
void dct64_x86_64(short *out0, short *out1, real *samples);
|
|
357
|
+
/* This is just a hull to use the mpg123 handle. */
|
|
358
|
+
int synth_1to1_x86_64(real *bandPtr,int channel, mpg123_handle *fr, int final)
|
|
359
|
+
{
|
|
360
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
361
|
+
short *b0, **buf;
|
|
362
|
+
int clip;
|
|
363
|
+
int bo1;
|
|
364
|
+
|
|
365
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
366
|
+
|
|
367
|
+
if(!channel)
|
|
368
|
+
{
|
|
369
|
+
fr->bo--;
|
|
370
|
+
fr->bo &= 0xf;
|
|
371
|
+
buf = fr->short_buffs[0];
|
|
372
|
+
}
|
|
373
|
+
else
|
|
374
|
+
{
|
|
375
|
+
samples++;
|
|
376
|
+
buf = fr->short_buffs[1];
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if(fr->bo & 0x1)
|
|
380
|
+
{
|
|
381
|
+
b0 = buf[0];
|
|
382
|
+
bo1 = fr->bo;
|
|
383
|
+
dct64_x86_64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
|
|
384
|
+
}
|
|
385
|
+
else
|
|
386
|
+
{
|
|
387
|
+
b0 = buf[1];
|
|
388
|
+
bo1 = fr->bo+1;
|
|
389
|
+
dct64_x86_64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
clip = synth_1to1_x86_64_asm((short *)fr->decwins, b0, samples, bo1);
|
|
393
|
+
|
|
394
|
+
if(final) fr->buffer.fill += 128;
|
|
395
|
+
|
|
396
|
+
return clip;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
int synth_1to1_stereo_x86_64(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr)
|
|
400
|
+
{
|
|
401
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
402
|
+
short *b0l, *b0r, **bufl, **bufr;
|
|
403
|
+
int clip;
|
|
404
|
+
int bo1;
|
|
405
|
+
|
|
406
|
+
if(fr->have_eq_settings)
|
|
407
|
+
{
|
|
408
|
+
do_equalizer(bandPtr_l,0,fr->equalizer);
|
|
409
|
+
do_equalizer(bandPtr_r,1,fr->equalizer);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
fr->bo--;
|
|
413
|
+
fr->bo &= 0xf;
|
|
414
|
+
bufl = fr->short_buffs[0];
|
|
415
|
+
bufr = fr->short_buffs[1];
|
|
416
|
+
|
|
417
|
+
if(fr->bo & 0x1)
|
|
418
|
+
{
|
|
419
|
+
b0l = bufl[0];
|
|
420
|
+
b0r = bufr[0];
|
|
421
|
+
bo1 = fr->bo;
|
|
422
|
+
dct64_x86_64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
|
|
423
|
+
dct64_x86_64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
|
|
424
|
+
}
|
|
425
|
+
else
|
|
426
|
+
{
|
|
427
|
+
b0l = bufl[1];
|
|
428
|
+
b0r = bufr[1];
|
|
429
|
+
bo1 = fr->bo+1;
|
|
430
|
+
dct64_x86_64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
|
|
431
|
+
dct64_x86_64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
clip = synth_1to1_s_x86_64_asm((short *)fr->decwins, b0l, b0r, samples, bo1);
|
|
435
|
+
|
|
436
|
+
fr->buffer.fill += 128;
|
|
437
|
+
|
|
438
|
+
return clip;
|
|
439
|
+
}
|
|
440
|
+
#endif
|
|
441
|
+
#endif
|
|
442
|
+
|
|
443
|
+
#ifdef OPT_ARM
|
|
444
|
+
#ifdef ACCURATE_ROUNDING
|
|
445
|
+
/* Assembler routines. */
|
|
446
|
+
int synth_1to1_arm_accurate_asm(real *window, real *b0, short *samples, int bo1);
|
|
447
|
+
/* Hull for C mpg123 API */
|
|
448
|
+
int synth_1to1_arm(real *bandPtr,int channel, mpg123_handle *fr, int final)
|
|
449
|
+
{
|
|
450
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
451
|
+
|
|
452
|
+
real *b0, **buf;
|
|
453
|
+
int bo1;
|
|
454
|
+
int clip;
|
|
455
|
+
|
|
456
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
457
|
+
|
|
458
|
+
if(!channel)
|
|
459
|
+
{
|
|
460
|
+
fr->bo--;
|
|
461
|
+
fr->bo &= 0xf;
|
|
462
|
+
buf = fr->real_buffs[0];
|
|
463
|
+
}
|
|
464
|
+
else
|
|
465
|
+
{
|
|
466
|
+
samples++;
|
|
467
|
+
buf = fr->real_buffs[1];
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
if(fr->bo & 0x1)
|
|
471
|
+
{
|
|
472
|
+
b0 = buf[0];
|
|
473
|
+
bo1 = fr->bo;
|
|
474
|
+
dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
|
|
475
|
+
}
|
|
476
|
+
else
|
|
477
|
+
{
|
|
478
|
+
b0 = buf[1];
|
|
479
|
+
bo1 = fr->bo+1;
|
|
480
|
+
dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
clip = synth_1to1_arm_accurate_asm(fr->decwin, b0, samples, bo1);
|
|
484
|
+
|
|
485
|
+
if(final) fr->buffer.fill += 128;
|
|
486
|
+
|
|
487
|
+
return clip;
|
|
488
|
+
}
|
|
489
|
+
#else
|
|
490
|
+
/* Assembler routines. */
|
|
491
|
+
int synth_1to1_arm_asm(real *window, real *b0, short *samples, int bo1);
|
|
492
|
+
/* Hull for C mpg123 API */
|
|
493
|
+
int synth_1to1_arm(real *bandPtr,int channel, mpg123_handle *fr, int final)
|
|
494
|
+
{
|
|
495
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
496
|
+
|
|
497
|
+
real *b0, **buf;
|
|
498
|
+
int bo1;
|
|
499
|
+
int clip;
|
|
500
|
+
|
|
501
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
502
|
+
|
|
503
|
+
if(!channel)
|
|
504
|
+
{
|
|
505
|
+
fr->bo--;
|
|
506
|
+
fr->bo &= 0xf;
|
|
507
|
+
buf = fr->real_buffs[0];
|
|
508
|
+
}
|
|
509
|
+
else
|
|
510
|
+
{
|
|
511
|
+
samples++;
|
|
512
|
+
buf = fr->real_buffs[1];
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
if(fr->bo & 0x1)
|
|
516
|
+
{
|
|
517
|
+
b0 = buf[0];
|
|
518
|
+
bo1 = fr->bo;
|
|
519
|
+
dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
|
|
520
|
+
}
|
|
521
|
+
else
|
|
522
|
+
{
|
|
523
|
+
b0 = buf[1];
|
|
524
|
+
bo1 = fr->bo+1;
|
|
525
|
+
dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
clip = synth_1to1_arm_asm(fr->decwin, b0, samples, bo1);
|
|
529
|
+
|
|
530
|
+
if(final) fr->buffer.fill += 128;
|
|
531
|
+
|
|
532
|
+
return clip;
|
|
533
|
+
}
|
|
534
|
+
#endif
|
|
535
|
+
#endif
|
|
536
|
+
|
|
537
|
+
#ifdef OPT_NEON
|
|
538
|
+
#ifdef ACCURATE_ROUNDING
|
|
539
|
+
/* This is defined in assembler. */
|
|
540
|
+
int synth_1to1_neon_accurate_asm(real *window, real *b0, short *samples, int bo1);
|
|
541
|
+
int synth_1to1_s_neon_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
|
|
542
|
+
void dct64_real_neon(real *out0, real *out1, real *samples);
|
|
543
|
+
/* Hull for C mpg123 API */
|
|
544
|
+
int synth_1to1_neon(real *bandPtr,int channel, mpg123_handle *fr, int final)
|
|
545
|
+
{
|
|
546
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
547
|
+
|
|
548
|
+
real *b0, **buf;
|
|
549
|
+
int bo1;
|
|
550
|
+
int clip;
|
|
551
|
+
|
|
552
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
553
|
+
|
|
554
|
+
if(!channel)
|
|
555
|
+
{
|
|
556
|
+
fr->bo--;
|
|
557
|
+
fr->bo &= 0xf;
|
|
558
|
+
buf = fr->real_buffs[0];
|
|
559
|
+
}
|
|
560
|
+
else
|
|
561
|
+
{
|
|
562
|
+
samples++;
|
|
563
|
+
buf = fr->real_buffs[1];
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
if(fr->bo & 0x1)
|
|
567
|
+
{
|
|
568
|
+
b0 = buf[0];
|
|
569
|
+
bo1 = fr->bo;
|
|
570
|
+
dct64_real_neon(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
|
|
571
|
+
}
|
|
572
|
+
else
|
|
573
|
+
{
|
|
574
|
+
b0 = buf[1];
|
|
575
|
+
bo1 = fr->bo+1;
|
|
576
|
+
dct64_real_neon(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
clip = synth_1to1_neon_accurate_asm(fr->decwin, b0, samples, bo1);
|
|
580
|
+
|
|
581
|
+
if(final) fr->buffer.fill += 128;
|
|
582
|
+
|
|
583
|
+
return clip;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
int synth_1to1_stereo_neon(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
|
|
587
|
+
{
|
|
588
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
589
|
+
|
|
590
|
+
real *b0l, *b0r, **bufl, **bufr;
|
|
591
|
+
int bo1;
|
|
592
|
+
int clip;
|
|
593
|
+
|
|
594
|
+
if(fr->have_eq_settings)
|
|
595
|
+
{
|
|
596
|
+
do_equalizer(bandPtr_l,0,fr->equalizer);
|
|
597
|
+
do_equalizer(bandPtr_r,1,fr->equalizer);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
fr->bo--;
|
|
601
|
+
fr->bo &= 0xf;
|
|
602
|
+
bufl = fr->real_buffs[0];
|
|
603
|
+
bufr = fr->real_buffs[1];
|
|
604
|
+
|
|
605
|
+
if(fr->bo & 0x1)
|
|
606
|
+
{
|
|
607
|
+
b0l = bufl[0];
|
|
608
|
+
b0r = bufr[0];
|
|
609
|
+
bo1 = fr->bo;
|
|
610
|
+
dct64_real_neon(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
|
|
611
|
+
dct64_real_neon(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
|
|
612
|
+
}
|
|
613
|
+
else
|
|
614
|
+
{
|
|
615
|
+
b0l = bufl[1];
|
|
616
|
+
b0r = bufr[1];
|
|
617
|
+
bo1 = fr->bo+1;
|
|
618
|
+
dct64_real_neon(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
|
|
619
|
+
dct64_real_neon(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
clip = synth_1to1_s_neon_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
|
|
623
|
+
|
|
624
|
+
fr->buffer.fill += 128;
|
|
625
|
+
|
|
626
|
+
return clip;
|
|
627
|
+
}
|
|
628
|
+
#else
|
|
629
|
+
/* This is defined in assembler. */
|
|
630
|
+
int synth_1to1_neon_asm(short *window, short *b0, short *samples, int bo1);
|
|
631
|
+
int synth_1to1_s_neon_asm(short *window, short *b0l, short *b0r, short *samples, int bo1);
|
|
632
|
+
void dct64_neon(short *out0, short *out1, real *samples);
|
|
633
|
+
/* Hull for C mpg123 API */
|
|
634
|
+
int synth_1to1_neon(real *bandPtr,int channel, mpg123_handle *fr, int final)
|
|
635
|
+
{
|
|
636
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
637
|
+
short *b0, **buf;
|
|
638
|
+
int clip;
|
|
639
|
+
int bo1;
|
|
640
|
+
|
|
641
|
+
if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
|
|
642
|
+
|
|
643
|
+
if(!channel)
|
|
644
|
+
{
|
|
645
|
+
fr->bo--;
|
|
646
|
+
fr->bo &= 0xf;
|
|
647
|
+
buf = fr->short_buffs[0];
|
|
648
|
+
}
|
|
649
|
+
else
|
|
650
|
+
{
|
|
651
|
+
samples++;
|
|
652
|
+
buf = fr->short_buffs[1];
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if(fr->bo & 0x1)
|
|
656
|
+
{
|
|
657
|
+
b0 = buf[0];
|
|
658
|
+
bo1 = fr->bo;
|
|
659
|
+
dct64_neon(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
|
|
660
|
+
}
|
|
661
|
+
else
|
|
662
|
+
{
|
|
663
|
+
b0 = buf[1];
|
|
664
|
+
bo1 = fr->bo+1;
|
|
665
|
+
dct64_neon(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
clip = synth_1to1_neon_asm((short *)fr->decwins, b0, samples, bo1);
|
|
669
|
+
|
|
670
|
+
if(final) fr->buffer.fill += 128;
|
|
671
|
+
|
|
672
|
+
return clip;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
int synth_1to1_stereo_neon(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr)
|
|
676
|
+
{
|
|
677
|
+
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
|
|
678
|
+
short *b0l, *b0r, **bufl, **bufr;
|
|
679
|
+
int clip;
|
|
680
|
+
int bo1;
|
|
681
|
+
|
|
682
|
+
if(fr->have_eq_settings)
|
|
683
|
+
{
|
|
684
|
+
do_equalizer(bandPtr_l,0,fr->equalizer);
|
|
685
|
+
do_equalizer(bandPtr_r,1,fr->equalizer);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
fr->bo--;
|
|
689
|
+
fr->bo &= 0xf;
|
|
690
|
+
bufl = fr->short_buffs[0];
|
|
691
|
+
bufr = fr->short_buffs[1];
|
|
692
|
+
|
|
693
|
+
if(fr->bo & 0x1)
|
|
694
|
+
{
|
|
695
|
+
b0l = bufl[0];
|
|
696
|
+
b0r = bufr[0];
|
|
697
|
+
bo1 = fr->bo;
|
|
698
|
+
dct64_neon(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
|
|
699
|
+
dct64_neon(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
|
|
700
|
+
}
|
|
701
|
+
else
|
|
702
|
+
{
|
|
703
|
+
b0l = bufl[1];
|
|
704
|
+
b0r = bufr[1];
|
|
705
|
+
bo1 = fr->bo+1;
|
|
706
|
+
dct64_neon(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
|
|
707
|
+
dct64_neon(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
clip = synth_1to1_s_neon_asm((short *)fr->decwins, b0l, b0r, samples, bo1);
|
|
711
|
+
|
|
712
|
+
fr->buffer.fill += 128;
|
|
713
|
+
|
|
714
|
+
return clip;
|
|
715
|
+
}
|
|
716
|
+
#endif
|
|
717
|
+
#endif
|
|
718
|
+
|
|
719
|
+
#ifndef NO_DOWNSAMPLE
|
|
720
|
+
|
|
721
|
+
/*
|
|
722
|
+
Part 1b: 2to1 synth.
|
|
723
|
+
Only generic and i386 functions this time.
|
|
724
|
+
*/
|
|
725
|
+
#define BLOCK 0x20 /* One decoding block is 32 samples. */
|
|
726
|
+
|
|
727
|
+
#define SYNTH_NAME synth_2to1
|
|
728
|
+
#include "synth.h"
|
|
729
|
+
#undef SYNTH_NAME
|
|
730
|
+
|
|
731
|
+
#ifdef OPT_DITHER /* Used for generic_dither and as fallback for i586_dither. */
|
|
732
|
+
#define SYNTH_NAME synth_2to1_dither
|
|
733
|
+
#define USE_DITHER
|
|
734
|
+
#include "synth.h"
|
|
735
|
+
#undef USE_DITHER
|
|
736
|
+
#undef SYNTH_NAME
|
|
737
|
+
#endif
|
|
738
|
+
|
|
739
|
+
#define SYNTH_NAME fr->synths.plain[r_2to1][f_16]
|
|
740
|
+
#define MONO_NAME synth_2to1_mono
|
|
741
|
+
#define MONO2STEREO_NAME synth_2to1_m2s
|
|
742
|
+
#include "synth_mono.h"
|
|
743
|
+
#undef SYNTH_NAME
|
|
744
|
+
#undef MONO_NAME
|
|
745
|
+
#undef MONO2STEREO_NAME
|
|
746
|
+
|
|
747
|
+
#ifdef OPT_X86
|
|
748
|
+
#define NO_AUTOINCREMENT
|
|
749
|
+
#define SYNTH_NAME synth_2to1_i386
|
|
750
|
+
#include "synth.h"
|
|
751
|
+
#undef SYNTH_NAME
|
|
752
|
+
/* i386 uses the normal mono functions. */
|
|
753
|
+
#undef NO_AUTOINCREMENT
|
|
754
|
+
#endif
|
|
755
|
+
|
|
756
|
+
#undef BLOCK
|
|
757
|
+
|
|
758
|
+
/*
|
|
759
|
+
Part 1c: 4to1 synth.
|
|
760
|
+
Same procedure as above...
|
|
761
|
+
*/
|
|
762
|
+
#define BLOCK 0x10 /* One decoding block is 16 samples. */
|
|
763
|
+
|
|
764
|
+
#define SYNTH_NAME synth_4to1
|
|
765
|
+
#include "synth.h"
|
|
766
|
+
#undef SYNTH_NAME
|
|
767
|
+
|
|
768
|
+
#ifdef OPT_DITHER
|
|
769
|
+
#define SYNTH_NAME synth_4to1_dither
|
|
770
|
+
#define USE_DITHER
|
|
771
|
+
#include "synth.h"
|
|
772
|
+
#undef USE_DITHER
|
|
773
|
+
#undef SYNTH_NAME
|
|
774
|
+
#endif
|
|
775
|
+
|
|
776
|
+
#define SYNTH_NAME fr->synths.plain[r_4to1][f_16] /* This is just for the _i386 one... gotta check if it is really useful... */
|
|
777
|
+
#define MONO_NAME synth_4to1_mono
|
|
778
|
+
#define MONO2STEREO_NAME synth_4to1_m2s
|
|
779
|
+
#include "synth_mono.h"
|
|
780
|
+
#undef SYNTH_NAME
|
|
781
|
+
#undef MONO_NAME
|
|
782
|
+
#undef MONO2STEREO_NAME
|
|
783
|
+
|
|
784
|
+
#ifdef OPT_X86
|
|
785
|
+
#define NO_AUTOINCREMENT
|
|
786
|
+
#define SYNTH_NAME synth_4to1_i386
|
|
787
|
+
#include "synth.h"
|
|
788
|
+
#undef SYNTH_NAME
|
|
789
|
+
/* i386 uses the normal mono functions. */
|
|
790
|
+
#undef NO_AUTOINCREMENT
|
|
791
|
+
#endif
|
|
792
|
+
|
|
793
|
+
#undef BLOCK
|
|
794
|
+
|
|
795
|
+
#endif /* NO_DOWNSAMPLE */
|
|
796
|
+
|
|
797
|
+
#ifndef NO_NTOM
|
|
798
|
+
/*
|
|
799
|
+
Part 1d: ntom synth.
|
|
800
|
+
Same procedure as above... Just no extra play anymore, straight synth that uses the plain dct64.
|
|
801
|
+
*/
|
|
802
|
+
|
|
803
|
+
/* These are all in one header, there's no flexibility to gain. */
|
|
804
|
+
#define SYNTH_NAME synth_ntom
|
|
805
|
+
#define MONO_NAME synth_ntom_mono
|
|
806
|
+
#define MONO2STEREO_NAME synth_ntom_m2s
|
|
807
|
+
#include "synth_ntom.h"
|
|
808
|
+
#undef SYNTH_NAME
|
|
809
|
+
#undef MONO_NAME
|
|
810
|
+
#undef MONO2STEREO_NAME
|
|
811
|
+
|
|
812
|
+
#endif
|
|
813
|
+
|
|
814
|
+
/* Done with short output. */
|
|
815
|
+
#undef SAMPLE_T
|
|
816
|
+
#undef WRITE_SAMPLE
|