Wireshark-dev: Re: [Wireshark-dev] listen_rtp plugin
From: Alejandro Vaquero <[email protected]>
Date: Sun, 02 Jul 2006 14:48:52 -0700
Hi,
Here is a new patch against the current SVN. Also commented out the "PORTAUDIO" variable inf config.nmake. And fixed the warnings in voip_calls.c and voip_calls_dlg.c
Regards
Alejandro

Anders Broman wrote:
Hi,
I have checked in the plugin files for now there are some problems
With applying the change to the makefiles can you please redo the
Patch against the current SVN. I would also suggest to leave "PORTAUDIO" commented out in these first checkins.
There are also some warnings from voip_calls.c

Best regards
Anders

C:\wireshark>patch acinclude.m4 listen_rtp.patch
patching file acinclude.m4
Hunk #2 FAILED at 1592.
1 out of 2 hunks FAILED -- saving rejects to file acinclude.m4.rej
patching file config.nmake
patching file configure.in
Reversed (or previously applied) patch detected!  Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
6 out of 6 hunks ignored -- saving rejects to file configure.in.rej
can't find file to patch at input line 449
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|Index: gtk/voip_calls.c
|===================================================================
|--- gtk/voip_calls.c   (revision 18459)
|+++ gtk/voip_calls.c   (working copy)
--------------------------
File to patch: gtk/voip_calls.c
patching file gtk/voip_calls.c
can't find file to patch at input line 509
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|Index: gtk/voip_calls_dlg.c
|===================================================================
|--- gtk/voip_calls_dlg.c       (revision 18459)
|+++ gtk/voip_calls_dlg.c       (working copy)
--------------------------
File to patch: gtk/voip_calls_dlg.c
patching file gtk/voip_calls_dlg.c
patching file Makefile.am
Hunk #3 succeeded at 238 (offset 1 line).
Hunk #4 succeeded at 258 (offset 1 line).
patching file Makefile.nmake
patching file Makefile.nmake
Hunk #1 FAILED at 18.
Hunk #2 FAILED at 90.
Hunk #3 FAILED at 193.
Hunk #4 FAILED at 252.
Hunk #5 FAILED at 303.
Hunk #6 FAILED at 353.
6 out of 6 hunks FAILED -- saving rejects to file Makefile.nmake.rej
patching file Makefile.am
Hunk #1 FAILED at 28.
Hunk #2 FAILED at 47.
2 out of 2 hunks FAILED -- saving rejects to file Makefile.am.rej
patching file Makefile.am
Hunk #1 FAILED at 28.
Hunk #2 FAILED at 47.
2 out of 2 hunks FAILED -- saving rejects to file Makefile.am.rej
patching file Makefile.nmake
Hunk #1 FAILED at 18.
Hunk #2 FAILED at 90.
Hunk #3 FAILED at 193.
Hunk #4 FAILED at 252.
Hunk #5 FAILED at 303.
Hunk #6 FAILED at 353.
6 out of 6 hunks FAILED -- saving rejects to file Makefile.nmake.rej

C:\wireshark>

voip_calls.c
voip_calls.c(499) : warning C4090: 'function' : different 'const' qualifiers
voip_calls.c(499) : warning C4024: 'function through pointer' : different
types
for formal and actual parameter 2
voip_calls.c(499) : warning C4133: 'function' : incompatible types - from
'struc
t _packet_info *' to 'struct _proto_node *'
sctp_assoc_analyse.c
voip_calls_dlg.c
voip_calls_dlg.c(413) : warning C4133: 'function' : incompatible types -
from 's
truct _voip_calls_tapinfo *' to 'struct tvbuff *'
Generating Code...

-----Ursprungligt meddelande-----
Från: [email protected]
[mailto:[email protected]] För Alejandro Vaquero
Skickat: den 27 juni 2006 05:38
Till: [email protected]
Ämne: [Wireshark-dev] listen_rtp plugin

Hi All,
Here is the "listen_rtp" plugin that allows to listen audio RTP conversations.
    The plugin is integrated to the "Voip Calls" feature. There is a new 
