From 15f49a14971c4977e37bc09aa54d116eef2fab98 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Thu, 16 Feb 2012 19:26:16 +0000 Subject: [PATCH] Fix compile problem when old version of libvorbisfile v1.1.2 is used. The principle difference between libvorbisfile v1.1.2 and newer (at least v1.2.0) is the addition of the predefined callbacks OV_CALLBACKS_xxx in vorbis/vorbisfile.h used for ov_open_callbacks(). * Updated the configure script to detect if libvorbisfile.h declares OV_CALLBACKS_NOCLOSE. * Copied the declaration of OV_CALLBACKS_NOCLOSE from v1.2.0 to allow v1.1.2 to compile. (closes issue ASTERISK-19370) Reported by: Jonn Taylor git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@355608 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- autoconf/ast_c_declare_check.m4 | 31 ++++++++++++++ configure | 72 +++++++++++++++++++++++++++++++- configure.ac | 1 + formats/format_ogg_vorbis.c | 21 ++++++++++ include/asterisk/autoconfig.h.in | 3 ++ 5 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 autoconf/ast_c_declare_check.m4 diff --git a/autoconf/ast_c_declare_check.m4 b/autoconf/ast_c_declare_check.m4 new file mode 100644 index 0000000000..89fb8063dc --- /dev/null +++ b/autoconf/ast_c_declare_check.m4 @@ -0,0 +1,31 @@ +# Check if a given symbol is declared using a certain header. +# Check whether SYMBOL (a function, variable, or constant) is declared. + +# AST_C_DECLARE_CHECK([package], [symbol], [header file], [version]) +AC_DEFUN([AST_C_DECLARE_CHECK], +[ + if test "x${PBX_$1}" != "x1" -a "${USE_$1}" != "no"; then + AC_MSG_CHECKING([for $2 declared in $3]) + saved_cppflags="${CPPFLAGS}" + if test "x${$1_DIR}" != "x"; then + $1_INCLUDE="-I${$1_DIR}/include" + fi + CPPFLAGS="${CPPFLAGS} ${$1_INCLUDE}" + + AC_COMPILE_IFELSE( + [ AC_LANG_PROGRAM( [#include <$3>], + [#if !defined($2) + (void) $2; + #endif + ])], + [ AC_MSG_RESULT(yes) + PBX_$1=1 + AC_DEFINE([HAVE_$1], 1, [Define if your system has $2 declared.]) + m4_ifval([$4], [AC_DEFINE([HAVE_$1_VERSION], $4, [Define $1 headers version])]) + ], + [ AC_MSG_RESULT(no) ] + ) + + CPPFLAGS="${saved_cppflags}" + fi +]) diff --git a/configure b/configure index 9eea0f5c34..65b4b26ba0 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac Revision: 350837 . +# From configure.ac Revision: 355365 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.63 for asterisk trunk. # @@ -53271,6 +53271,76 @@ fi fi + if test "x${PBX_VORBIS_OPEN_CALLBACKS}" != "x1" -a "${USE_VORBIS_OPEN_CALLBACKS}" != "no"; then + { $as_echo "$as_me:$LINENO: checking for OV_CALLBACKS_NOCLOSE declared in vorbis/vorbisfile.h" >&5 +$as_echo_n "checking for OV_CALLBACKS_NOCLOSE declared in vorbis/vorbisfile.h... " >&6; } + saved_cppflags="${CPPFLAGS}" + if test "x${VORBIS_OPEN_CALLBACKS_DIR}" != "x"; then + VORBIS_OPEN_CALLBACKS_INCLUDE="-I${VORBIS_OPEN_CALLBACKS_DIR}/include" + fi + CPPFLAGS="${CPPFLAGS} ${VORBIS_OPEN_CALLBACKS_INCLUDE}" + + cat >conftest.$ac_ext <<_ACEOF + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +#if !defined(OV_CALLBACKS_NOCLOSE) + (void) OV_CALLBACKS_NOCLOSE; + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + PBX_VORBIS_OPEN_CALLBACKS=1 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_VORBIS_OPEN_CALLBACKS 1 +_ACEOF + + + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + CPPFLAGS="${saved_cppflags}" + fi + + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' diff --git a/configure.ac b/configure.ac index 19c1a40597..584d8b348b 100644 --- a/configure.ac +++ b/configure.ac @@ -2081,6 +2081,7 @@ then else AST_EXT_LIB_CHECK([VORBIS], [vorbis], [vorbis_info_init], [vorbis/codec.h], [-lm -lvorbisenc -lvorbisfile]) fi +AST_C_DECLARE_CHECK([VORBIS_OPEN_CALLBACKS], [OV_CALLBACKS_NOCLOSE], [vorbis/vorbisfile.h]) AC_LANG_PUSH(C++) diff --git a/formats/format_ogg_vorbis.c b/formats/format_ogg_vorbis.c index 0784f00e34..579fb53c91 100644 --- a/formats/format_ogg_vorbis.c +++ b/formats/format_ogg_vorbis.c @@ -80,6 +80,27 @@ struct ogg_vorbis_desc { /* format specific parameters */ int eos; }; +#if !defined(HAVE_VORBIS_OPEN_CALLBACKS) +/* + * Declared for backward compatibility with vorbisfile v1.1.2. + * Code taken from vorbisfile.h v1.2.0. + */ +static int _ov_header_fseek_wrap(FILE *f, ogg_int64_t off, int whence) +{ + if (f == NULL) { + return -1; + } + return fseek(f, off, whence); +} + +static ov_callbacks OV_CALLBACKS_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) NULL, + (long (*)(void *)) ftell +}; +#endif /* !defined(HAVE_VORBIS_OPEN_CALLBACKS) */ + /*! * \brief Create a new OGG/Vorbis filestream and set it up for reading. * \param s File that points to on disk storage of the OGG/Vorbis data. diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index d34e9d327d..e9c91531a9 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -1009,6 +1009,9 @@ /* Define to 1 if you have the Vorbis library. */ #undef HAVE_VORBIS +/* Define if your system has OV_CALLBACKS_NOCLOSE declared. */ +#undef HAVE_VORBIS_OPEN_CALLBACKS + /* Define if your system has the VoiceTronix API libraries. */ #undef HAVE_VPB -- 2.47.2