Index: pjproject/trunk/pjmedia/build/pjmedia.dsp
===================================================================
--- pjproject/trunk/pjmedia/build/pjmedia.dsp	(revision 317)
+++ pjproject/trunk/pjmedia/build/pjmedia.dsp	(revision 318)
@@ -121,4 +121,8 @@
 # Begin Source File
 
+SOURCE=..\src\pjmedia\null_port.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\src\pjmedia\nullsound.c
 # PROP Exclude_From_Build 1
@@ -207,4 +211,8 @@
 
 SOURCE=..\include\pjmedia\jbuf.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\pjmedia\null_port.h
 # End Source File
 # Begin Source File
Index: pjproject/trunk/pjmedia/include/pjmedia.h
===================================================================
--- pjproject/trunk/pjmedia/include/pjmedia.h	(revision 317)
+++ pjproject/trunk/pjmedia/include/pjmedia.h	(revision 318)
@@ -33,4 +33,5 @@
 #include <pjmedia/g711.h>
 #include <pjmedia/jbuf.h>
+#include <pjmedia/null_port.h>
 #include <pjmedia/port.h>
 #include <pjmedia/rtcp.h>
Index: pjproject/trunk/pjmedia/include/pjmedia/null_port.h
===================================================================
--- pjproject/trunk/pjmedia/include/pjmedia/null_port.h	(revision 318)
+++ pjproject/trunk/pjmedia/include/pjmedia/null_port.h	(revision 318)
@@ -0,0 +1,53 @@
+/* $Id$ */
+/* 
+ * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.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 __PJMEDIA_NULL_PORT_H__
+#define __PJMEDIA_NULL_PORT_H__
+
+/**
+ * @file null_port.h
+ * @brief Null media port.
+ */
+#include <pjmedia/port.h>
+
+
+PJ_BEGIN_DECL
+
+
+/**
+ * Create Null port. 
+ *
+ * @param sampling_rate		Sampling rate of the port.
+ * @param samples_per_frame	Number of samples per frame.
+ * @param bits_per_sample	Number of bits per sample.
+ * @param p_port		Pointer to receive the port instance.
+ *
+ * @return			PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjmedia_null_port_create( pj_pool_t *pool,
+					       unsigned sampling_rate,
+					       unsigned samples_per_frame,
+					       unsigned bits_per_sample,
+					       pjmedia_port **p_port );
+
+
+
+PJ_END_DECL
+
+
+#endif	/* __PJMEDIA_NULL_PORT_H__ */
Index: pjproject/trunk/pjmedia/src/pjmedia/conference.c
===================================================================
--- pjproject/trunk/pjmedia/src/pjmedia/conference.c	(revision 317)
+++ pjproject/trunk/pjmedia/src/pjmedia/conference.c	(revision 318)
@@ -492,6 +492,5 @@
     pj_status_t status;
 
-    PJ_ASSERT_RETURN(conf && pool && strm_port && port_name && p_port, 
-		     PJ_EINVAL);
+    PJ_ASSERT_RETURN(conf && pool && strm_port && port_name, PJ_EINVAL);
 
     pj_mutex_lock(conf->mutex);
@@ -523,5 +522,7 @@
 
     /* Done. */
-    *p_port = index;
+    if (p_port) {
+	*p_port = index;
+    }
 
     pj_mutex_unlock(conf->mutex);
@@ -1052,4 +1053,8 @@
 	    continue;
 	}
+
+	/* Also skip if this port doesn't have listeners. */
+	if (conf_port->listener_cnt == 0)
+	    continue;
 
 	/* Get frame from this port. 
@@ -1102,8 +1107,4 @@
 	}
 
-	/* Also skip if this port doesn't have listeners. */
-	if (conf_port->listener_cnt == 0)
-	    continue;
-
 	/* Get the signal level. */
 	level = pjmedia_calc_avg_signal(output, conf->samples_per_frame);