"listen" button in the "Voip Calls" that once the calls are selected and 
the "listen" is clicked, a new window will open. In this window you can 
change the simulated jitter buffer to be used for decoding the RTP 
packets. In this first implementation, only a static jitter buffer can 
be simulated. Then pressing "decode" will decode all the RTP and 
generate the graphical view of the audio channels. From there you can 
select up to two channels at the same time (to be played in the left and 
right channels) and then play, pause, stop,etc.....ok, the attached 
screenshot it is self explanatory (hopefully).
    The only codecs available from now are G711u and G711a law.

The PortAudio (www.portaudio.com) library is used to play audio. This is an open source cross-platform Audio library. I have tested this on Windows XP and in a linux FC4.
    I modified the Makefile.nmake and Makfile.am files, acinclude.m4, 
config.nmake and configure.in to be compiled in Windows VC6 and Linux 
(thanks Luis for the lua staff as I was totally lost here). Not sure 
what else it is needed for other platforms.
    For windows, the user can comment the PORTAUDIO_DIR parameter in the 
config.nmake file to avoid the plugin to be compiled.
    For linux, by default the plugin is not compiled unless the user 
uses the "--with-portaudio" argument when running "configure". To be 
compiled in linux, the "portaudio" package needs to be installed.
    The attached files contain:
listen_rtp.patch: this is a patch that has the changes for the "Voip Calls" files, and all the Makefiles and auto staff.
listen_rtp.zip: the plugin files to be added to the plugin directory
portaudio_v18_1.zip: this file is the PortAudio Window library that need to be downloaded when using "nmake -f Makefile setup".
listen_rtp_screenshot.png: A screen shot of the plugin.

TODO:
   - Tests in other platforms.
- Make the changes in the Windows installer, to have the option to install it or not (same as the Lua plugin). I don't know where to start looking for this. Any comment or enhancement are very welcome.
Regards
Alejandro



_______________________________________________
Wireshark-dev mailing list
[email protected]
http://www.wireshark.org/mailman/listinfo/wireshark-dev

Index: acinclude.m4
===================================================================
--- acinclude.m4	(revision 18636)
+++ acinclude.m4	(working copy)
@@ -933,6 +933,132 @@
 ])
 
 #
