From: <kak...@us...> - 2008-03-06 00:25:39
|
Revision: 9630 http://amsn.svn.sourceforge.net/amsn/?rev=9630&view=rev Author: kakaroto Date: 2008-03-05 16:25:43 -0800 (Wed, 05 Mar 2008) Log Message: ----------- Added aio extension. Use libao for audio output. Add libao checks for configure Sound now works great!!!!!!!!!! Modified Paths: -------------- branches/video_conf/Makefile.in branches/video_conf/configure branches/video_conf/configure.ac branches/video_conf/msncam.tcl Added Paths: ----------- branches/video_conf/aclocal.m4 branches/video_conf/utils/aio/ branches/video_conf/utils/aio/Rules.mk branches/video_conf/utils/aio/pkgIndex.tcl branches/video_conf/utils/aio/src/ branches/video_conf/utils/aio/src/Rules.mk branches/video_conf/utils/aio/src/aio.c branches/video_conf/utils/aio/src/aio.h Modified: branches/video_conf/Makefile.in =================================================================== --- branches/video_conf/Makefile.in 2008-03-05 11:22:40 UTC (rev 9629) +++ branches/video_conf/Makefile.in 2008-03-06 00:25:43 UTC (rev 9630) @@ -29,6 +29,7 @@ linflash_dir := $(srcdir)/utils/linux/linflash tclISF_dir := $(srcdir)/utils/tclISF macosx_dir := $(srcdir)/utils/macosx +aio_dir := $(srcdir)/utils/aio # programs CC := @CC@ @@ -102,6 +103,7 @@ ifeq ($(HAVE_LIBAVCODEC),yes) CFLAGS += -DHAVE_LIBAVCODEC endif +CFLAGS += @AO_CFLAGS@ CXXFLAGS := $(CFLAGS) @@ -136,6 +138,7 @@ LDFLAGS += ${TCL_STUB_LIB_SPEC} LDFLAGS += ${TK_STUB_LIB_SPEC} +LDFLAGS += @AO_LIBS@ #AppMain.tcl is needed by MacOSX : do not try to simplify by moving it outside the ifeq/else. ifeq ($(FOUND_OS),linux) @@ -266,6 +269,9 @@ include $(tcl_siren_dir)/Rules.mk include $(tcl_siren_dir)/src/Rules.mk +include $(aio_dir)/Rules.mk +include $(aio_dir)/src/Rules.mk + include $(tclISF_dir)/Rules.mk include $(tclISF_dir)/src/Rules.mk include $(tclISF_dir)/src/libISF/Rules.mk Added: branches/video_conf/aclocal.m4 =================================================================== --- branches/video_conf/aclocal.m4 (rev 0) +++ branches/video_conf/aclocal.m4 2008-03-06 00:25:43 UTC (rev 9630) @@ -0,0 +1,112 @@ +# ao.m4 +# Configure paths for libao +# Jack Moffitt <ja...@ic...> 10-21-2000 +# Shamelessly stolen from Owen Taylor and Manish Singh + +dnl XIPH_PATH_AO([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libao, and define AO_CFLAGS and AO_LIBS +dnl +AC_DEFUN([XIPH_PATH_AO], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(ao,[ --with-ao=PFX Prefix where libao is installed (optional)], ao_prefix="$withval", ao_prefix="") +AC_ARG_WITH(ao-libraries,[ --with-ao-libraries=DIR Directory where libao library is installed (optional)], ao_libraries="$withval", ao_libraries="") +AC_ARG_WITH(ao-includes,[ --with-ao-includes=DIR Directory where libao header files are installed (optional)], ao_includes="$withval", ao_includes="") +AC_ARG_ENABLE(aotest, [ --disable-aotest Do not try to compile and run a test ao program],, enable_aotest=yes) + + + if test "x$ao_libraries" != "x" ; then + AO_LIBS="-L$ao_libraries" + elif test "x$ao_prefix" != "x"; then + AO_LIBS="-L$ao_prefix/lib" + elif test "x$prefix" != "xNONE"; then + AO_LIBS="-L$prefix/lib" + fi + + if test "x$ao_includes" != "x" ; then + AO_CFLAGS="-I$ao_includes" + elif test "x$ao_prefix" != "x"; then + AO_CFLAGS="-I$ao_prefix/include" + elif test "x$prefix" != "xNONE"; then + AO_CFLAGS="-I$prefix/include" + fi + + # see where dl* and friends live + AC_CHECK_FUNCS(dlopen, [AO_DL_LIBS=""], [ + AC_CHECK_LIB(dl, dlopen, [AO_DL_LIBS="-ldl"], [ + AC_MSG_WARN([could not find dlopen() needed by libao sound drivers + your system may not be supported.]) + ]) + ]) + + AO_LIBS="$AO_LIBS -lao $AO_DL_LIBS" + + AC_MSG_CHECKING(for ao) + no_ao="" + + + if test "x$enable_aotest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $AO_CFLAGS" + LIBS="$LIBS $AO_LIBS" +dnl +dnl Now check if the installed ao is sufficiently new. +dnl + rm -f conf.aotest + AC_TRY_RUN([ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ao/ao.h> + +int main () +{ + system("touch conf.aotest"); + return 0; +} + +],, no_ao=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_ao" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.aotest ; then + : + else + echo "*** Could not run ao test program, checking why..." + CFLAGS="$CFLAGS $AO_CFLAGS" + LIBS="$LIBS $AO_LIBS" + AC_TRY_LINK([ +#include <stdio.h> +#include <ao/ao.h> +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding ao or finding the wrong" + echo "*** version of ao. If it is not finding ao, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means ao was incorrectly installed" + echo "*** or that you have moved ao since it was installed." ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + AO_CFLAGS="" + AO_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(AO_CFLAGS) + AC_SUBST(AO_LIBS) + rm -f conf.aotest +]) Modified: branches/video_conf/configure =================================================================== --- branches/video_conf/configure 2008-03-05 11:22:40 UTC (rev 9629) +++ branches/video_conf/configure 2008-03-06 00:25:43 UTC (rev 9630) @@ -682,6 +682,8 @@ TCL_STUB_LIB_SPEC TK_STUB_LIB_SPEC HAVE_LIBAVCODEC +AO_CFLAGS +AO_LIBS CXX_LIB LDLIBS FOUND_X11 @@ -1287,12 +1289,16 @@ --enable-debug enable some debugging information --enable-static enable static link of libstdc++ --disable-version-check Disable checking that linked tcl/tk version is the same version that bin program tclsh + --disable-aotest Do not try to compile and run a test ao program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl=DIR use Tcl binaries from DIR --with-tk=DIR use Tk binaries from DIR + --with-ao=PFX Prefix where libao is installed (optional) + --with-ao-libraries=DIR Directory where libao library is installed (optional) + --with-ao-includes=DIR Directory where libao header files are installed (optional) --with-x use the X Window System Some influential environment variables: @@ -3540,6 +3546,386 @@ +# Check whether --with-ao was given. +if test "${with_ao+set}" = set; then + withval=$with_ao; ao_prefix="$withval" +else + ao_prefix="" +fi + + +# Check whether --with-ao-libraries was given. +if test "${with_ao_libraries+set}" = set; then + withval=$with_ao_libraries; ao_libraries="$withval" +else + ao_libraries="" +fi + + +# Check whether --with-ao-includes was given. +if test "${with_ao_includes+set}" = set; then + withval=$with_ao_includes; ao_includes="$withval" +else + ao_includes="" +fi + +# Check whether --enable-aotest was given. +if test "${enable_aotest+set}" = set; then + enableval=$enable_aotest; +else + enable_aotest=yes +fi + + + + if test "x$ao_libraries" != "x" ; then + AO_LIBS="-L$ao_libraries" + elif test "x$ao_prefix" != "x"; then + AO_LIBS="-L$ao_prefix/lib" + elif test "x$prefix" != "xNONE"; then + AO_LIBS="-L$prefix/lib" + fi + + if test "x$ao_includes" != "x" ; then + AO_CFLAGS="-I$ao_includes" + elif test "x$ao_prefix" != "x"; then + AO_CFLAGS="-I$ao_prefix/include" + elif test "x$prefix" != "xNONE"; then + AO_CFLAGS="-I$prefix/include" + fi + + # see where dl* and friends live + +for ac_func in dlopen +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + AO_DL_LIBS="" +else + + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + AO_DL_LIBS="-ldl" +else + + { echo "$as_me:$LINENO: WARNING: could not find dlopen() needed by libao sound drivers + your system may not be supported." >&5 +echo "$as_me: WARNING: could not find dlopen() needed by libao sound drivers + your system may not be supported." >&2;} + +fi + + +fi +done + + + AO_LIBS="$AO_LIBS -lao $AO_DL_LIBS" + + { echo "$as_me:$LINENO: checking for ao" >&5 +echo $ECHO_N "checking for ao... $ECHO_C" >&6; } + no_ao="" + + + if test "x$enable_aotest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $AO_CFLAGS" + LIBS="$LIBS $AO_LIBS" + rm -f conf.aotest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ao/ao.h> + +int main () +{ + system("touch conf.aotest"); + return 0; +} + + +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +no_ao=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_ao" = "x" ; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + : + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + if test -f conf.aotest ; then + : + else + echo "*** Could not run ao test program, checking why..." + CFLAGS="$CFLAGS $AO_CFLAGS" + LIBS="$LIBS $AO_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include <stdio.h> +#include <ao/ao.h> + +int +main () +{ + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding ao or finding the wrong" + echo "*** version of ao. If it is not finding ao, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means ao was incorrectly installed" + echo "*** or that you have moved ao since it was installed." +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + AO_CFLAGS="" + AO_LIBS="" + { { echo "$as_me:$LINENO: error: libao required!" >&5 +echo "$as_me: error: libao required!" >&2;} + { (exit 1); exit 1; }; } + fi + + + rm -f conf.aotest + + + + + + + { echo "$as_me:$LINENO: checking for main in -lstdc++" >&5 echo $ECHO_N "checking for main in -lstdc++... $ECHO_C" >&6; } if test "${ac_cv_lib_stdcpp_main+set}" = set; then @@ -7207,6 +7593,8 @@ TCL_STUB_LIB_SPEC!$TCL_STUB_LIB_SPEC$ac_delim TK_STUB_LIB_SPEC!$TK_STUB_LIB_SPEC$ac_delim HAVE_LIBAVCODEC!$HAVE_LIBAVCODEC$ac_delim +AO_CFLAGS!$AO_CFLAGS$ac_delim +AO_LIBS!$AO_LIBS$ac_delim CXX_LIB!$CXX_LIB$ac_delim LDLIBS!$LDLIBS$ac_delim FOUND_X11!$FOUND_X11$ac_delim @@ -7225,7 +7613,7 @@ LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 85; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 87; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 Modified: branches/video_conf/configure.ac =================================================================== --- branches/video_conf/configure.ac 2008-03-05 11:22:40 UTC (rev 9629) +++ branches/video_conf/configure.ac 2008-03-06 00:25:43 UTC (rev 9630) @@ -399,6 +399,12 @@ AC_SUBST(HAVE_LIBAVCODEC) +XIPH_PATH_AO(,AC_MSG_ERROR(libao required!)) + +AC_SUBST(AO_LIBS) +AC_SUBST(AO_CFLAGS) + + dnl --------------------------------------------------------------------- dnl do some OS specific stuff here Modified: branches/video_conf/msncam.tcl =================================================================== --- branches/video_conf/msncam.tcl 2008-03-05 11:22:40 UTC (rev 9629) +++ branches/video_conf/msncam.tcl 2008-03-06 00:25:43 UTC (rev 9630) @@ -94,6 +94,11 @@ set window_in [getObjOption $sid window_in] set window_out [getObjOption $sid window_out] + set sock [getObjOption $sid socket] + set snd [getObjOption $sock audio_snd_in ""] + + catch {::Aio::Close $snd} + #draw a notification in the window (gui) ::CAMGUI::CamCanceled $chatid $sid @@ -916,41 +921,28 @@ #status_log "It's an audio frame!" red set dec [getObjOption $sock audio_dec ""] - set snd1 [getObjOption $sock audio_snd_in1 ""] - set snd2 [getObjOption $sock audio_snd_in2 ""] set snd [getObjOption $sock audio_snd_in ""] - if {$dec == "" || $snd1 == "" || $snd2 == "" } { - if { [catch {require_snack} ] || [package vcompare [set ::snack::patchLevel] 2.2.9] < 0 || [catch {package require tcl_siren }] } { + if {$dec == "" || $snd == "" } { + if { [catch {package require aio} ] || [catch {package require tcl_siren }] } { # Handle error: no snack - status_log "no snack/tcl_siren" red + status_log "no aio/tcl_siren" red return } else { + if { [catch {set snd [::Aio::Open]} res] } { + status_log "aio::open error : $res" red + return + + } set dec [::Siren::NewDecoder] setObjOption $sock audio_dec $dec - set snd1 [::snack::sound] - set snd2 [::snack::sound] - set snd $snd1 - setObjOption $sock audio_snd_in1 $snd1 - setObjOption $sock audio_snd_in2 $snd2 setObjOption $sock audio_snd_in $snd } } binary scan $data si unk counter set data [string range $data 6 end] - set raw [::Siren::Decode $dec $data] #status_log "Counter is $counter!" red - $snd append $raw -rate 16000 -channels 1 -fileformat RAW - if { [$snd length] >= 16000 } { - $snd play - if { $snd == $snd1 } { - $snd2 flush - setObjOption $sock audio_snd_in $snd2 - } else { - $snd1 flush - setObjOption $sock audio_snd_in $snd1 - } - } + ::Aio::Play $snd [::Siren::Decode $dec $data] } else { #setObjOption $sock state "END" status_log "ERROR4 : Received AV frame with code $code non A/V. Payload if $size : \n$data" red Added: branches/video_conf/utils/aio/Rules.mk =================================================================== --- branches/video_conf/utils/aio/Rules.mk (rev 0) +++ branches/video_conf/utils/aio/Rules.mk 2008-03-06 00:25:43 UTC (rev 9630) @@ -0,0 +1,14 @@ +OBJS-aio := $(aio_dir)/src/aio.$(SHLIB_EXTENSION) +TARGETS-aio := $(aio_dir)/aio.$(SHLIB_EXTENSION) + + +$(TARGETS-aio): $(OBJS-aio) + cp $< $@ + + +all:: $(TARGETS-aio) + +clean:: clean-aio + +clean-aio:: + rm -f $(TARGETS-aio) $(OBJS-aio) Added: branches/video_conf/utils/aio/pkgIndex.tcl =================================================================== --- branches/video_conf/utils/aio/pkgIndex.tcl (rev 0) +++ branches/video_conf/utils/aio/pkgIndex.tcl 2008-03-06 00:25:43 UTC (rev 9630) @@ -0,0 +1,5 @@ +# Tcl package index file + +if {[package vcompare [info tclversion] 8.4] < 0} return + +package ifneeded aio 0.1 "[list load [file join $dir aio[info shared]]];package provide aio 0.1" Added: branches/video_conf/utils/aio/src/Rules.mk =================================================================== --- branches/video_conf/utils/aio/src/Rules.mk (rev 0) +++ branches/video_conf/utils/aio/src/Rules.mk 2008-03-06 00:25:43 UTC (rev 9630) @@ -0,0 +1,12 @@ +OBJS-aio := $(aio_dir)/src/aio.o +TARGETS-aio := $(aio_dir)/src/aio.$(SHLIB_EXTENSION) + +$(TARGETS-aio): $(OBJS-aio) + +all:: $(TARGETS-aio) + +clean:: clean-aio + +clean-aio:: + rm -f $(TARGETS-aio) $(OBJS-aio) + Added: branches/video_conf/utils/aio/src/aio.c =================================================================== --- branches/video_conf/utils/aio/src/aio.c (rev 0) +++ branches/video_conf/utils/aio/src/aio.c 2008-03-06 00:25:43 UTC (rev 9630) @@ -0,0 +1,208 @@ +/* + File : aio.c + + Description : Contains all functions for accessing the libao/libai library + + Author : Youness El Alaoui (KaKaRoTo - kak...@us...) +*/ + + +// Include the header file +#include "aio.h" + +int device_counter = 0; +Tcl_HashTable *devices = NULL; + +int Aio_Open _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])) +{ + + int driver; + ao_device *device; + ao_sample_format format; + char name[15]; + char * req_name = NULL; + static char device_prefix[] = "device"; + Tcl_HashEntry *hPtr; + int newHash; + + // We verify the arguments + if( objc > 2) { + Tcl_WrongNumArgs(interp, 1, objv, "?name?"); + return TCL_ERROR; + } + + if ( objc == 2) { + // Set the requested name and see if it exists... + req_name = Tcl_GetStringFromObj(objv[2], NULL); + if (Tcl_FindHashEntry(devices, req_name) == NULL) { + strcpy(name, req_name); + }else { + sprintf(name, "%s%d", device_prefix, ++device_counter); + } + } else { + sprintf(name, "%s%d", device_prefix, ++device_counter); + } + + driver = ao_driver_id("alsa09"); + //driver = ao_default_driver_id(); + + format.bits = 16; + format.channels = 1; + format.rate = 16000; + format.byte_format = AO_FMT_LITTLE; + + /* -- Open driver -- */ + device = ao_open_live(driver, &format, NULL /* no options */); + + if (device == NULL) { + driver = ao_driver_id("oss"); + device = ao_open_live(driver, &format, NULL /* no options */); + if (device == NULL) { + Tcl_AppendResult(interp, "Unable to open device", NULL); + return TCL_ERROR; + } + + } + + hPtr = Tcl_CreateHashEntry(devices, name, &newHash); + Tcl_SetHashValue(hPtr, (ClientData) device); + + Tcl_ResetResult(interp); + Tcl_AppendResult(interp, name, NULL); + + return TCL_OK; + +} + + +int Aio_Play _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])) +{ + char * name = NULL; + ao_device *device; + Tcl_HashEntry *hPtr; + unsigned char* input = NULL; + int dataSize; + + // We verify the arguments + if( objc != 3) { + Tcl_WrongNumArgs(interp, 1, objv, "name data"); + return TCL_ERROR; + } + + name = Tcl_GetStringFromObj(objv[1], NULL); + + + hPtr = Tcl_FindHashEntry(devices, name); + if (hPtr != NULL) { + device = (ao_device *) Tcl_GetHashValue(hPtr); + } + + if (!device) { + Tcl_AppendResult (interp, "Invalid device : " , name, (char *) NULL); + return TCL_ERROR; + } + + input = Tcl_GetByteArrayFromObj(objv[2], &dataSize); + + ao_play(device, input, dataSize); + + return TCL_OK; +} + + +int Aio_Record _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])) +{ + + Tcl_AppendResult (interp, "Not Implemented" , (char *) NULL); + return TCL_ERROR; +} + +int Aio_PlayWav _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])) +{ + + Tcl_AppendResult (interp, "Not Implemented" , (char *) NULL); + return TCL_ERROR; +} + + +int Aio_Close _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])) +{ + char * name = NULL; + ao_device *device; + Tcl_HashEntry *hPtr; + + // We verify the arguments + if ( objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "name"); + return TCL_ERROR; + } + + name = Tcl_GetStringFromObj(objv[1], NULL); + + hPtr = Tcl_FindHashEntry(devices, name); + if (hPtr != NULL) { + device = (ao_device *) Tcl_GetHashValue(hPtr); + } + + if (!device) { + Tcl_AppendResult (interp, "Invalid device : " , name, (char *) NULL); + return TCL_ERROR; + } + + ao_close(device); + + Tcl_DeleteHashEntry(hPtr); + + return TCL_OK; + +} + + +int Aio_Init (Tcl_Interp *interp ) { + + + //Check Tcl version is 8.3 or higher + if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL) { + return TCL_ERROR; + } + + ao_initialize(); + + devices = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable)); + Tcl_InitHashTable(devices, TCL_STRING_KEYS); + + + // Create the wrapping commands in the AIO namespace linked to custom functions with a NULL clientdata and + // no deleteproc inside the current interpreter + Tcl_CreateObjCommand(interp, "::Aio::Open", Aio_Open, + (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); + Tcl_CreateObjCommand(interp, "::Aio::Play", Aio_Play, + (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); + Tcl_CreateObjCommand(interp, "::Aio::PlayWav", Aio_PlayWav, + (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); + Tcl_CreateObjCommand(interp, "::Aio::Record", Aio_Record, + (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); + Tcl_CreateObjCommand(interp, "::Aio::Close", Aio_Close, + (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); + + // end of Initialisation + return TCL_OK; +} +int Aio_SafeInit (Tcl_Interp *interp) { + return Aio_Init(interp); +} Added: branches/video_conf/utils/aio/src/aio.h =================================================================== --- branches/video_conf/utils/aio/src/aio.h (rev 0) +++ branches/video_conf/utils/aio/src/aio.h 2008-03-06 00:25:43 UTC (rev 9630) @@ -0,0 +1,80 @@ +/* + File : aio.h + + Description : Header file for the aio extension for tcl. + + Author : Youness El Alaoui ( KaKaRoTo - kak...@us...) + + */ + +#ifndef _AIO +#define _AIO + +// Include files, must include windows.h before tk.h and tcl.h before tk.h or else compiling errors +#include <stdlib.h> + +#include <ao/ao.h> + +#include <tcl.h> + + +// Defined as described in tcl.tk compiling extension help +#ifndef STATIC_BUILD + +#if defined(_MSC_VER) +# define EXPORT(a,b) __declspec(dllexport) a b +# define DllEntryPoint DllMain +#else +# if defined(__BORLANDC__) +# define EXPORT(a,b) a _export b +# else +# define EXPORT(a,b) a b +# endif +#endif +#endif + + +#define DLL_BUILD +#define BUILD_AIO + +#ifdef BUILD_AIO +# undef TCL_STORAGE_CLASS +# define TCL_STORAGE_CLASS DLLEXPORT +#endif + +#ifdef __cplusplus +extern "C" +#endif + +// External functions +EXTERN int Aio_Init _ANSI_ARGS_((Tcl_Interp *interp)); +EXTERN int Aio_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); + +EXTERN int Aio_Open _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])); +EXTERN int Aio_Play _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])); + +EXTERN int Aio_PlayWav _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])); + +EXTERN int Aio_Record _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])); + +EXTERN int Aio_Close _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[])); + + +# undef TCL_STORAGE_CLASS +# define TCL_STORAGE_CLASS DLLIMPORT +#endif /* _AIO */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |