From 1528c9df3a60dc7e9a1bf66290ce4e2ae434ff37 Mon Sep 17 00:00:00 2001 From: waker Date: Tue, 17 Apr 2012 13:51:38 +0200 Subject: merged shellexecui plugin --- scripts/quickinstall.sh | 2 ++ 1 file changed, 2 insertions(+) (limited to 'scripts') diff --git a/scripts/quickinstall.sh b/scripts/quickinstall.sh index 0528ae7c..be81c0fa 100755 --- a/scripts/quickinstall.sh +++ b/scripts/quickinstall.sh @@ -35,6 +35,8 @@ cp ./plugins/mms/.libs/mms.so /usr/local/lib/deadbeef/ cp ./plugins/shn/.libs/ddb_shn.so /usr/local/lib/deadbeef/ cp ./plugins/ao/.libs/ddb_aopsf.so /usr/local/lib/deadbeef/ cp ./plugins/shellexec/.libs/shellexec.so /usr/local/lib/deadbeef/ +cp ./plugins/shellexecui/.libs/shellexec_gtk2.so /usr/local/lib/deadbeef/ +cp ./plugins/shellexecui/.libs/shellexec_gtk3.so /usr/local/lib/deadbeef/ cp ./plugins/dsp_libsrc/.libs/dsp_libsrc.so /usr/local/lib/deadbeef/ cp ./plugins/m3u/.libs/m3u.so /usr/local/lib/deadbeef/ cp ./plugins/ddb_input_uade2/ddb_input_uade2.so /usr/local/lib/deadbeef/ -- cgit v1.2.3 From 57ca744f5cd775c540589452a8e4d5d0636ea11e Mon Sep 17 00:00:00 2001 From: waker Date: Sat, 28 Apr 2012 22:01:18 +0200 Subject: renamed shellexecui output .so filename to conform to static build rules --- plugins/shellexecui/Makefile.am | 26 +++++++++++++------------- plugins/shellexecui/shellexecui.c | 8 ++++---- scripts/quickinstall.sh | 6 +++--- 3 files changed, 20 insertions(+), 20 deletions(-) (limited to 'scripts') diff --git a/plugins/shellexecui/Makefile.am b/plugins/shellexecui/Makefile.am index a7a3c050..a0ac9de9 100644 --- a/plugins/shellexecui/Makefile.am +++ b/plugins/shellexecui/Makefile.am @@ -2,41 +2,41 @@ if HAVE_SHELLEXECUI if HAVE_GTK2 if HAVE_GTK3 -pkglib_LTLIBRARIES = shellexec_gtk2.la shellexec_gtk3.la +pkglib_LTLIBRARIES = shellexecui_gtk2.la shellexecui_gtk3.la else -pkglib_LTLIBRARIES = shellexec_gtk2.la +pkglib_LTLIBRARIES = shellexecui_gtk2.la endif else if HAVE_GTK3 -pkglib_LTLIBRARIES = shellexec_gtk3.la +pkglib_LTLIBRARIES = shellexecui_gtk3.la endif endif AM_CFLAGS = $(CFLAGS) -std=c99 -fPIC if HAVE_GTK2 -shellexec_gtk2_la_SOURCES = shellexecui.c interface.c support.c callbacks.c interface.h support.h callbacks.h -shellexec_gtk2_la_LDFLAGS = -module +shellexecui_gtk2_la_SOURCES = shellexecui.c interface.c support.c callbacks.c interface.h support.h callbacks.h +shellexecui_gtk2_la_LDFLAGS = -module endif if HAVE_GTK3 -shellexec_gtk3_la_SOURCES = shellexecui.c interface.c support.c callbacks.c interface.h support.h callbacks.h -shellexec_gtk3_la_LDFLAGS = -module +shellexecui_gtk3_la_SOURCES = shellexecui.c interface.c support.c callbacks.c interface.h support.h callbacks.h +shellexecui_gtk3_la_LDFLAGS = -module endif if STATICLINK GTK_ROOT=@top_srcdir@/$(LIB)/gtk-2.12.12/usr -shellexec_gtk2_la_LIBADD = $(LDADD) -L$(GTK_ROOT)/lib $(GTK_ROOT)/lib/libgtk-x11-2.0.la $(GTK_ROOT)/lib/libgdk-x11-2.0.la $(GTK_ROOT)/lib/libpangoft2-1.0.la $(GTK_ROOT)/lib/libpangocairo-1.0.la $(GTK_ROOT)/lib/libgdk_pixbuf-2.0.la -lm $(GTK_ROOT)/lib/libcairo.la $(GTK_ROOT)/lib/libpango-1.0.la $(GTK_ROOT)/lib/libgobject-2.0.la $(GTK_ROOT)/lib/libgmodule-2.0.la $(GTK_ROOT)/lib/libgthread-2.0.la -lrt $(GTK_ROOT)/lib/libglib-2.0.la +shellexecui_gtk2_la_LIBADD = $(LDADD) -L$(GTK_ROOT)/lib $(GTK_ROOT)/lib/libgtk-x11-2.0.la $(GTK_ROOT)/lib/libgdk-x11-2.0.la $(GTK_ROOT)/lib/libpangoft2-1.0.la $(GTK_ROOT)/lib/libpangocairo-1.0.la $(GTK_ROOT)/lib/libgdk_pixbuf-2.0.la -lm $(GTK_ROOT)/lib/libcairo.la $(GTK_ROOT)/lib/libpango-1.0.la $(GTK_ROOT)/lib/libgobject-2.0.la $(GTK_ROOT)/lib/libgmodule-2.0.la $(GTK_ROOT)/lib/libgthread-2.0.la -lrt $(GTK_ROOT)/lib/libglib-2.0.la -shellexec_gtk2_la_CFLAGS = -std=c99 -I $(GTK_ROOT)/include -I $(GTK_ROOT)/lib/gtk-2.0/include -I $(GTK_ROOT)/include/glib-2.0 -I $(GTK_ROOT)/include/gtk-2.0 -I $(GTK_ROOT)/include/cairo -I $(GTK_ROOT)/lib/glib-2.0/include/ -I $(GTK_ROOT)/include/pango-1.0 -I $(GTK_ROOT)/include/atk-1.0 -DULTRA_COMPATIBLE=1 +shellexecui_gtk2_la_CFLAGS = -std=c99 -I $(GTK_ROOT)/include -I $(GTK_ROOT)/lib/gtk-2.0/include -I $(GTK_ROOT)/include/glib-2.0 -I $(GTK_ROOT)/include/gtk-2.0 -I $(GTK_ROOT)/include/cairo -I $(GTK_ROOT)/lib/glib-2.0/include/ -I $(GTK_ROOT)/include/pango-1.0 -I $(GTK_ROOT)/include/atk-1.0 -DULTRA_COMPATIBLE=1 else if HAVE_GTK2 -shellexec_gtk2_la_LIBADD = $(LDADD) $(GTK2_DEPS_LIBS) -shellexec_gtk2_la_CFLAGS = -std=c99 $(GTK2_DEPS_CFLAGS) +shellexecui_gtk2_la_LIBADD = $(LDADD) $(GTK2_DEPS_LIBS) +shellexecui_gtk2_la_CFLAGS = -std=c99 $(GTK2_DEPS_CFLAGS) endif if HAVE_GTK3 -shellexec_gtk3_la_LIBADD = $(LDADD) $(GTK3_DEPS_LIBS) -shellexec_gtk3_la_CFLAGS = -std=c99 $(GTK3_DEPS_CFLAGS) +shellexecui_gtk3_la_LIBADD = $(LDADD) $(GTK3_DEPS_LIBS) +shellexecui_gtk3_la_CFLAGS = -std=c99 $(GTK3_DEPS_CFLAGS) endif endif diff --git a/plugins/shellexecui/shellexecui.c b/plugins/shellexecui/shellexecui.c index 0f979653..0898d4aa 100644 --- a/plugins/shellexecui/shellexecui.c +++ b/plugins/shellexecui/shellexecui.c @@ -397,9 +397,9 @@ static DB_misc_t plugin = { .plugin.version_major = 1, .plugin.version_minor = 0, #if GTK_CHECK_VERSION(3,0,0) - .plugin.id = "shellexec_gtk2", + .plugin.id = "shellexecui_gtk2", #else - .plugin.id = "shellexec_gtk3", + .plugin.id = "shellexecui_gtk3", #endif .plugin.name = "Shellexec GTK UI", .plugin.descr = "A GTK UI for the Shellexec plugin", @@ -426,9 +426,9 @@ static DB_misc_t plugin = { DB_plugin_t * #if GTK_CHECK_VERSION(3,0,0) -shellexec_gtk3_load (DB_functions_t *api) { +shellexecui_gtk3_load (DB_functions_t *api) { #else -shellexec_gtk2_load (DB_functions_t *api) { +shellexecui_gtk2_load (DB_functions_t *api) { #endif deadbeef = api; return DB_PLUGIN(&plugin); diff --git a/scripts/quickinstall.sh b/scripts/quickinstall.sh index be81c0fa..7fd71958 100755 --- a/scripts/quickinstall.sh +++ b/scripts/quickinstall.sh @@ -33,10 +33,10 @@ cp ./plugins/dca/.libs/dca.so /usr/local/lib/deadbeef/ cp ./plugins/aac/.libs/aac.so /usr/local/lib/deadbeef/ cp ./plugins/mms/.libs/mms.so /usr/local/lib/deadbeef/ cp ./plugins/shn/.libs/ddb_shn.so /usr/local/lib/deadbeef/ -cp ./plugins/ao/.libs/ddb_aopsf.so /usr/local/lib/deadbeef/ +cp ./plugins/ao/.libs/ddb_ao.so /usr/local/lib/deadbeef/ cp ./plugins/shellexec/.libs/shellexec.so /usr/local/lib/deadbeef/ -cp ./plugins/shellexecui/.libs/shellexec_gtk2.so /usr/local/lib/deadbeef/ -cp ./plugins/shellexecui/.libs/shellexec_gtk3.so /usr/local/lib/deadbeef/ +cp ./plugins/shellexecui/.libs/shellexecui_gtk2.so /usr/local/lib/deadbeef/ +cp ./plugins/shellexecui/.libs/shellexecui_gtk3.so /usr/local/lib/deadbeef/ cp ./plugins/dsp_libsrc/.libs/dsp_libsrc.so /usr/local/lib/deadbeef/ cp ./plugins/m3u/.libs/m3u.so /usr/local/lib/deadbeef/ cp ./plugins/ddb_input_uade2/ddb_input_uade2.so /usr/local/lib/deadbeef/ -- cgit v1.2.3 From 94584d1ebe7bfd133fff1d3dcafcb7a30ddf5d63 Mon Sep 17 00:00:00 2001 From: waker Date: Sat, 28 Apr 2012 22:07:13 +0200 Subject: preparation for building 0.5.3 --- PORTABLE_VERSION | 2 +- scripts/portable_package_static.sh | 1 + scripts/portable_postbuild.sh | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) (limited to 'scripts') diff --git a/PORTABLE_VERSION b/PORTABLE_VERSION index cb0c939a..7641a7dd 100644 --- a/PORTABLE_VERSION +++ b/PORTABLE_VERSION @@ -1 +1 @@ -0.5.2 +0.5.3-rc1 diff --git a/scripts/portable_package_static.sh b/scripts/portable_package_static.sh index 2b8e5465..9d00dd82 100755 --- a/scripts/portable_package_static.sh +++ b/scripts/portable_package_static.sh @@ -39,6 +39,7 @@ tar jcvf ../portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2\ $PLUGDIR/nullout.so\ $PLUGDIR/oss.so\ $PLUGDIR/shellexec.so\ + $PLUGDIR/shellexecui_gtk2.so\ $PLUGDIR/sid.so\ $PLUGDIR/sndfile.so\ $PLUGDIR/supereq.so\ diff --git a/scripts/portable_postbuild.sh b/scripts/portable_postbuild.sh index f572240f..b68bade0 100755 --- a/scripts/portable_postbuild.sh +++ b/scripts/portable_postbuild.sh @@ -18,7 +18,7 @@ for i in nullout cdda flac alsa mpgmad hotkeys vtx \ ffap ffmpeg wavpack vorbis oss vfs_curl \ lastfm sid adplug sndfile artwork \ supereq gme dumb notify musepack wildmidi \ - tta dca aac mms shn ao shellexec vfs_zip \ + tta dca aac mms shn ao shellexec shellexecui vfs_zip \ m3u converter pulse dsp_libsrc mono2stereo ; do if [ -f ./plugins/$i/.libs/$i.so ]; then cp ./plugins/$i/.libs/$i.so $PLUGDIR/ -- cgit v1.2.3 From 5abbd96a58cc324167e5161d53f0add4dc45aa68 Mon Sep 17 00:00:00 2001 From: waker Date: Mon, 30 Apr 2012 21:22:39 +0200 Subject: x86_64 static build support --- PORTABLE_VERSION | 2 +- scripts/portable_build.sh | 9 +- scripts/portable_package_static.sh | 12 +- scripts/portable_postbuild.sh | 3 +- scripts/static_build.sh | 28 ++++ scripts/static_install.sh | 3 + tools/apbuild/apgcc | 5 +- tools/apbuild/apsymbols.h | 120 ++++++++-------- tools/apbuild/apsymbols.h.x86 | 275 ++++++++++++++++++++++++++++++++++++ tools/apbuild/apsymbols.h.x86_64 | 281 +++++++++++++++++++++++++++++++++++++ tools/apbuild/ctype.h | 10 +- 11 files changed, 677 insertions(+), 71 deletions(-) create mode 100755 scripts/static_build.sh create mode 100755 scripts/static_install.sh create mode 100644 tools/apbuild/apsymbols.h.x86 create mode 100644 tools/apbuild/apsymbols.h.x86_64 (limited to 'scripts') diff --git a/PORTABLE_VERSION b/PORTABLE_VERSION index 7641a7dd..6db426b0 100644 --- a/PORTABLE_VERSION +++ b/PORTABLE_VERSION @@ -1 +1 @@ -0.5.3-rc1 +0.5.3-rc2 diff --git a/scripts/portable_build.sh b/scripts/portable_build.sh index 6a047023..89f2d1ca 100755 --- a/scripts/portable_build.sh +++ b/scripts/portable_build.sh @@ -1,14 +1,15 @@ #!/bin/sh VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` ORIGIN=`pwd | perl -ne 'chomp and print'` -AP=$HOME/bin/autopackage -export CC=$AP/apbuild/apgcc -export CXX=$AP/apbuild/apgcc +AP=$ORIGIN/tools/apbuild +export CC=$AP/apgcc +export CXX=$AP/apgcc + export APBUILD_STATIC_LIBGCC=1 ./autogen.sh -./configure --enable-staticlink --enable-portable --disable-artwork-imlib2 +./configure --enable-staticlink=yes --enable-portable=yes --disable-artwork-imlib2 sed -i 's/-lstdc++ -lm -lgcc_s -lc -lgcc_s/-lm -lc/g' libtool make clean make -j9 diff --git a/scripts/portable_package_static.sh b/scripts/portable_package_static.sh index 9d00dd82..26fa6051 100755 --- a/scripts/portable_package_static.sh +++ b/scripts/portable_package_static.sh @@ -10,10 +10,12 @@ PLUGDIR=$SRCDIR/plugins DOCDIR=$SRCDIR/doc PIXMAPDIR=$SRCDIR/pixmaps -rm portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2 +ARCH=`uname -m | perl -ne 'chomp and print'` -cd portable -tar jcvf ../portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2\ +rm portable_out/build/deadbeef-$VERSION-static-$ARCH.tar.bz2 + +cd portable/$ARCH +tar jcvf ../..//portable_out/build/deadbeef-$VERSION-static-$ARCH.tar.bz2\ $SRCDIR/deadbeef\ $SRCDIR/deadbeef.png\ $DOCDIR\ @@ -58,7 +60,7 @@ tar jcvf ../portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2\ $PLUGDIR/convpresets\ $PLUGDIR/pulse.so\ $PLUGDIR/dsp_libsrc.so\ - $PLUGDIR/mono2stereo.so\ + $PLUGDIR/ddb_mono2stereo.so\ $PIXMAPDIR\ $SRCDIR/locale -cd .. +cd ../.. diff --git a/scripts/portable_postbuild.sh b/scripts/portable_postbuild.sh index b68bade0..9a82c216 100755 --- a/scripts/portable_postbuild.sh +++ b/scripts/portable_postbuild.sh @@ -1,7 +1,8 @@ #!/bin/sh VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` OSTYPE=`uname -s` -OUTDIR=portable/deadbeef-$VERSION +ARCH=`uname -m | perl -ne 'chomp and print'` +OUTDIR=portable/$ARCH/deadbeef-$VERSION PLUGDIR=$OUTDIR/plugins DOCDIR=$OUTDIR/doc PIXMAPDIR=$OUTDIR/pixmaps diff --git a/scripts/static_build.sh b/scripts/static_build.sh new file mode 100755 index 00000000..7eb00e10 --- /dev/null +++ b/scripts/static_build.sh @@ -0,0 +1,28 @@ +#!/bin/sh +VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` +ORIGIN=`pwd | perl -ne 'chomp and print'` +AP=$ORIGIN/tools/apbuild +export CC=$AP/apgcc +export CXX=$AP/apgcc + +export APBUILD_STATIC_LIBGCC=1 + +./autogen.sh + +./configure --enable-staticlink --disable-artwork-imlib2 --prefix=/opt/deadbeef +sed -i 's/-lstdc++ -lm -lgcc_s -lc -lgcc_s/-lm -lc/g' libtool +make clean +make -j9 + +#./scripts/portable_extraplugs.sh + +cd $ORIGIN + +echo "building pluginfo tool..." +cd tools/pluginfo +make +cd ../../ + +#./scripts/portable_postbuild.sh +fakeroot -- ./scripts/static_install.sh + diff --git a/scripts/static_install.sh b/scripts/static_install.sh new file mode 100755 index 00000000..9de33357 --- /dev/null +++ b/scripts/static_install.sh @@ -0,0 +1,3 @@ +#!/bin/sh +VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` +DESTDIR=`pwd`/static/deadbeef-$VERSION make install diff --git a/tools/apbuild/apgcc b/tools/apbuild/apgcc index 2aba0071..8b81686c 100755 --- a/tools/apbuild/apgcc +++ b/tools/apbuild/apgcc @@ -19,7 +19,6 @@ use Apbuild::Utils; # Don't forget to bump the version in Makefile too. our $APBUILD_VERSION = "2.0.9"; - ######## Initialization ######## # In C mode: @@ -79,6 +78,10 @@ if (!defined $appath) { $appath = $FindBin::Bin; } } +my $arch=`uname -m`; +chomp $arch; +`cp $appath/apsymbols.h.$arch $appath/apsymbols.h`; + # Special constants our @linking = ('-Wl,--enable-new-dtags,--rpath,${ORIGIN}/../lib,--rpath,${ORIGIN}/../lib/autopackage'); diff --git a/tools/apbuild/apsymbols.h b/tools/apbuild/apsymbols.h index 32c7b18c..aaf99264 100644 --- a/tools/apbuild/apsymbols.h +++ b/tools/apbuild/apsymbols.h @@ -6,33 +6,42 @@ APBUILD_NOTE_METADATA("apbuild.version=" APBUILD_VERSION); #endif /* apbuild generated symbol exclusion list */ -__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.0"); -__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.0"); -__asm__(".symver _sys_siglist,_sys_siglist@GLIBC_2.0"); -__asm__(".symver clnt_pcreateerror,clnt_pcreateerror@GLIBC_2.0"); -__asm__(".symver clnt_spcreateerror,clnt_spcreateerror@GLIBC_2.0"); -__asm__(".symver feupdateenv,feupdateenv@GLIBC_2.1"); -__asm__(".symver lio_listio,lio_listio@GLIBC_2.1"); -__asm__(".symver lio_listio64,lio_listio64@GLIBC_2.1"); -__asm__(".symver nftw,nftw@GLIBC_2.1"); -__asm__(".symver nftw64,nftw64@GLIBC_2.1"); -__asm__(".symver posix_fadvise64,posix_fadvise64@GLIBC_2.2"); -__asm__(".symver posix_fallocate64,posix_fallocate64@GLIBC_2.2"); -__asm__(".symver pthread_cond_broadcast,pthread_cond_broadcast@GLIBC_2.0"); -__asm__(".symver pthread_cond_destroy,pthread_cond_destroy@GLIBC_2.0"); -__asm__(".symver pthread_cond_init,pthread_cond_init@GLIBC_2.0"); -__asm__(".symver pthread_cond_signal,pthread_cond_signal@GLIBC_2.0"); -__asm__(".symver pthread_cond_timedwait,pthread_cond_timedwait@GLIBC_2.0"); -__asm__(".symver pthread_cond_wait,pthread_cond_wait@GLIBC_2.0"); -__asm__(".symver regexec,regexec@GLIBC_2.0"); -__asm__(".symver rpc_createerr,rpc_createerr@GLIBC_2.0"); -__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.0"); -__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.0"); -__asm__(".symver sys_sigabbrev,sys_sigabbrev@GLIBC_2.0"); -__asm__(".symver sys_siglist,sys_siglist@GLIBC_2.0"); -__asm__(".symver vm86,vm86@GLIBC_2.0"); -__asm__(".symver __rpc_thread_createerr,__rpc_thread_createerr@GLIBC_2.2.3"); -__asm__(".symver __guard,__guard@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver clnt_pcreateerror,clnt_pcreateerror@GLIBC_2.2.5"); +__asm__(".symver clnt_spcreateerror,clnt_spcreateerror@GLIBC_2.2.5"); +__asm__(".symver feupdateenv,feupdateenv@GLIBC_2.2.5"); +__asm__(".symver lio_listio,lio_listio@GLIBC_2.2.5"); +__asm__(".symver lio_listio64,lio_listio64@GLIBC_2.2.5"); +__asm__(".symver mkostemps,mkostemps@GLIBC_2.11"); +__asm__(".symver mkostemps64,mkostemps64@GLIBC_2.11"); +__asm__(".symver nftw,nftw@GLIBC_2.2.5"); +__asm__(".symver nftw64,nftw64@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_broadcast,pthread_cond_broadcast@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_destroy,pthread_cond_destroy@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_init,pthread_cond_init@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_signal,pthread_cond_signal@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_timedwait,pthread_cond_timedwait@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_wait,pthread_cond_wait@GLIBC_2.2.5"); +__asm__(".symver regexec,regexec@GLIBC_2.2.5"); +__asm__(".symver rpc_createerr,rpc_createerr@GLIBC_2.2.5"); +__asm__(".symver __rpc_thread_createerr,__rpc_thread_createerr@GLIBC_2.2.5"); +__asm__(".symver __strtoll_l,__strtoll_l@GLIBC_2.2.5"); +__asm__(".symver __strtoull_l,__strtoull_l@GLIBC_2.2.5"); +/*__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.3"); +__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.3");*/ +__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.2.5"); +__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.2.5"); +/*__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.3"); +__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.3");*/ +__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.2.5"); +__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.2.5"); +__asm__(".symver sys_sigabbrev,sys_sigabbrev@GLIBC_2.2.5"); +__asm__(".symver _sys_siglist,_sys_siglist@GLIBC_2.2.5"); +__asm__(".symver sys_siglist,sys_siglist@GLIBC_2.2.5"); +__asm__(".symver timer_create,timer_create@GLIBC_2.2.5"); +__asm__(".symver timer_delete,timer_delete@GLIBC_2.2.5"); +__asm__(".symver timer_getoverrun,timer_getoverrun@GLIBC_2.2.5"); +__asm__(".symver timer_gettime,timer_gettime@GLIBC_2.2.5"); +__asm__(".symver timer_settime,timer_settime@GLIBC_2.2.5"); __asm__(".symver __gethostname_chk,__gethostname_chk@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver epoll_create,epoll_create@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver __getdomainname_chk,__getdomainname_chk@GLIBC_DONT_USE_THIS_SYMBOL"); @@ -151,7 +160,6 @@ __asm__(".symver __strncat_chk,__strncat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver inet6_rth_space,inet6_rth_space@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver __recv_chk,__recv_chk@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver inet6_rth_reverse,inet6_rth_reverse@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver __stack_smash_handler,__stack_smash_handler@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver __realpath_chk,__realpath_chk@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver qsort_r,qsort_r@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver __obstack_printf_chk,__obstack_printf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); @@ -208,9 +216,9 @@ __asm__(".symver __xmknodat,__xmknodat@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver inet6_option_find,inet6_option_find@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver __ttyname_r_chk,__ttyname_r_chk@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver __readlinkat_chk,__readlinkat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver dlmopen,dlmopen@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver dladdr1,dladdr1@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver dlinfo,dlinfo@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dladdr1,dladdr1@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dlmopen,dlmopen@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver pthread_mutexattr_getprotocol,pthread_mutexattr_getprotocol@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver pthread_mutex_setprioceiling,pthread_mutex_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver pthread_mutexattr_setprioceiling,pthread_mutexattr_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); @@ -235,41 +243,39 @@ __asm__(".symver pthread_mutexattr_getrobust_np,pthread_mutexattr_getrobust_np@G __asm__(".symver pthread_mutexattr_setprotocol,pthread_mutexattr_setprotocol@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver pthread_mutex_consistent_np,pthread_mutex_consistent_np@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver ns_put16,ns_put16@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_name_pton,ns_name_pton@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_name_skip,ns_name_skip@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_initparse,ns_initparse@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __p_rcode,__p_rcode@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_msg_getflag,ns_msg_getflag@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver ns_name_pack,ns_name_pack@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_name_ntol,ns_name_ntol@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_sprintrr,ns_sprintrr@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_format_ttl,ns_format_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_name_ntop,ns_name_ntop@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_name_compress,ns_name_compress@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_name_unpack,ns_name_unpack@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_put32,ns_put32@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_sprintrrf,ns_sprintrrf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_skiprr,ns_skiprr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_get32,ns_get32@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_makecanon,ns_makecanon@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_parse_ttl,ns_parse_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver ns_datetosecs,ns_datetosecs@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_get16,ns_get16@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_msg_getflag,ns_msg_getflag@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_put32,ns_put32@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_format_ttl,ns_format_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_rollback,ns_name_rollback@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_subdomain,ns_subdomain@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver ns_samedomain,ns_samedomain@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver __p_rcode,__p_rcode@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_parse_ttl,ns_parse_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_get32,ns_get32@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_skiprr,ns_skiprr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_pton,ns_name_pton@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver ns_parserr,ns_parserr@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_name_rollback,ns_name_rollback@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_samename,ns_samename@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver ns_name_uncompress,ns_name_uncompress@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_subdomain,ns_subdomain@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_makecanon,ns_makecanon@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver ns_initparse,ns_initparse@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver mq_open,mq_open@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver __mq_open_2,__mq_open_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_unpack,ns_name_unpack@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_skip,ns_name_skip@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_sprintrrf,ns_sprintrrf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_compress,ns_name_compress@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_ntol,ns_name_ntol@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_ntop,ns_name_ntop@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_samename,ns_samename@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_get16,ns_get16@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_timedreceive,mq_timedreceive@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver mq_timedsend,mq_timedsend@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_setattr,mq_setattr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_send,mq_send@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_unlink,mq_unlink@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mq_open_2,__mq_open_2@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver mq_notify,mq_notify@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver mq_receive,mq_receive@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver mq_close,mq_close@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver mq_getattr,mq_getattr@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver mq_send,mq_send@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver mq_unlink,mq_unlink@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver mq_setattr,mq_setattr@GLIBC_DONT_USE_THIS_SYMBOL"); -__asm__(".symver mq_timedreceive,mq_timedreceive@GLIBC_DONT_USE_THIS_SYMBOL"); __asm__(".symver td_thr_tlsbase,td_thr_tlsbase@GLIBC_DONT_USE_THIS_SYMBOL"); diff --git a/tools/apbuild/apsymbols.h.x86 b/tools/apbuild/apsymbols.h.x86 new file mode 100644 index 00000000..32c7b18c --- /dev/null +++ b/tools/apbuild/apsymbols.h.x86 @@ -0,0 +1,275 @@ +/* apbuild embedded metadata */ +#define APBUILD_NOTE_METADATA(s) __asm__(".section .metadata, \"MS\", @note, 1\n\t.string \"" s "\"\n\t.previous\n\t") + +#ifdef APBUILD_VERSION +APBUILD_NOTE_METADATA("apbuild.version=" APBUILD_VERSION); +#endif + +/* apbuild generated symbol exclusion list */ +__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.0"); +__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.0"); +__asm__(".symver _sys_siglist,_sys_siglist@GLIBC_2.0"); +__asm__(".symver clnt_pcreateerror,clnt_pcreateerror@GLIBC_2.0"); +__asm__(".symver clnt_spcreateerror,clnt_spcreateerror@GLIBC_2.0"); +__asm__(".symver feupdateenv,feupdateenv@GLIBC_2.1"); +__asm__(".symver lio_listio,lio_listio@GLIBC_2.1"); +__asm__(".symver lio_listio64,lio_listio64@GLIBC_2.1"); +__asm__(".symver nftw,nftw@GLIBC_2.1"); +__asm__(".symver nftw64,nftw64@GLIBC_2.1"); +__asm__(".symver posix_fadvise64,posix_fadvise64@GLIBC_2.2"); +__asm__(".symver posix_fallocate64,posix_fallocate64@GLIBC_2.2"); +__asm__(".symver pthread_cond_broadcast,pthread_cond_broadcast@GLIBC_2.0"); +__asm__(".symver pthread_cond_destroy,pthread_cond_destroy@GLIBC_2.0"); +__asm__(".symver pthread_cond_init,pthread_cond_init@GLIBC_2.0"); +__asm__(".symver pthread_cond_signal,pthread_cond_signal@GLIBC_2.0"); +__asm__(".symver pthread_cond_timedwait,pthread_cond_timedwait@GLIBC_2.0"); +__asm__(".symver pthread_cond_wait,pthread_cond_wait@GLIBC_2.0"); +__asm__(".symver regexec,regexec@GLIBC_2.0"); +__asm__(".symver rpc_createerr,rpc_createerr@GLIBC_2.0"); +__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.0"); +__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.0"); +__asm__(".symver sys_sigabbrev,sys_sigabbrev@GLIBC_2.0"); +__asm__(".symver sys_siglist,sys_siglist@GLIBC_2.0"); +__asm__(".symver vm86,vm86@GLIBC_2.0"); +__asm__(".symver __rpc_thread_createerr,__rpc_thread_createerr@GLIBC_2.2.3"); +__asm__(".symver __guard,__guard@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __gethostname_chk,__gethostname_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_create,epoll_create@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getdomainname_chk,__getdomainname_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vswprintf_chk,__vswprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __stpcpy_chk,__stpcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver timerfd_gettime,timerfd_gettime@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inotify_init1,inotify_init1@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcstombs_chk,__wcstombs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __printf_chk,__printf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgetws_chk,__fgetws_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __register_atfork,__register_atfork@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver gnu_dev_major,gnu_dev_major@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vfwprintf_chk,__vfwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcpcpy_chk,__wcpcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver open_wmemstream,open_wmemstream@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_append,inet6_opt_append@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver timerfd_create,timerfd_create@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __swprintf_chk,__swprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver getipv4sourcefilter,getipv4sourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vwprintf_chk,__vwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver readlinkat,readlinkat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wctomb_chk,__wctomb_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __readlink_chk,__readlink_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver setipv4sourcefilter,setipv4sourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_sscanf,__isoc99_sscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getlogin_r_chk,__getlogin_r_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sync_file_range,sync_file_range@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __open64_2,__open64_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_init,inet6_rth_init@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_next,inet6_opt_next@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fxstatat64,__fxstatat64@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver unlinkat,unlinkat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fwprintf_chk,__fwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mempcpy_chk,__mempcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_wait,epoll_wait@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mkfifoat,mkfifoat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_scanf,__isoc99_scanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __read_chk,__read_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgetws_unlocked_chk,__fgetws_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vsprintf_chk,__vsprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsncpy_chk,__wcsncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __stack_chk_fail,__stack_chk_fail@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inotify_rm_watch,inotify_rm_watch@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver xdr_quad_t,xdr_quad_t@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sched_cpualloc,__sched_cpualloc@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __obstack_vprintf_chk,__obstack_vprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_swscanf,__isoc99_swscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vfwscanf,__isoc99_vfwscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sched_cpufree,__sched_cpufree@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_finish,inet6_opt_finish@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __confstr_chk,__confstr_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsncat_chk,__wcsncat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver setsourcefilter,setsourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver xdr_u_quad_t,xdr_u_quad_t@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fread_unlocked_chk,__fread_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eaccess,eaccess@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_alloc,inet6_option_alloc@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __openat64_2,__openat64_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sched_setaffinity,sched_setaffinity@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_append,inet6_option_append@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver futimens,futimens@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver renameat,renameat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmemset_chk,__wmemset_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_get_val,inet6_opt_get_val@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver unshare,unshare@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vsscanf,__isoc99_vsscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver signalfd,signalfd@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_next,inet6_option_next@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_add,inet6_rth_add@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver semtimedop,semtimedop@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver utimensat,utimensat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_segments,inet6_rth_segments@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pread_chk,__pread_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __syslog_chk,__syslog_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eventfd,eventfd@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgets_unlocked_chk,__fgets_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getcwd_chk,__getcwd_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver fchmodat,fchmodat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dup3,dup3@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vprintf_chk,__vprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fprintf_chk,__fprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmemcpy_chk,__wmemcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_wscanf,__isoc99_wscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcscpy_chk,__wcscpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_fscanf,__isoc99_fscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mbstowcs_chk,__mbstowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __dprintf_chk,__dprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmempcpy_chk,__wmempcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver symlinkat,symlinkat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __memmove_chk,__memmove_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getwd_chk,__getwd_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vsnprintf_chk,__vsnprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mkostemp64,mkostemp64@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eventfd_read,eventfd_read@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver remap_file_pages,remap_file_pages@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vswscanf,__isoc99_vswscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver fdopendir,fdopendir@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __openat_2,__openat_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgets_chk,__fgets_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strncpy_chk,__strncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sched_cpucount,__sched_cpucount@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mbsrtowcs_chk,__mbsrtowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcscat_chk,__wcscat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_space,inet6_option_space@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sched_getaffinity,sched_getaffinity@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __open_2,__open_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver fchownat,fchownat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver timerfd_settime,timerfd_settime@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sched_getcpu,sched_getcpu@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getgroups_chk,__getgroups_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_init,inet6_opt_init@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __snprintf_chk,__snprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mkdirat,mkdirat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __memset_chk,__memset_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strncat_chk,__strncat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_space,inet6_rth_space@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __recv_chk,__recv_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_reverse,inet6_rth_reverse@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __stack_smash_handler,__stack_smash_handler@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __realpath_chk,__realpath_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver qsort_r,qsort_r@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __obstack_printf_chk,__obstack_printf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_getaddr,inet6_rth_getaddr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver splice,splice@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eventfd_write,eventfd_write@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver vmsplice,vmsplice@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver getsourcefilter,getsourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vwscanf,__isoc99_vwscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_ctl,epoll_ctl@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver gnu_dev_minor,gnu_dev_minor@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __memcpy_chk,__memcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vfscanf,__isoc99_vfscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __stpncpy_chk,__stpncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_find,inet6_opt_find@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mbsnrtowcs_chk,__mbsnrtowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver strerror_l,strerror_l@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fread_chk,__fread_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsnrtombs_chk,__wcsnrtombs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wprintf_chk,__wprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_create1,epoll_create1@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vfprintf_chk,__vfprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vsyslog_chk,__vsyslog_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inotify_add_watch,inotify_add_watch@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcrtomb_chk,__wcrtomb_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_pwait,epoll_pwait@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strcpy_chk,__strcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vdprintf_chk,__vdprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vasprintf_chk,__vasprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __xpg_strerror_r,__xpg_strerror_r@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcpncpy_chk,__wcpncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_init,inet6_option_init@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmemmove_chk,__wmemmove_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sprintf_chk,__sprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver futimesat,futimesat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pread64_chk,__pread64_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver strptime_l,strptime_l@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver lchmod,lchmod@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __chk_fail,__chk_fail@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vscanf,__isoc99_vscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsrtombs_chk,__wcsrtombs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pipe2,pipe2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strcat_chk,__strcat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver faccessat,faccessat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __asprintf_chk,__asprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ppoll,ppoll@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __recvfrom_chk,__recvfrom_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_set_val,inet6_opt_set_val@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __ptsname_r_chk,__ptsname_r_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_fwscanf,__isoc99_fwscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __gets_chk,__gets_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver gnu_dev_makedev,gnu_dev_makedev@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __xmknodat,__xmknodat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_find,inet6_option_find@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __ttyname_r_chk,__ttyname_r_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __readlinkat_chk,__readlinkat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dlmopen,dlmopen@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dladdr1,dladdr1@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dlinfo,dlinfo@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_getprotocol,pthread_mutexattr_getprotocol@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutex_setprioceiling,pthread_mutex_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_setprioceiling,pthread_mutexattr_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_unregister_cancel_restore,__pthread_unregister_cancel_restore@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_attr_setaffinity_np,pthread_attr_setaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_cleanup_routine,__pthread_cleanup_routine@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_condattr_getclock,pthread_condattr_getclock@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_register_cancel_defer,__pthread_register_cancel_defer@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_unwind_next,__pthread_unwind_next@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_timedjoin_np,pthread_timedjoin_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_setaffinity_np,pthread_setaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutex_getprioceiling,pthread_mutex_getprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_getprioceiling,pthread_mutexattr_getprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_attr_getaffinity_np,pthread_attr_getaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_barrierattr_getpshared,pthread_barrierattr_getpshared@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_condattr_setclock,pthread_condattr_setclock@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_tryjoin_np,pthread_tryjoin_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_setschedprio,pthread_setschedprio@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_getaffinity_np,pthread_getaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_setrobust_np,pthread_mutexattr_setrobust_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_getrobust_np,pthread_mutexattr_getrobust_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_setprotocol,pthread_mutexattr_setprotocol@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutex_consistent_np,pthread_mutex_consistent_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_put16,ns_put16@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_pton,ns_name_pton@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_skip,ns_name_skip@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_pack,ns_name_pack@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_ntol,ns_name_ntol@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_sprintrr,ns_sprintrr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_format_ttl,ns_format_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_ntop,ns_name_ntop@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_compress,ns_name_compress@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_unpack,ns_name_unpack@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_put32,ns_put32@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_sprintrrf,ns_sprintrrf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_datetosecs,ns_datetosecs@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_get16,ns_get16@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_msg_getflag,ns_msg_getflag@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_samedomain,ns_samedomain@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __p_rcode,__p_rcode@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_parse_ttl,ns_parse_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_get32,ns_get32@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_skiprr,ns_skiprr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_parserr,ns_parserr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_rollback,ns_name_rollback@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_samename,ns_samename@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_uncompress,ns_name_uncompress@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_subdomain,ns_subdomain@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_makecanon,ns_makecanon@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_initparse,ns_initparse@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_open,mq_open@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mq_open_2,__mq_open_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_timedsend,mq_timedsend@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_notify,mq_notify@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_receive,mq_receive@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_close,mq_close@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_getattr,mq_getattr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_send,mq_send@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_unlink,mq_unlink@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_setattr,mq_setattr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_timedreceive,mq_timedreceive@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver td_thr_tlsbase,td_thr_tlsbase@GLIBC_DONT_USE_THIS_SYMBOL"); diff --git a/tools/apbuild/apsymbols.h.x86_64 b/tools/apbuild/apsymbols.h.x86_64 new file mode 100644 index 00000000..aaf99264 --- /dev/null +++ b/tools/apbuild/apsymbols.h.x86_64 @@ -0,0 +1,281 @@ +/* apbuild embedded metadata */ +#define APBUILD_NOTE_METADATA(s) __asm__(".section .metadata, \"MS\", @note, 1\n\t.string \"" s "\"\n\t.previous\n\t") + +#ifdef APBUILD_VERSION +APBUILD_NOTE_METADATA("apbuild.version=" APBUILD_VERSION); +#endif + +/* apbuild generated symbol exclusion list */ +__asm__(".symver clnt_pcreateerror,clnt_pcreateerror@GLIBC_2.2.5"); +__asm__(".symver clnt_spcreateerror,clnt_spcreateerror@GLIBC_2.2.5"); +__asm__(".symver feupdateenv,feupdateenv@GLIBC_2.2.5"); +__asm__(".symver lio_listio,lio_listio@GLIBC_2.2.5"); +__asm__(".symver lio_listio64,lio_listio64@GLIBC_2.2.5"); +__asm__(".symver mkostemps,mkostemps@GLIBC_2.11"); +__asm__(".symver mkostemps64,mkostemps64@GLIBC_2.11"); +__asm__(".symver nftw,nftw@GLIBC_2.2.5"); +__asm__(".symver nftw64,nftw64@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_broadcast,pthread_cond_broadcast@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_destroy,pthread_cond_destroy@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_init,pthread_cond_init@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_signal,pthread_cond_signal@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_timedwait,pthread_cond_timedwait@GLIBC_2.2.5"); +__asm__(".symver pthread_cond_wait,pthread_cond_wait@GLIBC_2.2.5"); +__asm__(".symver regexec,regexec@GLIBC_2.2.5"); +__asm__(".symver rpc_createerr,rpc_createerr@GLIBC_2.2.5"); +__asm__(".symver __rpc_thread_createerr,__rpc_thread_createerr@GLIBC_2.2.5"); +__asm__(".symver __strtoll_l,__strtoll_l@GLIBC_2.2.5"); +__asm__(".symver __strtoull_l,__strtoull_l@GLIBC_2.2.5"); +/*__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.3"); +__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.3");*/ +__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.2.5"); +__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.2.5"); +/*__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.3"); +__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.3");*/ +__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.2.5"); +__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.2.5"); +__asm__(".symver sys_sigabbrev,sys_sigabbrev@GLIBC_2.2.5"); +__asm__(".symver _sys_siglist,_sys_siglist@GLIBC_2.2.5"); +__asm__(".symver sys_siglist,sys_siglist@GLIBC_2.2.5"); +__asm__(".symver timer_create,timer_create@GLIBC_2.2.5"); +__asm__(".symver timer_delete,timer_delete@GLIBC_2.2.5"); +__asm__(".symver timer_getoverrun,timer_getoverrun@GLIBC_2.2.5"); +__asm__(".symver timer_gettime,timer_gettime@GLIBC_2.2.5"); +__asm__(".symver timer_settime,timer_settime@GLIBC_2.2.5"); +__asm__(".symver __gethostname_chk,__gethostname_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_create,epoll_create@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getdomainname_chk,__getdomainname_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vswprintf_chk,__vswprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __stpcpy_chk,__stpcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver timerfd_gettime,timerfd_gettime@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inotify_init1,inotify_init1@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcstombs_chk,__wcstombs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __printf_chk,__printf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgetws_chk,__fgetws_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __register_atfork,__register_atfork@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver gnu_dev_major,gnu_dev_major@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vfwprintf_chk,__vfwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcpcpy_chk,__wcpcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver open_wmemstream,open_wmemstream@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_append,inet6_opt_append@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver timerfd_create,timerfd_create@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __swprintf_chk,__swprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver getipv4sourcefilter,getipv4sourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vwprintf_chk,__vwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver readlinkat,readlinkat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wctomb_chk,__wctomb_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __readlink_chk,__readlink_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver setipv4sourcefilter,setipv4sourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_sscanf,__isoc99_sscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getlogin_r_chk,__getlogin_r_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sync_file_range,sync_file_range@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __open64_2,__open64_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_init,inet6_rth_init@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_next,inet6_opt_next@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fxstatat64,__fxstatat64@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver unlinkat,unlinkat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fwprintf_chk,__fwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mempcpy_chk,__mempcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_wait,epoll_wait@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mkfifoat,mkfifoat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_scanf,__isoc99_scanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __read_chk,__read_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgetws_unlocked_chk,__fgetws_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vsprintf_chk,__vsprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsncpy_chk,__wcsncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __stack_chk_fail,__stack_chk_fail@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inotify_rm_watch,inotify_rm_watch@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver xdr_quad_t,xdr_quad_t@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sched_cpualloc,__sched_cpualloc@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __obstack_vprintf_chk,__obstack_vprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_swscanf,__isoc99_swscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vfwscanf,__isoc99_vfwscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sched_cpufree,__sched_cpufree@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_finish,inet6_opt_finish@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __confstr_chk,__confstr_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsncat_chk,__wcsncat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver setsourcefilter,setsourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver xdr_u_quad_t,xdr_u_quad_t@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fread_unlocked_chk,__fread_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eaccess,eaccess@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_alloc,inet6_option_alloc@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __openat64_2,__openat64_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sched_setaffinity,sched_setaffinity@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_append,inet6_option_append@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver futimens,futimens@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver renameat,renameat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmemset_chk,__wmemset_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_get_val,inet6_opt_get_val@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver unshare,unshare@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vsscanf,__isoc99_vsscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver signalfd,signalfd@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_next,inet6_option_next@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_add,inet6_rth_add@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver semtimedop,semtimedop@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver utimensat,utimensat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_segments,inet6_rth_segments@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pread_chk,__pread_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __syslog_chk,__syslog_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eventfd,eventfd@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgets_unlocked_chk,__fgets_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getcwd_chk,__getcwd_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver fchmodat,fchmodat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dup3,dup3@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vprintf_chk,__vprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fprintf_chk,__fprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmemcpy_chk,__wmemcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_wscanf,__isoc99_wscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcscpy_chk,__wcscpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_fscanf,__isoc99_fscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mbstowcs_chk,__mbstowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __dprintf_chk,__dprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmempcpy_chk,__wmempcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver symlinkat,symlinkat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __memmove_chk,__memmove_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getwd_chk,__getwd_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vsnprintf_chk,__vsnprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mkostemp64,mkostemp64@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eventfd_read,eventfd_read@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver remap_file_pages,remap_file_pages@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vswscanf,__isoc99_vswscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver fdopendir,fdopendir@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __openat_2,__openat_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fgets_chk,__fgets_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strncpy_chk,__strncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sched_cpucount,__sched_cpucount@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mbsrtowcs_chk,__mbsrtowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcscat_chk,__wcscat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_space,inet6_option_space@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sched_getaffinity,sched_getaffinity@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __open_2,__open_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver fchownat,fchownat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver timerfd_settime,timerfd_settime@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver sched_getcpu,sched_getcpu@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __getgroups_chk,__getgroups_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_init,inet6_opt_init@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __snprintf_chk,__snprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mkdirat,mkdirat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __memset_chk,__memset_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strncat_chk,__strncat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_space,inet6_rth_space@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __recv_chk,__recv_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_reverse,inet6_rth_reverse@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __realpath_chk,__realpath_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver qsort_r,qsort_r@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __obstack_printf_chk,__obstack_printf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_rth_getaddr,inet6_rth_getaddr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver splice,splice@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver eventfd_write,eventfd_write@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver vmsplice,vmsplice@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver getsourcefilter,getsourcefilter@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vwscanf,__isoc99_vwscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_ctl,epoll_ctl@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver gnu_dev_minor,gnu_dev_minor@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __memcpy_chk,__memcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vfscanf,__isoc99_vfscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __stpncpy_chk,__stpncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_find,inet6_opt_find@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mbsnrtowcs_chk,__mbsnrtowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver strerror_l,strerror_l@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __fread_chk,__fread_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsnrtombs_chk,__wcsnrtombs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wprintf_chk,__wprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_create1,epoll_create1@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vfprintf_chk,__vfprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vsyslog_chk,__vsyslog_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inotify_add_watch,inotify_add_watch@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcrtomb_chk,__wcrtomb_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver epoll_pwait,epoll_pwait@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strcpy_chk,__strcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vdprintf_chk,__vdprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __vasprintf_chk,__vasprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __xpg_strerror_r,__xpg_strerror_r@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcpncpy_chk,__wcpncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_init,inet6_option_init@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wmemmove_chk,__wmemmove_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __sprintf_chk,__sprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver futimesat,futimesat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pread64_chk,__pread64_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver strptime_l,strptime_l@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver lchmod,lchmod@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __chk_fail,__chk_fail@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_vscanf,__isoc99_vscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __wcsrtombs_chk,__wcsrtombs_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pipe2,pipe2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __strcat_chk,__strcat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver faccessat,faccessat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __asprintf_chk,__asprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ppoll,ppoll@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __recvfrom_chk,__recvfrom_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_opt_set_val,inet6_opt_set_val@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __ptsname_r_chk,__ptsname_r_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __isoc99_fwscanf,__isoc99_fwscanf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __gets_chk,__gets_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver gnu_dev_makedev,gnu_dev_makedev@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __xmknodat,__xmknodat@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver inet6_option_find,inet6_option_find@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __ttyname_r_chk,__ttyname_r_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __readlinkat_chk,__readlinkat_chk@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dlinfo,dlinfo@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dladdr1,dladdr1@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver dlmopen,dlmopen@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_getprotocol,pthread_mutexattr_getprotocol@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutex_setprioceiling,pthread_mutex_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_setprioceiling,pthread_mutexattr_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_unregister_cancel_restore,__pthread_unregister_cancel_restore@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_attr_setaffinity_np,pthread_attr_setaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_cleanup_routine,__pthread_cleanup_routine@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_condattr_getclock,pthread_condattr_getclock@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_register_cancel_defer,__pthread_register_cancel_defer@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __pthread_unwind_next,__pthread_unwind_next@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_timedjoin_np,pthread_timedjoin_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_setaffinity_np,pthread_setaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutex_getprioceiling,pthread_mutex_getprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_getprioceiling,pthread_mutexattr_getprioceiling@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_attr_getaffinity_np,pthread_attr_getaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_barrierattr_getpshared,pthread_barrierattr_getpshared@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_condattr_setclock,pthread_condattr_setclock@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_tryjoin_np,pthread_tryjoin_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_setschedprio,pthread_setschedprio@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_getaffinity_np,pthread_getaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_setrobust_np,pthread_mutexattr_setrobust_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_getrobust_np,pthread_mutexattr_getrobust_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutexattr_setprotocol,pthread_mutexattr_setprotocol@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver pthread_mutex_consistent_np,pthread_mutex_consistent_np@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_put16,ns_put16@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_initparse,ns_initparse@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __p_rcode,__p_rcode@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_msg_getflag,ns_msg_getflag@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_pack,ns_name_pack@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_skiprr,ns_skiprr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_get32,ns_get32@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_makecanon,ns_makecanon@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_parse_ttl,ns_parse_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_datetosecs,ns_datetosecs@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_put32,ns_put32@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_format_ttl,ns_format_ttl@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_rollback,ns_name_rollback@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_subdomain,ns_subdomain@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_samedomain,ns_samedomain@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_pton,ns_name_pton@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_parserr,ns_parserr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_uncompress,ns_name_uncompress@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_unpack,ns_name_unpack@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_skip,ns_name_skip@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_sprintrrf,ns_sprintrrf@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_compress,ns_name_compress@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_ntol,ns_name_ntol@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_name_ntop,ns_name_ntop@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_samename,ns_samename@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver ns_get16,ns_get16@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_timedreceive,mq_timedreceive@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_timedsend,mq_timedsend@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_setattr,mq_setattr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_send,mq_send@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_unlink,mq_unlink@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver __mq_open_2,__mq_open_2@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_notify,mq_notify@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_receive,mq_receive@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_close,mq_close@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver mq_getattr,mq_getattr@GLIBC_DONT_USE_THIS_SYMBOL"); +__asm__(".symver td_thr_tlsbase,td_thr_tlsbase@GLIBC_DONT_USE_THIS_SYMBOL"); diff --git a/tools/apbuild/ctype.h b/tools/apbuild/ctype.h index 2db84cc1..ee93b991 100644 --- a/tools/apbuild/ctype.h +++ b/tools/apbuild/ctype.h @@ -76,9 +76,15 @@ extern __const unsigned short int *__ctype_b; /* Characteristics. */ extern __const __int32_t *__ctype_tolower; /* Case conversions. */ extern __const __int32_t *__ctype_toupper; /* Case conversions. */ +#if __x86_64__ +__asm__(".symver __ctype_b,__ctype_b@GLIBC_2.2.5"); +__asm__(".symver __ctype_tolower,__ctype_tolower@GLIBC_2.2.5"); +__asm__(".symver __ctype_toupper,__ctype_toupper@GLIBC_2.2.5"); +#else __asm__(".symver __ctype_b,__ctype_b@GLIBC_2.0"); -__asm__(".symver __ctype_tolower,__ctype_tolower@GLIBC_2.0"); -__asm__(".symver __ctype_toupper,__ctype_toupper@GLIBC_2.0"); +__asm__(".symver __ctype_tolower,__ctype_tolower@GLIBC_2.2.5"); +__asm__(".symver __ctype_toupper,__ctype_toupper@GLIBC_2.2.5"); +#endif #define __isctype(c, type) \ (__ctype_b[(int) (c)] & (unsigned short int) type) -- cgit v1.2.3 From 2c8f0d67a5b2fc56c87801eea2f3aa375c77ad4f Mon Sep 17 00:00:00 2001 From: waker Date: Wed, 2 May 2012 22:02:48 +0200 Subject: static build/install scripts fixes --- scripts/static_build.sh | 2 +- scripts/static_install.sh | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'scripts') diff --git a/scripts/static_build.sh b/scripts/static_build.sh index 7eb00e10..7ebc85ca 100755 --- a/scripts/static_build.sh +++ b/scripts/static_build.sh @@ -3,7 +3,7 @@ VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` ORIGIN=`pwd | perl -ne 'chomp and print'` AP=$ORIGIN/tools/apbuild export CC=$AP/apgcc -export CXX=$AP/apgcc +export CXX=$AP/apgcc export APBUILD_STATIC_LIBGCC=1 diff --git a/scripts/static_install.sh b/scripts/static_install.sh index 9de33357..d2295961 100755 --- a/scripts/static_install.sh +++ b/scripts/static_install.sh @@ -1,3 +1,4 @@ #!/bin/sh VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` -DESTDIR=`pwd`/static/deadbeef-$VERSION make install +ARCH=`uname -m | perl -ne 'chomp and print'` +DESTDIR=`pwd`/static/$ARCH/deadbeef-$VERSION make install -- cgit v1.2.3 From 4ceaaeb68a0667841597f42dd59c5b2fe66d33cc Mon Sep 17 00:00:00 2001 From: waker Date: Thu, 3 May 2012 23:05:53 +0200 Subject: numerous packaging fixes for 0.5.3 --- PORTABLE_VERSION | 2 +- scripts/portable_postbuild.sh | 1 + tools/apbuild/apgcc | 2 +- tools/packages/arch.sh | 9 ++++++--- tools/packages/arch_install | 2 +- tools/packages/arch_pkginfo | 2 +- 6 files changed, 11 insertions(+), 7 deletions(-) (limited to 'scripts') diff --git a/PORTABLE_VERSION b/PORTABLE_VERSION index 6db426b0..21e24718 100644 --- a/PORTABLE_VERSION +++ b/PORTABLE_VERSION @@ -1 +1 @@ -0.5.3-rc2 +0.5.3-rc3 diff --git a/scripts/portable_postbuild.sh b/scripts/portable_postbuild.sh index 9a82c216..46d6ec5b 100755 --- a/scripts/portable_postbuild.sh +++ b/scripts/portable_postbuild.sh @@ -6,6 +6,7 @@ OUTDIR=portable/$ARCH/deadbeef-$VERSION PLUGDIR=$OUTDIR/plugins DOCDIR=$OUTDIR/doc PIXMAPDIR=$OUTDIR/pixmaps +echo OUTDIR=$OUTDIR rm -rf $OUTDIR diff --git a/tools/apbuild/apgcc b/tools/apbuild/apgcc index 8b81686c..be4863a3 100755 --- a/tools/apbuild/apgcc +++ b/tools/apbuild/apgcc @@ -74,7 +74,7 @@ if (!defined $appath) { $appath =~ s/\/*$//g; $appath =~ s/^(.*)\/.*?$/$1/; $appath .= '/include/apbuild'; - if (! -f "$appath/apsymbols.h" && -f "$FindBin::Bin/apsymbols.h") { + if (! -f "$appath/apsymbols.h.i686" && -f "$FindBin::Bin/apsymbols.h.i686") { $appath = $FindBin::Bin; } } diff --git a/tools/packages/arch.sh b/tools/packages/arch.sh index 8e22176e..ce171a67 100755 --- a/tools/packages/arch.sh +++ b/tools/packages/arch.sh @@ -2,6 +2,7 @@ PWD=`pwd` VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` +ARCH_VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print' | sed 's/-//'` BUILD=`cat PORTABLE_BUILD | perl -ne 'chomp and print'` ARCH=`uname -m | perl -ne 'chomp and print'` INDIR=$PWD/static/$ARCH/deadbeef-$VERSION @@ -19,7 +20,9 @@ cp -r $INDIR/* $TEMPDIR/ # rm unneeded files rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.la for i in $TEMPDIR/opt/deadbeef/lib/deadbeef/*.so.0.0.0; do - mv $i $TEMPDIR/opt/deadbeef/lib/deadbeef/`basename $i .0.0.0` + n=$TEMPDIR/opt/deadbeef/lib/deadbeef/`basename $i .0.0.0` + mv $i $n + strip --strip-unneeded $n done rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.so.* rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.a @@ -32,7 +35,7 @@ mv $TEMPDIR/opt/deadbeef/share/icons $TEMPDIR/usr/share/ # generate .PKGINFO echo "# `date -u`" >$PKGINFO -echo "pkgver = $VERSION-$BUILD" >>$PKGINFO +echo "pkgver = $ARCH_VERSION-$BUILD" >>$PKGINFO echo "builddate = `date --utc +%s`" >>$PKGINFO echo "size = `du -sb $TEMPDIR | awk '{print $1}'`" >>$PKGINFO echo "arch = $ARCH" >>$PKGINFO @@ -43,4 +46,4 @@ cp tools/packages/arch_install $INSTALL # archive cd $TEMPDIR -fakeroot -- tar Jcvf $OUTDIR/deadbeef-$VERSION-$BUILD-$ARCH.pkg.tar.xz * .PKGINFO .INSTALL +fakeroot -- tar Jcvf $OUTDIR/deadbeef-static-$ARCH_VERSION-$BUILD-$ARCH.pkg.tar.xz * .PKGINFO .INSTALL diff --git a/tools/packages/arch_install b/tools/packages/arch_install index eaf1b9a6..2c5696c8 100644 --- a/tools/packages/arch_install +++ b/tools/packages/arch_install @@ -1,4 +1,4 @@ -pkgname=deadbeef +pkgname=deadbeef-static post_install() { gtk-update-icon-cache -q -t -f usr/share/icons/hicolor diff --git a/tools/packages/arch_pkginfo b/tools/packages/arch_pkginfo index e58eee9e..17d1c0f9 100644 --- a/tools/packages/arch_pkginfo +++ b/tools/packages/arch_pkginfo @@ -1,4 +1,4 @@ -pkgname = deadbeef +pkgname = deadbeef-static pkgdesc = An audio player for GNU/Linux based on GTK2. url = http://deadbeef.sourceforge.net packager = Alexey Yakovenko -- cgit v1.2.3 From bd05ff65490e29de6c75451f9dd6437dd770efe0 Mon Sep 17 00:00:00 2001 From: waker Date: Mon, 7 May 2012 23:06:43 +0200 Subject: fixed portable and static build scripts --- scripts/portable_postbuild.sh | 2 +- scripts/static_build.sh | 23 ++++------------------- 2 files changed, 5 insertions(+), 20 deletions(-) (limited to 'scripts') diff --git a/scripts/portable_postbuild.sh b/scripts/portable_postbuild.sh index 46d6ec5b..65bf55fd 100755 --- a/scripts/portable_postbuild.sh +++ b/scripts/portable_postbuild.sh @@ -55,7 +55,7 @@ fi #pixmaps -for i in pause_16.png play_16.png noartwork.jpg buffering_16.png; do +for i in pause_16.png play_16.png noartwork.png buffering_16.png; do cp ./pixmaps/$i $PIXMAPDIR/ done diff --git a/scripts/static_build.sh b/scripts/static_build.sh index 7ebc85ca..e7a0bacc 100755 --- a/scripts/static_build.sh +++ b/scripts/static_build.sh @@ -2,27 +2,12 @@ VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` ORIGIN=`pwd | perl -ne 'chomp and print'` AP=$ORIGIN/tools/apbuild -export CC=$AP/apgcc -export CXX=$AP/apgcc - -export APBUILD_STATIC_LIBGCC=1 +ARCH=`uname -m | perl -ne 'chomp and print'` ./autogen.sh -./configure --enable-staticlink --disable-artwork-imlib2 --prefix=/opt/deadbeef +export APBUILD_STATIC_LIBGCC=1 +CC=$AP/apgcc CXX=$AP/apgcc ./configure --enable-staticlink=yes --disable-artwork-imlib2 --prefix=/opt/deadbeef sed -i 's/-lstdc++ -lm -lgcc_s -lc -lgcc_s/-lm -lc/g' libtool -make clean -make -j9 - -#./scripts/portable_extraplugs.sh - -cd $ORIGIN - -echo "building pluginfo tool..." -cd tools/pluginfo -make -cd ../../ - -#./scripts/portable_postbuild.sh -fakeroot -- ./scripts/static_install.sh +make DESTDIR=`pwd`/static/$ARCH/deadbeef-$VERSION -j8 install -- cgit v1.2.3 From 66e1c991c111b4438841b263d160f2e83c66b910 Mon Sep 17 00:00:00 2001 From: waker Date: Tue, 8 May 2012 22:04:07 +0200 Subject: build scripts update --- scripts/portable_build.sh | 4 +--- scripts/portable_package_static.sh | 9 +++++++-- scripts/portable_postbuild.sh | 1 + scripts/static_build.sh | 11 ++++++++++- 4 files changed, 19 insertions(+), 6 deletions(-) (limited to 'scripts') diff --git a/scripts/portable_build.sh b/scripts/portable_build.sh index 89f2d1ca..3a11ea99 100755 --- a/scripts/portable_build.sh +++ b/scripts/portable_build.sh @@ -9,7 +9,7 @@ export APBUILD_STATIC_LIBGCC=1 ./autogen.sh -./configure --enable-staticlink=yes --enable-portable=yes --disable-artwork-imlib2 +./configure --enable-staticlink --enable-portable --disable-artwork-imlib2 sed -i 's/-lstdc++ -lm -lgcc_s -lc -lgcc_s/-lm -lc/g' libtool make clean make -j9 @@ -23,5 +23,3 @@ cd tools/pluginfo make cd ../../ -./scripts/portable_postbuild.sh - diff --git a/scripts/portable_package_static.sh b/scripts/portable_package_static.sh index 26fa6051..1ad0c076 100755 --- a/scripts/portable_package_static.sh +++ b/scripts/portable_package_static.sh @@ -1,23 +1,28 @@ #!/bin/sh +./scripts/portable_postbuild.sh + # package for distribution VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'` BUILD=`cat PORTABLE_BUILD | perl -ne 'chomp and print'` +ARCH=`uname -m | perl -ne 'chomp and print'` # main distro SRCDIR=deadbeef-$VERSION PLUGDIR=$SRCDIR/plugins DOCDIR=$SRCDIR/doc PIXMAPDIR=$SRCDIR/pixmaps +OUTNAME=deadbeef-static_${VERSION}-${BUILD}_${ARCH}.tar.bz2 ARCH=`uname -m | perl -ne 'chomp and print'` -rm portable_out/build/deadbeef-$VERSION-static-$ARCH.tar.bz2 +rm portable_out/build/$OUTNAME cd portable/$ARCH -tar jcvf ../..//portable_out/build/deadbeef-$VERSION-static-$ARCH.tar.bz2\ +tar jcvf ../../portable_out/build/$OUTNAME\ $SRCDIR/deadbeef\ $SRCDIR/deadbeef.png\ + $SRCDIR/.ddb_portable\ $DOCDIR\ $PLUGDIR/aac.so\ $PLUGDIR/adplug.so\ diff --git a/scripts/portable_postbuild.sh b/scripts/portable_postbuild.sh index 65bf55fd..45db6740 100755 --- a/scripts/portable_postbuild.sh +++ b/scripts/portable_postbuild.sh @@ -79,6 +79,7 @@ for i in po/*.gmo ; do done cp translation/help.pt_BR.txt $OUTDIR/doc/ cp translation/help.ru.txt $OUTDIR/doc/ +touch $OUTDIR/.ddb_portable # strip if [ $OSTYPE != 'Darwin' ];then diff --git a/scripts/static_build.sh b/scripts/static_build.sh index e7a0bacc..250b29e8 100755 --- a/scripts/static_build.sh +++ b/scripts/static_build.sh @@ -4,10 +4,19 @@ ORIGIN=`pwd | perl -ne 'chomp and print'` AP=$ORIGIN/tools/apbuild ARCH=`uname -m | perl -ne 'chomp and print'` +cd tools/apbuild +./apinit +cd ../../ + ./autogen.sh export APBUILD_STATIC_LIBGCC=1 -CC=$AP/apgcc CXX=$AP/apgcc ./configure --enable-staticlink=yes --disable-artwork-imlib2 --prefix=/opt/deadbeef +CC=$AP/apgcc CXX=$AP/apgcc ./configure --enable-staticlink --disable-artwork-imlib2 --prefix=/opt/deadbeef sed -i 's/-lstdc++ -lm -lgcc_s -lc -lgcc_s/-lm -lc/g' libtool +make clean make DESTDIR=`pwd`/static/$ARCH/deadbeef-$VERSION -j8 install +echo "building pluginfo tool..." +cd tools/pluginfo +make +cd ../../ -- cgit v1.2.3 From 002d8c063496bbaa4d781c2812b1f28d28902c23 Mon Sep 17 00:00:00 2001 From: waker Date: Wed, 1 Aug 2012 22:27:36 +0200 Subject: added new ALAC plugin --- configure.ac | 11 +- plugins/alac/Makefile.am | 22 + plugins/alac/README | 43 ++ plugins/alac/alac.c | 1164 ++++++++++++++++++++++++++++++++++++++++++++ plugins/alac/alac_plugin.c | 617 +++++++++++++++++++++++ plugins/alac/decomp.h | 13 + plugins/alac/demux.c | 730 +++++++++++++++++++++++++++ plugins/alac/demux.h | 62 +++ plugins/alac/stdint_win.h | 14 + plugins/alac/stream.c | 179 +++++++ plugins/alac/stream.h | 39 ++ scripts/quickinstall.sh | 1 + 12 files changed, 2894 insertions(+), 1 deletion(-) create mode 100644 plugins/alac/Makefile.am create mode 100644 plugins/alac/README create mode 100644 plugins/alac/alac.c create mode 100644 plugins/alac/alac_plugin.c create mode 100644 plugins/alac/decomp.h create mode 100644 plugins/alac/demux.c create mode 100644 plugins/alac/demux.h create mode 100644 plugins/alac/stdint_win.h create mode 100644 plugins/alac/stream.c create mode 100644 plugins/alac/stream.h (limited to 'scripts') diff --git a/configure.ac b/configure.ac index f75e6903..a892413a 100644 --- a/configure.ac +++ b/configure.ac @@ -110,6 +110,7 @@ AC_ARG_ENABLE(shn, [AS_HELP_STRING([--enable-shn ], [build SHN plugin AC_ARG_ENABLE(psf, [AS_HELP_STRING([--enable-psf ], [build AOSDK-based PSF(,QSF,SSF,DSF) plugin (default: auto)])], [enable_psf=$enableval], [enable_psf=yes]) AC_ARG_ENABLE(mono2stereo, [AS_HELP_STRING([--enable-mono2stereo ], [build mono2stereo DSP plugin (default: auto)])], [enable_mono2stereo=$enableval], [enable_mono2stereo=yes]) AC_ARG_ENABLE(shellexecui, [AS_HELP_STRING([--enable-shellexecui ], [build shellexec GTK UI plugin (default: auto)])], [enable_shellexecui=$enableval], [enable_shellexecui=yes]) +AC_ARG_ENABLE(alac, [AS_HELP_STRING([--enable-alac ], [build ALAC plugin (default: auto)])], [enable_alac=$enableval], [enable_alac=yes]) if test "x$enable_staticlink" != "xno" ; then AC_DEFINE_UNQUOTED([STATICLINK], [1], [Define if building static version]) @@ -588,7 +589,12 @@ if test "x$enable_mono2stereo" != "xno" ; then HAVE_MONO2STEREO=yes fi -PLUGINS_DIRS="plugins/lastfm plugins/mpgmad plugins/vorbis plugins/flac plugins/wavpack plugins/sndfile plugins/vfs_curl plugins/cdda plugins/gtkui plugins/alsa plugins/ffmpeg plugins/hotkeys plugins/oss plugins/artwork plugins/adplug plugins/ffap plugins/sid plugins/nullout plugins/supereq plugins/vtx plugins/gme plugins/pulse plugins/notify plugins/musepack plugins/wildmidi plugins/tta plugins/dca plugins/aac plugins/mms plugins/shellexec plugins/dsp_libsrc plugins/m3u plugins/vfs_zip plugins/converter plugins/dumb plugins/shn plugins/ao plugins/mono2stereo plugins/shellexecui" +if test "x$enable_alac" != "xno" ; then + HAVE_ALAC=yes +fi + + +PLUGINS_DIRS="plugins/lastfm plugins/mpgmad plugins/vorbis plugins/flac plugins/wavpack plugins/sndfile plugins/vfs_curl plugins/cdda plugins/gtkui plugins/alsa plugins/ffmpeg plugins/hotkeys plugins/oss plugins/artwork plugins/adplug plugins/ffap plugins/sid plugins/nullout plugins/supereq plugins/vtx plugins/gme plugins/pulse plugins/notify plugins/musepack plugins/wildmidi plugins/tta plugins/dca plugins/aac plugins/mms plugins/shellexec plugins/dsp_libsrc plugins/m3u plugins/vfs_zip plugins/converter plugins/dumb plugins/shn plugins/ao plugins/mono2stereo plugins/shellexecui plugins/alac" AM_CONDITIONAL(HAVE_VORBIS, test "x$HAVE_VORBISPLUGIN" = "xyes") AM_CONDITIONAL(HAVE_FLAC, test "x$HAVE_FLACPLUGIN" = "xyes") @@ -640,6 +646,7 @@ AM_CONDITIONAL(HAVE_MONO2STEREO, test "x$HAVE_MONO2STEREO" = "xyes") AM_CONDITIONAL(HAVE_SHELLEXECUI, test "x$HAVE_SHELLEXECUI" = "xyes") AM_CONDITIONAL(HAVE_SM, test "x$HAVE_SM" = "xyes") AM_CONDITIONAL(HAVE_ICE, test "x$HAVE_ICE" = "xyes") +AM_CONDITIONAL(HAVE_ALAC, test "x$HAVE_ALAC" = "xyes") AC_SUBST(PLUGINS_DIRS) @@ -705,6 +712,7 @@ PRINT_PLUGIN_INFO([dumb],[DUMB module plugin, for MOD, S3M, etc],[test "x$HAVE_D PRINT_PLUGIN_INFO([shn],[SHN plugin based on xmms-shn],[test "x$HAVE_SHN" = "xyes"]) PRINT_PLUGIN_INFO([mono2stereo],[mono2stereo DSP plugin],[test "x$HAVE_MONO2STEREO" = "xyes"]) PRINT_PLUGIN_INFO([shellexecui],[GTK user interface for configuring shellexec plugin],[test "x$HAVE_SHELLEXECUI" = "xyes"]) +PRINT_PLUGIN_INFO([alac],[ALAC plugin],[test "x$HAVE_ALAC" = "xyes"]) echo @@ -751,6 +759,7 @@ plugins/ao/Makefile plugins/shn/Makefile plugins/mono2stereo/Makefile plugins/shellexecui/Makefile +plugins/alac/Makefile intl/Makefile po/Makefile.in deadbeef.desktop diff --git a/plugins/alac/Makefile.am b/plugins/alac/Makefile.am new file mode 100644 index 00000000..0dc48ade --- /dev/null +++ b/plugins/alac/Makefile.am @@ -0,0 +1,22 @@ +if HAVE_ALAC +alacdir = $(libdir)/$(PACKAGE) +pkglib_LTLIBRARIES = alac.la +alac_la_SOURCES = alac_plugin.c\ +alac.c decomp.h demux.c demux.h stream.c stream.h\ +../libmp4ff/mp4atom.c\ +../libmp4ff/mp4ff.c\ +../libmp4ff/mp4meta.c\ +../libmp4ff/mp4sample.c\ +../libmp4ff/mp4tagupdate.c\ +../libmp4ff/mp4util.c\ +../libmp4ff/mp4ff.h\ +../libmp4ff/mp4ffint.h\ +../libmp4ff/mp4ff_int_types.h + +alac_la_LDFLAGS = -module + +alac_la_LIBADD = $(LDADD) $(FAAD2_LIBS) +AM_CFLAGS = $(CFLAGS) -std=c99 -DUSE_MP4FF -DUSE_TAGGING -I../libmp4ff +endif + + diff --git a/plugins/alac/README b/plugins/alac/README new file mode 100644 index 00000000..1b304d2d --- /dev/null +++ b/plugins/alac/README @@ -0,0 +1,43 @@ +INSTALLATION: +------------- + +Simply compile by running 'make' + +USAGE: +------ + +Then run the program, it will give you usage instructions. + +It's really quite trivial to use. + +For example, to decode input.m4a to output.wav: +./alac -f output.wav input.m4a + +Or, as another example, say if you wanted to stream play +http://www.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/luckynight.m4a +and you're system uses the ALSA sound system: +wget -O - http://www.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/luckynight.m4a | ./alac - | aplay + +By default the output file is in WAV format. To output as raw PCM, provide the +-r option on the command line. + +MORE INFORMATION: +----------------- + +Please visit http://crazney.net/programs/itunes/alac.html for more information. + +HELP NEEDED: +------------ +I need help to allow myself to continue hacking on various Apple Audio things, please visit +http://crazney.net/programs/itunes/help.html + +AUTHOR: +------- + +David Hammerton + +CONTRIBUTORS: +------------- + +Cody Brocious + diff --git a/plugins/alac/alac.c b/plugins/alac/alac.c new file mode 100644 index 00000000..469000da --- /dev/null +++ b/plugins/alac/alac.c @@ -0,0 +1,1164 @@ +/* + * ALAC (Apple Lossless Audio Codec) decoder + * Copyright (c) 2005 David Hammerton + * All rights reserved. + * + * This is the actual decoder. + * + * http://crazney.net/programs/itunes/alac.html + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +#include +#include +#include +#ifdef _WIN32 + #include "stdint_win.h" +#else + #include +#endif + +#include "decomp.h" + +#define _Swap32(v) do { \ + v = (((v) & 0x000000FF) << 0x18) | \ + (((v) & 0x0000FF00) << 0x08) | \ + (((v) & 0x00FF0000) >> 0x08) | \ + (((v) & 0xFF000000) >> 0x18); } while(0) + +#define _Swap16(v) do { \ + v = (((v) & 0x00FF) << 0x08) | \ + (((v) & 0xFF00) >> 0x08); } while (0) + +struct {signed int x:24;} se_struct_24; +#define SignExtend24(val) (se_struct_24.x = val) + +extern int host_bigendian; + +struct alac_file +{ + unsigned char *input_buffer; + int input_buffer_bitaccumulator; /* used so we can do arbitary + bit reads */ + + int samplesize; + int numchannels; + int bytespersample; + + + /* buffers */ + int32_t *predicterror_buffer_a; + int32_t *predicterror_buffer_b; + + int32_t *outputsamples_buffer_a; + int32_t *outputsamples_buffer_b; + + int32_t *uncompressed_bytes_buffer_a; + int32_t *uncompressed_bytes_buffer_b; + + + + /* stuff from setinfo */ + uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */ + uint8_t setinfo_7a; /* 0x00 */ + uint8_t setinfo_sample_size; /* 0x10 */ + uint8_t setinfo_rice_historymult; /* 0x28 */ + uint8_t setinfo_rice_initialhistory; /* 0x0a */ + uint8_t setinfo_rice_kmodifier; /* 0x0e */ + uint8_t setinfo_7f; /* 0x02 */ + uint16_t setinfo_80; /* 0x00ff */ + uint32_t setinfo_82; /* 0x000020e7 */ /* max sample size?? */ + uint32_t setinfo_86; /* 0x00069fe4 */ /* bit rate (avarge)?? */ + uint32_t setinfo_8a_rate; /* 0x0000ac44 */ + /* end setinfo stuff */ + +}; + + +static void allocate_buffers(alac_file *alac) +{ + alac->predicterror_buffer_a = malloc(alac->setinfo_max_samples_per_frame * 4); + alac->predicterror_buffer_b = malloc(alac->setinfo_max_samples_per_frame * 4); + + alac->outputsamples_buffer_a = malloc(alac->setinfo_max_samples_per_frame * 4); + alac->outputsamples_buffer_b = malloc(alac->setinfo_max_samples_per_frame * 4); + + alac->uncompressed_bytes_buffer_a = malloc(alac->setinfo_max_samples_per_frame * 4); + alac->uncompressed_bytes_buffer_b = malloc(alac->setinfo_max_samples_per_frame * 4); +} + +void alac_set_info(alac_file *alac, char *inputbuffer) +{ + char *ptr = inputbuffer; + ptr += 4; /* size */ + ptr += 4; /* frma */ + ptr += 4; /* alac */ + ptr += 4; /* size */ + ptr += 4; /* alac */ + + ptr += 4; /* 0 ? */ + + alac->setinfo_max_samples_per_frame = *(uint32_t*)ptr; /* buffer size / 2 ? */ + if (!host_bigendian) + _Swap32(alac->setinfo_max_samples_per_frame); + ptr += 4; + alac->setinfo_7a = *(uint8_t*)ptr; + ptr += 1; + alac->setinfo_sample_size = *(uint8_t*)ptr; + ptr += 1; + alac->setinfo_rice_historymult = *(uint8_t*)ptr; + ptr += 1; + alac->setinfo_rice_initialhistory = *(uint8_t*)ptr; + ptr += 1; + alac->setinfo_rice_kmodifier = *(uint8_t*)ptr; + ptr += 1; + alac->setinfo_7f = *(uint8_t*)ptr; + ptr += 1; + alac->setinfo_80 = *(uint16_t*)ptr; + if (!host_bigendian) + _Swap16(alac->setinfo_80); + ptr += 2; + alac->setinfo_82 = *(uint32_t*)ptr; + if (!host_bigendian) + _Swap32(alac->setinfo_82); + ptr += 4; + alac->setinfo_86 = *(uint32_t*)ptr; + if (!host_bigendian) + _Swap32(alac->setinfo_86); + ptr += 4; + alac->setinfo_8a_rate = *(uint32_t*)ptr; + if (!host_bigendian) + _Swap32(alac->setinfo_8a_rate); + ptr += 4; + + allocate_buffers(alac); + +} + +/* stream reading */ + +/* supports reading 1 to 16 bits, in big endian format */ +static uint32_t readbits_16(alac_file *alac, int bits) +{ + uint32_t result; + int new_accumulator; + + result = (alac->input_buffer[0] << 16) | + (alac->input_buffer[1] << 8) | + (alac->input_buffer[2]); + + /* shift left by the number of bits we've already read, + * so that the top 'n' bits of the 24 bits we read will + * be the return bits */ + result = result << alac->input_buffer_bitaccumulator; + + result = result & 0x00ffffff; + + /* and then only want the top 'n' bits from that, where + * n is 'bits' */ + result = result >> (24 - bits); + + new_accumulator = (alac->input_buffer_bitaccumulator + bits); + + /* increase the buffer pointer if we've read over n bytes. */ + alac->input_buffer += (new_accumulator >> 3); + + /* and the remainder goes back into the bit accumulator */ + alac->input_buffer_bitaccumulator = (new_accumulator & 7); + + return result; +} + +/* supports reading 1 to 32 bits, in big endian format */ +static uint32_t readbits(alac_file *alac, int bits) +{ + int32_t result = 0; + + if (bits > 16) + { + bits -= 16; + result = readbits_16(alac, 16) << bits; + } + + result |= readbits_16(alac, bits); + + return result; +} + +/* reads a single bit */ +static int readbit(alac_file *alac) +{ + int result; + int new_accumulator; + + result = alac->input_buffer[0]; + + result = result << alac->input_buffer_bitaccumulator; + + result = result >> 7 & 1; + + new_accumulator = (alac->input_buffer_bitaccumulator + 1); + + alac->input_buffer += (new_accumulator / 8); + + alac->input_buffer_bitaccumulator = (new_accumulator % 8); + + return result; +} + +static void unreadbits(alac_file *alac, int bits) +{ + int new_accumulator = (alac->input_buffer_bitaccumulator - bits); + + alac->input_buffer += (new_accumulator >> 3); + + alac->input_buffer_bitaccumulator = (new_accumulator & 7); + if (alac->input_buffer_bitaccumulator < 0) + alac->input_buffer_bitaccumulator *= -1; +} + +/* various implementations of count_leading_zero: + * the first one is the original one, the simplest and most + * obvious for what it's doing. never use this. + * then there are the asm ones. fill in as necessary + * and finally an unrolled and optimised c version + * to fall back to + */ +#if 0 +/* hideously inefficient. could use a bitmask search, + * alternatively bsr on x86, + */ +static int count_leading_zeros(int32_t input) +{ + int i = 0; + while (!(0x80000000 & input) && i < 32) + { + i++; + input = input << 1; + } + return i; +} +#elif defined(__GNUC__) && (defined(_X86) || defined(__i386) || defined(i386)) +/* for some reason the unrolled version (below) is + * actually faster than this. yay intel! + */ +static int count_leading_zeros(int input) +{ + int output = 0; + if (!input) return 32; + __asm("bsr %1, %0\n" + : "=r" (output) + : "r" (input)); + return (0x1f - output); +} +#elif defined(_MSC_VER) && defined(_M_IX86) +static int count_leading_zeros(int input) +{ + int output = 0; + if (!input) return 32; + __asm + { + mov eax, input; + mov edx, 0x1f; + bsr ecx, eax; + sub edx, ecx; + mov output, edx; + } + return output; +} +#else +#warning using generic count leading zeroes. You may wish to write one for your CPU / compiler +static int count_leading_zeros(int input) +{ + int output = 0; + int curbyte = 0; + + curbyte = input >> 24; + if (curbyte) goto found; + output += 8; + + curbyte = input >> 16; + if (curbyte & 0xff) goto found; + output += 8; + + curbyte = input >> 8; + if (curbyte & 0xff) goto found; + output += 8; + + curbyte = input; + if (curbyte & 0xff) goto found; + output += 8; + + return output; + +found: + if (!(curbyte & 0xf0)) + { + output += 4; + } + else + curbyte >>= 4; + + if (curbyte & 0x8) + return output; + if (curbyte & 0x4) + return output + 1; + if (curbyte & 0x2) + return output + 2; + if (curbyte & 0x1) + return output + 3; + + /* shouldn't get here: */ + return output + 4; +} +#endif + +#define RICE_THRESHOLD 8 // maximum number of bits for a rice prefix. + +int32_t entropy_decode_value(alac_file* alac, + int readSampleSize, + int k, + int rice_kmodifier_mask) +{ + int32_t x = 0; // decoded value + + // read x, number of 1s before 0 represent the rice value. + while (x <= RICE_THRESHOLD && readbit(alac)) + { + x++; + } + + if (x > RICE_THRESHOLD) + { + // read the number from the bit stream (raw value) + int32_t value; + + value = readbits(alac, readSampleSize); + + // mask value + value &= (((uint32_t)0xffffffff) >> (32 - readSampleSize)); + + x = value; + } + else + { + if (k != 1) + { + int extraBits = readbits(alac, k); + + // x = x * (2^k - 1) + x *= (((1 << k) - 1) & rice_kmodifier_mask); + + if (extraBits > 1) + x += extraBits - 1; + else + unreadbits(alac, 1); + } + } + + return x; +} + +void entropy_rice_decode(alac_file* alac, + int32_t* outputBuffer, + int outputSize, + int readSampleSize, + int rice_initialhistory, + int rice_kmodifier, + int rice_historymult, + int rice_kmodifier_mask) +{ + int outputCount; + int history = rice_initialhistory; + int signModifier = 0; + + for (outputCount = 0; outputCount < outputSize; outputCount++) + { + int32_t decodedValue; + int32_t finalValue; + int32_t k; + + k = 31 - rice_kmodifier - count_leading_zeros((history >> 9) + 3); + + if (k < 0) k += rice_kmodifier; + else k = rice_kmodifier; + + // note: don't use rice_kmodifier_mask here (set mask to 0xFFFFFFFF) + decodedValue = entropy_decode_value(alac, readSampleSize, k, 0xFFFFFFFF); + + decodedValue += signModifier; + finalValue = (decodedValue + 1) / 2; // inc by 1 and shift out sign bit + if (decodedValue & 1) // the sign is stored in the low bit + finalValue *= -1; + + outputBuffer[outputCount] = finalValue; + + signModifier = 0; + + // update history + history += (decodedValue * rice_historymult) + - ((history * rice_historymult) >> 9); + + if (decodedValue > 0xFFFF) + history = 0xFFFF; + + // special case, for compressed blocks of 0 + if ((history < 128) && (outputCount + 1 < outputSize)) + { + int32_t blockSize; + + signModifier = 1; + + k = count_leading_zeros(history) + ((history + 16) / 64) - 24; + + // note: blockSize is always 16bit + blockSize = entropy_decode_value(alac, 16, k, rice_kmodifier_mask); + + // got blockSize 0s + if (blockSize > 0) + { + memset(&outputBuffer[outputCount + 1], 0, blockSize * sizeof(*outputBuffer)); + outputCount += blockSize; + } + + if (blockSize > 0xFFFF) + signModifier = 0; + + history = 0; + } + } +} + +#define SIGN_EXTENDED32(val, bits) ((val << (32 - bits)) >> (32 - bits)) + +#define SIGN_ONLY(v) \ + ((v < 0) ? (-1) : \ + ((v > 0) ? (1) : \ + (0))) + +static void predictor_decompress_fir_adapt(int32_t *error_buffer, + int32_t *buffer_out, + int output_size, + int readsamplesize, + int16_t *predictor_coef_table, + int predictor_coef_num, + int predictor_quantitization) +{ + int i; + + /* first sample always copies */ + *buffer_out = *error_buffer; + + if (!predictor_coef_num) + { + if (output_size <= 1) return; + memcpy(buffer_out+1, error_buffer+1, (output_size-1) * 4); + return; + } + + if (predictor_coef_num == 0x1f) /* 11111 - max value of predictor_coef_num */ + { /* second-best case scenario for fir decompression, + * error describes a small difference from the previous sample only + */ + if (output_size <= 1) return; + for (i = 0; i < output_size - 1; i++) + { + int32_t prev_value; + int32_t error_value; + + prev_value = buffer_out[i]; + error_value = error_buffer[i+1]; + buffer_out[i+1] = SIGN_EXTENDED32((prev_value + error_value), readsamplesize); + } + return; + } + + /* read warm-up samples */ + if (predictor_coef_num > 0) + { + int i; + for (i = 0; i < predictor_coef_num; i++) + { + int32_t val; + + val = buffer_out[i] + error_buffer[i+1]; + + val = SIGN_EXTENDED32(val, readsamplesize); + + buffer_out[i+1] = val; + } + } + +#if 0 + /* 4 and 8 are very common cases (the only ones i've seen). these + * should be unrolled and optimised + */ + if (predictor_coef_num == 4) + { + /* FIXME: optimised general case */ + return; + } + + if (predictor_coef_table == 8) + { + /* FIXME: optimised general case */ + return; + } +#endif + + + /* general case */ + if (predictor_coef_num > 0) + { + for (i = predictor_coef_num + 1; + i < output_size; + i++) + { + int j; + int sum = 0; + int outval; + int error_val = error_buffer[i]; + + for (j = 0; j < predictor_coef_num; j++) + { + sum += (buffer_out[predictor_coef_num-j] - buffer_out[0]) * + predictor_coef_table[j]; + } + + outval = (1 << (predictor_quantitization-1)) + sum; + outval = outval >> predictor_quantitization; + outval = outval + buffer_out[0] + error_val; + outval = SIGN_EXTENDED32(outval, readsamplesize); + + buffer_out[predictor_coef_num+1] = outval; + + if (error_val > 0) + { + int predictor_num = predictor_coef_num - 1; + + while (predictor_num >= 0 && error_val > 0) + { + int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num]; + int sign = SIGN_ONLY(val); + + predictor_coef_table[predictor_num] -= sign; + + val *= sign; /* absolute value */ + + error_val -= ((val >> predictor_quantitization) * + (predictor_coef_num - predictor_num)); + + predictor_num--; + } + } + else if (error_val < 0) + { + int predictor_num = predictor_coef_num - 1; + + while (predictor_num >= 0 && error_val < 0) + { + int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num]; + int sign = - SIGN_ONLY(val); + + predictor_coef_table[predictor_num] -= sign; + + val *= sign; /* neg value */ + + error_val -= ((val >> predictor_quantitization) * + (predictor_coef_num - predictor_num)); + + predictor_num--; + } + } + + buffer_out++; + } + } +} + +void deinterlace_16(int32_t *buffer_a, int32_t *buffer_b, + int16_t *buffer_out, + int numchannels, int numsamples, + uint8_t interlacing_shift, + uint8_t interlacing_leftweight) +{ + int i; + if (numsamples <= 0) return; + + /* weighted interlacing */ + if (interlacing_leftweight) + { + for (i = 0; i < numsamples; i++) + { + int32_t difference, midright; + int16_t left; + int16_t right; + + midright = buffer_a[i]; + difference = buffer_b[i]; + + + right = midright - ((difference * interlacing_leftweight) >> interlacing_shift); + left = right + difference; + + /* output is always little endian */ + if (host_bigendian) + { + _Swap16(left); + _Swap16(right); + } + + buffer_out[i*numchannels] = left; + buffer_out[i*numchannels + 1] = right; + } + + return; + } + + /* otherwise basic interlacing took place */ + for (i = 0; i < numsamples; i++) + { + int16_t left, right; + + left = buffer_a[i]; + right = buffer_b[i]; + + /* output is always little endian */ + if (host_bigendian) + { + _Swap16(left); + _Swap16(right); + } + + buffer_out[i*numchannels] = left; + buffer_out[i*numchannels + 1] = right; + } +} + +void deinterlace_24(int32_t *buffer_a, int32_t *buffer_b, + int uncompressed_bytes, + int32_t *uncompressed_bytes_buffer_a, int32_t *uncompressed_bytes_buffer_b, + void *buffer_out, + int numchannels, int numsamples, + uint8_t interlacing_shift, + uint8_t interlacing_leftweight) +{ + int i; + if (numsamples <= 0) return; + + /* weighted interlacing */ + if (interlacing_leftweight) + { + for (i = 0; i < numsamples; i++) + { + int32_t difference, midright; + int32_t left; + int32_t right; + + midright = buffer_a[i]; + difference = buffer_b[i]; + + right = midright - ((difference * interlacing_leftweight) >> interlacing_shift); + left = right + difference; + + if (uncompressed_bytes) + { + uint32_t mask = ~(0xFFFFFFFF << (uncompressed_bytes * 8)); + left <<= (uncompressed_bytes * 8); + right <<= (uncompressed_bytes * 8); + + left |= uncompressed_bytes_buffer_a[i] & mask; + right |= uncompressed_bytes_buffer_b[i] & mask; + } + + ((uint8_t*)buffer_out)[i * numchannels * 3] = (left) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 1] = (left >> 8) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 2] = (left >> 16) & 0xFF; + + ((uint8_t*)buffer_out)[i * numchannels * 3 + 3] = (right) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 4] = (right >> 8) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 5] = (right >> 16) & 0xFF; + } + + return; + } + + /* otherwise basic interlacing took place */ + for (i = 0; i < numsamples; i++) + { + int32_t left, right; + + left = buffer_a[i]; + right = buffer_b[i]; + + if (uncompressed_bytes) + { + uint32_t mask = ~(0xFFFFFFFF << (uncompressed_bytes * 8)); + left <<= (uncompressed_bytes * 8); + right <<= (uncompressed_bytes * 8); + + left |= uncompressed_bytes_buffer_a[i] & mask; + right |= uncompressed_bytes_buffer_b[i] & mask; + } + + ((uint8_t*)buffer_out)[i * numchannels * 3] = (left) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 1] = (left >> 8) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 2] = (left >> 16) & 0xFF; + + ((uint8_t*)buffer_out)[i * numchannels * 3 + 3] = (right) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 4] = (right >> 8) & 0xFF; + ((uint8_t*)buffer_out)[i * numchannels * 3 + 5] = (right >> 16) & 0xFF; + + } + +} + +void decode_frame(alac_file *alac, + unsigned char *inbuffer, + void *outbuffer, int *outputsize) +{ + int channels; + int32_t outputsamples = alac->setinfo_max_samples_per_frame; + + /* setup the stream */ + alac->input_buffer = inbuffer; + alac->input_buffer_bitaccumulator = 0; + + channels = readbits(alac, 3); + + *outputsize = outputsamples * alac->bytespersample; + + switch(channels) + { + case 0: /* 1 channel */ + { + int hassize; + int isnotcompressed; + int readsamplesize; + + int uncompressed_bytes; + int ricemodifier; + + /* 2^result = something to do with output waiting. + * perhaps matters if we read > 1 frame in a pass? + */ + readbits(alac, 4); + + readbits(alac, 12); /* unknown, skip 12 bits */ + + hassize = readbits(alac, 1); /* the output sample size is stored soon */ + + uncompressed_bytes = readbits(alac, 2); /* number of bytes in the (compressed) stream that are not compressed */ + + isnotcompressed = readbits(alac, 1); /* whether the frame is compressed */ + + if (hassize) + { + /* now read the number of samples, + * as a 32bit integer */ + outputsamples = readbits(alac, 32); + *outputsize = outputsamples * alac->bytespersample; + } + + readsamplesize = alac->setinfo_sample_size - (uncompressed_bytes * 8); + + if (!isnotcompressed) + { /* so it is compressed */ + int16_t predictor_coef_table[32]; + int predictor_coef_num; + int prediction_type; + int prediction_quantitization; + int i; + + /* skip 16 bits, not sure what they are. seem to be used in + * two channel case */ + readbits(alac, 8); + readbits(alac, 8); + + prediction_type = readbits(alac, 4); + prediction_quantitization = readbits(alac, 4); + + ricemodifier = readbits(alac, 3); + predictor_coef_num = readbits(alac, 5); + + /* read the predictor table */ + for (i = 0; i < predictor_coef_num; i++) + { + predictor_coef_table[i] = (int16_t)readbits(alac, 16); + } + + if (uncompressed_bytes) + { + int i; + for (i = 0; i < outputsamples; i++) + { + alac->uncompressed_bytes_buffer_a[i] = readbits(alac, uncompressed_bytes * 8); + } + } + + entropy_rice_decode(alac, + alac->predicterror_buffer_a, + outputsamples, + readsamplesize, + alac->setinfo_rice_initialhistory, + alac->setinfo_rice_kmodifier, + ricemodifier * alac->setinfo_rice_historymult / 4, + (1 << alac->setinfo_rice_kmodifier) - 1); + + if (prediction_type == 0) + { /* adaptive fir */ + predictor_decompress_fir_adapt(alac->predicterror_buffer_a, + alac->outputsamples_buffer_a, + outputsamples, + readsamplesize, + predictor_coef_table, + predictor_coef_num, + prediction_quantitization); + } + else + { + fprintf(stderr, "FIXME: unhandled predicition type: %i\n", prediction_type); + /* i think the only other prediction type (or perhaps this is just a + * boolean?) runs adaptive fir twice.. like: + * predictor_decompress_fir_adapt(predictor_error, tempout, ...) + * predictor_decompress_fir_adapt(predictor_error, outputsamples ...) + * little strange.. + */ + } + + } + else + { /* not compressed, easy case */ + if (alac->setinfo_sample_size <= 16) + { + int i; + for (i = 0; i < outputsamples; i++) + { + int32_t audiobits = readbits(alac, alac->setinfo_sample_size); + + audiobits = SIGN_EXTENDED32(audiobits, alac->setinfo_sample_size); + + alac->outputsamples_buffer_a[i] = audiobits; + } + } + else + { + int i; + for (i = 0; i < outputsamples; i++) + { + int32_t audiobits; + + audiobits = readbits(alac, 16); + /* special case of sign extension.. + * as we'll be ORing the low 16bits into this */ + audiobits = audiobits << (alac->setinfo_sample_size - 16); + audiobits |= readbits(alac, alac->setinfo_sample_size - 16); + audiobits = SignExtend24(audiobits); + + alac->outputsamples_buffer_a[i] = audiobits; + } + } + uncompressed_bytes = 0; // always 0 for uncompressed + } + + switch(alac->setinfo_sample_size) + { + case 16: + { + int i; + for (i = 0; i < outputsamples; i++) + { + int16_t sample = alac->outputsamples_buffer_a[i]; + if (host_bigendian) + _Swap16(sample); + ((int16_t*)outbuffer)[i * alac->numchannels] = sample; + } + break; + } + case 24: + { + int i; + for (i = 0; i < outputsamples; i++) + { + int32_t sample = alac->outputsamples_buffer_a[i]; + + if (uncompressed_bytes) + { + uint32_t mask; + sample = sample << (uncompressed_bytes * 8); + mask = ~(0xFFFFFFFF << (uncompressed_bytes * 8)); + sample |= alac->uncompressed_bytes_buffer_a[i] & mask; + } + + ((uint8_t*)outbuffer)[i * alac->numchannels * 3] = (sample) & 0xFF; + ((uint8_t*)outbuffer)[i * alac->numchannels * 3 + 1] = (sample >> 8) & 0xFF; + ((uint8_t*)outbuffer)[i * alac->numchannels * 3 + 2] = (sample >> 16) & 0xFF; + } + break; + } + case 20: + case 32: + fprintf(stderr, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size); + break; + default: + break; + } + break; + } + case 1: /* 2 channels */ + { + int hassize; + int isnotcompressed; + int readsamplesize; + + int uncompressed_bytes; + + uint8_t interlacing_shift; + uint8_t interlacing_leftweight; + + /* 2^result = something to do with output waiting. + * perhaps matters if we read > 1 frame in a pass? + */ + readbits(alac, 4); + + readbits(alac, 12); /* unknown, skip 12 bits */ + + hassize = readbits(alac, 1); /* the output sample size is stored soon */ + + uncompressed_bytes = readbits(alac, 2); /* the number of bytes in the (compressed) stream that are not compressed */ + + isnotcompressed = readbits(alac, 1); /* whether the frame is compressed */ + + if (hassize) + { + /* now read the number of samples, + * as a 32bit integer */ + outputsamples = readbits(alac, 32); + *outputsize = outputsamples * alac->bytespersample; + } + + readsamplesize = alac->setinfo_sample_size - (uncompressed_bytes * 8) + 1; + + if (!isnotcompressed) + { /* compressed */ + int16_t predictor_coef_table_a[32]; + int predictor_coef_num_a; + int prediction_type_a; + int prediction_quantitization_a; + int ricemodifier_a; + + int16_t predictor_coef_table_b[32]; + int predictor_coef_num_b; + int prediction_type_b; + int prediction_quantitization_b; + int ricemodifier_b; + + int i; + + interlacing_shift = readbits(alac, 8); + interlacing_leftweight = readbits(alac, 8); + + /******** channel 1 ***********/ + prediction_type_a = readbits(alac, 4); + prediction_quantitization_a = readbits(alac, 4); + + ricemodifier_a = readbits(alac, 3); + predictor_coef_num_a = readbits(alac, 5); + + /* read the predictor table */ + for (i = 0; i < predictor_coef_num_a; i++) + { + predictor_coef_table_a[i] = (int16_t)readbits(alac, 16); + } + + /******** channel 2 *********/ + prediction_type_b = readbits(alac, 4); + prediction_quantitization_b = readbits(alac, 4); + + ricemodifier_b = readbits(alac, 3); + predictor_coef_num_b = readbits(alac, 5); + + /* read the predictor table */ + for (i = 0; i < predictor_coef_num_b; i++) + { + predictor_coef_table_b[i] = (int16_t)readbits(alac, 16); + } + + /*********************/ + if (uncompressed_bytes) + { /* see mono case */ + int i; + for (i = 0; i < outputsamples; i++) + { + alac->uncompressed_bytes_buffer_a[i] = readbits(alac, uncompressed_bytes * 8); + alac->uncompressed_bytes_buffer_b[i] = readbits(alac, uncompressed_bytes * 8); + } + } + + /* channel 1 */ + entropy_rice_decode(alac, + alac->predicterror_buffer_a, + outputsamples, + readsamplesize, + alac->setinfo_rice_initialhistory, + alac->setinfo_rice_kmodifier, + ricemodifier_a * alac->setinfo_rice_historymult / 4, + (1 << alac->setinfo_rice_kmodifier) - 1); + + if (prediction_type_a == 0) + { /* adaptive fir */ + predictor_decompress_fir_adapt(alac->predicterror_buffer_a, + alac->outputsamples_buffer_a, + outputsamples, + readsamplesize, + predictor_coef_table_a, + predictor_coef_num_a, + prediction_quantitization_a); + } + else + { /* see mono case */ + fprintf(stderr, "FIXME: unhandled predicition type: %i\n", prediction_type_a); + } + + /* channel 2 */ + entropy_rice_decode(alac, + alac->predicterror_buffer_b, + outputsamples, + readsamplesize, + alac->setinfo_rice_initialhistory, + alac->setinfo_rice_kmodifier, + ricemodifier_b * alac->setinfo_rice_historymult / 4, + (1 << alac->setinfo_rice_kmodifier) - 1); + + if (prediction_type_b == 0) + { /* adaptive fir */ + predictor_decompress_fir_adapt(alac->predicterror_buffer_b, + alac->outputsamples_buffer_b, + outputsamples, + readsamplesize, + predictor_coef_table_b, + predictor_coef_num_b, + prediction_quantitization_b); + } + else + { + fprintf(stderr, "FIXME: unhandled predicition type: %i\n", prediction_type_b); + } + } + else + { /* not compressed, easy case */ + if (alac->setinfo_sample_size <= 16) + { + int i; + for (i = 0; i < outputsamples; i++) + { + int32_t audiobits_a, audiobits_b; + + audiobits_a = readbits(alac, alac->setinfo_sample_size); + audiobits_b = readbits(alac, alac->setinfo_sample_size); + + audiobits_a = SIGN_EXTENDED32(audiobits_a, alac->setinfo_sample_size); + audiobits_b = SIGN_EXTENDED32(audiobits_b, alac->setinfo_sample_size); + + alac->outputsamples_buffer_a[i] = audiobits_a; + alac->outputsamples_buffer_b[i] = audiobits_b; + } + } + else + { + int i; + for (i = 0; i < outputsamples; i++) + { + int32_t audiobits_a, audiobits_b; + + audiobits_a = readbits(alac, 16); + audiobits_a = audiobits_a << (alac->setinfo_sample_size - 16); + audiobits_a |= readbits(alac, alac->setinfo_sample_size - 16); + audiobits_a = SignExtend24(audiobits_a); + + audiobits_b = readbits(alac, 16); + audiobits_b = audiobits_b << (alac->setinfo_sample_size - 16); + audiobits_b |= readbits(alac, alac->setinfo_sample_size - 16); + audiobits_b = SignExtend24(audiobits_b); + + alac->outputsamples_buffer_a[i] = audiobits_a; + alac->outputsamples_buffer_b[i] = audiobits_b; + } + } + uncompressed_bytes = 0; // always 0 for uncompressed + interlacing_shift = 0; + interlacing_leftweight = 0; + } + + switch(alac->setinfo_sample_size) + { + case 16: + { + deinterlace_16(alac->outputsamples_buffer_a, + alac->outputsamples_buffer_b, + (int16_t*)outbuffer, + alac->numchannels, + outputsamples, + interlacing_shift, + interlacing_leftweight); + break; + } + case 24: + { + deinterlace_24(alac->outputsamples_buffer_a, + alac->outputsamples_buffer_b, + uncompressed_bytes, + alac->uncompressed_bytes_buffer_a, + alac->uncompressed_bytes_buffer_b, + (int16_t*)outbuffer, + alac->numchannels, + outputsamples, + interlacing_shift, + interlacing_leftweight); + break; + } + case 20: + case 32: + fprintf(stderr, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size); + break; + default: + break; + } + + break; + } + } +} + +alac_file *create_alac(int samplesize, int numchannels) +{ + alac_file *newfile = malloc(sizeof(alac_file)); + + newfile->samplesize = samplesize; + newfile->numchannels = numchannels; + newfile->bytespersample = (samplesize / 8) * numchannels; + + return newfile; +} + diff --git a/plugins/alac/alac_plugin.c b/plugins/alac/alac_plugin.c new file mode 100644 index 00000000..fd0d33bb --- /dev/null +++ b/plugins/alac/alac_plugin.c @@ -0,0 +1,617 @@ +/* + ALAC plugin for deadbeef + Copyright (C) 2012 Alexey Yakovenko + Uses the reverse engineered ALAC decoder (C) 2005 David Hammerton + All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ +#include "../../deadbeef.h" +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif +#include +#include +#include +#include "mp4ff.h" +#include "demux.h" +#include "decomp.h" +#include "stream.h" + +#define min(x,y) ((x)<(y)?(x):(y)) +#define max(x,y) ((x)>(y)?(x):(y)) + +#define trace(...) { fprintf(stderr, __VA_ARGS__); } +//#define trace(fmt,...) + +static DB_decoder_t plugin; +DB_functions_t *deadbeef; + +#ifdef WORDS_BIGENDIAN +int host_bigendian = 1; +#else +int host_bigendian = 0; +#endif + +#define BUFFER_SIZE (1024*24) +#define IN_BUFFER_SIZE (1024*80) + +typedef struct { + DB_fileinfo_t info; + DB_FILE *file; + demux_res_t demux_res; + stream_t *stream; + alac_file *alac; + int junk; + char out_buffer[BUFFER_SIZE]; + int out_remaining; + int skipsamples; + int currentsample; + int startsample; + int endsample; + int current_frame; +} alacplug_info_t; + +// allocate codec control structure +static DB_fileinfo_t * +alacplug_open (uint32_t hints) { + DB_fileinfo_t *_info = malloc (sizeof (alacplug_info_t)); + alacplug_info_t *info = (alacplug_info_t *)_info; + memset (info, 0, sizeof (alacplug_info_t)); + return _info; +} + +static uint32_t +alacplug_fs_read (void *user_data, void *buffer, uint32_t length) { + alacplug_info_t *info = user_data; + return deadbeef->fread (buffer, 1, length, info->file); +} + +static uint32_t +alacplug_fs_seek (void *user_data, uint64_t position) { + alacplug_info_t *info = user_data; + return deadbeef->fseek (info->file, position+info->junk, SEEK_SET); +} + +static int +get_sample_info(demux_res_t *demux_res, uint32_t samplenum, + uint32_t *sample_duration, + uint32_t *sample_byte_size) +{ + unsigned int duration_index_accum = 0; + unsigned int duration_cur_index = 0; + + if (samplenum >= demux_res->num_sample_byte_sizes) + { + fprintf(stderr, "sample %i does not exist\n", samplenum); + return 0; + } + + if (!demux_res->num_time_to_samples) + { + fprintf(stderr, "no time to samples\n"); + return 0; + } + while ((demux_res->time_to_sample[duration_cur_index].sample_count + duration_index_accum) + <= samplenum) + { + duration_index_accum += demux_res->time_to_sample[duration_cur_index].sample_count; + duration_cur_index++; + if (duration_cur_index >= demux_res->num_time_to_samples) + { + fprintf(stderr, "sample %i does not have a duration\n", samplenum); + return 0; + } + } + + *sample_duration = demux_res->time_to_sample[duration_cur_index].sample_duration; + *sample_byte_size = demux_res->sample_byte_size[samplenum]; + + return 1; +} + +static int +alacplug_get_totalsamples (demux_res_t *demux_res) { + int totalsamples = 0; + for (int i = 0; i < demux_res->num_sample_byte_sizes; i++) + { + unsigned int thissample_duration = 0; + unsigned int thissample_bytesize = 0; + + get_sample_info(demux_res, i, &thissample_duration, + &thissample_bytesize); + + totalsamples += thissample_duration; + } + return totalsamples; +} + +static int +alacplug_init (DB_fileinfo_t *_info, DB_playItem_t *it) { + alacplug_info_t *info = (alacplug_info_t *)_info; + + deadbeef->pl_lock (); + info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI")); + deadbeef->pl_unlock (); + if (!info->file) { + return -1; + } + + info->stream = stream_create_file (info->file, 1); + + if (!qtmovie_read(info->stream, &info->demux_res)) { + if (!info->demux_res.format_read || info->demux_res.format != MAKEFOURCC('a','l','a','c')) { + return -1; + } + } + + info->alac = create_alac(info->demux_res.sample_size, info->demux_res.num_channels); + alac_set_info(info->alac, info->demux_res.codecdata); + + int totalsamples = alacplug_get_totalsamples (&info->demux_res); + if (!info->file->vfs->is_streaming ()) { + if (it->endsample > 0) { + info->startsample = it->startsample; + info->endsample = it->endsample; + plugin.seek_sample (_info, 0); + } + else { + info->startsample = 0; + info->endsample = totalsamples-1; + } + } + + _info->plugin = &plugin; + _info->fmt.bps = info->demux_res.sample_size; + _info->fmt.channels = info->demux_res.num_channels; + _info->fmt.samplerate = info->demux_res.sample_rate; + for (int i = 0; i < _info->fmt.channels; i++) { + _info->fmt.channelmask |= 1 << i; + } + + return 0; +} + +static void +alacplug_free (DB_fileinfo_t *_info) { + alacplug_info_t *info = (alacplug_info_t *)_info; + if (info) { + if (info->file) { + deadbeef->fclose (info->file); + } + if (info->stream) { + stream_destroy (info->stream); + } + if (info->alac) { + free (info->alac); + } + free (info); + } +} + +static int +alacplug_read (DB_fileinfo_t *_info, char *bytes, int size) { + alacplug_info_t *info = (alacplug_info_t *)_info; + int samplesize = _info->fmt.channels * _info->fmt.bps / 8; + if (!info->file->vfs->is_streaming ()) { + if (info->currentsample + size / samplesize > info->endsample) { + size = (info->endsample - info->currentsample + 1) * samplesize; + if (size <= 0) { + trace ("alacplug_read: eof (current=%d, total=%d)\n", info->currentsample, info->endsample); + return 0; + } + } + } + int initsize = size; + while (size > 0) { + // handle seeking + if (info->skipsamples > 0 && info->out_remaining > 0) { + int skip = min (info->out_remaining, info->skipsamples); + if (skip < info->out_remaining) { + memmove (info->out_buffer, info->out_buffer + skip * samplesize, (info->out_remaining - skip) * samplesize); + } + info->out_remaining -= skip; + info->skipsamples -= skip; + } + if (info->out_remaining > 0) { + int n = size / samplesize; + n = min (info->out_remaining, n); + + char *src = info->out_buffer; + memcpy (bytes, src, n * samplesize); + bytes += n * samplesize; + src += n * samplesize; + size -= n * samplesize; + + if (n == info->out_remaining) { + info->out_remaining = 0; + } + else { + memmove (info->out_buffer, src, (info->out_remaining - n) * samplesize); + info->out_remaining -= n; + } + continue; + } + + // decode next frame + if (info->current_frame == info->demux_res.num_sample_byte_sizes) { + break; // end of file + } + + uint32_t sample_duration; + uint32_t sample_byte_size; + + int outputBytes; + + /* just get one sample for now */ + if (!get_sample_info(&info->demux_res, info->current_frame, + &sample_duration, &sample_byte_size)) + { + fprintf(stderr, "alac: sample failed\n"); + break; + } + + if (IN_BUFFER_SIZE < sample_byte_size) + { + fprintf(stderr, "alac: buffer too small! (is %i want %i)\n", + IN_BUFFER_SIZE, + sample_byte_size); + break; + } + + char buffer[IN_BUFFER_SIZE]; + stream_read(info->stream, sample_byte_size, buffer); + + outputBytes = BUFFER_SIZE; + decode_frame(info->alac, buffer, info->out_buffer, &outputBytes); + info->current_frame++; + + info->out_remaining += outputBytes / samplesize; + } + + info->currentsample += (initsize-size) / samplesize; + return initsize-size; +} + +static int +alacplug_seek_sample (DB_fileinfo_t *_info, int sample) { + return 0; +#if 0 + alacplug_info_t *info = (alacplug_info_t *)_info; + + sample += info->startsample; + if (info->mp4file) { + int scale = _info->fmt.samplerate / mp4ff_time_scale (info->mp4file, info->mp4track) * info->mp4framesize; + info->mp4sample = sample / scale; + info->skipsamples = sample - info->mp4sample * scale; + } + else { + int skip = deadbeef->junk_get_leading_size (info->file); + if (skip >= 0) { + deadbeef->fseek (info->file, skip, SEEK_SET); + } + else { + deadbeef->fseek (info->file, 0, SEEK_SET); + } + + int res = seek_raw_aac (info, sample); + if (res < 0) { + return -1; + } + info->skipsamples = res; + } + info->remaining = 0; + info->out_remaining = 0; + info->currentsample = sample; + _info->readpos = (float)(info->currentsample - info->startsample) / _info->fmt.samplerate; + return 0; +#endif +} + +static int +alacplug_seek (DB_fileinfo_t *_info, float t) { + return alacplug_seek_sample (_info, t * _info->fmt.samplerate); +} + +static const char *metainfo[] = { + "artist", "artist", + "title", "title", + "album", "album", + "track", "track", + "date", "year", + "genre", "genre", + "comment", "comment", + "performer", "performer", + "album_artist", "band", + "writer", "composer", + "vendor", "vendor", + "disc", "disc", + "compilation", "compilation", + "totaldiscs", "numdiscs", + "copyright", "copyright", + "totaltracks", "numtracks", + "tool", "tool", + NULL +}; + + +/* find a metadata item by name */ +/* returns 0 if item found, 1 if no such item */ +int32_t mp4ff_meta_find_by_name(const mp4ff_t *f, const char *item, char **value); + + +void +alacplug_load_tags (DB_playItem_t *it, mp4ff_t *mp4) { + char *s = NULL; + for (int i = 0; metainfo[i]; i += 2) { + if (mp4ff_meta_find_by_name(mp4, metainfo[i], &s)) { + deadbeef->pl_add_meta (it, metainfo[i+1], s); + free (s); + } + } + if (mp4ff_meta_find_by_name(mp4, "replaygain_track_gain", &s)) { + deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKGAIN, atof (s)); + free (s); + } + if (mp4ff_meta_find_by_name(mp4, "replaygain_track_peak", &s)) { + deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKPEAK, atof (s)); + free (s); + } + if (mp4ff_meta_find_by_name(mp4, "replaygain_album_gain", &s)) { + deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMGAIN, atof (s)); + free (s); + } + if (mp4ff_meta_find_by_name(mp4, "replaygain_album_peak", &s)) { + deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMPEAK, atof (s)); + free (s); + } +} + +int +alacplug_read_metadata (DB_playItem_t *it) { + deadbeef->pl_lock (); + DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI")); + deadbeef->pl_unlock (); + if (!fp) { + return -1; + } + + if (fp->vfs->is_streaming ()) { + deadbeef->fclose (fp); + return -1; + } + + alacplug_info_t inf; + memset (&inf, 0, sizeof (inf)); + inf.file = fp; + inf.junk = deadbeef->junk_get_leading_size (fp); + if (inf.junk >= 0) { + deadbeef->fseek (inf.file, inf.junk, SEEK_SET); + } + else { + inf.junk = 0; + } + + mp4ff_callback_t cb = { + .read = alacplug_fs_read, + .write = NULL, + .seek = alacplug_fs_seek, + .truncate = NULL, + .user_data = &inf + }; + + deadbeef->pl_delete_all_meta (it); + + mp4ff_t *mp4 = mp4ff_open_read (&cb); + if (mp4) { + alacplug_load_tags (it, mp4); + mp4ff_close (mp4); + deadbeef->pl_add_meta (it, "title", NULL); + } + /*int apeerr = */deadbeef->junk_apev2_read (it, fp); + /*int v2err = */deadbeef->junk_id3v2_read (it, fp); + /*int v1err = */deadbeef->junk_id3v1_read (it, fp); + deadbeef->pl_add_meta (it, "title", NULL); + deadbeef->fclose (fp); + return 0; +} + +static DB_playItem_t * +alacplug_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) { + trace ("adding %s\n", fname); + mp4ff_t *mp4 = NULL; + DB_playItem_t *it = NULL; + demux_res_t demux_res; + stream_t *stream; + DB_FILE *fp = deadbeef->fopen (fname); + if (!fp) { + trace ("not found\n"); + return NULL; + } + alacplug_info_t info = {0}; + info.file = fp; + info.junk = deadbeef->junk_get_leading_size (fp); + if (info.junk >= 0) { + trace ("junk: %d\n", info.junk); + deadbeef->fseek (fp, info.junk, SEEK_SET); + } + else { + info.junk = 0; + } + + float duration = -1; + + stream = stream_create_file (fp, 1); + if (!stream) { + trace ("alac: stream_create_file failed\n"); + goto error; + } + + if (!qtmovie_read(stream, &demux_res)) { + if (!demux_res.format_read || demux_res.format != MAKEFOURCC('a','l','a','c')) { + trace ("alac track not found in the file %s\n", fname); + goto error; + } + } + + it = deadbeef->pl_item_alloc_init (fname, plugin.plugin.id); + deadbeef->pl_add_meta (it, ":FILETYPE", "ALAC"); + + int totalsamples = alacplug_get_totalsamples (&demux_res); + duration = totalsamples / (float)demux_res.sample_rate; + + deadbeef->plt_set_item_duration (plt, it, duration); + + // read tags + mp4ff_callback_t cb = { + .read = alacplug_fs_read, + .write = NULL, + .seek = alacplug_fs_seek, + .truncate = NULL, + .user_data = &info + }; + deadbeef->fseek (fp, info.junk, SEEK_SET); + mp4 = mp4ff_open_read (&cb); + if (mp4) { + alacplug_load_tags (it, mp4); + } + + int apeerr = deadbeef->junk_apev2_read (it, fp); + int v2err = deadbeef->junk_id3v2_read (it, fp); + int v1err = deadbeef->junk_id3v1_read (it, fp); + + int64_t fsize = deadbeef->fgetlength (fp); + + deadbeef->fclose (fp); + fp = NULL; + stream_destroy (stream); + stream = NULL; + if (mp4) { + mp4ff_close (mp4); + mp4 = NULL; + } + + if (duration > 0) { + char s[100]; + snprintf (s, sizeof (s), "%lld", fsize); + deadbeef->pl_add_meta (it, ":FILE_SIZE", s); + deadbeef->pl_add_meta (it, ":BPS", "16"); + snprintf (s, sizeof (s), "%d", demux_res.num_channels); + deadbeef->pl_add_meta (it, ":CHANNELS", s); + snprintf (s, sizeof (s), "%d", demux_res.sample_rate); + deadbeef->pl_add_meta (it, ":SAMPLERATE", s); + int br = (int)roundf(fsize / duration * 8 / 1000); + snprintf (s, sizeof (s), "%d", br); + deadbeef->pl_add_meta (it, ":BITRATE", s); + // embedded cue + deadbeef->pl_lock (); + const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet"); + DB_playItem_t *cue = NULL; + + if (cuesheet) { + cue = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), totalsamples, demux_res.sample_rate); + if (cue) { + deadbeef->pl_item_unref (it); + deadbeef->pl_item_unref (cue); + deadbeef->pl_unlock (); + return cue; + } + } + deadbeef->pl_unlock (); + + cue = deadbeef->plt_insert_cue (plt, after, it, totalsamples, demux_res.sample_rate); + if (cue) { + deadbeef->pl_item_unref (it); + deadbeef->pl_item_unref (cue); + return cue; + } + } + + deadbeef->pl_add_meta (it, "title", NULL); + +success: + after = deadbeef->plt_insert_item (plt, after, it); + deadbeef->pl_item_unref (it); +error: + if (fp) { + deadbeef->fclose (fp); + } + if (mp4) { + mp4ff_close (mp4); + } + return it; +} + +static const char * exts[] = { "mp4", "m4a", NULL }; + +// define plugin interface +static DB_decoder_t plugin = { + .plugin.api_vmajor = 1, + .plugin.api_vminor = 0, + .plugin.version_major = 1, + .plugin.version_minor = 0, + .plugin.type = DB_PLUGIN_DECODER, + .plugin.id = "alac", + .plugin.name = "ALAC player", + .plugin.descr = "plays alac files from MP4 and M4A files", + .plugin.copyright = + "ALAC plugin for deadbeef\n" + "Copyright (C) 2012 Alexey Yakovenko \n" + "Uses the reverse engineered ALAC decoder (C) 2005 David Hammerton\n" + "All rights reserved.\n" + "\n" + "Permission is hereby granted, free of charge, to any person\n" + "obtaining a copy of this software and associated documentation\n" + "files (the \"Software\"), to deal in the Software without\n" + "restriction, including without limitation the rights to use,\n" + "copy, modify, merge, publish, distribute, sublicense, and/or\n" + "sell copies of the Software, and to permit persons to whom the\n" + "Software is furnished to do so, subject to the following conditions:\n" + "\n" + "The above copyright notice and this permission notice shall be\n" + "included in all copies or substantial portions of the Software.\n" + "\n" + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n" + "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n" + "OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n" + "NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n" + "HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n" + "WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n" + "FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n" + "OTHER DEALINGS IN THE SOFTWARE.\n" + , + .plugin.website = "http://deadbeef.sf.net", + .open = alacplug_open, + .init = alacplug_init, + .free = alacplug_free, + .read = alacplug_read, + .seek = alacplug_seek, + .seek_sample = alacplug_seek_sample, + .insert = alacplug_insert, + .read_metadata = alacplug_read_metadata, + .exts = exts, +}; + +DB_plugin_t * +alac_load (DB_functions_t *api) { + deadbeef = api; + return DB_PLUGIN (&plugin); +} diff --git a/plugins/alac/decomp.h b/plugins/alac/decomp.h new file mode 100644 index 00000000..23dbc527 --- /dev/null +++ b/plugins/alac/decomp.h @@ -0,0 +1,13 @@ +#ifndef __ALAC__DECOMP_H +#define __ALAC__DECOMP_H + +typedef struct alac_file alac_file; + +alac_file *create_alac(int samplesize, int numchannels); +void decode_frame(alac_file *alac, + unsigned char *inbuffer, + void *outbuffer, int *outputsize); +void alac_set_info(alac_file *alac, char *inputbuffer); + +#endif /* __ALAC__DECOMP_H */ + diff --git a/plugins/alac/demux.c b/plugins/alac/demux.c new file mode 100644 index 00000000..ae77a9dd --- /dev/null +++ b/plugins/alac/demux.c @@ -0,0 +1,730 @@ +/* + * ALAC (Apple Lossless Audio Codec) decoder + * Copyright (c) 2005 David Hammerton + * All rights reserved. + * + * This is the quicktime container demuxer. + * + * http://crazney.net/programs/itunes/alac.html + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +#include +#include +#include +#ifdef _WIN32 + #include "stdint_win.h" +#else + #include +#endif + +#include "stream.h" +#include "demux.h" + +typedef struct +{ + stream_t *stream; + demux_res_t *res; + long saved_mdat_pos; +} qtmovie_t; + + +/* chunk handlers */ +static void read_chunk_ftyp(qtmovie_t *qtmovie, size_t chunk_len) +{ + fourcc_t type; + uint32_t minor_ver; + size_t size_remaining = chunk_len - 8; /* FIXME: can't hardcode 8, size may be 64bit */ + + type = stream_read_uint32(qtmovie->stream); + size_remaining-=4; + if (type != MAKEFOURCC('M','4','A',' ')) + { + fprintf(stderr, "not M4A file\n"); + return; + } + minor_ver = stream_read_uint32(qtmovie->stream); + size_remaining-=4; + + /* compatible brands */ + while (size_remaining) + { + /* unused */ + /*fourcc_t cbrand =*/ stream_read_uint32(qtmovie->stream); + size_remaining-=4; + } +} + +static void read_chunk_tkhd(qtmovie_t *qtmovie, size_t chunk_len) +{ + /* don't need anything from here atm, skip */ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + stream_skip(qtmovie->stream, size_remaining); +} + +static void read_chunk_mdhd(qtmovie_t *qtmovie, size_t chunk_len) +{ + /* don't need anything from here atm, skip */ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + stream_skip(qtmovie->stream, size_remaining); +} + +static void read_chunk_edts(qtmovie_t *qtmovie, size_t chunk_len) +{ + /* don't need anything from here atm, skip */ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + stream_skip(qtmovie->stream, size_remaining); +} + +static void read_chunk_elst(qtmovie_t *qtmovie, size_t chunk_len) +{ + /* don't need anything from here atm, skip */ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + stream_skip(qtmovie->stream, size_remaining); +} + +/* media handler inside mdia */ +static void read_chunk_hdlr(qtmovie_t *qtmovie, size_t chunk_len) +{ + fourcc_t comptype, compsubtype; + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + int strlen; + char str[256] = {0}; + + /* version */ + stream_read_uint8(qtmovie->stream); + size_remaining -= 1; + /* flags */ + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + size_remaining -= 3; + + /* component type */ + comptype = stream_read_uint32(qtmovie->stream); + compsubtype = stream_read_uint32(qtmovie->stream); + size_remaining -= 8; + + /* component manufacturer */ + stream_read_uint32(qtmovie->stream); + size_remaining -= 4; + + /* flags */ + stream_read_uint32(qtmovie->stream); + stream_read_uint32(qtmovie->stream); + size_remaining -= 8; + + /* name */ + strlen = stream_read_uint8(qtmovie->stream); + stream_read(qtmovie->stream, strlen, str); + size_remaining -= 1 + strlen; + + if (size_remaining) + { + stream_skip(qtmovie->stream, size_remaining); + } + +} + +static int read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) +{ + unsigned int i; + uint32_t numentries; + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + /* version */ + stream_read_uint8(qtmovie->stream); + size_remaining -= 1; + /* flags */ + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + size_remaining -= 3; + + numentries = stream_read_uint32(qtmovie->stream); + size_remaining -= 4; + + if (numentries != 1) + { + fprintf(stderr, "only expecting one entry in sample description atom!\n"); + return 0; + } + + for (i = 0; i < numentries; i++) + { + uint32_t entry_size; + uint16_t version; + + uint32_t entry_remaining; + + entry_size = stream_read_uint32(qtmovie->stream); + qtmovie->res->format = stream_read_uint32(qtmovie->stream); + entry_remaining = entry_size; + entry_remaining -= 8; + + /* sound info: */ + + stream_skip(qtmovie->stream, 6); /* reserved */ + entry_remaining -= 6; + + version = stream_read_uint16(qtmovie->stream); + if (version != 1) + fprintf(stderr, "unknown version??\n"); + entry_remaining -= 2; + + /* revision level */ + stream_read_uint16(qtmovie->stream); + /* vendor */ + stream_read_uint32(qtmovie->stream); + entry_remaining -= 6; + + /* EH?? spec doesn't say theres an extra 16 bits here.. but there is! */ + stream_read_uint16(qtmovie->stream); + entry_remaining -= 2; + + qtmovie->res->num_channels = stream_read_uint16(qtmovie->stream); + + qtmovie->res->sample_size = stream_read_uint16(qtmovie->stream); + entry_remaining -= 4; + + /* compression id */ + stream_read_uint16(qtmovie->stream); + /* packet size */ + stream_read_uint16(qtmovie->stream); + entry_remaining -= 4; + + /* sample rate - 32bit fixed point = 16bit?? */ + qtmovie->res->sample_rate = stream_read_uint16(qtmovie->stream); + entry_remaining -= 2; + + /* skip 2 */ + stream_skip(qtmovie->stream, 2); + entry_remaining -= 2; + + /* remaining is codec data */ + +#if 0 + qtmovie->res->codecdata_len = stream_read_uint32(qtmovie->stream); + if (qtmovie->res->codecdata_len != entry_remaining) + fprintf(stderr, "perhaps not? %i vs %i\n", + qtmovie->res->codecdata_len, entry_remaining); + entry_remaining -= 4; + stream_read_uint32(qtmovie->stream); /* 'alac' */ + entry_remaining -= 4; + + qtmovie->res->codecdata = malloc(qtmovie->res->codecdata_len - 8); + + stream_read(qtmovie->stream, + entry_remaining, + qtmovie->res->codecdata); + entry_remaining = 0; + +#else + /* 12 = audio format atom, 8 = padding */ + qtmovie->res->codecdata_len = entry_remaining + 12 + 8; + qtmovie->res->codecdata = malloc(qtmovie->res->codecdata_len); + memset(qtmovie->res->codecdata, 0, qtmovie->res->codecdata_len); + /* audio format atom */ + ((unsigned int*)qtmovie->res->codecdata)[0] = 0x0c000000; + ((unsigned int*)qtmovie->res->codecdata)[1] = MAKEFOURCC('a','m','r','f'); + ((unsigned int*)qtmovie->res->codecdata)[2] = MAKEFOURCC('c','a','l','a'); + + stream_read(qtmovie->stream, + entry_remaining, + ((char*)qtmovie->res->codecdata) + 12); + entry_remaining -= entry_remaining; + +#endif + if (entry_remaining) + stream_skip(qtmovie->stream, entry_remaining); + + qtmovie->res->format_read = 1; + if (qtmovie->res->format != MAKEFOURCC('a','l','a','c')) + { + /*fprintf(stderr, "expecting 'alac' data format, got %c%c%c%c\n", + SPLITFOURCC(qtmovie->res->format));*/ + return 0; + } + } + + return 1; +} + +static void read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) +{ + unsigned int i; + uint32_t numentries; + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + /* version */ + stream_read_uint8(qtmovie->stream); + size_remaining -= 1; + /* flags */ + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + size_remaining -= 3; + + numentries = stream_read_uint32(qtmovie->stream); + size_remaining -= 4; + + qtmovie->res->num_time_to_samples = numentries; + qtmovie->res->time_to_sample = malloc(numentries * sizeof(*qtmovie->res->time_to_sample)); + + for (i = 0; i < numentries; i++) + { + qtmovie->res->time_to_sample[i].sample_count = stream_read_uint32(qtmovie->stream); + qtmovie->res->time_to_sample[i].sample_duration = stream_read_uint32(qtmovie->stream); + size_remaining -= 8; + } + + if (size_remaining) + { + fprintf(stderr, "ehm, size remianing?\n"); + stream_skip(qtmovie->stream, size_remaining); + } +} + +static void read_chunk_stsz(qtmovie_t *qtmovie, size_t chunk_len) +{ + unsigned int i; + uint32_t numentries; + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + /* version */ + stream_read_uint8(qtmovie->stream); + size_remaining -= 1; + /* flags */ + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + stream_read_uint8(qtmovie->stream); + size_remaining -= 3; + + /* default sample size */ + if (stream_read_uint32(qtmovie->stream) != 0) + { + fprintf(stderr, "i was expecting variable samples sizes\n"); + stream_read_uint32(qtmovie->stream); + size_remaining -= 4; + return; + } + size_remaining -= 4; + + numentries = stream_read_uint32(qtmovie->stream); + size_remaining -= 4; + + qtmovie->res->num_sample_byte_sizes = numentries; + qtmovie->res->sample_byte_size = malloc(numentries * sizeof(*qtmovie->res->sample_byte_size)); + + for (i = 0; i < numentries; i++) + { + qtmovie->res->sample_byte_size[i] = stream_read_uint32(qtmovie->stream); + size_remaining -= 4; + } + + if (size_remaining) + { + fprintf(stderr, "ehm, size remianing?\n"); + stream_skip(qtmovie->stream, size_remaining); + } +} + +static int read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len) +{ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + while (size_remaining) + { + size_t sub_chunk_len; + fourcc_t sub_chunk_id; + + sub_chunk_len = stream_read_uint32(qtmovie->stream); + if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) + { + fprintf(stderr, "strange size for chunk inside stbl (%lu) (remaining: %lu)\n", + sub_chunk_len, size_remaining); + return 0; + } + + sub_chunk_id = stream_read_uint32(qtmovie->stream); + + switch (sub_chunk_id) + { + case MAKEFOURCC('s','t','s','d'): + if (read_chunk_stsd(qtmovie, sub_chunk_len) == 0) + return 0; + break; + case MAKEFOURCC('s','t','t','s'): + read_chunk_stts(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('s','t','s','z'): + read_chunk_stsz(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('s','t','s','c'): + case MAKEFOURCC('s','t','c','o'): + /* skip these, no indexing for us! */ + stream_skip(qtmovie->stream, sub_chunk_len - 8); + break; + default: + fprintf(stderr, "(stbl) unknown chunk id: %c%c%c%c\n", + SPLITFOURCC(sub_chunk_id)); + return 0; + } + + size_remaining -= sub_chunk_len; + } + + return 1; +} + +static int read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) +{ + size_t dinf_size, stbl_size; + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + /**** SOUND HEADER CHUNK ****/ + if (stream_read_uint32(qtmovie->stream) != 16) + { + fprintf(stderr, "unexpected size in media info\n"); + return 0; + } + if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','m','h','d')) + { + fprintf(stderr, "not a sound header! can't handle this.\n"); + return 0; + } + /* now skip the rest */ + stream_skip(qtmovie->stream, 16 - 8); + size_remaining -= 16; + /****/ + + /**** DINF CHUNK ****/ + dinf_size = stream_read_uint32(qtmovie->stream); + if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('d','i','n','f')) + { + fprintf(stderr, "expected dinf, didn't get it.\n"); + return 0; + } + /* skip it */ + stream_skip(qtmovie->stream, dinf_size - 8); + size_remaining -= dinf_size; + /****/ + + + /**** SAMPLE TABLE ****/ + stbl_size = stream_read_uint32(qtmovie->stream); + if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','t','b','l')) + { + fprintf(stderr, "expected stbl, didn't get it.\n"); + return 0; + } + if (read_chunk_stbl(qtmovie, stbl_size) == 0) + return 0; + size_remaining -= stbl_size; + + if (size_remaining) + { + fprintf(stderr, "oops\n"); + stream_skip(qtmovie->stream, size_remaining); + } + + return 1; +} + +static int read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len) +{ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + while (size_remaining) + { + size_t sub_chunk_len; + fourcc_t sub_chunk_id; + + sub_chunk_len = stream_read_uint32(qtmovie->stream); + if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) + { + fprintf(stderr, "strange size for chunk inside mdia\n"); + return 0; + } + + sub_chunk_id = stream_read_uint32(qtmovie->stream); + + switch (sub_chunk_id) + { + case MAKEFOURCC('m','d','h','d'): + read_chunk_mdhd(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('h','d','l','r'): + read_chunk_hdlr(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('m','i','n','f'): + if (read_chunk_minf(qtmovie, sub_chunk_len) == 0) + return 0; + break; + default: + fprintf(stderr, "(mdia) unknown chunk id: %c%c%c%c\n", + SPLITFOURCC(sub_chunk_id)); + return 0; + } + + size_remaining -= sub_chunk_len; + } + + return 1; +} + +/* 'trak' - a movie track - contains other atoms */ +static int read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len) +{ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + while (size_remaining) + { + size_t sub_chunk_len; + fourcc_t sub_chunk_id; + + sub_chunk_len = stream_read_uint32(qtmovie->stream); + if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) + { + fprintf(stderr, "strange size for chunk inside trak\n"); + return 0; + } + + sub_chunk_id = stream_read_uint32(qtmovie->stream); + + switch (sub_chunk_id) + { + case MAKEFOURCC('t','k','h','d'): + read_chunk_tkhd(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('m','d','i','a'): + if (read_chunk_mdia(qtmovie, sub_chunk_len) == 0) + return 0; + break; + case MAKEFOURCC('e','d','t','s'): + read_chunk_edts(qtmovie, sub_chunk_len); + break; + default: + fprintf(stderr, "(trak) unknown chunk id: %c%c%c%c\n", + SPLITFOURCC(sub_chunk_id)); + return 0; + } + + size_remaining -= sub_chunk_len; + } + + return 1; +} + +/* 'mvhd' movie header atom */ +static void read_chunk_mvhd(qtmovie_t *qtmovie, size_t chunk_len) +{ + /* don't need anything from here atm, skip */ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + stream_skip(qtmovie->stream, size_remaining); +} + +/* 'udta' user data.. contains tag info */ +static void read_chunk_udta(qtmovie_t *qtmovie, size_t chunk_len) +{ + /* don't need anything from here atm, skip */ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + stream_skip(qtmovie->stream, size_remaining); +} + +/* 'iods' */ +static void read_chunk_iods(qtmovie_t *qtmovie, size_t chunk_len) +{ + /* don't need anything from here atm, skip */ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + stream_skip(qtmovie->stream, size_remaining); +} + +/* 'moov' movie atom - contains other atoms */ +static int read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len) +{ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + while (size_remaining) + { + size_t sub_chunk_len; + fourcc_t sub_chunk_id; + + sub_chunk_len = stream_read_uint32(qtmovie->stream); + if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) + { + fprintf(stderr, "strange size for chunk inside moov\n"); + return 0; + } + + sub_chunk_id = stream_read_uint32(qtmovie->stream); + + switch (sub_chunk_id) + { + case MAKEFOURCC('m','v','h','d'): + read_chunk_mvhd(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('t','r','a','k'): + if (read_chunk_trak(qtmovie, sub_chunk_len) == 0) + return 0; + break; + case MAKEFOURCC('u','d','t','a'): + read_chunk_udta(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('e','l','s','t'): + read_chunk_elst(qtmovie, sub_chunk_len); + break; + case MAKEFOURCC('i','o','d','s'): + read_chunk_iods(qtmovie, sub_chunk_len); + break; + default: + fprintf(stderr, "(moov) unknown chunk id: %c%c%c%c\n", + SPLITFOURCC(sub_chunk_id)); + return 0; + } + + size_remaining -= sub_chunk_len; + } + + return 1; +} + +static void read_chunk_mdat(qtmovie_t *qtmovie, size_t chunk_len, int skip_mdat) +{ + size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ + + if (size_remaining == 0) return; + + qtmovie->res->mdat_len = (uint32_t)size_remaining; + if (skip_mdat) + { + qtmovie->saved_mdat_pos = stream_tell(qtmovie->stream); + stream_skip(qtmovie->stream, size_remaining); + } +#if 0 + qtmovie->res->mdat = malloc(size_remaining); + + stream_read(qtmovie->stream, size_remaining, qtmovie->res->mdat); +#endif +} + +static int set_saved_mdat(qtmovie_t *qtmovie) +{ + if (qtmovie->saved_mdat_pos == -1) + { + fprintf(stderr, "stream contains mdat before moov but is not seekable\n"); + return 0; + } + + if (stream_setpos(qtmovie->stream, qtmovie->saved_mdat_pos)) + { + fprintf(stderr, "error while seeking stream to mdat pos\n"); + return 0; + } + + return 1; +} + +int qtmovie_read(stream_t *file, demux_res_t *demux_res) +{ + int found_moov = 0; + int found_mdat = 0; + qtmovie_t *qtmovie; + + qtmovie = (qtmovie_t*)malloc(sizeof(qtmovie_t)); + + /* construct the stream */ + qtmovie->stream = file; + + qtmovie->res = demux_res; + + memset(demux_res, 0, sizeof(demux_res_t)); + + /* read the chunks */ + while (1) + { + size_t chunk_len; + fourcc_t chunk_id; + + chunk_len = stream_read_uint32(qtmovie->stream); + if (stream_eof(qtmovie->stream)) + { + return 0; + } + + if (chunk_len == 1) + { + fprintf(stderr, "need 64bit support\n"); + return 0; + } + chunk_id = stream_read_uint32(qtmovie->stream); + + switch (chunk_id) + { + case MAKEFOURCC('f','t','y','p'): + read_chunk_ftyp(qtmovie, chunk_len); + break; + case MAKEFOURCC('m','o','o','v'): + if (read_chunk_moov(qtmovie, chunk_len) == 0) + return 0; /* failed to read moov, can't do anything */ + if (found_mdat) + { + return set_saved_mdat(qtmovie); + } + found_moov = 1; + break; + /* if we hit mdat before we've found moov, record the position + * and move on. We can then come back to mdat later. + * This presumes the stream supports seeking backwards. + */ + case MAKEFOURCC('m','d','a','t'): + read_chunk_mdat(qtmovie, chunk_len, !found_moov); + if (found_moov) + return 1; + found_mdat = 1; + break; + + /* these following atoms can be skipped !!!! */ + case MAKEFOURCC('f','r','e','e'): + stream_skip(qtmovie->stream, chunk_len - 8); /* FIXME not 8 */ + break; + default: + fprintf(stderr, "(top) unknown chunk id: %c%c%c%c\n", + SPLITFOURCC(chunk_id)); + return 0; + } + + } + return 0; +} + + diff --git a/plugins/alac/demux.h b/plugins/alac/demux.h new file mode 100644 index 00000000..8447bf84 --- /dev/null +++ b/plugins/alac/demux.h @@ -0,0 +1,62 @@ +#ifndef DEMUX_H +#define DEMUX_H + +#ifdef _WIN32 + #include "stdint_win.h" +#else + #include +#endif + +#include "stream.h" + +typedef uint32_t fourcc_t; + +typedef struct +{ + int format_read; + + uint16_t num_channels; + uint16_t sample_size; + uint32_t sample_rate; + fourcc_t format; + void *buf; + + struct { + uint32_t sample_count; + uint32_t sample_duration; + } *time_to_sample; + uint32_t num_time_to_samples; + + uint32_t *sample_byte_size; + uint32_t num_sample_byte_sizes; + + uint32_t codecdata_len; + void *codecdata; + + uint32_t mdat_len; +#if 0 + void *mdat; +#endif +} demux_res_t; + +int qtmovie_read(stream_t *stream, demux_res_t *demux_res); + +#ifndef MAKEFOURCC +#define MAKEFOURCC(ch0, ch1, ch2, ch3) ( \ + ( (int32_t)(char)(ch0) << 24 ) | \ + ( (int32_t)(char)(ch1) << 16 ) | \ + ( (int32_t)(char)(ch2) << 8 ) | \ + ( (int32_t)(char)(ch3) ) ) +#endif + +#ifndef SLPITFOURCC +/* splits it into ch0, ch1, ch2, ch3 - use for printf's */ +#define SPLITFOURCC(code) \ + (char)((int32_t)code >> 24), \ + (char)((int32_t)code >> 16), \ + (char)((int32_t)code >> 8), \ + (char)code +#endif + +#endif /* DEMUX_H */ + diff --git a/plugins/alac/stdint_win.h b/plugins/alac/stdint_win.h new file mode 100644 index 00000000..a580eb7f --- /dev/null +++ b/plugins/alac/stdint_win.h @@ -0,0 +1,14 @@ + +#ifndef ALAC_STDINT_WIN_H__ +#define ALAC_STDINT_WIN_H__ + +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef signed __int64 int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; + +#endif // ALAC_STDINT_WIN_H__ \ No newline at end of file diff --git a/plugins/alac/stream.c b/plugins/alac/stream.c new file mode 100644 index 00000000..4976a539 --- /dev/null +++ b/plugins/alac/stream.c @@ -0,0 +1,179 @@ +/* + * ALAC (Apple Lossless Audio Codec) decoder + * Copyright (c) 2005 David Hammerton + * All rights reserved. + * + * Basic stream reading + * + * http://crazney.net/programs/itunes/alac.html + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +#include +#include +#ifdef _WIN32 + #include "stdint_win.h" +#else + #include +#endif + +#include "stream.h" + +extern DB_functions_t *deadbeef; + +#define _Swap32(v) do { \ + v = (((v) & 0x000000FF) << 0x18) | \ + (((v) & 0x0000FF00) << 0x08) | \ + (((v) & 0x00FF0000) >> 0x08) | \ + (((v) & 0xFF000000) >> 0x18); } while(0) + +#define _Swap16(v) do { \ + v = (((v) & 0x00FF) << 0x08) | \ + (((v) & 0xFF00) >> 0x08); } while (0) + +extern int host_bigendian; + +struct stream_tTAG { + DB_FILE *f; + int bigendian; + int eof; +}; + +void stream_read(stream_t *stream, size_t size, void *buf) +{ + size_t ret; + + ret = deadbeef->fread(buf, 4, size >> 2, stream->f) * 4; + ret += deadbeef->fread((char*)buf + ret, 1, size - ret, stream->f); + + if (ret == 0 && size != 0) stream->eof = 1; +} + +int32_t stream_read_int32(stream_t *stream) +{ + int32_t v; + stream_read(stream, 4, &v); + if ((stream->bigendian && !host_bigendian) || + (!stream->bigendian && host_bigendian)) + { + _Swap32(v); + } + return v; +} + +uint32_t stream_read_uint32(stream_t *stream) +{ + uint32_t v; + stream_read(stream, 4, &v); + if ((stream->bigendian && !host_bigendian) || + (!stream->bigendian && host_bigendian)) + { + _Swap32(v); + } + return v; +} + +int16_t stream_read_int16(stream_t *stream) +{ + int16_t v; + stream_read(stream, 2, &v); + if ((stream->bigendian && !host_bigendian) || + (!stream->bigendian && host_bigendian)) + { + _Swap16(v); + } + return v; +} + +uint16_t stream_read_uint16(stream_t *stream) +{ + uint16_t v; + stream_read(stream, 2, &v); + if ((stream->bigendian && !host_bigendian) || + (!stream->bigendian && host_bigendian)) + { + _Swap16(v); + } + return v; +} + +int8_t stream_read_int8(stream_t *stream) +{ + int8_t v; + stream_read(stream, 1, &v); + return v; +} + +uint8_t stream_read_uint8(stream_t *stream) +{ + uint8_t v; + stream_read(stream, 1, &v); + return v; +} + + +void stream_skip(stream_t *stream, size_t skip) +{ + if (deadbeef->fseek(stream->f, (long)skip, SEEK_CUR) == 0) return; + if (errno == ESPIPE) + { + char *buffer = malloc(skip); + stream_read(stream, skip, buffer); + free(buffer); + } +} + +int stream_eof(stream_t *stream) +{ + return stream->eof; +} + +long stream_tell(stream_t *stream) +{ + return deadbeef->ftell(stream->f); /* returns -1 on error */ +} + +int stream_setpos(stream_t *stream, long pos) +{ + return deadbeef->fseek(stream->f, pos, SEEK_SET); +} + +stream_t *stream_create_file(DB_FILE *file, + int bigendian) +{ + stream_t *new_stream; + + new_stream = (stream_t*)malloc(sizeof(stream_t)); + new_stream->f = file; + new_stream->bigendian = bigendian; + new_stream->eof = 0; + + return new_stream; +} + +void stream_destroy(stream_t *stream) +{ + free(stream); +} + diff --git a/plugins/alac/stream.h b/plugins/alac/stream.h new file mode 100644 index 00000000..ae5881e4 --- /dev/null +++ b/plugins/alac/stream.h @@ -0,0 +1,39 @@ +#ifndef STREAM_H +#define STREAM_H + +/* stream.h */ + +#ifdef _WIN32 + #include "stdint_win.h" +#else + #include +#endif + +#include "../../deadbeef.h" + +typedef struct stream_tTAG stream_t; + +void stream_read(stream_t *stream, size_t len, void *buf); + +int32_t stream_read_int32(stream_t *stream); +uint32_t stream_read_uint32(stream_t *stream); + +int16_t stream_read_int16(stream_t *stream); +uint16_t stream_read_uint16(stream_t *stream); + +int8_t stream_read_int8(stream_t *stream); +uint8_t stream_read_uint8(stream_t *stream); + +void stream_skip(stream_t *stream, size_t skip); + +int stream_eof(stream_t *stream); + +long stream_tell(stream_t *stream); +int stream_setpos(stream_t *stream, long pos); + +stream_t *stream_create_file(DB_FILE *file, + int bigendian); +void stream_destroy(stream_t *stream); + +#endif /* STREAM_H */ + diff --git a/scripts/quickinstall.sh b/scripts/quickinstall.sh index 7fd71958..ca09088b 100755 --- a/scripts/quickinstall.sh +++ b/scripts/quickinstall.sh @@ -46,3 +46,4 @@ cp ./plugins/converter/.libs/converter_gtk3.so /usr/local/lib/deadbeef/ cp ./plugins/soundtouch/ddb_soundtouch.so /usr/local/lib/deadbeef/ cp ./plugins/vfs_zip/.libs/vfs_zip.so /usr/local/lib/deadbeef/ cp ./plugins/mono2stereo/.libs/ddb_mono2stereo.so /usr/local/lib/deadbeef/ +cp ./plugins/alac/.libs/alac.so /usr/local/lib/deadbeef/ -- cgit v1.2.3