Mercurial > pidgin
changeset 13293:44a8d46ee3c1
[gaim-migrate @ 15659]
Nobody minds if I revert all that mediastreamer stuff, do they?
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Thu, 16 Feb 2006 00:45:23 +0000 |
parents | 94255f5568d8 |
children | 8cecf7929eb3 |
files | autogen.sh configure.ac m4/.cvsignore m4/Makefile.am m4/ac_var_timezone_externals.m4 m4/artsc.m4 m4/esd.m4 m4/exosip.m4 m4/gnome-gnorba-check.m4 m4/gnome-orbit-check.m4 m4/gnome-pthread-check.m4 m4/gnome-x-checks.m4 m4/gnome.m4 m4/osip.m4 m4/speex.m4 src/Makefile.am src/core.c src/gtkblist.c src/gtkmain.c src/gtkmedia.c src/gtkmedia.h src/media.c src/media.h src/mediastreamer/Makefile.am src/mediastreamer/affine.c src/mediastreamer/affine.h src/mediastreamer/alsacard.c src/mediastreamer/alsacard.h src/mediastreamer/audiostream.c src/mediastreamer/g711common.h src/mediastreamer/hpuxsndcard.c src/mediastreamer/jackcard.c src/mediastreamer/jackcard.h src/mediastreamer/mediastream.c src/mediastreamer/mediastream.h src/mediastreamer/ms.c src/mediastreamer/ms.h src/mediastreamer/msAlawdec.c src/mediastreamer/msAlawdec.h src/mediastreamer/msAlawenc.c src/mediastreamer/msAlawenc.h src/mediastreamer/msGSMdecoder.c src/mediastreamer/msGSMdecoder.h src/mediastreamer/msGSMencoder.c src/mediastreamer/msGSMencoder.h src/mediastreamer/msLPC10decoder.c src/mediastreamer/msLPC10decoder.h src/mediastreamer/msLPC10encoder.c src/mediastreamer/msLPC10encoder.h src/mediastreamer/msMUlawdec.c src/mediastreamer/msMUlawdec.h src/mediastreamer/msMUlawenc.c src/mediastreamer/msMUlawenc.h src/mediastreamer/msavdecoder.c src/mediastreamer/msavdecoder.h src/mediastreamer/msavencoder.c src/mediastreamer/msavencoder.h src/mediastreamer/msbuffer.c src/mediastreamer/msbuffer.h src/mediastreamer/mscodec.c src/mediastreamer/mscodec.h src/mediastreamer/mscopy.c src/mediastreamer/mscopy.h src/mediastreamer/msfdispatcher.c src/mediastreamer/msfdispatcher.h src/mediastreamer/msfifo.c src/mediastreamer/msfifo.h src/mediastreamer/msfilter.c src/mediastreamer/msfilter.h src/mediastreamer/msilbcdec.c src/mediastreamer/msilbcdec.h src/mediastreamer/msilbcenc.c src/mediastreamer/msilbcenc.h src/mediastreamer/msnosync.c src/mediastreamer/msnosync.h src/mediastreamer/msossread.c src/mediastreamer/msossread.h src/mediastreamer/msosswrite.c src/mediastreamer/msosswrite.h src/mediastreamer/msqdispatcher.c src/mediastreamer/msqdispatcher.h src/mediastreamer/msqueue.c src/mediastreamer/msqueue.h src/mediastreamer/msread.c src/mediastreamer/msread.h src/mediastreamer/msringplayer.c src/mediastreamer/msringplayer.h src/mediastreamer/msrtprecv.c src/mediastreamer/msrtprecv.h src/mediastreamer/msrtpsend.c src/mediastreamer/msrtpsend.h src/mediastreamer/mssdlout.c src/mediastreamer/mssdlout.h src/mediastreamer/mssoundread.c src/mediastreamer/mssoundread.h src/mediastreamer/mssoundwrite.c src/mediastreamer/mssoundwrite.h src/mediastreamer/msspeexdec.c src/mediastreamer/msspeexdec.h src/mediastreamer/msspeexenc.c src/mediastreamer/msspeexenc.h src/mediastreamer/mssync.c src/mediastreamer/mssync.h src/mediastreamer/mstimer.c src/mediastreamer/mstimer.h src/mediastreamer/mstruespeechdecoder.c src/mediastreamer/mstruespeechdecoder.h src/mediastreamer/mstruespeechencoder.c src/mediastreamer/mstruespeechencoder.h src/mediastreamer/msutils.h src/mediastreamer/msv4l.c src/mediastreamer/msv4l.h src/mediastreamer/msvideosource.c src/mediastreamer/msvideosource.h src/mediastreamer/mswrite.c src/mediastreamer/mswrite.h src/mediastreamer/osscard.c src/mediastreamer/osscard.h src/mediastreamer/ring_test.c src/mediastreamer/sndcard.c src/mediastreamer/sndcard.h src/mediastreamer/test.c src/mediastreamer/test_alaw.c src/mediastreamer/test_gsm.c src/mediastreamer/test_lpc10.c src/mediastreamer/test_mulaw.c src/mediastreamer/test_rtprecv.c src/mediastreamer/test_speex.c src/mediastreamer/test_truespeech.c src/mediastreamer/test_v4l.c src/mediastreamer/test_videostream.c src/mediastreamer/videostream.c src/mediastreamer/waveheader.h src/prpl.h src/server.c |
diffstat | 135 files changed, 2 insertions(+), 16629 deletions(-) [+] |
line wrap: on
line diff
--- a/autogen.sh Wed Feb 15 23:02:50 2006 +0000 +++ b/autogen.sh Thu Feb 16 00:45:23 2006 +0000 @@ -47,7 +47,7 @@ libtoolize -c -f --automake intltoolize --force --copy -aclocal $ACLOCAL_FLAGS -I ./m4 || exit; +aclocal $ACLOCAL_FLAGS || exit; autoheader || exit; automake --add-missing --copy; autoconf || exit;
--- a/configure.ac Wed Feb 15 23:02:50 2006 +0000 +++ b/configure.ac Thu Feb 16 00:45:23 2006 +0000 @@ -1599,87 +1599,6 @@ AC_SUBST(enable_doxygen) AC_SUBST(enable_dot) -dnl ############################################################################## -dnl ## Mediastreamer stuff ####################################################### -dnl ############################################################################## -AC_ARG_ENABLE(vv, [ --enable-vv enable Voice and Video support],,enable_vv=no) -if test "x$enable_vv" = xyes; then - AC_DEFINE(HAVE_GLIB, 1, [Gaim always has GLib, but Linphone can be built without it]) - - dnl enable truespeech codec support - AC_ARG_ENABLE(truespeech, [ --enable-truespeech Turn on TrueSpeech support (x86 only)],,enable_truespeech=no) - TRUESPEECH_CFLAGS= - if test x$enable_truespeech = xyes ; then - TRUESPEECH_CFLAGS=-DTRUESPEECH - fi - VV_CFLAGS="$VV_CFLAGS $TRUESPEECH_CFLAGS" - - found_sound=no - AC_CHECK_HEADERS(soundcard.h sys/soundcard.h machine/soundcard.h sys/audio.h) - if test "${ac_cv_header_sys_soundcard_h}" = "yes" || \ - test "${ac_cv_header_soundcard_h}" = "yes" || \ - test "${ac_cv_header_sys_audio_h}" = "yes" || \ - test "${ac_cv_header_machine_soundcard_h}" = "yes"; then - found_sound=yes - fi - if test "$found_sound" = "no"; then - AC_MSG_ERROR([Could not find a support sound driver]) - fi - if test "$alsa" = "true"; then - AC_CHECK_HEADERS(alsa/asoundlib.h, - [ AC_CHECK_LIB(asound,snd_pcm_open, - [ALSA_LIBS="-lasound" ; AC_DEFINE(__ALSA_ENABLED__,1,[Defined when alsa support is enabled]) ]) - ] - ) - fi - dnl Check for samplerate libraries - dnl Check for jack libraries (sound output plugin) - PKG_CHECK_MODULES(JACK,jack >= 0.15.0, - [ - dnl we've found jack devel files - PKG_CHECK_MODULES(SAMPLERATE, samplerate >= 0.0.13, [ - AC_DEFINE(__JACK_ENABLED__,1,[Jack support]) - ], [ - AC_MSG_RESULT(no) - echo "libsamplerate not found, jack support disabled." - ]) - VV_CFLAGS="$VV_CFLAGS $SAMPLERATE_CFLAGS" - VV_LIBS="$VV_LIBS $SAMPLERATE_LIBS" - ], - [echo "No jack support."] ) - VV_CFLAGS="$VV_CFLAGS $JACK_CFLAGS" - VV_LIBS="$VV_LIBS $JACK_LIBS" - - dnl check for installed version of speex - LP_CHECK_SPEEX - VV_CFLAGS="$VV_CFLAGS $SPEEX_CFLAGS" - VV_LIBS="$VV_LIBS $SPEEX_LIBS" - - PKG_CHECK_MODULES(ORTP, ortp >= 0.7.1, [ - enable_ortp=yes, - ], [ - AC_MSG_RESULT(no) - enable_ortp=no - ]) - VV_CFLAGS="$VV_CFLAGS $ORTP_CFLAGS" - VV_LIBS="$VV_LIBS $ORTP_LIBS" - if test x$enable_ortp = xno; then - AC_MSG_ERROR([Could not find a suitable version of oRTP. Please install oRTP >= 0.7.1]) - fi -else - enable_vv=no -fi - -if test x$enable_vv = xyes; then - AM_CONDITIONAL(HAVE_VV, true) - AC_DEFINE(HAVE_VV, [1], [Compile with Voice/Video support]) -else - AM_CONDITIONAL(HAVE_VV, false) -fi - -AC_SUBST(VV_CFLAGS) -AC_SUBST(VV_LIBS) - AC_CONFIG_COMMANDS_PRE([ if test -e VERSION; then cp -p VERSION VERSION.ac-save @@ -1719,7 +1638,6 @@ po/Makefile.in sounds/Makefile src/Makefile - src/mediastreamer/Makefile src/protocols/Makefile src/protocols/bonjour/Makefile src/protocols/gg/Makefile @@ -1757,7 +1675,6 @@ echo Build with Tk support......... : $enable_tk echo Build with Audio support...... : $enable_audio echo Build with GtkSpell support... : $enable_gtkspell -echo Build with Voice/Video support : $enable_vv echo Build with DBUS support....... : $enable_dbus if test x$enable_dbus = xyes ; then echo DBUS session directory........ : $DBUS_SESSION_DIR
--- a/m4/.cvsignore Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -Makefile -Makefile.in
--- a/m4/Makefile.am Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -EXTRA_DIST = esd.m4 artsc.m4 ac_var_timezone_externals.m4
--- a/m4/ac_var_timezone_externals.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ - -# Define 'timezone', 'altzone' and 'daylight' -# http://www.gnu.org/software/ac-archive/Miscellaneous/ac_var_timezone_externals.html -# Use instead of 'AC_STRUCT_TIMEZONE' to determine whether the -# the external timezone variables 'timezone', 'altzone' and 'daylight' exist, -# defining 'HAVE_TIMEZONE', 'HAVE_ALTZONE' and 'HAVE_DAYLIGHT' respectively -# (as well as gaining the macros defined by 'AC_STRUCT_TIMEZONE'). -# Mark R.Bannister <markb@freedomware.co.uk> -AC_DEFUN([AC_VAR_TIMEZONE_EXTERNALS], -[ AC_REQUIRE([AC_STRUCT_TIMEZONE])dnl - AC_CACHE_CHECK(for timezone external, mb_cv_var_timezone, - [ AC_TRY_LINK([#include <time.h>], [return (int)timezone;], - mb_cv_var_timezone=yes, - mb_cv_var_timezone=no) - ]) - AC_CACHE_CHECK(for altzone external, mb_cv_var_altzone, - [ AC_TRY_LINK([#include <time.h>], [return (int)altzone;], - mb_cv_var_altzone=yes, - mb_cv_var_altzone=no) - ]) - AC_CACHE_CHECK(for daylight external, mb_cv_var_daylight, - [ AC_TRY_LINK([#include <time.h>], [return (int)daylight;], - mb_cv_var_daylight=yes, - mb_cv_var_daylight=no) - ]) - if test $mb_cv_var_timezone = yes; then - AC_DEFINE([HAVE_TIMEZONE], 1, - [Define if you have the external 'timezone' variable.]) - fi - if test $mb_cv_var_altzone = yes; then - AC_DEFINE([HAVE_ALTZONE], 1, - [Define if you have the external 'altzone' variable.]) - fi - if test $mb_cv_var_daylight = yes; then - AC_DEFINE([HAVE_DAYLIGHT], 1, - [Define if you have the external 'daylight' variable.]) - fi -])
--- a/m4/artsc.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -dnl Test for the ArtsC interface. - -AC_DEFUN([AM_PATH_ARTSC], -[ -AC_ARG_ENABLE(artsc-test, -[ --disable-artsc-test Do not compile and run a test ArtsC program.], -[artsc_test="yes"], -[artsc_test="no"]) - -dnl Search for the arts-config program. -AC_PATH_PROG(ARTSC_CONFIG, artsc-config, no) -min_artsc_version=ifelse([$1],,0.9.5,$1) -AC_MSG_CHECKING(for ArtsC - version >= $min_artsc_version) - -no_artsc="" -if test "x$ARTSC_CONFIG" != "xno"; then - ARTSC_CFLAGS=`$ARTSC_CONFIG --cflags` - ARTSC_LIBS=`$ARTSC_CONFIG --libs` - - artsc_major_version=`$ARTSC_CONFIG $artsc_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - artsc_minor_version=`$ARTSC_CONFIG $artsc_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - artsc_micro_version=`$ARTSC_CONFIG $artsc_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - - # Test if a simple ArtsC program can be created. - if test "x$artsc_test" = "xyes"; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $ARTSC_CFLAGS" - LIBS="$LIBS $ARTSC_LIBS" - - rm -f conf.artsc - AC_TRY_RUN([ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <artsc.h> - -char* -my_strdup(char *str) -{ - char *new_str; - - if (str) { - new_str = malloc((strlen(str) + 1) * sizeof(char)); - strcpy(new_str, str); - } else { - new_str = NULL; - } - - return new_str; -} - -int main() -{ - int major, minor, micro; - char *tmp_version; - - system ("touch conf.artsc"); - - /* HP/UX 9 writes to sscanf strings */ - tmp_version = my_strdup("$min_artsc_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_artsc_version"); - exit(1); - } - - if (($artsc_major_version > major) || - (($artsc_major_version == major) && ($artsc_minor_version > minor)) || - (($artsc_major_version == major) && ($artsc_minor_version == minor) - && ($artsc_micro_version >= micro))) { - return 0; - } else { - printf("\n*** 'artsc-config --version' returned %d.%d.%d, but the minimum version\n", $artsc_major_version, $artsc_minor_version, $artsc_micro_version); - printf("*** of ARTSC required is %d.%d.%d. If artsc-config is correct, then it is\n", major, minor, micro); - printf("*** best to upgrade to the required version.\n"); - printf("*** If artsc-config was wrong, set the environment variable ARTSC_CONFIG\n"); - printf("*** to point to the correct copy of artsc-config, and remove the file\n"); - printf("*** config.cache before re-running configure\n"); - return 1; - } -} -],, no_artsc=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi -else - no_artsc=yes -fi - -if test "x$no_artsc" != "xyes"; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) -else - AC_MSG_RESULT(no) - - if test "x$ARTSC_CONFIG" = "xno" ; then - echo "*** The artsc-config script installed by ArtsC could not be found" - echo "*** If ArtsC was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the ARTSC_CONFIG environment variable to the" - echo "*** full path to artsc-config." - else - if test -f conf.artsc ; then - : - else - echo "*** Could not run ArtsC test program, checking why..." - CFLAGS="$CFLAGS $ARTSC_CFLAGS" - LIBS="$LIBS $ARTSC_LIBS" - AC_TRY_LINK([ -#include <stdio.h> -#include <artsc.h> -],[return 0;], -[ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding ArtsC or finding the wrong" - echo "*** version of ArtsC. If it is not finding ArtsC, 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 ArtsC was incorrectly installed" - echo "*** or that you have moved ArtsC since it was installed. In the latter case, you" - echo "*** may want to edit the artsc-config script: $ARTSC_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - ARTSC_CFLAGS="" - ARTSC_LIBS="" - ifelse([$3], , :, [$3]) -fi - -AC_SUBST(ARTSC_CFLAGS) -AC_SUBST(ARTSC_LIBS) -rm -f conf.artsc - -])
--- a/m4/esd.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -# Configure paths for ESD -# Manish Singh 98-9-30 -# stolen back from Frank Belew -# stolen from Manish Singh -# Shamelessly stolen from Owen Taylor - -dnl AM_PATH_GESD([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -dnl Test for ESD, and define ESD_CFLAGS and ESD_LIBS -dnl -AC_DEFUN(AM_PATH_GESD, -[dnl -dnl Get the cflags and libraries from the esd-config script -dnl -AC_ARG_WITH(esd-prefix,[ --with-esd-prefix=PFX Prefix where ESD is installed (optional)], - esd_prefix="$withval", esd_prefix="") -AC_ARG_WITH(esd-exec-prefix,[ --with-esd-exec-prefix=PFX Exec prefix where ESD is installed (optional)], - esd_exec_prefix="$withval", esd_exec_prefix="") -AC_ARG_ENABLE(esdtest, [ --disable-esdtest Do not try to compile and run a test ESD program], - , enable_esdtest=yes) - - if test x$esd_exec_prefix != x ; then - esd_args="$esd_args --exec-prefix=$esd_exec_prefix" - if test x${ESD_CONFIG+set} != xset ; then - ESD_CONFIG=$esd_exec_prefix/bin/esd-config - fi - fi - if test x$esd_prefix != x ; then - esd_args="$esd_args --prefix=$esd_prefix" - if test x${ESD_CONFIG+set} != xset ; then - ESD_CONFIG=$esd_prefix/bin/esd-config - fi - fi - - AC_PATH_PROG(ESD_CONFIG, esd-config, no) - min_esd_version=ifelse([$1], ,0.2.7,$1) - AC_MSG_CHECKING(for ESD - version >= $min_esd_version) - no_esd="" - if test "$ESD_CONFIG" = "no" ; then - no_esd=yes - else - ESD_CFLAGS=`$ESD_CONFIG $esdconf_args --cflags` - ESD_LIBS=`$ESD_CONFIG $esdconf_args --libs` - - esd_major_version=`$ESD_CONFIG $esd_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - esd_minor_version=`$ESD_CONFIG $esd_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - esd_micro_version=`$ESD_CONFIG $esd_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_esdtest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $ESD_CFLAGS" - LIBS="$LIBS $ESD_LIBS" -dnl -dnl Now check if the installed ESD is sufficiently new. (Also sanity -dnl checks the results of esd-config to some extent -dnl - rm -f conf.esdtest - AC_TRY_RUN([ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <esd.h> - -char* -my_strdup (char *str) -{ - char *new_str; - - if (str) - { - new_str = malloc ((strlen (str) + 1) * sizeof(char)); - strcpy (new_str, str); - } - else - new_str = NULL; - - return new_str; -} - -int main () -{ - int major, minor, micro; - char *tmp_version; - - system ("touch conf.esdtest"); - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = my_strdup("$min_esd_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_esd_version"); - exit(1); - } - - if (($esd_major_version > major) || - (($esd_major_version == major) && ($esd_minor_version > minor)) || - (($esd_major_version == major) && ($esd_minor_version == minor) && ($esd_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** 'esd-config --version' returned %d.%d.%d, but the minimum version\n", $esd_major_version, $esd_minor_version, $esd_micro_version); - printf("*** of ESD required is %d.%d.%d. If esd-config is correct, then it is\n", major, minor, micro); - printf("*** best to upgrade to the required version.\n"); - printf("*** If esd-config was wrong, set the environment variable ESD_CONFIG\n"); - printf("*** to point to the correct copy of esd-config, and remove the file\n"); - printf("*** config.cache before re-running configure\n"); - return 1; - } -} - -],, no_esd=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_esd" = x ; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$ESD_CONFIG" = "no" ; then - echo "*** The esd-config script installed by ESD could not be found" - echo "*** If ESD was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the ESD_CONFIG environment variable to the" - echo "*** full path to esd-config." - else - if test -f conf.esdtest ; then - : - else - echo "*** Could not run ESD test program, checking why..." - CFLAGS="$CFLAGS $ESD_CFLAGS" - LIBS="$LIBS $ESD_LIBS" - AC_TRY_LINK([ -#include <stdio.h> -#include <esd.h> -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding ESD or finding the wrong" - echo "*** version of ESD. If it is not finding ESD, 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 ESD was incorrectly installed" - echo "*** or that you have moved ESD since it was installed. In the latter case, you" - echo "*** may want to edit the esd-config script: $ESD_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - ESD_CFLAGS="" - ESD_LIBS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(ESD_CFLAGS) - AC_SUBST(ESD_LIBS) - rm -f conf.esdtest -])
--- a/m4/exosip.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -AC_DEFUN([LP_SETUP_EXOSIP],[ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([LP_CHECK_OSIP2]) - -dnl eXosip embeded stuff -EXOSIP_CFLAGS="$OSIP_CFLAGS -DHAVE_PTHREAD -DOSIP_MT -DENABLE_TRACE -DNEW_TIMER -DSM -DMSN_SUPPORT -DUSE_TMP_BUFFER" -EXOSIP_LIBS="$OSIP_LIBS" -AC_CHECK_HEADERS(semaphore.h) -AC_CHECK_HEADERS(sys/sem.h) -case $target in - linux*) - EXOSIP_CFLAGS="$EXOSIP_CFLAGS -pedantic" - ;; - irix*) - ;; - hpux* | hp-ux*) - ;; - aix*) - ;; - osf*) - AC_CHECK_LIB(rt,sem_open,[EXOSIP_LIBS="$EXOSIP_LIBS -lrt"]) - ;; - sunos*) - ;; - darwin*) - EXOSIP_CFLAGS="$EXOSIP_CFLAGS -pedantic" - ;; - *) - ;; -esac - -AC_CHECK_LIB(posix4,sem_open,[EXOSIP_LIBS="$EXOSIP_LIBS -lposix4 -mt"]) -AC_CHECK_LIB(nsl,nis_add,[EXOSIP_LIBS="$EXOSIP_LIBS -lnsl"]) -AC_CHECK_LIB(socket,sendto,[EXOSIP_LIBS="$EXOSIP_LIBS -lsocket"]) -AC_CHECK_LIB(rt,clock_gettime,[EXOSIP_LIBS="$EXOSIP_LIBS -lrt"]) -dnl Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS(ctype.h) -AC_CHECK_HEADERS(string.h) -AC_CHECK_HEADERS(strings.h) -AC_CHECK_HEADERS(stdio.h) -AC_CHECK_HEADERS(stdlib.h) -AC_CHECK_HEADERS(unistd.h) -AC_CHECK_HEADERS(stdarg.h) -AC_CHECK_HEADERS(varargs.h) -AC_CHECK_HEADERS(sys/time.h) -AC_CHECK_HEADERS(assert.h) -AC_CHECK_HEADERS(signal.h) -AC_CHECK_HEADERS(sys/signal.h) -AC_CHECK_HEADERS(malloc.h) -AC_CHECK_HEADERS(sys/select.h) -AC_CHECK_HEADERS(sys/types.h) -AC_CHECK_HEADERS(fcntl.h) - -AC_SUBST(EXOSIP_CFLAGS) -AC_SUBST(EXOSIP_LIBS) -])
--- a/m4/gnome-gnorba-check.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -dnl -dnl GNOME_GNORBA_HOOK (script-if-gnorba-found, failflag) -dnl -dnl if failflag is "failure" it aborts if gnorba is not found. -dnl - -AC_DEFUN([GNOME_GNORBA_HOOK],[ - GNOME_ORBIT_HOOK([],$2) - AC_CACHE_CHECK([for gnorba libraries],gnome_cv_gnorba_found,[ - gnome_cv_gnorba_found=no - if test x$gnome_cv_orbit_found = xyes; then - GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" - GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" - if test -n "$GNORBA_LIBS"; then - gnome_cv_gnorba_found=yes - fi - fi - ]) - AM_CONDITIONAL(HAVE_GNORBA, test x$gnome_cv_gnorba_found = xyes) - if test x$gnome_cv_orbit_found = xyes; then - $1 - GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" - GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" - AC_SUBST(GNORBA_CFLAGS) - AC_SUBST(GNORBA_LIBS) - else - if test x$2 = xfailure; then - AC_MSG_ERROR(gnorba library not installed or installation problem) - fi - fi -]) - -AC_DEFUN([GNOME_GNORBA_CHECK], [ - GNOME_GNORBA_HOOK([],failure) -])
--- a/m4/gnome-orbit-check.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -dnl -dnl GNOME_ORBIT_HOOK (script-if-orbit-found, failflag) -dnl -dnl if failflag is "failure" it aborts if orbit is not found. -dnl - -AC_DEFUN([GNOME_ORBIT_HOOK],[ - AC_PATH_PROG(ORBIT_CONFIG,orbit-config,no) - AC_PATH_PROG(ORBIT_IDL,orbit-idl,no) - AC_CACHE_CHECK([for working ORBit environment],gnome_cv_orbit_found,[ - if test x$ORBIT_CONFIG = xno -o x$ORBIT_IDL = xno; then - gnome_cv_orbit_found=no - else - gnome_cv_orbit_found=yes - fi - ]) - AM_CONDITIONAL(HAVE_ORBIT, test x$gnome_cv_orbit_found = xyes) - if test x$gnome_cv_orbit_found = xyes; then - $1 - ORBIT_CFLAGS=`orbit-config --cflags client server` - ORBIT_LIBS=`orbit-config --use-service=name --libs client server` - AC_SUBST(ORBIT_CFLAGS) - AC_SUBST(ORBIT_LIBS) - else - if test x$2 = xfailure; then - AC_MSG_ERROR(ORBit not installed or installation problem) - fi - fi -]) - -AC_DEFUN([GNOME_ORBIT_CHECK], [ - GNOME_ORBIT_HOOK([],failure) -])
--- a/m4/gnome-pthread-check.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -dnl -dnl And better, use gthreads instead... -dnl - -AC_DEFUN([GNOME_PTHREAD_CHECK],[ - PTHREAD_LIB="" - AC_CHECK_LIB(pthread, pthread_create, PTHREAD_LIB="-lpthread", - [AC_CHECK_LIB(pthreads, pthread_create, PTHREAD_LIB="-lpthreads", - [AC_CHECK_LIB(c_r, pthread_create, PTHREAD_LIB="-lc_r", - [AC_CHECK_FUNC(pthread_create)] - )] - )] - ) - AC_SUBST(PTHREAD_LIB) - AC_PROVIDE([GNOME_PTHREAD_CHECK]) -])
--- a/m4/gnome-x-checks.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -dnl GNOME_X_CHECKS -dnl -dnl Basic X11 related checks for X11. At the end, the following will be -dnl defined/changed: -dnl GTK_{CFLAGS,LIBS} From AM_PATH_GTK -dnl CPPFLAGS Will include $X_CFLAGS -dnl GNOME_HAVE_SM `true' or `false' depending on whether session -dnl management is available. It is available if -dnl both -lSM and X11/SM/SMlib.h exist. (Some -dnl Solaris boxes have the library but not the header) -dnl XPM_LIBS -lXpm if Xpm library is present, otherwise "" -dnl -dnl The following configure cache variables are defined (but not used): -dnl gnome_cv_passdown_{x_libs,X_LIBS,X_CFLAGS} -dnl -AC_DEFUN([GNOME_X_CHECKS], -[ - AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(GTK not installed, or gtk-config not in path)) - dnl Hope that GTK_CFLAGS have only -I and -D. Otherwise, we could - dnl test -z "$x_includes" || CPPFLAGS="$CPPFLAGS -I$x_includes" - dnl - dnl Use CPPFLAGS instead of CFLAGS because AC_CHECK_HEADERS uses - dnl CPPFLAGS, not CFLAGS - CPPFLAGS="$CPPFLAGS $GTK_CFLAGS" - - saved_ldflags="$LDFLAGS" - LDFLAGS="$LDFLAGS $GTK_LIBS" - - gnome_cv_passdown_x_libs="$GTK_LIBS" - gnome_cv_passdown_X_LIBS="$GTK_LIBS" - gnome_cv_passdown_X_CFLAGS="$GTK_CFLAGS" - gnome_cv_passdown_GTK_LIBS="$GTK_LIBS" - - LDFLAGS="$saved_ldflags $GTK_LIBS" - -dnl We are requiring GTK >= 1.1.1, which means this will be fine anyhow. - USE_DEVGTK=true - -dnl AC_MSG_CHECKING([whether to use features from (unstable) GTK+ 1.1.x]) -dnl AC_EGREP_CPP(answer_affirmatively, -dnl [#include <gtk/gtkfeatures.h> -dnl #ifdef GTK_HAVE_FEATURES_1_1_0 -dnl answer_affirmatively -dnl #endif -dnl ], dev_gtk=yes, dev_gtk=no) -dnl if test "$dev_gtk" = "yes"; then -dnl USE_DEVGTK=true -dnl fi -dnl AC_MSG_RESULT("$dev_gtk") - - GNOME_HAVE_SM=true - case "$GTK_LIBS" in - *-lSM*) - dnl Already found it. - ;; - *) - dnl Assume that if we have -lSM then we also have -lICE. - AC_CHECK_LIB(SM, SmcSaveYourselfDone, - [GTK_LIBS="-lSM -lICE $GTK_LIBS"],GNOME_HAVE_SM=false, - $x_libs -lICE) - ;; - esac - - if test "$GNOME_HAVE_SM" = true; then - AC_CHECK_HEADERS(X11/SM/SMlib.h,,GNOME_HAVE_SM=false) - fi - - if test "$GNOME_HAVE_SM" = true; then - AC_DEFINE(HAVE_LIBSM) - fi - - XPM_LIBS="" - AC_CHECK_LIB(Xpm, XpmFreeXpmImage, [XPM_LIBS="-lXpm"], , $x_libs) - AC_SUBST(XPM_LIBS) - - AC_REQUIRE([GNOME_PTHREAD_CHECK]) - LDFLAGS="$saved_ldflags" - - AC_PROVIDE([GNOME_X_CHECKS]) -])
--- a/m4/gnome.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -dnl -dnl GNOME_INIT_HOOK (script-if-gnome-enabled, [failflag], [additional-inits]) -dnl -dnl if failflag is "fail" then GNOME_INIT_HOOK will abort if gnomeConf.sh -dnl is not found. -dnl - -AC_DEFUN([GNOME_INIT_HOOK],[ - AC_SUBST(GNOME_LIBS) - AC_SUBST(GNOMEUI_LIBS) - AC_SUBST(GNOMEGNORBA_LIBS) - AC_SUBST(GTKXMHTML_LIBS) - AC_SUBST(ZVT_LIBS) - AC_SUBST(GNOME_LIBDIR) - AC_SUBST(GNOME_INCLUDEDIR) - - AC_ARG_WITH(gnome-includes, - [ --with-gnome-includes Specify location of GNOME headers],[ - CFLAGS="$CFLAGS -I$withval" - ]) - - AC_ARG_WITH(gnome-libs, - [ --with-gnome-libs Specify location of GNOME libs],[ - LDFLAGS="$LDFLAGS -L$withval" - gnome_prefix=$withval - ]) - - AC_ARG_WITH(gnome, - [ --with-gnome Specify prefix for GNOME files], - if test x$withval = xyes; then - want_gnome=yes - dnl Note that an empty true branch is not - dnl valid sh syntax. - ifelse([$1], [], :, [$1]) - else - if test "x$withval" = xno; then - want_gnome=no - else - want_gnome=yes - LDFLAGS="$LDFLAGS -L$withval/lib" - CFLAGS="$CFLAGS -I$withval/include" - gnome_prefix=$withval/lib - fi - fi, - want_gnome=yes) - - GNOME_GNORBA_HOOK([],$2) - - if test "x$want_gnome" = xyes; then - - AC_PATH_PROG(GNOME_CONFIG,gnome-config,no) - if test "$GNOME_CONFIG" = "no"; then - no_gnome_config="yes" - else - AC_MSG_CHECKING(if $GNOME_CONFIG works) - if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then - AC_MSG_RESULT(yes) - GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome`" - GNOMEUI_LIBS="`$GNOME_CONFIG --libs-only-l gnomeui`" - GNOMEGNORBA_LIBS="`$GNOME_CONFIG --libs-only-l gnorba gnomeui`" - GTKXMHTML_LIBS="`$GNOME_CONFIG --libs-only-l gtkxmhtml`" - ZVT_LIBS="`$GNOME_CONFIG --libs-only-l zvt`" - GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`" - GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`" - $1 - else - AC_MSG_RESULT(no) - no_gnome_config="yes" - fi - fi - - if test x$exec_prefix = xNONE; then - if test x$prefix = xNONE; then - gnome_prefix=$ac_default_prefix/lib - else - gnome_prefix=$prefix/lib - fi - else - gnome_prefix=`eval echo \`echo $libdir\`` - fi - - if test "$no_gnome_config" = "yes"; then - AC_MSG_CHECKING(for gnomeConf.sh file in $gnome_prefix) - if test -f $gnome_prefix/gnomeConf.sh; then - AC_MSG_RESULT(found) - echo "loading gnome configuration from" \ - "$gnome_prefix/gnomeConf.sh" - . $gnome_prefix/gnomeConf.sh - $1 - else - AC_MSG_RESULT(not found) - if test x$2 = xfail; then - AC_MSG_ERROR(Could not find the gnomeConf.sh file that is generated by gnome-libs install) - fi - fi - fi - fi - - if test -n "$3"; then - n="$3" - for i in $n; do - AC_MSG_CHECKING(extra library \"$i\") - case $i in - applets) - AC_SUBST(GNOME_APPLETS_LIBS) - GNOME_APPLETS_LIBS=`$GNOME_CONFIG --libs-only-l applets` - AC_MSG_RESULT($GNOME_APPLETS_LIBS);; - capplet) - AC_SUBST(GNOME_CAPPLET_LIBS) - GNOME_CAPPLET_LIBS=`$GNOME_CONFIG --libs-only-l capplet` - AC_MSG_RESULT($GNOME_CAPPLET_LIBS);; - *) - AC_MSG_RESULT(unknown library) - esac - done - fi -]) - -dnl -dnl GNOME_INIT ([additional-inits]) -dnl - -AC_DEFUN([GNOME_INIT],[ - GNOME_INIT_HOOK([],fail,$1) -])
--- a/m4/osip.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -AC_DEFUN([LP_CHECK_OSIP2],[ - -AC_ARG_WITH( osip, - [ --with-osip Set prefix where osip can be found (ex:/usr or /usr/local)[default=/usr/local] ], - [ osip_prefix=${withval}],[ osip_prefix=/usr ]) -AC_SUBST(osip_prefix) - - -OSIP_CFLAGS="-I$osip_prefix/include" -OSIP_LIBS="-L$osip_prefix/lib" - -dnl check osip2 headers -CPPFLAGS_save=$CPPFLAGS -CPPFLAGS=$OSIP_CFLAGS -AC_CHECK_HEADER([osip2/osip.h], ,AC_MSG_ERROR([Could not find osip2 headers !])) -CPPFLAGS=$CPPFLAGS_save - -dnl check for osip2 libs -LDFLAGS_save=$LDFLAGS -LDFLAGS=$OSIP_LIBS -dnl AC_CHECK_LIB adds osipparser2 to LIBS, I don't want that ! -LIBS_save=$LIBS -AC_CHECK_LIB(osipparser2,osip_message_init, , AC_MSG_ERROR([Could not find osip2 libraries !])) -LDFLAGS=$LDFLAGS_save -LIBS=$LIBS_save - -OSIP_LIBS="$OSIP_LIBS -losipparser2 -losip2" - -AC_SUBST(OSIP_CFLAGS) -AC_SUBST(OSIP_LIBS) - -])
--- a/m4/speex.m4 Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -AC_DEFUN([LP_CHECK_SPEEX],[ -dnl only accept speex>=1.1.6 or 1.0.5 (the versions that have speex_encode_int ) -AC_ARG_WITH( speex, - [ --with-speex Set prefix where speex lib can be found (ex:/usr, /usr/local) [default=/usr] ], - [ speex_prefix=${withval}],[ speex_prefix="/usr" ]) - -SPEEX_CFLAGS=" -I${speex_prefix}/include -I${speex_prefix}/include/speex" -SPEEX_LIBS="-L${speex_prefix}/lib -lspeex -lm" -CPPFLAGS_save=$CPPFLAGS -CPPFLAGS=$SPEEX_CFLAGS -LDFLAGS_save=$LDFLAGS -LDFLAGS=$SPEEX_LIBS -AC_CHECK_HEADERS(speex.h,[AC_CHECK_LIB(speex,speex_encode_int,speex_found=yes,speex_found=no) -],speex_found=no) - -if test "$speex_found" = "no" ; then -AC_MSG_ERROR([Could not find a libspeex version that have the speex_encode_int() function. Please install libspeex=1.0.5 or libspeex>=1.1.6]) -fi - -AC_SUBST(SPEEX_CFLAGS) -AC_SUBST(SPEEX_LIBS) -CPPFLAGS=$CPPFLAGS_save -LDFLAGS=$LDFLAGS_save -])
--- a/src/Makefile.am Wed Feb 15 23:02:50 2006 +0000 +++ b/src/Makefile.am Thu Feb 16 00:45:23 2006 +0000 @@ -1,4 +1,3 @@ -EXTRA_DIST = \ dbus-analyze-functions.py \ dbus-analyze-types.py \ gaim-notifications-example.py \ @@ -60,11 +59,7 @@ win32/nsis/translations/trad-chinese.nsh \ win32/nsis/translations/vietnamese.nsh -if HAVE_VV -SUBDIRS = protocols mediastreamer -else SUBDIRS = protocols -endif gaim_coresources = \ account.c \ @@ -84,7 +79,6 @@ idle.c \ imgstore.c \ log.c \ - media.c \ mime.c \ network.c \ ntlm.c \ @@ -133,7 +127,6 @@ idle.h \ imgstore.h \ log.h \ - media.h \ mime.h \ network.h \ notify.h \ @@ -276,7 +269,6 @@ gtkimhtmltoolbar.c \ gtklog.c \ gtkmain.c \ - gtkmedia.c \ gtkmenutray.c \ gtknotify.c \ gtkplugin.c \ @@ -322,7 +314,6 @@ gtkimhtml.h \ gtkimhtmltoolbar.h \ gtklog.h \ - gtkmedia.h \ gtkmenutray.h \ gtknickcolors.h \ gtknotify.h \ @@ -351,10 +342,6 @@ $(gaim_coreheaders) \ $(gaim_headers) -if HAVE_VV -MS_LIBS=$(top_srcdir)/src/mediastreamer/libmediastreamer.la -MS_INCLUDES=-I$(top_srcdir)/src/mediastreamer -endif gaim_DEPENDENCIES = @LIBOBJS@ $(STATIC_LINK_LIBS) $(MS_LIBS) gaim_LDFLAGS = -export-dynamic @@ -368,9 +355,7 @@ $(SM_LIBS) \ $(INTLLIBS) \ $(GTKSPELL_LIBS) \ - $(STARTUP_NOTIFICATION_LIBS) \ - $(VV_LIBS) \ - $(MS_LIBS) + $(STARTUP_NOTIFICATION_LIBS) AM_CPPFLAGS = \ -DBR_PTHREADS=0 \ @@ -379,8 +364,6 @@ -DLOCALEDIR=\"$(datadir)/locale\" \ -DSYSCONFDIR=\"$(sysconfdir)\" \ -I$(top_srcdir)/plugins \ - $(MS_INCLUDES) \ - $(VV_CFLAGS) \ $(AUDIOFILE_CFLAGS) \ $(AO_CFLAGS) \ $(DEBUG_CFLAGS) \
--- a/src/core.c Wed Feb 15 23:02:50 2006 +0000 +++ b/src/core.c Thu Feb 16 00:45:23 2006 +0000 @@ -119,9 +119,6 @@ gaim_blist_init(); gaim_log_init(); gaim_buddy_icons_init(); -#ifdef HAVE_VV - gaim_media_init(); -#endif gaim_network_init(); gaim_privacy_init(); gaim_pounces_init();
--- a/src/gtkblist.c Wed Feb 15 23:02:50 2006 +0000 +++ b/src/gtkblist.c Thu Feb 16 00:45:23 2006 +0000 @@ -259,11 +259,6 @@ serv_send_file(b->account->gc, b->name, NULL); } -static void gtk_blist_menu_voice_chat_cb(GtkWidget *w, GaimBuddy *b) -{ - serv_voice_chat(b->account->gc, b->name); -} - static void gtk_blist_menu_autojoin_cb(GtkWidget *w, GaimChat *chat) { gaim_blist_node_set_bool((GaimBlistNode*)chat, "gtk-autojoin", @@ -967,13 +962,6 @@ } } - if (prpl_info && prpl_info->media_prpl_ops && prpl_info->media_prpl_ops->call) { - gaim_new_item_from_stock(menu, _("Start _Voice Chat"), - GAIM_STOCK_VOICE_CHAT, - G_CALLBACK(gtk_blist_menu_voice_chat_cb), - buddy, 0, 0, NULL); - } - gaim_new_item_from_stock(menu, _("Add Buddy _Pounce"), GAIM_STOCK_POUNCE, G_CALLBACK(gtk_blist_menu_bp_cb), buddy, 0, 0, NULL);
--- a/src/gtkmain.c Wed Feb 15 23:02:50 2006 +0000 +++ b/src/gtkmain.c Thu Feb 16 00:45:23 2006 +0000 @@ -48,7 +48,6 @@ #include "gtkdialogs.h" #include "gtkeventloop.h" #include "gtkft.h" -#include "gtkmedia.h" #include "gtkidle.h" #include "gtklog.h" #include "gtknotify.h" @@ -260,9 +259,6 @@ gaim_gtk_xfers_init(); gaim_gtk_roomlist_init(); gaim_gtk_log_init(); -#ifdef HAVE_VV - gaim_gtk_media_init(); -#endif } static void
--- a/src/gtkmedia.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/** - * @file gtkmedia.h Voice and Video UI - * @ingroup gtkui - * - * gaim - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "internal.h" - -#ifdef HAVE_VV - -#include "debug.h" -#include "gtkconv.h" -#include "gtkmedia.h" - -typedef struct { - GtkWidget *call_pane; - GtkWidget *bbox; -} GaimGtkVoiceChat; - - -static void gaim_gtk_media_new_voice_chat(GaimVoiceChat *vc) -{ - GaimGtkVoiceChat *gvc = g_new0(GaimGtkVoiceChat, 1); - gaim_voice_chat_set_ui_data(vc, gvc); - -} - -static void gaim_gtk_media_destroy(GaimVoiceChat *vc) -{ - GaimConversation *conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, gaim_connection_get_account(gaim_voice_chat_get_connection(vc)), - gaim_voice_chat_get_name(vc)); - GaimGtkVoiceChat *gvc = (GaimGtkVoiceChat*)gaim_voice_chat_get_ui_data(vc); - gaim_conversation_write(conv, NULL, _("Call ended."), GAIM_MESSAGE_SYSTEM, time(NULL)); - gtk_widget_destroy(gvc->call_pane); - g_free(gvc); -} - -static void gaim_gtk_media_state_change(GaimVoiceChat *vc, GaimMediaState state) -{ - GaimGtkVoiceChat *gvc = (GaimGtkVoiceChat*)gaim_voice_chat_get_ui_data(vc); - GaimConversation *conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, gaim_connection_get_account(gaim_voice_chat_get_connection(vc)), - gaim_voice_chat_get_name(vc)); - GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); - GtkWidget *hbox, *bbox; - GtkWidget *button; - char *msg = NULL; - - switch (state) { - case GAIM_MEDIA_STATE_CALLING: - msg = g_strdup_printf(_("Calling %s"), gaim_voice_chat_get_name(vc)); - gaim_conversation_write(conv, NULL, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); - g_free(msg); - hbox = gtk_hbox_new(FALSE, 6); - button = gtk_button_new_with_label(_("End Call")); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gaim_voice_chat_terminate), vc); - gvc->call_pane = hbox; - gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, 0, 0); - gtk_box_pack_end(GTK_BOX(gtkconv->tab_cont), hbox, FALSE, 0, 0); - gtk_widget_show_all(hbox); - break; - case GAIM_MEDIA_STATE_RECEIVING: - msg = g_strdup_printf(_("Receiving call from %s"), gaim_voice_chat_get_name(vc)); - gaim_conversation_write(conv, NULL, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); - g_free(msg); - hbox = gtk_hbox_new(FALSE, 6); - bbox = gvc->bbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); - gtk_box_set_spacing(GTK_BOX(bbox), 6); - gtk_container_add(GTK_CONTAINER(hbox), bbox); - button = gtk_button_new_with_label(_("Reject Call")); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gaim_voice_chat_reject), vc); - gvc->call_pane = hbox; - gtk_box_pack_end(GTK_BOX(bbox), button, FALSE, 0, 0); - gtk_box_pack_end(GTK_BOX(gtkconv->tab_cont), hbox, FALSE, 0, 0); - - button = gtk_button_new_with_label(_("Accept call")); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gaim_voice_chat_accept), vc); - gtk_box_pack_end(GTK_BOX(bbox), button, FALSE, 0, 0); - - gtk_widget_show_all(hbox); - break; - case GAIM_MEDIA_STATE_IN_PROGRESS: - msg = g_strdup_printf(_("Connected to %s"), gaim_voice_chat_get_name(vc)); - gaim_conversation_write(conv, NULL, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); - g_free(msg); - if (gvc->bbox) { - gtk_widget_destroy(gvc->bbox); - gvc->bbox = NULL; - button = gtk_button_new_with_label(_("End Call")); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gaim_voice_chat_terminate), vc); - gtk_box_pack_end(GTK_BOX(gvc->call_pane), button, FALSE, 0, 0); - gtk_widget_show(button); - } - button = gtk_check_button_new_with_mnemonic(_("_Mute")); - gtk_box_pack_start(GTK_BOX(gvc->call_pane), button, FALSE, 0, 0); - gtk_widget_show(button); - break; - default: - break; - } -} - - -static GaimMediaUiOps ui_ops = -{ - gaim_gtk_media_new_voice_chat, - gaim_gtk_media_destroy, - gaim_gtk_media_state_change -}; - -void gaim_gtk_media_init(void) -{ - gaim_debug_info("gtkmedia","Initialising\n"); - gaim_media_set_ui_ops(&ui_ops); -} - -#endif /* HAVE_VV */
--- a/src/gtkmedia.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * @file gtkmedia.h Voice and Video UI - * @ingroup gtkui - * - * gaim - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _GAIM_GTK_MEDIA_H_ -#define _GAIM_GTK_MEDIA_H_ - -#ifdef HAVE_VV - -#include "media.h" - -/*************************************************************************** - * @name GTK+ Media API - ***************************************************************************/ -/*@{*/ - -/** - * Initializes the GTK+ webcam system. - */ -void gaim_gtk_media_init(void); -/*@}*/ - -#endif /* HAVE_VV */ - -#endif /* _GAIM_GTK_MEDIA_H_ */
--- a/src/media.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -/** - * @file media.c Voice and Video API - * @ingroup core - * - * gaim - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "internal.h" - -#ifdef HAVE_VV - -#include "media.h" -#include "mediastream.h" - - -/* msrtpsend.o and msrtprecv.o aren't used within the core, so - * the linker chooses not to link them. I want plugins to be able - * to depend on them, so I reference symbols from them here. */ -static void * dummy1 = ms_rtp_send_new; -static void * dummy2 = ms_rtp_recv_new; - -struct _GaimVoiceChat { - GaimConnection *gc; - char *name; - - GaimMediaState state; - - void *proto_data; - void *ui_data; - - MSFilter *speaker; - MSFilter *microphone; - MSSync *timer; -}; - -static GaimMediaUiOps *media_ui_ops = NULL; - -void gaim_media_init() -{ - ms_init(); - ms_speex_codec_init(); - ortp_init(); -} - -GaimVoiceChat *gaim_voice_chat_new(GaimConnection *gc, const char *name) -{ - GaimVoiceChat *vc = g_new0(GaimVoiceChat, 1); - SndCard *card; - - vc->gc = gc; - vc->name = g_strdup(name); - - card = snd_card_manager_get_card(snd_card_manager,0); - vc->speaker = snd_card_create_write_filter(card); - vc->microphone = snd_card_create_read_filter(card); - vc->timer = ms_timer_new(); - ms_sync_attach(vc->timer, vc->microphone); - if (media_ui_ops) - media_ui_ops->new_voice_chat(vc); - return vc; -} - - - -void gaim_voice_chat_destroy(GaimVoiceChat *vc) -{ - if (media_ui_ops) - media_ui_ops->destroy(vc); - g_free(vc); -} - -const char *gaim_voice_chat_get_name(GaimVoiceChat *vc) -{ - return vc->name; -} - -void gaim_voice_chat_set_name(GaimVoiceChat *vc, const char *name) -{ - g_free(vc->name); - vc->name = g_strdup(name); -} - -GaimConnection *gaim_voice_chat_get_connection(GaimVoiceChat *vc) -{ - return vc->gc; -} - -void *gaim_voice_chat_get_ui_data(GaimVoiceChat *vc) -{ - return vc->ui_data; -} - -void gaim_voice_chat_set_ui_data(GaimVoiceChat *vc, void *data) -{ - vc->ui_data = data; -} - -void *gaim_voice_chat_get_proto_data(GaimVoiceChat *vc) -{ - return vc->proto_data; -} - -void gaim_voice_chat_set_proto_data(GaimVoiceChat *vc, void *data) -{ - vc->proto_data = data; -} - -void gaim_media_set_ui_ops(GaimMediaUiOps *ops) -{ - media_ui_ops = ops; -} - -GaimMediaUiOps *gaim_media_get_ui_ops(void) -{ - return media_ui_ops; -} - - -GaimMediaState gaim_voice_chat_get_state(GaimVoiceChat *vc) -{ - return vc->state; -} - -void gaim_voice_chat_accept(GaimVoiceChat *vc) -{ - GaimConnection *gc = gaim_voice_chat_get_connection(vc); - GaimPluginProtocolInfo *prpl_info = NULL; - - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); - - if (!prpl_info->media_prpl_ops || !prpl_info->media_prpl_ops->accept) - return; - prpl_info->media_prpl_ops->accept(vc); -} - -void gaim_voice_chat_reject(GaimVoiceChat *vc) -{ - GaimConnection *gc = gaim_voice_chat_get_connection(vc); - GaimPluginProtocolInfo *prpl_info = NULL; - - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); - - if (!prpl_info->media_prpl_ops || !prpl_info->media_prpl_ops->reject) - return; - prpl_info->media_prpl_ops->reject(vc); -} - - -void gaim_voice_chat_terminate(GaimVoiceChat *vc) -{ - GaimConnection *gc = gaim_voice_chat_get_connection(vc); - GaimPluginProtocolInfo *prpl_info = NULL; - - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); - - if (!prpl_info->media_prpl_ops || !prpl_info->media_prpl_ops->terminate) - return; - prpl_info->media_prpl_ops->terminate(vc); -} - - -void gaim_voice_chat_set_state(GaimVoiceChat *vc, GaimMediaState state) -{ - vc->state = state; - printf("State: %d\n",state); - if (media_ui_ops) - media_ui_ops->state_change(vc, state); -} - -void gaim_voice_chat_get_filters(GaimVoiceChat *vc, MSFilter **microphone, MSFilter **speaker) -{ - if (microphone) *microphone = vc->microphone; - if (speaker) *speaker = vc->speaker; -} - -MSSync *gaim_voice_chat_get_timer(GaimVoiceChat *vc) -{ - return vc->timer; -} - -void gaim_voice_chat_start_streams(GaimVoiceChat *vc) -{ - GaimConnection *gc = gaim_voice_chat_get_connection(vc); - GaimPluginProtocolInfo *prpl_info = NULL; - - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); - - if (prpl_info->media_prpl_ops && prpl_info->media_prpl_ops->init_filters) - prpl_info->media_prpl_ops->init_filters(vc); - - ms_start(vc->timer); -} - -#endif /* HAVE_VV */
--- a/src/media.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,241 +0,0 @@ -/** - * @file media.h Voice and Video API - * @ingroup core - * - * gaim - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef _GAIM_MEDIA_H_ -#define _GAIM_MEDIA_H_ - -typedef struct _GaimVoiceChat GaimVoiceChat; -typedef struct _GaimMediaPrplOps GaimMediaPrplOps; - -#include "connection.h" - -/* Forward declarations so I needn't #include mediastreamer headers in - * nearly every single file */ -struct _MSFilter; -struct _MSSync; - -/** - * The state of a VoiceChat that should be reflected in the UI - */ -typedef enum { - GAIM_MEDIA_STATE_CALLING, /**< An outgoing call is waiting to be answered */ - GAIM_MEDIA_STATE_RECEIVING, /**< An incoming call is waiting to be answered */ - GAIM_MEDIA_STATE_IN_PROGRESS, /**< The call is connected */ - GAIM_MEDIA_STATE_ERROR, /**< Some error occured */ -} GaimMediaState; - -/** - * UI Operations - */ -typedef struct { - void (*new_voice_chat)(GaimVoiceChat *vc); /**< A new voice chat is created */ - void (*destroy)(GaimVoiceChat *vc); /**< The voice chat has been destroyed */ - void (*state_change)(GaimVoiceChat *vc, GaimMediaState state); /**< The state of the voice chat has changed */ -} GaimMediaUiOps; - -/** - * PRPL Operations - */ -struct _GaimMediaPrplOps { - void (*call)(GaimConnection *gc, const char *who); /**< Request an outgoing call to 'who' */ - void (*init_filters)(GaimVoiceChat *); /**< Create the media stream for the call */ - void (*accept)(GaimVoiceChat *); /**< Accept an incoming call */ - void (*reject)(GaimVoiceChat *); /**< Reject an incoming call */ - void (*terminate)(GaimVoiceChat *); /**< Terminate an in-progress call */ -}; - -#ifdef HAVE_VV - -/** - * Initializes mediastreamer and ortp - */ -void gaim_media_init(void); - -/**************************************************************************/ -/** @name Voice Chat API **************************************************/ -/**************************************************************************/ -/*@{*/ - -/** - * Creates a new voice chat - * This function creates a new voice chat object, and tells the UI about it. The UI - * probably won't want to do anything, until the state is changed to Incoming or Outgoing, - * but the UI should initialize any data structures it needs on this call - * - * @param gc The connection this chat is happening on - * @param name The person on the other end of the call - * @return The new voice chat - */ -GaimVoiceChat *gaim_voice_chat_new(GaimConnection *gc, const char *name); - -/** - * Destroys a voice chat - * - * @param vc The voice chat to destroy - */ -void gaim_voice_chat_destroy(GaimVoiceChat *vc); - -/** - * Accessor function to get the name of the other user on the voice chat - * - * @param vc The voice chat - * @return The name - */ -const char *gaim_voice_chat_get_name(GaimVoiceChat *vc); - -/** - * Accessor function to set the name of the other user on the voice chat - * - * @param vc The voice chat - * @return The name - */ -void gaim_voice_chat_set_name(GaimVoiceChat *vc, const char *name); - -/** - * Accessor for the GaimConnection of the voice chat - * - * @param vc The voice chat - * @return The GaimConnection - */ -GaimConnection *gaim_voice_chat_get_connection(GaimVoiceChat *vc); - -/** - * Accessor for the UI data - * - * @param vc The voice chat - * @return The UI data - */ -void *gaim_voice_chat_get_ui_data(GaimVoiceChat *vc); - -/** - * Mutator for the UI Data - * - * @param vc The voice chat - * @param data The data - */ -void gaim_voice_chat_set_ui_data(GaimVoiceChat *vc, void *data); - -/** - * Accessor for the protocol data - * - * @param vc The voice chat - * @return The protocol data - */ -void *gaim_voice_chat_get_proto_data(GaimVoiceChat *vc); - -/** - * Mutator for the protocol data - * - * @param vc The voice chat - * @param data The protocol data - */ -void gaim_voice_chat_set_proto_data(GaimVoiceChat *vc, void *data); - -/** - * Accessor for the state - * - * @param vc The voice chat - * @return The state - */ -GaimMediaState gaim_voice_chat_get_state(GaimVoiceChat *vc); - -/** - * Mutator for the state - * - * @param vc The voice chat - * @param state The state - */ -void gaim_voice_chat_set_state(GaimVoiceChat *vc, GaimMediaState state); - -/** - * Accepts an incoming voice chat - * - * @param vc The voice chat - */ -void gaim_voice_chat_accept(GaimVoiceChat *vc); - -/** - * Rejects an incoming voice chat - * - * @param vc The voice chat - */ -void gaim_voice_chat_reject(GaimVoiceChat *vc); - -/** - * Terminates an in-progress voice chat - * - * @param vc The voice chat - */ -void gaim_voice_chat_terminate(GaimVoiceChat *vc); - -/** - * Accessor for the microphone and speaker MSFilter objects - * - * @param vc The voice chat - * @param microphone A pointer to return the microphone filter in, or NULL. - * @param speaker A poitner to reutrn the speaker filter in, or NULL. - */ -void gaim_voice_chat_get_filters(GaimVoiceChat *vc, struct _MSFilter **microphone, struct _MSFilter **speaker); - -/** - * Accessor for the Mediastreamer timer - * - * @param vc The voice chat - * @return The timer - */ -struct _MSSync *gaim_voice_chat_get_timer(GaimVoiceChat *vc); - -/** - * Start the streams - * - * @param vc The voice chat - */ -void gaim_voice_chat_start_streams(GaimVoiceChat *vc); - -/*@}*/ - -/**************************************************************************/ -/** @name UI Registration Functions */ -/**************************************************************************/ -/*@{*/ - -/** - * Sets the UI operations structure to be used for the buddy list. - * - * @param ops The ops struct. - */ -void gaim_media_set_ui_ops(GaimMediaUiOps *ops); - -/** - * Returns the UI operations structure to be used for the buddy list. - * - * @return The UI operations structure. - */ -GaimMediaUiOps *gaim_media_get_ui_ops(void); - -/*@}*/ - -#endif /* HAVE_VV */ - -#endif /* _GAIM_MEDIA_H_ */
--- a/src/mediastreamer/Makefile.am Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -EXTRA_DIST= - -noinst_LTLIBRARIES = libmediastreamer.la - -useless_files=mstcpserv.c mstcpserv.h mstcpclient.c mstcpclient.h - -libmediastreamer_la_SOURCES=msfilter.c msfilter.h msutils.h waveheader.h\ - mscodec.c mscodec.h \ - mssoundread.c mssoundread.h \ - mssoundwrite.c mssoundwrite.h \ - msbuffer.c msbuffer.h \ - msqueue.c msqueue.h \ - msfifo.c msfifo.h \ - ms.c ms.h\ - mssync.c mssync.h \ - msnosync.c msnosync.h \ - msread.c msread.h \ - mswrite.c mswrite.h \ - mscopy.c mscopy.h \ - msosswrite.c msosswrite.h \ - msossread.c msossread.h \ - msringplayer.c msringplayer.h \ - msrtprecv.c msrtprecv.h \ - msrtpsend.c msrtpsend.h \ - msAlawenc.c msAlawenc.h g711common.h \ - msAlawdec.c msAlawdec.h g711common.h \ - msMUlawenc.c msMUlawenc.h g711common.h \ - msMUlawdec.c msMUlawdec.h g711common.h \ - mstimer.c mstimer.h \ - msqdispatcher.c msqdispatcher.h \ - msfdispatcher.c msfdispatcher.h \ - sndcard.c sndcard.h \ - osscard.c osscard.h\ - hpuxsndcard.c \ - alsacard.c alsacard.h \ - jackcard.c jackcard.h \ - audiostream.c mediastream.h \ - msspeexenc.c msspeexenc.h msspeexdec.c msspeexdec.h -# msGSMdecoder.c msGSMdecoder.h -# msGSMencoder.c msGSMencoder.h -# msLPC10encoder.c msLPC10encoder.h -# msLPC10decoder.c msLPC10decoder.h - -libmediastreamer_la_LDFLAGS = -export-dynamic - -libmediastreamer_la_LIBADD= $(GLIB_LIBS) $(VV_LIBS) - -AM_CFLAGS=$(GLIB_CFLAGS) -DG_LOG_DOMAIN=\"MediaStreamer\" $(VV_CFLAGS) $(IPV6_CFLAGS) -DHAVE_GLIB $(DEBUG_CFLAGS) - - -INCLUDES= -I$(top_srcdir) -I$(top_srcdir)/mediastreamer $(VV_CFLAGS)
--- a/src/mediastreamer/affine.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -/* - * affine.c -- Affine Transforms for 2d objects - * Copyright (C) 2002 Charles Yates <charles.yates@pandora.be> - * Portions Copyright (C) 2003 Dan Dennedy <dan@dennedy.org> - * ported from C++ to C - * wrote affine_scale() - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "affine.h" - -static inline void Multiply( affine_transform_t *this, affine_transform_t *that ) -{ - double output[2][2]; - register int i, j; - - for ( i = 0; i < 2; i ++ ) - for ( j = 0; j < 2; j ++ ) - output[ i ][ j ] = this->matrix[ i ][ 0 ] * that->matrix[ j ][ 0 ] + - this->matrix[ i ][ 1 ] * that->matrix[ j ][ 1 ]; - - this->matrix[ 0 ][ 0 ] = output[ 0 ][ 0 ]; - this->matrix[ 0 ][ 1 ] = output[ 0 ][ 1 ]; - this->matrix[ 1 ][ 0 ] = output[ 1 ][ 0 ]; - this->matrix[ 1 ][ 1 ] = output[ 1 ][ 1 ]; -} - -void affine_transform_init( affine_transform_t *this ) -{ - this->matrix[ 0 ][ 0 ] = 1; - this->matrix[ 0 ][ 1 ] = 0; - this->matrix[ 1 ][ 0 ] = 0; - this->matrix[ 1 ][ 1 ] = 1; -} - -// Rotate by a given angle -void affine_transform_rotate( affine_transform_t *this, double angle ) -{ - affine_transform_t affine; - affine.matrix[ 0 ][ 0 ] = cos( angle * M_PI / 180 ); - affine.matrix[ 0 ][ 1 ] = 0 - sin( angle * M_PI / 180 ); - affine.matrix[ 1 ][ 0 ] = sin( angle * M_PI / 180 ); - affine.matrix[ 1 ][ 1 ] = cos( angle * M_PI / 180 ); - Multiply( this, &affine ); -} - -// Shear by a given value -void affine_transform_shear( affine_transform_t *this, double shear ) -{ - affine_transform_t affine; - affine.matrix[ 0 ][ 0 ] = 1; - affine.matrix[ 0 ][ 1 ] = shear; - affine.matrix[ 1 ][ 0 ] = 0; - affine.matrix[ 1 ][ 1 ] = 1; - Multiply( this, &affine ); -} - -void affine_transform_scale( affine_transform_t *this, double sx, double sy ) -{ - affine_transform_t affine; - affine.matrix[ 0 ][ 0 ] = sx; - affine.matrix[ 0 ][ 1 ] = 0; - affine.matrix[ 1 ][ 0 ] = 0; - affine.matrix[ 1 ][ 1 ] = sy; - Multiply( this, &affine ); -} - -// Obtain the mapped x coordinate of the input -double affine_transform_mapx( affine_transform_t *this, int x, int y ) -{ - return this->matrix[0][0] * x + this->matrix[0][1] * y; -} - -// Obtain the mapped y coordinate of the input -double affine_transform_mapy( affine_transform_t *this, int x, int y ) -{ - return this->matrix[1][0] * x + this->matrix[1][1] * y; -} - -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) - -void affine_scale( const unsigned char *src, unsigned char *dest, int src_width, int src_height, int dest_width, int dest_height, int bpp ) -{ - affine_transform_t affine; - double scale_x = (double) dest_width / (double) src_width; - double scale_y = (double) dest_height / (double) src_height; - register unsigned char *d = dest; - register const unsigned char *s = src; - register int i, j, k, x, y; - - affine_transform_init( &affine ); - - if ( scale_x <= 1.0 && scale_y <= 1.0 ) - { - affine_transform_scale( &affine, scale_x, scale_y ); - - for( j = 0; j < src_height; j++ ) - for( i = 0; i < src_width; i++ ) - { - x = (int) ( affine_transform_mapx( &affine, i - src_width/2, j - src_height/2 ) ); - y = (int) ( affine_transform_mapy( &affine, i - src_width/2, j - src_height/2 ) ); - x += dest_width/2; - x = CLAMP( x, 0, dest_width); - y += dest_height/2; - y = CLAMP( y, 0, dest_height); - s = src + (j*src_width*bpp) + i*bpp; // + (bpp-1); - d = dest + y*dest_width*bpp + x*bpp; - for ( k = 0; k < bpp; k++ ) - *d++ = *s++; - } - } - else if ( scale_x > 1.0 && scale_y > 1.0 ) - { - affine_transform_scale( &affine, 1.0/scale_x, 1.0/scale_y ); - - for( y = 0; y < dest_height; y++ ) - for( x = 0; x < dest_width; x++ ) - { - i = (int) ( affine_transform_mapx( &affine, x - dest_width/2, y - dest_height/2 ) ); - j = (int) ( affine_transform_mapy( &affine, x - dest_width/2, y - dest_height/2 ) ); - i += src_width/2; - i = CLAMP( i, 0, dest_width); - j += src_height/2; - j = CLAMP( j, 0, dest_height); - s = src + (j*src_width*bpp) + i*bpp; // + (bpp-1); - d = dest + y*dest_width*bpp + x*bpp; - for ( k = 0; k < bpp; k++ ) - *d++ = *s++; - } - } -}
--- a/src/mediastreamer/affine.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* - * affine.h -- Affine Transforms for 2d objects - * Copyright (C) 2002 Charles Yates <charles.yates@pandora.be> - * Portions Copyright (C) 2003 Dan Dennedy <dan@dennedy.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef _AFFINE_H -#define _AFFINE_H - -#include <math.h> - -/** Affine transforms for 2d image manipulation. Current provides shearing and - rotating support. -*/ - -typedef struct { - double matrix[2][2]; -} affine_transform_t; - -void affine_transform_init( affine_transform_t *this ); -void affine_transform_rotate( affine_transform_t *this, double angle ); -void affine_transform_shear( affine_transform_t *this, double shear ); -void affine_transform_scale( affine_transform_t *this, double sx, double sy ); -double affine_transform_mapx( affine_transform_t *this, int x, int y ); -double affine_transform_mapy( affine_transform_t *this, int x, int y ); -void affine_scale( const unsigned char *src, unsigned char *dest, int src_width, int src_height, int dest_width, int dest_height, int bpp ); - -#endif -
--- a/src/mediastreamer/alsacard.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,640 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "alsacard.h" - -#ifdef HAVE_ALSA_ASOUNDLIB_H - -static gchar *over_pcmdev=NULL; - -#include "msossread.h" -#include "msosswrite.h" - -#include <signal.h> - -int __alsa_card_write(AlsaCard *obj,char *buf,int size); - -int alsa_set_params(AlsaCard *obj, int rw, int bits, int stereo, int rate) -{ - snd_pcm_hw_params_t *hwparams=NULL; - snd_pcm_sw_params_t *swparams=NULL; - snd_pcm_t *pcm_handle; - gint dir,exact_value; - gint channels; - gint fsize=0; - gint periods=8; - gint periodsize=256; - gint err; - int format; - - if (rw) { - pcm_handle=obj->write_handle; - } - else pcm_handle=obj->read_handle; - - /* Allocate the snd_pcm_hw_params_t structure on the stack. */ - snd_pcm_hw_params_alloca(&hwparams); - - /* Init hwparams with full configuration space */ - if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) { - g_warning("alsa_set_params: Cannot configure this PCM device.\n"); - return(-1); - } - - if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) { - g_warning("alsa_set_params: Error setting access.\n"); - return(-1); - } - /* Set sample format */ -#ifdef WORDS_BIGENDIAN - format=SND_PCM_FORMAT_S16_BE; -#else - format=SND_PCM_FORMAT_S16_LE; -#endif - if (snd_pcm_hw_params_set_format(pcm_handle, hwparams, format) < 0) { - g_warning("alsa_set_params: Error setting format.\n"); - return(-1); - } - /* Set number of channels */ - if (stereo) channels=2; - else channels=1; - if (snd_pcm_hw_params_set_channels(pcm_handle, hwparams, channels) < 0) { - g_warning("alsa_set_params: Error setting channels.\n"); - return(-1); - } - /* Set sample rate. If the exact rate is not supported */ - /* by the hardware, use nearest possible rate. */ - exact_value=rate; - dir=0; - if ((err=snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &exact_value, &dir))<0){ - g_warning("alsa_set_params: Error setting rate to %i:%s",rate,snd_strerror(err)); - return -1; - } - if (dir != 0) { - g_warning("alsa_set_params: The rate %d Hz is not supported by your hardware.\n " - "==> Using %d Hz instead.\n", rate, exact_value); - } - /* choose greater period size when rate is high */ - periodsize=periodsize*(rate/8000); - - /* Set buffer size (in frames). The resulting latency is given by */ - /* latency = periodsize * periods / (rate * bytes_per_frame) */ - /* - fsize=periodsize * periods; - exact_value=fsize; - if ((err=snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams,&exact_value)) < 0) { - g_warning("alsa_set_params: Error setting buffer size:%s",snd_strerror(err)); - return(-1); - } - if (fsize!= exact_value) { - g_warning("alsa_set_params: The buffer size %d is not supported by your hardware.\n " - "==> Using %d instead.\n", fsize, exact_value); - } - */ - /* set period size */ - exact_value=periodsize; - dir=0; - if (snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, &exact_value, &dir) < 0) { - g_warning("alsa_set_params: Error setting period size.\n"); - return(-1); - } - if (dir != 0) { - g_warning("alsa_set_params: The period size %d is not supported by your hardware.\n " - "==> Using %d instead.\n", periodsize, exact_value); - } - periodsize=exact_value; - /* Set number of periods. Periods used to be called fragments. */ - exact_value=periods; - dir=0; - if (snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &exact_value, &dir) < 0) { - g_warning("alsa_set_params: Error setting periods.\n"); - return(-1); - } - if (dir != 0) { - g_warning("alsa_set_params: The number of periods %d is not supported by your hardware.\n " - "==> Using %d instead.\n", periods, exact_value); - } - /* Apply HW parameter settings to */ - /* PCM device and prepare device */ - if ((err=snd_pcm_hw_params(pcm_handle, hwparams)) < 0) { - g_warning("alsa_set_params: Error setting HW params:%s",snd_strerror(err)); - return(-1); - } - /*prepare sw params */ - if (rw){ - snd_pcm_sw_params_alloca(&swparams); - snd_pcm_sw_params_current(pcm_handle, swparams); - if ((err=snd_pcm_sw_params_set_start_threshold(pcm_handle, swparams,periodsize*2 ))<0){ - g_warning("alsa_set_params: Error setting start threshold:%s",snd_strerror(err)); - return -1; - } - if ((err=snd_pcm_sw_params(pcm_handle, swparams))<0){ - g_warning("alsa_set_params: Error setting SW params:%s",snd_strerror(err)); - return(-1); - } - } - obj->frame_size=channels*(bits/8); - SND_CARD(obj)->bsize=periodsize*obj->frame_size; - //SND_CARD(obj)->bsize=4096; - obj->frames=periodsize; - g_message("alsa_set_params: blocksize=%i.",SND_CARD(obj)->bsize); - return SND_CARD(obj)->bsize; -} - -int alsa_card_open_r(AlsaCard *obj,int bits,int stereo,int rate) -{ - int bsize; - int err; - snd_pcm_t *pcm_handle; - gchar *pcmdev; - if (over_pcmdev!=NULL) pcmdev=over_pcmdev; - else pcmdev=obj->pcmdev; - - if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_CAPTURE,SND_PCM_NONBLOCK) < 0) { - g_warning("alsa_card_open_r: Error opening PCM device %s\n",obj->pcmdev ); - return -1; - } - g_return_val_if_fail(pcm_handle!=NULL,-1); - obj->read_handle=pcm_handle; - if ((bsize=alsa_set_params(obj,0,bits,stereo,rate))<0){ - snd_pcm_close(pcm_handle); - obj->read_handle=NULL; - return -1; - } - obj->readbuf=g_malloc0(bsize); - - err=snd_pcm_start(obj->read_handle); - if (err<0){ - g_warning("Cannot start read pcm: %s", snd_strerror(err)); - } - obj->readpos=0; - SND_CARD(obj)->bsize=bsize; - SND_CARD(obj)->flags|=SND_CARD_FLAGS_OPENED; - return 0; -} - -int alsa_card_open_w(AlsaCard *obj,int bits,int stereo,int rate) -{ - int err,bsize; - snd_pcm_t *pcm_handle; - gchar *pcmdev; - if (over_pcmdev!=NULL) pcmdev=over_pcmdev; - else pcmdev=obj->pcmdev; - - if (snd_pcm_open(&pcm_handle, pcmdev,SND_PCM_STREAM_PLAYBACK,SND_PCM_NONBLOCK) < 0) { - g_warning("alsa_card_open_w: Error opening PCM device %s\n", obj->pcmdev); - return -1; - } - obj->write_handle=pcm_handle; - if ((bsize=alsa_set_params(obj,1,bits,stereo,rate))<0){ - snd_pcm_close(pcm_handle); - obj->write_handle=NULL; - return -1; - } - obj->writebuf=g_malloc0(bsize); - - obj->writepos=0; - SND_CARD(obj)->bsize=bsize; - SND_CARD(obj)->flags|=SND_CARD_FLAGS_OPENED; - return 0; -} - - -void alsa_card_set_blocking_mode(AlsaCard *obj, gboolean yesno){ - if (obj->read_handle!=NULL) snd_pcm_nonblock(obj->read_handle,!yesno); - if (obj->write_handle!=NULL) snd_pcm_nonblock(obj->write_handle,!yesno); -} - -void alsa_card_close_r(AlsaCard *obj) -{ - if (obj->read_handle!=NULL){ - snd_pcm_close(obj->read_handle); - obj->read_handle=NULL; - g_free(obj->readbuf); - obj->readbuf=NULL; - } -} - -void alsa_card_close_w(AlsaCard *obj) -{ - if (obj->write_handle!=NULL){ - snd_pcm_close(obj->write_handle); - obj->write_handle=NULL; - g_free(obj->writebuf); - obj->writebuf=NULL; - } -} - -int alsa_card_probe(AlsaCard *obj,int bits,int stereo,int rate) -{ - int ret; - ret=alsa_card_open_w(obj,bits,stereo,rate); - if (ret<0) return -1; - ret=SND_CARD(obj)->bsize; - alsa_card_close_w(obj); - return ret; -} - - -void alsa_card_destroy(AlsaCard *obj) -{ - snd_card_uninit(SND_CARD(obj)); - g_free(obj->pcmdev); - if (obj->readbuf!=0) g_free(obj->readbuf); - if (obj->writebuf!=0) g_free(obj->writebuf); -} - -gboolean alsa_card_can_read(AlsaCard *obj) -{ - int frames; - g_return_val_if_fail(obj->read_handle!=NULL,0); - if (obj->readpos!=0) return TRUE; - if ( frames=snd_pcm_avail_update(obj->read_handle)>=obj->frames) return 1; - //g_message("frames=%i",frames); - return 0; -} - - - -int __alsa_card_read(AlsaCard *obj,char *buf,int bsize) -{ - int err; - sigset_t set; - sigemptyset(&set); - sigaddset(&set,SIGALRM); - sigprocmask(SIG_BLOCK,&set,NULL); - err=snd_pcm_readi(obj->read_handle,buf,bsize/obj->frame_size); - if (err<0) { - if (err!=-EPIPE){ - g_warning("alsa_card_read: snd_pcm_readi() failed:%s.",snd_strerror(err)); - } - snd_pcm_prepare(obj->read_handle); - err=snd_pcm_readi(obj->read_handle,buf,bsize/obj->frame_size); - if (err<0) g_warning("alsa_card_read: snd_pcm_readi() failed:%s.",snd_strerror(err)); - } - sigprocmask(SIG_UNBLOCK,&set,NULL); - return err*obj->frame_size; -} - -int alsa_card_read(AlsaCard *obj,char *buf,int size) -{ - int err; - gint bsize=SND_CARD(obj)->bsize; - g_return_val_if_fail(obj->read_handle!=NULL,-1); - if (size<bsize){ - gint canread=MIN(bsize-obj->readpos,size); - - if (obj->readpos==0){ - err=__alsa_card_read(obj,obj->readbuf,bsize); - } - - memcpy(buf,&obj->readbuf[obj->readpos],canread); - obj->readpos+=canread; - if (obj->readpos>=bsize) obj->readpos=0; - return canread; - }else{ - err=__alsa_card_read(obj,buf,size); - return err; - } - -} - -int __alsa_card_write(AlsaCard *obj,char *buf,int size) -{ - int err; - sigset_t set; - sigemptyset(&set); - sigaddset(&set,SIGALRM); - sigprocmask(SIG_BLOCK,&set,NULL); - if ((err=snd_pcm_writei(obj->write_handle,buf,size/obj->frame_size))<0){ - if (err!=-EPIPE){ - g_warning("alsa_card_write: snd_pcm_writei() failed:%s.",snd_strerror(err)); - } - snd_pcm_prepare(obj->write_handle); - err=snd_pcm_writei(obj->write_handle,buf,size/obj->frame_size); - if (err<0) g_warning("alsa_card_write: Error writing sound buffer (size=%i):%s",size,snd_strerror(err)); - - } - sigprocmask(SIG_UNBLOCK,&set,NULL); - return err; -} - -int alsa_card_write(AlsaCard *obj,char *buf,int size) -{ - int err; - gint bsize=SND_CARD(obj)->bsize; - g_return_val_if_fail(obj->write_handle!=NULL,-1); - if (size<bsize){ - gint canwrite; - - canwrite=MIN(bsize-obj->writepos,size); - memcpy(&obj->writebuf[obj->writepos],buf,canwrite); - obj->writepos+=canwrite; - if (obj->writepos>=bsize){ - err=__alsa_card_write(obj,obj->writebuf,bsize); - obj->writepos=0; - } - return canwrite; - }else{ - return __alsa_card_write(obj,buf,bsize); - } -} - -snd_mixer_t *alsa_mixer_open(AlsaCard *obj){ - snd_mixer_t *mixer=NULL; - int err; - err=snd_mixer_open(&mixer,0); - if (err<0){ - g_warning("Could not open alsa mixer: %s",snd_strerror(err)); - return NULL; - } - if ((err = snd_mixer_attach (mixer, obj->mixdev)) < 0){ - g_warning("Could not attach mixer to card: %s",snd_strerror(err)); - snd_mixer_close(mixer); - return NULL; - } - if ((err = snd_mixer_selem_register (mixer, NULL, NULL)) < 0){ - g_warning("snd_mixer_selem_register: %s",snd_strerror(err)); - snd_mixer_close(mixer); - return NULL; - } - if ((err = snd_mixer_load (mixer)) < 0){ - g_warning("snd_mixer_load: %s",snd_strerror(err)); - snd_mixer_close(mixer); - return NULL; - } - obj->mixer=mixer; - return mixer; -} - -void alsa_mixer_close(AlsaCard *obj){ - snd_mixer_close(obj->mixer); - obj->mixer=NULL; -} - -typedef enum {CAPTURE, PLAYBACK, CAPTURE_SWITCH, PLAYBACK_SWITCH} MixerAction; - -static gint get_mixer_element(snd_mixer_t *mixer,const char *name, MixerAction action){ - long value=0; - const char *elemname; - snd_mixer_elem_t *elem; - int err; - long sndMixerPMin; - long sndMixerPMax; - long newvol; - elem=snd_mixer_first_elem(mixer); - while (elem!=NULL){ - elemname=snd_mixer_selem_get_name(elem); - //g_message("Found alsa mixer element %s.",elemname); - if (strcmp(elemname,name)==0){ - switch (action){ - case CAPTURE: - if (snd_mixer_selem_has_capture_volume(elem)){ - snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); - err=snd_mixer_selem_get_capture_volume(elem,SND_MIXER_SCHN_UNKNOWN,&newvol); - newvol-=sndMixerPMin; - value=(100*newvol)/(sndMixerPMax-sndMixerPMin); - if (err<0) g_warning("Could not get capture volume for %s:%s",name,snd_strerror(err)); - //else g_message("Succesfully get capture level for %s.",elemname); - break; - } - break; - case PLAYBACK: - if (snd_mixer_selem_has_playback_volume(elem)){ - snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); - err=snd_mixer_selem_get_playback_volume(elem,SND_MIXER_SCHN_FRONT_LEFT,&newvol); - newvol-=sndMixerPMin; - value=(100*newvol)/(sndMixerPMax-sndMixerPMin); - if (err<0) g_warning("Could not get playback volume for %s:%s",name,snd_strerror(err)); - //else g_message("Succesfully get playback level for %s.",elemname); - break; - } - break; - case CAPTURE_SWITCH: - - break; - } - } - elem=snd_mixer_elem_next(elem); - } - - return value; -} - - -static void set_mixer_element(snd_mixer_t *mixer,const char *name, gint level,MixerAction action){ - const char *elemname; - snd_mixer_elem_t *elem; - int tmp; - long sndMixerPMin; - long sndMixerPMax; - long newvol; - - elem=snd_mixer_first_elem(mixer); - - while (elem!=NULL){ - elemname=snd_mixer_selem_get_name(elem); - //g_message("Found alsa mixer element %s.",elemname); - if (strcmp(elemname,name)==0){ - switch(action){ - case CAPTURE: - if (snd_mixer_selem_has_capture_volume(elem)){ - snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); - newvol=(((sndMixerPMax-sndMixerPMin)*level)/100)+sndMixerPMin; - snd_mixer_selem_set_capture_volume_all(elem,newvol); - //g_message("Succesfully set capture level for %s.",elemname); - return; - } - break; - case PLAYBACK: - if (snd_mixer_selem_has_playback_volume(elem)){ - snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); - newvol=(((sndMixerPMax-sndMixerPMin)*level)/100)+sndMixerPMin; - snd_mixer_selem_set_playback_volume_all(elem,newvol); - //g_message("Succesfully set playback level for %s.",elemname); - return; - } - break; - case CAPTURE_SWITCH: - if (snd_mixer_selem_has_capture_switch(elem)){ - snd_mixer_selem_set_capture_switch_all(elem,level); - //g_message("Succesfully set capture switch for %s.",elemname); - } - break; - case PLAYBACK_SWITCH: - if (snd_mixer_selem_has_playback_switch(elem)){ - snd_mixer_selem_set_playback_switch_all(elem,level); - //g_message("Succesfully set capture switch for %s.",elemname); - } - break; - - } - } - elem=snd_mixer_elem_next(elem); - } - - return ; -} - - -void alsa_card_set_level(AlsaCard *obj,gint way,gint a) -{ - snd_mixer_t *mixer; - mixer=alsa_mixer_open(obj); - if (mixer==NULL) return ; - switch(way){ - case SND_CARD_LEVEL_GENERAL: - set_mixer_element(mixer,"Master",a,PLAYBACK); - break; - case SND_CARD_LEVEL_INPUT: - set_mixer_element(mixer,"Capture",a,CAPTURE); - break; - case SND_CARD_LEVEL_OUTPUT: - set_mixer_element(mixer,"PCM",a,PLAYBACK); - break; - default: - g_warning("oss_card_set_level: unsupported command."); - } - alsa_mixer_close(obj); -} - -gint alsa_card_get_level(AlsaCard *obj,gint way) -{ - snd_mixer_t *mixer; - gint value; - mixer=alsa_mixer_open(obj); - if (mixer==NULL) return 0; - switch(way){ - case SND_CARD_LEVEL_GENERAL: - value=get_mixer_element(mixer,"Master",PLAYBACK); - break; - case SND_CARD_LEVEL_INPUT: - value=get_mixer_element(mixer,"Capture",CAPTURE); - break; - case SND_CARD_LEVEL_OUTPUT: - value=get_mixer_element(mixer,"PCM",PLAYBACK); - break; - default: - g_warning("oss_card_set_level: unsupported command."); - } - alsa_mixer_close(obj); - return value; -} - -void alsa_card_set_source(AlsaCard *obj,int source) -{ - snd_mixer_t *mixer; - mixer=alsa_mixer_open(obj); - if (mixer==NULL) return; - switch (source){ - case 'm': - set_mixer_element(mixer,"Mic",1,CAPTURE_SWITCH); - set_mixer_element(mixer,"Capture",1,CAPTURE_SWITCH); - break; - case 'l': - set_mixer_element(mixer,"Line",1,CAPTURE_SWITCH); - set_mixer_element(mixer,"Capture",1,CAPTURE_SWITCH); - break; - } -} - -MSFilter *alsa_card_create_read_filter(AlsaCard *card) -{ - MSFilter *f=ms_oss_read_new(); - ms_oss_read_set_device(MS_OSS_READ(f),SND_CARD(card)->index); - return f; -} - -MSFilter *alsa_card_create_write_filter(AlsaCard *card) -{ - MSFilter *f=ms_oss_write_new(); - ms_oss_write_set_device(MS_OSS_WRITE(f),SND_CARD(card)->index); - return f; -} - - -SndCard * alsa_card_new(gint devid) -{ - AlsaCard * obj; - SndCard *base; - int err; - gchar *name=NULL; - - /* carefull: this is an alsalib call despite its name! */ - err=snd_card_get_name(devid,&name); - if (err<0) { - return NULL; - } - obj= g_new0(AlsaCard,1); - base= SND_CARD(obj); - snd_card_init(base); - - base->card_name=g_strdup_printf("%s (Advanced Linux Sound Architecture)",name); - base->_probe=(SndCardOpenFunc)alsa_card_probe; - base->_open_r=(SndCardOpenFunc)alsa_card_open_r; - base->_open_w=(SndCardOpenFunc)alsa_card_open_w; - base->_can_read=(SndCardPollFunc)alsa_card_can_read; - base->_set_blocking_mode=(SndCardSetBlockingModeFunc)alsa_card_set_blocking_mode; - base->_read=(SndCardIOFunc)alsa_card_read; - base->_write=(SndCardIOFunc)alsa_card_write; - base->_close_r=(SndCardCloseFunc)alsa_card_close_r; - base->_close_w=(SndCardCloseFunc)alsa_card_close_w; - base->_set_rec_source=(SndCardMixerSetRecSourceFunc)alsa_card_set_source; - base->_set_level=(SndCardMixerSetLevelFunc)alsa_card_set_level; - base->_get_level=(SndCardMixerGetLevelFunc)alsa_card_get_level; - base->_destroy=(SndCardDestroyFunc)alsa_card_destroy; - base->_create_read_filter=(SndCardCreateFilterFunc)alsa_card_create_read_filter; - base->_create_write_filter=(SndCardCreateFilterFunc)alsa_card_create_write_filter; - - - obj->pcmdev=g_strdup_printf("plughw:%i,0",devid); - obj->mixdev=g_strdup_printf("hw:%i",devid); - obj->readbuf=NULL; - obj->writebuf=NULL; - return base; -} - - -gint alsa_card_manager_init(SndCardManager *m, gint index) -{ - gint devindex; - gint i; - gint found=0; - gchar *name=NULL; - for(devindex=0;index<MAX_SND_CARDS && devindex<MAX_SND_CARDS ;devindex++){ - if (snd_card_get_name(devindex,&name)==0){ - g_message("Found ALSA device: %s",name); - m->cards[index]=alsa_card_new(devindex); - m->cards[index]->index=index; - found++; - index++; - } - } - return found; -} - -void alsa_card_manager_set_default_pcm_device(const gchar *pcmdev){ - if (over_pcmdev!=NULL){ - g_free(over_pcmdev); - } - over_pcmdev=g_strdup(pcmdev); -} - -#endif
--- a/src/mediastreamer/alsacard.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include <config.h> - -#ifdef HAVE_ALSA_ASOUNDLIB_H - -#include "sndcard.h" -#define ALSA_PCM_NEW_HW_PARAMS_API -#include <alsa/asoundlib.h> -struct _AlsaCard -{ - SndCard parent; - gchar *pcmdev; - gchar *mixdev; - snd_pcm_t *read_handle; - snd_pcm_t *write_handle; - gint frame_size; - gint frames; - gchar *readbuf; - gint readpos; - gchar *writebuf; - gint writepos; - snd_mixer_t *mixer; -}; - -typedef struct _AlsaCard AlsaCard; - -SndCard *alsa_card_new(gint dev_id); -gint alsa_card_manager_init(SndCardManager *m, gint index); -void alsa_card_manager_set_default_pcm_device(const gchar *pcmdev); - -#endif
--- a/src/mediastreamer/audiostream.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,343 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mediastream.h" -#ifdef INET6 - #include <sys/types.h> - #include <sys/socket.h> - #include <netdb.h> -#endif - - -#define MAX_RTP_SIZE 1500 - -/* this code is not part of the library itself, it is part of the mediastream program */ -void audio_stream_free(AudioStream *stream) -{ - RtpSession *s; - RtpSession *destroyed=NULL; - if (stream->rtprecv!=NULL) { - s=ms_rtp_recv_get_session(MS_RTP_RECV(stream->rtprecv)); - if (s!=NULL){ - destroyed=s; - rtp_session_destroy(s); - } - ms_filter_destroy(stream->rtprecv); - } - if (stream->rtpsend!=NULL) { - s=ms_rtp_send_get_session(MS_RTP_SEND(stream->rtpsend)); - if (s!=NULL){ - if (s!=destroyed) - rtp_session_destroy(s); - } - ms_filter_destroy(stream->rtpsend); - } - if (stream->soundread!=NULL) ms_filter_destroy(stream->soundread); - if (stream->soundwrite!=NULL) ms_filter_destroy(stream->soundwrite); - if (stream->encoder!=NULL) ms_filter_destroy(stream->encoder); - if (stream->decoder!=NULL) ms_filter_destroy(stream->decoder); - if (stream->timer!=NULL) ms_sync_destroy(stream->timer); - g_free(stream); -} - -static int dtmf_tab[16]={'0','1','2','3','4','5','6','7','8','9','*','#','A','B','C','D'}; - -static void on_dtmf_received(RtpSession *s,gint dtmf,gpointer user_data) -{ - AudioStream *stream=(AudioStream*)user_data; - if (dtmf>15){ - g_warning("Unsupported telephone-event type."); - return; - } - g_message("Receiving dtmf %c.",dtmf_tab[dtmf]); - if (stream!=NULL){ - if (strcmp(stream->soundwrite->klass->name,"OssWrite")==0) - ms_oss_write_play_dtmf(MS_OSS_WRITE(stream->soundwrite),dtmf_tab[dtmf]); - } -} - -static void on_timestamp_jump(RtpSession *s,guint32* ts, gpointer user_data) -{ - g_warning("The remote sip-phone has send data with a future timestamp: %u," - "resynchronising session.",*ts); - rtp_session_reset(s); -} - -static const char *ip4local="0.0.0.0"; -static const char *ip6local="::"; - -const char *get_local_addr_for(const char *remote) -{ - const char *ret; -#ifdef INET6 - struct addrinfo hints, *res0; - int err; - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - err = getaddrinfo(remote,"8000", &hints, &res0); - if (err!=0) { - g_warning ("get_local_addr_for: %s", gai_strerror(err)); - return ip4local; - } - ret=(res0->ai_addr->sa_family==AF_INET6) ? ip6local : ip4local; - freeaddrinfo(res0); -#else - ret=ip4local; -#endif - return ret; -} - -void create_duplex_rtpsession(RtpProfile *profile, int locport,char *remip,int remport, - int payload,int jitt_comp, - RtpSession **recvsend){ - RtpSession *rtpr; - rtpr=rtp_session_new(RTP_SESSION_SENDRECV); - rtp_session_max_buf_size_set(rtpr,MAX_RTP_SIZE); - rtp_session_set_profile(rtpr,profile); - rtp_session_set_local_addr(rtpr,get_local_addr_for(remip),locport); - if (remport>0) rtp_session_set_remote_addr(rtpr,remip,remport); - rtp_session_set_scheduling_mode(rtpr,0); - rtp_session_set_blocking_mode(rtpr,0); - rtp_session_set_payload_type(rtpr,payload); - rtp_session_set_jitter_compensation(rtpr,jitt_comp); - rtp_session_enable_adaptive_jitter_compensation(rtpr,TRUE); - /*rtp_session_signal_connect(rtpr,"timestamp_jump",(RtpCallback)on_timestamp_jump,NULL);*/ - *recvsend=rtpr; -} - -void create_rtp_sessions(RtpProfile *profile, int locport,char *remip,int remport, - int payload,int jitt_comp, - RtpSession **recv, RtpSession **send){ - RtpSession *rtps,*rtpr; - /* creates two rtp filters to recv send streams (remote part)*/ - - rtps=rtp_session_new(RTP_SESSION_SENDONLY); - rtp_session_max_buf_size_set(rtps,MAX_RTP_SIZE); - rtp_session_set_profile(rtps,profile); -#ifdef INET6 - rtp_session_set_local_addr(rtps,"::",locport+2); -#else - rtp_session_set_local_addr(rtps,"0.0.0.0",locport+2); -#endif - rtp_session_set_remote_addr(rtps,remip,remport); - rtp_session_set_scheduling_mode(rtps,0); - rtp_session_set_blocking_mode(rtps,0); - rtp_session_set_payload_type(rtps,payload); - rtp_session_set_jitter_compensation(rtps,jitt_comp); - - rtpr=rtp_session_new(RTP_SESSION_RECVONLY); - rtp_session_max_buf_size_set(rtpr,MAX_RTP_SIZE); - rtp_session_set_profile(rtpr,profile); -#ifdef INET6 - rtp_session_set_local_addr(rtpr,"::",locport); -#else - rtp_session_set_local_addr(rtpr,"0.0.0.0",locport); -#endif - rtp_session_set_scheduling_mode(rtpr,0); - rtp_session_set_blocking_mode(rtpr,0); - rtp_session_set_payload_type(rtpr,payload); - rtp_session_set_jitter_compensation(rtpr,jitt_comp); - rtp_session_signal_connect(rtpr,"telephone-event",(RtpCallback)on_dtmf_received,NULL); - rtp_session_signal_connect(rtpr,"timestamp_jump",(RtpCallback)on_timestamp_jump,NULL); - *recv=rtpr; - *send=rtps; - -} - - -AudioStream * audio_stream_start_full(RtpProfile *profile, int locport,char *remip,int remport, - int payload,int jitt_comp, gchar *infile, gchar *outfile, SndCard *playcard, SndCard *captcard) -{ - AudioStream *stream=g_new0(AudioStream,1); - RtpSession *rtps,*rtpr; - PayloadType *pt; - - //create_rtp_sessions(profile,locport,remip,remport,payload,jitt_comp,&rtpr,&rtps); - - create_duplex_rtpsession(profile,locport,remip,remport,payload,jitt_comp,&rtpr); - rtp_session_signal_connect(rtpr,"telephone-event",(RtpCallback)on_dtmf_received,(gpointer)stream); - rtps=rtpr; - - stream->rtpsend=ms_rtp_send_new(); - ms_rtp_send_set_session(MS_RTP_SEND(stream->rtpsend),rtps); - stream->rtprecv=ms_rtp_recv_new(); - ms_rtp_recv_set_session(MS_RTP_RECV(stream->rtprecv),rtpr); - - - /* creates the local part */ - if (infile==NULL) stream->soundread=snd_card_create_read_filter(captcard); - else stream->soundread=ms_read_new(infile); - if (outfile==NULL) stream->soundwrite=snd_card_create_write_filter(playcard); - else stream->soundwrite=ms_write_new(outfile); - - /* creates the couple of encoder/decoder */ - pt=rtp_profile_get_payload(profile,payload); - if (pt==NULL){ - g_error("audiostream.c: undefined payload type."); - return NULL; - } - stream->encoder=ms_encoder_new_with_string_id(pt->mime_type); - stream->decoder=ms_decoder_new_with_string_id(pt->mime_type); - if ((stream->encoder==NULL) || (stream->decoder==NULL)){ - /* big problem: we have not a registered codec for this payload...*/ - audio_stream_free(stream); - g_error("mediastream.c: No decoder available for payload %i.",payload); - return NULL; - } - /* give the sound filters some properties */ - ms_filter_set_property(stream->soundread,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate); - ms_filter_set_property(stream->soundwrite,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate); - - /* give the encoder/decoder some parameters*/ - ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate); - ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_BITRATE,&pt->normal_bitrate); - ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate); - ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_BITRATE,&pt->normal_bitrate); - - ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_FMTP, (void*)pt->fmtp); - ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_FMTP,(void*)pt->fmtp); - /* create the synchronisation source */ - stream->timer=ms_timer_new(); - - /* and then connect all */ - ms_filter_add_link(stream->soundread,stream->encoder); - ms_filter_add_link(stream->encoder,stream->rtpsend); - ms_filter_add_link(stream->rtprecv,stream->decoder); - ms_filter_add_link(stream->decoder,stream->soundwrite); - - ms_sync_attach(stream->timer,stream->soundread); - ms_sync_attach(stream->timer,stream->rtprecv); - - /* and start */ - ms_start(stream->timer); - - return stream; -} - -static int defcard=0; - -void audio_stream_set_default_card(int cardindex){ - defcard=cardindex; -} - -AudioStream * audio_stream_start_with_files(RtpProfile *prof,int locport,char *remip, - int remport,int profile,int jitt_comp,gchar *infile, gchar*outfile) -{ - return audio_stream_start_full(prof,locport,remip,remport,profile,jitt_comp,infile,outfile,NULL,NULL); -} - -AudioStream * audio_stream_start(RtpProfile *prof,int locport,char *remip,int remport,int profile,int jitt_comp) -{ - SndCard *sndcard; - sndcard=snd_card_manager_get_card(snd_card_manager,defcard); - return audio_stream_start_full(prof,locport,remip,remport,profile,jitt_comp,NULL,NULL,sndcard,sndcard); -} - -AudioStream *audio_stream_start_with_sndcards(RtpProfile *prof,int locport,char *remip,int remport,int profile,int jitt_comp,SndCard *playcard, SndCard *captcard) -{ - g_return_val_if_fail(playcard!=NULL,NULL); - g_return_val_if_fail(captcard!=NULL,NULL); - return audio_stream_start_full(prof,locport,remip,remport,profile,jitt_comp,NULL,NULL,playcard,captcard); -} - -void audio_stream_set_rtcp_information(AudioStream *st, const char *cname){ - if (st->send_session!=NULL){ - rtp_session_set_source_description(st->send_session,cname,NULL,NULL,NULL,NULL,"linphone-" "2.0.0", // SME - "This is free software (GPL) !"); - } -} - -void audio_stream_stop(AudioStream * stream) -{ - - ms_stop(stream->timer); - ortp_global_stats_display(); - ms_sync_detach(stream->timer,stream->soundread); - ms_sync_detach(stream->timer,stream->rtprecv); - - ms_filter_remove_links(stream->soundread,stream->encoder); - ms_filter_remove_links(stream->encoder,stream->rtpsend); - ms_filter_remove_links(stream->rtprecv,stream->decoder); - ms_filter_remove_links(stream->decoder,stream->soundwrite); - - audio_stream_free(stream); -} - -RingStream * ring_start(gchar *file,gint interval,SndCard *sndcard) -{ - return ring_start_with_cb(file,interval,sndcard,NULL,NULL); -} - -RingStream * ring_start_with_cb(gchar *file,gint interval,SndCard *sndcard, MSFilterNotifyFunc func,gpointer user_data) -{ - RingStream *stream; - int tmp; - g_return_val_if_fail(sndcard!=NULL,NULL); - stream=g_new0(RingStream,1); - stream->source=ms_ring_player_new(file,interval); - if (stream->source==NULL) { - g_warning("Could not create ring player. Probably the ring file (%s) does not exist.",file); - return NULL; - } - if (func!=NULL) ms_filter_set_notify_func(MS_FILTER(stream->source),func,user_data); - stream->sndwrite=snd_card_create_write_filter(sndcard); - ms_filter_get_property(stream->source,MS_FILTER_PROPERTY_FREQ,&tmp); - ms_filter_set_property(stream->sndwrite,MS_FILTER_PROPERTY_FREQ,&tmp); - ms_filter_get_property(stream->source,MS_FILTER_PROPERTY_CHANNELS,&tmp); - ms_filter_set_property(stream->sndwrite,MS_FILTER_PROPERTY_CHANNELS,&tmp); - stream->timer=ms_timer_new(); - ms_filter_add_link(stream->source,stream->sndwrite); - ms_sync_attach(stream->timer,stream->source); - ms_start(stream->timer); - return stream; -} - -void ring_stop(RingStream *stream) -{ - ms_stop(stream->timer); - ms_sync_detach(stream->timer,stream->source); - ms_sync_destroy(stream->timer); - ms_filter_remove_links(stream->source,stream->sndwrite); - ms_filter_destroy(stream->source); - ms_filter_destroy(stream->sndwrite); - g_free(stream); -} - -/* returns the latency in samples if the audio device with id dev_id is openable in full duplex mode, else 0 */ -gint test_audio_dev(int dev_id) -{ - gint err; - SndCard *sndcard=snd_card_manager_get_card(snd_card_manager,dev_id); - if (sndcard==NULL) return -1; - err=snd_card_probe(sndcard,16,0,8000); - return err; /* return latency in number of sample */ -} - -gint audio_stream_send_dtmf(AudioStream *stream, gchar dtmf) -{ - ms_rtp_send_dtmf(MS_RTP_SEND(stream->rtpsend), dtmf); - ms_oss_write_play_dtmf(MS_OSS_WRITE(stream->soundwrite),dtmf); - - /* not sure what this should be returning, nothing in mediastreamer calls - * it directly, assuming 0 is okay here. -- Gary - */ - return 0; -}
--- a/src/mediastreamer/g711common.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,171 +0,0 @@ -/* - * PCM - A-Law conversion - * Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> - * - * Wrapper for linphone Codec class by Simon Morlat <simon.morlat@free.fr> - */ - -static inline int val_seg(int val) -{ - int r = 0; - val >>= 7; - if (val & 0xf0) { - val >>= 4; - r += 4; - } - if (val & 0x0c) { - val >>= 2; - r += 2; - } - if (val & 0x02) - r += 1; - return r; -} - -/* - * s16_to_alaw() - Convert a 16-bit linear PCM value to 8-bit A-law - * - * s16_to_alaw() accepts an 16-bit integer and encodes it as A-law data. - * - * Linear Input Code Compressed Code - * ------------------------ --------------- - * 0000000wxyza 000wxyz - * 0000001wxyza 001wxyz - * 000001wxyzab 010wxyz - * 00001wxyzabc 011wxyz - * 0001wxyzabcd 100wxyz - * 001wxyzabcde 101wxyz - * 01wxyzabcdef 110wxyz - * 1wxyzabcdefg 111wxyz - * - * For further information see John C. Bellamy's Digital Telephony, 1982, - * John Wiley & Sons, pps 98-111 and 472-476. - */ - -static inline unsigned char s16_to_alaw(int pcm_val) -{ - int mask; - int seg; - unsigned char aval; - - if (pcm_val >= 0) { - mask = 0xD5; - } else { - mask = 0x55; - pcm_val = -pcm_val; - if (pcm_val > 0x7fff) - pcm_val = 0x7fff; - } - - if (pcm_val < 256) - aval = pcm_val >> 4; - else { - /* Convert the scaled magnitude to segment number. */ - seg = val_seg(pcm_val); - aval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f); - } - return aval ^ mask; -} - -/* - * alaw_to_s16() - Convert an A-law value to 16-bit linear PCM - * - */ -static inline int alaw_to_s16(unsigned char a_val) -{ - int t; - int seg; - - a_val ^= 0x55; - t = a_val & 0x7f; - if (t < 16) - t = (t << 4) + 8; - else { - seg = (t >> 4) & 0x07; - t = ((t & 0x0f) << 4) + 0x108; - t <<= seg -1; - } - return ((a_val & 0x80) ? t : -t); -} -/* - * s16_to_ulaw() - Convert a linear PCM value to u-law - * - * In order to simplify the encoding process, the original linear magnitude - * is biased by adding 33 which shifts the encoding range from (0 - 8158) to - * (33 - 8191). The result can be seen in the following encoding table: - * - * Biased Linear Input Code Compressed Code - * ------------------------ --------------- - * 00000001wxyza 000wxyz - * 0000001wxyzab 001wxyz - * 000001wxyzabc 010wxyz - * 00001wxyzabcd 011wxyz - * 0001wxyzabcde 100wxyz - * 001wxyzabcdef 101wxyz - * 01wxyzabcdefg 110wxyz - * 1wxyzabcdefgh 111wxyz - * - * Each biased linear code has a leading 1 which identifies the segment - * number. The value of the segment number is equal to 7 minus the number - * of leading 0's. The quantization interval is directly available as the - * four bits wxyz. * The trailing bits (a - h) are ignored. - * - * Ordinarily the complement of the resulting code word is used for - * transmission, and so the code word is complemented before it is returned. - * - * For further information see John C. Bellamy's Digital Telephony, 1982, - * John Wiley & Sons, pps 98-111 and 472-476. - */ - -static inline unsigned char s16_to_ulaw(int pcm_val) /* 2's complement (16-bit range) */ -{ - int mask; - int seg; - unsigned char uval; - - if (pcm_val < 0) { - pcm_val = 0x84 - pcm_val; - mask = 0x7f; - } else { - pcm_val += 0x84; - mask = 0xff; - } - if (pcm_val > 0x7fff) - pcm_val = 0x7fff; - - /* Convert the scaled magnitude to segment number. */ - seg = val_seg(pcm_val); - - /* - * Combine the sign, segment, quantization bits; - * and complement the code word. - */ - uval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f); - return uval ^ mask; -} - -/* - * ulaw_to_s16() - Convert a u-law value to 16-bit linear PCM - * - * First, a biased linear code is derived from the code word. An unbiased - * output can then be obtained by subtracting 33 from the biased code. - * - * Note that this function expects to be passed the complement of the - * original code word. This is in keeping with ISDN conventions. - */ -static inline int ulaw_to_s16(unsigned char u_val) -{ - int t; - - /* Complement to obtain normal u-law value. */ - u_val = ~u_val; - - /* - * Extract and bias the quantization bits. Then - * shift up by the segment number and subtract out the bias. - */ - t = ((u_val & 0x0f) << 3) + 0x84; - t <<= (u_val & 0x70) >> 4; - - return ((u_val & 0x80) ? (0x84 - t) : (t - 0x84)); -}
--- a/src/mediastreamer/hpuxsndcard.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,301 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "sndcard.h" -#include "osscard.h" - -#ifdef HAVE_SYS_AUDIO_H -#include <sys/audio.h> - - -#include "msossread.h" -#include "msosswrite.h" - -#include <errno.h> -#include <fcntl.h> - - -int hpuxsnd_open(HpuxSndCard *obj, int bits,int stereo, int rate) -{ - int fd; - int p=0,cond=0; - int i=0; - int min_size=0,blocksize=512; - /* do a quick non blocking open to be sure that we are not going to be blocked here - for the eternity */ - fd=open(obj->dev_name,O_RDWR|O_NONBLOCK); - if (fd<0) return -EWOULDBLOCK; - close(fd); - /* open the device */ - fd=open(obj->dev_name,O_RDWR); - - g_return_val_if_fail(fd>0,-errno); - - ioctl(fd,AUDIO_RESET,0); - ioctl(fd,AUDIO_SET_SAMPLE_RATE,rate); - ioctl(fd,AUDIO_SET_CHANNELS,stereo); - p=AUDIO_FORMAT_LINEAR16BIT; - ioctl(fd,AUDIO_SET_DATA_FORMAT,p); - /* ioctl(fd,AUDIO_GET_RXBUFSIZE,&min_size); does not work ? */ - min_size=2048; - - g_message("dsp blocksize is %i.",min_size); - obj->fd=fd; - obj->readpos=0; - obj->writepos=0; - SND_CARD(obj)->bits=bits; - SND_CARD(obj)->stereo=stereo; - SND_CARD(obj)->rate=rate; - SND_CARD(obj)->bsize=min_size; - return fd; -} - -int hpux_snd_card_probe(HpuxSndCard *obj,int bits,int stereo,int rate) -{ - return 2048; -} - - -int hpux_snd_card_open(HpuxSndCard *obj,int bits,int stereo,int rate) -{ - int fd; - obj->ref++; - if (obj->fd==0){ - fd=hpuxsnd_open(obj,bits,stereo,rate); - if (fd<0) { - obj->fd=0; - obj->ref--; - return -1; - } - } - SND_CARD(obj)->flags|=SND_CARD_FLAGS_OPENED; - return 0; -} - -void hpux_snd_card_close(HpuxSndCard *obj) -{ - int i; - obj->ref--; - if (obj->ref==0) { - close(obj->fd); - obj->fd=0; - SND_CARD(obj)->flags&=~SND_CARD_FLAGS_OPENED; - - } -} - -void hpux_snd_card_destroy(HpuxSndCard *obj) -{ - snd_card_uninit(SND_CARD(obj)); - g_free(obj->dev_name); - g_free(obj->mixdev_name); -} - -gboolean hpux_snd_card_can_read(HpuxSndCard *obj) -{ - struct timeval tout={0,0}; - int err; - fd_set fdset; - FD_ZERO(&fdset); - FD_SET(obj->fd,&fdset); - err=select(obj->fd+1,&fdset,NULL,NULL,&tout); - if (err>0) return TRUE; - else return FALSE; -} - -int hpux_snd_card_read(HpuxSndCard *obj,char *buf,int size) -{ - int err; - gint bsize=SND_CARD(obj)->bsize; - if (size<bsize){ - gint canread=MIN(bsize-obj->readpos,size); - if (obj->readbuf==NULL) obj->readbuf=g_malloc0(bsize); - if (obj->readpos==0){ - err=read(obj->fd,obj->readbuf,bsize); - if (err<0) { - g_warning("hpux_snd_card_read: read() failed:%s.",strerror(errno)); - return -1; - } - } - - memcpy(buf,&obj->readbuf[obj->readpos],canread); - obj->readpos+=canread; - if (obj->readpos>=bsize) obj->readpos=0; - return canread; - }else{ - err=read(obj->fd,buf,size); - if (err<0) { - g_warning("hpux_snd_card_read: read-2() failed:%s.",strerror(errno)); - } - return err; - } - -} - -int hpux_snd_card_write(HpuxSndCard *obj,char *buf,int size) -{ - int err; - gint bsize=SND_CARD(obj)->bsize; - if (size<bsize){ - gint canwrite=MIN(bsize-obj->writepos,size); - if (obj->writebuf==NULL) obj->writebuf=g_malloc0(bsize); - - memcpy(&obj->writebuf[obj->writepos],buf,canwrite); - obj->writepos+=canwrite; - if (obj->writepos>=bsize){ - err=write(obj->fd,obj->writebuf,bsize); - } - return canwrite; - }else{ - return write(obj->fd,buf,bsize); - } -} - -#define SND_CARD_LEVEL_TO_HPUX_LEVEL(a) (((a)*2) - 100) -#define HPUX_LEVEL_TO_SND_CARD_LEVEL(a) (((a)+200)/2) -void hpux_snd_card_set_level(HpuxSndCard *obj,gint way,gint a) -{ - struct audio_gain gain; - int error,mix_fd; - - g_return_if_fail(obj->mixdev_name!=NULL); - memset(&gain,0,sizeof(struct audio_gain)); - switch(way){ - case SND_CARD_LEVEL_GENERAL: - gain.cgain[0].monitor_gain=SND_CARD_LEVEL_TO_HPUX_LEVEL(a); - gain.cgain[1].monitor_gain=SND_CARD_LEVEL_TO_HPUX_LEVEL(a); - break; - case SND_CARD_LEVEL_INPUT: - gain.cgain[0].receive_gain=SND_CARD_LEVEL_TO_HPUX_LEVEL(a); - gain.cgain[1].receive_gain=SND_CARD_LEVEL_TO_HPUX_LEVEL(a); - break; - case SND_CARD_LEVEL_OUTPUT: - gain.cgain[0].transmit_gain=SND_CARD_LEVEL_TO_HPUX_LEVEL(a); - gain.cgain[1].transmit_gain=SND_CARD_LEVEL_TO_HPUX_LEVEL(a); - break; - default: - g_warning("hpux_snd_card_set_level: unsupported command."); - return; - } - gain.channel_mask=AUDIO_CHANNEL_RIGHT|AUDIO_CHANNEL_LEFT; - mix_fd = open(obj->mixdev_name, O_WRONLY); - g_return_if_fail(mix_fd>0); - error=ioctl(mix_fd,AUDIO_SET_GAINS,&gain); - if (error<0){ - g_warning("hpux_snd_card_set_level: Could not set gains: %s",strerror(errno)); - } - close(mix_fd); -} - -gint hpux_snd_card_get_level(HpuxSndCard *obj,gint way) -{ - struct audio_gain gain; - int p=0,mix_fd,error; - g_return_if_fail(obj->mixdev_name!=NULL); - - gain.channel_mask=AUDIO_CHANNEL_RIGHT|AUDIO_CHANNEL_LEFT; - mix_fd = open(obj->mixdev_name, O_RDONLY); - g_return_if_fail(mix_fd>0); - error=ioctl(mix_fd,AUDIO_GET_GAINS,&gain); - if (error<0){ - g_warning("hpux_snd_card_set_level: Could not get gains: %s",strerror(errno)); - } - close(mix_fd); - - switch(way){ - case SND_CARD_LEVEL_GENERAL: - p=gain.cgain[0].monitor_gain; - break; - case SND_CARD_LEVEL_INPUT: - p=gain.cgain[0].receive_gain; - break; - case SND_CARD_LEVEL_OUTPUT: - p=gain.cgain[0].transmit_gain; - break; - default: - g_warning("hpux_snd_card_get_level: unsupported command."); - return -1; - } - return HPUX_LEVEL_TO_SND_CARD_LEVEL(p); -} - -void hpux_snd_card_set_source(HpuxSndCard *obj,int source) -{ - gint p=0; - gint mix_fd; - gint error=0; - g_return_if_fail(obj->mixdev_name!=NULL); - - mix_fd=open("/dev/audio",O_WRONLY); - g_return_if_fail(mix_fd>0); - switch(source){ - case 'm': - error=ioctl(mix_fd,AUDIO_SET_INPUT,AUDIO_IN_MIKE); - break; - case 'l': - error=ioctl(mix_fd,AUDIO_SET_INPUT,AUDIO_IN_LINE); - break; - default: - g_warning("hpux_snd_card_set_source: unsupported source."); - } - close(mix_fd); -} - -MSFilter *hpux_snd_card_create_read_filter(HpuxSndCard *card) -{ - MSFilter *f=ms_oss_read_new(); - ms_oss_read_set_device(MS_OSS_READ(f),SND_CARD(card)->index); - return f; -} - -MSFilter *hpux_snd_card_create_write_filter(HpuxSndCard *card) -{ - MSFilter *f=ms_oss_write_new(); - ms_oss_write_set_device(MS_OSS_WRITE(f),SND_CARD(card)->index); - return f; -} - - -SndCard * hpux_snd_card_new(char *devname, char *mixdev_name) -{ - HpuxSndCard * obj= g_new0(HpuxSndCard,1); - SndCard *base= SND_CARD(obj); - snd_card_init(base); - obj->dev_name=g_strdup(devname); - obj->mixdev_name=g_strdup( mixdev_name); - base->card_name=g_strdup(devname); - base->_probe=(SndCardOpenFunc)hpux_snd_card_probe; - base->_open_r=(SndCardOpenFunc)hpux_snd_card_open; - base->_open_w=(SndCardOpenFunc)hpux_snd_card_open; - base->_can_read=(SndCardPollFunc)hpux_snd_card_can_read; - base->_read=(SndCardIOFunc)hpux_snd_card_read; - base->_write=(SndCardIOFunc)hpux_snd_card_write; - base->_close_r=(SndCardCloseFunc)hpux_snd_card_close; - base->_close_w=(SndCardCloseFunc)hpux_snd_card_close; - base->_set_rec_source=(SndCardMixerSetRecSourceFunc)hpux_snd_card_set_source; - base->_set_level=(SndCardMixerSetLevelFunc)hpux_snd_card_set_level; - base->_get_level=(SndCardMixerGetLevelFunc)hpux_snd_card_get_level; - base->_destroy=(SndCardDestroyFunc)hpux_snd_card_destroy; - base->_create_read_filter=(SndCardCreateFilterFunc)hpux_snd_card_create_read_filter; - base->_create_write_filter=(SndCardCreateFilterFunc)hpux_snd_card_create_write_filter; - return base; -} - -#endif
--- a/src/mediastreamer/jackcard.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,574 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - JACK support - Copyright (C) 2004 Tobias Gehrig tobias@gehrig.tk -*/ - -#include "jackcard.h" - -#ifdef __JACK_ENABLED__ - -#include "msossread.h" -#include "msosswrite.h" - -#include <signal.h> - -#define READBUFFERSIZE 524288 -#define WRITEBUFFERSIZE 524288 -#define BSIZE 512 - -/** - * jack_shutdown: - * @arg: - * - * This is the shutdown callback for this JACK application. - * It is called by JACK if the server ever shuts down or - * decides to disconnect the client. - * - */ -void -jack_shutdown (void *arg) -{ - JackCard* obj = (JackCard*) arg; - - obj->jack_running = FALSE; - obj->jack_active = FALSE; - obj->read.port = NULL; - if (obj->read.open) - obj->read.init = TRUE; - obj->write.port = NULL; - if (obj->write.open) - obj->write.init = TRUE; -} - -int samplerate(jack_nframes_t rate, void *arg) -{ - JackCard* obj = (JackCard*) arg; - int error; - - obj->rate = rate; - if (obj->read.open) { - obj->read.data.src_ratio = (double)obj->read.rate / (double)obj->rate; - obj->read.data.input_frames = (long)((double)obj->read.frames/obj->read.data.src_ratio); - g_free(obj->read.data.data_in); - obj->read.data.data_in = malloc(obj->read.data.input_frames*sizeof(float)); - if (obj->read.src_state) - if ((error = src_set_ratio(obj->read.src_state, obj->read.data.src_ratio)) != 0) - g_warning("Error while resetting the write samplerate: %s", src_strerror(error)); - } - if (obj->write.open) { - obj->write.data.src_ratio = (double)obj->rate / (double)obj->write.rate; - obj->write.data.output_frames = (long)((double)obj->write.frames*obj->write.data.src_ratio); - g_free(obj->write.data.data_out); - obj->write.data.data_out = malloc(obj->write.data.output_frames*sizeof(float)); - if (obj->write.src_state) - if ((error = src_set_ratio(obj->write.src_state, obj->write.data.src_ratio)) != 0) - g_warning("Error while resetting the write samplerate: %s", src_strerror(error)); - } - return 0; -} - -/* - * The process callback for this JACK application. - * It is called by JACK at the appropriate times. - * @nframes : - * @arg : - */ -int -process (jack_nframes_t nframes, void *arg) -{ - JackCard* obj = (JackCard*) arg; - sample_t *out; - sample_t *in; - - if (obj->clear && !obj->write.can_process) { - out = (sample_t *) jack_port_get_buffer (obj->write.port, nframes); - memset (out, 0, nframes * sizeof(sample_t)); - obj->clear = FALSE; - } - - if (!obj->can_process) - return 0; - - if(obj->read.can_process) { - in = (sample_t *) jack_port_get_buffer (obj->read.port, nframes); - jack_ringbuffer_write (obj->read.buffer, (void *) in, sizeof(sample_t) * nframes); - } - - if (obj->write.can_process) { - out = (sample_t *) jack_port_get_buffer (obj->write.port, nframes); - memset (out, 0, nframes * sizeof(sample_t)); - if (obj->clear && jack_ringbuffer_read_space(obj->write.buffer) == 0) { - obj->write.can_process = FALSE; - if (!obj->read.open) - obj->can_process = FALSE; - obj->clear = FALSE; - return 0; - } - jack_ringbuffer_read (obj->write.buffer, (void *) out, sizeof(sample_t) * nframes); - } - return 0; -} - -int jack_init(JackCard* obj) -{ - char* client_name; - int error; - - if (!obj->jack_running) { - obj->client = NULL; - client_name = g_strdup_printf("linphone-%u", g_random_int()); - if ((obj->client = jack_client_new (client_name)) == NULL) { - g_warning("cannot create jack client"); - g_free(client_name); - return -1; - } - g_message("Found Jack Daemon"); - g_free(client_name); - - /* tell the JACK server to call `process()' whenever - there is work to be done. - */ - jack_set_process_callback (obj->client, process, obj); - - /* tell the JACK server to call `jack_shutdown()' if - it ever shuts down, either entirely, or if it - just decides to stop calling us. - */ - jack_on_shutdown (obj->client, jack_shutdown, obj); - jack_set_sample_rate_callback (obj->client, samplerate, obj); - obj->rate = jack_get_sample_rate (obj->client); - if (obj->rate == 0) { - g_warning ("rate is 0???"); - if (jack_client_close(obj->client) != 0) - g_warning("could not close client"); - return -1; - } - obj->buffer_size = jack_get_buffer_size(obj->client); - obj->jack_running = TRUE; - } - - if (!obj->jack_active) { - if (jack_activate (obj->client)) { - g_warning("cannot activate jack client"); - return -1; - } else obj->jack_active = TRUE; - } - - if (obj->read.init) { - if (!obj->read.port && (obj->read.port = jack_port_register (obj->client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0))==NULL) { - g_warning("error while trying to register input port"); - return -1; - } - if (!obj->read.phys_ports && (obj->read.phys_ports = jack_get_ports (obj->client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == NULL) { - g_warning("Cannot find any physical capture ports\n"); - jack_port_unregister(obj->client, obj->read.port); - obj->read.port = NULL; - return -1; - } - if (!jack_port_connected(obj->read.port)) - if ((error = jack_connect (obj->client, obj->read.phys_ports[0], jack_port_name (obj->read.port))) != 0) { - g_warning("cannot connect input ports: %s -> %s\n", jack_port_name (obj->read.port), obj->read.phys_ports[0]); - if (error == EEXIST) g_warning("connection already made"); - else { - jack_port_unregister(obj->client, obj->read.port); - obj->read.port = NULL; - return -1; - } - } - obj->read.init = FALSE; - } - - if (obj->write.init) { - if (!obj->write.port && (obj->write.port = jack_port_register (obj->client, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0))==NULL) { - g_warning("error while trying to register output port"); - return -1; - } - if (!obj->write.phys_ports && (obj->write.phys_ports = jack_get_ports (obj->client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == NULL) { - g_warning("Cannot find any physical playback ports\n"); - jack_port_unregister(obj->client, obj->write.port); - obj->write.port = NULL; - return -1; - } - if (!jack_port_connected(obj->write.port)) { - if ((error = jack_connect (obj->client, jack_port_name (obj->write.port), obj->write.phys_ports[0])) != 0) { - g_warning("cannot connect output ports: %s -> %s\n", jack_port_name (obj->write.port), obj->write.phys_ports[0]); - if (error == EEXIST) g_warning("connection already made"); - else { - jack_port_unregister(obj->client, obj->write.port); - obj->write.port = NULL; - return -1; - } - } - if ((error = jack_connect (obj->client, jack_port_name (obj->write.port), obj->write.phys_ports[1])) != 0) { - g_warning("cannot connect output ports: %s -> %s\n", jack_port_name (obj->write.port), obj->write.phys_ports[1]); - if (error == EEXIST) g_warning("connection already made"); - else { - jack_port_unregister(obj->client, obj->write.port); - obj->write.port = NULL; - return -1; - } - } - } - obj->write.init = FALSE; - } - return 0; -} - -int jack_card_open_r(JackCard *obj,int bits,int stereo,int rate) -{ - int channels = stereo + 1, bsize, error; - obj->read.init = TRUE; - if (jack_init(obj) != 0) return -1; - - obj->read.rate = rate; - obj->sample_size = bits / 8; - obj->frame_size = channels * obj->sample_size; - bsize = BSIZE; - obj->read.frames = bsize / 2; - SND_CARD(obj)->bsize = bsize; - SND_CARD(obj)->flags |= SND_CARD_FLAGS_OPENED; - obj->read.channels = channels; - if ((obj->read.src_state = src_new (SRC_SINC_FASTEST, channels, &error)) == NULL) - g_warning("Error while initializing the samplerate converter: %s", src_strerror(error)); - obj->read.data.src_ratio = (double)rate / (double)obj->rate; - obj->read.data.input_frames = (long)((double)obj->read.frames/obj->read.data.src_ratio); - obj->read.data.data_in = malloc(obj->read.data.input_frames*sizeof(float)); - obj->read.data.data_out = malloc(obj->read.frames*sizeof(float)); - obj->read.data.end_of_input = 0; - if (!obj->read.buffer) - obj->read.buffer = jack_ringbuffer_create(READBUFFERSIZE); - obj->read.can_process = TRUE; - obj->can_process = TRUE; - obj->read.open = TRUE; - obj->read.init = FALSE; - return 0; -} - -int jack_card_open_w(JackCard *obj,int bits,int stereo,int rate) -{ - int channels = stereo + 1, bsize, err; - obj->write.init = TRUE; - if (jack_init(obj) != 0) return -1; - - obj->write.rate = rate; - obj->sample_size = bits / 8; - obj->frame_size = channels * obj->sample_size; - bsize = BSIZE; - obj->write.frames = bsize / 2; - SND_CARD(obj)->bsize = bsize; - SND_CARD(obj)->flags |= SND_CARD_FLAGS_OPENED; - obj->write.channels = channels; - if ((obj->write.src_state = src_new (SRC_SINC_FASTEST, channels, &err)) == NULL) - g_warning("Error while initializing the samplerate converter: %s", src_strerror(err)); - obj->write.data.src_ratio = (double)obj->rate / (double)rate; - obj->write.data.data_in = malloc(obj->write.frames*sizeof(float)); - obj->write.data.end_of_input = 0; - obj->write.data.output_frames = (long)((double)obj->write.frames*obj->write.data.src_ratio); - obj->write.data.data_out = malloc(obj->write.data.output_frames*sizeof(float)); - if (!obj->write.buffer) - obj->write.buffer = jack_ringbuffer_create(WRITEBUFFERSIZE); - obj->write.can_process = TRUE; - obj->can_process = TRUE; - obj->write.open = TRUE; - obj->write.init = FALSE; - return 0; -} - -void jack_card_set_blocking_mode(JackCard *obj, gboolean yesno) -{ -} - -void jack_card_close_r(JackCard *obj) -{ - obj->read.open = FALSE; - obj->read.init = FALSE; - obj->read.can_process = FALSE; - if (!obj->write.open) - obj->can_process = FALSE; - if (obj->read.src_state) - obj->read.src_state = src_delete (obj->read.src_state); - g_free(obj->read.data.data_in); - g_free(obj->read.data.data_out); -} - -void jack_card_close_w(JackCard *obj) -{ - obj->write.open = FALSE; - obj->write.init = FALSE; - obj->clear = TRUE; - if (!obj->jack_running) { - obj->write.can_process = FALSE; - obj->can_process = FALSE; - } - if (obj->write.src_state) - obj->write.src_state = src_delete (obj->write.src_state); - g_free(obj->write.data.data_in); - g_free(obj->write.data.data_out); -} - -int jack_card_probe(JackCard *obj,int bits,int stereo,int rate) -{ - if (obj->jack_running) return BSIZE; - else if (jack_init(obj) == 0) return BSIZE; - else return -1; -} - -void jack_card_destroy(JackCard *obj) -{ - if (obj->jack_running) jack_client_close (obj->client); - snd_card_uninit(SND_CARD(obj)); - if (obj->read.buffer) { - jack_ringbuffer_free(obj->read.buffer); - obj->read.buffer = NULL; - } - if (obj->write.buffer) { - jack_ringbuffer_free(obj->write.buffer); - obj->write.buffer = NULL; - } - if (obj->read.phys_ports) { - g_free(obj->read.phys_ports); - obj->read.phys_ports = NULL; - } - if (obj->write.phys_ports) { - g_free(obj->write.phys_ports); - obj->write.phys_ports = NULL; - } -} - -gboolean jack_card_can_read(JackCard *obj) -{ - g_return_val_if_fail(obj->read.buffer!=NULL,0); - if (jack_ringbuffer_read_space(obj->read.buffer)>=(long)((double)obj->read.frames/obj->read.data.src_ratio)*sizeof(sample_t)) return TRUE; - else return FALSE; -} - -int jack_card_read(JackCard *obj,char *buf,int size) -{ - size_t bytes, can_read, i; - int error; - float norm, value; - - g_return_val_if_fail((obj->read.buffer!=NULL)&&(obj->read.src_state!=NULL),-1); - if (jack_init(obj) != 0) return -1; - size /= 2; - can_read = MIN(size, obj->read.frames); - // can_read = MIN(((long)((double)can_read / obj->read.data.src_ratio))*sizeof(sample_t), jack_ringbuffer_read_space(obj->read.buffer)); - can_read = ((long)((double)can_read / obj->read.data.src_ratio))*sizeof(sample_t); - obj->read.can_process = FALSE; - bytes = jack_ringbuffer_read (obj->read.buffer, (void *)obj->read.data.data_in, can_read); - obj->read.can_process = TRUE; - obj->read.data.input_frames = bytes / sizeof(sample_t); - can_read = MIN(size, obj->read.frames); - obj->read.data.output_frames = can_read; - if ((error = src_process(obj->read.src_state, &(obj->read.data))) != 0) - g_warning("error while samplerate conversion. error: %s", src_strerror(error)); - norm = obj->read.level*obj->level*(float)0x8000; - for (i=0; i < obj->read.data.output_frames_gen; i++) { - value = obj->read.data.data_out[i]*norm; - if (value >= 32767.0) - ((short*)buf)[i] = 32767; - else if (value <= -32768.0) - ((short*)buf)[i] = -32768; - else - ((short*)buf)[i] = (short)value; - } - bytes = obj->read.data.output_frames_gen * 2; - return bytes; -} - -int jack_card_write(JackCard *obj,char *buf,int size) -{ - size_t bytes, can_write, i; - int error; - float norm; - - g_return_val_if_fail((obj->write.buffer!=NULL)&&(obj->write.src_state!=NULL),-1); - if (jack_init(obj) != 0) return -1; - size /= 2; - can_write = MIN(size, obj->write.frames); - norm = obj->write.level*obj->level/(float)0x8000; - for (i=0; i<can_write; i++) { - obj->write.data.data_in[i] = (float)((short*)buf)[i]*norm; - } - obj->write.data.input_frames = can_write; - if ((error = src_process(obj->write.src_state, &(obj->write.data))) != 0) - g_warning("error while samplerate conversion. error: %s", src_strerror(error)); - obj->write.can_process = FALSE; - bytes = jack_ringbuffer_write (obj->write.buffer, (void *) obj->write.data.data_out, sizeof(sample_t)*obj->write.data.output_frames_gen); - obj->write.can_process = TRUE; - return bytes; -} - -void jack_card_set_level(JackCard *obj,gint way,gint a) -{ - switch(way){ - case SND_CARD_LEVEL_GENERAL: - obj->level = (float)a / 100.0; - break; - case SND_CARD_LEVEL_INPUT: - obj->read.level = (float)a / 100.0; - break; - case SND_CARD_LEVEL_OUTPUT: - obj->write.level = (float)a / 100.0; - break; - default: - g_warning("jack_card_set_level: unsupported command."); - } -} - -gint jack_card_get_level(JackCard *obj,gint way) -{ - gint value = 0; - - switch(way){ - case SND_CARD_LEVEL_GENERAL: - value = (gint)(obj->level*100.0); - break; - case SND_CARD_LEVEL_INPUT: - value = (gint)(obj->read.level*100.0); - break; - case SND_CARD_LEVEL_OUTPUT: - value = (gint)(obj->write.level*100.0); - break; - default: - g_warning("jack_card_get_level: unsupported command."); - } - return value; -} - -void jack_card_set_source(JackCard *obj,int source) -{ -} - -MSFilter *jack_card_create_read_filter(JackCard *card) -{ - MSFilter *f=ms_oss_read_new(); - ms_oss_read_set_device(MS_OSS_READ(f),SND_CARD(card)->index); - return f; -} - -MSFilter *jack_card_create_write_filter(JackCard *card) -{ - MSFilter *f=ms_oss_write_new(); - ms_oss_write_set_device(MS_OSS_WRITE(f),SND_CARD(card)->index); - return f; -} -SndCard * jack_card_new(jack_client_t *client) -{ - JackCard * obj; - SndCard *base; - - obj= g_new0(JackCard,1); - - if (!client) return NULL; - obj->client = client; - obj->jack_running = TRUE; - obj->jack_active = FALSE; - obj->can_process = FALSE; - obj->clear = TRUE; - obj->write.can_process = FALSE; - obj->write.open = FALSE; - obj->write.init = TRUE; - obj->write.port = NULL; - obj->write.phys_ports = NULL; - obj->write.buffer = NULL; - obj->read.can_process = FALSE; - obj->read.open = FALSE; - obj->read.init = TRUE; - obj->read.port = NULL; - obj->read.phys_ports = NULL; - obj->read.buffer = NULL; - - /* tell the JACK server to call `process()' whenever - there is work to be done. - */ - jack_set_process_callback (client, process, obj); - - /* tell the JACK server to call `jack_shutdown()' if - it ever shuts down, either entirely, or if it - just decides to stop calling us. - */ - jack_on_shutdown (client, jack_shutdown, obj); - - jack_set_sample_rate_callback (client, samplerate, obj); - - obj->rate = jack_get_sample_rate (client); - obj->buffer_size = jack_get_buffer_size(obj->client); - - jack_init(obj); - - base= SND_CARD(obj); - snd_card_init(base); - -#ifdef HAVE_GLIB - base->card_name=g_strdup_printf("JACK client"); -#else - base->card_name=malloc(100); - snprintf(base->card_name, 100, "JACK client"); -#endif - - base->_probe=(SndCardOpenFunc)jack_card_probe; - base->_open_r=(SndCardOpenFunc)jack_card_open_r; - base->_open_w=(SndCardOpenFunc)jack_card_open_w; - base->_can_read=(SndCardPollFunc)jack_card_can_read; - base->_set_blocking_mode=(SndCardSetBlockingModeFunc)jack_card_set_blocking_mode; - base->_read=(SndCardIOFunc)jack_card_read; - base->_write=(SndCardIOFunc)jack_card_write; - base->_close_r=(SndCardCloseFunc)jack_card_close_r; - base->_close_w=(SndCardCloseFunc)jack_card_close_w; - base->_set_rec_source=(SndCardMixerSetRecSourceFunc)jack_card_set_source; - base->_set_level=(SndCardMixerSetLevelFunc)jack_card_set_level; - base->_get_level=(SndCardMixerGetLevelFunc)jack_card_get_level; - base->_destroy=(SndCardDestroyFunc)jack_card_destroy; - base->_create_read_filter=(SndCardCreateFilterFunc)jack_card_create_read_filter; - base->_create_write_filter=(SndCardCreateFilterFunc)jack_card_create_write_filter; - - obj->read.buffer=NULL; - obj->write.buffer=NULL; - obj->buffer_size = 0; - obj->level = 1.0; - obj->write.level = 1.0; - obj->read.level = 1.0; - - return base; -} - - -gint jack_card_manager_init(SndCardManager *m, gint index) -{ - jack_client_t *client = NULL; - char* client_name; - - client_name=g_strdup_printf("linphone-%u", g_random_int()); - if ((client = jack_client_new (client_name))!= NULL) - { - g_message("Found Jack Daemon"); - g_free(client_name); - m->cards[index]=jack_card_new(client); - m->cards[index]->index=index; - return 1; - } else { - g_free(client_name); - return 0; - } -} - -#endif
--- a/src/mediastreamer/jackcard.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - JACK support - Copyright (C) 2004 Tobias Gehrig tobias@gehrig.tk -*/ - -#ifndef JACK_CARD_H -#define JACK_CARD_H - -#include <config.h> - -#ifdef __JACK_ENABLED__ - -#include "sndcard.h" - -#include <jack/jack.h> -#include <jack/ringbuffer.h> - -#include <samplerate.h> - -typedef jack_default_audio_sample_t sample_t; - -typedef struct { - jack_port_t *port; - const char **phys_ports; - float level; - jack_ringbuffer_t *buffer; - gint channels; - gint rate; - SRC_STATE* src_state; - SRC_DATA data; - size_t frames; - gboolean can_process; - gboolean open; - gboolean init; -} jackcard_mode_t; - -struct _JackCard -{ - SndCard parent; - - jack_client_t *client; - gboolean jack_running; - gboolean jack_active; - float level; - jack_nframes_t buffer_size; - gint sample_size; - gint frame_size; - gint rate; - gboolean can_process; - gboolean clear; - - jackcard_mode_t read, write; -}; - -typedef struct _JackCard JackCard; - -SndCard * jack_card_new(jack_client_t *client); - -gint jack_card_manager_init(SndCardManager *m, gint index); - -#endif - -#endif
--- a/src/mediastreamer/mediastream.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mediastream.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond--; - if (cond<0) exit(-1); -} - -void parse_addr(gchar *addr, char **ip, int *port) -{ - char *semicolon; - gint iplen; - - *ip=NULL; - *port=0; - semicolon=strchr(addr,':'); - if (semicolon==NULL) return; - iplen=semicolon-addr; - *ip=g_malloc(iplen+1); - strncpy(*ip,addr,iplen); - (*ip)[iplen]='\0'; - *port=atoi(semicolon+1); -} - -char *usage="mediastream --local <port> --remote <ip:port> --payload <payload type>\n"; -void run_media_streams(gint localport, gchar *remote_ip, gint remoteport, gint payload); - -int main(int argc, char * argv[]) -{ - gint i; - gint localport=0,remoteport=0,payload=0; - gchar *ip; - gchar *tmp; - - /*create the rtp session */ - ortp_init(); - ortp_set_debug_file("oRTP",NULL); - rtp_profile_set_payload(&av_profile,115,&lpc1015); - rtp_profile_set_payload(&av_profile,110,&speex_nb); - - if (argc<4) { - printf(usage); - return -1; - } - for (i=1;i<argc;i++){ - if (strcmp(argv[i],"--local")==0){ - i++; - localport=atoi(argv[i]); - }else if (strcmp(argv[i],"--remote")==0){ - i++; - parse_addr(argv[i],&ip,&remoteport); - if (ip==NULL) { - printf(usage); - return -1; - } - printf("Remote addr: ip=%s port=%i\n",ip,remoteport); - }else if (strcmp(argv[i],"--payload")==0){ - i++; - payload=atoi(argv[i]); - } - } - tmp=getenv("defcard"); - if (tmp!=NULL) audio_stream_set_default_card(atoi(tmp)); - run_media_streams(localport,ip,remoteport,payload); - return 0; -} - -void run_media_streams(gint localport, gchar *remote_ip, gint remoteport, gint payload) -{ - AudioStream *audio; - ms_init(); - ms_speex_codec_init(); - signal(SIGINT,stop_handler); - - audio=audio_stream_start(&av_profile,localport,remote_ip,remoteport,payload,250); - while(cond) - { - /* sleep until we receive SIGINT */ - sleep(1); - } - - printf("stoping all...\n"); - - audio_stream_stop(audio); -}
--- a/src/mediastreamer/mediastream.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MEDIASTREAM_H -#define MEDIASTREAM_H - -#include "msrtprecv.h" -#include "msrtpsend.h" -#include "ms.h" -#include "msosswrite.h" -#include "msossread.h" -#include "msread.h" -#include "mswrite.h" -#include "mstimer.h" -#include "mscodec.h" -#include "msspeexdec.h" -#include "msringplayer.h" - - -struct _AudioStream -{ - MSSync *timer; - RtpSession *send_session; - RtpSession *recv_session; - MSFilter *soundread; - MSFilter *soundwrite; - MSFilter *encoder; - MSFilter *decoder; - MSFilter *rtprecv; - MSFilter *rtpsend; -}; - - -typedef struct _AudioStream AudioStream; - -struct _RingStream -{ - MSSync *timer; - MSFilter *source; - MSFilter *sndwrite; -}; - -typedef struct _RingStream RingStream; - -/* start a thread that does sampling->encoding->rtp_sending|rtp_receiving->decoding->playing */ -AudioStream *audio_stream_start (RtpProfile * prof, int locport, char *remip, - int remport, int profile, int jitt_comp); - -AudioStream *audio_stream_start_with_sndcards(RtpProfile * prof, int locport, char *remip4, - int remport, int profile, int jitt_comp, SndCard *playcard, SndCard *captcard); - -AudioStream *audio_stream_start_with_files (RtpProfile * prof, int locport, - char *remip4, int remport, - int profile, int jitt_comp, - gchar * infile, gchar * outfile); -void audio_stream_set_rtcp_information(AudioStream *st, const char *cname); - - -/* stop the above process*/ -void audio_stream_stop (AudioStream * stream); - -RingStream *ring_start (gchar * file, gint interval, SndCard *sndcard); -RingStream *ring_start_with_cb(gchar * file, gint interval, SndCard *sndcard, MSFilterNotifyFunc func,gpointer user_data); -void ring_stop (RingStream * stream); - -/* returns the latency in samples if the audio device with id dev_id is openable in full duplex mode, else 0 */ -gint test_audio_dev (int dev_id); - -/* send a dtmf */ -gint audio_stream_send_dtmf (AudioStream * stream, gchar dtmf); - -void audio_stream_set_default_card(int cardindex); - - -#ifdef VIDEO_ENABLED - -/***************** - Video Support - *****************/ - - - -struct _VideoStream -{ - MSSync *timer; - RtpSession *send_session; - RtpSession *recv_session; - MSFilter *source; - MSFilter *output; - MSFilter *encoder; - MSFilter *decoder; - MSFilter *rtprecv; - MSFilter *rtpsend; - gboolean show_local; -}; - - -typedef struct _VideoStream VideoStream; - -VideoStream *video_stream_start(RtpProfile *profile, int locport, char *remip4, int remport, - int payload, int jitt_comp, gboolean show_local, const gchar *source, const gchar *device); -void video_stream_set_rtcp_information(VideoStream *st, const char *cname); -void video_stream_stop (VideoStream * stream); - -VideoStream * video_preview_start(const gchar *source, const gchar *device); -void video_preview_stop(VideoStream *stream); - -#endif - -#endif
--- a/src/mediastreamer/ms.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,342 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "ms.h" -#include "sndcard.h" -#include "mscodec.h" - -#include <sys/types.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> - -#ifdef VIDEO_ENABLED -extern void ms_video_source_register_all(); -#endif -#ifdef HAVE_ILBC -extern void ms_ilbc_codec_init(); -#endif - -/** - * ms_init: - * - * - * Initialize the mediastreamer. This must be the first function called in a program - * using the mediastreamer library. - * - * - */ -void ms_init() -{ - if (!g_thread_supported()) g_thread_init (NULL); -#ifdef HAVE_GLIB - if (!g_module_supported()){ - g_error("GModule is not supported."); - } -#endif - /* initialize the oss subsystem */ - snd_card_manager_init(snd_card_manager); - /* register the statically linked codecs */ - ms_codec_register_all(); -#ifdef VIDEO_ENABLED - ms_video_source_register_all(); -#endif -#ifdef HAVE_ILBC - ms_ilbc_codec_init(); -#endif -} - - -static gint compare(gconstpointer a, gconstpointer b) -{ - MSFilter *f1=(MSFilter*)a,*f2=(MSFilter*)b; - if (f1->klass<f2->klass) return -1; - if (f1->klass==f2->klass) return 0; - /* if f1->klass>f2->klass ....*/ - return 1; -} - -static GList *g_list_append_if_new(GList *l,gpointer data) -{ - GList *res=l; - if (g_list_find(res,data)==NULL) - res=g_list_append(res,data); - return(res); -} - -static GList *get_nexts(MSFilter *f,GList *l) -{ - int i; - MSFifo *fifo; - MSQueue *q; - GList *res=l; - - /* check fifos*/ - for (i=0;i <f->klass->max_foutputs;i++) - { - fifo=f->outfifos[i]; - if (fifo!=NULL) res=g_list_append_if_new(res,(gpointer)fifo->next_data); - } - /* check queues*/ - for (i=0;i <f->klass->max_qoutputs;i++) - { - q=f->outqueues[i]; - if (q!=NULL) res=g_list_append_if_new(res,(gpointer)q->next_data); - } - return(res); -} - -/* compile graphs attached to a sync source*/ -int ms_compile(MSSync *sync) -{ - int i; - GList *list1=NULL,*list2=NULL,*elem; - GList *proc_chain=NULL; - MSFilter *f; - - /* first free the old list if we are just updating*/ - if (sync->execution_list!=NULL) g_list_free(sync->execution_list); - /* get the list of filters attached to this sync*/ - for (i=0;i<sync->filters;i++) - { - //printf("found filter !\n"); - list1=g_list_append(list1,sync->attached_filters[i]); - } - /* find the processing chain */ - while (list1!=NULL) - { - list2=NULL; - /* sort the list by types of filter*/ - list1=g_list_sort(list1,compare); - /* save into the processing chain list*/ - //printf("list1 :%i elements\n",g_list_length(list1)); - proc_chain=g_list_concat(proc_chain,list1); - /* get all following filters. They are appended to list2*/ - elem=list1; - while (elem!=NULL) - { - f=(MSFilter*)(elem->data); - /* check if filter 's status */ - if (f->klass->attributes & FILTER_CAN_SYNC) - { - sync->samples_per_tick=0; - } - list2=get_nexts(f,list2); - elem=g_list_next(elem); - } - list1=list2; - } - sync->execution_list=proc_chain; - sync->flags&=~MS_SYNC_NEED_UPDATE; - ms_trace("%i filters successfully compiled in a processing chain.",g_list_length(sync->execution_list)); - return 0; -} - -/*execute the processing chain attached to a sync source. It is called as a thread by ms_main()*/ -void *ms_thread_run(void *sync_ptr) -{ - MSSync *sync=(MSSync*) sync_ptr; - GList *filter; - MSFilter *f; - - - ms_sync_lock(sync); - while(sync->run) - { - //g_message("sync->run=%i",sync->run); - if (sync->samples_per_tick==0) ms_sync_suspend(sync); - if (sync->flags & MS_SYNC_NEED_UPDATE){ - ms_compile(sync); - ms_sync_setup(sync); - } - filter=sync->execution_list; - ms_sync_unlock(sync); - //ms_trace("Calling synchronisation"); - ms_sync_synchronize(sync); - while(filter!=NULL) - { - f=(MSFilter*)filter->data; - if (MS_FILTER_GET_CLASS(f)->attributes & FILTER_IS_SOURCE) - { - /* execute it once */ - ms_trace("Running source filter %s.",f->klass->name); - ms_filter_process(f); - } - else - { - /* make the filter process its input data until it has no more */ - while ( ms_filter_fifos_have_data(f) || ms_filter_queues_have_data(f) ) - { - ms_trace("Running filter %s.",f->klass->name); - ms_filter_process(f); - } - } - filter=g_list_next(filter); - } - ms_sync_lock(sync); - } - g_cond_signal(sync->stop_cond); /* signal that the sync thread has finished */ - ms_sync_unlock(sync); - g_message("Mediastreamer processing thread is exiting."); - return NULL; -} - -/* stop the processing chain attached to a sync source.*/ -void ms_thread_stop(MSSync *sync) -{ - if (sync->thread!=NULL) - { - if (sync->samples_per_tick==0) - { - /* to wakeup the thread */ - //g_cond_signal(sync->thread_cond); - } - g_mutex_lock(sync->lock); - sync->run=0; - sync->thread=NULL; - g_cond_wait(sync->stop_cond,sync->lock); - g_mutex_unlock(sync->lock); - } - //g_message("ms_thread_stop() finished."); -} - -/** - * ms_start: - * @sync: A synchronisation source to be started. - * - * Starts a thread that will shedule all processing chains attached to the synchronisation source @sync. - * - * - */ -void ms_start(MSSync *sync) -{ - if (sync->run==1) return; /*already running*/ - ms_compile(sync); - ms_sync_setup(sync); - /* this is to avoid race conditions, for example: - ms_start(sync); - ms_oss_write_start(ossw); - here tge ossw filter need to be compiled to run ms_oss_write_start() - */ - ms_trace("ms_start: creating new thread."); - sync->run=1; - sync->thread=g_thread_create((GThreadFunc)ms_thread_run,(gpointer)sync,TRUE,NULL); - if (sync->thread==NULL){ - g_warning("Could not create thread !"); - } -} - -/** - * ms_stop: - * @sync: A synchronisation source to be stopped. - * - * Stop the thread that was sheduling the processing chains attached to the synchronisation source @sync. - * The processing chains are kept unchanged, no object is freed. The synchronisation source can be restarted using ms_start(). - * - * - */ -void ms_stop(MSSync *sync) -{ - ms_thread_stop(sync); - ms_sync_unsetup(sync); -} - - -gint ms_load_plugin(gchar *path) -{ -#ifdef HAVE_GLIB - g_module_open(path,0); -#endif - return 0; -} - -gchar * ms_proc_get_param(gchar *parameter) -{ - gchar *file; - int fd; - int err,len; - gchar *p,*begin,*end; - gchar *ret; - fd=open("/proc/cpuinfo",O_RDONLY); - if (fd<0){ - g_warning("Could not open /proc/cpuinfo."); - return NULL; - } - file=g_malloc(1024); - err=read(fd,file,1024); - file[err-1]='\0'; - /* find the parameter */ - p=strstr(file,parameter); - if (p==NULL){ - /* parameter not found */ - g_free(file); - return NULL; - } - /* find the following ':' */ - p=strchr(p,':'); - if (p==NULL){ - g_free(file); - return NULL; - } - /* find the value*/ - begin=p+2; - end=strchr(begin,'\n'); - if (end==NULL) end=strchr(begin,'\0'); - len=end-begin+1; - ret=g_malloc(len+1); - snprintf(ret,len,"%s",begin); - //printf("%s=%s\n",parameter,ret); - g_free(file); - return ret; -} - -gint ms_proc_get_type() -{ - static int proc_type=0; - gchar *value; - if (proc_type==0){ - value=ms_proc_get_param("cpu family"); - if (value!=NULL) { - proc_type=atoi(value); - g_free(value); - }else return -1; - } - return proc_type; -} - -gint ms_proc_get_speed() -{ - char *value; - static int proc_speed=0; - if (proc_speed==0){ - value=ms_proc_get_param("cpu MHz"); - if (value!=NULL){ - proc_speed=atoi(value); - g_free(value); - }else return -1; - } - //printf("proc_speed=%i\n",proc_speed); - return proc_speed; -}
--- a/src/mediastreamer/ms.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - - -#ifndef MS_H -#define MS_H -#include "msfilter.h" -#include "mssync.h" - - -void ms_init(void); - -/* compile graphs attached to a sync source*/ -int ms_compile(MSSync *source); - - -/* stop the processing chain attached to a sync source.*/ -void ms_thread_stop(MSSync *sync); - - -/** - * function_name:ms_thread_run - * @sync: The synchronization source for all the set of graphs to run. - * - * Execute the processing chain attached to a sync source. This function loops indefinitely. - * The media streamer programmer can choose to execute this function directly, or to call ms_start(), - * that will start a thread for the synchronisation source. - * - * Returns: no return value. - */ -void *ms_thread_run(void *sync); - - -/** - * function_name:ms_start - * @sync: A synchronisation source to be started. - * - * Starts a thread that will shedule all processing chains attached to the synchronisation source @sync. - * - * Returns: no return value. - */ -void ms_start(MSSync *sync); - - -/** - * function_name:ms_stop - * @sync: A synchronisation source to be stopped. - * - * Stop the thread that was sheduling the processing chains attached to the synchronisation source @sync. - * The processing chains are kept unchanged, no object is freed. The synchronisation source can be restarted using ms_start(). - * - * Returns: no return value. - */ -void ms_stop(MSSync *sync); - - -gchar * ms_proc_get_param(gchar *parameter); -gint ms_proc_get_type(void); -gint ms_proc_get_speed(void); - - - -#endif
--- a/src/mediastreamer/msAlawdec.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include <msAlawdec.h> -#include <g711common.h> - -extern MSFilter * ms_ALAWencoder_new(void); - -MSCodecInfo ALAWinfo={ - { - "ALAW codec", - 0, - MS_FILTER_AUDIO_CODEC, - ms_ALAWencoder_new, - "This is the classic A-law codec. Good quality, but only usable with high speed network connections." - }, - ms_ALAWencoder_new, - ms_ALAWdecoder_new, - 320, - 160, - 64000, - 8000, - 8, - "PCMA", - 1, - 1, -}; - -static MSALAWDecoderClass *ms_ALAWdecoder_class=NULL; - -MSFilter * ms_ALAWdecoder_new(void) -{ - MSALAWDecoder *r; - - r=g_new(MSALAWDecoder,1); - ms_ALAWdecoder_init(r); - if (ms_ALAWdecoder_class==NULL) - { - ms_ALAWdecoder_class=g_new(MSALAWDecoderClass,1); - ms_ALAWdecoder_class_init(ms_ALAWdecoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_ALAWdecoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_ALAWdecoder_init(MSALAWDecoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=ALAW_DECODER_RMAXGRAN; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSALAWDECODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSALAWDECODER_MAX_INPUTS); - -} - -void ms_ALAWdecoder_class_init(MSALAWDecoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"ALAWDecoder"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&ALAWinfo; - MS_FILTER_CLASS(klass)->max_finputs=MSALAWDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSALAWDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=ALAW_DECODER_RMAXGRAN; - MS_FILTER_CLASS(klass)->w_maxgran=ALAW_DECODER_WMAXGRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_ALAWdecoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_ALAWdecoder_process; -} - -void ms_ALAWdecoder_process(MSALAWDecoder *r) -{ - MSFifo *fi,*fo; - int inlen,outlen; - gchar *s,*d; - int i; - /* process output fifos, but there is only one for this class of filter*/ - - /* this is the simplest process function design: - the filter declares a r_mingran of ALAW_DECODER_RMAXGRAN, so the mediastreamer's - scheduler will call the process function each time there is ALAW_DECODER_RMAXGRAN - bytes to read in the input fifo. If there is more, then it will call it several - time in order to the fifo to be completetly processed. - This is very simple, but not very efficient because of the multiple call function - of MSFilterProcessFunc that may happen. - The MSAlawEncoder implements another design; see it. - */ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - g_return_if_fail(fi!=NULL); - g_return_if_fail(fo!=NULL); - - inlen=ms_fifo_get_read_ptr(fi,ALAW_DECODER_RMAXGRAN,(void**)&s); - if (s==NULL) return; - outlen=ms_fifo_get_write_ptr(fo,ALAW_DECODER_WMAXGRAN,(void**)&d); - if (d!=NULL) - { - for(i=0;i<ALAW_DECODER_RMAXGRAN;i++) - { - ((gint16*)d)[i]=alaw_to_s16( (unsigned char) s[i]); - } - } - else g_warning("MSALAWDecoder: Discarding samples !!"); - -} - - - -void ms_ALAWdecoder_destroy( MSALAWDecoder *obj) -{ - g_free(obj); -}
--- a/src/mediastreamer/msAlawdec.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSALAWDECODER_H -#define MSALAWDECODER_H - -#include <msfilter.h> -#include <mscodec.h> - -/*this is the class that implements a ALAWdecoder filter*/ - -#define MSALAWDECODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSALAWDecoder -{ - /* the MSALAWDecoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSALAWDecoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSALAWDECODER_MAX_INPUTS]; - MSFifo *f_outputs[MSALAWDECODER_MAX_INPUTS]; -} MSALAWDecoder; - -typedef struct _MSALAWDecoderClass -{ - /* the MSALAWDecoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSALAWDecoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSALAWDecoderClass; - -/* PUBLIC */ -#define MS_ALAWDECODER(filter) ((MSALAWDecoder*)(filter)) -#define MS_ALAWDECODER_CLASS(klass) ((MSALAWDecoderClass*)(klass)) -MSFilter * ms_ALAWdecoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_ALAWdecoder_init(MSALAWDecoder *r); -void ms_ALAWdecoder_class_init(MSALAWDecoderClass *klass); -void ms_ALAWdecoder_destroy( MSALAWDecoder *obj); -void ms_ALAWdecoder_process(MSALAWDecoder *r); - -/* tuning parameters :*/ -#define ALAW_DECODER_WMAXGRAN 320 -#define ALAW_DECODER_RMAXGRAN 160 - -extern MSCodecInfo ALAWinfo; - -#endif
--- a/src/mediastreamer/msAlawenc.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msAlawenc.h" -#include "g711common.h" - -extern MSCodecInfo ALAWinfo; - -static MSALAWEncoderClass *ms_ALAWencoder_class=NULL; - -MSFilter * ms_ALAWencoder_new(void) -{ - MSALAWEncoder *r; - - r=g_new(MSALAWEncoder,1); - ms_ALAWencoder_init(r); - if (ms_ALAWencoder_class==NULL) - { - ms_ALAWencoder_class=g_new(MSALAWEncoderClass,1); - ms_ALAWencoder_class_init(ms_ALAWencoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_ALAWencoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_ALAWencoder_init(MSALAWEncoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=ALAW_ENCODER_RMAXGRAN; /* the filter can be called as soon as there is - something to process */ - memset(r->f_inputs,0,sizeof(MSFifo*)*MSALAWENCODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSALAWENCODER_MAX_INPUTS); - -} - -void ms_ALAWencoder_class_init(MSALAWEncoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"ALAWEncoder"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&ALAWinfo; - MS_FILTER_CLASS(klass)->max_finputs=MSALAWENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSALAWENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=ALAW_ENCODER_RMAXGRAN; - MS_FILTER_CLASS(klass)->w_maxgran=ALAW_ENCODER_WMAXGRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_ALAWencoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_ALAWencoder_process; -} - -void ms_ALAWencoder_process(MSALAWEncoder *r) -{ - MSFifo *fi,*fo; - int inlen,outlen; - gchar *s,*d; - int i; - /* process output fifos, but there is only one for this class of filter*/ - - /* this is the sophisticated design of the process function: - Here the filter declares that it can be called as soon as there is something - to read on the input fifo by setting r_mingran=0. - Then it ask for the fifo to get as many data as possible by calling: - inlen=ms_fifo_get_read_ptr(fi,0,(void**)&s); - This avoid multiple call to the process function to process all data available - on the input fifo... but the writing of the process function is a bit - more difficult, because althoug ms_fifo_get_read_ptr() returns N bytes, - we cannot ask ms_fifo_get_write_ptr to return N bytes if - N>MS_FILTER_CLASS(klass)->w_maxgran. This is forbidden by the MSFifo - mechanism. - This is an open issue. - For the moment what is done here is that ms_fifo_get_write_ptr() is called - several time with its maximum granularity in order to try to write the output. - ... - One solution: - -create a new function ms_fifo_get_rw_ptr(fifo1,p1, fifo2,p2) to - return the number of bytes able to being processed according to the input - and output fifo, and their respective data pointers - */ - - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - - inlen=ms_fifo_get_read_ptr(fi,ALAW_ENCODER_RMAXGRAN,(void**)&s); - if (s==NULL) return; - outlen=ms_fifo_get_write_ptr(fo,ALAW_ENCODER_WMAXGRAN,(void**)&d); - if (d!=NULL) - { - for(i=0;i<ALAW_ENCODER_WMAXGRAN;i++) - { - d[i]=s16_to_alaw( *((gint16*)s) ); - s+=2; - } - } - else g_warning("MSALAWDecoder: Discarding samples !!"); - -} - - - -void ms_ALAWencoder_destroy( MSALAWEncoder *obj) -{ - g_free(obj); -}
--- a/src/mediastreamer/msAlawenc.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSALAWENCODER_H -#define MSALAWENCODER_H - -#include "mscodec.h" - - -/*this is the class that implements a ALAWencoder filter*/ - -#define MSALAWENCODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSALAWEncoder -{ - /* the MSALAWEncoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSALAWEncoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSALAWENCODER_MAX_INPUTS]; - MSFifo *f_outputs[MSALAWENCODER_MAX_INPUTS]; -} MSALAWEncoder; - -typedef struct _MSALAWEncoderClass -{ - /* the MSALAWEncoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSALAWEncoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSALAWEncoderClass; - -/* PUBLIC */ -#define MS_ALAWENCODER(filter) ((MSALAWEncoder*)(filter)) -#define MS_ALAWENCODER_CLASS(klass) ((MSALAWEncoderClass*)(klass)) -MSFilter * ms_ALAWencoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_ALAWencoder_init(MSALAWEncoder *r); -void ms_ALAWencoder_class_init(MSALAWEncoderClass *klass); -void ms_ALAWencoder_destroy( MSALAWEncoder *obj); -void ms_ALAWencoder_process(MSALAWEncoder *r); - -/* tuning parameters :*/ -#define ALAW_ENCODER_WMAXGRAN 160 -#define ALAW_ENCODER_RMAXGRAN 320 - - -#endif
--- a/src/mediastreamer/msGSMdecoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msGSMdecoder.h" - -extern MSFilter * ms_GSMencoder_new(void); - -MSCodecInfo GSMinfo={ - { - "GSM codec", - 0, - MS_FILTER_AUDIO_CODEC, - ms_GSMencoder_new, - "This is the codec widely used in european mobile phones. This implementation was done by " - "Jutta Degener and Carsten Bormann." - }, - ms_GSMencoder_new, - ms_GSMdecoder_new, - 320, - 33, - 13800, - 8000, - 3, - "GSM", - 1, - 1, -}; - -static MSGSMDecoderClass *ms_GSMdecoder_class=NULL; - -MSFilter * ms_GSMdecoder_new(void) -{ - MSGSMDecoder *r; - - r=g_new(MSGSMDecoder,1); - ms_GSMdecoder_init(r); - if (ms_GSMdecoder_class==NULL) - { - ms_GSMdecoder_class=g_new(MSGSMDecoderClass,1); - ms_GSMdecoder_class_init(ms_GSMdecoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_GSMdecoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_GSMdecoder_init(MSGSMDecoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=33; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSGSMDECODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSGSMDECODER_MAX_INPUTS); - r->gsm_handle=gsm_create(); -} - -void ms_GSMdecoder_class_init(MSGSMDecoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"GSMDecoder"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&GSMinfo; - MS_FILTER_CLASS(klass)->max_finputs=MSGSMDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSGSMDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=33; - MS_FILTER_CLASS(klass)->w_maxgran=2*160; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_GSMdecoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_GSMdecoder_process; -} - -void ms_GSMdecoder_process(MSGSMDecoder *r) -{ - MSFifo *fi,*fo; - int err1; - void *s,*d; - - /* process output fifos, but there is only one for this class of filter*/ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - if (fi!=NULL) - { - err1=ms_fifo_get_read_ptr(fi,33,&s); - if (err1>0) - { - err1=ms_fifo_get_write_ptr(fo,160*2,&d); - if (d!=NULL) gsm_decode(r->gsm_handle,s,(gsm_signal*)d); - } - - } -} - -void ms_GSMdecoder_uninit(MSGSMDecoder *obj) -{ - gsm_destroy(obj->gsm_handle); -} - -void ms_GSMdecoder_destroy( MSGSMDecoder *obj) -{ - ms_GSMdecoder_uninit(obj); - g_free(obj); -}
--- a/src/mediastreamer/msGSMdecoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSGSMDECODER_H -#define MSGSMDECODER_H - -#include <msfilter.h> -#include <mscodec.h> -#include <gsm.h> - -/*this is the class that implements a GSMdecoder filter*/ - -#define MSGSMDECODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSGSMDecoder -{ - /* the MSGSMDecoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSGSMDecoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSGSMDECODER_MAX_INPUTS]; - MSFifo *f_outputs[MSGSMDECODER_MAX_INPUTS]; - gsm gsm_handle; -} MSGSMDecoder; - -typedef struct _MSGSMDecoderClass -{ - /* the MSGSMDecoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSGSMDecoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSGSMDecoderClass; - -/* PUBLIC */ -#define MS_GSMDECODER(filter) ((MSGSMDecoder*)(filter)) -#define MS_GSMDECODER_CLASS(klass) ((MSGSMDecoderClass*)(klass)) -MSFilter * ms_GSMdecoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_GSMdecoder_init(MSGSMDecoder *r); -void ms_GSMdecoder_class_init(MSGSMDecoderClass *klass); -void ms_GSMdecoder_destroy( MSGSMDecoder *obj); -void ms_GSMdecoder_process(MSGSMDecoder *r); - -extern MSCodecInfo GSMinfo; - -#endif
--- a/src/mediastreamer/msGSMencoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msGSMencoder.h" -#include "mscodec.h" - -extern MSCodecInfo GSMinfo; - -static MSGSMEncoderClass *ms_GSMencoder_class=NULL; - -MSFilter * ms_GSMencoder_new(void) -{ - MSGSMEncoder *r; - - r=g_new(MSGSMEncoder,1); - ms_GSMencoder_init(r); - if (ms_GSMencoder_class==NULL) - { - ms_GSMencoder_class=g_new(MSGSMEncoderClass,1); - ms_GSMencoder_class_init(ms_GSMencoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_GSMencoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_GSMencoder_init(MSGSMEncoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=2*160; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSGSMENCODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSGSMENCODER_MAX_INPUTS); - r->gsm_handle=gsm_create(); -} - -void ms_GSMencoder_class_init(MSGSMEncoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"GSMEncoder"); - MS_FILTER_CLASS(klass)->max_finputs=MSGSMENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSGSMENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=2*160; - MS_FILTER_CLASS(klass)->w_maxgran=33; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_GSMencoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_GSMencoder_process; - MS_FILTER_CLASS(klass)->info=MS_FILTER_INFO(&GSMinfo); -} - -void ms_GSMencoder_process(MSGSMEncoder *r) -{ - MSFifo *fi,*fo; - int err1; - void *s,*d; - - /* process output fifos, but there is only one for this class of filter*/ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - if (fi!=NULL) - { - err1=ms_fifo_get_read_ptr(fi,160*2,&s); - if (err1>0) - { - err1=ms_fifo_get_write_ptr(fo,33,&d); - if (d!=NULL) gsm_encode(r->gsm_handle,(gsm_signal*)s,(gsm_byte*)d); - } - - } -} - -void ms_GSMencoder_uninit(MSGSMEncoder *obj) -{ - gsm_destroy(obj->gsm_handle); -} - -void ms_GSMencoder_destroy( MSGSMEncoder *obj) -{ - ms_GSMencoder_uninit(obj); - g_free(obj); -}
--- a/src/mediastreamer/msGSMencoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSGSMENCODER_H -#define MSGSMENCODER_H - -#include "msfilter.h" -#include <gsm.h> - -/*this is the class that implements a GSMencoder filter*/ - -#define MSGSMENCODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSGSMEncoder -{ - /* the MSGSMEncoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSGSMEncoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSGSMENCODER_MAX_INPUTS]; - MSFifo *f_outputs[MSGSMENCODER_MAX_INPUTS]; - gsm gsm_handle; -} MSGSMEncoder; - -typedef struct _MSGSMEncoderClass -{ - /* the MSGSMEncoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSGSMEncoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSGSMEncoderClass; - -/* PUBLIC */ -#define MS_GSMENCODER(filter) ((MSGSMEncoder*)(filter)) -#define MS_GSMENCODER_CLASS(klass) ((MSGSMEncoderClass*)(klass)) -MSFilter * ms_GSMencoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_GSMencoder_init(MSGSMEncoder *r); -void ms_GSMencoder_class_init(MSGSMEncoderClass *klass); -void ms_GSMencoder_destroy( MSGSMEncoder *obj); -void ms_GSMencoder_process(MSGSMEncoder *r); - -#endif
--- a/src/mediastreamer/msLPC10decoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msLPC10decoder.h" -#include "msLPC10encoder.h" -#include <stdlib.h> -#include <lpc10.h> - -extern MSFilter * ms_LPC10encoder_new(void); - -MSCodecInfo LPC10info={ - { - "LPC10-15 codec", - 0, - MS_FILTER_AUDIO_CODEC, - ms_LPC10encoder_new, - "A low quality but very low bit rate codec from the U.S. Department of Defense." - }, - ms_LPC10encoder_new, - ms_LPC10decoder_new, - 360, - 7, - 2400, - 8000, - 115, - "1015", - 1, - 1, -}; - -static MSLPC10DecoderClass *ms_LPC10decoder_class=NULL; - -MSFilter * ms_LPC10decoder_new(void) -{ - MSLPC10Decoder *r; - - r=g_new(MSLPC10Decoder,1); - ms_LPC10decoder_init(r); - if (ms_LPC10decoder_class==NULL) - { - ms_LPC10decoder_class=g_new(MSLPC10DecoderClass,1); - ms_LPC10decoder_class_init(ms_LPC10decoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_LPC10decoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_LPC10decoder_init(MSLPC10Decoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=7; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSLPC10DECODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSLPC10DECODER_MAX_INPUTS); - r->lpc10_dec=create_lpc10_decoder_state(); -} - -void ms_LPC10decoder_class_init(MSLPC10DecoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"LPC10Dec"); - MS_FILTER_CLASS(klass)->max_finputs=MSLPC10DECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSLPC10DECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=7; - MS_FILTER_CLASS(klass)->w_maxgran=LPC10_SAMPLES_PER_FRAME*2; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_LPC10decoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_LPC10decoder_process; - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&LPC10info; -} - -void ms_LPC10decoder_process(MSLPC10Decoder *r) -{ - MSFifo *fi,*fo; - int err1; - void *s,*d; - float speech[LPC10_SAMPLES_PER_FRAME]; - INT32 bits[LPC10_BITS_IN_COMPRESSED_FRAME]; - - /* process output fifos, but there is only one for this class of filter*/ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - if (fi!=NULL) - { - err1=ms_fifo_get_read_ptr(fi,7,&s); - if (err1>0) - { - err1=ms_fifo_get_write_ptr(fo,LPC10_SAMPLES_PER_FRAME*2,&d); - if (d!=NULL) - { - read_bits(s, bits, LPC10_BITS_IN_COMPRESSED_FRAME); - lpc10_decode(bits,speech, r->lpc10_dec); - write_16bit_samples((INT16*)d, speech, LPC10_SAMPLES_PER_FRAME); - } - } - } -} - -void ms_LPC10decoder_uninit(MSLPC10Decoder *obj) -{ - free(obj->lpc10_dec); -} - -void ms_LPC10decoder_destroy( MSLPC10Decoder *obj) -{ - ms_LPC10decoder_uninit(obj); - g_free(obj); -}
--- a/src/mediastreamer/msLPC10decoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSLPC10DECODER_H -#define MSLPC10DECODER_H - -#include <msfilter.h> -#include <mscodec.h> -#include <lpc10.h> - -/*this is the class that implements a LPC10decoder filter*/ - -#define MSLPC10DECODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSLPC10Decoder -{ - /* the MSLPC10Decoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSLPC10Decoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSLPC10DECODER_MAX_INPUTS]; - MSFifo *f_outputs[MSLPC10DECODER_MAX_INPUTS]; - struct lpc10_decoder_state *lpc10_dec; -} MSLPC10Decoder; - -typedef struct _MSLPC10DecoderClass -{ - /* the MSLPC10Decoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSLPC10Decoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSLPC10DecoderClass; - -/* PUBLIC */ -#define MS_LPC10DECODER(filter) ((MSLPC10Decoder*)(filter)) -#define MS_LPC10DECODER_CLASS(klass) ((MSLPC10DecoderClass*)(klass)) -MSFilter * ms_LPC10decoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_LPC10decoder_init(MSLPC10Decoder *r); -void ms_LPC10decoder_class_init(MSLPC10DecoderClass *klass); -void ms_LPC10decoder_destroy( MSLPC10Decoder *obj); -void ms_LPC10decoder_process(MSLPC10Decoder *r); - -extern MSCodecInfo LPC10info; - -#endif
--- a/src/mediastreamer/msLPC10encoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,251 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include <stdlib.h> -#include "msLPC10encoder.h" -#include <lpc10.h> - - -extern MSCodecInfo LPC10info; - -/* The return value of each of these calls is the same as that - returned by fread/fwrite, which should be the number of samples - successfully read/written, not the number of bytes. */ - -int -read_16bit_samples(INT16 int16samples[], float speech[], int n) -{ - int i; - - /* Convert 16 bit integer samples to floating point values in the - range [-1,+1]. */ - - for (i = 0; i < n; i++) { - speech[i] = ((float) int16samples[i]) / 32768.0; - } - - return (n); -} - - - -int -write_16bit_samples(INT16 int16samples[], float speech[], int n) -{ - int i; - float real_sample; - - /* Convert floating point samples in range [-1,+1] to 16 bit - integers. */ - for (i = 0; i < n; i++) { - real_sample = 32768.0 * speech[i]; - if (real_sample < -32768.0) { - int16samples[i] = -32768; - } else if (real_sample > 32767.0) { - int16samples[i] = 32767; - } else { - int16samples[i] = real_sample; - } - } - return (n); -} - -/* - -Write the bits in bits[0] through bits[len-1] to file f, in "packed" -format. - -bits is expected to be an array of len integer values, where each -integer is 0 to represent a 0 bit, and any other value represents a 1 -bit. This bit string is written to the file f in the form of several -8 bit characters. If len is not a multiple of 8, then the last -character is padded with 0 bits -- the padding is in the least -significant bits of the last byte. The 8 bit characters are "filled" -in order from most significant bit to least significant. - -*/ - -void -write_bits(unsigned char *data, INT32 *bits, int len) -{ - int i; /* generic loop variable */ - unsigned char mask; /* The next bit position within the - variable "data" to place the next - bit. */ - - - /* Fill in the array bits. - * The first compressed output bit will be the most significant - * bit of the byte, so initialize mask to 0x80. The next byte of - * compressed data is initially 0, and the desired bits will be - * turned on below. - */ - mask = 0x80; - *data = 0; - - for (i = 0; i < len; i++) { - /* Turn on the next bit of output data, if necessary. */ - if (bits[i]) { - (*data) |= mask; - } - /* - * If the byte data is full, determined by mask becoming 0, - * then write the byte to the output file, and reinitialize - * data and mask for the next output byte. Also add the byte - * if (i == len-1), because if len is not a multiple of 8, - * then mask won't yet be 0. */ - mask >>= 1; - if ((mask == 0) || (i == len-1)) { - data++; - *data = 0; - mask = 0x80; - } - } -} - - - -/* - -Read bits from file f into bits[0] through bits[len-1], in "packed" -format. - -Read ceiling(len/8) characters from file f, if that many are available -to read, otherwise read to the end of the file. The first character's -8 bits, in order from MSB to LSB, are used to fill bits[0] through -bits[7]. The second character's bits are used to fill bits[8] through -bits[15], and so on. If ceiling(len/8) characters are available to -read, and len is not a multiple of 8, then some of the least -significant bits of the last character read are completely ignored. -Every entry of bits[] that is modified is changed to either a 0 or a -1. - -The number of bits successfully read is returned, and is always in the -range 0 to len, inclusive. If it is less than len, it will always be -a multiple of 8. - -*/ - -int -read_bits(unsigned char *data, INT32 *bits, int len) -{ - int i,ind=0; /* generic loop variable */ - int c=0; - - /* Unpack the array bits into coded_frame. */ - for (i = 0; i < len; i++) { - if ((i % 8) == 0) { - c = (int)(data[ind]); - ind++; - } - if (c & (0x80 >> (i & 7))) { - bits[i] = 1; - } else { - bits[i] = 0; - } - } - return (len); -} - - - - -static MSLPC10EncoderClass *ms_LPC10encoder_class=NULL; - -MSFilter * ms_LPC10encoder_new(void) -{ - MSLPC10Encoder *r; - - r=g_new(MSLPC10Encoder,1); - ms_LPC10encoder_init(r); - if (ms_LPC10encoder_class==NULL) - { - ms_LPC10encoder_class=g_new(MSLPC10EncoderClass,1); - ms_LPC10encoder_class_init(ms_LPC10encoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_LPC10encoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_LPC10encoder_init(MSLPC10Encoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=LPC10_SAMPLES_PER_FRAME*2; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSLPC10ENCODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSLPC10ENCODER_MAX_INPUTS); - r->lpc10_enc=create_lpc10_encoder_state(); -} - -void ms_LPC10encoder_class_init(MSLPC10EncoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"LPC10Enc"); - MS_FILTER_CLASS(klass)->max_finputs=MSLPC10ENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSLPC10ENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=LPC10_SAMPLES_PER_FRAME*2; - MS_FILTER_CLASS(klass)->w_maxgran=7; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_LPC10encoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_LPC10encoder_process; - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&LPC10info; -} - -void ms_LPC10encoder_process(MSLPC10Encoder *r) -{ - MSFifo *fi,*fo; - int err1; - void *s,*d; - float speech[LPC10_SAMPLES_PER_FRAME]; - INT32 bits[LPC10_BITS_IN_COMPRESSED_FRAME]; - - /* process output fifos, but there is only one for this class of filter*/ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - if (fi!=NULL) - { - err1=ms_fifo_get_read_ptr(fi,LPC10_SAMPLES_PER_FRAME*2,&s); - if (err1>0) - { - err1=ms_fifo_get_write_ptr(fo,7,&d); - if (d!=NULL) - { - read_16bit_samples((INT16*)s, speech, LPC10_SAMPLES_PER_FRAME); - lpc10_encode(speech, bits, r->lpc10_enc); - write_bits(d, bits, LPC10_BITS_IN_COMPRESSED_FRAME); - } - } - - } -} - -void ms_LPC10encoder_uninit(MSLPC10Encoder *obj) -{ - free(obj->lpc10_enc); -} - -void ms_LPC10encoder_destroy( MSLPC10Encoder *obj) -{ - ms_LPC10encoder_uninit(obj); - g_free(obj); -}
--- a/src/mediastreamer/msLPC10encoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSLPC10ENCODER_H -#define MSLPC10ENCODER_H - -#include "mscodec.h" - - -int -read_16bit_samples(gint16 int16samples[], float speech[], int n); - -int -write_16bit_samples(gint16 int16samples[], float speech[], int n); - -void -write_bits(unsigned char *data, gint32 *bits, int len); - -int -read_bits(unsigned char *data, gint32 *bits, int len); - - -/*this is the class that implements a LPC10encoder filter*/ - -#define MSLPC10ENCODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSLPC10Encoder -{ - /* the MSLPC10Encoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSLPC10Encoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSLPC10ENCODER_MAX_INPUTS]; - MSFifo *f_outputs[MSLPC10ENCODER_MAX_INPUTS]; - struct lpc10_encoder_state *lpc10_enc; -} MSLPC10Encoder; - -typedef struct _MSLPC10EncoderClass -{ - /* the MSLPC10Encoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSLPC10Encoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSLPC10EncoderClass; - -/* PUBLIC */ -#define MS_LPC10ENCODER(filter) ((MSLPC10Encoder*)(filter)) -#define MS_LPC10ENCODER_CLASS(klass) ((MSLPC10EncoderClass*)(klass)) -MSFilter * ms_LPC10encoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_LPC10encoder_init(MSLPC10Encoder *r); -void ms_LPC10encoder_class_init(MSLPC10EncoderClass *klass); -void ms_LPC10encoder_destroy( MSLPC10Encoder *obj); -void ms_LPC10encoder_process(MSLPC10Encoder *r); - -#endif
--- a/src/mediastreamer/msMUlawdec.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include <msMUlawdec.h> -#include <g711common.h> - -extern MSFilter * ms_MULAWencoder_new(void); - -MSCodecInfo MULAWinfo={ - { - "MULAW codec", - 0, - MS_FILTER_AUDIO_CODEC, - ms_MULAWencoder_new, - "This is the classic Mu-law codec. Good quality, but only usable with high speed network connections." - }, - ms_MULAWencoder_new, - ms_MULAWdecoder_new, - 320, - 160, - 64000, - 8000, - 0, - "PCMU", - 1, - 1 -}; - -static MSMULAWDecoderClass *ms_MULAWdecoder_class=NULL; - -MSFilter * ms_MULAWdecoder_new(void) -{ - MSMULAWDecoder *r; - - r=g_new(MSMULAWDecoder,1); - ms_MULAWdecoder_init(r); - if (ms_MULAWdecoder_class==NULL) - { - ms_MULAWdecoder_class=g_new(MSMULAWDecoderClass,1); - ms_MULAWdecoder_class_init(ms_MULAWdecoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_MULAWdecoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_MULAWdecoder_init(MSMULAWDecoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=MULAW_DECODER_RMAXGRAN; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSMULAWDECODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSMULAWDECODER_MAX_INPUTS); - -} - -void ms_MULAWdecoder_class_init(MSMULAWDecoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"MULAWDecoder"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&MULAWinfo; - MS_FILTER_CLASS(klass)->max_finputs=MSMULAWDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSMULAWDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=MULAW_DECODER_RMAXGRAN; - MS_FILTER_CLASS(klass)->w_maxgran=MULAW_DECODER_WMAXGRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_MULAWdecoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_MULAWdecoder_process; -} - -void ms_MULAWdecoder_process(MSMULAWDecoder *r) -{ - MSFifo *fi,*fo; - int inlen,outlen; - gchar *s,*d; - int i; - /* process output fifos, but there is only one for this class of filter*/ - - /* this is the simplest process function design: - the filter declares a r_mingran of MULAW_DECODER_RMAXGRAN, so the mediastreamer's - scheduler will call the process function each time there is MULAW_DECODER_RMAXGRAN - bytes to read in the input fifo. If there is more, then it will call it several - time in order to the fifo to be completetly processed. - This is very simple, but not very efficient because of the multiple call function - of MSFilterProcessFunc that may happen. - The MSAlawEncoder implements another design; see it. - */ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - - inlen=ms_fifo_get_read_ptr(fi,MULAW_DECODER_RMAXGRAN,(void**)&s); - if (s==NULL) g_error("ms_MULAWdecoder_process: internal error."); - outlen=ms_fifo_get_write_ptr(fo,MULAW_DECODER_WMAXGRAN,(void**)&d); - if (d!=NULL) - { - for(i=0;i<MULAW_DECODER_RMAXGRAN;i++) - { - *((gint16*)d)=ulaw_to_s16( (unsigned char) s[i]); - d+=2; - } - } - else g_warning("MSMULAWDecoder: Discarding samples !!"); -} - - - -void ms_MULAWdecoder_destroy( MSMULAWDecoder *obj) -{ - g_free(obj); -}
--- a/src/mediastreamer/msMUlawdec.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSMULAWDECODER_H -#define MSMULAWDECODER_H - -#include <msfilter.h> -#include <mscodec.h> - -/*this is the class that implements a MULAWdecoder filter*/ - -#define MSMULAWDECODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSMULAWDecoder -{ - /* the MSMULAWDecoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSMULAWDecoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSMULAWDECODER_MAX_INPUTS]; - MSFifo *f_outputs[MSMULAWDECODER_MAX_INPUTS]; -} MSMULAWDecoder; - -typedef struct _MSMULAWDecoderClass -{ - /* the MSMULAWDecoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSMULAWDecoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSMULAWDecoderClass; - -/* PUBLIC */ -#define MS_MULAWDECODER(filter) ((MSMULAWDecoder*)(filter)) -#define MS_MULAWDECODER_CLASS(klass) ((MSMULAWDecoderClass*)(klass)) -MSFilter * ms_MULAWdecoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_MULAWdecoder_init(MSMULAWDecoder *r); -void ms_MULAWdecoder_class_init(MSMULAWDecoderClass *klass); -void ms_MULAWdecoder_destroy( MSMULAWDecoder *obj); -void ms_MULAWdecoder_process(MSMULAWDecoder *r); - -/* tuning parameters :*/ -#define MULAW_DECODER_WMAXGRAN 320 -#define MULAW_DECODER_RMAXGRAN 160 - -extern MSCodecInfo MULAWinfo; - - -#endif
--- a/src/mediastreamer/msMUlawenc.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msMUlawenc.h" -#include "g711common.h" - -extern MSCodecInfo MULAWinfo; - -static MSMULAWEncoderClass *ms_MULAWencoder_class=NULL; - -MSFilter * ms_MULAWencoder_new(void) -{ - MSMULAWEncoder *r; - - r=g_new(MSMULAWEncoder,1); - ms_MULAWencoder_init(r); - if (ms_MULAWencoder_class==NULL) - { - ms_MULAWencoder_class=g_new(MSMULAWEncoderClass,1); - ms_MULAWencoder_class_init(ms_MULAWencoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_MULAWencoder_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_MULAWencoder_init(MSMULAWEncoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=MULAW_ENCODER_RMAXGRAN; /* the filter can be called as soon as there is - something to process */ - memset(r->f_inputs,0,sizeof(MSFifo*)*MSMULAWENCODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSMULAWENCODER_MAX_INPUTS); - -} - -void ms_MULAWencoder_class_init(MSMULAWEncoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"MULAWEncoder"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&MULAWinfo; - MS_FILTER_CLASS(klass)->max_finputs=MSMULAWENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSMULAWENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=MULAW_ENCODER_RMAXGRAN; - MS_FILTER_CLASS(klass)->w_maxgran=MULAW_ENCODER_WMAXGRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_MULAWencoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_MULAWencoder_process; -} - -void ms_MULAWencoder_process(MSMULAWEncoder *r) -{ - MSFifo *fi,*fo; - int inlen,outlen; - gchar *s,*d; - int i; - /* process output fifos, but there is only one for this class of filter*/ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - inlen=ms_fifo_get_read_ptr(fi,MULAW_ENCODER_RMAXGRAN,(void**)&s); - outlen=ms_fifo_get_write_ptr(fo,MULAW_ENCODER_WMAXGRAN,(void**)&d); - if (d!=NULL) - { - for(i=0;i<MULAW_ENCODER_WMAXGRAN;i++) - { - d[i]=s16_to_ulaw( *((gint16*)s) ); - s+=2; - } - } - else g_warning("MSMULAWDecoder: Discarding samples !!"); -} - - - -void ms_MULAWencoder_destroy( MSMULAWEncoder *obj) -{ - g_free(obj); -}
--- a/src/mediastreamer/msMUlawenc.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSMULAWENCODER_H -#define MSMULAWENCODER_H - -#include "mscodec.h" - - -/*this is the class that implements a MULAWencoder filter*/ - -#define MSMULAWENCODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSMULAWEncoder -{ - /* the MSMULAWEncoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSMULAWEncoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSMULAWENCODER_MAX_INPUTS]; - MSFifo *f_outputs[MSMULAWENCODER_MAX_INPUTS]; -} MSMULAWEncoder; - -typedef struct _MSMULAWEncoderClass -{ - /* the MSMULAWEncoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSMULAWEncoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSMULAWEncoderClass; - -/* PUBLIC */ -#define MS_MULAWENCODER(filter) ((MSMULAWEncoder*)(filter)) -#define MS_MULAWENCODER_CLASS(klass) ((MSMULAWEncoderClass*)(klass)) -MSFilter * ms_MULAWencoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_MULAWencoder_init(MSMULAWEncoder *r); -void ms_MULAWencoder_class_init(MSMULAWEncoderClass *klass); -void ms_MULAWencoder_destroy( MSMULAWEncoder *obj); -void ms_MULAWencoder_process(MSMULAWEncoder *r); - -/* tuning parameters :*/ -#define MULAW_ENCODER_WMAXGRAN 160 -#define MULAW_ENCODER_RMAXGRAN 320 - -#endif
--- a/src/mediastreamer/msavdecoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,278 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msavdecoder.h" -#include "mscodec.h" -extern MSFilter *ms_mpeg_encoder_new(); -extern MSFilter *ms_mpeg4_encoder_new(); -extern MSFilter *ms_h263_encoder_new(); - - -MSCodecInfo MPEGinfo={ - { - "MPEG1 codec", - 0, - MS_FILTER_VIDEO_CODEC, - ms_mpeg_encoder_new, - "This is a MPEG1 codec taken from the ffmpeg project." - }, - ms_mpeg_encoder_new, - ms_mpeg_decoder_new, - 0, - 0, - 0, /*bitrate */ - 0, /*sample freq */ - 0, - "MPV", - 1, - 1 -}; - -MSCodecInfo h263info={ - { - "H263 codec", - 0, - MS_FILTER_VIDEO_CODEC, - ms_h263_encoder_new, - "This is a H263 codec taken from the ffmpeg project." - }, - ms_h263_encoder_new, - ms_h263_decoder_new, - 0, - 0, - 0, /*bitrate */ - 0, /*sample freq */ - 0, - "H263", - 1, - 1 -}; - -MSCodecInfo MPEG4info={ - { - "MPEG4 codec", - 0, - MS_FILTER_VIDEO_CODEC, - ms_mpeg4_encoder_new, - "This is a MPEG4 codec taken from the ffmpeg project." - }, - ms_mpeg4_encoder_new, - ms_mpeg4_decoder_new, - 0, - 0, - 0, /*bitrate */ - 0, /*sample freq */ - 0, - "MP4V-ES", - 1, - 1 -}; - - -void ms_AVCodec_init() -{ - avcodec_init(); - avcodec_register_all(); - ms_filter_register((MSFilterInfo*)&h263info); - //ms_filter_register((MSFilterInfo*)&MPEG4info); -} - - -static MSAVDecoderClass *ms_avdecoder_class=NULL; - -MSFilter *ms_h263decoder_new() -{ - return ms_AVdecoder_new_with_codec(CODEC_ID_H263); -} - -MSFilter *ms_mpeg_decoder_new() -{ - return ms_AVdecoder_new_with_codec(CODEC_ID_MPEG1VIDEO); -} - -MSFilter *ms_mpeg4_decoder_new() -{ - return ms_AVdecoder_new_with_codec(CODEC_ID_MPEG4); -} - -MSFilter *ms_h263_decoder_new(){ - return ms_AVdecoder_new_with_codec(CODEC_ID_H263); -} - -MSFilter * ms_AVdecoder_new_with_codec(enum CodecID codec_id) -{ - MSAVDecoder *enc; - - enc=g_malloc0(sizeof(MSAVDecoder)); - if (ms_avdecoder_class==NULL) - { - ms_avdecoder_class=g_malloc0(sizeof(MSAVDecoderClass)); - ms_AVdecoder_class_init(ms_avdecoder_class); - } - MS_FILTER(enc)->klass=(MSFilterClass*)ms_avdecoder_class; - ms_AVdecoder_init(enc,avcodec_find_decoder(codec_id)); - return MS_FILTER(enc); -} - - -void ms_AVdecoder_init(MSAVDecoder *dec, AVCodec *codec) -{ - gint error; - - ms_filter_init(MS_FILTER(dec)); - MS_FILTER(dec)->inqueues=dec->q_inputs; - MS_FILTER(dec)->outqueues=dec->q_outputs; - avcodec_get_context_defaults(&dec->av_context); - dec->av_codec=codec; - dec->av_opened=0; - dec->skip_gob=1; - dec->obufwrap=NULL; -} - -void ms_AVdecoder_class_init(MSAVDecoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name( MS_FILTER_CLASS(klass),"AVdecoder"); - MS_FILTER_CLASS(klass)->max_qinputs=MSAVDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_qoutputs=MSAVDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=0; - MS_FILTER_CLASS(klass)->w_maxgran=0; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_AVdecoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_AVdecoder_process; -} - -void ms_AVdecoder_uninit(MSAVDecoder *dec) -{ - if (dec->obufwrap!=NULL) ms_buffer_destroy(dec->obufwrap); - if (dec->av_opened) avcodec_close(&dec->av_context); -} -void ms_AVdecoder_destroy( MSAVDecoder *obj) -{ - ms_AVdecoder_uninit(obj); - g_free(obj); -} - -gint ms_AVdecoder_set_format(MSAVDecoder *dec, gchar *fmt) -{ - gint format; - if (strcmp(fmt,"YUV420P")==0) format=PIX_FMT_YUV420P; - else if (strcmp(fmt,"YUV422")==0) format=PIX_FMT_YUV422; - else if (strcmp(fmt,"RGB24")==0) format=PIX_FMT_RGB24; - else if (strcmp(fmt,"BGR24")==0) format=PIX_FMT_BGR24; - else if (strcmp(fmt,"YUV422P")==0) format=PIX_FMT_YUV422P; - else if (strcmp(fmt,"YUV444P")==0) format=PIX_FMT_YUV444P; - else { - g_warning("ms_AVdecoder_set_format: unsupported format %s.",fmt); - return -1; - } - dec->output_pix_fmt=format; - return 0; -} - -void ms_AVdecoder_process(MSAVDecoder *r) -{ - AVFrame orig; - AVFrame transformed; - MSQueue *inq,*outq; - MSMessage *inm,*outm; - gint error; - gint got_picture; - gint len; - unsigned char *data; - AVCodecContext *ctx=&r->av_context; - gint gob_num; - - inq=r->q_inputs[0]; - outq=r->q_outputs[0]; - - /* get a picture from the input queue */ - inm=ms_queue_get(inq); - g_return_if_fail(inm!=NULL); - if (inm->size > 0) - { - guint32 *p = inm->data; - - if (!r->av_opened){ - error=avcodec_open(&r->av_context, r->av_codec); - if (error!=0) g_warning("avcodec_open() failed: %i",error); - else r->av_opened=1; - } - - gob_num = (ntohl(*p) >> 10) & 0x1f; - ms_trace("gob %i, size %i", gob_num, inm->size); - ms_trace("ms_AVdecoder_process: received %08x %08x", ntohl(p[0]), ntohl(p[1])); - - /* remove H.263 Payload Header */ - p[0] = htonl( ntohl(p[0]) & 0x0000ffff ); - - if (gob_num == 0){ - if (r->skip_gob == 0) - { - unsigned char *data = r->buf_compressed; - ms_trace("ms_AVdecoder_process: decoding %08x %08x %08x", ntohl(((unsigned int *)data)[0]), ntohl(((unsigned int *)data)[1]), ntohl(((unsigned int *)data)[2])); - while (r->buf_size > 0) { - len=avcodec_decode_video(&r->av_context,&orig,&got_picture,data,r->buf_size /*inm->size*/); - if (len<0) { - ms_warning("ms_AVdecoder_process: error %i.",len); - break; - } - if (got_picture) { - ms_trace("ms_AVdecoder_process: got_picture: width=%i height=%i fmt=%i", - ctx->width,ctx->height,ctx->pix_fmt); - /* set the image in the wanted format */ - outm=ms_message_alloc(); - if (r->obufwrap==NULL){ - r->obufwrap=ms_buffer_new(avpicture_get_size(r->output_pix_fmt,ctx->width,ctx->height)); - r->obufwrap->ref_count++; - } - ms_message_set_buf(outm,r->obufwrap); - avpicture_fill(&transformed,outm->data,r->output_pix_fmt,ctx->width,ctx->height); - img_convert(&transformed, r->output_pix_fmt, - &orig,ctx->pix_fmt,ctx->width,ctx->height); - ms_queue_put(outq,outm); - } - r->buf_size -= len; - data += len; - } - } - else { - r->skip_gob = 0; - } - memcpy(r->buf_compressed, inm->data, inm->size); - r->buf_size = inm->size; - } - else { - memcpy(r->buf_compressed + r->buf_size, inm->data, inm->size); - r->buf_size += inm->size; - } - } - ms_message_destroy(inm); -} - - -void ms_AVdecoder_set_width(MSAVDecoder *av,gint w) -{ - av->av_context.width=av->width=w; -} - -void ms_AVdecoder_set_height(MSAVDecoder *av,gint h) -{ - av->av_context.height=av->height=h; -}
--- a/src/mediastreamer/msavdecoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSAVDECODER_H -#define MSAVDECODER_H - -#include "msfilter.h" - - -#include <avcodec.h> - -/*this is the class that implements a AVdecoder filter*/ - -#define MSAVDECODER_MAX_INPUTS 1 /* max output per filter*/ - - -struct _MSAVDecoder -{ - /* the MSAVDecoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSAVDecoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSQueue *q_inputs[MSAVDECODER_MAX_INPUTS]; - MSQueue *q_outputs[MSAVDECODER_MAX_INPUTS]; - AVCodec *av_codec; /*the AVCodec from which this MSFilter is related */ - AVCodecContext av_context; /* the context of the AVCodec */ - gint av_opened; - int output_pix_fmt; - int width; - int height; - int skip_gob; - unsigned char buf_compressed[100000]; - int buf_size; - MSBuffer *obufwrap; /* alternate buffer, when format change is needed*/ -}; - -typedef struct _MSAVDecoder MSAVDecoder; - -struct _MSAVDecoderClass -{ - /* the MSAVDecoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSAVDecoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -}; - -typedef struct _MSAVDecoderClass MSAVDecoderClass; - -/* PUBLIC */ -#define MS_AVDECODER(filter) ((MSAVDecoder*)(filter)) -#define MS_AVDECODER_CLASS(klass) ((MSAVDecoderClass*)(klass)) - -MSFilter *ms_h263_decoder_new(void); -MSFilter *ms_mpeg_decoder_new(void); -MSFilter *ms_mpeg4_decoder_new(void); -MSFilter * ms_AVdecoder_new_with_codec(enum CodecID codec_id); - -gint ms_AVdecoder_set_format(MSAVDecoder *dec, gchar *fmt); -void ms_AVdecoder_set_width(MSAVDecoder *av,gint w); -void ms_AVdecoder_set_height(MSAVDecoder *av,gint h); - -/* FOR INTERNAL USE*/ -void ms_AVdecoder_init(MSAVDecoder *r, AVCodec *codec); -void ms_AVdecoder_uninit(MSAVDecoder *enc); -void ms_AVdecoder_class_init(MSAVDecoderClass *klass); -void ms_AVdecoder_destroy( MSAVDecoder *obj); -void ms_AVdecoder_process(MSAVDecoder *r); - -void ms_AVCodec_init(void); - -#endif
--- a/src/mediastreamer/msavencoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,235 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msavencoder.h" -#include "msutils.h" - -extern MSCodecInfo MPEG4info; -extern MSCodecInfo MPEGinfo; -extern MSCodecInfo h263info; - -static MSAVEncoderClass *ms_avencoder_class=NULL; -static void ms_AVencoder_rtp_callback (AVCodecContext *ctx,void *data, int size, int packet_number); - -MSFilter *ms_h263_encoder_new() -{ - return ms_AVencoder_new_with_codec(CODEC_ID_H263,&h263info); -} - -MSFilter *ms_mpeg_encoder_new() -{ - return ms_AVencoder_new_with_codec(CODEC_ID_MPEG1VIDEO, &MPEGinfo); -} - -MSFilter *ms_mpeg4_encoder_new() -{ - return ms_AVencoder_new_with_codec(CODEC_ID_MPEG4,&MPEG4info); -} - -MSFilter * ms_AVencoder_new_with_codec(enum CodecID codec_id, MSCodecInfo *info) -{ - MSAVEncoder *enc; - AVCodec *avc; - enc=g_malloc0(sizeof(MSAVEncoder)); - if (ms_avencoder_class==NULL) - { - ms_avencoder_class=g_malloc0(sizeof(MSAVEncoderClass)); - ms_AVencoder_class_init(ms_avencoder_class); - } - MS_FILTER(enc)->klass=(MSFilterClass*)ms_avencoder_class; - avc=avcodec_find_encoder(codec_id); - if (avc==NULL) g_error("unknown av codec."); - ms_AVencoder_init(enc,avc); - return MS_FILTER(enc); -} - - -void ms_AVencoder_init(MSAVEncoder *enc, AVCodec *codec) -{ - gint error; - AVCodecContext *c=&enc->av_context; - - ms_filter_init(MS_FILTER(enc)); - MS_FILTER(enc)->inqueues=enc->q_inputs; - MS_FILTER(enc)->outqueues=enc->q_outputs; - /* put default values */ - memset(c, 0, sizeof(AVCodecContext)); - avcodec_get_context_defaults(c); - - /* put sample parameters */ - c->bit_rate = 400000; - /* resolution must be a multiple of two */ - c->width = VIDEO_SIZE_CIF_W; - c->height = VIDEO_SIZE_CIF_H; - /* frames per second */ - c->frame_rate = 15; - c->frame_rate_base = 1; - c->gop_size = 10; /* emit one intra frame every x frames */ - c->rtp_mode = 1; - c->rtp_payload_size = 1488; - c->opaque = (void *) enc; - c->rtp_callback = ms_AVencoder_rtp_callback; - c->pix_fmt=PIX_FMT_YUV420P; - - enc->av_opened=0; - enc->av_codec=codec; - enc->yuv_buf=NULL; - enc->comp_buf=NULL; - /*set default input format */ - ms_AVencoder_set_format(enc,"RGB24"); -} - -void ms_AVencoder_class_init(MSAVEncoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - MS_FILTER_CLASS(klass)->info=0; - MS_FILTER_CLASS(klass)->max_qinputs=MSAVENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_qoutputs=MSAVENCODER_MAX_OUTPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=0; - MS_FILTER_CLASS(klass)->w_maxgran=0; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_AVencoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_AVencoder_process; - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"AVEncoder"); - -} - -void ms_AVencoder_uninit(MSAVEncoder *enc) -{ - if (enc->av_opened) - avcodec_close(&enc->av_context); - if (enc->comp_buf!=NULL) { - ms_buffer_destroy(enc->comp_buf); - enc->comp_buf=NULL; - } - if (enc->yuv_buf!=NULL) { - ms_buffer_destroy(enc->yuv_buf); - enc->yuv_buf=NULL; - } - -} -void ms_AVencoder_destroy( MSAVEncoder *obj) -{ - ms_AVencoder_uninit(obj); - g_free(obj); -} - - -void ms_AVencoder_set_frame_rate(MSAVEncoder *obj, gint frame_rate, gint frame_rate_base) -{ - obj->av_context.frame_rate = frame_rate; - obj->av_context.frame_rate_base = frame_rate_base; -} - -static void ms_AVencoder_rtp_callback (AVCodecContext *ctx, void *data, int size, int packet_number) -{ - MSAVEncoder *r = MS_AVENCODER(ctx->opaque); - MSQueue *outq = r->q_outputs[0]; - MSMessage *outm; - guint32 *p = (guint32 *) data; - gint gob_num = (ntohl(*p) >> 10) & 0x1f; - - /*g_message("ms_AVencoder_rtp_callback: packet %i, size %i, GOB number %i", packet_number, size, gob_num);*/ - ms_trace("ms_AVencoder_rtp_callback: received %08x %08x", ntohl(p[0]), ntohl(p[1])); - /* set the H.263 Payload Header (RFC 2429) */ - p[0] = ntohl( (0x04000000) | (ntohl(p[0]) & 0x0000ffff) ); /* P=1, V=0, PLEN=0 */ - ms_trace("ms_AVencoder_rtp_callback: sending %08x %08x", ntohl(p[0]), ntohl(p[1])); - outm = ms_message_new(size); - memcpy(outm->data,data,size); - ms_queue_put(outq, outm); -} - -void ms_AVencoder_process(MSAVEncoder *r) -{ - AVFrame orig; - AVFrame pict; - AVCodecContext *c=&r->av_context; - MSQueue *inq,*outq; - MSMessage *inm,*outm; - gint error; - - inq=r->q_inputs[0]; - outq=r->q_outputs[0]; - - /* get a picture from the input queue */ - inm=ms_queue_get(inq); - g_return_if_fail(inm!=NULL); - - /* allocate a new image */ - if (r->yuv_buf==NULL){ - gint bsize = avpicture_get_size(c->pix_fmt,c->width,c->height); - r->yuv_buf=ms_buffer_new(bsize); - r->yuv_buf->ref_count++; - - r->comp_buf=ms_buffer_new(bsize/2); - r->comp_buf->ref_count++; - } - if (!r->av_opened || r->av_context.codec == NULL){ - error=avcodec_open(c, r->av_codec); - ms_trace("image format is %i.",c->pix_fmt); - if (error!=0) { - g_warning("avcodec_open() failed: %i",error); - return; - }else r->av_opened=1; - } - outm=ms_message_alloc(); - /* convert image if necessary */ - if (r->input_pix_fmt!=c->pix_fmt){ - ms_trace("Changing picture format."); - avpicture_fill((AVPicture*)&orig,inm->data,r->input_pix_fmt,c->width,c->height); - avpicture_fill((AVPicture*)&pict,r->yuv_buf->buffer,c->pix_fmt,c->width,c->height); - if (img_convert((AVPicture*)&pict,c->pix_fmt,(AVPicture*)&orig,r->input_pix_fmt,c->width,c->height) < 0) { - g_warning("img_convert failed"); - return; - } - //if (pict.data[0]==NULL) g_error("img_convert failed."); - ms_message_set_buf(outm,r->yuv_buf); - } - else - { - avpicture_fill((AVPicture*)&pict,inm->data,c->pix_fmt,c->width,c->height); - ms_message_set_buf(outm,inm->buffer); - } - /* timestamp used by ffmpeg, unset here */ - pict.pts=AV_NOPTS_VALUE; - error=avcodec_encode_video(c, r->comp_buf->buffer, r->comp_buf->size, &pict); - if (error<=0) ms_warning("ms_AVencoder_process: error %i.",error); - else ms_trace("ms_AVencoder_process: video encoding done"); - if (r->q_outputs[1]!=NULL) ms_queue_put(r->q_outputs[1],outm); - else ms_message_destroy(outm); - ms_message_destroy(inm); -} - -gint ms_AVencoder_set_format(MSAVEncoder *enc, gchar *fmt) -{ - gint format; - if (strcmp(fmt,"YUV420P")==0) format=PIX_FMT_YUV420P; - else if (strcmp(fmt,"YUV422")==0) format=PIX_FMT_YUV422; - else if (strcmp(fmt,"RGB24")==0) format=PIX_FMT_RGB24; - else if (strcmp(fmt,"BGR24")==0) format=PIX_FMT_BGR24; - else if (strcmp(fmt,"YUV422P")==0) format=PIX_FMT_YUV422P; - else if (strcmp(fmt,"YUV444P")==0) format=PIX_FMT_YUV444P; - else { - g_warning("ms_AVdecoder_set_format: unsupported format %s.",fmt); - return -1; - } - enc->input_pix_fmt=format; - - return 0; -}
--- a/src/mediastreamer/msavencoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSAVENCODER_H -#define MSAVENCODER_H - -#include "msfilter.h" -#include "mscodec.h" -#include <avcodec.h> - -/*this is the class that implements a AVencoder filter*/ - -#define MSAVENCODER_MAX_INPUTS 1 /* max output per filter*/ -#define MSAVENCODER_MAX_OUTPUTS 2 - -struct _MSAVEncoder -{ - /* the MSAVEncoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSAVEncoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSQueue *q_inputs[MSAVENCODER_MAX_INPUTS]; - MSQueue *q_outputs[MSAVENCODER_MAX_OUTPUTS]; - AVCodec *av_codec; /*the AVCodec from which this MSFilter is related */ - AVCodecContext av_context; /* the context of the AVCodec */ - gint input_pix_fmt; - gint av_opened; - MSBuffer *comp_buf; - MSBuffer *yuv_buf; -}; - -typedef struct _MSAVEncoder MSAVEncoder; -/* MSAVEncoder always outputs planar YUV and accept any incoming format you should setup using - ms_AVencoder_set_format() -q_outputs[0] is the compressed video stream output -q_outputs[1] is a YUV planar buffer of the image it receives in input. -*/ - - -struct _MSAVEncoderClass -{ - /* the MSAVEncoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSAVEncoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -}; - -typedef struct _MSAVEncoderClass MSAVEncoderClass; - -/* PUBLIC */ -#define MS_AVENCODER(filter) ((MSAVEncoder*)(filter)) -#define MS_AVENCODER_CLASS(klass) ((MSAVEncoderClass*)(klass)) - -MSFilter *ms_h263_encoder_new(void); -MSFilter *ms_mpeg_encoder_new(void); -MSFilter *ms_mpeg4_encoder_new(void); -MSFilter * ms_AVencoder_new_with_codec(enum CodecID codec_id, MSCodecInfo *info); - -gint ms_AVencoder_set_format(MSAVEncoder *enc, gchar *fmt); - -#define ms_AVencoder_set_width(av,w) (av)->av_context.width=(w) -#define ms_AVencoder_set_height(av,h) (av)->av_context.height=(h) -#define ms_AVencoder_set_bit_rate(av,r) (av)->av_context.bit_rate=(r) - -void ms_AVencoder_set_frame_rate(MSAVEncoder *enc, gint frame_rate, gint frame_rate_base); - -/* FOR INTERNAL USE*/ -void ms_AVencoder_init(MSAVEncoder *r, AVCodec *codec); -void ms_AVencoder_uninit(MSAVEncoder *enc); -void ms_AVencoder_class_init(MSAVEncoderClass *klass); -void ms_AVencoder_destroy( MSAVEncoder *obj); -void ms_AVencoder_process(MSAVEncoder *r); - -#endif
--- a/src/mediastreamer/msbuffer.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msbuffer.h" -#include "msutils.h" -#include <string.h> - - - -MSBuffer * ms_buffer_new(guint32 size) -{ - MSBuffer *buf; - buf=(MSBuffer*)g_malloc(sizeof(MSBuffer)+size); - buf->ref_count=0; - buf->size=size; - ms_trace("ms_buffer_new: Allocating buffer of %i bytes.",size); - /* allocate the data buffer: there is a lot of optmisation that can be done by using a pool of cached buffers*/ - buf->buffer=((char*)(buf))+sizeof(MSBuffer); /* to avoid to do two allocations, - buffer info and buffer are contigous.*/ - buf->flags=MS_BUFFER_CONTIGUOUS; - return(buf); -} - -MSBuffer *ms_buffer_alloc(gint flags) -{ - MSBuffer *buf; - buf=(MSBuffer*)g_malloc(sizeof(MSBuffer)); - buf->ref_count=0; - buf->size=0; - buf->buffer=NULL; - buf->flags=0; - return(buf); -} - - -void ms_buffer_destroy(MSBuffer *buf) -{ - if (buf->flags & MS_BUFFER_CONTIGUOUS){ - g_free(buf); - } - else { - g_free(buf->buffer); - g_free(buf); - } -} - -MSMessage *ms_message_alloc() -{ - MSMessage *m=g_malloc(sizeof(MSMessage)); - memset(m,0,sizeof(MSMessage)); - return m; -} - -MSMessage *ms_message_new(gint size) -{ - MSMessage *m=ms_message_alloc(); - MSBuffer *buf=ms_buffer_new(size); - ms_message_set_buf(m,buf); - return m; -} - -void ms_message_destroy(MSMessage *m) -{ - /* the buffer is freed if its ref_count goes to zero */ - if (m->buffer!=NULL){ - m->buffer->ref_count--; - if (m->buffer->ref_count==0) ms_buffer_destroy(m->buffer); - } - g_free(m); -} - -MSMessage * ms_message_dup(MSMessage *m) -{ - MSMessage *msg=ms_message_alloc(); - ms_message_set_buf(msg,m->buffer); - return msg; -}
--- a/src/mediastreamer/msbuffer.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSBUFFER_H -#define MSBUFFER_H -#include <config.h> - -#ifdef HAVE_GLIB -#include <glib.h> -#else -#include <uglib.h> -#endif - - -#define MS_BUFFER_LARGE 4092 - - -typedef struct _MSBuffer -{ - gchar *buffer; - guint32 size; - guint16 ref_count; - guint16 flags; -#define MS_BUFFER_CONTIGUOUS (1) -}MSBuffer; - -MSBuffer * ms_buffer_new(guint32 size); -void ms_buffer_destroy(MSBuffer *buf); - -struct _MSMessage -{ - MSBuffer *buffer; /* points to a MSBuffer */ - void *data; /*points to buffer->buffer */ - guint32 size; /* the size of the buffer to read in data. It may not be the - physical size (I mean buffer->buffer->size */ - struct _MSMessage *next; - struct _MSMessage *prev; /* MSMessage are queued into MSQueues */ -}; - -typedef struct _MSMessage MSMessage; - - -MSBuffer *ms_buffer_alloc(gint flags); -MSMessage *ms_message_new(gint size); - -#define ms_message_set_buf(m,b) do { (b)->ref_count++; (m)->buffer=(b); (m)->data=(b)->buffer; (m)->size=(b)->size; }while(0) -#define ms_message_unset_buf(m) do { (m)->buffer->ref_count--; (m)->buffer=NULL; (m)->size=0; (m)->data=NULL; } while(0) - -#define ms_message_size(m) (m)->size -void ms_message_destroy(MSMessage *m); - -MSMessage * ms_message_dup(MSMessage *m); - -/* allocate a single message without buffer */ -MSMessage *ms_message_alloc(void); - -#endif
--- a/src/mediastreamer/mscodec.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,257 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "mscodec.h" - -#ifdef SME -#include "msGSMdecoder.h" -#include "msLPC10decoder.h" -#endif -#include "msMUlawdec.h" -#include "msAlawdec.h" - -#ifdef TRUESPEECH -extern MSCodecInfo TrueSpeechinfo; -#endif - -#ifdef VIDEO_ENABLED -extern void ms_AVCodec_init(); -#endif - -#define UDP_HDR_SZ 8 -#define RTP_HDR_SZ 12 -#define IP4_HDR_SZ 20 /*20 is the minimum, but there may be some options*/ - - - - -/* register all statically linked codecs */ -void ms_codec_register_all() -{ -// ms_filter_register(MS_FILTER_INFO(&GSMinfo)); -// ms_filter_register(MS_FILTER_INFO(&LPC10info)); - ms_filter_register(MS_FILTER_INFO(&MULAWinfo)); - ms_filter_register(MS_FILTER_INFO(&ALAWinfo)); -#ifdef TRUESPEECH - ms_filter_register(MS_FILTER_INFO(&TrueSpeechinfo)); -#endif -#ifdef VIDEO_ENABLED - ms_AVCodec_init(); -#endif - -} - -/* returns a list of MSCodecInfo */ -GList * ms_codec_get_all_audio() -{ - GList *audio_codecs=NULL; - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if (info->type==MS_FILTER_AUDIO_CODEC){ - audio_codecs=g_list_append(audio_codecs,info); - } - elem=g_list_next(elem); - } - return audio_codecs; -} - - -MSCodecInfo * ms_audio_codec_info_get(gchar *name) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ( (info->type==MS_FILTER_AUDIO_CODEC) ){ - MSCodecInfo *codinfo=(MSCodecInfo *)info; - if (strcmp(codinfo->description,name)==0){ - return MS_CODEC_INFO(info); - } - } - elem=g_list_next(elem); - } - return NULL; -} - -MSCodecInfo * ms_video_codec_info_get(gchar *name) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ( (info->type==MS_FILTER_VIDEO_CODEC) ){ - MSCodecInfo *codinfo=(MSCodecInfo *)info; - if (strcmp(codinfo->description,name)==0){ - return MS_CODEC_INFO(info); - } - } - elem=g_list_next(elem); - } - return NULL; -} - -/* returns a list of MSCodecInfo */ -GList * ms_codec_get_all_video() -{ - GList *video_codecs=NULL; - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if (info->type==MS_FILTER_VIDEO_CODEC){ - video_codecs=g_list_append(video_codecs,info); - } - elem=g_list_next(elem); - } - return video_codecs; -} - -MSFilter * ms_encoder_new(gchar *name) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){ - MSCodecInfo *codinfo=(MSCodecInfo *)elem->data; - if (strcmp(info->name,name)==0){ - return codinfo->encoder(); - } - } - elem=g_list_next(elem); - } - return NULL; -} - -MSFilter * ms_decoder_new(gchar *name) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){ - MSCodecInfo *codinfo=(MSCodecInfo *)elem->data; - if (strcmp(info->name,name)==0){ - return codinfo->decoder(); - } - } - elem=g_list_next(elem); - } - return NULL; -} - -MSFilter * ms_encoder_new_with_pt(gint pt) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){ - MSCodecInfo *codinfo=(MSCodecInfo *)elem->data; - if (codinfo->pt==pt){ - return codinfo->encoder(); - } - } - elem=g_list_next(elem); - } - return NULL; -} - -MSFilter * ms_decoder_new_with_pt(gint pt) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){ - MSCodecInfo *codinfo=(MSCodecInfo *)elem->data; - if (codinfo->pt==pt){ - return codinfo->decoder(); - } - } - elem=g_list_next(elem); - } - return NULL; -} - -MSFilter * ms_decoder_new_with_string_id(gchar *id) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){ - MSCodecInfo *codinfo=(MSCodecInfo *)elem->data; - if (strcasecmp(codinfo->description,id)==0){ - return codinfo->decoder(); - } - } - elem=g_list_next(elem); - } - return NULL; -} - -MSFilter * ms_encoder_new_with_string_id(gchar *id) -{ - GList *elem=filter_list; - MSFilterInfo *info; - while (elem!=NULL) - { - info=(MSFilterInfo *)elem->data; - if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){ - MSCodecInfo *codinfo=(MSCodecInfo *)elem->data; - if (strcasecmp(codinfo->description,id)==0){ - return codinfo->encoder(); - } - } - elem=g_list_next(elem); - } - return NULL; -} -/* return 0 if codec can be used with bandwidth, -1 else*/ -int ms_codec_is_usable(MSCodecInfo *codec,double bandwidth) -{ - double codec_band; - double npacket; - double packet_size; - - if (((MSFilterInfo*)codec)->type==MS_FILTER_AUDIO_CODEC) - { - /* calculate the total bandwdith needed by codec (including headers for rtp, udp, ip)*/ - /* number of packet per second*/ - npacket=2.0*(double)(codec->rate)/(double)(codec->fr_size); - packet_size=(double)(codec->dt_size)+UDP_HDR_SZ+RTP_HDR_SZ+IP4_HDR_SZ; - codec_band=packet_size*8.0*npacket; - } - else return -1; - return(codec_band<bandwidth); -}
--- a/src/mediastreamer/mscodec.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSCODEC_H -#define MSCODEC_H - -#include "msfilter.h" - -struct _MSCodecInfo -{ - MSFilterInfo info; - MSFilterNewFunc encoder; - MSFilterNewFunc decoder; - gint fr_size; /* size in char of the uncompressed frame */ - gint dt_size; /* size in char of the compressed frame */ - gint bitrate; /* the minimum bit rate in bits/second */ - gint rate; /*frequency */ - gint pt; /* the payload type number associated with this codec*/ - gchar *description; /* a rtpmap field to describe the codec */ - guint is_usable:1; /* linphone set this flag to remember if it can use this codec considering the total bandwidth*/ - guint is_selected:1; /* linphone (user) set this flag if he allows this codec to be used*/ -}; - -typedef struct _MSCodecInfo MSCodecInfo; - -MSFilter * ms_encoder_new(gchar *name); -MSFilter * ms_decoder_new(gchar *name); - -MSFilter * ms_encoder_new_with_pt(gint pt); -MSFilter * ms_decoder_new_with_pt(gint pt); - -MSFilter * ms_encoder_new_with_string_id(gchar *id); -MSFilter * ms_decoder_new_with_string_id(gchar *id); - -/* return 0 if codec can be used with bandwidth, -1 else*/ -int ms_codec_is_usable(MSCodecInfo *codec,double bandwidth); - -GList * ms_codec_get_all_audio(void); - -GList * ms_codec_get_all_video(void); - -MSCodecInfo * ms_audio_codec_info_get(gchar *name); -MSCodecInfo * ms_video_codec_info_get(gchar *name); - -/* register all statically linked codecs */ -void ms_codec_register_all(void); - -#define MS_CODEC_INFO(codinfo) ((MSCodecInfo*)codinfo) - -#endif
--- a/src/mediastreamer/mscopy.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "mscopy.h" -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <string.h> -#include <errno.h> - -static MSCopyClass *ms_copy_class=NULL; - -MSFilter * ms_copy_new(void) -{ - MSCopy *r; - - r=g_new(MSCopy,1); - ms_copy_init(r); - if (ms_copy_class==NULL) - { - ms_copy_class=g_new(MSCopyClass,1); - ms_copy_class_init(ms_copy_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_copy_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_copy_init(MSCopy *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->r_mingran=MSCOPY_DEF_GRAN; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSCOPY_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSCOPY_MAX_INPUTS); -} - -void ms_copy_class_init(MSCopyClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"fifocopier"); - MS_FILTER_CLASS(klass)->max_finputs=MSCOPY_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSCOPY_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=MSCOPY_DEF_GRAN; - MS_FILTER_CLASS(klass)->w_maxgran=MSCOPY_DEF_GRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_copy_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_copy_process; -} - -void ms_copy_process(MSCopy *r) -{ - MSFifo *fi,*fo; - int err1; - gint gran=MS_FILTER(r)->klass->r_maxgran; - void *s,*d; - - /* process output fifos, but there is only one for this class of filter*/ - - fi=r->f_inputs[0]; - fo=r->f_outputs[0]; - if (fi!=NULL) - { - err1=ms_fifo_get_read_ptr(fi,gran,&s); - if (err1>0) err1=ms_fifo_get_write_ptr(fo,gran,&d); - if (err1>0) - { - memcpy(d,s,gran); - } - } -} - -void ms_copy_destroy( MSCopy *obj) -{ - g_free(obj); -}
--- a/src/mediastreamer/mscopy.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSCOPY_H -#define MSCOPY_H - -#include "msfilter.h" - - -/*this is the class that implements a copy filter*/ - -#define MSCOPY_MAX_INPUTS 1 /* max output per filter*/ - -#define MSCOPY_DEF_GRAN 64 /* the default granularity*/ - -typedef struct _MSCopy -{ - /* the MSCopy derivates from MSFilter, so the MSFilter object MUST be the first of the MSCopy object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSCOPY_MAX_INPUTS]; - MSFifo *f_outputs[MSCOPY_MAX_INPUTS]; -} MSCopy; - -typedef struct _MSCopyClass -{ - /* the MSCopy derivates from MSFilter, so the MSFilter class MUST be the first of the MSCopy class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSCopyClass; - -/* PUBLIC */ -#define MS_COPY(filter) ((MSCopy*)(filter)) -#define MS_COPY_CLASS(klass) ((MSCopyClass*)(klass)) -MSFilter * ms_copy_new(void); - -/* FOR INTERNAL USE*/ -void ms_copy_init(MSCopy *r); -void ms_copy_class_init(MSCopyClass *klass); -void ms_copy_destroy( MSCopy *obj); -void ms_copy_process(MSCopy *r); - -#endif
--- a/src/mediastreamer/msfdispatcher.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a dispatcher of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msfdispatcher.h" - -static MSFdispatcherClass *ms_fdispatcher_class=NULL; - -MSFilter * ms_fdispatcher_new(void) -{ - MSFdispatcher *obj; - obj=g_malloc(sizeof(MSFdispatcher)); - if (ms_fdispatcher_class==NULL){ - ms_fdispatcher_class=g_malloc(sizeof(MSFdispatcherClass)); - ms_fdispatcher_class_init(ms_fdispatcher_class); - } - MS_FILTER(obj)->klass=MS_FILTER_CLASS(ms_fdispatcher_class); - ms_fdispatcher_init(obj); - return MS_FILTER(obj); -} - - -void ms_fdispatcher_init(MSFdispatcher *obj) -{ - ms_filter_init(MS_FILTER(obj)); - MS_FILTER(obj)->infifos=obj->f_inputs; - MS_FILTER(obj)->outfifos=obj->f_outputs; - MS_FILTER(obj)->r_mingran=MS_FDISPATCHER_DEF_GRAN; - memset(obj->f_inputs,0,sizeof(MSFifo*)*MS_FDISPATCHER_MAX_INPUTS); - memset(obj->f_outputs,0,sizeof(MSFifo*)*MS_FDISPATCHER_MAX_OUTPUTS); -} - - - -void ms_fdispatcher_class_init(MSFdispatcherClass *klass) -{ - MSFilterClass *parent_class=MS_FILTER_CLASS(klass); - ms_filter_class_init(parent_class); - ms_filter_class_set_name(parent_class,"fdispatcher"); - parent_class->max_finputs=MS_FDISPATCHER_MAX_INPUTS; - parent_class->max_foutputs=MS_FDISPATCHER_MAX_OUTPUTS; - parent_class->r_maxgran=MS_FDISPATCHER_DEF_GRAN; - parent_class->w_maxgran=MS_FDISPATCHER_DEF_GRAN; - parent_class->destroy=(MSFilterDestroyFunc)ms_fdispatcher_destroy; - parent_class->process=(MSFilterProcessFunc)ms_fdispatcher_process; -} - - -void ms_fdispatcher_destroy( MSFdispatcher *obj) -{ - g_free(obj); -} - -void ms_fdispatcher_process(MSFdispatcher *obj) -{ - gint i; - MSFifo *inf=obj->f_inputs[0]; - - - if (inf!=NULL){ - void *s,*d; - /* dispatch fifos */ - while ( ms_fifo_get_read_ptr(inf,MS_FDISPATCHER_DEF_GRAN,&s) >0 ){ - for (i=0;i<MS_FDISPATCHER_MAX_OUTPUTS;i++){ - MSFifo *outf=obj->f_outputs[i]; - - if (outf!=NULL) - { - ms_fifo_get_write_ptr(outf,MS_FDISPATCHER_DEF_GRAN,&d); - if (d!=NULL) memcpy(d,s,MS_FDISPATCHER_DEF_GRAN); - } - } - } - } -} - -
--- a/src/mediastreamer/msfdispatcher.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a dispatcher of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSFDISPATCHER_H -#define MSFDISPATCHER_H - -#include "msfilter.h" - - -/*this is the class that implements a fdispatcher filter*/ - -#define MS_FDISPATCHER_MAX_INPUTS 1 -#define MS_FDISPATCHER_MAX_OUTPUTS 5 -#define MS_FDISPATCHER_DEF_GRAN 64 /* the default granularity*/ - -typedef struct _MSFdispatcher -{ - /* the MSFdispatcher derivates from MSFilter, so the MSFilter object MUST be the first of the MSFdispatcher object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MS_FDISPATCHER_MAX_INPUTS]; - MSFifo *f_outputs[MS_FDISPATCHER_MAX_OUTPUTS]; -} MSFdispatcher; - -typedef struct _MSFdispatcherClass -{ - /* the MSFdispatcher derivates from MSFilter, so the MSFilter class MUST be the first of the MSFdispatcher class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSFdispatcherClass; - -/* PUBLIC */ -#define MS_FDISPATCHER(filter) ((MSFdispatcher*)(filter)) -#define MS_FDISPATCHER_CLASS(klass) ((MSFdispatcherClass*)(klass)) -MSFilter * ms_fdispatcher_new(void); - -/* FOR INTERNAL USE*/ -void ms_fdispatcher_init(MSFdispatcher *r); -void ms_fdispatcher_class_init(MSFdispatcherClass *klass); -void ms_fdispatcher_destroy( MSFdispatcher *obj); -void ms_fdispatcher_process(MSFdispatcher *r); - -#endif
--- a/src/mediastreamer/msfifo.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,167 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include <errno.h> -#include <string.h> -#include "msutils.h" -#include "msfifo.h" - -MSFifo * ms_fifo_new(MSBuffer *buf, gint r_gran, gint w_gran, gint r_offset, gint w_offset) -{ - MSFifo *fifo; - gint saved_offset=MAX(r_gran+r_offset,w_offset); - - g_return_val_if_fail(saved_offset<=(buf->size),NULL); - fifo=g_malloc(sizeof(MSFifo)); - fifo->buffer=buf; - fifo->r_gran=r_gran; - fifo->w_gran=w_gran; - fifo->begin=fifo->wr_ptr=fifo->rd_ptr=buf->buffer+saved_offset; - fifo->readsize=0; - fifo->size=fifo->writesize=buf->size-saved_offset; - fifo->saved_offset= saved_offset; - fifo->r_end=fifo->w_end=buf->buffer+buf->size; - fifo->pre_end=fifo->w_end-saved_offset; - buf->ref_count++; - fifo->prev_data=NULL; - fifo->next_data=NULL; - ms_trace("fifo base=%x, begin=%x, end=%x, saved_offset=%i, size=%i" - ,fifo->buffer->buffer,fifo->begin,fifo->w_end,fifo->saved_offset,fifo->size); - return(fifo); -} - -MSFifo * ms_fifo_new_with_buffer(gint r_gran, gint w_gran, gint r_offset, gint w_offset, - gint min_fifo_size) -{ - MSFifo *fifo; - MSBuffer *buf; - gint saved_offset=MAX(r_gran+r_offset,w_offset); - gint fifo_size; - if (min_fifo_size==0) min_fifo_size=w_gran; - - /* we must allocate a fifo with a size multiple of min_fifo_size, - with a saved_offset */ - if (min_fifo_size>MS_BUFFER_LARGE) - fifo_size=(min_fifo_size) + saved_offset; - else fifo_size=(6*min_fifo_size) + saved_offset; - buf=ms_buffer_new(fifo_size); - fifo=ms_fifo_new(buf,r_gran,w_gran,r_offset,w_offset); - ms_trace("fifo_size=%i",fifo_size); - return(fifo); -} - -void ms_fifo_destroy( MSFifo *fifo) -{ - g_free(fifo); -} - -void ms_fifo_destroy_with_buffer(MSFifo *fifo) -{ - ms_buffer_destroy(fifo->buffer); - ms_fifo_destroy(fifo); -} - -gint ms_fifo_get_read_ptr(MSFifo *fifo, gint bsize, void **ret_ptr) -{ - gchar *rnext; - - *ret_ptr=NULL; - //ms_trace("ms_fifo_get_read_ptr: entering."); - g_return_val_if_fail(bsize<=fifo->r_gran,-EINVAL); - - if (bsize>fifo->readsize) - { - ms_trace("Not enough data: bsize=%i, readsize=%i",bsize,fifo->readsize); - return (-ENODATA); - } - - rnext=fifo->rd_ptr+bsize; - if (rnext<=fifo->r_end){ - - *ret_ptr=fifo->rd_ptr; - fifo->rd_ptr=rnext; - }else{ - int unread=fifo->r_end-fifo->rd_ptr; - *ret_ptr=fifo->begin-unread; - memcpy(fifo->buffer->buffer,fifo->r_end-fifo->saved_offset,fifo->saved_offset); - fifo->rd_ptr=(char*)(*ret_ptr) + bsize; - fifo->r_end=fifo->w_end; /* this is important ! */ - ms_trace("moving read ptr to %x",fifo->rd_ptr); - - } - /* update write size*/ - fifo->writesize+=bsize; - fifo->readsize-=bsize; - return bsize; -} - - -void ms_fifo_update_write_ptr(MSFifo *fifo, gint written){ - gint reserved=fifo->wr_ptr-fifo->prev_wr_ptr; - gint unwritten; - g_return_if_fail(reserved>=0); - unwritten=reserved-written; - g_return_if_fail(unwritten>=0); - /* fix readsize and writesize */ - fifo->readsize-=unwritten; - fifo->writesize+=unwritten; - fifo->wr_ptr+=written; -} - -gint ms_fifo_get_write_ptr(MSFifo *fifo, gint bsize, void **ret_ptr) -{ - gchar *wnext; - - *ret_ptr=NULL; - //ms_trace("ms_fifo_get_write_ptr: Entering."); - g_return_val_if_fail(bsize<=fifo->w_gran,-EINVAL); - if (bsize>fifo->writesize) - { - ms_trace("Not enough space: bsize=%i, writesize=%i",bsize,fifo->writesize); - *ret_ptr=NULL; - return(-ENODATA); - } - wnext=fifo->wr_ptr+bsize; - if (wnext<=fifo->w_end){ - *ret_ptr=fifo->wr_ptr; - fifo->wr_ptr=wnext; - }else{ - *ret_ptr=fifo->begin; - fifo->r_end=fifo->wr_ptr; - fifo->wr_ptr=fifo->begin+bsize; - ms_trace("moving write ptr to %x",fifo->wr_ptr); - } - fifo->prev_wr_ptr=*ret_ptr; - /* update readsize*/ - fifo->readsize+=bsize; - fifo->writesize-=bsize; - //ms_trace("ms_fifo_get_write_ptr: readsize=%i, writesize=%i",fifo->readsize,fifo->writesize); - return bsize; -} - -gint ms_fifo_get_rw_ptr(MSFifo *f1,void **p1,gint minsize1, - MSFifo *f2,void **p2,gint minsize2) -{ - gint rbsize,wbsize; - - rbsize=MIN(f1->readsize,(f1->pre_end-f1->rd_ptr)); - wbsize=MIN(f2->writesize,(f2->w_end-f2->wr_ptr)); - return 0; -}
--- a/src/mediastreamer/msfifo.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifdef HAVE_GLIB -#include <glib.h> -#else -#include "glist.h" -#endif -#include "msbuffer.h" - -typedef struct _MSFifo -{ - gint r_gran; /*maximum granularity for reading*/ - gint w_gran; /*maximum granularity for writing*/ - gchar * rd_ptr; /* read pointer on the position where there is something to read on the MSBuffer */ - guint32 readsize; - gchar * wr_ptr; - gchar * prev_wr_ptr; - guint32 writesize; /* write pointer on the position where it is possible to write on the MSBuffer */ - gchar * begin; /* rd_ptr et wr_ptr must all be >=begin*/ - guint32 size; /* the length of the fifo, but this may not be equal to buffer->size*/ - guint32 saved_offset; - gchar * pre_end; /* the end of the buffer that is copied at the begginning when we wrap around*/ - gchar * w_end; /* when a wr ptr is expected to exceed end_offset, - it must be wrapped around to go at the beginning of the buffer. This is the end of the buffer*/ - gchar * r_end; /* this is the last position written at the end of the fifo. If a read ptr is expected to - exceed this pointer, it must be put at the begginning of the buffer */ - void *prev_data; /*user data, usually the writing MSFilter*/ - void *next_data; /* user data, usually the reading MSFilter */ - MSBuffer *buffer; -} MSFifo; - -/* constructor*/ -/* r_gran: max granularity for reading (in number of bytes)*/ -/* w_gran: max granularity for writing (in number of bytes)*/ -/* r_offset: number of bytes that are kept available behind read pointer (for recursive filters)*/ -/* w_offset: number of bytes that are kept available behind write pointer (for recursive filters)*/ -/* buf is a MSBuffer that should be compatible with the above parameter*/ -MSFifo * ms_fifo_new(MSBuffer *buf, gint r_gran, gint w_gran, gint r_offset, gint w_offset); - -/*does the same that ms_fifo_new(), but also allocate a compatible buffer automatically*/ -MSFifo * ms_fifo_new_with_buffer(gint r_gran, gint w_gran, gint r_offset, gint w_offset, gint min_buffer_size); - -void ms_fifo_destroy( MSFifo *fifo); - -void ms_fifo_destroy_with_buffer(MSFifo *fifo); - -/* get data to read */ -gint ms_fifo_get_read_ptr(MSFifo *fifo, gint bsize, void **ret_ptr); - -/* get a buffer to write*/ -gint ms_fifo_get_write_ptr(MSFifo *fifo, gint bsize, void **ret_ptr); - -/* in case the buffer got by ms_fifo_get_write_ptr() could not be filled completely, you must -tell it by using this function */ -void ms_fifo_update_write_ptr(MSFifo *fifo, gint written);
--- a/src/mediastreamer/msfilter.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,537 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include <errno.h> -#include "msfilter.h" - - - -void ms_filter_init(MSFilter *filter) -{ - filter->finputs=0; - filter->foutputs=0; - filter->qinputs=0; - filter->qoutputs=0; - filter->infifos=NULL; - filter->outfifos=NULL; - filter->inqueues=NULL; - filter->outqueues=NULL; - filter->lock=g_mutex_new(); - filter->min_fifo_size=0x7fff; - filter->notify_event=NULL; - filter->userdata=NULL; -} - -void ms_filter_uninit(MSFilter *filter) -{ - g_mutex_free(filter->lock); -} - -void ms_filter_class_init(MSFilterClass *filterclass) -{ - filterclass->name=NULL; - filterclass->max_finputs=0; - filterclass->max_foutputs=0; - filterclass->max_qinputs=0; - filterclass->max_qoutputs=0; - filterclass->r_maxgran=0; - filterclass->w_maxgran=0; - filterclass->r_offset=0; - filterclass->w_offset=0; - filterclass->set_property=NULL; - filterclass->get_property=NULL; - filterclass->setup=NULL; - filterclass->unsetup=NULL; - filterclass->process=NULL; - filterclass->destroy=NULL; - filterclass->attributes=0; - filterclass->ref_count=0; -} - -/* find output queue */ -gint find_oq(MSFilter *m1,MSQueue *oq) -{ - gint i; - - for (i=0;i<MS_FILTER_GET_CLASS(m1)->max_qoutputs;i++){ - if (m1->outqueues[i]==oq) return i; - } - - return -1; -} - -/* find input queue */ -gint find_iq(MSFilter *m1,MSQueue *iq) -{ - gint i; - for (i=0;i<MS_FILTER_GET_CLASS(m1)->max_qinputs;i++){ - if (m1->inqueues[i]==iq) return i; - } - return -1; -} - -/* find output fifo */ -gint find_of(MSFilter *m1,MSFifo *of) -{ - gint i; - for (i=0;i<MS_FILTER_GET_CLASS(m1)->max_foutputs;i++){ - if (m1->outfifos[i]==of) return i; - } - - return -1; -} - -/* find input fifo */ -gint find_if(MSFilter *m1,MSFifo *inf) -{ - gint i; - - for (i=0;i<MS_FILTER_GET_CLASS(m1)->max_finputs;i++){ - if (m1->infifos[i]==inf) return i; - } - - return -1; -} - -#define find_free_iq(_m1) find_iq(_m1,NULL) -#define find_free_oq(_m1) find_oq(_m1,NULL) -#define find_free_if(_m1) find_if(_m1,NULL) -#define find_free_of(_m1) find_of(_m1,NULL) - -int ms_filter_add_link(MSFilter *m1, MSFilter *m2) -{ - gint m1_q=-1; - gint m1_f=-1; - gint m2_q=-1; - gint m2_f=-1; - /* determine the type of link we can add */ - m1_q=find_free_oq(m1); - m1_f=find_free_of(m1); - m2_q=find_free_iq(m2); - m2_f=find_free_if(m2); - if ((m1_q!=-1) && (m2_q!=-1)){ - /* link with queues */ - ms_trace("m1_q=%i , m2_q=%i",m1_q,m2_q); - return ms_filter_link(m1,m1_q,m2,m2_q,LINK_QUEUE); - } - if ((m1_f!=-1) && (m2_f!=-1)){ - /* link with queues */ - ms_trace("m1_f=%i , m2_f=%i",m1_f,m2_f); - return ms_filter_link(m1,m1_f,m2,m2_f,LINK_FIFO); - } - g_warning("ms_filter_add_link: could not link."); - return -1; -} -/** - * ms_filter_link: - * @m1: A #MSFilter object. - * @pin1: The pin number on @m1. - * @m2: A #MSFilter object. - * @pin2: The pin number on @m2. - * @linktype: Type of connection, it may be #LINK_QUEUE, #LINK_FIFOS. - * - * This function links two MSFilter object between them. It must be used to make chains of filters. - * All data outgoing from pin1 of m1 will go to the input pin2 of m2. - * The way to communicate can be fifos or queues, depending of the nature of the filters. Filters can have - * multiple queue pins and multiple fifo pins, but most of them have only one queue input/output or only one - * fifo input/output. Fifos are usally used by filters doing audio processing, while queues are used by filters doing - * video processing. - * - * Returns: 0 if successfull, a negative value reprensenting the errno.h error. - */ -int ms_filter_link(MSFilter *m1, gint pin1, MSFilter *m2,gint pin2, int linktype) -{ - MSQueue *q; - MSFifo *fifo; - - g_message("ms_filter_add_link: %s,%i -> %s,%i",m1->klass->name,pin1,m2->klass->name,pin2); - switch(linktype) - { - case LINK_QUEUE: - /* Are filter m1 and m2 able to accept more queues connections ?*/ - g_return_val_if_fail(m1->qoutputs<MS_FILTER_GET_CLASS(m1)->max_qoutputs,-EMLINK); - g_return_val_if_fail(m2->qinputs<MS_FILTER_GET_CLASS(m2)->max_qinputs,-EMLINK); - /* Are filter m1 and m2 valid with their inputs and outputs ?*/ - g_return_val_if_fail(m1->outqueues!=NULL,-EFAULT); - g_return_val_if_fail(m2->inqueues!=NULL,-EFAULT); - /* are the requested pins exists ?*/ - g_return_val_if_fail(pin1<MS_FILTER_GET_CLASS(m1)->max_qoutputs,-EINVAL); - g_return_val_if_fail(pin2<MS_FILTER_GET_CLASS(m2)->max_qinputs,-EINVAL); - /* are the requested pins free ?*/ - g_return_val_if_fail(m1->outqueues[pin1]==NULL,-EBUSY); - g_return_val_if_fail(m2->inqueues[pin2]==NULL,-EBUSY); - - q=ms_queue_new(); - m1->outqueues[pin1]=m2->inqueues[pin2]=q; - m1->qoutputs++; - m2->qinputs++; - q->prev_data=(void*)m1; - q->next_data=(void*)m2; - break; - case LINK_FIFO: - /* Are filter m1 and m2 able to accept more fifo connections ?*/ - g_return_val_if_fail(m1->foutputs<MS_FILTER_GET_CLASS(m1)->max_foutputs,-EMLINK); - g_return_val_if_fail(m2->finputs<MS_FILTER_GET_CLASS(m2)->max_finputs,-EMLINK); - /* Are filter m1 and m2 valid with their inputs and outputs ?*/ - g_return_val_if_fail(m1->outfifos!=NULL,-EFAULT); - g_return_val_if_fail(m2->infifos!=NULL,-EFAULT); - /* are the requested pins exists ?*/ - g_return_val_if_fail(pin1<MS_FILTER_GET_CLASS(m1)->max_foutputs,-EINVAL); - g_return_val_if_fail(pin2<MS_FILTER_GET_CLASS(m2)->max_finputs,-EINVAL); - /* are the requested pins free ?*/ - g_return_val_if_fail(m1->outfifos[pin1]==NULL,-EBUSY); - g_return_val_if_fail(m2->infifos[pin2]==NULL,-EBUSY); - - if (MS_FILTER_GET_CLASS(m1)->attributes & FILTER_IS_SOURCE) - { - /* configure min_fifo_size */ - fifo=ms_fifo_new_with_buffer(MS_FILTER_GET_CLASS(m2)->r_maxgran, - MS_FILTER_GET_CLASS(m1)->w_maxgran, - MS_FILTER_GET_CLASS(m2)->r_offset, - MS_FILTER_GET_CLASS(m1)->w_offset, - MS_FILTER_GET_CLASS(m1)->w_maxgran); - m2->min_fifo_size=MS_FILTER_GET_CLASS(m1)->w_maxgran; - } - else - { - gint next_size; - ms_trace("ms_filter_add_link: min_fifo_size=%i",m1->min_fifo_size); - fifo=ms_fifo_new_with_buffer(MS_FILTER_GET_CLASS(m2)->r_maxgran, - MS_FILTER_GET_CLASS(m1)->w_maxgran, - MS_FILTER_GET_CLASS(m2)->r_offset, - MS_FILTER_GET_CLASS(m1)->w_offset, - m1->min_fifo_size); - if (MS_FILTER_GET_CLASS(m2)->r_maxgran>0){ - next_size=(m1->min_fifo_size* - (MS_FILTER_GET_CLASS(m2)->w_maxgran)) / - (MS_FILTER_GET_CLASS(m2)->r_maxgran); - }else next_size=m1->min_fifo_size; - ms_trace("ms_filter_add_link: next_size=%i",next_size); - m2->min_fifo_size=next_size; - } - - - m1->outfifos[pin1]=m2->infifos[pin2]=fifo; - m1->foutputs++; - m2->finputs++; - fifo->prev_data=(void*)m1; - fifo->next_data=(void*)m2; - break; - } - return 0; -} -/** - * ms_filter_unlink: - * @m1: A #MSFilter object. - * @pin1: The pin number on @m1. - * @m2: A #MSFilter object. - * @pin2: The pin number on @m2. - * @linktype: Type of connection, it may be #LINK_QUEUE, #LINK_FIFOS. - * - * Unlink @pin1 of filter @m1 from @pin2 of filter @m2. @linktype specifies what type of connection is removed. - * - * Returns: 0 if successfull, a negative value reprensenting the errno.h error. - */ -int ms_filter_unlink(MSFilter *m1, gint pin1, MSFilter *m2,gint pin2,gint linktype) -{ - switch(linktype) - { - case LINK_QUEUE: - /* Are filter m1 and m2 valid with their inputs and outputs ?*/ - g_return_val_if_fail(m1->outqueues!=NULL,-EFAULT); - g_return_val_if_fail(m2->inqueues!=NULL,-EFAULT); - /* are the requested pins exists ?*/ - g_return_val_if_fail(pin1<MS_FILTER_GET_CLASS(m1)->max_qoutputs,-EINVAL); - g_return_val_if_fail(pin2<MS_FILTER_GET_CLASS(m2)->max_qinputs,-EINVAL); - /* are the requested pins busy ?*/ - g_return_val_if_fail(m1->outqueues[pin1]!=NULL,-ENOENT); - g_return_val_if_fail(m2->inqueues[pin2]!=NULL,-ENOENT); - /* are the two pins connected together ?*/ - g_return_val_if_fail(m1->outqueues[pin1]==m2->inqueues[pin2],-EINVAL); - - ms_queue_destroy(m1->outqueues[pin1]); - m1->outqueues[pin1]=m2->inqueues[pin2]=NULL; - m1->qoutputs--; - m2->qinputs--; - - break; - case LINK_FIFO: - /* Are filter m1 and m2 valid with their inputs and outputs ?*/ - g_return_val_if_fail(m1->outfifos!=NULL,-EFAULT); - g_return_val_if_fail(m2->infifos!=NULL,-EFAULT); - /* are the requested pins exists ?*/ - g_return_val_if_fail(pin1<MS_FILTER_GET_CLASS(m1)->max_foutputs,-EINVAL); - g_return_val_if_fail(pin2<MS_FILTER_GET_CLASS(m2)->max_finputs,-EINVAL); - /* are the requested pins busy ?*/ - g_return_val_if_fail(m1->outfifos[pin1]!=NULL,-ENOENT); - g_return_val_if_fail(m2->infifos[pin2]!=NULL,-ENOENT); - /* are the two pins connected together ?*/ - g_return_val_if_fail(m1->outfifos[pin1]==m2->infifos[pin2],-EINVAL); - ms_fifo_destroy_with_buffer(m1->outfifos[pin1]); - m1->outfifos[pin1]=m2->infifos[pin2]=NULL; - m1->foutputs--; - m2->finputs--; - break; - } - return 0; -} - -/** - *ms_filter_remove_links: - *@m1: a filter - *@m2: another filter. - * - * Removes all links between m1 and m2. - * - *Returns: 0 if one more link have been removed, -1 if not. -**/ -gint ms_filter_remove_links(MSFilter *m1, MSFilter *m2) -{ - int i,j; - int removed=-1; - MSQueue *qo; - MSFifo *fo; - /* takes all outputs of m1, and removes the one that goes to m2 */ - if (m1->outqueues!=NULL){ - for (i=0;i<MS_FILTER_GET_CLASS(m1)->max_qoutputs;i++) - { - qo=m1->outqueues[i]; - if (qo!=NULL){ - MSFilter *rmf; - /* test if the queue connects to m2 */ - rmf=(MSFilter*)qo->next_data; - if (rmf==m2){ - j=find_iq(rmf,qo); - if (j==-1) g_error("Could not find input queue: impossible case."); - ms_filter_unlink(m1,i,m2,j,LINK_QUEUE); - removed=0; - } - } - } - } - if (m1->outfifos!=NULL){ - for (i=0;i<MS_FILTER_GET_CLASS(m1)->max_foutputs;i++) - { - fo=m1->outfifos[i]; - if (fo!=NULL){ - MSFilter *rmf; - /* test if the queue connects to m2 */ - rmf=(MSFilter*)fo->next_data; - if (rmf==m2){ - j=find_if(rmf,fo); - if (j==-1) g_error("Could not find input fifo: impossible case."); - ms_filter_unlink(m1,i,m2,j,LINK_FIFO); - removed=0; - } - } - } - } - return removed; -} - -/** - * ms_filter_fifos_have_data: - * @f: a #MSFilter object. - * - * Tells if the filter has enough data in its input fifos in order to be executed succesfully. - * - * Returns: 1 if it can be executed, 0 else. - */ -gint ms_filter_fifos_have_data(MSFilter *f) -{ - gint i,j; - gint max_inputs=f->klass->max_finputs; - gint con_inputs=f->finputs; - MSFifo *fifo; - /* test fifos */ - for(i=0,j=0; (i<max_inputs) && (j<con_inputs);i++) - { - fifo=f->infifos[i]; - if (fifo!=NULL) - { - j++; - if (fifo->readsize==0) return 0; - if (fifo->readsize>=f->r_mingran) return 1; - } - } - return 0; -} - -/** - * ms_filter_queues_have_data: - * @f: a #MSFilter object. - * - * Tells if the filter has enough data in its input queues in order to be executed succesfully. - * - * Returns: 1 if it can be executed, 0 else. - */ -gint ms_filter_queues_have_data(MSFilter *f) -{ - gint i,j; - gint max_inputs=f->klass->max_qinputs; - gint con_inputs=f->qinputs; - MSQueue *q; - /* test queues */ - for(i=0,j=0; (i<max_inputs) && (j<con_inputs);i++) - { - q=f->inqueues[i]; - if (q!=NULL) - { - j++; - if (ms_queue_can_get(q)) return 1; - } - } - return 0; -} - - - -void ms_filter_destroy(MSFilter *f) -{ - /* first check if the filter is disconnected from any others */ - g_return_if_fail(f->finputs==0); - g_return_if_fail(f->foutputs==0); - g_return_if_fail(f->qinputs==0); - g_return_if_fail(f->qoutputs==0); - f->klass->destroy(f); -} - -GList *filter_list=NULL; - -void ms_filter_register(MSFilterInfo *info) -{ - gpointer tmp; - tmp=g_list_find(filter_list,info); - if (tmp==NULL) filter_list=g_list_append(filter_list,(gpointer)info); -} - -void ms_filter_unregister(MSFilterInfo *info) -{ - filter_list=g_list_remove(filter_list,(gpointer)info); -} - -static gint compare_names(gpointer info, gpointer name) -{ - MSFilterInfo *i=(MSFilterInfo*) info; - return (strcmp(i->name,name)); -} - -MSFilterInfo * ms_filter_get_by_name(const gchar *name) -{ - GList *elem=g_list_find_custom(filter_list, - (gpointer)name,(GCompareFunc)compare_names); - if (elem!=NULL){ - return (MSFilterInfo*)elem->data; - } - return NULL; -} - - - -MSFilter * ms_filter_new_with_name(const gchar *name) -{ - MSFilterInfo *info=ms_filter_get_by_name(name); - if (info!=NULL) return info->constructor(); - g_warning("ms_filter_new_with_name: no filter named %s found.",name); - return NULL; -} - - -/* find the first codec in the left part of the stream */ -MSFilter * ms_filter_search_upstream_by_type(MSFilter *f,MSFilterType type) -{ - MSFilter *tmp=f; - MSFilterInfo *info; - - if ((tmp->infifos!=NULL) && (tmp->infifos[0]!=NULL)){ - tmp=(MSFilter*) tmp->infifos[0]->prev_data; - while(1){ - info=MS_FILTER_GET_CLASS(tmp)->info; - if (info!=NULL){ - if ( (info->type==type) ){ - return tmp; - } - } - if ((tmp->infifos!=NULL) && (tmp->infifos[0]!=NULL)) - tmp=(MSFilter*) tmp->infifos[0]->prev_data; - else break; - } - } - tmp=f; - if ((tmp->inqueues!=NULL) && (tmp->inqueues[0]!=NULL)){ - tmp=(MSFilter*) tmp->inqueues[0]->prev_data; - while(1){ - - info=MS_FILTER_GET_CLASS(tmp)->info; - if (info!=NULL){ - if ( (info->type==type)){ - return tmp; - } - }else g_warning("ms_filter_search_upstream_by_type: filter %s has no info." - ,MS_FILTER_GET_CLASS(tmp)->name); - if ((tmp->inqueues!=NULL) && (tmp->inqueues[0]!=NULL)) - tmp=(MSFilter*) tmp->inqueues[0]->prev_data; - else break; - } - } - return NULL; -} - - -int ms_filter_set_property(MSFilter *f, MSFilterProperty prop,void *value) -{ - if (f->klass->set_property!=NULL){ - return f->klass->set_property(f,prop,value); - } - return 0; -} - -int ms_filter_get_property(MSFilter *f, MSFilterProperty prop,void *value) -{ - if (f->klass->get_property!=NULL){ - return f->klass->get_property(f,prop,value); - } - return -1; -} - -void ms_filter_set_notify_func(MSFilter* filter,MSFilterNotifyFunc func, gpointer userdata) -{ - filter->notify_event=func; - filter->userdata=userdata; -} - -void ms_filter_notify_event(MSFilter *filter,gint event, gpointer arg) -{ - if (filter->notify_event!=NULL){ - filter->notify_event(filter,event,arg,filter->userdata); - } -} - -void swap_buffer(gchar *buffer, gint len) -{ - int i; - gchar tmp; - for (i=0;i<len;i+=2){ - tmp=buffer[i]; - buffer[i]=buffer[i+1]; - buffer[i+1]=tmp; - } -}
--- a/src/mediastreamer/msfilter.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,201 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSFILTER_H -#define MSFILTER_H - -#include <config.h> - -#ifdef HAVE_GLIB -#include <glib.h> -#include <gmodule.h> -#else -#undef VERSION -#undef PACKAGE -#include <uglib.h> -#endif - -#include <string.h> -#include "msutils.h" -#include "msfifo.h" -#include "msqueue.h" - -struct _MSFilter; -/*this is the abstract object and class for all filter types*/ -typedef gint (*MSFilterNotifyFunc)(struct _MSFilter*, gint event, gpointer arg, gpointer userdata); - -struct _MSFilter -{ - struct _MSFilterClass *klass; - GMutex *lock; - guchar finputs; /* number of connected fifo inputs*/ - guchar foutputs; /* number of connected fifo outputs*/ - guchar qinputs; /* number of connected queue inputs*/ - guchar qoutputs; /* number of connected queue outputs*/ - gint min_fifo_size; /* set when linking*/ - gint r_mingran; /* read minimum granularity (for fifos). - It can be zero so that the filter can accept any size of reading data*/ - MSFifo **infifos; /*pointer to a table of pointer to input fifos*/ - MSFifo **outfifos; /*pointer to a table of pointer to output fifos*/ - MSQueue **inqueues; /*pointer to a table of pointer to input queues*/ - MSQueue **outqueues; /*pointer to a table of pointer to output queues*/ - MSFilterNotifyFunc notify_event; - gpointer userdata; -}; - -typedef struct _MSFilter MSFilter; - -typedef enum{ - MS_FILTER_PROPERTY_FREQ, /* value is int */ - MS_FILTER_PROPERTY_BITRATE, /*value is int */ - MS_FILTER_PROPERTY_CHANNELS,/*value is int */ - MS_FILTER_PROPERTY_FMTP /* value is string */ -}MSFilterProperty; - -#define MS_FILTER_PROPERTY_STRING_MAX_SIZE 256 - -typedef MSFilter * (*MSFilterNewFunc)(void); -typedef void (*MSFilterProcessFunc)(MSFilter *); -typedef void (*MSFilterDestroyFunc)(MSFilter *); -typedef int (*MSFilterPropertyFunc)(MSFilter *,int ,void*); -typedef void (*MSFilterSetupFunc)(MSFilter *, void *); /*2nd arg is the sync */ - -typedef struct _MSFilterClass -{ - struct _MSFilterInfo *info; /*pointer to a filter_info */ - gchar *name; - guchar max_finputs; /* maximum number of fifo inputs*/ - guchar max_foutputs; /* maximum number of fifo outputs*/ - guchar max_qinputs; /* maximum number of queue inputs*/ - guchar max_qoutputs; /* maximum number of queue outputs*/ - gint r_maxgran; /* read maximum granularity (for fifos)*/ - gint w_maxgran; /* write maximum granularity (for fifos)*/ - gint r_offset; /* size of kept samples behind read pointer (for fifos)*/ - gint w_offset; /* size of kept samples behind write pointer (for fifos)*/ - MSFilterPropertyFunc set_property; - MSFilterPropertyFunc get_property; - MSFilterSetupFunc setup; /* called when attaching to sync */ - void (*process)(MSFilter *filter); - MSFilterSetupFunc unsetup; /* called when detaching from sync */ - void (*destroy)(MSFilter *filter); - guint attributes; -#define FILTER_HAS_FIFOS (0x0001) -#define FILTER_HAS_QUEUES (0x0001<<1) -#define FILTER_IS_SOURCE (0x0001<<2) -#define FILTER_IS_SINK (0x0001<<3) -#define FILTER_CAN_SYNC (0x0001<<4) - guint ref_count; /*number of object using the class*/ -} MSFilterClass; - - - -#define MS_FILTER(obj) ((MSFilter*)obj) -#define MS_FILTER_CLASS(klass) ((MSFilterClass*)klass) -#define MS_FILTER_GET_CLASS(obj) ((MSFilterClass*)((MS_FILTER(obj)->klass))) - -void ms_filter_class_init(MSFilterClass *filterclass); -void ms_filter_init(MSFilter *filter); - -#define ms_filter_class_set_attr(filter,flag) ((filter)->attributes|=(flag)) -#define ms_filter_class_unset_attr(filter,flag) ((filter)->attributes&=~(flag)) - -#define ms_filter_class_set_name(__klass,__name) (__klass)->name=g_strdup((__name)) -#define ms_filter_class_set_info(_klass,_info) (_klass)->info=(_info) -/* public*/ - -#define ms_filter_process(filter) ((filter)->klass->process((filter))) - -#define ms_filter_lock(filter) g_mutex_lock((filter)->lock) -#define ms_filter_unlock(filter) g_mutex_unlock((filter)->lock) -/* low level connect functions */ -int ms_filter_link(MSFilter *m1, gint pin1, MSFilter *m2,gint pin2, gint linktype); -int ms_filter_unlink(MSFilter *m1, gint pin1, MSFilter *m2,gint pin2,gint linktype); - -/* high level connect functions */ -int ms_filter_add_link(MSFilter *m1, MSFilter *m2); -int ms_filter_remove_links(MSFilter *m1, MSFilter *m2); - -void ms_filter_set_notify_func(MSFilter* filter,MSFilterNotifyFunc func, gpointer userdata); -void ms_filter_notify_event(MSFilter *filter,gint event, gpointer arg); - -int ms_filter_set_property(MSFilter *f,MSFilterProperty property, void *value); -int ms_filter_get_property(MSFilter *f,MSFilterProperty property, void *value); - - -gint ms_filter_fifos_have_data(MSFilter *f); -gint ms_filter_queues_have_data(MSFilter *f); - -void ms_filter_uninit(MSFilter *obj); -void ms_filter_destroy(MSFilter *f); - -#define ms_filter_get_mingran(f) ((f)->r_mingran) -#define ms_filter_set_mingran(f,gran) ((f)->r_mingran=(gran)) - -#define LINK_DEFAULT 0 -#define LINK_FIFO 1 -#define LINK_QUEUE 2 - - -#define MSFILTER_VERSION(a,b,c) (((a)<<2)|((b)<<1)|(c)) - -enum _MSFilterType -{ - MS_FILTER_DISK_IO, - MS_FILTER_AUDIO_CODEC, - MS_FILTER_VIDEO_CODEC, - MS_FILTER_NET_IO, - MS_FILTER_VIDEO_IO, - MS_FILTER_AUDIO_IO, - MS_FILTER_OTHER -}; - -typedef enum _MSFilterType MSFilterType; - - -/* find the first codec in the left part of the stream */ -MSFilter * ms_filter_search_upstream_by_type(MSFilter *f,MSFilterType type); - -struct _MSFilterInfo -{ - gchar *name; - gint version; - MSFilterType type; - MSFilterNewFunc constructor; - char *description; /*some textual information*/ -}; - -typedef struct _MSFilterInfo MSFilterInfo; - -void ms_filter_register(MSFilterInfo *finfo); -void ms_filter_unregister(MSFilterInfo *finfo); -MSFilterInfo * ms_filter_get_by_name(const gchar *name); - -MSFilter * ms_filter_new_with_name(const gchar *name); - - - -extern GList *filter_list; -#define MS_FILTER_INFO(obj) ((MSFilterInfo*)obj) - -void swap_buffer(gchar *buffer, gint len); - - -#endif
--- a/src/mediastreamer/msilbcdec.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include <config.h> - -#ifdef HAVE_ILBC - - -#include "msilbcdec.h" -#include "msilbcenc.h" -#include "mscodec.h" -#include <stdlib.h> -#include <stdio.h> - - - -extern MSFilter * ms_ilbc_encoder_new(void); - -MSCodecInfo ilbc_info={ - { - "iLBC codec", - 0, - MS_FILTER_AUDIO_CODEC, - ms_ilbc_encoder_new, - "A speech codec suitable for robust voice communication over IP" - }, - ms_ilbc_encoder_new, - ms_ilbc_decoder_new, - 0, /* not applicable, 2 modes */ - 0, /* not applicable, 2 modes */ - 15200, - 8000, - 97, - "iLBC", - 1, - 1, -}; - - -void ms_ilbc_codec_init() -{ - ms_filter_register(MS_FILTER_INFO(&ilbc_info)); -} - - - -static MSILBCDecoderClass *ms_ilbc_decoder_class=NULL; - -MSFilter * ms_ilbc_decoder_new(void) -{ - MSILBCDecoder *r; - - r=g_new(MSILBCDecoder,1); - ms_ilbc_decoder_init(r); - if (ms_ilbc_decoder_class==NULL) - { - ms_ilbc_decoder_class=g_new(MSILBCDecoderClass,1); - ms_ilbc_decoder_class_init(ms_ilbc_decoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_ilbc_decoder_class); - return(MS_FILTER(r)); -} - - -int ms_ilbc_decoder_set_property(MSILBCDecoder *obj, MSFilterProperty prop, char *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FMTP: - if (!value) return 0; - if (strstr(value,"ptime=20")!=NULL) obj->ms_per_frame=20; - else if (strstr(value,"ptime=30")!=NULL) obj->ms_per_frame=30; - else g_warning("Unrecognized fmtp parameter for ilbc encoder!"); - break; - case MS_FILTER_PROPERTY_FREQ: - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - default: - break; - } - return 0; -} -int ms_ilbc_decoder_get_property(MSILBCDecoder *obj, MSFilterProperty prop, char *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FMTP: - if (obj->ms_per_frame==20) strncpy(value,"ptime=20",MS_FILTER_PROPERTY_STRING_MAX_SIZE); - if (obj->ms_per_frame==30) strncpy(value,"ptime=30",MS_FILTER_PROPERTY_STRING_MAX_SIZE); - break; - case MS_FILTER_PROPERTY_FREQ: - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - default: - break; - } - return 0; -} - -void ms_ilbc_decoder_setup(MSILBCDecoder *r) -{ - switch (r->ms_per_frame) { - case 20: - r->samples_per_frame = BLOCKL_20MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_20MS; - break; - case 30: - r->samples_per_frame = BLOCKL_30MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_30MS; - break; - default: - g_error("ms_ilbc_decoder_setup: Bad value for ptime (%i)",r->ms_per_frame); - } - g_message("Using ilbc decoder with %i ms frames mode.",r->ms_per_frame); - initDecode(&r->ilbc_dec, r->ms_per_frame /* ms frames */, /* user enhancer */ 0); -} - - -/* FOR INTERNAL USE*/ -void ms_ilbc_decoder_init(MSILBCDecoder *r) -{ - /* default bitrate */ - r->bitrate = 15200; - r->ms_per_frame = 30; - r->samples_per_frame = BLOCKL_20MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_20MS; - - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->inqueues=r->q_inputs; - MS_FILTER(r)->outfifos=r->f_outputs; - memset(r->q_inputs,0,sizeof(MSFifo*)*MSILBCDECODER_MAX_INPUTS); - memset(r->f_outputs,0,sizeof(MSFifo*)*MSILBCDECODER_MAX_INPUTS); -} - -void ms_ilbc_decoder_class_init(MSILBCDecoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"ILBCDec"); - MS_FILTER_CLASS(klass)->max_qinputs=MSILBCDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSILBCDECODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->w_maxgran= ILBC_MAX_SAMPLES_PER_FRAME*2; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_ilbc_decoder_destroy; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_ilbc_decoder_set_property; - MS_FILTER_CLASS(klass)->get_property=(MSFilterPropertyFunc)ms_ilbc_decoder_get_property; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_ilbc_decoder_setup; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_ilbc_decoder_process; - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&ilbc_info; -} - -void ms_ilbc_decoder_process(MSILBCDecoder *r) -{ - MSFifo *fo; - MSQueue *qi; - void *dst=NULL; - float speech[ILBC_MAX_SAMPLES_PER_FRAME]; - MSMessage *m; - - qi=r->q_inputs[0]; - fo=r->f_outputs[0]; - m=ms_queue_get(qi); - - ms_fifo_get_write_ptr(fo, r->samples_per_frame*2, &dst); - if (dst!=NULL){ - if (m->data!=NULL){ - if (m->size<r->bytes_per_compressed_frame) { - g_warning("Invalid ilbc frame ?"); - } - iLBC_decode(speech, m->data, &r->ilbc_dec, /* mode */1); - }else{ - iLBC_decode(speech,NULL, &r->ilbc_dec,0); - } - ilbc_write_16bit_samples((gint16*)dst, speech, r->samples_per_frame); - } - ms_message_destroy(m); -} - -void ms_ilbc_decoder_uninit(MSILBCDecoder *obj) -{ -} - -void ms_ilbc_decoder_destroy( MSILBCDecoder *obj) -{ - ms_ilbc_decoder_uninit(obj); - g_free(obj); -} - -#endif
--- a/src/mediastreamer/msilbcdec.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSILBCDECODER_H -#define MSILBCDECODER_H - -#include <msfilter.h> -#include <mscodec.h> -#include <iLBC_decode.h> - -/*this is the class that implements a ILBCdecoder filter*/ - -#define MSILBCDECODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSILBCDecoder -{ - /* the MSILBCDecoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSILBCDecoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSQueue *q_inputs[MSILBCDECODER_MAX_INPUTS]; - MSFifo *f_outputs[MSILBCDECODER_MAX_INPUTS]; - iLBC_Dec_Inst_t ilbc_dec; - int bitrate; - int ms_per_frame; - int samples_per_frame; - int bytes_per_compressed_frame; -} MSILBCDecoder; - -typedef struct _MSILBCDecoderClass -{ - /* the MSILBCDecoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSILBCDecoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSILBCDecoderClass; - -/* PUBLIC */ - -/* call this before if don't load the plugin dynamically */ -void ms_ilbc_codec_init(void); - -#define MS_ILBCDECODER(filter) ((MSILBCDecoder*)(filter)) -#define MS_ILBCDECODER_CLASS(klass) ((MSILBCDecoderClass*)(klass)) -MSFilter * ms_ilbc_decoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_ilbc_decoder_init(MSILBCDecoder *r); -void ms_ilbc_decoder_class_init(MSILBCDecoderClass *klass); -void ms_ilbc_decoder_destroy( MSILBCDecoder *obj); -void ms_ilbc_decoder_process(MSILBCDecoder *r); - -extern MSCodecInfo ilbc_info; - -#endif
--- a/src/mediastreamer/msilbcenc.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include <config.h> - -#ifdef HAVE_ILBC - -#include <stdlib.h> -#include <stdio.h> -#include "msilbcenc.h" - -extern MSCodecInfo ilbc_info; - -/* The return value of each of these calls is the same as that - returned by fread/fwrite, which should be the number of samples - successfully read/written, not the number of bytes. */ - -int -ilbc_read_16bit_samples(gint16 int16samples[], float speech[], int n) -{ - int i; - - /* Convert 16 bit integer samples to floating point values in the - range [-1,+1]. */ - - for (i = 0; i < n; i++) { - speech[i] = int16samples[i]; - } - - return (n); -} - - - -int -ilbc_write_16bit_samples(gint16 int16samples[], float speech[], int n) -{ - int i; - - /* Convert floating point samples in range [-1,+1] to 16 bit - integers. */ - for (i = 0; i < n; i++) { - float dtmp=speech[i]; - if (dtmp<MIN_SAMPLE) - dtmp=MIN_SAMPLE; - else if (dtmp>MAX_SAMPLE) - dtmp=MAX_SAMPLE; - int16samples[i] = (short) dtmp; - } - return (n); -} - -/* - -Write the bits in bits[0] through bits[len-1] to file f, in "packed" -format. - -bits is expected to be an array of len integer values, where each -integer is 0 to represent a 0 bit, and any other value represents a 1 -bit. This bit string is written to the file f in the form of several -8 bit characters. If len is not a multiple of 8, then the last -character is padded with 0 bits -- the padding is in the least -significant bits of the last byte. The 8 bit characters are "filled" -in order from most significant bit to least significant. - -*/ - -void -ilbc_write_bits(unsigned char *data, unsigned char *bits, int nbytes) -{ - memcpy(data, bits, nbytes); -} - - - -/* - -Read bits from file f into bits[0] through bits[len-1], in "packed" -format. - -*/ - -int -ilbc_read_bits(unsigned char *data, unsigned char *bits, int nbytes) -{ - - memcpy(bits, data, nbytes); - - return (nbytes); -} - - - - -static MSILBCEncoderClass *ms_ilbc_encoder_class=NULL; - -MSFilter * ms_ilbc_encoder_new(void) -{ - MSILBCEncoder *r; - - r=g_new(MSILBCEncoder,1); - ms_ilbc_encoder_init(r); - if (ms_ilbc_encoder_class==NULL) - { - ms_ilbc_encoder_class=g_new(MSILBCEncoderClass,1); - ms_ilbc_encoder_class_init(ms_ilbc_encoder_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_ilbc_encoder_class); - return(MS_FILTER(r)); -} - - -int ms_ilbc_encoder_set_property(MSILBCEncoder *obj, MSFilterProperty prop, char *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FMTP: - obj->ms_per_frame=30; -#if 0 // SME - if (strstr(value,"ptime=20")!=NULL) obj->ms_per_frame=20; - else if (strstr(value,"ptime=30")!=NULL) obj->ms_per_frame=30; - else g_warning("Unrecognized fmtp parameter for ilbc encoder!"); -#endif - break; - case MS_FILTER_PROPERTY_FREQ: - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - default: - break; - } - return 0; -} - - -int ms_ilbc_encoder_get_property(MSILBCEncoder *obj, MSFilterProperty prop, char *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FMTP: - if (obj->ms_per_frame==20) strncpy(value,"ptime=20",MS_FILTER_PROPERTY_STRING_MAX_SIZE); - if (obj->ms_per_frame==30) strncpy(value,"ptime=30",MS_FILTER_PROPERTY_STRING_MAX_SIZE); - break; - case MS_FILTER_PROPERTY_FREQ: - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - default: - break; - } - return 0; -} - -void ms_ilbc_encoder_setup(MSILBCEncoder *r) -{ - switch (r->ms_per_frame) { - case 20: - r->samples_per_frame = BLOCKL_20MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_20MS; - break; - case 30: - r->samples_per_frame = BLOCKL_30MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_30MS; - break; - default: - g_error("Bad bitrate value (%i) for ilbc encoder!", r->ms_per_frame); - break; - } - MS_FILTER(r)->r_mingran= (r->samples_per_frame * 2); - g_message("Using ilbc encoder with %i ms frames mode.",r->ms_per_frame); - initEncode(&r->ilbc_enc, r->ms_per_frame /* ms frames */); -} - -/* FOR INTERNAL USE*/ -void ms_ilbc_encoder_init(MSILBCEncoder *r) -{ - /* default bitrate */ - r->bitrate = 15200; - r->ms_per_frame = 20; - r->samples_per_frame = BLOCKL_20MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_20MS; - - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->outqueues=r->q_outputs; - MS_FILTER(r)->r_mingran= (r->samples_per_frame * 2); - memset(r->f_inputs,0,sizeof(MSFifo*)*MSILBCENCODER_MAX_INPUTS); - memset(r->q_outputs,0,sizeof(MSFifo*)*MSILBCENCODER_MAX_INPUTS); -} - -void ms_ilbc_encoder_class_init(MSILBCEncoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"ILBCEnc"); - MS_FILTER_CLASS(klass)->max_finputs=MSILBCENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_qoutputs=MSILBCENCODER_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=ILBC_MAX_SAMPLES_PER_FRAME*2; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_ilbc_encoder_set_property; - MS_FILTER_CLASS(klass)->get_property=(MSFilterPropertyFunc)ms_ilbc_encoder_get_property; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_ilbc_encoder_setup; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_ilbc_encoder_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_ilbc_encoder_process; - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&ilbc_info; -} - -void ms_ilbc_encoder_process(MSILBCEncoder *r) -{ - MSFifo *fi; - MSQueue *qo; - MSMessage *m; - void *src=NULL; - float speech[ILBC_MAX_SAMPLES_PER_FRAME]; - - /* process output fifos, but there is only one for this class of filter*/ - - qo=r->q_outputs[0]; - fi=r->f_inputs[0]; - ms_fifo_get_read_ptr(fi,r->samples_per_frame*2,&src); - if (src==NULL) { - g_warning( "src=%p\n", src); - return; - } - m=ms_message_new(r->bytes_per_compressed_frame); - - ilbc_read_16bit_samples((gint16*)src, speech, r->samples_per_frame); - iLBC_encode((unsigned char *)m->data, speech, &r->ilbc_enc); - ms_queue_put(qo,m); -} - -void ms_ilbc_encoder_uninit(MSILBCEncoder *obj) -{ -} - -void ms_ilbc_encoder_destroy( MSILBCEncoder *obj) -{ - ms_ilbc_encoder_uninit(obj); - g_free(obj); -} - -#endif
--- a/src/mediastreamer/msilbcenc.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSILBCENCODER_H -#define MSILBCENCODER_H - -#include "mscodec.h" -#include <iLBC_encode.h> - -#define ILBC_BITS_IN_COMPRESSED_FRAME 400 - -int -ilbc_read_16bit_samples(gint16 int16samples[], float speech[], int n); - -int -ilbc_write_16bit_samples(gint16 int16samples[], float speech[], int n); - -void -ilbc_write_bits(unsigned char *data, unsigned char *bits, int nbytes); - -int -ilbc_read_bits(unsigned char *data, unsigned char *bits, int nbytes); - - -/*this is the class that implements a ILBCencoder filter*/ - -#define MSILBCENCODER_MAX_INPUTS 1 /* max output per filter*/ - - -typedef struct _MSILBCEncoder -{ - /* the MSILBCEncoder derivates from MSFilter, so the MSFilter object MUST be the first of the MSILBCEncoder object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSILBCENCODER_MAX_INPUTS]; - MSQueue *q_outputs[MSILBCENCODER_MAX_INPUTS]; - iLBC_Enc_Inst_t ilbc_enc; - int ilbc_encoded_bytes; - int bitrate; - int ms_per_frame; - int samples_per_frame; - int bytes_per_compressed_frame; -} MSILBCEncoder; - -typedef struct _MSILBCEncoderClass -{ - /* the MSILBCEncoder derivates from MSFilter, so the MSFilter class MUST be the first of the MSILBCEncoder class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSILBCEncoderClass; - -/* PUBLIC */ -#define MS_ILBCENCODER(filter) ((MSILBCEncoder*)(filter)) -#define MS_ILBCENCODER_CLASS(klass) ((MSILBCEncoderClass*)(klass)) -MSFilter * ms_ilbc_encoder_new(void); - -/* FOR INTERNAL USE*/ -void ms_ilbc_encoder_init(MSILBCEncoder *r); -void ms_ilbc_encoder_class_init(MSILBCEncoderClass *klass); -void ms_ilbc_encoder_destroy( MSILBCEncoder *obj); -void ms_ilbc_encoder_process(MSILBCEncoder *r); - -#define ILBC_MAX_BYTES_PER_COMPRESSED_FRAME NO_OF_BYTES_30MS -#define ILBC_MAX_SAMPLES_PER_FRAME BLOCKL_30MS - -#endif
--- a/src/mediastreamer/msnosync.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msnosync.h" - -static MSNoSyncClass *ms_nosync_class=NULL; - -void ms_nosync_init(MSNoSync *sync) -{ - ms_sync_init(MS_SYNC(sync)); - MS_SYNC(sync)->attached_filters=sync->filters; - memset(sync->filters,0,MSNOSYNC_MAX_FILTERS*sizeof(MSFilter*)); - MS_SYNC(sync)->samples_per_tick=160; - sync->started=0; -} - -void ms_nosync_class_init(MSNoSyncClass *klass) -{ - ms_sync_class_init(MS_SYNC_CLASS(klass)); - MS_SYNC_CLASS(klass)->max_filters=MSNOSYNC_MAX_FILTERS; - MS_SYNC_CLASS(klass)->synchronize=(MSSyncSyncFunc)ms_nosync_synchronize; - MS_SYNC_CLASS(klass)->destroy=(MSSyncDestroyFunc)ms_nosync_destroy; - /* no need to overload these function*/ - MS_SYNC_CLASS(klass)->attach=ms_sync_attach_generic; - MS_SYNC_CLASS(klass)->detach=ms_sync_detach_generic; -} - -void ms_nosync_destroy(MSNoSync *nosync) -{ - g_free(nosync); -} - -/* the synchronization function that does nothing*/ -void ms_nosync_synchronize(MSNoSync *nosync) -{ - gint32 time; - if (nosync->started==0){ - gettimeofday(&nosync->start,NULL); - nosync->started=1; - } - gettimeofday(&nosync->current,NULL); - MS_SYNC(nosync)->ticks++; - /* update the time, we are supposed to work at 8000 Hz */ - time=((nosync->current.tv_sec-nosync->start.tv_sec)*1000) + - ((nosync->current.tv_usec-nosync->start.tv_usec)/1000); - MS_SYNC(nosync)->time=time; - return; -} - - -MSSync *ms_nosync_new() -{ - MSNoSync *nosync; - - nosync=g_malloc(sizeof(MSNoSync)); - ms_nosync_init(nosync); - if (ms_nosync_class==NULL) - { - ms_nosync_class=g_new(MSNoSyncClass,1); - ms_nosync_class_init(ms_nosync_class); - } - MS_SYNC(nosync)->klass=MS_SYNC_CLASS(ms_nosync_class); - return(MS_SYNC(nosync)); -}
--- a/src/mediastreamer/msnosync.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mssync.h" - -#include <sys/time.h> -#define MSNOSYNC_MAX_FILTERS 10 - -/* MSNoSync derivates from MSSync base class*/ - -typedef struct _MSNoSync -{ - /* the MSSync must be the first field of the object in order to the object mechanism to work*/ - MSSync sync; - MSFilter *filters[MSNOSYNC_MAX_FILTERS]; - int started; - struct timeval start,current; -} MSNoSync; - - -typedef struct _MSNoSyncClass -{ - /* the MSSyncClass must be the first field of the class in order to the class mechanism to work*/ - MSSyncClass parent_class; -} MSNoSyncClass; - - -/*private*/ - -void ms_nosync_init(MSNoSync *sync); -void ms_nosync_class_init(MSNoSyncClass *sync); - -void ms_nosync_destroy(MSNoSync *nosync); -void ms_nosync_synchronize(MSNoSync *nosync); - -/*public*/ - -/* casts a MSSync object into a MSNoSync */ -#define MS_NOSYNC(sync) ((MSNoSync*)(sync)) -/* casts a MSSync class into a MSNoSync class */ -#define MS_NOSYNC_CLASS(klass) ((MSNoSyncClass*)(klass)) - -MSSync *ms_nosync_new(void);
--- a/src/mediastreamer/msossread.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msossread.h" -#include "mssync.h" -#include <unistd.h> -#include <errno.h> -#include <sys/time.h> -#include <sys/types.h> - -MSFilterInfo oss_read_info={ - "OSS read", - 0, - MS_FILTER_AUDIO_IO, - ms_oss_read_new, - NULL -}; - -static MSOssReadClass *msossreadclass=NULL; - -MSFilter * ms_oss_read_new() -{ - MSOssRead *w; - - if (msossreadclass==NULL) - { - msossreadclass=g_new(MSOssReadClass,1); - ms_oss_read_class_init( msossreadclass ); - } - - w=g_new(MSOssRead,1); - MS_FILTER(w)->klass=MS_FILTER_CLASS(msossreadclass); - ms_oss_read_init(w); - - return(MS_FILTER(w)); -} - -/* FOR INTERNAL USE*/ -void ms_oss_read_init(MSOssRead *w) -{ - ms_sound_read_init(MS_SOUND_READ(w)); - MS_FILTER(w)->outfifos=w->f_outputs; - MS_FILTER(w)->outfifos[0]=NULL; - w->devid=0; - w->sndcard=NULL; - w->freq=8000; -} - -gint ms_oss_read_set_property(MSOssRead *f,MSFilterProperty prop, void *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FREQ: - f->freq=((gint*)value)[0]; - break; - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - case MS_FILTER_PROPERTY_FMTP: - default: - break; - } - return 0; -} -void ms_oss_read_class_init(MSOssReadClass *klass) -{ - ms_sound_read_class_init(MS_SOUND_READ_CLASS(klass)); - MS_FILTER_CLASS(klass)->max_foutputs=1; /* one fifo output only */ - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_oss_read_setup; - MS_FILTER_CLASS(klass)->unsetup=(MSFilterSetupFunc)ms_oss_read_stop; - MS_FILTER_CLASS(klass)->process= (MSFilterProcessFunc)ms_oss_read_process; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_oss_read_set_property; - MS_FILTER_CLASS(klass)->destroy= (MSFilterDestroyFunc)ms_oss_read_destroy; - MS_FILTER_CLASS(klass)->w_maxgran=MS_OSS_READ_MAX_GRAN; - MS_FILTER_CLASS(klass)->info=&oss_read_info; - MS_SOUND_READ_CLASS(klass)->set_device=(gint (*)(MSSoundRead*,gint))ms_oss_read_set_device; - MS_SOUND_READ_CLASS(klass)->start=(void (*)(MSSoundRead*))ms_oss_read_start; - MS_SOUND_READ_CLASS(klass)->stop=(void (*)(MSSoundRead*))ms_oss_read_stop; - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"OssRead"); - //ms_filter_class_set_attr( MS_FILTER_CLASS(klass),FILTER_CAN_SYNC|FILTER_IS_SOURCE); -} - -void ms_oss_read_destroy( MSOssRead *obj) -{ - g_free(obj); -} - -void ms_oss_read_process(MSOssRead *f) -{ - MSFifo *fifo; - char *p; - fifo=f->f_outputs[0]; - - g_return_if_fail(f->sndcard!=NULL); - g_return_if_fail(f->gran>0); - - if (snd_card_can_read(f->sndcard)){ - int got; - ms_fifo_get_write_ptr(fifo,f->gran,(void**)&p); - g_return_if_fail(p!=NULL); - got=snd_card_read(f->sndcard,p,f->gran); - if (got>=0 && got!=f->gran) ms_fifo_update_write_ptr(fifo,got); - } -} - - -void ms_oss_read_start(MSOssRead *r) -{ - g_return_if_fail(r->devid!=-1); - r->sndcard=snd_card_manager_get_card(snd_card_manager,r->devid); - g_return_if_fail(r->sndcard!=NULL); - /* open the device for an audio telephony signal with minimum latency */ - snd_card_open_r(r->sndcard,16,0,r->freq); - r->gran=(512*r->freq)/8000; - -} - -void ms_oss_read_stop(MSOssRead *w) -{ - g_return_if_fail(w->devid!=-1); - g_return_if_fail(w->sndcard!=NULL); - snd_card_close_r(w->sndcard); - w->sndcard=NULL; -} - - -void ms_oss_read_setup(MSOssRead *f, MSSync *sync) -{ - f->sync=sync; - ms_oss_read_start(f); -} - - -gint ms_oss_read_set_device(MSOssRead *r,gint devid) -{ - r->devid=devid; - return 0; -}
--- a/src/mediastreamer/msossread.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifndef MSOSSREAD_H -#define MSOSSREAD_H - -#include "mssoundread.h" -#include "sndcard.h" -#include "mssync.h" - - -/*this is the class that implements oss writing sink filter*/ - -#define MS_OSS_READ_MAX_INPUTS 1 /* max output per filter*/ - -#define MS_OSS_READ_MAX_GRAN (512*2) /* the maximum granularity*/ - -struct _MSOssRead -{ - /* the MSOssRead derivates from MSSoundRead so the MSSoundRead object MUST be the first of the MSOssRead object - in order to the object mechanism to work*/ - MSSoundRead filter; - MSFifo *f_outputs[MS_OSS_READ_MAX_INPUTS]; - MSSync *sync; - SndCard *sndcard; - gint freq; - gint devid; /* the sound device id it depends on*/ - gint gran; - gint flags; -#define START_REQUESTED 1 -#define STOP_REQUESTED 2 -}; - -typedef struct _MSOssRead MSOssRead; - -struct _MSOssReadClass -{ - /* the MSOssRead derivates from MSSoundRead, so the MSSoundRead class MUST be the first of the MSOssRead class - in order to the class mechanism to work*/ - MSSoundReadClass parent_class; -}; - -typedef struct _MSOssReadClass MSOssReadClass; - -/* PUBLIC */ -#define MS_OSS_READ(filter) ((MSOssRead*)(filter)) -#define MS_OSS_READ_CLASS(klass) ((MSOssReadClass*)(klass)) -MSFilter * ms_oss_read_new(void); -gint ms_oss_read_set_device(MSOssRead *w,gint devid); -void ms_oss_read_start(MSOssRead *w); -void ms_oss_read_stop(MSOssRead *w); - -/* FOR INTERNAL USE*/ -void ms_oss_read_init(MSOssRead *r); -void ms_oss_read_class_init(MSOssReadClass *klass); -void ms_oss_read_destroy( MSOssRead *obj); -void ms_oss_read_process(MSOssRead *f); -void ms_oss_read_setup(MSOssRead *f, MSSync *sync); - - -#endif
--- a/src/mediastreamer/msosswrite.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msosswrite.h" -#include "mssync.h" -#include <unistd.h> -#include <math.h> - -MSFilterInfo oss_write_info={ - "OSS write", - 0, - MS_FILTER_OTHER, - ms_oss_write_new, - NULL -}; - - -static MSOssWriteClass *msosswriteclass=NULL; - -MSFilter * ms_oss_write_new() -{ - MSOssWrite *w; - - if (msosswriteclass==NULL) - { - msosswriteclass=g_new(MSOssWriteClass,1); - ms_oss_write_class_init( msosswriteclass ); - } - w=g_new(MSOssWrite,1); - MS_FILTER(w)->klass=MS_FILTER_CLASS(msosswriteclass); - ms_oss_write_init(w); - return(MS_FILTER(w)); -} - -/* FOR INTERNAL USE*/ -void ms_oss_write_init(MSOssWrite *w) -{ - ms_sound_write_init(MS_SOUND_WRITE(w)); - MS_FILTER(w)->infifos=w->f_inputs; - MS_FILTER(w)->infifos[0]=NULL; - MS_FILTER(w)->r_mingran=512; /* very few cards can do that...*/ - w->devid=0; - w->sndcard=NULL; - w->freq=8000; - w->channels=1; - w->dtmf_time=-1; -} - -gint ms_oss_write_set_property(MSOssWrite *f,MSFilterProperty prop, void *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FREQ: - f->freq=((gint*)value)[0]; - break; - case MS_FILTER_PROPERTY_CHANNELS: - f->channels=((gint*)value)[0]; - break; - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_FMTP: - default: - break; - } - return 0; -} - -void ms_oss_write_class_init(MSOssWriteClass *klass) -{ - ms_sound_write_class_init(MS_SOUND_WRITE_CLASS(klass)); - MS_FILTER_CLASS(klass)->max_finputs=1; /* one fifo input only */ - MS_FILTER_CLASS(klass)->r_maxgran=MS_OSS_WRITE_DEF_GRAN; - MS_FILTER_CLASS(klass)->process= (MSFilterProcessFunc)ms_oss_write_process; - MS_FILTER_CLASS(klass)->destroy= (MSFilterDestroyFunc)ms_oss_write_destroy; - MS_FILTER_CLASS(klass)->setup= (MSFilterSetupFunc)ms_oss_write_setup; - MS_FILTER_CLASS(klass)->unsetup= (MSFilterSetupFunc)ms_oss_write_stop; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_oss_write_set_property; - MS_FILTER_CLASS(klass)->info=&oss_write_info; - MS_SOUND_WRITE_CLASS(klass)->set_device=(gint (*)(MSSoundWrite*,gint))ms_oss_write_set_device; - MS_SOUND_WRITE_CLASS(klass)->start=(void (*)(MSSoundWrite*))ms_oss_write_start; - MS_SOUND_WRITE_CLASS(klass)->stop=(void (*)(MSSoundWrite*))ms_oss_write_stop; - MS_SOUND_WRITE_CLASS(klass)->set_level=(void (*)(MSSoundWrite*, gint))ms_oss_write_set_level; - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"OssWrite"); -} - -void ms_oss_write_destroy( MSOssWrite *obj) -{ - - g_free(obj); -} - -void ms_oss_write_process(MSOssWrite *f) -{ - MSFifo *fifo; - void *p; - int i; - gint gran=ms_filter_get_mingran(MS_FILTER(f)); - - /* always consume something */ - fifo=f->f_inputs[0]; - ms_fifo_get_read_ptr(fifo,gran,&p); - if (p==NULL) { - g_warning("Not enough data: gran=%i.",gran); - return; - } - g_return_if_fail(f->sndcard!=NULL); - if (f->dtmf_time!=-1){ - gint16 *buf=(gint16*)p; - /* generate a DTMF*/ - for(i=0;i<gran/2;i++){ - buf[i]=(gint16)(10000.0*sin(2*M_PI*(double)f->dtmf_time*f->lowfreq)); - buf[i]+=(gint16)(10000.0*sin(2*M_PI*(double)f->dtmf_time*f->highfreq)); - f->dtmf_time++; - //printf("buf[%i]=%i\n",i,buf[i]); - } - if (f->dtmf_time>f->dtmf_duration) f->dtmf_time=-1; /*finished*/ - } - snd_card_write(f->sndcard,p,gran); -} - -void ms_oss_write_start(MSOssWrite *w) -{ - /* gint bsize; */ - g_return_if_fail(w->devid!=-1); - w->sndcard=snd_card_manager_get_card(snd_card_manager,w->devid); - g_return_if_fail(w->sndcard!=NULL); - /* open the device for an audio telephony signal with minimum latency */ - snd_card_open_w(w->sndcard,16,w->channels==2,w->freq); - w->bsize=snd_card_get_bsize(w->sndcard); - /* - MS_FILTER(w)->r_mingran=w->bsize; - ms_sync_set_samples_per_tick(MS_FILTER(w)->sync,bsize); - */ -} - -void ms_oss_write_stop(MSOssWrite *w) -{ - g_return_if_fail(w->devid!=-1); - g_return_if_fail(w->sndcard!=NULL); - snd_card_close_w(w->sndcard); - w->sndcard=NULL; -} - -void ms_oss_write_set_level(MSOssWrite *w,gint a) -{ - -} - -gint ms_oss_write_set_device(MSOssWrite *w, gint devid) -{ - w->devid=devid; - return 0; -} - -void ms_oss_write_setup(MSOssWrite *r) -{ - //g_message("starting MSOssWrite.."); - ms_oss_write_start(r); -} - - - -void ms_oss_write_play_dtmf(MSOssWrite *w, char dtmf){ - - w->dtmf_duration=0.1*w->freq; - switch(dtmf){ - case '0': - w->lowfreq=941; - w->highfreq=1336; - break; - case '1': - w->lowfreq=697; - w->highfreq=1209; - break; - case '2': - w->lowfreq=697; - w->highfreq=1336; - break; - case '3': - w->lowfreq=697; - w->highfreq=1477; - break; - case '4': - w->lowfreq=770; - w->highfreq=1209; - break; - case '5': - w->lowfreq=770; - w->highfreq=1336; - break; - case '6': - w->lowfreq=770; - w->highfreq=1477; - break; - case '7': - w->lowfreq=852; - w->highfreq=1209; - break; - case '8': - w->lowfreq=852; - w->highfreq=1336; - break; - case '9': - w->lowfreq=852; - w->highfreq=1477; - break; - case '*': - w->lowfreq=941; - w->highfreq=1209; - break; - case '#': - w->lowfreq=941; - w->highfreq=1477; - break; - case 'A': - w->lowfreq=697; - w->highfreq=1633; - break; - case 'B': - w->lowfreq=770; - w->highfreq=1633; - break; - case 'C': - w->lowfreq=852; - w->highfreq=1633; - break; - case 'D': - w->lowfreq=941; - w->highfreq=1633; - break; - default: - g_warning("Not a dtmf key."); - return; - } - w->lowfreq=w->lowfreq/w->freq; - w->highfreq=w->highfreq/w->freq; - w->dtmf_time=0; -}
--- a/src/mediastreamer/msosswrite.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifndef MSOSSWRITE_H -#define MSOSSWRITE_H - -#include "mssoundwrite.h" -#include "sndcard.h" - -/*this is the class that implements oss writing sink filter*/ - -#define MS_OSS_WRITE_MAX_INPUTS 1 /* max output per filter*/ - -#define MS_OSS_WRITE_DEF_GRAN (512*2) /* the default granularity*/ - -struct _MSOssWrite -{ - /* the MSOssWrite derivates from MSSoundWrite, so the MSSoundWrite object MUST be the first of the MSOssWrite object - in order to the object mechanism to work*/ - MSSoundWrite filter; - MSFifo *f_inputs[MS_OSS_WRITE_MAX_INPUTS]; - gint devid; /* the sound device id it depends on*/ - SndCard *sndcard; - gint bsize; - gint freq; - gint channels; - gdouble lowfreq; - gdouble highfreq; - gint dtmf_time; - gint dtmf_duration; -}; - -typedef struct _MSOssWrite MSOssWrite; - -struct _MSOssWriteClass -{ - /* the MSOssWrite derivates from MSSoundWrite, so the MSSoundWrite class MUST be the first of the MSOssWrite class - in order to the class mechanism to work*/ - MSSoundWriteClass parent_class; -}; - -typedef struct _MSOssWriteClass MSOssWriteClass; - -/* PUBLIC */ -#define MS_OSS_WRITE(filter) ((MSOssWrite*)(filter)) -#define MS_OSS_WRITE_CLASS(klass) ((MSOssWriteClass*)(klass)) -MSFilter * ms_oss_write_new(void); -gint ms_oss_write_set_device(MSOssWrite *w,gint devid); -void ms_oss_write_start(MSOssWrite *w); -void ms_oss_write_stop(MSOssWrite *w); -void ms_oss_write_set_level(MSOssWrite *w, gint level); -void ms_oss_write_play_dtmf(MSOssWrite *w, char dtmf); - -/* FOR INTERNAL USE*/ -void ms_oss_write_init(MSOssWrite *r); -void ms_oss_write_setup(MSOssWrite *r); -void ms_oss_write_class_init(MSOssWriteClass *klass); -void ms_oss_write_destroy( MSOssWrite *obj); -void ms_oss_write_process(MSOssWrite *f); - - -#endif
--- a/src/mediastreamer/msqdispatcher.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a dispatcher of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msqdispatcher.h" - -static MSQdispatcherClass *ms_qdispatcher_class=NULL; - -MSFilter * ms_qdispatcher_new(void) -{ - MSQdispatcher *obj; - obj=g_malloc(sizeof(MSQdispatcher)); - if (ms_qdispatcher_class==NULL){ - ms_qdispatcher_class=g_malloc0(sizeof(MSQdispatcherClass)); - ms_qdispatcher_class_init(ms_qdispatcher_class); - } - MS_FILTER(obj)->klass=MS_FILTER_CLASS(ms_qdispatcher_class); - ms_qdispatcher_init(obj); - return MS_FILTER(obj); -} - - -void ms_qdispatcher_init(MSQdispatcher *obj) -{ - ms_filter_init(MS_FILTER(obj)); - - MS_FILTER(obj)->inqueues=obj->q_inputs; - MS_FILTER(obj)->outqueues=obj->q_outputs; - memset(obj->q_inputs,0,sizeof(MSQueue*)*MS_QDISPATCHER_MAX_INPUTS); - memset(obj->q_outputs,0,sizeof(MSQueue*)*MS_QDISPATCHER_MAX_OUTPUTS); -} - - - -void ms_qdispatcher_class_init(MSQdispatcherClass *klass) -{ - MSFilterClass *parent_class=MS_FILTER_CLASS(klass); - ms_filter_class_init(parent_class); - ms_filter_class_set_name(parent_class,"qdispatcher"); - parent_class->max_qinputs=MS_QDISPATCHER_MAX_INPUTS; - parent_class->max_qoutputs=MS_QDISPATCHER_MAX_OUTPUTS; - - parent_class->destroy=(MSFilterDestroyFunc)ms_qdispatcher_destroy; - parent_class->process=(MSFilterProcessFunc)ms_qdispatcher_process; -} - - -void ms_qdispatcher_destroy( MSQdispatcher *obj) -{ - g_free(obj); -} - -void ms_qdispatcher_process(MSQdispatcher *obj) -{ - gint i; - MSQueue *inq=obj->q_inputs[0]; - - if (inq!=NULL){ - MSQueue *outq; - MSMessage *m1,*m2; - while ( (m1=ms_queue_get(inq))!=NULL){ - /* dispatch incoming messages to output queues */ - for (i=0;i<MS_QDISPATCHER_MAX_OUTPUTS;i++){ - outq=obj->q_outputs[i]; - if (outq!=NULL){ - m2=ms_message_dup(m1); - ms_queue_put(outq,m2); - } - } - ms_message_destroy(m1); - } - } - -}
--- a/src/mediastreamer/msqdispatcher.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a dispatcher of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSQDISPATCHER_H -#define MSQDISPATCHER_H - -#include "msfilter.h" - - -/*this is the class that implements a qdispatcher filter*/ - -#define MS_QDISPATCHER_MAX_INPUTS 1 -#define MS_QDISPATCHER_MAX_OUTPUTS 5 - -typedef struct _MSQdispatcher -{ - /* the MSQdispatcher derivates from MSFilter, so the MSFilter object MUST be the first of the MSQdispatcher object - in order to the object mechanism to work*/ - MSFilter filter; - MSQueue *q_inputs[MS_QDISPATCHER_MAX_INPUTS]; - MSQueue *q_outputs[MS_QDISPATCHER_MAX_OUTPUTS]; -} MSQdispatcher; - -typedef struct _MSQdispatcherClass -{ - /* the MSQdispatcher derivates from MSFilter, so the MSFilter class MUST be the first of the MSQdispatcher class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSQdispatcherClass; - -/* PUBLIC */ -#define MS_QDISPATCHER(filter) ((MSQdispatcher*)(filter)) -#define MS_QDISPATCHER_CLASS(klass) ((MSQdispatcherClass*)(klass)) -MSFilter * ms_qdispatcher_new(void); - -/* FOR INTERNAL USE*/ -void ms_qdispatcher_init(MSQdispatcher *r); -void ms_qdispatcher_class_init(MSQdispatcherClass *klass); -void ms_qdispatcher_destroy( MSQdispatcher *obj); -void ms_qdispatcher_process(MSQdispatcher *r); - -#endif
--- a/src/mediastreamer/msqueue.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msqueue.h" -#include <string.h> - -MSQueue * ms_queue_new() -{ - MSQueue *q=g_malloc(sizeof(MSQueue)); - memset(q,0,sizeof(MSQueue)); - return q; -} - -MSMessage *ms_queue_get(MSQueue *q) -{ - MSMessage *b=q->last; - if (b==NULL) return NULL; - q->last=b->prev; - if (b->prev==NULL) q->first=NULL; /* it was the only element of the queue*/ - q->size--; - b->next=b->prev=NULL; - return(b); -} - -void ms_queue_put(MSQueue *q, MSMessage *m) -{ - MSMessage *mtmp=q->first; - g_return_if_fail(m!=NULL); - q->first=m; - m->next=mtmp; - if (mtmp!=NULL) - { - mtmp->prev=m; - } - else q->last=m; /* it was the first element of the q */ - q->size++; -} - -
--- a/src/mediastreamer/msqueue.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSQUEUE_H -#define MSQUEUE_H - -#include "msbuffer.h" - -/* for the moment these are stupid queues limited to one element*/ - -typedef struct _MSQueue -{ - MSMessage *first; - MSMessage *last; - gint size; - void *prev_data; /*user data, usually the writting filter*/ - void *next_data; /* user data, usually the reading filter*/ -}MSQueue; - - -MSQueue * ms_queue_new(void); - -MSMessage *ms_queue_get(MSQueue *q); - -void ms_queue_put(MSQueue *q, MSMessage *m); - -#define ms_queue_can_get(q) ( (q)->size!=0 ) - -#define ms_queue_destroy(q) g_free(q) - - -#endif
--- a/src/mediastreamer/msread.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,191 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msread.h" -#include "mssync.h" -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <string.h> -#include <errno.h> - -static MSReadClass *ms_read_class=NULL; - -MSFilter * ms_read_new(char *name) -{ - MSRead *r; - - r=g_new(MSRead,1); - ms_read_init(r); - if (ms_read_class==NULL) - { - ms_read_class=g_new(MSReadClass,1); - ms_read_class_init(ms_read_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_read_class); - r->fd=-1; - if (name!=NULL) ms_read_open(r,name); - return(MS_FILTER(r)); -} - - - -gint ms_read_open(MSRead *r, gchar *name) -{ - gint fd; - fd=open(name,O_RDONLY); - if (fd<0) { - r->fd=-1; - g_warning("ms_read_new: cannot open %s : %s",name,strerror(errno)); - return -1; - } - r->fd=fd; - if (strstr(name,".wav")!=NULL){ - /* skip the header */ - lseek(fd,20,SEEK_SET); -#ifdef WORDS_BIGENDIAN - r->need_swap=1; -#else - r->need_swap=0; -#endif - } - r->state=MS_READ_STATE_STARTED; - return 0; -} - -/* FOR INTERNAL USE*/ -void ms_read_init(MSRead *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->outfifos=r->foutputs; - MS_FILTER(r)->outqueues=r->qoutputs; - memset(r->foutputs,0,sizeof(MSFifo*)*MSREAD_MAX_OUTPUTS); - memset(r->qoutputs,0,sizeof(MSQueue*)*MSREAD_MAX_OUTPUTS); - r->fd=-1; - r->gran=320; - r->state=MS_READ_STATE_STOPPED; - r->need_swap=0; - r->rate=8000; -} - -gint ms_read_set_property(MSRead *f,MSFilterProperty prop, void *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FREQ: - f->rate=((gint*)value)[0]; - break; - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - case MS_FILTER_PROPERTY_FMTP: - default: - break; - } - return 0; -} - -void ms_read_class_init(MSReadClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"dskreader"); - ms_filter_class_set_attr(MS_FILTER_CLASS(klass),FILTER_IS_SOURCE); - MS_FILTER_CLASS(klass)->max_foutputs=MSREAD_MAX_OUTPUTS; - MS_FILTER_CLASS(klass)->max_qoutputs=MSREAD_MAX_OUTPUTS; - MS_FILTER_CLASS(klass)->w_maxgran=MSREAD_DEF_GRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_read_destroy; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_read_setup; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_read_process; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_read_set_property; -} - -void ms_read_process(MSRead *r) -{ - MSFifo *f; - MSQueue *q; - MSMessage *msg=NULL; - int err; - gint gran=r->gran; - void *p; - - f=r->foutputs[0]; - if ((f!=NULL) && (r->state==MS_READ_STATE_STARTED)) - { - ms_fifo_get_write_ptr(f,gran,&p); - if (p!=NULL) - { - err=read(r->fd,p,gran); - if (err<0) - { - /* temp: */ - g_warning("ms_read_process: failed to read: %s.\n",strerror(errno)); - } - else if (err<gran){ - ms_trace("ms_read_process: end of file."); - ms_filter_notify_event(MS_FILTER(r),MS_READ_EVENT_EOF,NULL); - r->state=MS_READ_STATE_STOPPED; - close(r->fd); - r->fd=-1; - } - if (r->need_swap) swap_buffer(p,gran); - } - } - /* process output queues*/ - q=r->qoutputs[0]; - if ((q!=NULL) && (r->fd>0)) - { - msg=ms_message_new(r->gran); - err=read(r->fd,msg->data,r->gran); - if (err>0){ - msg->size=err; - ms_queue_put(q,msg); - if (r->need_swap) swap_buffer(msg->data,r->gran); - }else{ - ms_filter_notify_event(MS_FILTER(r),MS_READ_EVENT_EOF,NULL); - ms_trace("End of file reached."); - r->state=MS_READ_STATE_STOPPED; - } - } -} - -void ms_read_destroy( MSRead *obj) -{ - if (obj->fd!=0) close(obj->fd); - g_free(obj); -} - -gint ms_read_close(MSRead *obj) -{ - if (obj->fd!=0) { - close(obj->fd); - obj->fd=-1; - obj->state=MS_READ_STATE_STOPPED; - } - - /* No idea if this is correct, but again nothing is calling it and it's not - * even declared in the header file so this should be fine. -- Gary - */ - return 0; -} - - -void ms_read_setup(MSRead *r, MSSync *sync) -{ - r->sync=sync; - r->gran=(r->rate*sync->interval/1000)*2; -}
--- a/src/mediastreamer/msread.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSREAD_H -#define MSREAD_H - -#include "msfilter.h" -#include "mssync.h" - -/*this is the class that implements file reading source filter*/ - -#define MSREAD_MAX_OUTPUTS 1 /* max output per filter*/ - -#define MSREAD_DEF_GRAN 640 /* the default granularity*/ - -typedef enum{ - MS_READ_STATE_STARTED, - MS_READ_STATE_STOPPED, - MS_READ_STATE_EOF -}MSReadState; - -typedef struct _MSRead -{ - /* the MSRead derivates from MSFilter, so the MSFilter object MUST be the first of the MSRead object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *foutputs[MSREAD_MAX_OUTPUTS]; - MSQueue *qoutputs[MSREAD_MAX_OUTPUTS]; - MSSync *sync; - gint rate; - gint fd; /* the file descriptor of the file being read*/ - gint gran; /*granularity*/ /* for use with queues */ - gint need_swap; - gint state; -} MSRead; - -typedef struct _MSReadClass -{ - /* the MSRead derivates from MSFilter, so the MSFilter class MUST be the first of the MSRead class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSReadClass; - -/* PUBLIC */ -#define MS_READ(filter) ((MSRead*)(filter)) -#define MS_READ_CLASS(klass) ((MSReadClass*)(klass)) -MSFilter * ms_read_new(char *name); -/* set the granularity for reading file on disk */ -#define ms_read_set_bufsize(filter,sz) (filter)->gran=(sz) - -/* FOR INTERNAL USE*/ -gint ms_read_open(MSRead *r, gchar *name); -void ms_read_init(MSRead *r); -void ms_read_class_init(MSReadClass *klass); -void ms_read_destroy( MSRead *obj); -void ms_read_process(MSRead *r); -void ms_read_setup(MSRead *r, MSSync *sync); - -typedef enum{ - MS_READ_EVENT_EOF /* end of file */ -} MSReadEvent; - - -#endif
--- a/src/mediastreamer/msringplayer.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,256 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msringplayer.h" -#include "mssync.h" -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <string.h> -#include <errno.h> -#include <stdlib.h> - -#include "waveheader.h" - -#define WAVE_HEADER_OFFSET sizeof(wave_header_t) - -enum { PLAY_RING, PLAY_SILENCE}; - -static int supported_freq[6]={8000,11025,16000,22050,32000,44100}; - -gint freq_is_supported(gint freq){ - int i; - for (i=0;i<6;i++){ - if (abs(supported_freq[i]-freq)<50) return supported_freq[i]; - } - return 0; -} - -static MSRingPlayerClass *ms_ring_player_class=NULL; - -/** - * ms_ring_player_new: - * @name: The path to the 16-bit 8khz raw file to be played as a ring. - * @seconds: The number of seconds that separates two rings. - * - * Allocates a new MSRingPlayer object. - * - * - * Returns: a pointer the the object, NULL if name could not be open. - */ -MSFilter * ms_ring_player_new(char *name, gint seconds) -{ - MSRingPlayer *r; - int fd=-1; - - if ((name!=NULL) && (strlen(name)!=0)) - { - fd=open(name,O_RDONLY); - if (fd<0) - { - g_warning("ms_ring_player_new: failed to open %s.\n",name); - return NULL; - } - - }else { - g_warning("ms_ring_player_new: Bad file name"); - return NULL; - } - - r=g_new(MSRingPlayer,1); - ms_ring_player_init(r); - if (ms_ring_player_class==NULL) - { - ms_ring_player_class=g_new(MSRingPlayerClass,1); - ms_ring_player_class_init(ms_ring_player_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_ring_player_class); - - r->fd=fd; - r->silence=seconds; - r->freq=8000; - if (strstr(name,".wav")!=NULL){ - wave_header_t header; - int freq,freq2; - /* read the header */ - read(fd,&header,sizeof(wave_header_t)); - freq=wave_header_get_rate(&header); - if ((freq2=freq_is_supported(freq))>0){ - r->freq=freq2; - }else { - g_warning("Unsupported sampling rate %i",freq); - r->freq=8000; - } - r->channel=wave_header_get_channel(&header); - lseek(fd,WAVE_HEADER_OFFSET,SEEK_SET); -#ifdef WORDS_BIGENDIAN - r->need_swap=1; -#else - r->need_swap=0; -#endif - } - ms_ring_player_set_property(r, MS_FILTER_PROPERTY_FREQ,&r->freq); - r->state=PLAY_RING; - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_ring_player_init(MSRingPlayer *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->outfifos=r->foutputs; - MS_FILTER(r)->outqueues=r->qoutputs; - memset(r->foutputs,0,sizeof(MSFifo*)*MS_RING_PLAYER_MAX_OUTPUTS); - memset(r->qoutputs,0,sizeof(MSQueue*)*MS_RING_PLAYER_MAX_OUTPUTS); - r->fd=-1; - r->current_pos=0; - r->need_swap=0; - r->sync=NULL; -} - -gint ms_ring_player_set_property(MSRingPlayer *f,MSFilterProperty prop, void *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FREQ: - f->rate=((gint*)value)[0]*2; - f->silence_bytes=f->silence*f->rate; - if (f->sync!=NULL) - f->gran=(f->rate*f->sync->interval/1000)*2; - break; - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - case MS_FILTER_PROPERTY_FMTP: - default: - break; - } - return 0; -} - -gint ms_ring_player_get_property(MSRingPlayer *f,MSFilterProperty prop, void *value) -{ - switch(prop){ - case MS_FILTER_PROPERTY_FREQ: - ((gint*)value)[0]=f->freq; - - break; - case MS_FILTER_PROPERTY_CHANNELS: - ((gint*)value)[0]=f->channel; - break; - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_FMTP: - default: - break; - } - return 0; -} - -gint ms_ring_player_get_sample_freq(MSRingPlayer *obj){ - return obj->freq; -} - - -void ms_ring_player_class_init(MSRingPlayerClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"ringplay"); - ms_filter_class_set_attr(MS_FILTER_CLASS(klass),FILTER_IS_SOURCE); - MS_FILTER_CLASS(klass)->max_foutputs=MS_RING_PLAYER_MAX_OUTPUTS; - MS_FILTER_CLASS(klass)->max_qoutputs=MS_RING_PLAYER_MAX_OUTPUTS; - MS_FILTER_CLASS(klass)->w_maxgran=MS_RING_PLAYER_DEF_GRAN; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_ring_player_setup; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_ring_player_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_ring_player_process; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_ring_player_set_property; - MS_FILTER_CLASS(klass)->get_property=(MSFilterPropertyFunc)ms_ring_player_get_property; -} - -void ms_ring_player_process(MSRingPlayer *r) -{ - MSFifo *f; - gint err; - gint processed=0; - gint gran=r->gran; - char *p; - - g_return_if_fail(gran>0); - /* process output fifos*/ - - f=r->foutputs[0]; - ms_fifo_get_write_ptr(f,gran,(void**)&p); - g_return_if_fail(p!=NULL); - for (processed=0;processed<gran;){ - switch(r->state){ - case PLAY_RING: - err=read(r->fd,&p[processed],gran-processed); - if (err<0) - { - memset(&p[processed],0,gran-processed); - processed=gran; - g_warning("ms_ring_player_process: failed to read: %s.\n",strerror(errno)); - return; - } - else if (err<gran) - {/* end of file */ - - r->current_pos=r->silence_bytes; - lseek(r->fd,WAVE_HEADER_OFFSET,SEEK_SET); - r->state=PLAY_SILENCE; - ms_filter_notify_event(MS_FILTER(r),MS_RING_PLAYER_END_OF_RING_EVENT,NULL); - } - if (r->need_swap) swap_buffer(&p[processed],err); - processed+=err; - break; - case PLAY_SILENCE: - err=gran-processed; - if (r->current_pos>err){ - memset(&p[processed],0,err); - r->current_pos-=gran; - processed=gran; - }else{ - memset(&p[processed],0,r->current_pos); - processed+=r->current_pos; - r->state=PLAY_RING; - } - break; - } - } -} - -/** - * ms_ring_player_destroy: - * @obj: A valid MSRingPlayer object. - * - * Destroy a MSRingPlayer object. - * - * - */ - -void ms_ring_player_destroy( MSRingPlayer *obj) -{ - if (obj->fd!=0) close(obj->fd); - g_free(obj); -} - -void ms_ring_player_setup(MSRingPlayer *r,MSSync *sync) -{ - r->sync=sync; - r->gran=(r->rate*r->sync->interval/1000)*r->channel; -}
--- a/src/mediastreamer/msringplayer.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSRINGPLAYER_H -#define MSRINGPLAYER_H - -#include "msfilter.h" -#include "mssync.h" - - -/*this is the class that implements file reading source filter*/ - -#define MS_RING_PLAYER_MAX_OUTPUTS 1 /* max output per filter*/ - -#define MS_RING_PLAYER_DEF_GRAN 8192 /* the default granularity*/ - -#define MS_RING_PLAYER_END_OF_RING_EVENT 1 - -struct _MSRingPlayer -{ - /* the MSRingPlayer derivates from MSFilter, so the MSFilter object MUST be the first of the MSRingPlayer object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *foutputs[MS_RING_PLAYER_MAX_OUTPUTS]; - MSQueue *qoutputs[MS_RING_PLAYER_MAX_OUTPUTS];\ - MSSync *sync; - gint gran; - gint freq; - gint rate; - gint channel; /* number of interleaved channels */ - gint silence; /* silence time between each ring, in seconds */ - gint state; - gint fd; /* the file descriptor of the file being read*/ - gint silence_bytes; /*silence in number of bytes between each ring */ - gint current_pos; - gint need_swap; -}; - -typedef struct _MSRingPlayer MSRingPlayer; - -struct _MSRingPlayerClass -{ - /* the MSRingPlayer derivates from MSFilter, so the MSFilter class MUST be the first of the MSRingPlayer class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -}; - -typedef struct _MSRingPlayerClass MSRingPlayerClass; - -/* PUBLIC */ -#define MS_RING_PLAYER(filter) ((MSRingPlayer*)(filter)) -#define MS_RING_PLAYER_CLASS(klass) ((MSRingPlayerClass*)(klass)) -MSFilter * ms_ring_player_new(char *name, gint seconds); -gint ms_ring_player_get_sample_freq(MSRingPlayer *obj); - - -/* FOR INTERNAL USE*/ -void ms_ring_player_init(MSRingPlayer *r); -gint ms_ring_player_set_property(MSRingPlayer *f, MSFilterProperty prop, void *value); -void ms_ring_player_class_init(MSRingPlayerClass *klass); -void ms_ring_player_destroy( MSRingPlayer *obj); -void ms_ring_player_process(MSRingPlayer *r); -#define ms_ring_player_set_bufsize(filter,sz) (filter)->gran=(sz) -void ms_ring_player_setup(MSRingPlayer *r,MSSync *sync); -#endif
--- a/src/mediastreamer/msrtprecv.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,163 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msrtprecv.h" - - -/* some utilities to convert mblk_t to MSMessage and vice-versa */ -MSMessage *msgb_2_ms_message(mblk_t* mp){ - MSMessage *msg; - MSBuffer *msbuf; - if (mp->b_datap->ref_count!=1) return NULL; /* cannot handle properly non-unique buffers*/ - /* create a MSBuffer using the mblk_t buffer */ - msg=ms_message_alloc(); - msbuf=ms_buffer_alloc(0); - msbuf->buffer=mp->b_datap->db_base; - msbuf->size=(char*)mp->b_datap->db_lim-(char*)mp->b_datap->db_base; - ms_message_set_buf(msg,msbuf); - msg->size=mp->b_wptr-mp->b_rptr; - msg->data=mp->b_rptr; - /* free the mblk_t */ - g_free(mp->b_datap); - g_free(mp); - return msg; -} - - -static MSRtpRecvClass *ms_rtp_recv_class=NULL; - -MSFilter * ms_rtp_recv_new(void) -{ - MSRtpRecv *r; - - r=g_new(MSRtpRecv,1); - ms_rtp_recv_init(r); - if (ms_rtp_recv_class==NULL) - { - ms_rtp_recv_class=g_new0(MSRtpRecvClass,1); - ms_rtp_recv_class_init(ms_rtp_recv_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_rtp_recv_class); - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_rtp_recv_init(MSRtpRecv *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->outfifos=r->f_outputs; - MS_FILTER(r)->outqueues=r->q_outputs; - memset(r->f_outputs,0,sizeof(MSFifo*)*MSRTPRECV_MAX_OUTPUTS); - memset(r->q_outputs,0,sizeof(MSFifo*)*MSRTPRECV_MAX_OUTPUTS); - r->rtpsession=NULL; - r->stream_started=0; -} - -void ms_rtp_recv_class_init(MSRtpRecvClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"RTPRecv"); - MS_FILTER_CLASS(klass)->max_qoutputs=MSRTPRECV_MAX_OUTPUTS; - MS_FILTER_CLASS(klass)->max_foutputs=MSRTPRECV_MAX_OUTPUTS; - MS_FILTER_CLASS(klass)->w_maxgran=MSRTPRECV_DEF_GRAN; - ms_filter_class_set_attr(MS_FILTER_CLASS(klass),FILTER_IS_SOURCE); - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_rtp_recv_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_rtp_recv_process; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_rtp_recv_setup; -} - -void ms_rtp_recv_process(MSRtpRecv *r) -{ - MSFifo *fo; - MSQueue *qo; - MSSync *sync= r->sync; - void *d; - mblk_t *mp; - gint len; - gint gran=ms_sync_get_samples_per_tick(MS_SYNC(sync)); - - if (r->rtpsession==NULL) return; - /* process output fifo and output queue*/ - fo=r->f_outputs[0]; - if (fo!=NULL) - { - while( (mp=rtp_session_recvm_with_ts(r->rtpsession,r->prev_ts))!=NULL) { - /* try to get rtp packets and paste them to the output fifo */ - r->stream_started=1; - len=mp->b_cont->b_wptr-mp->b_cont->b_rptr; - ms_fifo_get_write_ptr(fo,len,&d); - if (d!=NULL){ - memcpy(d,mp->b_cont->b_rptr,len); - }else ms_warning("ms_rtp_recv_process: no space on output fifo !"); - freemsg(mp); - } - r->prev_ts+=gran; - - } - qo=r->q_outputs[0]; - if (qo!=NULL) - { - guint32 clock; - gint got=0; - /* we are connected with queues (surely for video)*/ - /* use the sync system time to compute a timestamp */ - PayloadType *pt=rtp_profile_get_payload(r->rtpsession->profile,r->rtpsession->payload_type); - if (pt==NULL) { - ms_warning("ms_rtp_recv_process(): NULL RtpPayload- skipping."); - return; - } - clock=(guint32)(((double)sync->time*(double)pt->clock_rate)/1000.0); - /*g_message("Querying packet with timestamp %u",clock);*/ - /* get rtp packet, and send them through the output queue */ - while ( (mp=rtp_session_recvm_with_ts(r->rtpsession,clock))!=NULL ){ - MSMessage *msg; - mblk_t *mdata; - /*g_message("Got packet with timestamp %u",clock);*/ - got++; - r->stream_started=1; - mdata=mp->b_cont; - freeb(mp); - msg=msgb_2_ms_message(mdata); - ms_queue_put(qo,msg); - } - } -} - -void ms_rtp_recv_destroy( MSRtpRecv *obj) -{ - g_free(obj); -} - -RtpSession * ms_rtp_recv_set_session(MSRtpRecv *obj,RtpSession *session) -{ - RtpSession *old=obj->rtpsession; - obj->rtpsession=session; - obj->prev_ts=0; - return old; -} - - -void ms_rtp_recv_setup(MSRtpRecv *r,MSSync *sync) -{ - r->sync=sync; - r->stream_started=0; -}
--- a/src/mediastreamer/msrtprecv.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSRTPRECV_H -#define MSRTPRECV_H - -#include "msfilter.h" -#include "mssync.h" - -/* because of a conflict between config.h from oRTP and config.h from linphone:*/ -#undef PACKAGE -#undef VERSION -#include <ortp/ortp.h> - -/*this is the class that implements a copy filter*/ - -#define MSRTPRECV_MAX_OUTPUTS 1 /* max output per filter*/ - -#define MSRTPRECV_DEF_GRAN 4096 /* the default granularity*/ - -struct _MSRtpRecv -{ - /* the MSCopy derivates from MSFilter, so the MSFilter object MUST be the first of the MSCopy object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_outputs[MSRTPRECV_MAX_OUTPUTS]; - MSQueue *q_outputs[MSRTPRECV_MAX_OUTPUTS]; - MSSync *sync; - RtpSession *rtpsession; - guint32 prev_ts; - gint stream_started; -}; - -typedef struct _MSRtpRecv MSRtpRecv; - -struct _MSRtpRecvClass -{ - /* the MSCopy derivates from MSFilter, so the MSFilter class MUST be the first of the MSCopy class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -}; - -typedef struct _MSRtpRecvClass MSRtpRecvClass; - -/* PUBLIC */ -#define MS_RTP_RECV(filter) ((MSRtpRecv*)(filter)) -#define MS_RTP_RECV_CLASS(klass) ((MSRtpRecvClass*)(klass)) -MSFilter * ms_rtp_recv_new(void); -RtpSession * ms_rtp_recv_set_session(MSRtpRecv *obj,RtpSession *session); -#define ms_rtp_recv_unset_session(obj) (ms_rtp_recv_set_session((obj),NULL)) -#define ms_rtp_recv_get_session(obj) ((obj)->rtpsession) - - - -/* FOR INTERNAL USE*/ -void ms_rtp_recv_init(MSRtpRecv *r); -void ms_rtp_recv_class_init(MSRtpRecvClass *klass); -void ms_rtp_recv_destroy( MSRtpRecv *obj); -void ms_rtp_recv_process(MSRtpRecv *r); -void ms_rtp_recv_setup(MSRtpRecv *r,MSSync *sync); - -#endif
--- a/src/mediastreamer/msrtpsend.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,211 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msrtpsend.h" -#include <ortp/telephonyevents.h> -#include "mssync.h" -#include "mscodec.h" - - - -static MSRtpSendClass *ms_rtp_send_class=NULL; - -MSFilter * ms_rtp_send_new(void) -{ - MSRtpSend *r; - - r=g_new(MSRtpSend,1); - - if (ms_rtp_send_class==NULL) - { - ms_rtp_send_class=g_new(MSRtpSendClass,1); - ms_rtp_send_class_init(ms_rtp_send_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_rtp_send_class); - ms_rtp_send_init(r); - return(MS_FILTER(r)); -} - - -void ms_rtp_send_init(MSRtpSend *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->inqueues=r->q_inputs; - MS_FILTER(r)->r_mingran=MSRTPSEND_DEF_GRAN; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSRTPSEND_MAX_INPUTS); - memset(r->q_inputs,0,sizeof(MSFifo*)*MSRTPSEND_MAX_INPUTS); - r->rtpsession=NULL; - r->ts=0; - r->ts_inc=0; - r->flags=0; - r->delay=0; -} - -void ms_rtp_send_class_init(MSRtpSendClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"RTPSend"); - MS_FILTER_CLASS(klass)->max_qinputs=MSRTPSEND_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_finputs=MSRTPSEND_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=MSRTPSEND_DEF_GRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_rtp_send_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_rtp_send_process; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_rtp_send_setup; -} - -void ms_rtp_send_set_timing(MSRtpSend *r, guint32 ts_inc, gint payload_size) -{ - r->ts_inc=ts_inc; - r->packet_size=payload_size; - if (r->ts_inc!=0) r->flags|=RTPSEND_CONFIGURED; - else r->flags&=~RTPSEND_CONFIGURED; - MS_FILTER(r)->r_mingran=payload_size; - /*g_message("ms_rtp_send_set_timing: ts_inc=%i",ts_inc);*/ -} - -guint32 get_new_timestamp(MSRtpSend *r,guint32 synctime) -{ - guint32 clockts; - /* use the sync system time to compute a timestamp */ - PayloadType *pt=rtp_profile_get_payload(r->rtpsession->profile,r->rtpsession->payload_type); - g_return_val_if_fail(pt!=NULL,0); - clockts=(guint32)(((double)synctime * (double)pt->clock_rate)/1000.0); - ms_trace("ms_rtp_send_process: sync->time=%i clock=%i",synctime,clockts); - if (r->flags & RTPSEND_CONFIGURED){ - if (RTP_TIMESTAMP_IS_STRICTLY_NEWER_THAN(clockts,r->ts+(2*r->ts_inc) )){ - r->ts=clockts; - } - else r->ts+=r->ts_inc; - }else{ - r->ts=clockts; - } - return r->ts; -} - - -void ms_rtp_send_process(MSRtpSend *r) -{ - MSFifo *fi; - MSQueue *qi; - MSSync *sync= r->sync; - int gran=ms_sync_get_samples_per_tick(sync); - guint32 ts; - void *s; - guint skip; - guint32 synctime=sync->time; - - g_return_if_fail(gran>0); - if (r->rtpsession==NULL) return; - - ms_filter_lock(MS_FILTER(r)); - skip=r->delay!=0; - if (skip) r->delay--; - /* process output fifo and output queue*/ - fi=r->f_inputs[0]; - if (fi!=NULL) - { - ts=get_new_timestamp(r,synctime); - /* try to read r->packet_size bytes and send them in a rtp packet*/ - ms_fifo_get_read_ptr(fi,r->packet_size,&s); - if (!skip){ - rtp_session_send_with_ts(r->rtpsession,s,r->packet_size,ts); - ms_trace("len=%i, ts=%i ",r->packet_size,ts); - } - } - qi=r->q_inputs[0]; - if (qi!=NULL) - { - MSMessage *msg; - /* read a MSMessage and send it through the network*/ - while ( (msg=ms_queue_get(qi))!=NULL){ - ts=get_new_timestamp(r,synctime); - if (!skip) { - /*g_message("Sending packet with ts=%u",ts);*/ - rtp_session_send_with_ts(r->rtpsession,msg->data,msg->size,ts); - - } - ms_message_destroy(msg); - } - } - ms_filter_unlock(MS_FILTER(r)); -} - -void ms_rtp_send_destroy( MSRtpSend *obj) -{ - g_free(obj); -} - -RtpSession * ms_rtp_send_set_session(MSRtpSend *obj,RtpSession *session) -{ - RtpSession *old=obj->rtpsession; - obj->rtpsession=session; - obj->ts=0; - obj->ts_inc=0; - return old; -} - -void ms_rtp_send_setup(MSRtpSend *r, MSSync *sync) -{ - MSFilter *codec; - MSCodecInfo *info; - r->sync=sync; - codec=ms_filter_search_upstream_by_type(MS_FILTER(r),MS_FILTER_AUDIO_CODEC); - if (codec==NULL) codec=ms_filter_search_upstream_by_type(MS_FILTER(r),MS_FILTER_VIDEO_CODEC); - if (codec==NULL){ - g_warning("ms_rtp_send_setup: could not find upstream codec."); - return; - } - info=MS_CODEC_INFO(codec->klass->info); - if (info->info.type==MS_FILTER_AUDIO_CODEC){ - int ts_inc=info->fr_size/2; - int psize=info->dt_size; - if (ts_inc==0){ - /* dont'use the normal frame size: this is a variable frame size codec */ - /* use the MS_FILTER(codec)->r_mingran */ - ts_inc=MS_FILTER(codec)->r_mingran/2; - psize=0; - } - ms_rtp_send_set_timing(r,ts_inc,psize); - } -} - -gint ms_rtp_send_dtmf(MSRtpSend *r, gchar dtmf) -{ - gint res; - - if (r->rtpsession==NULL) return -1; - if (rtp_session_telephone_events_supported(r->rtpsession)==-1){ - g_warning("ERROR : telephone events not supported.\n"); - return -1; - } - - ms_filter_lock(MS_FILTER(r)); - g_message("Sending DTMF."); - res=rtp_session_send_dtmf(r->rtpsession, dtmf, r->ts); - if (res==0){ - //r->ts+=r->ts_inc; - r->delay+=2; - }else g_warning("Could not send dtmf."); - - ms_filter_unlock(MS_FILTER(r)); - - return res; -}
--- a/src/mediastreamer/msrtpsend.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSRTPSEND_H -#define MSRTPSEND_H - -#include "msfilter.h" -#include "mssync.h" - -#undef PACKAGE -#undef VERSION -#include <ortp/ortp.h> - - -/*this is the class that implements a sending through rtp filter*/ - -#define MSRTPSEND_MAX_INPUTS 1 /* max input per filter*/ - -#define MSRTPSEND_DEF_GRAN 4096/* the default granularity*/ - -struct _MSRtpSend -{ - /* the MSCopy derivates from MSFilter, so the MSFilter object MUST be the first of the MSCopy object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSRTPSEND_MAX_INPUTS]; - MSQueue *q_inputs[MSRTPSEND_MAX_INPUTS]; - MSSync *sync; - RtpSession *rtpsession; - guint32 ts; - guint32 ts_inc; /* the timestamp increment */ - gint packet_size; - guint flags; - guint delay; /* number of _proccess call which must be skipped */ -#define RTPSEND_CONFIGURED (1) -}; - -typedef struct _MSRtpSend MSRtpSend; - -struct _MSRtpSendClass -{ - /* the MSRtpSend derivates from MSFilter, so the MSFilter class MUST be the first of the MSCopy class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -}; - -typedef struct _MSRtpSendClass MSRtpSendClass; - -/* PUBLIC */ -#define MS_RTP_SEND(filter) ((MSRtpSend*)(filter)) -#define MS_RTP_SEND_CLASS(klass) ((MSRtpSendClass*)(klass)) -MSFilter * ms_rtp_send_new(void); -RtpSession * ms_rtp_send_set_session(MSRtpSend *obj,RtpSession *session); -#define ms_rtp_send_unset_session(obj) (ms_rtp_send_set_session((obj),NULL)) -#define ms_rtp_send_get_session(obj) ((obj)->rtpsession) -void ms_rtp_send_set_timing(MSRtpSend *r, guint32 ts_inc, gint payload_size); -gint ms_rtp_send_dtmf(MSRtpSend *r, gchar dtmf); - - -/* FOR INTERNAL USE*/ -void ms_rtp_send_init(MSRtpSend *r); -void ms_rtp_send_class_init(MSRtpSendClass *klass); -void ms_rtp_send_destroy( MSRtpSend *obj); -void ms_rtp_send_process(MSRtpSend *r); -void ms_rtp_send_setup(MSRtpSend *r, MSSync *sync); - -#endif
--- a/src/mediastreamer/mssdlout.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,303 +0,0 @@ -/*************************************************************************** - * mssdlout.c - * - * Mon Jul 11 16:17:59 2005 - * Copyright 2005 Simon Morlat - * Email simon dot morlat at linphone dot org - ****************************************************************************/ - -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mssdlout.h" - -MSSdlOutClass *ms_sdl_out_class=NULL; - -void ms_sdl_out_init(MSSdlOut *obj){ - ms_filter_init(MS_FILTER(obj)); - obj->width=VIDEO_SIZE_CIF_W; - obj->height=VIDEO_SIZE_CIF_H; - obj->format="RGB24"; - obj->use_yuv=FALSE; - obj->oldinm1=NULL; - MS_FILTER(obj)->inqueues=obj->input; -} - -void ms_sdl_out_set_format(MSSdlOut *obj, const char *fmt){ - obj->format=fmt; - if (strcmp(fmt,"YUV420P")==0) obj->use_yuv=TRUE; - else obj->use_yuv=FALSE; -} - -void ms_sdl_uninit_sdl(MSSdlOut *obj){ - if (obj->overlay!=NULL){ - SDL_FreeYUVOverlay(obj->overlay); - obj->overlay=NULL; - } - if (obj->screen!=NULL){ - SDL_FreeSurface(obj->screen); - obj->screen=NULL; - } - -} - -void ms_sdl_out_uninit(MSSdlOut *obj){ - ms_sdl_uninit_sdl(obj); -} - -void ms_sdl_out_destroy(MSSdlOut *obj){ - ms_sdl_out_uninit(obj); - if (obj->oldinm1!=NULL) ms_message_destroy(obj->oldinm1); - g_free(obj); -} - -void ms_sdl_init_sdl(MSSdlOut *obj){ - if (strcmp(obj->format,"RGB24")==0){ - }else{ - obj->use_yuv=TRUE; - } - obj->screen = SDL_SetVideoMode(obj->width, obj->height, 0,SDL_HWSURFACE|SDL_ANYFORMAT); - if ( obj->screen == NULL ) { - g_warning("Couldn't set video mode: %s\n", - SDL_GetError()); - return ; - } - if (obj->screen->flags & SDL_HWSURFACE) g_message("SDL surface created in hardware"); - SDL_WM_SetCaption("Linphone Video", NULL); - - if (obj->use_yuv){ - g_message("Using yuv overlay."); - obj->overlay=SDL_CreateYUVOverlay(obj->width,obj->height,SDL_IYUV_OVERLAY,obj->screen); - if (obj->overlay==NULL){ - g_warning("Couldn't create yuv overlay: %s\n", - SDL_GetError()); - }else{ - if (obj->overlay->hw_overlay) g_message("YUV overlay using hardware acceleration."); - } - } - -} - -static void resize_yuv_small(char *pict, int w, int h, int scale){ - int i,j,id,jd; - int nh,nw; - char *smallpict; - int ysize,usize,ydsize,udsize; - int smallpict_sz; - char *dptr,*sptr; - nw=w/scale; - nh=h/scale; - ysize=w*h; - usize=ysize/4; - ydsize=nw*nh; - udsize=ydsize/4; - smallpict_sz=(ydsize*3)/2; - smallpict=(char*)alloca(smallpict_sz); - memset(smallpict,0,smallpict_sz); - - - dptr=smallpict; - sptr=pict; - for (j=0,jd=0;j<nh;j++,jd+=scale){ - for (i=0,id=0;i<nw;i++,id+=scale){ - dptr[(j*nw) + i]=sptr[(jd*w)+id]; - } - } - - nh=nh/2; - nw=nw/2; - w=w/2; - h=h/2; - dptr+=ydsize; - sptr+=ysize; - for (j=0,jd=0;j<nh;j++,jd+=scale){ - for (i=0,id=0;i<nw;i++,id+=scale){ - dptr[(j*nw) + i]=sptr[(jd*w)+id]; - } - } - dptr+=udsize; - sptr+=usize; - for (j=0,jd=0;j<nh;j++,jd+=scale){ - for (i=0,id=0;i<nw;i++,id+=scale){ - dptr[(j*nw) + i]=sptr[(jd*w)+id]; - } - } - - memcpy(pict,smallpict,smallpict_sz); -} - -static void fill_overlay_at_pos(SDL_Overlay *lay, MSMessage *m, int x, int y, int w, int h){ - char *data=(char*)m->data; - int i,j; - int jlim,ilim; - int off; - char *dptr; - - ilim=MIN(x+w,lay->w); - jlim=MIN(y+h,lay->h); - SDL_LockYUVOverlay(lay); - /* set Y */ - dptr=lay->pixels[0]; - for (j=y;j<jlim;j++){ - off=j*lay->w; - for (i=x;i<ilim;i++){ - dptr[off + i]=*data; - data++; - } - } - /*set U and V*/ - ilim=ilim/2; - jlim=jlim/2; - dptr=lay->pixels[1]; - for (j=y/2;j<jlim;j++){ - off=j*(lay->w/2); - for (i=x/2;i<ilim;i++){ - dptr[off + i]=*data; - data++; - } - } - dptr=lay->pixels[2]; - for (j=y/2;j<jlim;j++){ - off=j*(lay->w/2); - for (i=x/2;i<ilim;i++){ - dptr[off + i]=*data; - data++; - } - } - SDL_UnlockYUVOverlay(lay); -} - -static void fill_overlay(SDL_Overlay *lay, MSMessage *m){ - - int w2,h2; - char *data=(char*)m->data; - int ysize=lay->w*lay->h; - int usize; - w2=lay->w/2; - h2=lay->h/2; - usize=w2*h2; - SDL_LockYUVOverlay(lay); - memcpy(lay->pixels[0],data,ysize); - memcpy(lay->pixels[1],data+ysize,usize); - memcpy(lay->pixels[2],data+ysize+usize,usize); - SDL_UnlockYUVOverlay(lay); -} - -#define SCALE_FACTOR 6 - -void ms_sdl_out_process(MSSdlOut *obj){ - MSQueue *q0=obj->input[0]; - MSQueue *q1=obj->input[1]; - MSMessage *inm0=NULL; - MSMessage *inm1=NULL; - int err; - SDL_Rect smallrect; - SDL_Rect rect; - rect.w=obj->width; - rect.h=obj->height; - rect.x=0; - rect.y=0; - smallrect.w=obj->width/SCALE_FACTOR; - smallrect.h=obj->height/SCALE_FACTOR; - smallrect.x=obj->width - smallrect.w ; - smallrect.y=obj->height -smallrect.h; - - if (obj->screen==NULL){ - ms_sdl_init_sdl(obj); - } - - if (q0!=NULL) - inm0=ms_queue_get(q0); - if (q1!=NULL) - inm1=ms_queue_get(q1); - - if (inm0!=NULL){ - SDL_Surface *surf; - if (obj->use_yuv){ - - fill_overlay(obj->overlay,inm0); - - }else { - surf=SDL_CreateRGBSurfaceFrom(inm0->data,obj->width,obj->height,24,obj->width*3,0,0,0,0); - - err=SDL_BlitSurface(surf,NULL,obj->screen,NULL); - if (err<0) g_warning("Fail to blit surface: %s",SDL_GetError()); - SDL_FreeSurface(surf); - } - ms_message_destroy(inm0); - } - if (inm1!=NULL){ - /* this message is blitted on the right,bottom corner of the screen */ - SDL_Surface *surf; - - if (obj->use_yuv){ - resize_yuv_small(inm1->data,rect.w,rect.h,SCALE_FACTOR); - fill_overlay_at_pos(obj->overlay,inm1,smallrect.x, smallrect.y, smallrect.w, smallrect.h); - }else { - surf=SDL_CreateRGBSurfaceFrom(inm1->data,obj->width,obj->height,24,obj->width*3,0,0,0,0); - - err=SDL_BlitSurface(surf,NULL,obj->screen,&smallrect); - if (err<0) g_warning("Fail to blit surface: %s",SDL_GetError()); - SDL_FreeSurface(surf); - } - if (obj->oldinm1!=NULL) { - ms_message_destroy(obj->oldinm1); - } - obj->oldinm1=inm1; - - }else{ - /* this is the case were we have only inm0, we have to redisplay inm1 */ - if (obj->use_yuv){ - if (obj->oldinm1!=NULL){ - fill_overlay_at_pos(obj->overlay,obj->oldinm1,smallrect.x, smallrect.y, smallrect.w, smallrect.h); - } - } - } - - if (obj->use_yuv) SDL_DisplayYUVOverlay(obj->overlay,&rect); - SDL_UpdateRect(obj->screen,0,0,obj->width,obj->height); - -} - -void ms_sdl_out_class_init(MSSdlOutClass *klass){ - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_sdl_out_process; - MS_FILTER_CLASS(klass)->max_qinputs=2; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_sdl_out_destroy; - MS_FILTER_CLASS(klass)->name="MSSdlOut"; - /* Initialize the SDL library */ - if( SDL_Init(SDL_INIT_VIDEO) < 0 ) { - fprintf(stderr, - "Couldn't initialize SDL: %s\n", SDL_GetError()); - return; - } - /* Clean up on exit */ - atexit(SDL_Quit); -} - -MSFilter * ms_sdl_out_new(void){ - MSSdlOut *obj=g_new0(MSSdlOut,1); - if (ms_sdl_out_class==NULL){ - ms_sdl_out_class=g_new0(MSSdlOutClass,1); - ms_sdl_out_class_init(ms_sdl_out_class); - } - MS_FILTER(obj)->klass=MS_FILTER_CLASS(ms_sdl_out_class); - ms_sdl_out_init(obj); - return MS_FILTER(obj); -}
--- a/src/mediastreamer/mssdlout.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/*************************************************************************** - * mssdlout.h - * - * Mon Jul 11 16:18:55 2005 - * Copyright 2005 Simon Morlat - * Email simon dot morlat at linphone dot org - ****************************************************************************/ - -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef mssdlout_h -#define mssdlout_h - -#include "msfilter.h" - -#include <SDL/SDL.h> -#include <SDL/SDL_video.h> - -struct _MSSdlOut -{ - MSFilter parent; - MSQueue *input[2]; - gint width,height; - const gchar *format; - SDL_Surface *screen; - SDL_Overlay *overlay; - MSMessage *oldinm1; - gboolean use_yuv; -}; - - -typedef struct _MSSdlOut MSSdlOut; - -struct _MSSdlOutClass -{ - MSFilterClass parent_class; -}; - -typedef struct _MSSdlOutClass MSSdlOutClass; - -MSFilter * ms_sdl_out_new(void); -void ms_sdl_out_set_format(MSSdlOut *obj, const char *fmt); - -#define MS_SDL_OUT(obj) ((MSSdlOut*)obj) - -#endif
--- a/src/mediastreamer/mssoundread.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation - - */ - -#include "mssoundread.h" - - -void ms_sound_read_init(MSSoundRead *w) -{ - ms_filter_init(MS_FILTER(w)); - -} - -void ms_sound_read_class_init(MSSoundReadClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - MS_FILTER_CLASS(klass)->max_foutputs=1; /* one fifo output only */ - - ms_filter_class_set_attr( MS_FILTER_CLASS(klass),FILTER_IS_SOURCE); -} -
--- a/src/mediastreamer/mssoundread.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifndef MSSOUNDREAD_H -#define MSSOUNDREAD_H - -#include "msfilter.h" -#include "mssync.h" - - - -struct _MSSoundRead -{ - /* the MSOssRead derivates from MSFilter, so the MSFilter object MUST be the first of the MSOssRead object - in order to the object mechanism to work*/ - MSFilter filter; -}; - -typedef struct _MSSoundRead MSSoundRead; - -struct _MSSoundReadClass -{ - /* the MSOssRead derivates from MSFilter, so the MSFilter class MUST be the first of the MSOssRead class - in order to the class mechanism to work*/ - MSFilterClass parent_class; - gint (*set_device)(MSSoundRead *, gint devid); - void (*start)(MSSoundRead *); - void (*stop)(MSSoundRead*); - void (*set_level)(MSSoundRead *, gint a); -}; - -typedef struct _MSSoundReadClass MSSoundReadClass; - -/* PUBLIC */ -#define MS_SOUND_READ(filter) ((MSSoundRead*)(filter)) -#define MS_SOUND_READ_CLASS(klass) ((MSSoundReadClass*)(klass)) - -static inline int ms_sound_read_set_device(MSSoundRead *r,gint devid) -{ - return MS_SOUND_READ_CLASS( MS_FILTER(r)->klass )->set_device(r,devid); -} - -static inline void ms_sound_read_start(MSSoundRead *r) -{ - MS_SOUND_READ_CLASS( MS_FILTER(r)->klass )->start(r); -} - -static inline void ms_sound_read_stop(MSSoundRead *w) -{ - MS_SOUND_READ_CLASS( MS_FILTER(w)->klass )->stop(w); -} - -static inline void ms_sound_read_set_level(MSSoundRead *w,gint a) -{ - MS_SOUND_READ_CLASS( MS_FILTER(w)->klass )->set_level(w,a); -} - -/* FOR INTERNAL USE*/ -void ms_sound_read_init(MSSoundRead *r); -void ms_sound_read_class_init(MSSoundReadClass *klass); - - -#endif -
--- a/src/mediastreamer/mssoundwrite.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation - - */ - -#include "mssoundwrite.h" - - -void ms_sound_write_init(MSSoundWrite *w) -{ - ms_filter_init(MS_FILTER(w)); - -} - -void ms_sound_write_class_init(MSSoundWriteClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - MS_FILTER_CLASS(klass)->max_finputs=1; /* one fifo output only */ - - ms_filter_class_set_attr( MS_FILTER_CLASS(klass),FILTER_IS_SINK); -} -
--- a/src/mediastreamer/mssoundwrite.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifndef MSSOUNDWRITE_H -#define MSSOUNDWRITE_H - -#include "msfilter.h" -#include "mssync.h" - - - -struct _MSSoundWrite -{ - /* the MSOssWrite derivates from MSFilter, so the MSFilter object MUST be the first of the MSOssWrite object - in order to the object mechanism to work*/ - MSFilter filter; -}; - -typedef struct _MSSoundWrite MSSoundWrite; - -struct _MSSoundWriteClass -{ - /* the MSOssWrite derivates from MSFilter, so the MSFilter class MUST be the first of the MSOssWrite class - in order to the class mechanism to work*/ - MSFilterClass parent_class; - gint (*set_device)(MSSoundWrite *, gint devid); - void (*start)(MSSoundWrite *); - void (*stop)(MSSoundWrite*); - void (*set_level)(MSSoundWrite *, gint a); -}; - -typedef struct _MSSoundWriteClass MSSoundWriteClass; - -/* PUBLIC */ -#define MS_SOUND_WRITE(filter) ((MSSoundWrite*)(filter)) -#define MS_SOUND_WRITE_CLASS(klass) ((MSSoundWriteClass*)(klass)) - -static inline int ms_sound_write_set_device(MSSoundWrite *r,gint devid) -{ - return MS_SOUND_WRITE_CLASS( MS_FILTER(r)->klass )->set_device(r,devid); -} - -static inline void ms_sound_write_start(MSSoundWrite *r) -{ - MS_SOUND_WRITE_CLASS( MS_FILTER(r)->klass )->start(r); -} - -static inline void ms_sound_write_stop(MSSoundWrite *w) -{ - MS_SOUND_WRITE_CLASS( MS_FILTER(w)->klass )->stop(w); -} - -static inline void ms_sound_write_set_level(MSSoundWrite *w,gint a) -{ - MS_SOUND_WRITE_CLASS( MS_FILTER(w)->klass )->set_level(w,a); -} - -/* FOR INTERNAL USE*/ -void ms_sound_write_init(MSSoundWrite *r); -void ms_sound_write_class_init(MSSoundWriteClass *klass); - - -#endif -
--- a/src/mediastreamer/msspeexdec.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,217 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msspeexdec.h" - -#ifdef HAVE_GLIB -#include <gmodule.h> -#endif - -extern MSFilter * ms_speex_enc_new(); - -MSCodecInfo speex_info= -{ - { - "Speex codec", - 0, - MS_FILTER_AUDIO_CODEC, - ms_speex_dec_new, - "A high quality variable bit-rate codec from Jean Marc Valin and David Rowe." - }, - ms_speex_enc_new, - ms_speex_dec_new, - 0, /*frame size */ - 0, - 8000, /*minimal bitrate */ - -1, /* sampling frequency */ - 110, /* payload type */ - "speex", - 1, - 1 -}; - - - -void ms_speex_codec_init() -{ - - ms_filter_register(MS_FILTER_INFO(&speex_info)); - //ms_filter_register(MS_FILTER_INFO(&speex_lbr_info)); -} - -#ifdef HAVE_GLIB -gchar * g_module_check_init(GModule *module) -{ - ms_speex_codec_init(); - - return NULL; -} -#else -gchar * g_module_check_init() -{ - ms_speex_codec_init(); - - return NULL; -} -#endif - -static MSSpeexDecClass * ms_speex_dec_class=NULL; -//static MSSpeexDecClass * ms_speexnb_dec_class=NULL; - -MSFilter * ms_speex_dec_new() -{ - MSSpeexDec *obj=g_new(MSSpeexDec,1); - - if (ms_speex_dec_class==NULL){ - ms_speex_dec_class=g_new(MSSpeexDecClass,1); - ms_speex_dec_class_init(ms_speex_dec_class); - } - MS_FILTER(obj)->klass=MS_FILTER_CLASS(ms_speex_dec_class); - - ms_speex_dec_init(obj); - return MS_FILTER(obj); -} - -void ms_speex_dec_init(MSSpeexDec *obj) -{ - ms_filter_init(MS_FILTER(obj)); - obj->initialized=0; - MS_FILTER(obj)->outfifos=obj->outf; - MS_FILTER(obj)->inqueues=obj->inq; - obj->outf[0]=NULL; - obj->inq[0]=NULL; - obj->frequency=8000; /*default value */ - -} - -void ms_speex_dec_init_core(MSSpeexDec *obj,const SpeexMode *mode) -{ - int pf=1; - - obj->speex_state=speex_decoder_init(mode); - speex_bits_init(&obj->bits); - /* enable the perceptual post filter */ - speex_decoder_ctl(obj->speex_state,SPEEX_SET_PF, &pf); - - speex_mode_query(mode, SPEEX_MODE_FRAME_SIZE, &obj->frame_size); - - obj->initialized=1; -} - -int ms_speex_dec_set_property(MSSpeexDec *obj, MSFilterProperty prop, int *value) -{ - if (obj->initialized){ - /* we are called when speex is running !! forbid that! */ - ms_warning("ms_speex_dec_set_property: cannot call this function when running!"); - return -1; - } - switch(prop){ - case MS_FILTER_PROPERTY_FREQ: - obj->frequency=value[0]; - break; - case MS_FILTER_PROPERTY_BITRATE: - case MS_FILTER_PROPERTY_CHANNELS: - case MS_FILTER_PROPERTY_FMTP: - default: - break; - } - return 0; -} - -void ms_speex_dec_setup(MSSpeexDec *obj) -{ - const SpeexMode *mode; - g_message("Speex decoder setup: freq=%i",obj->frequency); - if ( obj->frequency< 16000) mode=&speex_nb_mode; - else mode=&speex_wb_mode; - ms_speex_dec_init_core(obj,mode); -} - -void ms_speex_dec_unsetup(MSSpeexDec *obj) -{ - ms_speex_dec_uninit_core(obj); -} - -void ms_speex_dec_class_init(MSSpeexDecClass *klass) -{ - gint frame_size=0; - - ms_filter_class_init(MS_FILTER_CLASS(klass)); - /* use the largest frame size to configure fifos */ - speex_mode_query(&speex_wb_mode, SPEEX_MODE_FRAME_SIZE, &frame_size); - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_speex_dec_process; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_speex_dec_setup; - MS_FILTER_CLASS(klass)->unsetup=(MSFilterSetupFunc)ms_speex_dec_unsetup; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_speex_dec_destroy; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_speex_dec_set_property; - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"SpeexDecoder"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&speex_info; - MS_FILTER_CLASS(klass)->max_foutputs=1; - MS_FILTER_CLASS(klass)->max_qinputs=1; - MS_FILTER_CLASS(klass)->w_maxgran=frame_size*2; - ms_trace("ms_speex_dec_class_init: w_maxgran is %i.",MS_FILTER_CLASS(klass)->w_maxgran); -} - -void ms_speex_dec_uninit_core(MSSpeexDec *obj) -{ - speex_decoder_destroy(obj->speex_state); - obj->initialized=0; -} - -void ms_speex_dec_uninit(MSSpeexDec *obj) -{ - -} - -void ms_speex_dec_destroy(MSSpeexDec *obj) -{ - ms_speex_dec_uninit(obj); - g_free(obj); -} - -void ms_speex_dec_process(MSSpeexDec *obj) -{ - MSFifo *outf=obj->outf[0]; - MSQueue *inq=obj->inq[0]; - gint16 *output; - gint gran=obj->frame_size*2; - MSMessage *m; - - g_return_if_fail(inq!=NULL); - g_return_if_fail(outf!=NULL); - - m=ms_queue_get(inq); - g_return_if_fail(m!=NULL); - speex_bits_reset(&obj->bits); - ms_fifo_get_write_ptr(outf,gran,(void**)&output); - g_return_if_fail(output!=NULL); - if (m->data!=NULL){ - - speex_bits_read_from(&obj->bits,m->data,m->size); - /* decode */ - speex_decode_int(obj->speex_state,&obj->bits,(short*)output); - }else{ - /* we have a missing packet */ - speex_decode_int(obj->speex_state,NULL,(short*)output); - } - ms_message_destroy(m); - -}
--- a/src/mediastreamer/msspeexdec.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSSPEEXDEC_H -#define MSSPEEXDEC_H - -#include <mscodec.h> -#include <speex.h> - -struct _MSSpeexDec -{ - MSFilter parent; - MSQueue *inq[1]; /* speex has an input q because it can be variable bit rate */ - MSFifo *outf[1]; - void *speex_state; - SpeexBits bits; - int frequency; - int frame_size; - int initialized; -}; - -typedef struct _MSSpeexDec MSSpeexDec; - - -struct _MSSpeexDecClass -{ - MSFilterClass parent; -}; - -typedef struct _MSSpeexDecClass MSSpeexDecClass; - - -#define MS_SPEEX_DEC(o) ((MSSpeexDec*)(o)) -#define MS_SPEEX_DEC_CLASS(o) ((MSSpeexDecClass*)(o)) - -/* call this before if don't load the plugin dynamically */ -void ms_speex_codec_init(void); - -/* mediastreamer compliant constructor */ -MSFilter * ms_speex_dec_new(void); - -void ms_speex_dec_init(MSSpeexDec *obj); -void ms_speex_dec_init_core(MSSpeexDec *obj,const SpeexMode *mode); -void ms_speex_dec_class_init(MSSpeexDecClass *klass); -void ms_speex_dec_uninit(MSSpeexDec *obj); -void ms_speex_dec_uninit_core(MSSpeexDec *obj); - -void ms_speex_dec_process(MSSpeexDec *obj); -void ms_speex_dec_destroy(MSSpeexDec *obj); - -#endif
--- a/src/mediastreamer/msspeexenc.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - - -#include "msspeexenc.h" -#include "ms.h" -extern MSCodecInfo speex_info; - -static MSSpeexEncClass * ms_speex_enc_class=NULL; - -MSFilter * ms_speex_enc_new() -{ - MSSpeexEnc *obj=g_new(MSSpeexEnc,1); - - if (ms_speex_enc_class==NULL){ - ms_speex_enc_class=g_new(MSSpeexEncClass,1); - ms_speex_enc_class_init(ms_speex_enc_class); - } - MS_FILTER(obj)->klass=MS_FILTER_CLASS(ms_speex_enc_class); - ms_speex_enc_init(MS_SPEEX_ENC(obj)); - return MS_FILTER(obj); -} - -void ms_speex_enc_init(MSSpeexEnc *obj) -{ - ms_filter_init(MS_FILTER(obj)); - MS_FILTER(obj)->infifos=obj->inf; - MS_FILTER(obj)->outqueues=obj->outq; - obj->inf[0]=NULL; - obj->outq[0]=NULL; - obj->frequency=8000; - obj->bitrate=30000; - obj->initialized=0; -} - -void ms_speex_enc_init_core(MSSpeexEnc *obj,const SpeexMode *mode, gint bitrate) -{ - int proc_type, proc_speed; - gchar *proc_vendor; - int tmp; - int frame_size; - - obj->speex_state=speex_encoder_init(mode); - speex_bits_init(&obj->bits); - - if (bitrate>0) { - bitrate++; - speex_encoder_ctl(obj->speex_state, SPEEX_SET_BITRATE, &bitrate); - g_message("Setting speex output bitrate less or equal than %i",bitrate-1); - } - - proc_speed=ms_proc_get_speed(); - proc_vendor=ms_proc_get_param("vendor_id"); - if (proc_speed<0 || proc_vendor==NULL){ - g_warning("Can't guess processor features: setting speex encoder to its lowest complexity."); - tmp=1; - speex_encoder_ctl(obj->speex_state,SPEEX_SET_COMPLEXITY,&tmp); - }else if ((proc_speed!=-1) && (proc_speed<200)){ - g_warning("A cpu speed less than 200 Mhz is not enough: let's reduce the complexity of the speex codec."); - tmp=1; - speex_encoder_ctl(obj->speex_state,SPEEX_SET_COMPLEXITY,&tmp); - }else if (proc_vendor!=NULL) { - if (strncmp(proc_vendor,"GenuineIntel",strlen("GenuineIntel"))==0){ - proc_type=ms_proc_get_type(); - if (proc_type==5){ - g_warning("A pentium I is not enough fast for speex codec in normal mode: let's reduce its complexity."); - tmp=1; - speex_encoder_ctl(obj->speex_state,SPEEX_SET_COMPLEXITY,&tmp); - } - } - g_free(proc_vendor); - } - /* guess the used input frame size */ - speex_mode_query(mode, SPEEX_MODE_FRAME_SIZE, &frame_size); - MS_FILTER(obj)->r_mingran=frame_size*2; - ms_trace("ms_speex_init: using frame size of %i.",MS_FILTER(obj)->r_mingran); - - obj->initialized=1; -} - -/* must be called before the encoder is running*/ -int ms_speex_enc_set_property(MSSpeexEnc *obj,int property,int *value) -{ - if (obj->initialized){ - /* we are called when speex is running !! forbid that! */ - ms_warning("ms_speex_enc_set_property: cannot call this function when running!"); - return -1; - } - switch(property){ - case MS_FILTER_PROPERTY_FREQ: - obj->frequency=value[0]; - break; - case MS_FILTER_PROPERTY_BITRATE: /* to specify max bitrate */ - obj->bitrate=value[0]; - break; - } - return 0; -} - -void ms_speex_enc_setup(MSSpeexEnc *obj) -{ - const SpeexMode *mode; - g_message("Speex encoder setup: freq=%i",obj->frequency); - if ( obj->frequency< 16000) mode=&speex_nb_mode; - else mode=&speex_wb_mode; - ms_speex_enc_init_core(obj,mode,obj->bitrate); - -} - -void ms_speex_enc_unsetup(MSSpeexEnc *obj) -{ - ms_speex_enc_uninit_core(obj); -} - -void ms_speex_enc_class_init(MSSpeexEncClass *klass) -{ - gint frame_size=0; - - ms_filter_class_init(MS_FILTER_CLASS(klass)); - /* we take the larger (wb) frame size */ - speex_mode_query(&speex_wb_mode, SPEEX_MODE_FRAME_SIZE, &frame_size); - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_speex_enc_process; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_speex_enc_destroy; - MS_FILTER_CLASS(klass)->setup=(MSFilterSetupFunc)ms_speex_enc_setup; - MS_FILTER_CLASS(klass)->unsetup=(MSFilterSetupFunc)ms_speex_enc_unsetup; - MS_FILTER_CLASS(klass)->set_property=(MSFilterPropertyFunc)ms_speex_enc_set_property; - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"SpeexEncoder"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&speex_info; - MS_FILTER_CLASS(klass)->max_finputs=1; - MS_FILTER_CLASS(klass)->max_qoutputs=1; - MS_FILTER_CLASS(klass)->r_maxgran=frame_size*2; - ms_trace("ms_speex_enc_class_init: r_maxgran is %i.",MS_FILTER_CLASS(klass)->r_maxgran); -} - -void ms_speex_enc_uninit_core(MSSpeexEnc *obj) -{ - if (obj->initialized){ - speex_encoder_destroy(obj->speex_state); - obj->initialized=0; - } -} - -void ms_speex_enc_destroy(MSSpeexEnc *obj) -{ - ms_speex_enc_uninit_core(obj); - g_free(obj); -} - -void ms_speex_enc_process(MSSpeexEnc *obj) -{ - MSFifo *inf=obj->inf[0]; - MSQueue *outq=obj->outq[0]; - gint16 *input; - gint gran=MS_FILTER(obj)->r_mingran; - MSMessage *m; - - g_return_if_fail(inf!=NULL); - g_return_if_fail(outq!=NULL); - - ms_fifo_get_read_ptr(inf,gran,(void**)&input); - g_return_if_fail(input!=NULL); - /* encode */ - speex_bits_reset(&obj->bits); - speex_encode_int(obj->speex_state,(short*)input,&obj->bits); - m=ms_message_new(speex_bits_nbytes(&obj->bits)); - m->size=speex_bits_write(&obj->bits,m->data,m->size); - ms_queue_put(outq,m); -}
--- a/src/mediastreamer/msspeexenc.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSSPEEXENC_H -#define MSSPEEXENC_H - -#include <mscodec.h> -#include <speex.h> - -struct _MSSpeexEnc -{ - MSFilter parent; - MSFifo *inf[1]; - MSQueue *outq[1]; /* speex has an output q because it can be variable bit rate */ - void *speex_state; - SpeexBits bits; - int frequency; - int bitrate; - int initialized; -}; - -typedef struct _MSSpeexEnc MSSpeexEnc; - - -struct _MSSpeexEncClass -{ - MSFilterClass parent; -}; - -typedef struct _MSSpeexEncClass MSSpeexEncClass; - - -#define MS_SPEEX_ENC(o) ((MSSpeexEnc*)(o)) -#define MS_SPEEX_ENC_CLASS(o) ((MSSpeexEncClass*)(o)) - -/* generic constructor */ -MSFilter * ms_speex_enc_new(void); - -void ms_speex_enc_init_core(MSSpeexEnc *obj,const SpeexMode *mode, gint quality); -void ms_speex_enc_uninit_core(MSSpeexEnc *obj); -void ms_speex_enc_init(MSSpeexEnc *obj); -void ms_speex_enc_class_init(MSSpeexEncClass *klass); - - -void ms_speex_enc_process(MSSpeexEnc *obj); -void ms_speex_enc_destroy(MSSpeexEnc *obj); - -#endif
--- a/src/mediastreamer/mssync.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,198 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mssync.h" -#include <errno.h> - -/* TODO: - -define an uninit function that free the mutex -*/ - -/** - * function_name:ms_sync_get_bytes_per_tick - * @sync: A #MSSync object. - * - * Returns the number of bytes per tick. This is a usefull information for sources, so - * that they can know how much data they must deliver each time they are called. - * - */ - -/* private */ -void ms_sync_init(MSSync *sync) -{ - sync->klass=NULL; - sync->lock=g_mutex_new(); - sync->thread_cond=g_cond_new(); - sync->stop_cond=g_cond_new(); - sync->attached_filters=NULL; - sync->execution_list=NULL; - sync->filters=0; - sync->run=0; - sync->flags=0; - sync->samples_per_tick=0; - sync->ticks=0; - sync->time=0; - sync->thread=NULL; -} - -void ms_sync_class_init(MSSyncClass *klass) -{ - klass->max_filters=0; - klass->synchronize=NULL; - klass->attach=ms_sync_attach_generic; - klass->detach=ms_sync_detach_generic; - klass->destroy=NULL; -} - -/* public*/ - - -/** - * ms_sync_attach: - * @sync: A #MSSync object. - * @f: A #MSFilter object. - * - * Attach a chain of filters to a synchronisation source @sync. Filter @f must be the first filter of the processing chain. - * In order to be run, each chain of filter must be attached to a synchronisation source, that will be responsible for scheduling - * the processing. Multiple chains can be attached to a single synchronisation. - * - * Returns: 0 if successfull, a negative value reprensenting the errno.h error. - */ -int ms_sync_attach(MSSync *sync,MSFilter *f) -{ - gint err; - ms_sync_lock(sync); - err=sync->klass->attach(sync,f); - ms_sync_update(sync); - ms_sync_unlock(sync); - return(err); -} - -int ms_sync_attach_generic(MSSync *sync,MSFilter *f) -{ - int i; - //printf("attr: %i\n",f->klass->attributes); - g_return_val_if_fail(f->klass->attributes & FILTER_IS_SOURCE,-EINVAL); - g_return_val_if_fail(sync->attached_filters!=NULL,-EFAULT); - - - /* find a free place to attach*/ - for (i=0;i<sync->klass->max_filters;i++) - { - if (sync->attached_filters[i]==NULL) - { - sync->attached_filters[i]=f; - sync->filters++; - ms_trace("Filter succesfully attached to sync."); - return 0; - } - } - g_warning("No more link on sync !"); - return(-EMLINK); -} - -/** - * ms_sync_detach: - * @sync: A #MSSync object. - * @f: A #MSFilter object. - * - * Dettach a chain of filters to a synchronisation source. Filter @f must be the first filter of the processing chain. - * The processing chain will no more be executed. - * - * Returns: 0 if successfull, a negative value reprensenting the errno.h error. - */ -int ms_sync_detach(MSSync *sync,MSFilter *f) -{ - gint err; - ms_sync_lock(sync); - err=sync->klass->detach(sync,f); - ms_sync_update(sync); - ms_sync_unlock(sync); - return(err); -} - -int ms_sync_detach_generic(MSSync *sync,MSFilter *f) -{ - int i; - g_return_val_if_fail(f->klass->attributes & FILTER_IS_SOURCE,-EINVAL); - g_return_val_if_fail(sync->attached_filters!=NULL,-EFAULT); - for (i=0;i<sync->filters;i++) - { - if (sync->attached_filters[i]==f) - { - sync->attached_filters[i]=NULL; - sync->filters--; - return 0; - } - } - return(-EMLINK); -} - -void ms_sync_set_samples_per_tick(MSSync *sync,gint size) -{ - if (sync->samples_per_tick==0) - { - sync->samples_per_tick=size; - g_cond_signal(sync->thread_cond); - } - else sync->samples_per_tick=size; -} - -/* call the setup func of each filter attached to the graph */ -void ms_sync_setup(MSSync *sync) -{ - GList *elem=sync->execution_list; - MSFilter *f; - while(elem!=NULL){ - f=(MSFilter*)elem->data; - if (f->klass->setup!=NULL){ - f->klass->setup(f,sync); - } - elem=g_list_next(elem); - } -} - -/* call the unsetup func of each filter attached to the graph */ -void ms_sync_unsetup(MSSync *sync) -{ - GList *elem=sync->execution_list; - MSFilter *f; - while(elem!=NULL){ - f=(MSFilter*)elem->data; - if (f->klass->unsetup!=NULL){ - f->klass->unsetup(f,sync); - } - elem=g_list_next(elem); - } -} - - -int ms_sync_uninit(MSSync *sync) -{ - g_mutex_free(sync->lock); - g_cond_free(sync->thread_cond); - g_cond_free(sync->stop_cond); - - /* I have no idea if this is right, but nothing in media streamer is - * calling this, so it should be ok. -- Gary - */ - return 0; -} -
--- a/src/mediastreamer/mssync.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MS_SYNC_H -#define MS_SYNC_H - - -#include "msfilter.h" - -struct _MSSync -{ - struct _MSSyncClass *klass; - GMutex *lock; - MSFilter **attached_filters; /* pointer to a table of pointer of filters*/ - GList *execution_list; /* the list of filters to be executed. This is filled with compilation */ - gint filters; /*number of filters attached to the sync */ - gint run; /* flag to indicate whether the sync must be run or not */ - GThread * thread; /* the thread ressource if this sync is run by a thread*/ - GCond *thread_cond; - GCond *stop_cond; - guint32 flags; - gint interval; /* in miliseconds*/ -#define MS_SYNC_NEED_UPDATE (0x0001) /* a modification has occured in the processing chains - attached to this sync; so the execution list has to be updated */ - guint samples_per_tick; /* number of bytes produced by sources of the processing chains*/ - guint32 ticks; - guint32 time; /* a time since the start of the sync expressed in milisec*/ -}; - -typedef struct _MSSync MSSync; - -typedef void (*MSSyncDestroyFunc)(MSSync*); -typedef void (*MSSyncSyncFunc)(MSSync*); -typedef int (*MSSyncAttachFunc)(MSSync*,MSFilter*); -typedef int (*MSSyncDetachFunc)(MSSync*,MSFilter*); - -typedef struct _MSSyncClass -{ - gint max_filters; /* the maximum number of filters that can be attached to this sync*/ - MSSyncSyncFunc synchronize; - MSSyncDestroyFunc destroy; - MSSyncAttachFunc attach; - MSSyncDetachFunc detach; -} MSSyncClass; - -/* private */ -void ms_sync_init(MSSync *sync); -void ms_sync_class_init(MSSyncClass *klass); - -int ms_sync_attach_generic(MSSync *sync,MSFilter *f); -int ms_sync_detach_generic(MSSync *sync,MSFilter *f); - -/* public*/ - -#define MS_SYNC(sync) ((MSSync*)(sync)) -#define MS_SYNC_CLASS(klass) ((MSSyncClass*)(klass)) - -#define ms_sync_synchronize(_sync) \ -do \ -{ \ - MSSync *__sync=_sync; \ - __sync->ticks++; \ - ((__sync)->klass->synchronize((__sync))); \ -}while(0) - -void ms_sync_setup(MSSync *sync); - -void ms_sync_unsetup(MSSync *sync); - -#define ms_sync_update(sync) (sync)->flags|=MS_SYNC_NEED_UPDATE - -#define ms_sync_get_samples_per_tick(sync) ((sync)->samples_per_tick) - -void ms_sync_set_samples_per_tick(MSSync *sync,gint size); - -#define ms_sync_get_tick_count(sync) ((sync)->ticks) - -#define ms_sync_suspend(sync) g_cond_wait((sync)->thread_cond,(sync)->lock) - -#define ms_sync_lock(sync) g_mutex_lock((sync)->lock) - -#define ms_sync_unlock(sync) g_mutex_unlock((sync)->lock) - -#define ms_sync_trylock(sync) g_mutex_trylock((sync)->lock) - -/** - * function_name:ms_sync_attach - * @sync: A #MSSync object. - * @f: A #MSFilter object. - * - * Attach a chain of filters to a synchronisation source. Filter @f must be the first filter of the processing chain. - * - * Returns: 0 if successfull, a negative value reprensenting the errno.h error. - */ -int ms_sync_attach(MSSync *sync,MSFilter *f); - -/** - * ms_sync_detach: - * @sync: A #MSSync object. - * @f: A #MSFilter object. - * - * Dettach a chain of filters to a synchronisation source. Filter @f must be the first filter of the processing chain. - * The processing chain will no more be executed. - * - * Returns: 0 if successfull, a negative value reprensenting the errno.h error. - */ -int ms_sync_detach(MSSync *sync,MSFilter *f); - -int ms_sync_uninit(MSSync *sync); - -#define ms_sync_start(sync) ms_start((sync)) -#define ms_sync_stop(sync) ms_stop((sync)) - - -/*destroy*/ -#define ms_sync_destroy(sync) (sync)->klass->destroy((sync)) - - -#endif
--- a/src/mediastreamer/mstimer.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "mstimer.h" -#include <unistd.h> -#include <sys/types.h> -#include <sys/time.h> -#include <signal.h> - -static MSTimerClass *ms_timer_class=NULL; - - -void ms_timer_init(MSTimer *sync) -{ - ms_sync_init(MS_SYNC(sync)); - MS_SYNC(sync)->attached_filters=sync->filters; - memset(sync->filters,0,MSTIMER_MAX_FILTERS*sizeof(MSFilter*)); - MS_SYNC(sync)->samples_per_tick=160; - ms_timer_set_interval(sync,20); - sync->state=MS_TIMER_STOPPED; -} - -void ms_timer_class_init(MSTimerClass *klass) -{ - ms_sync_class_init(MS_SYNC_CLASS(klass)); - MS_SYNC_CLASS(klass)->max_filters=MSTIMER_MAX_FILTERS; - MS_SYNC_CLASS(klass)->synchronize=(MSSyncSyncFunc)ms_timer_synchronize; - MS_SYNC_CLASS(klass)->destroy=(MSSyncDestroyFunc)ms_timer_destroy; - /* no need to overload these function*/ - MS_SYNC_CLASS(klass)->attach=ms_sync_attach_generic; - MS_SYNC_CLASS(klass)->detach=ms_sync_detach_generic; -} - -void ms_timer_destroy(MSTimer *timer) -{ - g_free(timer); -} - - -void ms_timer_synchronize(MSTimer *timer) -{ - //printf("ticks=%i \n",MS_SYNC(timer)->ticks); - if (timer->state==MS_TIMER_STOPPED){ - timer->state=MS_TIMER_RUNNING; - gettimeofday(&timer->orig,NULL); - timer->sync.time=0; - } - else { - gint32 diff,time; - struct timeval tv,cur; - - gettimeofday(&cur,NULL); - time=((cur.tv_usec-timer->orig.tv_usec)/1000 ) + ((cur.tv_sec-timer->orig.tv_sec)*1000 ); - if ( (diff=time-timer->sync.time)>50){ - g_warning("Must catchup %i miliseconds.",diff); - } - while((diff = timer->sync.time-time) > 0) - { - tv.tv_sec = diff/1000; - tv.tv_usec = (diff%1000)*1000; - select(0,NULL,NULL,NULL,&tv); - gettimeofday(&cur,NULL); - time=((cur.tv_usec-timer->orig.tv_usec)/1000 ) + ((cur.tv_sec-timer->orig.tv_sec)*1000 ); - } - } - timer->sync.time+=timer->milisec; - return; -} - - -MSSync *ms_timer_new() -{ - MSTimer *timer; - - timer=g_malloc(sizeof(MSTimer)); - ms_timer_init(timer); - if (ms_timer_class==NULL) - { - ms_timer_class=g_new(MSTimerClass,1); - ms_timer_class_init(ms_timer_class); - } - MS_SYNC(timer)->klass=MS_SYNC_CLASS(ms_timer_class); - return(MS_SYNC(timer)); -} - -void ms_timer_set_interval(MSTimer *timer, int milisec) -{ - - MS_SYNC(timer)->ticks=0; - MS_SYNC(timer)->interval=milisec; - timer->interval.tv_sec=milisec/1000; - timer->interval.tv_usec=(milisec % 1000)*1000; - timer->milisec=milisec; - - -}
--- a/src/mediastreamer/mstimer.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifndef MSTIMER_H -#define MSTIMER_H - -#include "mssync.h" -#include <sys/time.h> - -#define MSTIMER_MAX_FILTERS 10 - -/* MSTimer derivates from MSSync base class*/ - -typedef struct _MSTimer -{ - /* the MSSync must be the first field of the object in order to the object mechanism to work*/ - MSSync sync; - MSFilter *filters[MSTIMER_MAX_FILTERS]; - gint milisec; /* the interval */ - struct timeval interval; - struct timeval orig; - gint state; -} MSTimer; - - -typedef struct _MSTimerClass -{ - /* the MSSyncClass must be the first field of the class in order to the class mechanism to work*/ - MSSyncClass parent_class; -} MSTimerClass; - - -/*private*/ -#define MS_TIMER_RUNNING 1 -#define MS_TIMER_STOPPED 0 -void ms_timer_init(MSTimer *sync); -void ms_timer_class_init(MSTimerClass *sync); - -void ms_timer_destroy(MSTimer *timer); -void ms_timer_synchronize(MSTimer *timer); - -/*public*/ -void ms_timer_set_interval(MSTimer *timer, gint milisec); - -/* casts a MSSync object into a MSTimer */ -#define MS_TIMER(sync) ((MSTimer*)(sync)) -/* casts a MSSync class into a MSTimer class */ -#define MS_TIMER_CLASS(klass) ((MSTimerClass*)(klass)) - -MSSync *ms_timer_new(void); - -#endif
--- a/src/mediastreamer/mstruespeechdecoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -/* - Copyright 2003 Robert W. Brewer <rbrewer at op.net> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "mstruespeechdecoder.h" -#include "mscodec.h" - -MSCodecInfo TrueSpeechinfo = -{ - { - "TrueSpeech codec", - 0, - MS_FILTER_AUDIO_CODEC, - ms_truespeechencoder_new, - "This is a proprietary codec by the DSP Group that is used in some " - "Windows applications. It has a good quality and bitrate. " - "It requires the Windows DLLs tssoft32.acm and " - "tsd32.dll to be available." - }, - ms_truespeechencoder_new, - ms_truespeechdecoder_new, - 480, - 32, - 8536, - 8000, - 116, - "TSP0", - 1, - 1, -}; - - -static MSTrueSpeechDecoderClass *ms_truespeechdecoder_class = 0; - -/* FOR INTERNAL USE*/ -void ms_truespeechdecoder_init(MSTrueSpeechDecoder *r); -void ms_truespeechdecoder_class_init(MSTrueSpeechDecoderClass *klass); -void ms_truespeechdecoder_destroy(MSTrueSpeechDecoder *obj); -void ms_truespeechdecoder_process(MSTrueSpeechDecoder *r); - -MSFilter * ms_truespeechdecoder_new(void) -{ - MSTrueSpeechDecoder *r = 0; - - if (!ms_truespeechdecoder_class) - { - ms_truespeechdecoder_class = g_new(MSTrueSpeechDecoderClass, 1); - ms_truespeechdecoder_class_init(ms_truespeechdecoder_class); - } - - r = g_new(MSTrueSpeechDecoder, 1); - MS_FILTER(r)->klass = MS_FILTER_CLASS(ms_truespeechdecoder_class); - ms_truespeechdecoder_init(r); - return MS_FILTER(r); -} - - -/* FOR INTERNAL USE*/ -void ms_truespeechdecoder_init(MSTrueSpeechDecoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos = r->f_inputs; - MS_FILTER(r)->outfifos = r->f_outputs; - - WAVEFORMATEX* wf = ms_truespeechencoder_wf_create(); - - r->codec = win32codec_create(wf, 0); - free(wf); - - MS_FILTER(r)->r_mingran = r->codec->min_insize; - - MS_FILTER_CLASS(ms_truespeechdecoder_class)->r_maxgran = - r->codec->min_insize; - MS_FILTER_CLASS(ms_truespeechdecoder_class)->w_maxgran = - r->codec->min_outsize; - - memset(r->f_inputs, 0, sizeof(MSFifo*) * MS_TRUESPEECH_CODEC_MAX_IN_OUT); - memset(r->f_outputs, 0, sizeof(MSFifo*) * MS_TRUESPEECH_CODEC_MAX_IN_OUT); -} - -void ms_truespeechdecoder_class_init(MSTrueSpeechDecoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass), "TrueSpeechDecoder"); - MS_FILTER_CLASS(klass)->max_finputs = MS_TRUESPEECH_CODEC_MAX_IN_OUT; - MS_FILTER_CLASS(klass)->max_foutputs = MS_TRUESPEECH_CODEC_MAX_IN_OUT; - MS_FILTER_CLASS(klass)->r_maxgran = 0; /* filled in by first instance */ - MS_FILTER_CLASS(klass)->w_maxgran = 0; /* filled in by first instance */ - MS_FILTER_CLASS(klass)->destroy = (MSFilterDestroyFunc)ms_truespeechdecoder_destroy; - MS_FILTER_CLASS(klass)->process = (MSFilterProcessFunc)ms_truespeechdecoder_process; - MS_FILTER_CLASS(klass)->info = MS_FILTER_INFO(&TrueSpeechinfo); - klass->driver = win32codec_create_driver(TRUESPEECH_DLL, - TRUESPEECH_FORMAT_TAG, 0); -} - -void ms_truespeechdecoder_process(MSTrueSpeechDecoder *r) -{ - MSFifo *fi,*fo; - gint err1; - void *s,*d; - - /* process output fifos, but there is only one for this class of filter*/ - - fi = r->f_inputs[0]; - fo = r->f_outputs[0]; - if (fi) - { - err1 = ms_fifo_get_read_ptr(fi, r->codec->min_insize, &s); - if (err1 > 0) - { - err1 = ms_fifo_get_write_ptr(fo, r->codec->min_outsize, &d); - if (d) - { - signed long n; - n = win32codec_convert(r->codec, - s, r->codec->min_insize, - d, r->codec->min_outsize); - } - } - - } -} - - - -void ms_truespeechdecoder_uninit(MSTrueSpeechDecoder *obj) -{ - win32codec_destroy(obj->codec); -} - -void ms_truespeechdecoder_destroy(MSTrueSpeechDecoder *obj) -{ - ms_truespeechdecoder_uninit(obj); - g_free(obj); -} - -
--- a/src/mediastreamer/mstruespeechdecoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/* - Copyright (C) 2003 Robert W. Brewer <rbrewer at op.net> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSTRUESPEECHDECODER_H -#define MSTRUESPEECHDECODER_H - -#include "msfilter.h" -#include "mstruespeechencoder.h" - - - -typedef struct _MSTrueSpeechDecoder -{ - /* the MSTrueSpeechDecoder derives from MSFilter, so the MSFilter - object MUST be the first of the MSTrueSpeechDecoder object - in order for the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MS_TRUESPEECH_CODEC_MAX_IN_OUT]; - MSFifo *f_outputs[MS_TRUESPEECH_CODEC_MAX_IN_OUT]; - Win32Codec* codec; -} MSTrueSpeechDecoder; - -typedef struct _MSTrueSpeechDecoderClass -{ - /* the MSTrueSpeechDecoder derives from MSFilter, - so the MSFilter class MUST be the first of the MSTrueSpechDecoder - class - in order for the class mechanism to work*/ - MSFilterClass parent_class; - Win32CodecDriver* driver; -} MSTrueSpeechDecoderClass; - -/* PUBLIC */ -#define MS_TRUESPEECHDECODER(filter) ((MSTrueSpechMDecoder*)(filter)) -#define MS_TRUESPEECHDECODER_CLASS(klass) ((MSTrueSpeechDecoderClass*)(klass)) -MSFilter * ms_truespeechdecoder_new(void); - - -#endif
--- a/src/mediastreamer/mstruespeechencoder.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -/* - Copyright 2003 Robert W. Brewer <rbrewer at op.net> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "mstruespeechencoder.h" -#include "mscodec.h" - -#define TRUESPEECH_CBSIZE 32 - -extern MSCodecInfo TrueSpeechinfo; - -static MSTrueSpeechEncoderClass *ms_truespeechencoder_class = 0; - -/* FOR INTERNAL USE*/ -void ms_truespeechencoder_init(MSTrueSpeechEncoder *r); -void ms_truespeechencoder_class_init(MSTrueSpeechEncoderClass *klass); -void ms_truespeechencoder_destroy(MSTrueSpeechEncoder *obj); -void ms_truespeechencoder_process(MSTrueSpeechEncoder *r); - -MSFilter * ms_truespeechencoder_new(void) -{ - MSTrueSpeechEncoder *r = 0; - - if (!ms_truespeechencoder_class) - { - ms_truespeechencoder_class = g_new(MSTrueSpeechEncoderClass, 1); - ms_truespeechencoder_class_init(ms_truespeechencoder_class); - } - - r = g_new(MSTrueSpeechEncoder, 1); - MS_FILTER(r)->klass = MS_FILTER_CLASS(ms_truespeechencoder_class); - ms_truespeechencoder_init(r); - return MS_FILTER(r); -} - - -/* FOR INTERNAL USE*/ -void ms_truespeechencoder_init(MSTrueSpeechEncoder *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos = r->f_inputs; - MS_FILTER(r)->outfifos = r->f_outputs; - - WAVEFORMATEX* wf = ms_truespeechencoder_wf_create(); - - r->codec = win32codec_create(wf, 1); - free(wf); - - MS_FILTER(r)->r_mingran = r->codec->min_insize; - - MS_FILTER_CLASS(ms_truespeechencoder_class)->r_maxgran = - r->codec->min_insize; - MS_FILTER_CLASS(ms_truespeechencoder_class)->w_maxgran = - r->codec->min_outsize; - - memset(r->f_inputs, 0, sizeof(MSFifo*) * MS_TRUESPEECH_CODEC_MAX_IN_OUT); - memset(r->f_outputs, 0, sizeof(MSFifo*) * MS_TRUESPEECH_CODEC_MAX_IN_OUT); -} - -void ms_truespeechencoder_class_init(MSTrueSpeechEncoderClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass), "TrueSpeechEncoder"); - MS_FILTER_CLASS(klass)->max_finputs = MS_TRUESPEECH_CODEC_MAX_IN_OUT; - MS_FILTER_CLASS(klass)->max_foutputs = MS_TRUESPEECH_CODEC_MAX_IN_OUT; - MS_FILTER_CLASS(klass)->r_maxgran = 0; /* filled in by first instance */ - MS_FILTER_CLASS(klass)->w_maxgran = 0; /* filled in by first instance */ - MS_FILTER_CLASS(klass)->destroy = (MSFilterDestroyFunc)ms_truespeechencoder_destroy; - MS_FILTER_CLASS(klass)->process = (MSFilterProcessFunc)ms_truespeechencoder_process; - MS_FILTER_CLASS(klass)->info = MS_FILTER_INFO(&TrueSpeechinfo); - klass->driver = win32codec_create_driver(TRUESPEECH_DLL, - TRUESPEECH_FORMAT_TAG, 1); -} - -void ms_truespeechencoder_process(MSTrueSpeechEncoder *r) -{ - MSFifo *fi,*fo; - int err1; - void *s,*d; - - /* process output fifos, but there is only one for this class of filter*/ - - fi = r->f_inputs[0]; - fo = r->f_outputs[0]; - if (fi) - { - err1 = ms_fifo_get_read_ptr(fi, r->codec->min_insize, &s); - if (err1 > 0) - { - err1 = ms_fifo_get_write_ptr(fo, r->codec->min_outsize, &d); - if (d) - { - signed long n; - - n = win32codec_convert(r->codec, - s, r->codec->min_insize, - d, r->codec->min_outsize); - } - } - - } -} - - - -void ms_truespeechencoder_uninit(MSTrueSpeechEncoder *obj) -{ - win32codec_destroy(obj->codec); -} - -void ms_truespeechencoder_destroy(MSTrueSpeechEncoder *obj) -{ - ms_truespeechencoder_uninit(obj); - g_free(obj); -} - - -WAVEFORMATEX* ms_truespeechencoder_wf_create() -{ - WAVEFORMATEX* ts_wf = 0; - long* iptr = 0; - - ts_wf = malloc(sizeof(WAVEFORMATEX) + TRUESPEECH_CBSIZE); - if (!ts_wf) - { - return 0; - } - - memset(ts_wf, 0, sizeof(*ts_wf) + TRUESPEECH_CBSIZE); - - ts_wf->wFormatTag = TRUESPEECH_FORMAT_TAG; - ts_wf->nChannels = 1; - ts_wf->nSamplesPerSec = 8000; - ts_wf->wBitsPerSample = 1; - ts_wf->nBlockAlign = 32; - ts_wf->nAvgBytesPerSec = 1067; - ts_wf->cbSize = TRUESPEECH_CBSIZE; - - /* write extra data needed by TrueSpeech codec found - from examining a TrueSpeech .wav file header - */ - iptr = (long*)(ts_wf + 1); - *iptr = 0x00f00001; - - return ts_wf; -}
--- a/src/mediastreamer/mstruespeechencoder.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - Copyright (C) 2003 Robert W. Brewer <rbrewer at op.net> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#ifndef MSTRUESPEECHENCODER_H -#define MSTRUESPEECHENCODER_H - -#include "msfilter.h" -#include <win32codec.h> - - -#define MS_TRUESPEECH_CODEC_MAX_IN_OUT 1 /* max inputs/outputs per filter*/ - -#define TRUESPEECH_FORMAT_TAG 0x22 -#define TRUESPEECH_DLL "tssoft32.acm" - -typedef struct _MSTrueSpeechEncoder -{ - /* the MSTrueSpeechEncoder derives from MSFilter, so the MSFilter - object MUST be the first of the MSTrueSpeechEncoder object - in order for the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MS_TRUESPEECH_CODEC_MAX_IN_OUT]; - MSFifo *f_outputs[MS_TRUESPEECH_CODEC_MAX_IN_OUT]; - Win32Codec* codec; -} MSTrueSpeechEncoder; - -typedef struct _MSTrueSpeechEncoderClass -{ - /* the MSTrueSpeechEncoder derives from MSFilter, - so the MSFilter class MUST be the first of the MSTrueSpechEncoder - class - in order for the class mechanism to work*/ - MSFilterClass parent_class; - Win32CodecDriver* driver; -} MSTrueSpeechEncoderClass; - -/* PUBLIC */ -#define MS_TRUESPEECHENCODER(filter) ((MSTrueSpechMEncoder*)(filter)) -#define MS_TRUESPEECHENCODER_CLASS(klass) ((MSTrueSpeechEncoderClass*)(klass)) -MSFilter * ms_truespeechencoder_new(void); - -/* for internal use only */ -WAVEFORMATEX* ms_truespeechencoder_wf_create(void); - - -#endif
--- a/src/mediastreamer/msutils.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifndef MSUTILS_H -#define MSUTILS_H - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifdef HAVE_GLIB -#include <glib.h> -#else -#include <uglib.h> -#endif -#include <errno.h> - -#ifndef ENODATA -/* this is for freeBSD .*/ -#define ENODATA EWOULDBLOCK -#endif - -#ifdef MS_DEBUG - -#define ms_trace g_message - -#else - -#define ms_trace(...) -#endif - -#define ms_warning g_warning -#define ms_error g_error - -#define VIDEO_SIZE_CIF_W 352 -#define VIDEO_SIZE_CIF_H 288 -#define VIDEO_SIZE_QCIF_W 176 -#define VIDEO_SIZE_QCIF_H 144 -#define VIDEO_SIZE_4CIF_W 704 -#define VIDEO_SIZE_4CIF_H 576 -#define VIDEO_SIZE_MAX_W VIDEO_SIZE_4CIF_W -#define VIDEO_SIZE_MAX_H VIDEO_SIZE_4CIF_H - - -#endif
--- a/src/mediastreamer/msv4l.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,530 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msv4l.h" -#include <fcntl.h> -#include <unistd.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/ioctl.h> -#include <errno.h> -#include <string.h> -#include <sys/mman.h> - -char *v4l_palette_string[17]={ - "none", - "GREY", /* Linear greyscale */ - "HI240", /* High 240 cube (BT848) */ - "RGB565", /* 565 16 bit RGB */ - "RGB24", /* 24bit RGB */ - "RGB32", /* 32bit RGB */ - "RGB555", /* 555 15bit RGB */ - "YUV422", /* YUV422 capture */ - "YUYV", - "UYVY", /* The great thing about standards is ... */ - "YUV420", - "YUV411", /* YUV411 capture */ - "RAW", /* RAW capture (BT848) */ - "YUV422P", /* YUV 4:2:2 Planar */ - "YUV411P", /* YUV 4:1:1 Planar */ - "YUV420P", /* YUV 4:2:0 Planar */ - "YUV410P", /* YUV 4:1:0 Planar */ -}; - -#define V4L_PALETTE_TO_STRING(pal) v4l_palette_string[(pal)] - -MSFilterInfo v4l_info= -{ - "Video4Linux", - 0, - MS_FILTER_VIDEO_IO, - ms_v4l_new, - NULL -}; - - -static MSV4lClass *ms_v4l_class=NULL; - -MSFilter * ms_v4l_new() -{ - MSV4l *obj; - obj=g_malloc0(sizeof(MSV4l)); - if (ms_v4l_class==NULL) - { - ms_v4l_class=g_malloc0(sizeof(MSV4lClass)); - ms_v4l_class_init(ms_v4l_class); - } - MS_FILTER(obj)->klass=MS_FILTER_CLASS(ms_v4l_class); - ms_v4l_init(obj); - return MS_FILTER(obj); -} - -void ms_v4l_init(MSV4l *obj) -{ - ms_video_source_init(MS_VIDEO_SOURCE(obj)); - /* initialize the static buffer */ - obj->use_mmap=0; - obj->fd=-1; - obj->device = g_strdup("/dev/video0"); - obj->count=0; - obj->allocdbuf=NULL; - obj->grab_image=FALSE; - obj->image_grabbed=NULL; - obj->cond=g_cond_new(); - obj->stopcond=g_cond_new(); - obj->v4lthread=NULL; - obj->thread_exited=FALSE; - obj->frame=0; - MS_VIDEO_SOURCE(obj)->format="RGB24"; /*default value */ - MS_VIDEO_SOURCE(obj)->width = VIDEO_SIZE_CIF_W; /*default value */ - MS_VIDEO_SOURCE(obj)->height = VIDEO_SIZE_CIF_H; /*default value */ -} - -void ms_v4l_class_init(MSV4lClass *klass) -{ - ms_video_source_class_init(MS_VIDEO_SOURCE_CLASS(klass)); - MS_VIDEO_SOURCE_CLASS(klass)->start=(void (*)(MSVideoSource *))ms_v4l_start; - MS_VIDEO_SOURCE_CLASS(klass)->stop=(void (*)(MSVideoSource *))ms_v4l_stop; - MS_VIDEO_SOURCE_CLASS(klass)->set_device=(int (*)(MSVideoSource*,const gchar*))ms_v4l_set_device; - MS_FILTER_CLASS(klass)->process=(void (*)(MSFilter *))v4l_process; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_v4l_destroy; - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"msv4l"); - MS_FILTER_CLASS(klass)->info=(MSFilterInfo*)&v4l_info; -} - -void *v4l_thread(MSV4l *obj); - -void ms_v4l_start(MSV4l *obj) -{ - int err; - ms_filter_lock(MS_FILTER(obj)); - obj->fd=open(obj->device,O_RDONLY); - if (obj->fd<0) - { - g_warning("MSV4l: cannot open video device: %s.",strerror(errno)); - }else{ - err=v4l_configure(obj); - if (err<0) - { - g_warning("MSV4l: could not get configuration of video device"); - } - } - obj->thread_exited=FALSE; - obj->v4lthread=g_thread_create((GThreadFunc)v4l_thread,(gpointer)obj,FALSE,NULL); - while(!obj->thread_run) g_cond_wait(obj->cond,MS_FILTER(obj)->lock); - ms_filter_unlock(MS_FILTER(obj)); -} - -void ms_v4l_stop(MSV4l *obj) -{ - ms_filter_lock(MS_FILTER(obj)); - obj->thread_run=FALSE; - obj->grab_image=FALSE; - g_cond_signal(obj->cond); - if (obj->fd>0) - { - close(obj->fd); - obj->fd=-1; - if (!obj->use_mmap){ - if (obj->allocdbuf!=NULL) ms_buffer_destroy(obj->allocdbuf); - else obj->allocdbuf=NULL; - }else - { - munmap(obj->mmapdbuf,obj->vmbuf.size); - obj->mmapdbuf=NULL; - } - obj->image_grabbed=NULL; - } - while(!obj->thread_exited) g_cond_wait(obj->stopcond,MS_FILTER(obj)->lock); - obj->v4lthread=NULL; - ms_filter_unlock(MS_FILTER(obj)); -} - -gint ms_v4l_get_width(MSV4l *v4l) -{ - return v4l->win.width; -} - -gint ms_v4l_get_height(MSV4l *v4l) -{ - return v4l->win.height; -} - -int ms_v4l_set_device(MSV4l *obj, const gchar *device) -{ - if (obj->device!=NULL) g_free(obj->device); - obj->device=g_strdup(device); - return 0; -} - -void ms_v4l_set_size(MSV4l *obj, gint width, gint height) -{ - gint err; - gboolean restart = FALSE; - - if (obj->fd == -1) - { - obj->fd = open(obj->device, O_RDONLY); - if (obj->fd < 0) - { - g_warning("MSV4l: cannot open video device: %s.",strerror(errno)); - return; - } - } else - restart = TRUE; - - ms_filter_lock(MS_FILTER(obj)); - err = ioctl(obj->fd, VIDIOCGCAP, &obj->cap); - if (err != 0) - { - g_warning("MSV4l: cannot get device capabilities: %s.",strerror(errno)); - return; - } - if (width <= obj->cap.maxwidth && width >= obj->cap.minwidth && - height <= obj->cap.maxheight && height >= obj->cap.minheight) - { - MS_VIDEO_SOURCE(obj)->width = width; - MS_VIDEO_SOURCE(obj)->height = height; - } - ms_filter_unlock(MS_FILTER(obj)); - - if (restart) - { - ms_v4l_stop(obj); - ms_v4l_start(obj); - } - -} - -int v4l_configure(MSV4l *f) -{ - gint err; - gint i; - struct video_channel *chan=&f->channel; - struct video_window *win=&f->win; - struct video_picture *pict=&f->pict; - struct video_mmap *vmap=&f->vmap; - struct video_mbuf *vmbuf=&f->vmbuf; - struct video_capture *vcap=&f->vcap; - int found=0; - - err=ioctl(f->fd,VIDIOCGCAP,&f->cap); - if (err!=0) - { - g_warning("MSV4l: cannot get device capabilities: %s.",strerror(errno)); - return -1; - } - MS_VIDEO_SOURCE(f)->dev_name=f->cap.name; - - for (i=0;i<f->cap.channels;i++) - { - chan->channel=i; - err=ioctl(f->fd,VIDIOCGCHAN,chan); - if (err==0) - { - g_message("Getting video channel %s",chan->name); - switch(chan->type){ - case VIDEO_TYPE_TV: - g_message("Channel is a TV."); - break; - case VIDEO_TYPE_CAMERA: - g_message("Channel is a camera"); - break; - default: - g_warning("unknown video channel type."); - } - found=1; - break; /* find the first channel */ - } - } - if (found) g_message("A valid video channel was found."); - /* select this channel */ - ioctl(f->fd,VIDIOCSCHAN,chan); - - /* set/get the resolution */ - err = -1; - /* - if (f->cap.type & VID_TYPE_SUBCAPTURE) { - vcap->x = vcap->y = 0; - vcap->width = MS_VIDEO_SOURCE(f)->width; - vcap->height = MS_VIDEO_SOURCE(f)->height; - err = ioctl(f->fd, VIDIOCSCAPTURE, vcap); - if (err > -1) { - f->width = MS_VIDEO_SOURCE(f)->width; - f->height = MS_VIDEO_SOURCE(f)->height; - } - } - */ - if (err < 0) { - win->x = win->y = 0; - win->width = MS_VIDEO_SOURCE(f)->width; - win->height = MS_VIDEO_SOURCE(f)->height; - win->clipcount = win->flags = 0; - win->clips = NULL; - err=ioctl(f->fd,VIDIOCSWIN,win); - if (err < 0) { - g_warning("Could not set video window properties: %s",strerror(errno)); - - err=ioctl(f->fd,VIDIOCGWIN,win); - if (err < 0) { - g_warning("Could not set video window properties: %s",strerror(errno)); - return -1; - } - f->width = win->width; - f->height = win->height; - } - else { - f->width = MS_VIDEO_SOURCE(f)->width; - f->height = MS_VIDEO_SOURCE(f)->height; - } - } - - /* get picture properties */ - err=ioctl(f->fd,VIDIOCGPICT,pict); - if (err<0){ - g_warning("Could not get picture properties: %s",strerror(errno)); - return -1; - } - g_message("Picture properties: depth=%i, palette=%i.",pict->depth, pict->palette); - f->bsize=(pict->depth/8) * f->height * f->width; - - /* try to get mmap properties */ - err=ioctl(f->fd,VIDIOCGMBUF,vmbuf); - if (err<0){ - g_warning("Could not get mmap properties: %s",strerror(errno)); - f->use_mmap=0; - }else - { - if (vmbuf->size>0){ - f->use_mmap=1; - /* do the mmap */ - f->mmapdbuf=mmap((void*)f,vmbuf->size,PROT_READ,MAP_PRIVATE,f->fd,0); - if (f->mmapdbuf==(void*)-1) { - g_warning("Could not mmap. Using read instead."); - f->use_mmap=0; - f->mmapdbuf=NULL; - }else { - /* initialize the mediastreamer buffers */ - gint i; - g_message("Using %i-frames mmap'd buffer.",vmbuf->frames); - for(i=0;i<vmbuf->frames;i++){ - f->img[i].buffer=f->mmapdbuf+vmbuf->offsets[i]; - f->img[i].size=f->bsize; - f->img[i].ref_count=1; - } - f->frame=0; - } - } else g_warning("This device cannot support mmap."); - } - - /* initialize the video map structure */ - vmap->width=win->width; - vmap->height=win->height; - vmap->format=pict->palette; - vmap->frame=0; - - MS_VIDEO_SOURCE(f)->format=V4L_PALETTE_TO_STRING(pict->palette); - return 0; -} - -#define BPP 3 -static inline -void crop( guchar *src, gint s_width, gint s_height, guchar *dest, gint d_width, gint d_height) -{ - register int i; - register int stride = d_width*BPP; - register guchar *s = src, *d = dest; - s += ((s_height - d_height)/2 * s_width * BPP) + ((s_width - d_width)/2 * BPP); - for (i = 0; i < d_height; i++, d += stride, s += s_width * BPP) - memcpy( d, s, stride); -} - -MSBuffer * v4l_grab_image_mmap(MSV4l *obj){ - struct video_mmap *vmap=&obj->vmap; - struct video_mbuf *vmbuf=&obj->vmbuf; - int err; - int syncframe; - int jitter=vmbuf->frames-1; - obj->query_frame=(obj->frame) % vmbuf->frames; - ms_trace("v4l_mmap_process: query_frame=%i", - obj->query_frame); - vmap->frame=obj->query_frame; - err=ioctl(obj->fd,VIDIOCMCAPTURE,vmap); - if (err<0) { - g_warning("v4l_mmap_process: error in VIDIOCMCAPTURE: %s.",strerror(errno)); - return NULL; - } - syncframe=(obj->frame-jitter); - obj->frame++; - if (syncframe>=0){ - syncframe=syncframe%vmbuf->frames; - err=ioctl(obj->fd,VIDIOCSYNC,&syncframe); - if (err<0) { - g_warning("v4l_mmap_process: error in VIDIOCSYNC: %s.",strerror(errno)); - return NULL; - } - }else { - return NULL; - } - /* not particularly efficient - hope for a capture source that - provides subcapture or setting window */ - - if (obj->width != MS_VIDEO_SOURCE(obj)->width || obj->height != MS_VIDEO_SOURCE(obj)->height){ - guchar tmp[obj->bsize]; - crop((guchar*) obj->img[syncframe].buffer, obj->width, obj->height, tmp, - MS_VIDEO_SOURCE(obj)->width, MS_VIDEO_SOURCE(obj)->height); - memcpy(obj->img[syncframe].buffer, tmp, MS_VIDEO_SOURCE(obj)->width * - MS_VIDEO_SOURCE(obj)->height * obj->pict.depth/8); - } - return &obj->img[syncframe]; -} - -MSBuffer *v4l_grab_image_read(MSV4l *obj){ - int err; - if (obj->allocdbuf==NULL){ - obj->allocdbuf=ms_buffer_new(obj->bsize); - obj->allocdbuf->ref_count++; - } - if (obj->width != MS_VIDEO_SOURCE(obj)->width || obj->height != MS_VIDEO_SOURCE(obj)->height) - { - guchar tmp[obj->bsize]; - err=read(obj->fd,tmp,obj->bsize); - if (err>0) - crop(tmp, obj->width, obj->height, obj->allocdbuf->buffer, MS_VIDEO_SOURCE(obj)->width, MS_VIDEO_SOURCE(obj)->height); - else { - g_warning("MSV4l: Fail to read(): %s",strerror(errno)); - return NULL; - } - } - else - { - err=read(obj->fd,obj->allocdbuf->buffer,obj->bsize); - if (err<0){ - g_warning("MSV4l: Fail to read(): %s",strerror(errno)); - return NULL; - } - } - return obj->allocdbuf; -} - - -MSBuffer * v4l_make_mire(MSV4l *obj){ - gchar *data; - int i,j,line,pos; - int patternw=obj->parent.width/6; - int patternh=obj->parent.height/6; - int red,green=0,blue=0; - if (obj->allocdbuf==NULL){ - obj->allocdbuf=ms_buffer_new(obj->parent.width*obj->parent.height*3); - obj->allocdbuf->ref_count++; - } - data=obj->allocdbuf->buffer; - for (i=0;i<obj->parent.height;++i){ - line=i*obj->parent.width*3; - if ( ((i+obj->count)/patternh) & 0x1) red=255; - else red= 0; - for (j=0;j<obj->parent.width;++j){ - int tmp; - pos=line+(j*3); - - if ( ((j+obj->count)/patternw) & 0x1) blue=255; - else blue= 0; - - data[pos]=red; - data[pos+1]=green; - data[pos+2]=blue; - } - } - obj->count++; - usleep(60000); - return obj->allocdbuf; -} - - -void *v4l_thread(MSV4l *obj){ - GMutex *mutex=MS_FILTER(obj)->lock; - g_mutex_lock(mutex); - obj->thread_run=TRUE; - g_cond_signal(obj->cond); - while(obj->thread_run){ - g_cond_wait(obj->cond,mutex); - if (obj->grab_image){ - MSBuffer *grabbed; - g_mutex_unlock(mutex); - if (obj->fd>0){ - if (obj->use_mmap){ - grabbed=v4l_grab_image_mmap(obj); - }else{ - grabbed=v4l_grab_image_read(obj); - } - }else grabbed=v4l_make_mire(obj); - g_mutex_lock(mutex); - if (grabbed){ - obj->image_grabbed=grabbed; - obj->grab_image=FALSE; - } - } - } - g_cond_signal(obj->stopcond); - obj->thread_exited=TRUE; - g_mutex_unlock(mutex); - return NULL; -} - - - - -void v4l_process(MSV4l * obj) -{ - GMutex *mutex=MS_FILTER(obj)->lock; - g_mutex_lock(mutex); - if (obj->image_grabbed!=NULL){ - MSMessage *m=ms_message_alloc(); - ms_message_set_buf(m,obj->image_grabbed); - ms_queue_put(MS_FILTER(obj)->outqueues[0],m); - obj->image_grabbed=NULL; - }else{ - obj->grab_image=TRUE; - g_cond_signal(obj->cond); - } - g_mutex_unlock(mutex); -} - -void ms_v4l_uninit(MSV4l *obj) -{ - if (obj->device!=NULL) { - g_free(obj->device); - obj->device=NULL; - } - if (obj->v4lthread!=NULL) ms_v4l_stop(obj); - if (obj->allocdbuf!=NULL) { - ms_buffer_destroy(obj->allocdbuf); - obj->allocdbuf=NULL; - } - g_cond_free(obj->cond); - g_cond_free(obj->stopcond); - ms_filter_uninit(MS_FILTER(obj)); -} - -void ms_v4l_destroy(MSV4l *obj) -{ - ms_v4l_uninit(obj); - g_free(obj); -}
--- a/src/mediastreamer/msv4l.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSV4L_H -#define MSV4L_H - -#include <msvideosource.h> -#include <sys/types.h> -#include <linux/videodev.h> - -struct _MSV4l -{ - MSVideoSource parent; - int fd; - char *device; - struct video_capability cap; - struct video_channel channel; - struct video_window win; - struct video_picture pict; - struct video_mmap vmap; - struct video_mbuf vmbuf; - struct video_capture vcap; - gint bsize; - gint use_mmap; - gint frame; - guint query_frame; - gchar *mmapdbuf; /* the mmap'd buffer */ - MSBuffer img[VIDEO_MAX_FRAME]; /* the buffer wrappers used for mmaps */ - gint width; /* the capture image size - can be cropped to output size */ - gint height; - MSBuffer *allocdbuf; /* the buffer allocated for read() and mire */ - gint count; - MSBuffer *image_grabbed; - GCond *cond; - GCond *stopcond; - GThread *v4lthread; - gboolean grab_image; - gboolean thread_run; - gboolean thread_exited; -}; - -typedef struct _MSV4l MSV4l; - - -struct _MSV4lClass -{ - MSVideoSourceClass parent_class; - -}; - -typedef struct _MSV4lClass MSV4lClass; - - -/* PUBLIC API */ -#define MS_V4L(v) ((MSV4l*)(v)) -#define MS_V4L_CLASS(k) ((MSV4lClass*)(k)) -MSFilter * ms_v4l_new(void); - -void ms_v4l_start(MSV4l *obj); -void ms_v4l_stop(MSV4l *obj); -int ms_v4l_set_device(MSV4l *f, const gchar *device); -gint ms_v4l_get_width(MSV4l *v4l); -gint ms_v4l_get_height(MSV4l *v4l); -void ms_v4l_set_size(MSV4l *v4l, gint w, gint h); - -/* PRIVATE API */ -void ms_v4l_init(MSV4l *obj); -void ms_v4l_class_init(MSV4lClass *klass); -int v4l_configure(MSV4l *f); - -void v4l_process(MSV4l *obj); - -void ms_v4l_uninit(MSV4l *obj); - -void ms_v4l_destroy(MSV4l *obj); - -extern MSFilterInfo v4l_info; - -#endif
--- a/src/mediastreamer/msvideosource.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "msvideosource.h" -#include "mediastream.h" -#include "msv4l.h" -#ifdef HAVE_LIBDC1394 -#include "msdc1394.h" -#endif - -/* register all statically linked codecs */ -void ms_video_source_register_all() -{ - ms_filter_register(&v4l_info); -#ifdef HAVE_LIBDC1394 - ms_filter_register(MS_FILTER_INFO(&dc1394_info)); -#endif -} - -void ms_video_source_class_init(MSVideoSourceClass *klass) -{ - /* init base class first*/ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - /* then init videosource specific things*/ - MS_FILTER_CLASS(klass)->max_qoutputs=MSVIDEOSOURCE_MAX_OUTPUTS; - ms_filter_class_set_attr(MS_FILTER_CLASS(klass),FILTER_IS_SOURCE|FILTER_HAS_QUEUES); -} - -void ms_video_source_init(MSVideoSource *obj) -{ - ms_filter_init(MS_FILTER(obj)); - MS_FILTER(obj)->outqueues=obj->outputs; - obj->width = VIDEO_SIZE_CIF_W; - obj->height = VIDEO_SIZE_CIF_H; -} - -void ms_video_source_start(MSVideoSource *f) -{ - MS_VIDEO_SOURCE_CLASS(MS_FILTER(f)->klass)->start(f); -} - -void ms_video_source_stop(MSVideoSource *f) -{ - MS_VIDEO_SOURCE_CLASS(MS_FILTER(f)->klass)->stop(f); -} - -int ms_video_source_set_device(MSVideoSource *f, const gchar *device) -{ - return MS_VIDEO_SOURCE_CLASS(MS_FILTER(f)->klass)->set_device(f,device); -} - -gchar* ms_video_source_get_device_name(MSVideoSource *f) -{ - return f->dev_name; -} - -void ms_video_source_set_size(MSVideoSource *f, gint width, gint height) -{ - if (MS_VIDEO_SOURCE_CLASS(MS_FILTER(f)->klass)->set_size) - MS_VIDEO_SOURCE_CLASS(MS_FILTER(f)->klass)->set_size(f, width, height); -} - -void ms_video_source_set_frame_rate(MSVideoSource *f, gint frame_rate, gint frame_rate_base) -{ - if (MS_VIDEO_SOURCE_CLASS(MS_FILTER(f)->klass)->set_frame_rate) - MS_VIDEO_SOURCE_CLASS(MS_FILTER(f)->klass)->set_frame_rate(f, frame_rate, frame_rate_base); - else{ - f->frame_rate=frame_rate; - f->frame_rate_base=frame_rate_base; - } -} - -gchar* ms_video_source_get_format(MSVideoSource *f) -{ - return f->format; -}
--- a/src/mediastreamer/msvideosource.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSVIDEOSOURCE_H -#define MSVIDEOSOURCE_H - - -#include "msfilter.h" - -/* this is the video input abstract class */ - -#define MSVIDEOSOURCE_MAX_OUTPUTS 1 /* max output per filter*/ - -typedef struct _MSVideoSource -{ - /* the MSVideoSource derivates from MSFilter, so the MSFilter object MUST be the first of the MSVideoSource object - in order to the object mechanism to work*/ - MSFilter filter; - MSQueue *outputs[MSVIDEOSOURCE_MAX_OUTPUTS]; - gchar *dev_name; - gint width, height; - gchar *format; - gint frame_rate; - gint frame_rate_base; -} MSVideoSource; - -typedef struct _MSVideoSourceClass -{ - /* the MSVideoSource derivates from MSFilter, so the MSFilter class MUST be the first of the MSVideoSource class - in order to the class mechanism to work*/ - MSFilterClass parent_class; - gint (*set_device)(MSVideoSource *s, const gchar *name); - void (*start)(MSVideoSource *s); - void (*stop)(MSVideoSource *s); - void (*set_size)(MSVideoSource *s, gint width, gint height); - void (*set_frame_rate)(MSVideoSource *s, gint frame_rate, gint frame_rate_base); -} MSVideoSourceClass; - -/* PUBLIC */ -void ms_video_source_register_all(void); -int ms_video_source_set_device(MSVideoSource *f, const gchar *device); -gchar* ms_video_source_get_device_name(MSVideoSource *f); -void ms_video_source_start(MSVideoSource *f); -void ms_video_source_stop(MSVideoSource *f); -void ms_video_source_set_size(MSVideoSource *f, gint width, gint height); -void ms_video_source_set_frame_rate(MSVideoSource *f, gint frame_rate, gint frame_rate_base); -gchar* ms_video_source_get_format(MSVideoSource *f); - -#define MS_VIDEO_SOURCE(obj) ((MSVideoSource*)(obj)) -#define MS_VIDEO_SOURCE_CLASS(klass) ((MSVideoSourceClass*)(klass)) - - -/* FOR INTERNAL USE*/ -void ms_video_source_init(MSVideoSource *f); -void ms_video_source_class_init(MSVideoSourceClass *klass); - -#endif
--- a/src/mediastreamer/mswrite.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mswrite.h" -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <string.h> -#include <errno.h> - -static MSWriteClass *ms_write_class=NULL; - -MSFilter * ms_write_new(char *name) -{ - MSWrite *r; - int fd=-1; - - r=g_new(MSWrite,1); - ms_write_init(r); - if (ms_write_class==NULL) - { - ms_write_class=g_new(MSWriteClass,1); - ms_write_class_init(ms_write_class); - } - MS_FILTER(r)->klass=MS_FILTER_CLASS(ms_write_class); - if ((name!=NULL) && (strlen(name)!=0)) - { - fd=open(name,O_WRONLY | O_CREAT | O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - if (fd<0) g_error("ms_write_new: failed to open %s.\n",name); - } - r->fd=fd; - return(MS_FILTER(r)); -} - - -/* FOR INTERNAL USE*/ -void ms_write_init(MSWrite *r) -{ - ms_filter_init(MS_FILTER(r)); - MS_FILTER(r)->infifos=r->f_inputs; - MS_FILTER(r)->inqueues=r->q_inputs; - MS_FILTER(r)->r_mingran=MSWRITE_MIN_GRAN; - memset(r->f_inputs,0,sizeof(MSFifo*)*MSWRITE_MAX_INPUTS); - memset(r->q_inputs,0,sizeof(MSQueue*)*MSWRITE_MAX_INPUTS); - r->fd=-1; -} - -void ms_write_class_init(MSWriteClass *klass) -{ - ms_filter_class_init(MS_FILTER_CLASS(klass)); - ms_filter_class_set_name(MS_FILTER_CLASS(klass),"dskwriter"); - MS_FILTER_CLASS(klass)->max_finputs=MSWRITE_MAX_INPUTS; - MS_FILTER_CLASS(klass)->max_qinputs=MSWRITE_MAX_INPUTS; - MS_FILTER_CLASS(klass)->r_maxgran=MSWRITE_DEF_GRAN; - MS_FILTER_CLASS(klass)->destroy=(MSFilterDestroyFunc)ms_write_destroy; - MS_FILTER_CLASS(klass)->process=(MSFilterProcessFunc)ms_write_process; -} - -void ms_write_process(MSWrite *r) -{ - MSFifo *f; - MSQueue *q; - MSMessage *buf=NULL; - int i,j,err1,err2; - gint gran=ms_filter_get_mingran(MS_FILTER(r)); - void *p; - - /* process output fifos*/ - for (i=0,j=0;(i<MS_FILTER(r)->klass->max_finputs)&&(j<MS_FILTER(r)->finputs);i++) - { - f=r->f_inputs[i]; - if (f!=NULL) - { - if ( (err1=ms_fifo_get_read_ptr(f,gran,&p))>0 ) - { - - err2=write(r->fd,p,gran); - if (err2<0) g_warning("ms_write_process: failed to write: %s.\n",strerror(errno)); - } - j++; - } - } - /* process output queues*/ - for (i=0,j=0;(i<MS_FILTER(r)->klass->max_qinputs)&&(j<MS_FILTER(r)->qinputs);i++) - { - q=r->q_inputs[i]; - if (q!=NULL) - { - while ( (buf=ms_queue_get(q))!=NULL ){ - write(r->fd,buf->data,buf->size); - j++; - ms_message_destroy(buf); - } - } - } -} - -void ms_write_destroy( MSWrite *obj) -{ - if (obj->fd!=0) close(obj->fd); - g_free(obj); -} -
--- a/src/mediastreamer/mswrite.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef MSWRITE_H -#define MSWRITE_H - -#include "msfilter.h" - - -/*this is the class that implements writing reading sink filter*/ - -#define MSWRITE_MAX_INPUTS 1 /* max output per filter*/ - -#define MSWRITE_DEF_GRAN 512 /* the default granularity*/ -#define MSWRITE_MIN_GRAN 64 - -typedef struct _MSWrite -{ - /* the MSWrite derivates from MSFilter, so the MSFilter object MUST be the first of the MSWrite object - in order to the object mechanism to work*/ - MSFilter filter; - MSFifo *f_inputs[MSWRITE_MAX_INPUTS]; - MSQueue *q_inputs[MSWRITE_MAX_INPUTS]; - gint fd; /* the file descriptor of the file being written*/ -} MSWrite; - -typedef struct _MSWriteClass -{ - /* the MSWrite derivates from MSFilter, so the MSFilter class MUST be the first of the MSWrite class - in order to the class mechanism to work*/ - MSFilterClass parent_class; -} MSWriteClass; - -/* PUBLIC */ -#define MS_WRITE(filter) ((MSWrite*)(filter)) -#define MS_WRITE_CLASS(klass) ((MSWriteClass*)(klass)) -MSFilter * ms_write_new(char *name); - -/* FOR INTERNAL USE*/ -void ms_write_init(MSWrite *r); -void ms_write_class_init(MSWriteClass *klass); -void ms_write_destroy( MSWrite *obj); -void ms_write_process(MSWrite *r); - -#endif -
--- a/src/mediastreamer/osscard.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,497 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "osscard.h" - -#include "msossread.h" -#include "msosswrite.h" - -#include <sys/ioctl.h> -#include <unistd.h> - -#ifdef HAVE_SYS_SOUNDCARD_H -#include <sys/soundcard.h> - -#include <errno.h> -#include <fcntl.h> -#include <sys/time.h> - -#if 0 -void * oss_thread(OssCard *obj) -{ - gint i; - gint err; - g_message("oss_thread: starting **********"); - while(1){ - for(i=0;i<OSS_CARD_BUFFERS;i++){ - g_mutex_lock(obj->lock); - if (obj->ref==0){ - g_cond_signal(obj->cond); - g_mutex_unlock(obj->lock); - g_thread_exit(NULL); - } - g_mutex_unlock(obj->lock); - obj->readindex=i; - - err=read(obj->fd,obj->readbuf[i],SND_CARD(obj)->bsize); - if (err<0) g_warning("oss_thread: read() error:%s.",strerror(errno)); - obj->writeindex=i; - write(obj->fd,obj->writebuf[i],SND_CARD(obj)->bsize); - memset(obj->writebuf[i],0,SND_CARD(obj)->bsize); - } - } -} -#endif -int oss_open(OssCard *obj, int bits,int stereo, int rate) -{ - int fd; - int p=0,cond=0; - int i=0; - int min_size=0,blocksize=512; - int err; - - //g_message("opening sound device"); - fd=open(obj->dev_name,O_RDWR|O_NONBLOCK); - if (fd<0) return -EWOULDBLOCK; - /* unset nonblocking mode */ - /* We wanted non blocking open but now put it back to normal ; thanks Xine !*/ - fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); - - /* reset is maybe not needed but takes time*/ - /*ioctl(fd, SNDCTL_DSP_RESET, 0); */ - - -#ifdef WORDS_BIGENDIAN - p=AFMT_U16_BE; -#else - p=AFMT_U16_LE; -#endif - - err=ioctl(fd,SNDCTL_DSP_SETFMT,&p); - if (err<0){ - g_warning("oss_open: can't set sample format:%s.",strerror(errno)); - } - - - p = bits; /* 16 bits */ - err=ioctl(fd, SNDCTL_DSP_SAMPLESIZE, &p); - if (err<0){ - g_warning("oss_open: can't set sample size to %i:%s.",bits,strerror(errno)); - } - - p = rate; /* rate in khz*/ - err=ioctl(fd, SNDCTL_DSP_SPEED, &p); - if (err<0){ - g_warning("oss_open: can't set sample rate to %i:%s.",rate,strerror(errno)); - } - - p = stereo; /* stereo or not */ - err=ioctl(fd, SNDCTL_DSP_STEREO, &p); - if (err<0){ - g_warning("oss_open: can't set mono/stereo mode:%s.",strerror(errno)); - } - - if (rate==16000) blocksize=4096; /* oss emulation is not very good at 16khz */ - else blocksize=blocksize*(rate/8000); - ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &min_size); - - /* try to subdivide BLKSIZE to reach blocksize if necessary */ - if (min_size>blocksize) - { - cond=1; - p=min_size/blocksize; - while(cond) - { - i=ioctl(fd, SNDCTL_DSP_SUBDIVIDE, &p); - //printf("SUB_DIVIDE said error=%i,errno=%i\n",i,errno); - if ((i==0) || (p==1)) cond=0; - else p=p/2; - } - } - ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &min_size); - if (min_size>blocksize) - { - g_warning("dsp block size set to %i.",min_size); - }else{ - /* no need to access the card with less latency than needed*/ - min_size=blocksize; - } - - g_message("dsp blocksize is %i.",min_size); - - /* start recording !!! Alex */ - { - int fl,res; - - fl=PCM_ENABLE_OUTPUT|PCM_ENABLE_INPUT; - res=ioctl(fd, SNDCTL_DSP_SETTRIGGER, &fl); - if (res<0) g_warning("OSS_TRIGGER: %s",strerror(errno)); - } - - obj->fd=fd; - obj->readpos=0; - obj->writepos=0; - SND_CARD(obj)->bits=bits; - SND_CARD(obj)->stereo=stereo; - SND_CARD(obj)->rate=rate; - SND_CARD(obj)->bsize=min_size; - return fd; -} - -int oss_card_probe(OssCard *obj,int bits,int stereo,int rate) -{ - - int fd; - int p=0,cond=0; - int i=0; - int min_size=0,blocksize=512; - - if (obj->fd>0) return SND_CARD(obj)->bsize; - fd=open(obj->dev_name,O_RDWR|O_NONBLOCK); - if (fd<0) { - g_warning("oss_card_probe: can't open %s: %s.",obj->dev_name,strerror(errno)); - return -1; - } - ioctl(fd, SNDCTL_DSP_RESET, 0); - - p = bits; /* 16 bits */ - ioctl(fd, SNDCTL_DSP_SAMPLESIZE, &p); - - p = stereo; /* number of channels */ - ioctl(fd, SNDCTL_DSP_CHANNELS, &p); - - p = rate; /* rate in khz*/ - ioctl(fd, SNDCTL_DSP_SPEED, &p); - - ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &min_size); - - /* try to subdivide BLKSIZE to reach blocksize if necessary */ - if (min_size>blocksize) - { - cond=1; - p=min_size/blocksize; - while(cond) - { - i=ioctl(fd, SNDCTL_DSP_SUBDIVIDE, &p); - //printf("SUB_DIVIDE said error=%i,errno=%i\n",i,errno); - if ((i==0) || (p==1)) cond=0; - else p=p/2; - } - } - ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &min_size); - if (min_size>blocksize) - { - g_warning("dsp block size set to %i.",min_size); - }else{ - /* no need to access the card with less latency than needed*/ - min_size=blocksize; - } - close(fd); - return min_size; -} - - -int oss_card_open(OssCard *obj,int bits,int stereo,int rate) -{ - int fd; - obj->ref++; - if (obj->fd==0){ - fd=oss_open(obj,bits,stereo,rate); - if (fd<0) { - obj->fd=0; - obj->ref--; - return -1; - } - } - - obj->readbuf=g_malloc0(SND_CARD(obj)->bsize); - obj->writebuf=g_malloc0(SND_CARD(obj)->bsize); - - SND_CARD(obj)->flags|=SND_CARD_FLAGS_OPENED; - return 0; -} - -void oss_card_close(OssCard *obj) -{ - obj->ref--; - if (obj->ref==0) { - close(obj->fd); - obj->fd=0; - SND_CARD(obj)->flags&=~SND_CARD_FLAGS_OPENED; - g_free(obj->readbuf); - obj->readbuf=NULL; - g_free(obj->writebuf); - obj->writebuf=NULL; - - } -} - -void oss_card_destroy(OssCard *obj) -{ - snd_card_uninit(SND_CARD(obj)); - g_free(obj->dev_name); - g_free(obj->mixdev_name); - if (obj->readbuf!=NULL) g_free(obj->readbuf); - if (obj->writebuf!=NULL) g_free(obj->writebuf); -} - -gboolean oss_card_can_read(OssCard *obj) -{ - struct timeval tout={0,0}; - int err; - fd_set fdset; - if (obj->readpos!=0) return TRUE; - FD_ZERO(&fdset); - FD_SET(obj->fd,&fdset); - err=select(obj->fd+1,&fdset,NULL,NULL,&tout); - if (err>0) return TRUE; - else return FALSE; -} - -int oss_card_read(OssCard *obj,char *buf,int size) -{ - int err; - gint bsize=SND_CARD(obj)->bsize; - if (size<bsize){ - gint canread=MIN(bsize-obj->readpos,size); - if (obj->readpos==0){ - err=read(obj->fd,obj->readbuf,bsize); - if (err<0) { - g_warning("oss_card_read: read() failed:%s.",strerror(errno)); - return -1; - } - } - - memcpy(buf,&obj->readbuf[obj->readpos],canread); - obj->readpos+=canread; - if (obj->readpos>=bsize) obj->readpos=0; - return canread; - }else{ - err=read(obj->fd,buf,size); - if (err<0) { - g_warning("oss_card_read: read-2() failed:%s.",strerror(errno)); - } - return err; - } - -} - -int oss_card_write(OssCard *obj,char *buf,int size) -{ - int err; - gint bsize=SND_CARD(obj)->bsize; - - if (size<bsize){ - gint canwrite; - canwrite=MIN(bsize-obj->writepos,size); - memcpy(&obj->writebuf[obj->writepos],buf,canwrite); - obj->writepos+=canwrite; - if (obj->writepos>=bsize){ - err=write(obj->fd,obj->writebuf,bsize); - obj->writepos=0; - } - return canwrite; - }else{ - return write(obj->fd,buf,bsize); - } -} - -void oss_card_set_level(OssCard *obj,gint way,gint a) -{ - int p,mix_fd; - int osscmd; - g_return_if_fail(obj->mixdev_name!=NULL); -#ifdef HAVE_SYS_SOUNDCARD_H - switch(way){ - case SND_CARD_LEVEL_GENERAL: - osscmd=SOUND_MIXER_VOLUME; - break; - case SND_CARD_LEVEL_INPUT: - osscmd=SOUND_MIXER_IGAIN; - break; - case SND_CARD_LEVEL_OUTPUT: - osscmd=SOUND_MIXER_PCM; - break; - default: - g_warning("oss_card_set_level: unsupported command."); - return; - } - p=(((int)a)<<8 | (int)a); - mix_fd = open(obj->mixdev_name, O_WRONLY); - ioctl(mix_fd,MIXER_WRITE(osscmd), &p); - close(mix_fd); -#endif -} - -gint oss_card_get_level(OssCard *obj,gint way) -{ - int p=0,mix_fd; - int osscmd; - g_return_val_if_fail(obj->mixdev_name!=NULL, -1); -#ifdef HAVE_SYS_SOUNDCARD_H - switch(way){ - case SND_CARD_LEVEL_GENERAL: - osscmd=SOUND_MIXER_VOLUME; - break; - case SND_CARD_LEVEL_INPUT: - osscmd=SOUND_MIXER_IGAIN; - break; - case SND_CARD_LEVEL_OUTPUT: - osscmd=SOUND_MIXER_PCM; - break; - default: - g_warning("oss_card_get_level: unsupported command."); - return -1; - } - mix_fd = open(obj->mixdev_name, O_RDONLY); - ioctl(mix_fd,MIXER_READ(SOUND_MIXER_VOLUME), &p); - close(mix_fd); -#endif - return p>>8; -} - -void oss_card_set_source(OssCard *obj,int source) -{ - gint p=0; - gint mix_fd; - g_return_if_fail(obj->mixdev_name!=NULL); -#ifdef HAVE_SYS_SOUNDCARD_H - if (source == 'c') - p = 1 << SOUND_MIXER_CD; - if (source == 'l') - p = 1 << SOUND_MIXER_LINE; - if (source == 'm') - p = 1 << SOUND_MIXER_MIC; - - - mix_fd = open(obj->mixdev_name, O_WRONLY); - ioctl(mix_fd, SOUND_MIXER_WRITE_RECSRC, &p); - close(mix_fd); -#endif -} - -MSFilter *oss_card_create_read_filter(OssCard *card) -{ - MSFilter *f=ms_oss_read_new(); - ms_oss_read_set_device(MS_OSS_READ(f),SND_CARD(card)->index); - return f; -} - -MSFilter *oss_card_create_write_filter(OssCard *card) -{ - MSFilter *f=ms_oss_write_new(); - ms_oss_write_set_device(MS_OSS_WRITE(f),SND_CARD(card)->index); - return f; -} - - -SndCard * oss_card_new(char *devname, char *mixdev_name) -{ - OssCard * obj= g_new0(OssCard,1); - SndCard *base= SND_CARD(obj); - snd_card_init(base); - obj->dev_name=g_strdup(devname); - obj->mixdev_name=g_strdup( mixdev_name); -#ifdef HAVE_GLIB - base->card_name=g_strdup_printf("%s (Open Sound System)",devname); -#else - base->card_name=malloc(100); - snprintf(base->card_name, 100, "%s (Open Sound System)",devname); -#endif - base->_probe=(SndCardOpenFunc)oss_card_probe; - base->_open_r=(SndCardOpenFunc)oss_card_open; - base->_open_w=(SndCardOpenFunc)oss_card_open; - base->_can_read=(SndCardPollFunc)oss_card_can_read; - base->_read=(SndCardIOFunc)oss_card_read; - base->_write=(SndCardIOFunc)oss_card_write; - base->_close_r=(SndCardCloseFunc)oss_card_close; - base->_close_w=(SndCardCloseFunc)oss_card_close; - base->_set_rec_source=(SndCardMixerSetRecSourceFunc)oss_card_set_source; - base->_set_level=(SndCardMixerSetLevelFunc)oss_card_set_level; - base->_get_level=(SndCardMixerGetLevelFunc)oss_card_get_level; - base->_destroy=(SndCardDestroyFunc)oss_card_destroy; - base->_create_read_filter=(SndCardCreateFilterFunc)oss_card_create_read_filter; - base->_create_write_filter=(SndCardCreateFilterFunc)oss_card_create_write_filter; - return base; -} - -#define DSP_NAME "/dev/dsp" -#define MIXER_NAME "/dev/mixer" - -gint oss_card_manager_init(SndCardManager *manager, gint tabindex) -{ - gchar *devname; - gchar *mixername; - gint devindex=0; - gint found=0; - - /* search for /dev/dsp and /dev/mixer */ -#ifdef HAVE_GLIB - if (g_file_test(DSP_NAME,G_FILE_TEST_EXISTS)){ - tabindex++; - devindex++; - manager->cards[0]=oss_card_new(DSP_NAME,MIXER_NAME); - manager->cards[0]->index=0; - found++; - g_message("Found /dev/dsp."); - } - for (;tabindex<MAX_SND_CARDS && devindex<MAX_SND_CARDS ;devindex++){ - devname=g_strdup_printf("%s%i",DSP_NAME,devindex); - mixername=g_strdup_printf("%s%i",MIXER_NAME,devindex); - if (g_file_test(devname,G_FILE_TEST_EXISTS)){ - manager->cards[tabindex]=oss_card_new(devname,mixername); - manager->cards[tabindex]->index=tabindex; - tabindex++; - found++; - } - g_free(devname); - g_free(mixername); - } -#else - if (access(DSP_NAME,F_OK)==0){ - tabindex++; - devindex++; - manager->cards[0]=oss_card_new(DSP_NAME,MIXER_NAME); - manager->cards[0]->index=0; - found++; - g_message("Found /dev/dsp."); - } - for (;tabindex<MAX_SND_CARDS && devindex<MAX_SND_CARDS ;devindex++){ - devname=malloc(100); - snprintf(devname, 100, "%s%i",DSP_NAME,devindex); - mixername=malloc(100); - snprintf(mixername, 100, "%s%i",MIXER_NAME,devindex); - - if (access(devname,F_OK)==0){ - manager->cards[tabindex]=oss_card_new(devname,mixername); - manager->cards[tabindex]->index=tabindex; - tabindex++; - found++; - } - g_free(devname); - g_free(mixername); - } -#endif - if (tabindex==0) g_warning("No sound cards found !"); - return found; -} - - -#endif
--- a/src/mediastreamer/osscard.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -/* An implementation of SndCard : the OssCard */ - -#ifndef OSS_CARD_H -#define OSS_CARD_H - -#include "sndcard.h" - -#define OSS_CARD_BUFFERS 3 -struct _OssCard -{ - SndCard parent; - gchar *dev_name; /* /dev/dsp0 for example */ - gchar *mixdev_name; /* /dev/mixer0 for example */ - gint fd; /* the file descriptor of the open soundcard, 0 if not open*/ - gint ref; - gchar *readbuf; - gint readpos; - gchar *writebuf; - gint writepos; -}; - -typedef struct _OssCard OssCard; - -SndCard * oss_card_new(char *devname, char *mixdev_name); - -typedef OssCard HpuxSndCard; - -gint oss_card_manager_init(SndCardManager *manager, gint tabindex); - -#endif
--- a/src/mediastreamer/ring_test.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "msringplayer.h" -#include "msosswrite.h" -#include "msossread.h" -#include "mscopy.h" -#include "mstimer.h" -#include <unistd.h> - - -#define READFILE "../share/ring.wav" -#define WRITEFILE "/tmp/mediaout" - -int main() -{ - MSFilter *play,*copy,*rec; - MSSync *timer; - int i=0; - SndCard *card; - ms_init(); - - card=snd_card_manager_get_card(snd_card_manager,1); - play=ms_ring_player_new(READFILE,2); - //play=ms_oss_read_new(0); - rec=snd_card_create_write_filter(card); - copy=ms_copy_new(); - timer=ms_timer_new(); - - ms_filter_add_link(play,copy); - ms_filter_add_link(copy,rec); - ms_sync_attach(timer,play); - - ms_start(timer); - - while(1) - { - ms_sound_write_set_level(MS_SOUND_WRITE(rec),i); - i+=10; - sleep(2); - if (i>100) i=0; - } - return 0; -}
--- a/src/mediastreamer/sndcard.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,204 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "sndcard.h" -#include "msfilter.h" - -void snd_card_init(SndCard *obj) -{ - memset(obj,0,sizeof(SndCard)); -} - -void snd_card_uninit(SndCard *obj) -{ - if (obj->card_name!=NULL) g_free(obj->card_name); -} - -const gchar *snd_card_get_identifier(SndCard *obj) -{ - return obj->card_name; -} - -int snd_card_open_r(SndCard *obj, int bits, int stereo, int rate) -{ - g_return_val_if_fail(obj->_open_r!=NULL,-1); - g_message("Opening sound card [%s] in capture mode with stereo=%i,rate=%i,bits=%i",obj->card_name,stereo,rate,bits); - return obj->_open_r(obj,bits,stereo,rate); -} -int snd_card_open_w(SndCard *obj, int bits, int stereo, int rate) -{ - g_return_val_if_fail(obj->_open_w!=NULL,-1); - g_message("Opening sound card [%s] in playback mode with stereo=%i,rate=%i,bits=%i",obj->card_name,stereo,rate,bits); - return obj->_open_w(obj,bits,stereo,rate); -} - -gboolean snd_card_can_read(SndCard *obj){ - g_return_val_if_fail(obj->_can_read!=NULL,-1); - return obj->_can_read(obj); -} - -void snd_card_set_blocking_mode(SndCard *obj,gboolean yesno){ - g_return_if_fail(obj->_set_blocking_mode!=NULL); - obj->_set_blocking_mode(obj,yesno); -} - -int snd_card_read(SndCard *obj,char *buffer,int size) -{ - g_return_val_if_fail(obj->_read!=NULL,-1); - return obj->_read(obj,buffer,size); -} -int snd_card_write(SndCard *obj,char *buffer,int size) -{ - g_return_val_if_fail(obj->_write!=NULL,-1); - return obj->_write(obj,buffer,size); -} - -int snd_card_get_bsize(SndCard *obj) -{ - if (obj->flags & SND_CARD_FLAGS_OPENED){ - return obj->bsize; - } - return -1; -} - -void snd_card_close_r(SndCard *obj) -{ - g_return_if_fail(obj->_close_r!=NULL); - g_message("Closing reading channel of soundcard."); - obj->_close_r(obj); -} - -void snd_card_close_w(SndCard *obj) -{ - g_return_if_fail(obj->_close_w!=NULL); - g_message("Closing writing channel of soundcard."); - obj->_close_w(obj); -} - -gint snd_card_probe(SndCard *obj,int bits, int stereo, int rate) -{ - g_return_val_if_fail(obj->_probe!=NULL,-1); - return obj->_probe(obj,bits,stereo,rate); -} - -void snd_card_set_rec_source(SndCard *obj, int source) -{ - g_return_if_fail(obj->_set_rec_source!=NULL); - obj->_set_rec_source(obj,source); -} - -void snd_card_set_level(SndCard *obj, int way, int level) -{ - g_return_if_fail(obj->_set_level!=NULL); - obj->_set_level(obj,way,level); -} - -gint snd_card_get_level(SndCard *obj,int way) -{ - g_return_val_if_fail(obj->_get_level!=NULL,-1); - return obj->_get_level(obj,way); -} - - -MSFilter * snd_card_create_read_filter(SndCard *obj) -{ - g_return_val_if_fail(obj->_create_read_filter!=NULL,NULL); - return obj->_create_read_filter(obj); -} -MSFilter * snd_card_create_write_filter(SndCard *obj) -{ - g_return_val_if_fail(obj->_create_write_filter!=NULL,NULL); - return obj->_create_write_filter(obj); -} - - -#ifdef HAVE_SYS_AUDIO_H -gint sys_audio_manager_init(SndCardManager *manager, gint index) -{ - /* this is a quick shortcut, as multiple soundcards on HPUX does not happen - very often... */ - manager->cards[index]=hpux_snd_card_new("/dev/audio","/dev/audio"); - return 1; -} - -#endif - -#include "osscard.h" -#include "alsacard.h" -#include "jackcard.h" - -void snd_card_manager_init(SndCardManager *manager) -{ - gint index=0; - gint tmp=0; - memset(manager,0,sizeof(SndCardManager)); - #ifdef HAVE_SYS_SOUNDCARD_H - tmp=oss_card_manager_init(manager,index); - index+=tmp; - if (index>=MAX_SND_CARDS) return; - #endif - #ifdef __ALSA_ENABLED__ - tmp=alsa_card_manager_init(manager,index); - index+=tmp; - if (index>=MAX_SND_CARDS) return; - #endif - #ifdef __JACK_ENABLED__ - tmp=jack_card_manager_init(manager,index); - index+=tmp; - if (index>=MAX_SND_CARDS) return; - #endif - #ifdef HAVE_SYS_AUDIO_H - tmp=sys_audio_manager_init(manager,index); - index+=tmp; - #endif -} - - - - - -SndCard * snd_card_manager_get_card(SndCardManager *manager,int index) -{ - g_return_val_if_fail(index>=0,NULL); - g_return_val_if_fail(index<MAX_SND_CARDS,NULL); - if (index>MAX_SND_CARDS) return NULL; - return manager->cards[index]; -} - -SndCard * snd_card_manager_get_card_with_string(SndCardManager *manager,const char *cardname,int *index) -{ - int i; - for (i=0;i<MAX_SND_CARDS;i++){ - gchar *card_name; - if (manager->cards[i]==NULL) continue; - card_name=manager->cards[i]->card_name; - if (card_name==NULL) continue; - if (strcmp(card_name,cardname)==0){ - *index=i; - return manager->cards[i]; - } - } - g_warning("No card %s found.",cardname); - return NULL; -} - -SndCardManager _snd_card_manager; -SndCardManager *snd_card_manager=&_snd_card_manager;
--- a/src/mediastreamer/sndcard.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - - -#ifndef SNDCARD_H -#define SNDCARD_H - -#undef PACKAGE -#undef VERSION -#include <config.h> -#undef PACKAGE -#undef VERSION - -#ifdef HAVE_GLIB -#include <glib.h> -#else -#include <uglib.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* the base class for all soundcards: SndCard */ -struct _SndCard; - -typedef int (*SndCardOpenFunc)(struct _SndCard*,int, int, int); -typedef void (*SndCardSetBlockingModeFunc)(struct _SndCard*, gboolean ); -typedef void (*SndCardCloseFunc)(struct _SndCard*); -typedef gint (*SndCardIOFunc)(struct _SndCard*,char *,int); -typedef void (*SndCardDestroyFunc)(struct _SndCard*); -typedef gboolean (*SndCardPollFunc)(struct _SndCard*); -typedef gint (*SndCardMixerGetLevelFunc)(struct _SndCard*,gint); -typedef void (*SndCardMixerSetRecSourceFunc)(struct _SndCard*,gint); -typedef void (*SndCardMixerSetLevelFunc)(struct _SndCard*,gint ,gint); -typedef struct _MSFilter * (*SndCardCreateFilterFunc)(struct _SndCard *); - -struct _SndCard -{ - gchar *card_name; /* SB16 PCI for example */ - gint index; - gint bsize; - gint rate; - gint stereo; - gint bits; - gint flags; -#define SND_CARD_FLAGS_OPENED 1 - SndCardOpenFunc _probe; - SndCardOpenFunc _open_r; - SndCardOpenFunc _open_w; - SndCardSetBlockingModeFunc _set_blocking_mode; - SndCardPollFunc _can_read; - SndCardIOFunc _read; - SndCardIOFunc _write; - SndCardCloseFunc _close_r; - SndCardCloseFunc _close_w; - SndCardMixerGetLevelFunc _get_level; - SndCardMixerSetLevelFunc _set_level; - SndCardMixerSetRecSourceFunc _set_rec_source; - SndCardCreateFilterFunc _create_read_filter; - SndCardCreateFilterFunc _create_write_filter; - SndCardDestroyFunc _destroy; -}; - - -typedef struct _SndCard SndCard; - -void snd_card_init(SndCard *obj); -void snd_card_uninit(SndCard *obj); -gint snd_card_probe(SndCard *obj, int bits, int stereo, int rate); -int snd_card_open_r(SndCard *obj, int bits, int stereo, int rate); -int snd_card_open_w(SndCard *obj, int bits, int stereo, int rate); -int snd_card_get_bsize(SndCard *obj); -gboolean snd_card_can_read(SndCard *obj); -int snd_card_read(SndCard *obj,char *buffer,int size); -int snd_card_write(SndCard *obj,char *buffer,int size); -void snd_card_set_blocking_mode(SndCard *obj,gboolean yesno); -void snd_card_close_r(SndCard *obj); -void snd_card_close_w(SndCard *obj); - -void snd_card_set_rec_source(SndCard *obj, int source); /* source='l' or 'm'*/ -void snd_card_set_level(SndCard *obj, int way, int level); -gint snd_card_get_level(SndCard *obj,int way); - -const gchar *snd_card_get_identifier(SndCard *obj); - -struct _MSFilter * snd_card_create_read_filter(SndCard *sndcard); -struct _MSFilter * snd_card_create_write_filter(SndCard *sndcard); - - -#define SND_CARD_LEVEL_GENERAL 1 -#define SND_CARD_LEVEL_INPUT 2 -#define SND_CARD_LEVEL_OUTPUT 3 - - -int snd_card_destroy(SndCard *obj); - -#define SND_CARD(obj) ((SndCard*)(obj)) - - - - -/* SndCardManager */ - -#define MAX_SND_CARDS 20 - - -struct _SndCardManager -{ - SndCard *cards[MAX_SND_CARDS]; -}; - -typedef struct _SndCardManager SndCardManager; - -void snd_card_manager_init(SndCardManager *manager); -SndCard * snd_card_manager_get_card(SndCardManager *manager,int index); -SndCard * snd_card_manager_get_card_with_string(SndCardManager *manager,const char *cardname,int *index); - -extern SndCardManager *snd_card_manager; - -#ifdef __cplusplus -} -#endif - -#endif
--- a/src/mediastreamer/test.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "msringplayer.h" -#include "msosswrite.h" -#include "msossread.h" -#include "mscopy.h" -#include "mstimer.h" -#include <unistd.h> -#include <signal.h> - -#define READFILE "../share/rings/orig.wav" -#define WRITEFILE "/tmp/mediaout" - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - - -int main(int argc, char *argv[]) -{ - MSFilter *play,*copy,*rec; - MSSync *timer; - int i=0; - int tmp; - char *ring; - - ms_init(); - - if (argc>1){ - ring=argv[1]; - }else ring= READFILE; - - play=ms_ring_player_new(ring,2); - //play=ms_oss_read_new(0); - rec=snd_card_create_write_filter(snd_card_manager_get_card(snd_card_manager,1)); - copy=ms_copy_new(); - - ms_filter_get_property(play,MS_FILTER_PROPERTY_FREQ,&tmp); - g_message("Playing at rate %i.",tmp); - ms_filter_set_property(rec,MS_FILTER_PROPERTY_FREQ,&tmp); - ms_filter_get_property(play,MS_FILTER_PROPERTY_CHANNELS,&tmp); - g_message("Playing with %i channels",tmp); - ms_filter_set_property(rec,MS_FILTER_PROPERTY_CHANNELS,&tmp); - - timer=ms_timer_new(); - ms_sync_start(timer); - - ms_filter_add_link(play,copy); - ms_filter_add_link(copy,rec); - ms_sync_attach(timer,play); - - - while(cond) - { - sleep(1); - } - ms_sync_detach(timer,play); - ms_sync_stop(timer); - ms_sync_destroy(timer); - - ms_filter_remove_links(play,copy); - ms_filter_remove_links(copy,rec); - ms_filter_destroy(play); - ms_filter_destroy(copy); - ms_filter_destroy(rec); - - return 0; -}
--- a/src/mediastreamer/test_alaw.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "msosswrite.h" -#include "msossread.h" -#include "mscopy.h" -#include "mstimer.h" -#include "msAlawdec.h" -#include "msAlawenc.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - -int main() -{ - MSFilter *play,*enc,*dec,*rec; - MSSync *timer; - - ms_init(); - signal(SIGINT,stop_handler); - - play=ms_oss_read_new(); - rec=ms_oss_write_new(); - - ms_sound_read_set_device(MS_SOUND_READ(play),0); - ms_sound_write_set_device(MS_SOUND_WRITE(rec),0); - - enc=ms_ALAWencoder_new(); - dec=ms_ALAWdecoder_new(); - timer=ms_timer_new(); - - ms_filter_add_link(play,enc); - ms_filter_add_link(enc,dec); - ms_filter_add_link(dec,rec); - ms_sync_attach(timer,play); - - ms_start(timer); - - ms_sound_read_start(MS_SOUND_READ(play)); - ms_sound_write_start(MS_SOUND_WRITE(rec)); - while(cond) - { - sleep(1); - } - - ms_sound_read_stop(MS_SOUND_READ(play)); - ms_sound_write_stop(MS_SOUND_WRITE(rec)); - - printf("stoping sync...\n"); - ms_stop(timer); - printf("unlinking filters...\n"); - ms_filter_remove_links(play,enc); - ms_filter_remove_links(enc,dec); - ms_filter_remove_links(dec,rec); - printf("destroying filters...\n"); - ms_filter_destroy(play); - ms_filter_destroy(enc); - ms_filter_destroy(dec); - ms_filter_destroy(rec); - ms_sync_destroy(timer); - return 0; -}
--- a/src/mediastreamer/test_gsm.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "msosswrite.h" -#include "msossread.h" -#include "mscopy.h" -#include "mstimer.h" -#include "msGSMdecoder.h" -#include "msGSMencoder.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - -int main() -{ - MSFilter *play,*enc,*dec,*rec; - MSSync *timer; - - ms_init(); - signal(SIGINT,stop_handler); - - play=ms_oss_read_new(); - rec=ms_oss_write_new(); - ms_sound_read_set_device(MS_SOUND_READ(play),0); - ms_sound_write_set_device(MS_SOUND_WRITE(rec),0); - - enc=ms_GSMencoder_new(); - dec=ms_GSMdecoder_new(); - timer=ms_timer_new(); - - ms_filter_add_link(play,enc); - ms_filter_add_link(enc,dec); - ms_filter_add_link(dec,rec); - ms_sync_attach(timer,play); - - ms_start(timer); - ms_sound_read_start(MS_SOUND_READ(play)); - ms_sound_write_start(MS_SOUND_WRITE(rec)); - while(cond) - { - sleep(1); - } - ms_sound_read_stop(MS_SOUND_READ(play)); - ms_sound_write_stop(MS_SOUND_WRITE(rec)); - printf("stoping sync...\n"); - ms_stop(timer); - printf("unlinking filters...\n"); - ms_filter_remove_links(play,enc); - ms_filter_remove_links(enc,dec); - ms_filter_remove_links(dec,rec); - printf("destroying filters...\n"); - ms_filter_destroy(play); - ms_filter_destroy(enc); - ms_filter_destroy(dec); - ms_filter_destroy(rec); - ms_sync_destroy(timer); - return 0; -}
--- a/src/mediastreamer/test_lpc10.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "msosswrite.h" -#include "msossread.h" -#include "mscopy.h" -#include "mstimer.h" -#include "msLPC10decoder.h" -#include "msLPC10encoder.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - -int main() -{ - MSFilter *play,*enc,*dec,*rec; - MSSync *timer; - - ms_init(); - signal(SIGINT,stop_handler); - - play=ms_oss_read_new(); - rec=ms_oss_write_new(); - - ms_sound_read_set_device(MS_SOUND_READ(play),0); - ms_sound_write_set_device(MS_SOUND_WRITE(rec),0); - - enc=ms_LPC10encoder_new(); - dec=ms_LPC10decoder_new(); - timer=ms_timer_new(); - - ms_filter_add_link(play,enc); - ms_filter_add_link(enc,dec); - ms_filter_add_link(dec,rec); - ms_sync_attach(timer,play); - - ms_start(timer); - ms_sound_read_start(MS_SOUND_READ(play)); - ms_sound_write_start(MS_SOUND_WRITE(rec)); - - while(cond) - { - sleep(1); - } - ms_sound_read_stop(MS_SOUND_READ(play)); - ms_sound_write_stop(MS_SOUND_WRITE(rec)); - - printf("stoping sync...\n"); - ms_stop(timer); - printf("unlinking filters...\n"); - ms_filter_remove_links(play,enc); - ms_filter_remove_links(enc,dec); - ms_filter_remove_links(dec,rec); - printf("destroying filters...\n"); - ms_filter_destroy(play); - ms_filter_destroy(enc); - ms_filter_destroy(dec); - ms_filter_destroy(rec); - ms_sync_destroy(timer); - return 0; -}
--- a/src/mediastreamer/test_mulaw.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "msosswrite.h" -#include "msossread.h" -#include "mscopy.h" -#include "msnosync.h" -#include "mstimer.h" -#include "msMUlawdec.h" -#include "msMUlawenc.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - -int main() -{ - MSFilter *play,*enc,*dec,*rec; - MSSync *timer; - - ms_init(); - signal(SIGINT,stop_handler); - - play=ms_oss_read_new(); - rec=ms_oss_write_new(); - ms_sound_read_set_device(MS_SOUND_READ(play),0); - ms_sound_write_set_device(MS_SOUND_WRITE(rec),0); - - enc=ms_MULAWencoder_new(); - dec=ms_MULAWdecoder_new(); - timer=ms_timer_new(); - - ms_filter_add_link(play,enc); - ms_filter_add_link(enc,dec); - ms_filter_add_link(dec,rec); - ms_sync_attach(timer,play); - - ms_start(timer); - ms_sound_read_start(MS_SOUND_READ(play)); - ms_sound_write_start(MS_SOUND_WRITE(rec)); - while(cond) - { - sleep(1); - } - ms_sound_read_stop(MS_SOUND_READ(play)); - ms_sound_write_stop(MS_SOUND_WRITE(rec)); - printf("stoping sync...\n"); - ms_stop(timer); - printf("unlinking filters...\n"); - ms_filter_remove_links(play,enc); - ms_filter_remove_links(enc,dec); - ms_filter_remove_links(dec,rec); - printf("destroying filters...\n"); - ms_filter_destroy(play); - ms_filter_destroy(enc); - ms_filter_destroy(dec); - ms_filter_destroy(rec); - ms_sync_destroy(timer); - return 0; -}
--- a/src/mediastreamer/test_rtprecv.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "msrtprecv.h" -#include "ms.h" -#include "mswrite.h" -#include "msosswrite.h" -#include "msMUlawdec.h" -#include "mstimer.h" -#include "msfdispatcher.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - -int main() -{ - MSFilter *play,*dec,*rec,*filerec,*dis; - MSSync *timer; - RtpSession *rtps; - - /*create the rtp session */ - ortp_init(); - ortp_set_debug_file("oRTP",NULL); - rtps=rtp_session_new(RTP_SESSION_RECVONLY); - rtp_session_set_local_addr(rtps,"0.0.0.0",8000); - rtp_session_set_scheduling_mode(rtps,0); - rtp_session_set_blocking_mode(rtps,0); - - ms_init(); - signal(SIGINT,stop_handler); - - play=ms_rtp_recv_new(); - rec=ms_oss_write_new(); - ms_sound_write_set_device(MS_SOUND_WRITE(rec),0); - dec=ms_MULAWdecoder_new(); - filerec=ms_write_new("/tmp/rtpstream"); - dis=ms_fdispatcher_new(); - timer=ms_timer_new(); - - ms_rtp_recv_set_session(MS_RTP_RECV(play),rtps); - - ms_filter_add_link(play,dec); - ms_filter_add_link(dec,dis); - ms_filter_add_link(dis,rec); - ms_filter_add_link(dis,filerec); - ms_sync_attach(timer,play); - printf("gran=%i\n",MS_SYNC(timer)->samples_per_tick); - - ms_start(timer); - ms_sound_write_start(MS_SOUND_WRITE(rec)); - while(cond) - { - sleep(1); - } - - printf("stoping sync...\n"); - ms_stop(timer); - ms_sound_write_stop(MS_SOUND_WRITE(rec)); - printf("unlinking filters...\n"); - ms_filter_remove_links(play,dec); - ms_filter_remove_links(dec,rec); - printf("destroying filters...\n"); - ms_filter_destroy(play); - ms_filter_destroy(dec); - ms_filter_destroy(rec); - ms_filter_destroy(dis); - ms_filter_destroy(filerec); - - rtp_session_destroy(rtps); - ms_sync_destroy(timer); - ortp_global_stats_display(); - - return 0; -}
--- a/src/mediastreamer/test_speex.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "sndcard.h" -#include "mscopy.h" -#include "mstimer.h" -#include "msspeexdec.h" -#include "msspeexenc.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - -int main() -{ - MSFilter *play,*enc,*dec,*rec; - MSSync *timer; - SndCard *card; - int rate=16000; - - ms_init(); - signal(SIGINT,stop_handler); - /* get the first card */ - card=snd_card_manager_get_card(snd_card_manager,0); - if (card==NULL) g_error("No sound card detected."); - - play=snd_card_create_read_filter(card); - rec=snd_card_create_write_filter(card); - - enc=ms_speex_enc_new(); - dec=ms_speex_dec_new(); - - ms_filter_set_property(play,MS_FILTER_PROPERTY_FREQ,&rate); - ms_filter_set_property(rec,MS_FILTER_PROPERTY_FREQ,&rate); - ms_filter_set_property(enc,MS_FILTER_PROPERTY_FREQ,&rate); - ms_filter_set_property(dec,MS_FILTER_PROPERTY_FREQ,&rate); - timer=ms_timer_new(); - - ms_filter_add_link(play,enc); - ms_filter_add_link(enc,dec); - ms_filter_add_link(dec,rec); - ms_sync_attach(timer,play); - - ms_start(timer); - while(cond) - { - sleep(1); - } - printf("stoping sync...\n"); - ms_stop(timer); - printf("unlinking filters...\n"); - ms_filter_remove_links(play,enc); - ms_filter_remove_links(enc,dec); - ms_filter_remove_links(dec,rec); - printf("destroying filters...\n"); - ms_filter_destroy(play); - ms_filter_destroy(enc); - ms_filter_destroy(dec); - ms_filter_destroy(rec); - ms_sync_destroy(timer); - return 0; -}
--- a/src/mediastreamer/test_truespeech.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ - /* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "ms.h" - -#include "msosswrite.h" -#include "msossread.h" -#include "mscopy.h" -#include "mstimer.h" -#include "mstruespeechdecoder.h" -#include "mstruespeechencoder.h" - -#include <signal.h> -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> - -static int cond=1; - -void stop_handler(int signum) -{ - cond=0; -} - - -int main() -{ - MSFilter *play,*enc,*dec,*rec; - MSSync *timer; - - ms_init(); - signal(SIGINT,stop_handler); - - play=ms_oss_read_new(); - rec=ms_oss_write_new(); - - ms_sound_read_set_device(MS_SOUND_READ(play),0); - ms_sound_write_set_device(MS_SOUND_WRITE(rec),0); - - enc=ms_truespeechencoder_new(); - dec=ms_truespeechdecoder_new(); - timer=ms_timer_new(); - - ms_filter_add_link(play,enc); - ms_filter_add_link(enc,dec); - ms_filter_add_link(dec,rec); - ms_sync_attach(timer,play); - - ms_start(timer); - - ms_sound_read_start(MS_SOUND_READ(play)); - ms_sound_write_start(MS_SOUND_WRITE(rec)); - while(cond) - { - sleep(1); - } - - ms_sound_read_stop(MS_SOUND_READ(play)); - ms_sound_write_stop(MS_SOUND_WRITE(rec)); - - printf("stoping sync...\n"); - ms_stop(timer); - printf("unlinking filters...\n"); - ms_filter_remove_links(play,enc); - ms_filter_remove_links(enc,dec); - ms_filter_remove_links(dec,rec); - printf("destroying filters...\n"); - ms_filter_destroy(play); - ms_filter_destroy(dec); - ms_filter_destroy(enc); - ms_filter_destroy(rec); - ms_sync_destroy(timer); - return 0; -}
--- a/src/mediastreamer/test_v4l.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mediastream.h" - - -int main() -{ - VideoStream *v; - ms_init(); - v=video_preview_start("Video4Linux","/dev/video0"); - sleep(5); - video_preview_stop(v); - return 0; -}
--- a/src/mediastreamer/test_videostream.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "mediastream.h" -#include <signal.h> - -static gboolean cond=TRUE; - -static void stop_handler(int signum){ - cond=FALSE; -} - -int main() -{ - VideoStream *v; - ortp_init(); - ms_init(); - signal(SIGINT,stop_handler); - v=video_stream_start(&av_profile,6000,"127.0.0.1",6000, 34, 60, TRUE, "Video4Linux","/dev/video0"); - while(cond) { - ortp_global_stats_display(); - sleep(1); - } - video_stream_stop(v); - ortp_exit(); - return 0; -}
--- a/src/mediastreamer/videostream.c Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,258 +0,0 @@ -/* - The mediastreamer library aims at providing modular media processing and I/O - for linphone, but also for any telephony application. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -#include "mediastream.h" -#include "msvideosource.h" -#include "msavdecoder.h" -#include "msavencoder.h" -#include "msnosync.h" -#include "mssdlout.h" - -#define USE_SDL - -extern void create_duplex_rtpsession(RtpProfile *profile, int locport,char *remip,int remport, - int payload,int jitt_comp, - RtpSession **recvsend); - -#define MAX_RTP_SIZE 5000 - -/* this code is not part of the library itself, it is part of the mediastream program */ -void -video_stream_free (VideoStream * stream) -{ - RtpSession *recvs, *sends; - if (stream->rtprecv != NULL) - { - recvs = ms_rtp_recv_get_session (MS_RTP_RECV (stream->rtprecv)); - if (recvs != NULL) - { - rtp_session_destroy (recvs); - } - ms_filter_destroy (stream->rtprecv); - } - if (stream->rtpsend != NULL) - { - sends = ms_rtp_send_get_session (MS_RTP_SEND (stream->rtpsend)); - if (sends != NULL && sends!=recvs) - { - rtp_session_destroy (sends); - } - ms_filter_destroy (stream->rtpsend); - } - if (stream->source != NULL) - ms_filter_destroy (stream->source); - if (stream->output != NULL) - ms_filter_destroy (stream->output); - if (stream->decoder != NULL) - ms_filter_destroy (stream->decoder); - if (stream->encoder != NULL) - ms_filter_destroy (stream->encoder); - if (stream->timer != NULL) - ms_sync_destroy (stream->timer); - g_free (stream); -} - - -VideoStream * -video_stream_start (RtpProfile *profile, int locport, char *remip, int remport, - int payload, int jitt_comp, gboolean show_local, - const gchar *source, const gchar *device) -{ - VideoStream *stream = g_new0 (VideoStream, 1); - RtpSession *rtps, *rtpr; - PayloadType *pt; - gchar *format; - gint width = VIDEO_SIZE_CIF_W; - gint height = VIDEO_SIZE_CIF_H; - gfloat fps; - - create_duplex_rtpsession(profile,locport,remip,remport,payload,jitt_comp,&rtpr); - rtp_session_enable_adaptive_jitter_compensation(rtpr,FALSE); - rtps=rtpr; - ms_trace("sending video to %s:%i", remip4, remport); - - /* creates two rtp filters to recv send streams (remote part) */ - rtp_session_max_buf_size_set(rtpr,MAX_RTP_SIZE); - stream->rtpsend = ms_rtp_send_new (); - if (remport>0) ms_rtp_send_set_session (MS_RTP_SEND (stream->rtpsend), rtps); - - - stream->rtprecv = ms_rtp_recv_new (); - ms_rtp_recv_set_session (MS_RTP_RECV (stream->rtprecv), rtpr); - - pt=rtp_profile_get_payload(profile,payload); - if (pt==NULL){ - g_error("videostream.c: undefined payload type."); - return NULL; - } - ms_trace("videostream.c: getting codecs for %s", pt->mime_type); - - /* creates the filters */ - stream->source = ms_filter_new_with_name(source); - if (stream->source == NULL){ - g_error("videostream.c: failed to create video source %s.", source); - return NULL; - } - -#ifdef USE_SDL - stream->output=ms_sdl_out_new(); -#else - stream->output = MS_FILTER(ms_video_output_new ()); -#endif - stream->encoder=ms_encoder_new_with_string_id(pt->mime_type); - g_message("Video encoder created: %x",stream->encoder); - stream->decoder=ms_decoder_new_with_string_id(pt->mime_type); - if ((stream->encoder==NULL) || (stream->decoder==NULL)){ - /* big problem: we have not a registered codec for this payload...*/ - video_stream_free(stream); - g_error("videostream.c: No codecs available for payload %i.",payload); - return NULL; - } - - /* configure the filters */ - ms_video_source_set_device(MS_VIDEO_SOURCE(stream->source), device); - ms_video_source_set_size(MS_VIDEO_SOURCE(stream->source), width, height); - ms_video_source_set_frame_rate(MS_VIDEO_SOURCE(stream->source), 8, 1); - fps = MS_VIDEO_SOURCE(stream->source)->frame_rate / MS_VIDEO_SOURCE(stream->source)->frame_rate_base; - format = ms_video_source_get_format(MS_VIDEO_SOURCE(stream->source)); - - ms_AVencoder_set_format (MS_AVENCODER (stream->encoder), format); - ms_AVencoder_set_width(MS_AVENCODER(stream->encoder), width); - ms_AVencoder_set_height(MS_AVENCODER(stream->encoder), height); - /* bitrate is based upon 30fps? adjust by our possibly lower framerate */ - ms_AVencoder_set_bit_rate(MS_AVENCODER(stream->encoder), pt->normal_bitrate * 30 / fps ); - ms_AVdecoder_set_format (MS_AVDECODER (stream->decoder), "YUV420P"); - ms_AVdecoder_set_width(MS_AVDECODER(stream->decoder), width); - ms_AVdecoder_set_height(MS_AVDECODER(stream->decoder), height); -#ifdef USE_SDL - /* we suppose our decoder and pin1 of encoder always outputs YUV420P */ - ms_sdl_out_set_format(MS_SDL_OUT(stream->output),"YUV420P"); -#else - ms_video_output_set_size (MS_VIDEO_OUTPUT (stream->output), width, height); -#endif - - /* and then connect all */ - ms_filter_add_link (stream->source, stream->encoder); - ms_filter_add_link (stream->encoder, stream->rtpsend); - - ms_filter_add_link (stream->rtprecv, stream->decoder); - ms_filter_add_link (stream->decoder, stream->output); - if (show_local) - ms_filter_add_link(stream->encoder,stream->output); - - /* create the synchronisation source */ - stream->timer = ms_timer_new(); - ms_sync_attach (stream->timer, stream->source); - ms_sync_attach (stream->timer, stream->rtprecv); - - /* and start */ - ms_video_source_start(MS_VIDEO_SOURCE(stream->source)); - ms_start (stream->timer); - stream->show_local=show_local; - return stream; -} - - - -void -video_stream_stop (VideoStream * stream) -{ - - ms_stop (stream->timer); - ms_video_source_stop (MS_VIDEO_SOURCE(stream->source)); - ms_sync_detach (stream->timer, stream->source); - ms_sync_detach (stream->timer, stream->rtprecv); - - ms_filter_remove_links(stream->source,stream->encoder); - ms_filter_remove_links (stream->encoder, - stream->rtpsend); - - ms_filter_remove_links (stream->rtprecv, - stream->decoder); - ms_filter_remove_links (stream->decoder, - stream->output); - if (stream->show_local) { - ms_filter_remove_links (stream->encoder, - stream->output); - } - video_stream_free (stream); -} - - -void video_stream_set_rtcp_information(VideoStream *st, const char *cname){ - if (st->send_session!=NULL){ - rtp_session_set_source_description(st->send_session,cname,NULL,NULL,NULL,NULL,"linphone-" LINPHONE_VERSION, - "This is free software (GPL) !"); - } -} - - - -VideoStream * video_preview_start(const gchar *source, const gchar *device){ - VideoStream *stream = g_new0 (VideoStream, 1); - gchar *format; - gint width = VIDEO_SIZE_CIF_W; - gint height = VIDEO_SIZE_CIF_H; - - /* creates the filters */ - stream->source = ms_filter_new_with_name(source); - if (stream->source == NULL){ - g_error("videostream.c: failed to create video source %s.", source); - return NULL; - } -#ifdef USE_SDL - stream->output=ms_sdl_out_new(); -#else - stream->output = ms_video_output_new (); -#endif - /* configure the filters */ - ms_video_source_set_device(MS_VIDEO_SOURCE(stream->source), device); - ms_video_source_set_size(MS_VIDEO_SOURCE(stream->source), width, height); - ms_video_source_set_frame_rate(MS_VIDEO_SOURCE(stream->source), 8, 1); - format = ms_video_source_get_format(MS_VIDEO_SOURCE(stream->source)); - -#ifdef USE_SDL - ms_sdl_out_set_format(MS_SDL_OUT(stream->output),format); -#else - ms_video_output_set_format(MS_VIDEO_OUTPUT(stream->output),format); - ms_video_output_set_size (MS_VIDEO_OUTPUT (stream->output), width, height); - ms_video_output_set_title(MS_VIDEO_OUTPUT(stream->output),"Linphone Video"); -#endif - /* and then connect all */ - ms_filter_add_link (stream->source, stream->output); - /* create the synchronisation source */ - stream->timer = ms_timer_new(); - ms_sync_attach (stream->timer, stream->source); - - /* and start */ - ms_video_source_start(MS_VIDEO_SOURCE(stream->source)); - ms_start (stream->timer); - - return stream; -} - -void video_preview_stop(VideoStream *stream){ - ms_stop (stream->timer); - ms_video_source_stop (MS_VIDEO_SOURCE(stream->source)); - ms_sync_detach (stream->timer, stream->source); - ms_filter_remove_links(stream->source,stream->output); - video_stream_free(stream); -}
--- a/src/mediastreamer/waveheader.h Wed Feb 15 23:02:50 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/* -linphone -Copyright (C) 2000 Simon MORLAT (simon.morlat@free.fr) - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* the following code was taken from a free software utility that I don't remember the name. */ -/* sorry */ - - - -#include <ms.h> -#ifndef waveheader_h -#define waveheader_h - -typedef struct uint16scheme -{ - unsigned char lo_byte; - unsigned char hi_byte; -} uint16scheme_t; - -typedef struct uint32scheme -{ - guint16 lo_int; - guint16 hi_int; -} uint32scheme_t; - - -/* all integer in wav header must be read in least endian order */ -inline guint16 _readuint16(guint16 a) -{ - guint16 res; - uint16scheme_t *tmp1=(uint16scheme_t*)&a; - - ((uint16scheme_t *)(&res))->lo_byte=tmp1->hi_byte; - ((uint16scheme_t *)(&res))->hi_byte=tmp1->lo_byte; - return res; -} - -inline guint32 _readuint32(guint32 a) -{ - guint32 res; - uint32scheme_t *tmp1=(uint32scheme_t*)&a; - - ((uint32scheme_t *)(&res))->lo_int=_readuint16(tmp1->hi_int); - ((uint32scheme_t *)(&res))->hi_int=_readuint16(tmp1->lo_int); - return res; -} - -#ifdef WORDS_BIGENDIAN -#define le_uint32(a) (_readuint32((a))) -#define le_uint16(a) (_readuint16((a))) -#define le_int16(a) ( (gint16) _readuint16((guint16)((a))) ) -#else -#define le_uint32(a) (a) -#define le_uint16(a) (a) -#define le_int16(a) (a) -#endif - -typedef struct _riff_t { - char riff[4] ; /* "RIFF" (ASCII characters) */ - guint32 len ; /* Length of package (binary, little endian) */ - char wave[4] ; /* "WAVE" (ASCII characters) */ -} riff_t; - -/* The FORMAT chunk */ - -typedef struct _format_t { - char fmt[4] ; /* "fmt_" (ASCII characters) */ - guint32 len ; /* length of FORMAT chunk (always 0x10) */ - guint16 que ; /* Always 0x01 */ - guint16 channel ; /* Channel numbers (0x01 = mono, 0x02 = stereo) */ - guint32 rate ; /* Sample rate (binary, in Hz) */ - guint32 bps ; /* Bytes Per Second */ - guint16 bpsmpl ; /* bytes per sample: 1 = 8 bit Mono, - 2 = 8 bit Stereo/16 bit Mono, - 4 = 16 bit Stereo */ - guint16 bitpspl ; /* bits per sample */ -} format_t; - -/* The DATA chunk */ - -typedef struct _data_t { - char data[4] ; /* "data" (ASCII characters) */ - int len ; /* length of data */ -} data_t; - -typedef struct _wave_header_t -{ - riff_t riff_chunk; - format_t format_chunk; - data_t data_chunk; -} wave_header_t; - -#define wave_header_get_rate(header) le_uint32((header)->format_chunk.rate) -#define wave_header_get_channel(header) le_uint16((header)->format_chunk.channel) - -#endif
--- a/src/prpl.h Wed Feb 15 23:02:50 2006 +0000 +++ b/src/prpl.h Thu Feb 16 00:45:23 2006 +0000 @@ -68,7 +68,6 @@ #include "ft.h" #include "proxy.h" #include "plugin.h" -#include "media.h" #include "roomlist.h" #include "status.h" #include "whiteboard.h" @@ -299,7 +298,6 @@ gboolean (*offline_message)(const GaimBuddy *buddy); GaimWhiteboardPrplOps *whiteboard_prpl_ops; - GaimMediaPrplOps *media_prpl_ops; }; #define GAIM_IS_PROTOCOL_PLUGIN(plugin) \
--- a/src/server.c Wed Feb 15 23:02:50 2006 +0000 +++ b/src/server.c Thu Feb 16 00:45:23 2006 +0000 @@ -825,14 +825,3 @@ } } } - -void serv_voice_chat(GaimConnection *gc, const char *who) -{ - GaimPluginProtocolInfo *prpl_info = NULL; - - if (gc != NULL && gc->prpl != NULL) - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); - - if (prpl_info && prpl_info->media_prpl_ops && prpl_info->media_prpl_ops->call) - prpl_info->media_prpl_ops->call(gc, who); -}