+# AC_WIRESHARK_LIBPORTAUDIO_CHECK
+#
+AC_DEFUN([AC_WIRESHARK_LIBPORTAUDIO_CHECK],[
+
+	if test "x$portaudio_dir" != "x"
+	then
+		#
+		# The user specified a directory in which libportaudio
+		# resides, so add the "include" subdirectory of that directory to
+		# the include file search path and the "lib" subdirectory
+		# of that directory to the library search path.
+		#
+		# XXX - if there's also a libportaudio in a directory that's
+		# already in CFLAGS, CPPFLAGS, or LDFLAGS, this won't
+		# make us find the version in the specified directory,
+		# as the compiler and/or linker will search that other
+		# directory before it searches the specified directory.
+		#
+		wireshark_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS -I$portaudio_dir/include"
+		wireshark_save_CPPFLAGS="$CPPFLAGS"
+		CPPFLAGS="$CPPFLAGS -I$portaudio_dir/include"
+		wireshark_save_LIBS="$LIBS"
+		LIBS="$LIBS -L$portaudio_dir/lib -lportaudio"
+		wireshark_save_LDFLAGS="$LDFLAGS"
+		LDFLAGS="$LDFLAGS -L$portaudio_dir/lib"
+	else 
+		#
+		# The user specified no directory in which libportaudio resides,
+		# so just add "-lportaudio" to the used libs.
+		#
+		wireshark_save_CFLAGS="$CFLAGS"
+		wireshark_save_CPPFLAGS="$CPPFLAGS"
+		wireshark_save_LDFLAGS="$LDFLAGS"
+		wireshark_save_LIBS="$LIBS"
+		LIBS="$LIBS -lportaudio"
+	fi
+
+	#
+	# Make sure we have "portaudio.h".  If we don't, it means we probably
+	# don't have libportaudio, so don't use it.
+	#
+	AC_CHECK_HEADERS(portaudio.h,,
+	[
+		if test "x$portaudio_dir" != "x"
+		then
+			#
+			# The user used "--with-portaudio=" to specify a directory
+			# containing libportaudio, but we didn't find the header file
+			# there; that either means they didn't specify the
+			# right directory or are confused about whether libportaudio
+			# is, in fact, installed.  Report the error and give up.
+			#
+			AC_MSG_ERROR([libportaudio header not found in directory specified in --with-portaudio])
+		else
+			if test "x$want_portaudio" = "xyes"
+			then
+				#
+				# The user tried to force us to use the library, but we
+				# couldn't find the header file; report an error.
+				#
+				AC_MSG_ERROR(Header file portaudio.h not found.)
+			else
+				#
+				# We couldn't find the header file; don't use the
+				# library, as it's probably not present.
+				#
+				want_portaudio=no
+			fi
+		fi
+	])
+
+	if test "x$want_portaudio" != "xno"
+	then
+		#
+		# Well, we at least have the portaudio header file.
+		#
+		# let's check if the libs are there
+		#
+
+		AC_CHECK_LIB(portaudio, Pa_Initialize,
+		[
+			if test "x$portaudio_dir" != "x"
+			then
+				#
+				# Put the "-I" and "-L" flags for portaudio at
+				# the beginning of CFLAGS, CPPFLAGS,
+				# LDFLAGS, and LIBS.
+				#
+				PORTAUDIO_LIBS="-L$portaudio_dir/lib -lportaudio"
+				PORTAUDIO_INCLUDES="-I$portaudio_dir/include"
+			else
+				PORTAUDIO_LIBS="-lportaudio"
+				PORTAUDIO_INCLUDES=""
+			fi
+		],[  
+			#
+			# Restore the versions of CFLAGS, CPPFLAGS,
+			# LDFLAGS, and LIBS before we added the
+			# "--with-portaudio=" directory, as we didn't
+			# actually find portaudio there.
+			#
+			CFLAGS="$wireshark_save_CFLAGS"
+			CPPFLAGS="$wireshark_save_CPPFLAGS"
+			LDFLAGS="$wireshark_save_LDFLAGS"
+			LIBS="$wireshark_save_LIBS"
+			PORTAUDIO_LIBS=""
+			# User requested --with-portaudio but it isn't available
+			if test "x$want_portaudio" = "xyes"
+			then
+				AC_MSG_ERROR(Linking with libportaudio failed.)
+			fi
+			want_portaudio=no
+		])
+
+	CFLAGS="$wireshark_save_CFLAGS"
+	CPPFLAGS="$wireshark_save_CPPFLAGS"
+	LDFLAGS="$wireshark_save_LDFLAGS"
+	LIBS="$wireshark_save_LIBS"
+	AC_SUBST(PORTAUDIO_LIBS)
+	AC_SUBST(PORTAUDIO_INCLUDES)
+
+	fi
+])
+
+#
 # AC_WIRESHARK_NETSNMP_CHECK
 #
 AC_DEFUN([AC_WIRESHARK_NETSNMP_CHECK],
Index: config.nmake
===================================================================
--- config.nmake	(revision 18636)
+++ config.nmake	(working copy)
@@ -171,6 +171,16 @@
 LUA_DIR=$(WIRESHARK_LIBS)\lua5.1
 
 #
+# If you have the PORTAUDIO library (used por listen_rtp plugin), 
+# set this to the pathname of the directory in which the PORTAUDIO
+# package has been extracted.
+#
+# If you don't have PORTAUDIO, comment this line out, so that 
+# PORTAUDIO_DIR isn't defined.
+#
+#PORTAUDIO_DIR=$(WIRESHARK_LIBS)\portaudio_v18_1
+
+#
 # Set ICONV_DIR to the pathname of the directory in which the
 # ICONV include files and library resides.
 #
@@ -452,5 +462,12 @@
 LUA_CONFIG=
 !ENDIF
 
+!IFDEF PORTAUDIO_DIR
+# Nmake uses carets to escape special characters
+PORTAUDIO_CONFIG=^#define HAVE_PORTAUDIO 1
+!else
+PORTAUDIO_CONFIG=
+!ENDIF
+
 # Construct the path
 PATH=$(PATH);$(CYGWIN_PATH);$(DLL_PATH);$(ZLIB_PATH);$(ADNS_PATH)
Index: configure.in
===================================================================
--- configure.in	(revision 18636)
+++ configure.in	(working copy)
@@ -818,6 +818,41 @@
 AM_CONDITIONAL(HAVE_LIBLUA, test x$want_lua = xyes)
 
 
+dnl portaudio check
+AC_MSG_CHECKING(whether to use libportaudio for the listen_rtp plugin)
+
+AC_ARG_WITH(portaudio,
+[  --with-portaudio[[=DIR]]  use libportaudio (located in directory DIR, if supplied) for the listen_rtp plugin.  [[default=no]]],
+[
+	if test $withval = no
+	then
+		want_portaudio=no
+	elif test $withval = yes
+	then
+		want_portaudio=yes
+	else
+		want_portaudio=yes
+		portaudio_dir=$withval
+	fi
+],[
+	#
+	# Don't use libportaudio by default
+	#
+	want_portaudio=no
+	portaudio_dir=
+])
+if test "x$want_portaudio" = "xno" ; then
+	AC_MSG_RESULT(no)
+else
+	AC_MSG_RESULT(yes)
+	AC_WIRESHARK_LIBPORTAUDIO_CHECK
+	if test "x$want_portaudio" = "xno" ; then
+		AC_MSG_RESULT(libportaudio not found - disabling support for the listen_rtp plugin)
+	fi
+fi
+AM_CONDITIONAL(HAVE_LIBPORTAUDIO, test x$want_portaudio = xyes)
+
+
 dnl ipv6 check
 AC_ARG_ENABLE(ipv6,
 [  --enable-ipv6           use ipv6 name resolution, if available.  [default=yes]],enable_ipv6=$enableval,enable_ipv6=yes)
@@ -1344,6 +1379,7 @@
   plugins/gryphon/Makefile
   plugins/h223/Makefile
   plugins/irda/Makefile
+  plugins/listen_rtp/Makefile
   plugins/lua/Makefile
   plugins/lwres/Makefile
   plugins/mate/Makefile
@@ -1390,6 +1426,12 @@
 	lua_message="no"
 fi
 
+if test "x$want_portaudio" = "xyes" -a "x$have_plugins" = "xyes" ; then
+	portaudio_message="yes"
+else
+	portaudio_message="no"
+fi
+
 if test "x$want_ssl" = "xno" ; then
 	ssl_message="no"
 else
@@ -1432,6 +1474,7 @@
 echo "                     Install setuid : $setuid_message"
 echo "                        Use plugins : $have_plugins"
 echo "                   Build lua plugin : $lua_message"
+echo "            Build listen_rtp plugin : $portaudio_message"
 echo "                Use GTK+ v2 library : $enable_gtk2"
 if test "x$enable_gtk2" = "xyes" ; then
 echo "                       Use threads : $enable_threads"
Index: gtk/voip_calls.c
===================================================================
--- gtk/voip_calls.c	(revision 18636)
+++ gtk/voip_calls.c	(working copy)
@@ -64,7 +64,16 @@
 
 #include "alert_box.h"
 #include "simple_dialog.h"
+static dissector_handle_t listen_rtp_handle = NULL;
+typedef void (*fake_dissector_t)(void *, const void *, void *);
 
+struct dissector_handle {
+	const char	*name;		/* dissector name */
+	gboolean	is_new;		/* TRUE if new-style dissector */
+	fake_dissector_t	dissector;
+	protocol_t	*protocol;
+};
+
 const char *voip_call_state_name[7]={
 	"CALL SETUP",
 	"RINGING",
@@ -124,6 +133,9 @@
 	GList* list;
 	GList* list2;
 
+	/* if there is listen RTP plugin, then reset it */
+	if (listen_rtp_handle) (*listen_rtp_handle->dissector)(NULL, NULL, NULL); 
+
 	/* free the data items first */
 	list = g_list_first(tapinfo->strinfo_list);
 	while (list)
@@ -191,6 +203,7 @@
 	the_tapinfo_struct.graph_analysis->nconv = 0;
 	the_tapinfo_struct.graph_analysis->list = NULL;
 
+	listen_rtp_handle = find_dissector("listenrtp");
 }
 
 /****************************************************************************/
@@ -466,7 +479,7 @@
 /****************************************************************************/
 /* whenever a RTP packet is seen by the tap listener */
 static int 
-RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *RTPinfo)
+RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, void const *RTPinfo)
 {
 	voip_rtp_tapinfo_t *tapinfo = &the_tapinfo_rtp_struct;
 	voip_rtp_stream_info_t *tmp_listinfo;
@@ -481,6 +494,9 @@
 		return 0;
 	}
 