Index: pjproject/trunk/pjmedia/src/pjmedia/null_port.c
===================================================================
--- pjproject/trunk/pjmedia/src/pjmedia/null_port.c	(revision 318)
+++ pjproject/trunk/pjmedia/src/pjmedia/null_port.c	(revision 318)
@@ -0,0 +1,107 @@
+/* $Id$ */
+/* 
+ * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.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 
+ */
+#include <pjmedia/null_port.h>
+#include <pjmedia/errno.h>
+#include <pj/assert.h>
+#include <pj/pool.h>
+#include <pj/string.h>
+
+
+static pj_status_t null_get_frame(pjmedia_port *this_port, 
+				  pjmedia_frame *frame);
+static pj_status_t null_put_frame(pjmedia_port *this_port, 
+				  const pjmedia_frame *frame);
+static pj_status_t null_on_destroy(pjmedia_port *this_port);
+
+
+PJ_DEF(pj_status_t) pjmedia_null_port_create( pj_pool_t *pool,
+					      unsigned sampling_rate,
+					      unsigned samples_per_frame,
+					      unsigned bits_per_sample,
+					      pjmedia_port **p_port )
+{
+    pjmedia_port *port;
+
+    PJ_ASSERT_RETURN(pool && p_port, PJ_EINVAL);
+
+    port = pj_pool_zalloc(pool, sizeof(pjmedia_port));
+    PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);
+
+    port->info.bits_per_sample = bits_per_sample;
+    port->info.bytes_per_frame = samples_per_frame * bits_per_sample / 8;
+    port->info.encoding_name = pj_str("pcm");
+    port->info.has_info = 1;
+    port->info.name = pj_str("null-port");
+    port->info.need_info = 0;
+    port->info.pt = 0xFF;
+    port->info.sample_rate = sampling_rate;
+    port->info.samples_per_frame = samples_per_frame;
+    port->info.signature = 0x2411;
+    port->info.type = PJMEDIA_TYPE_AUDIO;
+
+    port->get_frame = &null_get_frame;
+    port->put_frame = &null_put_frame;
+    port->on_destroy = &null_on_destroy;
+
+
+    *p_port = port;
+    
+    return PJ_SUCCESS;
+}
+
+
+
+/*
+ * Put frame to file.
+ */
+static pj_status_t null_put_frame(pjmedia_port *this_port, 
+				  const pjmedia_frame *frame)
+{
+    PJ_UNUSED_ARG(this_port);
+    PJ_UNUSED_ARG(frame);
+    return PJ_SUCCESS;
+}
+
+
+/*
+ * Get frame from file.
+ */
+static pj_status_t null_get_frame(pjmedia_port *this_port, 
+				  pjmedia_frame *frame)
+{
+    unsigned i, count;
+    pj_int16_t *samples = frame->buf;
+
+    count = this_port->info.samples_per_frame;
+    for (i=0; i<count; ++i) {
+	samples[i] = 0;
+    }
+
+    return PJ_SUCCESS;
+}
+
+
+/*
+ * Destroy port.
+ */
+static pj_status_t null_on_destroy(pjmedia_port *this_port)
+{
+    PJ_UNUSED_ARG(this_port);
+    return PJ_SUCCESS;
+}
Index: pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h
===================================================================
--- pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 317)
+++ pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 318)
@@ -65,5 +65,5 @@
  * streams.
  */
-#define PJSUA_CONF_MORE_PORTS	    2
+#define PJSUA_CONF_MORE_PORTS	    3
 
 
@@ -186,4 +186,6 @@
     char	    *wav_file;	    /**< WAV file name to play.		*/
     unsigned	     wav_slot;	    /**< WAV player slot in bridge	*/
+    pjmedia_port    *file_port;	    /**< WAV player port.		*/
+    pjmedia_port    *null_port;	    /**< NULL port.			*/
     pj_bool_t	     auto_play;	    /**< Auto play file for calls?	*/
     pj_bool_t	     auto_loop;	    /**< Auto loop RTP stream?		*/
Index: pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c
===================================================================
--- pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c	(revision 317)
+++ pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c	(revision 318)
@@ -754,13 +754,20 @@
     }
 
+    /* Add NULL port to the bridge. */
+    status = pjmedia_null_port_create( pjsua.pool, pjsua.clock_rate, 
+				       pjsua.clock_rate * 20 / 1000, 16,
+				       &pjsua.null_port);
+    pjmedia_conf_add_port( pjsua.mconf, pjsua.pool, pjsua.null_port, 
+			   &pjsua.null_port->info.name, NULL );
+
     /* Create WAV file player if required: */
 
     if (pjsua.wav_file) {
-	pjmedia_port *port;
 	pj_str_t port_name;
 
 	/* Create the file player port. */
 	status = pjmedia_file_player_port_create( pjsua.pool, pjsua.wav_file,
-						  0, -1, NULL, &port);
+						  0, -1, NULL, 
+						  &pjsua.file_port);
 	if (status != PJ_SUCCESS) {
 	    pjsua_perror(THIS_FILE, 
@@ -771,5 +778,6 @@
 
 	/* Add port to conference bridge: */
-	status = pjmedia_conf_add_port(pjsua.mconf, pjsua.pool, port, 
+	status = pjmedia_conf_add_port(pjsua.mconf, pjsua.pool, 
+				       pjsua.file_port, 
 				       pj_cstr(&port_name, pjsua.wav_file),
 				       &pjsua.wav_slot);
@@ -1050,4 +1058,11 @@
 	pjmedia_conf_destroy(pjsua.mconf);
 
+    /* Destroy file port */
+    pjmedia_port_destroy(pjsua.file_port);
+
+    /* Destroy null port. */
+    pjmedia_port_destroy(pjsua.null_port);
+
+
     /* Destroy sound framework: 
      * (this should be done in pjmedia_shutdown())
