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,896 @@
|
|
|
1
|
+
/*
|
|
2
|
+
mpg123clr: MPEG Audio Decoder library Common Language Runtime version.
|
|
3
|
+
|
|
4
|
+
copyright 2009-2011 by Malcolm Boczek - free software under the terms of the LGPL 2.1
|
|
5
|
+
mpg123clr.dll is a derivative work of libmpg123 - all original mpg123 licensing terms apply.
|
|
6
|
+
|
|
7
|
+
All rights to this work freely assigned to the mpg123 project.
|
|
8
|
+
*/
|
|
9
|
+
/*
|
|
10
|
+
libmpg123: MPEG Audio Decoder library
|
|
11
|
+
|
|
12
|
+
copyright 1995-2011 by the mpg123 project - free software under the terms of the LGPL 2.1
|
|
13
|
+
see COPYING and AUTHORS files in distribution or http://mpg123.org
|
|
14
|
+
|
|
15
|
+
*/
|
|
16
|
+
/*
|
|
17
|
+
1.8.1.0 04-Aug-09 Initial release.
|
|
18
|
+
1.9.0.0 24-Sep-09 Function names harmonized with libmpg123 (mb)
|
|
19
|
+
1.9.0.0 01-Oct-09 Technical cleanup - subst nullptr for NULL (mb)
|
|
20
|
+
1.9.0.0 13-Oct-09 pin_ptr = nullptr on return (mb)
|
|
21
|
+
1.9.0.1 24-Nov-09 performance update - removed try/finally (mb)
|
|
22
|
+
1.10.0.0 30-Nov-09 release match - added mpg123_feature (mb)
|
|
23
|
+
1.12.0.0 14-Apr-10 release match - added framebyframe and "handle" ReplaceReaders (mb)
|
|
24
|
+
1.13.0.0 13-Jan-11 release match - added encsize (mb)
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
// mpg123clr.cpp : Defines the exported functions for the DLL application.
|
|
28
|
+
//
|
|
29
|
+
|
|
30
|
+
#include "stdafx.h"
|
|
31
|
+
#include "mpg123clr.h"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
mpg123clr::mpg123::mpg123(void)
|
|
35
|
+
{
|
|
36
|
+
mh = nullptr;
|
|
37
|
+
useHandleReplacement = false;
|
|
38
|
+
lastReplacementWasHandle = false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
mpg123clr::mpg123::mpg123(mpg123_handle* mh)
|
|
42
|
+
{
|
|
43
|
+
this->mh = mh;
|
|
44
|
+
useHandleReplacement = false;
|
|
45
|
+
lastReplacementWasHandle = false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Destructor
|
|
49
|
+
mpg123clr::mpg123::~mpg123(void)
|
|
50
|
+
{
|
|
51
|
+
// clean up code to release managed resources
|
|
52
|
+
|
|
53
|
+
// call Finalizer to clean up unmanaged resources
|
|
54
|
+
this->!mpg123();
|
|
55
|
+
|
|
56
|
+
// CLI implements SuppressFinalize - therefore not required here...
|
|
57
|
+
//GC::SuppressFinalize(this);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Finalizer
|
|
61
|
+
mpg123clr::mpg123::!mpg123(void)
|
|
62
|
+
{
|
|
63
|
+
// clean up unmanaged resources
|
|
64
|
+
if (mh != nullptr)
|
|
65
|
+
{
|
|
66
|
+
::mpg123_delete(mh);
|
|
67
|
+
mh = nullptr;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void mpg123clr::mpg123::mpg123_delete(void)
|
|
72
|
+
{
|
|
73
|
+
if (mh != nullptr)
|
|
74
|
+
{
|
|
75
|
+
::mpg123_delete(mh);
|
|
76
|
+
mh = nullptr;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_init(void)
|
|
81
|
+
{
|
|
82
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_init();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
void mpg123clr::mpg123::mpg123_exit(void)
|
|
86
|
+
{
|
|
87
|
+
::mpg123_exit();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_new(String ^ decoder)
|
|
91
|
+
{
|
|
92
|
+
const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(decoder)).ToPointer();
|
|
93
|
+
|
|
94
|
+
int err;
|
|
95
|
+
mh = ::mpg123_new(chars, &err);
|
|
96
|
+
|
|
97
|
+
Marshal::FreeHGlobal(IntPtr((void*)chars));
|
|
98
|
+
|
|
99
|
+
return (mpg123clr::mpg::ErrorCode) err;
|
|
100
|
+
}
|
|
101
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_new(void)
|
|
102
|
+
{
|
|
103
|
+
int err;
|
|
104
|
+
mh = ::mpg123_new(NULL, &err);
|
|
105
|
+
|
|
106
|
+
return (mpg123clr::mpg::ErrorCode) err;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_parnew(mpg123clr::advpars^ par, String ^ decoder)
|
|
110
|
+
{
|
|
111
|
+
const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(decoder)).ToPointer();
|
|
112
|
+
|
|
113
|
+
int err;
|
|
114
|
+
mh = ::mpg123_parnew(par->mp, chars, &err);
|
|
115
|
+
|
|
116
|
+
Marshal::FreeHGlobal(IntPtr((void*)chars));
|
|
117
|
+
|
|
118
|
+
return (mpg123clr::mpg::ErrorCode) err;
|
|
119
|
+
}
|
|
120
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_parnew(mpg123clr::advpars^ par)
|
|
121
|
+
{
|
|
122
|
+
int err;
|
|
123
|
+
mh = ::mpg123_parnew(par->mp, NULL, &err);
|
|
124
|
+
|
|
125
|
+
return (mpg123clr::mpg::ErrorCode) err;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_param(mpg123clr::mpg::parms type, int val, double fval)
|
|
129
|
+
{
|
|
130
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_param(mh, (mpg123_parms)type, val, fval);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_getparam(mpg123clr::mpg::parms type, [Out] int% val, [Out] double% fval)
|
|
134
|
+
{
|
|
135
|
+
// Avoid need for local intermediary variables
|
|
136
|
+
pin_ptr<int> _val = &val;
|
|
137
|
+
pin_ptr<double> _fval = &fval;
|
|
138
|
+
|
|
139
|
+
int ret = ::mpg123_getparam(mh, (mpg123_parms)type, (long*) _val, _fval);
|
|
140
|
+
|
|
141
|
+
_fval = nullptr;
|
|
142
|
+
_val = nullptr;
|
|
143
|
+
|
|
144
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
int mpg123clr::mpg123::mpg123_feature(mpg123clr::mpg::feature_set key)
|
|
148
|
+
{
|
|
149
|
+
return ::mpg123_feature((mpg123_feature_set) key);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
String^ mpg123clr::mpg123::mpg123_strerror(void)
|
|
153
|
+
{
|
|
154
|
+
return gcnew String(::mpg123_strerror(mh));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_errcode(void)
|
|
158
|
+
{
|
|
159
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_errcode(mh);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
array<String^>^ mpg123clr::mpg123::StringArrayFromPtr(const char** ptr)
|
|
163
|
+
{
|
|
164
|
+
int count = 0;
|
|
165
|
+
|
|
166
|
+
// count how many strings in array by walking up the array until NULL found
|
|
167
|
+
while (*(ptr++) != NULL){ ++count; }
|
|
168
|
+
|
|
169
|
+
// create an array of the correct size
|
|
170
|
+
array<String^> ^ str = gcnew array<String^>(count);
|
|
171
|
+
|
|
172
|
+
--ptr; // loop leaves ptr +2 beyond end of array - put ptr back to just after last index
|
|
173
|
+
|
|
174
|
+
// walk back down the array, extracting the strings
|
|
175
|
+
while (count-- > 0){ str[count] = gcnew String(*(--ptr)); }
|
|
176
|
+
|
|
177
|
+
return str;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
array<String^>^ mpg123clr::mpg123::mpg123_decoders(void)
|
|
181
|
+
{
|
|
182
|
+
return StringArrayFromPtr(::mpg123_decoders());
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
array<String^>^ mpg123clr::mpg123::mpg123_supported_decoders(void)
|
|
186
|
+
{
|
|
187
|
+
return StringArrayFromPtr(::mpg123_supported_decoders());
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_decoder(String^ name)
|
|
191
|
+
{
|
|
192
|
+
const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(name)).ToPointer();
|
|
193
|
+
|
|
194
|
+
int ret;
|
|
195
|
+
|
|
196
|
+
// one of the few mpg123 places that fault with an exception...
|
|
197
|
+
try { ret = ::mpg123_decoder(mh, chars); }
|
|
198
|
+
catch(Exception^){ ret = MPG123_ERR; }
|
|
199
|
+
|
|
200
|
+
Marshal::FreeHGlobal(IntPtr((void*)chars));
|
|
201
|
+
|
|
202
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
String^ mpg123clr::mpg123::mpg123_current_decoder(void)
|
|
206
|
+
{
|
|
207
|
+
return gcnew String(::mpg123_current_decoder(mh));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
array<long>^ mpg123clr::mpg123::mpg123_rates(void)
|
|
211
|
+
{
|
|
212
|
+
size_t number;
|
|
213
|
+
const long* list;
|
|
214
|
+
|
|
215
|
+
::mpg123_rates(&list, &number);
|
|
216
|
+
|
|
217
|
+
array<long>^ rList = gcnew array<long>((int)number);
|
|
218
|
+
|
|
219
|
+
int index = 0;
|
|
220
|
+
|
|
221
|
+
// walk the array, extracting the rates
|
|
222
|
+
while (index < (int)number){ rList[index++] = *(list++); }
|
|
223
|
+
|
|
224
|
+
return rList;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
array<mpg123clr::mpg::enc>^ mpg123clr::mpg123::mpg123_encodings(void)
|
|
228
|
+
{
|
|
229
|
+
size_t number;
|
|
230
|
+
const int* list;
|
|
231
|
+
|
|
232
|
+
::mpg123_encodings(&list, &number);
|
|
233
|
+
|
|
234
|
+
// WARN 4267 - assuming that the number of encodings will never exceed 32bits
|
|
235
|
+
array<mpg123clr::mpg::enc>^ rList = gcnew array<mpg123clr::mpg::enc>((int)number);
|
|
236
|
+
|
|
237
|
+
int index = 0;
|
|
238
|
+
|
|
239
|
+
// walk the array, extracting the rates
|
|
240
|
+
while (index < (int)number){ rList[index++] = (mpg123clr::mpg::enc) *(list++); }
|
|
241
|
+
|
|
242
|
+
return rList;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
int mpg123clr::mpg123::mpg123_encsize(mpg123clr::mpg::enc encoding)
|
|
246
|
+
{
|
|
247
|
+
return ::mpg123_encsize((int) encoding);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_format_none(void)
|
|
251
|
+
{
|
|
252
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_format_none(mh);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_format_all(void)
|
|
256
|
+
{
|
|
257
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_format_all(mh);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_format(int rate, mpg123clr::mpg::channelcount channels, mpg123clr::mpg::enc encodings)
|
|
261
|
+
{
|
|
262
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_format(mh, rate, (int) channels, (int) encodings);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
mpg123clr::mpg::channelcount mpg123clr::mpg123::mpg123_format_support(int rate, mpg123clr::mpg::enc encodings)
|
|
266
|
+
{
|
|
267
|
+
return (mpg123clr::mpg::channelcount) ::mpg123_format_support(mh, rate, (int) encodings);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_getformat([Out] int% rate, [Out] mpg123clr::mpg::channelcount% channels, [Out] mpg123clr::mpg::enc% encodings)
|
|
271
|
+
{
|
|
272
|
+
// either:-
|
|
273
|
+
//
|
|
274
|
+
// long _rate;
|
|
275
|
+
// int _chan, _enc;
|
|
276
|
+
// int ret = mpg123_getformat(mh, &_rate, &_chan, &_enc);
|
|
277
|
+
// rate = _rate;
|
|
278
|
+
// channels = _chan;
|
|
279
|
+
// encodings = _enc;
|
|
280
|
+
// return (mpg123clr::mpg::ErrorCode) ret;
|
|
281
|
+
//
|
|
282
|
+
// or:-
|
|
283
|
+
// use pinned pointers instead
|
|
284
|
+
pin_ptr<int> _rate = &rate;
|
|
285
|
+
pin_ptr<mpg123clr::mpg::channelcount> _chan = &channels;
|
|
286
|
+
pin_ptr<mpg123clr::mpg::enc> _enc = &encodings;
|
|
287
|
+
|
|
288
|
+
int ret = ::mpg123_getformat(mh, (long*)_rate, (int*)_chan, (int*)_enc);
|
|
289
|
+
|
|
290
|
+
_enc = nullptr;
|
|
291
|
+
_chan = nullptr;
|
|
292
|
+
_rate = nullptr;
|
|
293
|
+
|
|
294
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_open(String^ path)
|
|
298
|
+
{
|
|
299
|
+
const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(path)).ToPointer();
|
|
300
|
+
|
|
301
|
+
_ReplaceReader();
|
|
302
|
+
|
|
303
|
+
int ret = ::mpg123_open(mh, chars);
|
|
304
|
+
|
|
305
|
+
Marshal::FreeHGlobal(IntPtr((void*)chars));
|
|
306
|
+
|
|
307
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_open_fd(int filedescriptor)
|
|
311
|
+
{
|
|
312
|
+
_ReplaceReader();
|
|
313
|
+
|
|
314
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_open_fd(mh, filedescriptor);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_open_handle(System::Object^ obj)
|
|
318
|
+
{
|
|
319
|
+
// NOTE: You must have configured callbacks using mpg123_replace_reader_handle
|
|
320
|
+
// before calling mpg123_open_handle!
|
|
321
|
+
|
|
322
|
+
_ReplaceReader(); // activate callbacks
|
|
323
|
+
|
|
324
|
+
// Make sure we free this in Close functions
|
|
325
|
+
userObjectHandle = GCHandle::Alloc(obj);
|
|
326
|
+
|
|
327
|
+
// NOTE: This sends a HANDLE not an ADDRESS, no pinning required
|
|
328
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_open_handle(mh, (void*)GCHandle::ToIntPtr(userObjectHandle).ToPointer());
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_open_feed(void)
|
|
332
|
+
{
|
|
333
|
+
_ReplaceReader();
|
|
334
|
+
|
|
335
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_open_feed(mh);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_close(void)
|
|
339
|
+
{
|
|
340
|
+
// Closes 'mh' and calls Cleanup delegate if provided
|
|
341
|
+
int ret = ::mpg123_close(mh);
|
|
342
|
+
|
|
343
|
+
// See GCHandle.Free - caller must ensure Free called only once for a given handle.
|
|
344
|
+
if (userObjectHandle.IsAllocated) userObjectHandle.Free();
|
|
345
|
+
|
|
346
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_read(array<unsigned char>^ buffer, [Out] size_t% count)
|
|
350
|
+
{
|
|
351
|
+
pin_ptr<size_t> _count = &count;
|
|
352
|
+
pin_ptr<unsigned char> _ptr = &buffer[0];
|
|
353
|
+
|
|
354
|
+
int ret = ::mpg123_read(mh, _ptr, buffer->Length, _count);
|
|
355
|
+
|
|
356
|
+
_ptr = nullptr;
|
|
357
|
+
_count = nullptr;
|
|
358
|
+
|
|
359
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_read(array<unsigned char>^ buffer, size_t offset, size_t size, [Out] size_t% count)
|
|
363
|
+
{
|
|
364
|
+
pin_ptr<size_t> _count = &count;
|
|
365
|
+
// WARN 4267 - clr limited to 32bit-length-size arrays!!
|
|
366
|
+
pin_ptr<unsigned char> _ptr = &buffer[(int)offset];
|
|
367
|
+
|
|
368
|
+
int ret = ::mpg123_read(mh, _ptr, size, _count);
|
|
369
|
+
|
|
370
|
+
_ptr = nullptr;
|
|
371
|
+
_count = nullptr;
|
|
372
|
+
|
|
373
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_feed(array<unsigned char>^ inbuffer, size_t size)
|
|
378
|
+
{
|
|
379
|
+
pin_ptr<unsigned char> _ptr = &inbuffer[0];
|
|
380
|
+
|
|
381
|
+
int ret = ::mpg123_feed(mh, _ptr, size);
|
|
382
|
+
|
|
383
|
+
_ptr = nullptr;
|
|
384
|
+
|
|
385
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_decode(array<unsigned char>^ inbuffer, size_t insize, array<unsigned char>^ outbuffer, size_t outsize, [Out] size_t% count)
|
|
389
|
+
{
|
|
390
|
+
pin_ptr<size_t> _count = &count;
|
|
391
|
+
pin_ptr<const unsigned char> _inptr = &inbuffer[0];
|
|
392
|
+
pin_ptr<unsigned char> _outptr = &outbuffer[0];
|
|
393
|
+
|
|
394
|
+
int ret = ::mpg123_decode(mh, _inptr, insize, _outptr, outsize, _count);
|
|
395
|
+
|
|
396
|
+
_outptr = nullptr;
|
|
397
|
+
_inptr = nullptr;
|
|
398
|
+
_count = nullptr;
|
|
399
|
+
|
|
400
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_decode_frame([Out] off_t% num, [Out] IntPtr% audio, [Out] size_t% count)
|
|
404
|
+
{
|
|
405
|
+
pin_ptr<size_t> _count = &count;
|
|
406
|
+
pin_ptr<off_t> _num = #
|
|
407
|
+
pin_ptr<IntPtr> _x = &audio;
|
|
408
|
+
|
|
409
|
+
int ret = ::mpg123_decode_frame(mh, _num, (unsigned char**)_x, _count);
|
|
410
|
+
|
|
411
|
+
_x = nullptr;
|
|
412
|
+
_num = nullptr;
|
|
413
|
+
_count = nullptr;
|
|
414
|
+
|
|
415
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_framebyframe_decode([Out] off_t% num, [Out] IntPtr% audio, [Out] size_t% count)
|
|
419
|
+
{
|
|
420
|
+
// NOTE: must use framebyframe_next to obtain successive frames
|
|
421
|
+
|
|
422
|
+
pin_ptr<size_t> _count = &count;
|
|
423
|
+
pin_ptr<off_t> _num = #
|
|
424
|
+
pin_ptr<IntPtr> _x = &audio;
|
|
425
|
+
|
|
426
|
+
int ret = ::mpg123_framebyframe_decode(mh, _num, (unsigned char**)_x, _count);
|
|
427
|
+
|
|
428
|
+
_x = nullptr;
|
|
429
|
+
_num = nullptr;
|
|
430
|
+
_count = nullptr;
|
|
431
|
+
|
|
432
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_framebyframe_next()
|
|
436
|
+
{
|
|
437
|
+
// mpg123lib has warning, Experimental API. Watch for updates!!!
|
|
438
|
+
// framebyframe_decode doesn't automatically move on to next frame,
|
|
439
|
+
// use framebyframe_next to move on to "Find, read and parse the next mp3 frame"
|
|
440
|
+
int ret = ::mpg123_framebyframe_next(mh);
|
|
441
|
+
|
|
442
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
long long mpg123clr::mpg123::mpg123_tell(void)
|
|
446
|
+
{
|
|
447
|
+
return ::mpg123_tell(mh);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
long long mpg123clr::mpg123::mpg123_tellframe(void)
|
|
451
|
+
{
|
|
452
|
+
return ::mpg123_tellframe(mh);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
long long mpg123clr::mpg123::mpg123_tell_stream(void)
|
|
456
|
+
{
|
|
457
|
+
return ::mpg123_tell_stream(mh);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
long long mpg123clr::mpg123::mpg123_seek(long long offset, SeekOrigin origin)
|
|
461
|
+
{
|
|
462
|
+
return ::mpg123_seek(mh, (off_t)offset, (int)origin);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
long long mpg123clr::mpg123::mpg123_feedseek(long long offset, SeekOrigin origin, [Out] long long% input_offset)
|
|
466
|
+
{
|
|
467
|
+
// NOTE: off_t fiddles...
|
|
468
|
+
// pin_ptr<int> _input_offset = &input_offset; // type mismatch between 32 and 64 bit offsets.
|
|
469
|
+
|
|
470
|
+
off_t _input_offset; // type accomodation
|
|
471
|
+
|
|
472
|
+
off_t ret = ::mpg123_feedseek(mh, (off_t)offset, (int)origin, &_input_offset); // ok types
|
|
473
|
+
|
|
474
|
+
input_offset = _input_offset; // type conversion
|
|
475
|
+
|
|
476
|
+
return ret;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
long long mpg123clr::mpg123::mpg123_seek_frame(long long frameoffset, SeekOrigin origin)
|
|
480
|
+
{
|
|
481
|
+
return ::mpg123_seek_frame(mh, (off_t)frameoffset, (int)origin);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
long long mpg123clr::mpg123::mpg123_timeframe(double seconds)
|
|
485
|
+
{
|
|
486
|
+
return ::mpg123_timeframe(mh, seconds);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_index([Out] array<long long>^% index, [Out] long long% step)
|
|
490
|
+
{
|
|
491
|
+
// remnant: only works if off_t, index and step are 32 bit - possible redo for 64 bit library
|
|
492
|
+
// pin_ptr<int> _step = &step;
|
|
493
|
+
// int ret = mpg123_index(mh, &_list, (off_t*)_step, &_count);
|
|
494
|
+
// index = gcnew array<int>((int)_count);
|
|
495
|
+
// Marshal::Copy((IntPtr)_list, index, 0, (int)_count);
|
|
496
|
+
|
|
497
|
+
// alternate: works for 32 and 64 bit libraries - returns long long values
|
|
498
|
+
off_t* _list;
|
|
499
|
+
size_t _count;
|
|
500
|
+
off_t _step; // type accomodation
|
|
501
|
+
|
|
502
|
+
int ret = ::mpg123_index(mh, &_list, &_step, &_count);
|
|
503
|
+
|
|
504
|
+
step = _step; // type conversion
|
|
505
|
+
|
|
506
|
+
// WARN 4267 - clr limited to 32bit-length-size arrays!!
|
|
507
|
+
index = gcnew array<long long>((int)_count);
|
|
508
|
+
|
|
509
|
+
// walk the array, extracting the rates
|
|
510
|
+
int idx = 0; // array length limited to 32bit
|
|
511
|
+
while (idx < index->Length){ index[idx++] = *(_list++); }
|
|
512
|
+
|
|
513
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_index([Out] IntPtr% indexarr, [Out] long long% step, [Out] size_t% fill)
|
|
517
|
+
{
|
|
518
|
+
pin_ptr<size_t> _fill = &fill;
|
|
519
|
+
pin_ptr<IntPtr> _x = &indexarr; // NOTE: untyped index pointer.
|
|
520
|
+
off_t _step; // type accomodation
|
|
521
|
+
|
|
522
|
+
int ret = ::mpg123_index(mh, (off_t**)_x, &_step, _fill);
|
|
523
|
+
|
|
524
|
+
step = _step; // type conversion
|
|
525
|
+
|
|
526
|
+
_x = nullptr;
|
|
527
|
+
_fill = nullptr;
|
|
528
|
+
|
|
529
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_position(
|
|
533
|
+
long long frameoffset, long long bufferedbytes, [Out] long long% currentframe, [Out] long long% framesleft,
|
|
534
|
+
[Out] double% currentseconds, [Out] double% secondsleft)
|
|
535
|
+
{
|
|
536
|
+
// NOTE: off_t fiddles
|
|
537
|
+
// pin_ptr<int> _currentframe = ¤tframe;
|
|
538
|
+
// pin_ptr<int> _framesleft = &framesleft;
|
|
539
|
+
pin_ptr<double> _currentseconds = ¤tseconds;
|
|
540
|
+
pin_ptr<double> _secondsleft = &secondsleft;
|
|
541
|
+
off_t _currentframe; // type accomodation
|
|
542
|
+
off_t _framesleft; // type accomodation
|
|
543
|
+
|
|
544
|
+
int ret = ::mpg123_position(mh, (off_t)frameoffset, (off_t)bufferedbytes, &_currentframe, &_framesleft, _currentseconds, _secondsleft);
|
|
545
|
+
|
|
546
|
+
currentframe = _currentframe; // type conversion
|
|
547
|
+
framesleft = _framesleft; // type conversion
|
|
548
|
+
|
|
549
|
+
_secondsleft = nullptr;
|
|
550
|
+
_currentseconds = nullptr;
|
|
551
|
+
|
|
552
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
#pragma region Volume and Equalizer
|
|
556
|
+
|
|
557
|
+
/// \defgroup mpg123_voleq mpg123 volume and equalizer
|
|
558
|
+
///
|
|
559
|
+
|
|
560
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_eq(mpg123clr::mpg::channels channel, int band, double fval)
|
|
561
|
+
{
|
|
562
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_eq(mh, (mpg123_channels)channel, band, fval);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
double mpg123clr::mpg123::mpg123_geteq(mpg123clr::mpg::channels channel, int band)
|
|
566
|
+
{
|
|
567
|
+
return ::mpg123_geteq(mh, (mpg123_channels)channel, band);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_reset_eq(void)
|
|
571
|
+
{
|
|
572
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_reset_eq(mh);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_volume(double volume)
|
|
576
|
+
{
|
|
577
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_volume(mh, volume);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_volume_change(double change)
|
|
581
|
+
{
|
|
582
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_volume_change(mh, change);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_getvolume([Out] double% basevol, [Out] double% really, [Out] double% rva_db)
|
|
586
|
+
{
|
|
587
|
+
pin_ptr<double> _basevol = &basevol;
|
|
588
|
+
pin_ptr<double> _really = &really;
|
|
589
|
+
pin_ptr<double> _rva_db = &rva_db;
|
|
590
|
+
|
|
591
|
+
int ret = ::mpg123_getvolume(mh, _basevol, _really, _rva_db);
|
|
592
|
+
|
|
593
|
+
_rva_db = nullptr;
|
|
594
|
+
_really = nullptr;
|
|
595
|
+
_basevol = nullptr;
|
|
596
|
+
|
|
597
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
#pragma endregion -Volume and Equalizer
|
|
601
|
+
#pragma region Status and Information
|
|
602
|
+
|
|
603
|
+
// \defgroup mpg123_status mpg123 status and information
|
|
604
|
+
//
|
|
605
|
+
//
|
|
606
|
+
//
|
|
607
|
+
|
|
608
|
+
// The "proper" way to manage structs...
|
|
609
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_safeinfo([Out]mpeg_frameinfo^% finfo)
|
|
610
|
+
{
|
|
611
|
+
// "out" our return reference and grab some memory
|
|
612
|
+
finfo = gcnew mpeg_frameinfo;
|
|
613
|
+
IntPtr pp = Marshal::AllocHGlobal(Marshal::SizeOf(finfo));
|
|
614
|
+
|
|
615
|
+
// get the info
|
|
616
|
+
|
|
617
|
+
// could cast away...
|
|
618
|
+
// int ret = mpg123_info(mh, reinterpret_cast<mpg123_frameinfo*>((int)pp));
|
|
619
|
+
// int ret = mpg123_info(mh, static_cast<mpg123_frameinfo*>((void*)pp));
|
|
620
|
+
|
|
621
|
+
// or let the compiler decide...
|
|
622
|
+
int ret = ::mpg123_info(mh, (mpg123_frameinfo*)(void*)pp);
|
|
623
|
+
|
|
624
|
+
// marshal data into return object and free temporary memory
|
|
625
|
+
Marshal::PtrToStructure(pp, finfo);
|
|
626
|
+
Marshal::FreeHGlobal(pp);
|
|
627
|
+
|
|
628
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
// The "efficient" way to manage structs...
|
|
632
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_info([Out]mpeg_frameinfo^% finfo)
|
|
633
|
+
{
|
|
634
|
+
finfo = gcnew mpeg_frameinfo;
|
|
635
|
+
|
|
636
|
+
pin_ptr<mpg123clr::mpg::mpeg_version> _ptr = &finfo->version;
|
|
637
|
+
|
|
638
|
+
// According to SizeOf...
|
|
639
|
+
// The unmanaged and managed sizes of an object can differ, this would imply
|
|
640
|
+
// that the memory layout for each would also be different, which would indicate
|
|
641
|
+
// that using a ptr, derived from a ptr-to-a-managed type, in unmanaged code could
|
|
642
|
+
// have unforseen results.
|
|
643
|
+
//
|
|
644
|
+
// In non-homogenous structs (like mpg123text) it can lead to corrupted CLR stack.
|
|
645
|
+
// In homogenous structs (like finfo) it appears to be "managable".
|
|
646
|
+
//
|
|
647
|
+
// However, until it fails it'll do... and it's much faster (see mpg123_safeinfo(...)).
|
|
648
|
+
|
|
649
|
+
// WARNING:
|
|
650
|
+
// The epitome of "unsafe" as defined by CLR (using unmanaged pointers).
|
|
651
|
+
// If we start to get CLR stack corruptions - check here first! (see SafeInfo for "safe" managed version)
|
|
652
|
+
int ret = ::mpg123_info(mh, (mpg123_frameinfo*)_ptr);
|
|
653
|
+
|
|
654
|
+
_ptr = nullptr;
|
|
655
|
+
|
|
656
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
size_t mpg123clr::mpg123::mpg123_safe_buffer(void)
|
|
660
|
+
{
|
|
661
|
+
return ::mpg123_safe_buffer();
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_scan(void)
|
|
665
|
+
{
|
|
666
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_scan(mh);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
long long mpg123clr::mpg123::mpg123_length(void)
|
|
670
|
+
{
|
|
671
|
+
return ::mpg123_length(mh);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_set_filesize(long long size)
|
|
675
|
+
{
|
|
676
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_set_filesize(mh, (off_t)size);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
double mpg123clr::mpg123::mpg123_tpf(void)
|
|
680
|
+
{
|
|
681
|
+
return ::mpg123_tpf(mh);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
long mpg123clr::mpg123::mpg123_clip(void)
|
|
685
|
+
{
|
|
686
|
+
return ::mpg123_clip(mh);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_getstate(mpg123clr::mpg::state key, [Out] int% val, [Out] double% fval)
|
|
690
|
+
{
|
|
691
|
+
pin_ptr<int> _val = &val;
|
|
692
|
+
pin_ptr<double> _fval = &fval;
|
|
693
|
+
|
|
694
|
+
int ret = ::mpg123_getstate(mh, (mpg123_state)key, (long*) _val, _fval);
|
|
695
|
+
|
|
696
|
+
_fval = nullptr;
|
|
697
|
+
_val = nullptr;
|
|
698
|
+
|
|
699
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
#pragma endregion -Status and Information
|
|
703
|
+
|
|
704
|
+
#pragma region Metadata Handling
|
|
705
|
+
|
|
706
|
+
// \defgroup mpg123_metadata mpg123 metadata handling
|
|
707
|
+
//
|
|
708
|
+
// Functions to retrieve the metadata from MPEG Audio files and streams.
|
|
709
|
+
// Also includes string handling functions.
|
|
710
|
+
//
|
|
711
|
+
|
|
712
|
+
mpg123clr::id3::id3check mpg123clr::mpg123::mpg123_meta_check(void)
|
|
713
|
+
{
|
|
714
|
+
return (mpg123clr::id3::id3check ) ::mpg123_meta_check(mh);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_id3([Out]id3::mpg123id3v1^% v1, [Out]id3::mpg123id3v2^% v2)
|
|
718
|
+
{
|
|
719
|
+
mpg123_id3v1* pv1;
|
|
720
|
+
mpg123_id3v2* pv2;
|
|
721
|
+
|
|
722
|
+
// doc says "pv1 and pv2 may be set to NULL when there is no corresponding data."
|
|
723
|
+
// they may also be set to point to empty structure...
|
|
724
|
+
int ret = ::mpg123_id3(mh, &pv1, &pv2);
|
|
725
|
+
|
|
726
|
+
v1 = gcnew mpg123clr::id3::mpg123id3v1(pv1);
|
|
727
|
+
v2 = gcnew mpg123clr::id3::mpg123id3v2(pv2);
|
|
728
|
+
|
|
729
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_icy([Out]IntPtr% icy_meta)
|
|
733
|
+
{
|
|
734
|
+
char* _icy_meta;
|
|
735
|
+
|
|
736
|
+
int ret = ::mpg123_icy(mh, &_icy_meta);
|
|
737
|
+
|
|
738
|
+
icy_meta = (IntPtr) _icy_meta;
|
|
739
|
+
|
|
740
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
array<unsigned char>^ mpg123clr::mpg123::mpg123_icy2utf8(IntPtr icy_text)
|
|
744
|
+
{
|
|
745
|
+
// TODO: Do we really need this?
|
|
746
|
+
// char* putf8 = mpg123_icy2utf8(const_cast<char*>(reinterpret_cast<char*>(icy_text.ToPointer())));
|
|
747
|
+
|
|
748
|
+
// Or is this adequate?
|
|
749
|
+
char* putf8 = ::mpg123_icy2utf8((const char*)(void*) icy_text);
|
|
750
|
+
|
|
751
|
+
// WARN 4267 - clr limited to 32bit-length-size arrays!!
|
|
752
|
+
array<unsigned char>^ ary = gcnew array<unsigned char>((int)strlen(putf8));
|
|
753
|
+
|
|
754
|
+
Marshal::Copy((IntPtr)putf8, ary, 0, ary->Length);
|
|
755
|
+
free(putf8);
|
|
756
|
+
|
|
757
|
+
return ary;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
#pragma endregion -Metadata Handling
|
|
761
|
+
|
|
762
|
+
#pragma region Low Level I/O
|
|
763
|
+
|
|
764
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_replace_buffer(IntPtr data, size_t size)
|
|
765
|
+
{
|
|
766
|
+
// "data" buffer should be fixed BEFORE calling this function.
|
|
767
|
+
|
|
768
|
+
// TODO: to cast or not to cast??
|
|
769
|
+
// return (mpg123clr::mpg::ErrorCode) mpg123_replace_buffer(mh, reinterpret_cast<unsigned char*>(data.ToPointer()), size);
|
|
770
|
+
|
|
771
|
+
return (mpg123clr::mpg::ErrorCode) ::mpg123_replace_buffer(mh, (unsigned char*)(void*) data, size);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
size_t mpg123clr::mpg123::mpg123_outblock(void)
|
|
775
|
+
{
|
|
776
|
+
return ::mpg123_outblock(mh);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
void mpg123clr::mpg123::_ReplaceReader(void)
|
|
780
|
+
{
|
|
781
|
+
if ((readDel == r_readDel) && (seekDel == r_seekDel)
|
|
782
|
+
&& (readHDel == r_readHDel) && (seekDel == r_seekHDel) && (cleanHDel == r_cleanHDel)) return;
|
|
783
|
+
|
|
784
|
+
// readDel and seekDel are "keep alive" fields that prevent GC of the delegates.
|
|
785
|
+
// the underlying function pointers no not require "pinning".
|
|
786
|
+
|
|
787
|
+
// Note: most examples use GCHandle::Alloc to "pin" the delegate but this is usually to prevent GC
|
|
788
|
+
// outside of function scope and is not strictly necessary here since readDel and seekDel never go
|
|
789
|
+
// out of scope.
|
|
790
|
+
|
|
791
|
+
// See MS: c++, How to: Marshal Callbacks and Delegates Using C++ Interop
|
|
792
|
+
// for more details.
|
|
793
|
+
|
|
794
|
+
readDel = r_readDel;
|
|
795
|
+
seekDel = r_seekDel;
|
|
796
|
+
readHDel = r_readHDel;
|
|
797
|
+
seekHDel = r_seekHDel;
|
|
798
|
+
cleanHDel = r_cleanHDel;
|
|
799
|
+
|
|
800
|
+
// just for clarity
|
|
801
|
+
typedef off_t (_cdecl* SEEKCB)(int, off_t, int);
|
|
802
|
+
typedef ssize_t (_cdecl* READCB)(int, void*, size_t);
|
|
803
|
+
typedef off_t (_cdecl* HSEEKCB)(void*, off_t, int);
|
|
804
|
+
typedef ssize_t (_cdecl* HREADCB)(void*, void*, size_t);
|
|
805
|
+
typedef void (_cdecl* HCLEANCB)(void*);
|
|
806
|
+
|
|
807
|
+
// NOTE: GetFunctionPointerForDelegate doesn't like nullptr
|
|
808
|
+
// NOTE: I'm not suggesting that replace_reader and replace_reader_handle should be
|
|
809
|
+
// intermingled, just trying to maintain a clean stack
|
|
810
|
+
|
|
811
|
+
if (!useHandleReplacement)
|
|
812
|
+
{
|
|
813
|
+
if (lastReplacementWasHandle)
|
|
814
|
+
::mpg123_replace_reader_handle(mh, nullptr, nullptr, nullptr);
|
|
815
|
+
|
|
816
|
+
::mpg123_replace_reader(
|
|
817
|
+
mh,
|
|
818
|
+
(readDel != nullptr) ? (READCB)(Marshal::GetFunctionPointerForDelegate(readDel)).ToPointer() : nullptr,
|
|
819
|
+
(seekDel != nullptr) ? (SEEKCB)(Marshal::GetFunctionPointerForDelegate(seekDel)).ToPointer() : nullptr
|
|
820
|
+
);
|
|
821
|
+
}
|
|
822
|
+
else
|
|
823
|
+
{
|
|
824
|
+
if (!lastReplacementWasHandle) // can give redundant call on first use - microscopically inefficient - not catastrophic
|
|
825
|
+
::mpg123_replace_reader(mh, nullptr, nullptr);
|
|
826
|
+
|
|
827
|
+
::mpg123_replace_reader_handle(
|
|
828
|
+
mh,
|
|
829
|
+
(readHDel != nullptr) ? (HREADCB)(Marshal::GetFunctionPointerForDelegate(readHDel)).ToPointer() : nullptr,
|
|
830
|
+
(seekHDel != nullptr) ? (HSEEKCB)(Marshal::GetFunctionPointerForDelegate(seekHDel)).ToPointer() : nullptr,
|
|
831
|
+
(cleanHDel != nullptr) ? (HCLEANCB)(Marshal::GetFunctionPointerForDelegate(cleanHDel)).ToPointer() : nullptr
|
|
832
|
+
);
|
|
833
|
+
}
|
|
834
|
+
lastReplacementWasHandle = useHandleReplacement;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_replace_reader(ReadDelegate^ r_read, SeekDelegate^ r_lseek)
|
|
838
|
+
{
|
|
839
|
+
// save temporary delegates to be implemented at next 'Open'
|
|
840
|
+
r_readDel = r_read;
|
|
841
|
+
r_seekDel = r_lseek;
|
|
842
|
+
r_readHDel = nullptr;
|
|
843
|
+
r_seekHDel = nullptr;
|
|
844
|
+
r_cleanHDel = nullptr;
|
|
845
|
+
useHandleReplacement = false;
|
|
846
|
+
|
|
847
|
+
return mpg123clr::mpg::ErrorCode::ok;
|
|
848
|
+
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_replace_reader_handle(ReadHandleDelegate^ rh_read, SeekHandleDelegate^ rh_lseek, CleanupHandleDelegate^ rh_clean)
|
|
852
|
+
{
|
|
853
|
+
// save temporary delegates to be implemented at next 'Open'
|
|
854
|
+
r_readHDel = rh_read;
|
|
855
|
+
r_seekHDel = rh_lseek;
|
|
856
|
+
r_cleanHDel = rh_clean;
|
|
857
|
+
r_readDel = nullptr;
|
|
858
|
+
r_seekDel = nullptr;
|
|
859
|
+
useHandleReplacement = true;
|
|
860
|
+
|
|
861
|
+
return mpg123clr::mpg::ErrorCode::ok;
|
|
862
|
+
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
#pragma endregion -Low Level I/O
|
|
866
|
+
|
|
867
|
+
#pragma region MS Unicode Extension
|
|
868
|
+
|
|
869
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_topen(String^ path)
|
|
870
|
+
{
|
|
871
|
+
_ReplaceReader(); // mpg123_tOpen will replace its own reader, this is just for consistency
|
|
872
|
+
|
|
873
|
+
const _TCHAR* chars = (const _TCHAR*)(Marshal::StringToHGlobalUni(path)).ToPointer();
|
|
874
|
+
|
|
875
|
+
int ret = ::mpg123_topen(mh, chars);
|
|
876
|
+
|
|
877
|
+
Marshal::FreeHGlobal(IntPtr((void*)chars));
|
|
878
|
+
|
|
879
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
mpg123clr::mpg::ErrorCode mpg123clr::mpg123::mpg123_tclose(void)
|
|
883
|
+
{
|
|
884
|
+
// Not sure if t_close calls Cleanup (it shouldn't since t_open substitutes its own readers)
|
|
885
|
+
int ret = ::mpg123_tclose(mh);
|
|
886
|
+
|
|
887
|
+
// Fairly sure replace_reader_handle, topen and tclose are incompatible, just for consistency
|
|
888
|
+
// See GCHandle.Free - caller must ensure Free called only once for a given handle.
|
|
889
|
+
if (userObjectHandle.IsAllocated) userObjectHandle.Free();
|
|
890
|
+
|
|
891
|
+
return (mpg123clr::mpg::ErrorCode) ret;
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
#pragma endregion -MS Unicode Extension
|
|
895
|
+
|
|
896
|
+
|