+	/* if we have the listen_rtp plugin, add this RTP for future listening */
+	if (listen_rtp_handle) (*listen_rtp_handle->dissector)(NULL, pi, pinfo); 
+
 	/* check wether we already have a RTP stream with this setup frame and ssrc in the list */
 	list = g_list_first(tapinfo->list);
 	while (list)
@@ -659,6 +675,10 @@
 	have_RTP_tap_listener=FALSE;
 }
 
+/* XXX just copied from gtk/rpc_stat.c */
+void protect_thread_critical_region(void);
+void unprotect_thread_critical_region(void);
+
 /****************************************************************************/
 /******************************TAP for T38 **********************************/
 /****************************************************************************/
Index: gtk/voip_calls_dlg.c
===================================================================
--- gtk/voip_calls_dlg.c	(revision 18636)
+++ gtk/voip_calls_dlg.c	(working copy)
@@ -70,7 +70,17 @@
 #include <epan/addr_resolv.h>
  
 static const gchar FWD_LABEL_TEXT[] = "Select one call.";
+static dissector_handle_t listen_rtp_handle = NULL;
+typedef void (*fake_dissector_t)(void *, const void *, void *);
 
+
+struct dissector_handle {
+	const char	*name;		/* dissector name */
+	gboolean	is_new;		/* TRUE if new-style dissector */
+	fake_dissector_t	dissector;
+	protocol_t	*protocol;
+};
+
 /****************************************************************************/
 /* pointer to the one and only dialog window */
 static GtkWidget *voip_calls_dlg = NULL;
@@ -83,8 +93,8 @@
 /*static GtkWidet *bt_unselect = NULL;*/
 static GtkWidget *bt_filter = NULL;
 static GtkWidget *bt_graph = NULL;
+static GtkWidget *bt_listen = NULL;
 
-
 static voip_calls_info_t* selected_call_fwd = NULL;  /* current selection */
 static GList *last_list = NULL;
 
@@ -231,6 +241,7 @@
 	/*gtk_widget_set_sensitive(bt_unselect, FALSE);*/
 	gtk_widget_set_sensitive(bt_filter, FALSE);
 	gtk_widget_set_sensitive(bt_graph, FALSE);
+	gtk_widget_set_sensitive(bt_listen, FALSE);
 }
 
 
@@ -395,6 +406,14 @@
 }
 
 /****************************************************************************/
+static void
+on_listen_bt_clicked                    (GtkButton       *button _U_,
+                                        gpointer         user_data _U_)
+{
+	if (listen_rtp_handle) (*listen_rtp_handle->dissector)(voip_calls_get_info(), NULL, NULL); 
+}
+
+/****************************************************************************/
 /* when the user selects a row in the calls list */
 static void
 voip_calls_on_select_row(GtkCList *clist,
@@ -443,9 +462,11 @@
 	if 	(calls_ns > 0) {
 		gtk_widget_set_sensitive(bt_filter, TRUE);
 		gtk_widget_set_sensitive(bt_graph, TRUE);
+		if (listen_rtp_handle) gtk_widget_set_sensitive(bt_listen, TRUE); /* we have the listen_rtp plugin */
 	} else {
 		gtk_widget_set_sensitive(bt_filter, FALSE);
 		gtk_widget_set_sensitive(bt_graph, FALSE);
+		gtk_widget_set_sensitive(bt_listen, FALSE);
 	}
 
 	/* TODO: activate other buttons when implemented */
@@ -650,6 +671,12 @@
 	SIGNAL_CONNECT(bt_graph, "clicked", on_graph_bt_clicked, NULL);
 	gtk_tooltips_set_tip (tooltips, bt_graph, "Show a flow graph of the selected calls.", NULL);
 
+	bt_listen = gtk_button_new_with_label("Listen");
+	gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_listen);
+	gtk_widget_show(bt_listen);
+	SIGNAL_CONNECT(bt_listen, "clicked", on_listen_bt_clicked, NULL);
+	gtk_tooltips_set_tip (tooltips, bt_listen, "Listen the RTP for selected calls.", NULL);
+
 	bt_close = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE);
 	gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close);
 	GTK_WIDGET_SET_FLAGS(bt_close, GTK_CAN_DEFAULT);
@@ -817,5 +844,6 @@
 	register_stat_cmd_arg("voip,calls",voip_calls_init_tap,NULL);
 	register_stat_menu_item("VoIP Calls", REGISTER_STAT_GROUP_TELEPHONY,
 	    voip_calls_launch, NULL, NULL, NULL);
+	listen_rtp_handle = find_dissector("listenrtp");
 	    
 }
Index: Makefile.am
===================================================================
--- Makefile.am	(revision 18636)
+++ Makefile.am	(working copy)
@@ -192,6 +192,12 @@
 lua_lib =
 endif		# HAVE_LIBLUA
 
+if HAVE_LIBPORTAUDIO
+listen_rtp_lib = plugins/listen_rtp/listen_rtp.la
+else		# HAVE_LIBPORTAUDIO
+listen_rtp_lib =
+endif		# HAVE_LIBPORTAUDIO
+
 plugin_libs = \
 	plugins/acn/acn.la \
 	plugins/agentx/agentx.la \
@@ -204,6 +210,7 @@
 	plugins/giop/coseventcomm.la \
 	plugins/gryphon/gryphon.la \
 	plugins/irda/irda.la \
+	$(listen_rtp_lib) \
 	$(lua_lib) \
 	plugins/lwres/lwres.la \
 	plugins/mate/mate.la \
@@ -231,6 +238,12 @@
 lua_ldadd =
 endif		# HAVE_LIBLUA
 
+if HAVE_LIBPORTAUDIO
+listen_rtp_ldadd = "-dlopen" plugins/listen_rtp/listen_rtp.la
+else		# HAVE_LIBPORTAUDIO
+listen_rtp_ldadd =
+endif		# HAVE_LIBPORTAUDIO
+
 plugin_ldadd = \
 	"-dlopen" self	\
 	"-dlopen" plugins/acn/acn.la \
@@ -245,6 +258,7 @@
 	"-dlopen" plugins/gryphon/gryphon.la \
 	"-dlopen" plugins/h223/h223.la \
 	"-dlopen" plugins/irda/irda.la \
+	$(listen_rtp_ldadd) \
 	$(lua_ldadd) \
 	"-dlopen" plugins/lwres/lwres.la \
 	"-dlopen" plugins/mate/mate.la \
Index: Makefile.nmake
===================================================================
--- Makefile.nmake	(revision 18636)
+++ Makefile.nmake	(working copy)
@@ -235,6 +235,7 @@
 	    -e "s/@[email protected]/$(GNUTLS_CONFIG)/" \
 	    -e "s/@[email protected]/$(LUA_CONFIG)/" \
 	    -e "s/@[email protected]/$(LUA_VERSION)/" \
+		-e "s/@[email protected]/$(PORTAUDIO_CONFIG)/" \
 	    < config.h.win32 > [email protected]
 
 ps.c	: rdps.exe print.ps
@@ -519,6 +520,10 @@
 	@$(SH) tools\win32-setup.sh --download "$(WIRESHARK_LIBS)" \
 		. lua5_1_vc6.zip
 !ENDIF
+!IFDEF PORTAUDIO_DIR
+	@$(SH) tools\win32-setup.sh --download "$(WIRESHARK_LIBS)" \
+		. portaudio_v18_1.zip
+!ENDIF
 !IFDEF GTK2_DIR
 !IF "$(GTK2_INST_VERSION)" == "2.8"
 	@$(SH) tools\win32-setup.sh --download "$(WIRESHARK_LIBS)" \

Property changes on: plugins
___________________________________________________________________
Name: svn:ignore
   - Makefile
Makefile.in
xyzzy
*.obj
*.pdb


Index: plugins/Makefile.nmake
===================================================================
--- plugins/Makefile.nmake	(revision 18636)
+++ plugins/Makefile.nmake	(working copy)
@@ -18,6 +18,7 @@
 	gryphon \
 	h223 \
 	irda \
+	listen_rtp \
 	lua\
 	lwres \
 	mate \
@@ -90,6 +91,13 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
 	cd ..
 
+listen_rtp::
+!IFDEF PORTAUDIO_DIR
+	cd listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
+	cd ..
+!ENDIF
+
 lua::
 !IFDEF LUA_DIR
 	cd lua
@@ -191,6 +199,8 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
 	cd ../irda
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
+	cd ../listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
 	cd ../lua
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
 	cd ../lwres
@@ -250,6 +260,8 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
 	cd ../lwres
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
+	cd ../listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
 	cd ../mate
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
 	cd ../megaco
@@ -301,6 +313,8 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
 	cd ../irda
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
+	cd ../listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
 	cd ../lua
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
 	cd ../lwres
@@ -351,6 +365,9 @@
 	xcopy gryphon\*.dll $(VERSION) /d
 	xcopy h223\*.dll $(VERSION) /d
 	xcopy irda\*.dll $(VERSION) /d
+!IFDEF PORTAUDIO_DIR
+	xcopy listen_rtp\*.dll $(VERSION) /d
+!ENDIF
 !IFDEF LUA_DIR
 	xcopy lua\*.dll $(VERSION) /d
 !ENDIF
Index: plugins/Makefile.am
===================================================================
--- plugins/Makefile.am	(revision 18636)
+++ plugins/Makefile.am	(working copy)
@@ -28,6 +28,13 @@
 lua_dir =
 endif		# HAVE_LIBLUA
 
+if HAVE_LIBPORTAUDIO
+listen_rtp_dir = \
+	listen_rtp
+else		# HAVE_LIBPORTAUDIO
+listen_rtp_dir =
+endif		# HAVE_LIBPORTAUDIO
+
 SUBDIRS = \
 	acn \
 	agentx \
@@ -40,6 +47,7 @@
 	gryphon \
 	h223 \
 	irda \
+	$(listen_rtp_dir) \
 	$(lua_dir) \
 	lwres \
 	mate \
@@ -52,7 +60,6 @@
 	rlm \
 	rtnet \
 	rudp \
-	sbus \
 	stats_tree \
 	v5ua
 
Index: plugins/Makefile.am
===================================================================
--- plugins/Makefile.am	(revision 18636)
+++ plugins/Makefile.am	(working copy)
@@ -28,6 +28,13 @@
 lua_dir =
 endif		# HAVE_LIBLUA
 
+if HAVE_LIBPORTAUDIO
+listen_rtp_dir = \
+	listen_rtp
+else		# HAVE_LIBPORTAUDIO
+listen_rtp_dir =
+endif		# HAVE_LIBPORTAUDIO
+
 SUBDIRS = \
 	acn \
 	agentx \
@@ -40,6 +47,7 @@
 	gryphon \
 	h223 \
 	irda \
+	$(listen_rtp_dir) \
 	$(lua_dir) \
 	lwres \
 	mate \
@@ -52,7 +60,6 @@
 	rlm \
 	rtnet \
 	rudp \
-	sbus \
 	stats_tree \
 	v5ua
 
Index: plugins/Makefile.nmake
===================================================================
--- plugins/Makefile.nmake	(revision 18636)
+++ plugins/Makefile.nmake	(working copy)
@@ -18,6 +18,7 @@
 	gryphon \
 	h223 \
 	irda \
+	listen_rtp \
 	lua\
 	lwres \
 	mate \
@@ -90,6 +91,13 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
 	cd ..
 
+listen_rtp::
+!IFDEF PORTAUDIO_DIR
+	cd listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
+	cd ..
+!ENDIF
+
 lua::
 !IFDEF LUA_DIR
 	cd lua
@@ -191,6 +199,8 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
 	cd ../irda
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
+	cd ../listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
 	cd ../lua
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
 	cd ../lwres
@@ -250,6 +260,8 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
 	cd ../lwres
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
+	cd ../listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
 	cd ../mate
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
 	cd ../megaco
@@ -301,6 +313,8 @@
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
 	cd ../irda
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
+	cd ../listen_rtp
+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
 	cd ../lua
 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
 	cd ../lwres
@@ -351,6 +365,9 @@
 	xcopy gryphon\*.dll $(VERSION) /d
 	xcopy h223\*.dll $(VERSION) /d
 	xcopy irda\*.dll $(VERSION) /d
+!IFDEF PORTAUDIO_DIR
+	xcopy listen_rtp\*.dll $(VERSION) /d
+!ENDIF
 !IFDEF LUA_DIR
 	xcopy lua\*.dll $(VERSION) /d
 !ENDIF