Index: /pjproject/trunk/pjmedia/src/pjmedia/conference.c
===================================================================
--- /pjproject/trunk/pjmedia/src/pjmedia/conference.c	(revision 863)
+++ /pjproject/trunk/pjmedia/src/pjmedia/conference.c	(revision 864)
@@ -62,4 +62,5 @@
 #define SIGNATURE	    PJMEDIA_PORT_SIGNATURE('C', 'O', 'N', 'F')
 #define SIGNATURE_PORT	    PJMEDIA_PORT_SIGNATURE('C', 'O', 'N', 'P')
+/* Normal level is hardcodec to 128 in all over places */
 #define NORMAL_LEVEL	    128
 #define SLOT_TYPE	    unsigned
@@ -1138,5 +1139,8 @@
 
     /* Value must be from -128 to +127 */
-    PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL);
+    /* Disabled, you can put more than +127, at your own risk: 
+     PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL);
+     */
+    PJ_ASSERT_RETURN(adj_level >= -128, PJ_EINVAL);
 
     conf_port = conf->ports[slot];
@@ -1165,5 +1169,8 @@
 
     /* Value must be from -128 to +127 */
-    PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL);
+    /* Disabled, you can put more than +127,, at your own risk:
+     PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL);
+     */
+    PJ_ASSERT_RETURN(adj_level >= -128, PJ_EINVAL);
 
     conf_port = conf->ports[slot];
@@ -1365,5 +1372,6 @@
 		 */
 		itemp = input[j];
-		itemp = itemp * adj / NORMAL_LEVEL;
+		/*itemp = itemp * adj / NORMAL_LEVEL; */
+		itemp = (itemp * adj) >> 7;
 
 		/* Clip the signal if it's too loud */
@@ -1397,5 +1405,6 @@
 
 	    /* Adjust the level */
-	    itemp = itemp * adj_level / NORMAL_LEVEL;
+	    /*itemp = itemp * adj_level / NORMAL_LEVEL;*/
+	    itemp = (itemp * adj_level) >> 7;
 
 	    /* Clip the signal if it's too loud */
@@ -1651,5 +1660,6 @@
 		 */
 		itemp = input[j];
-		itemp = itemp * adj / NORMAL_LEVEL;
+		/*itemp = itemp * adj / NORMAL_LEVEL;*/
+		itemp = (itemp * adj) >> 7;
 
 		/* Clip the signal if it's too loud */
Index: /pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c
===================================================================
--- /pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c	(revision 863)
+++ /pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c	(revision 864)
@@ -76,4 +76,7 @@
     pjmedia_snd_port	   *snd;
 #endif
+
+    float		    mic_level,
+			    speaker_level;
 
 } app_config;
@@ -210,4 +213,5 @@
     cfg->wav_port = PJSUA_INVALID_ID;
     cfg->rec_port = PJSUA_INVALID_ID;
+    cfg->mic_level = cfg->speaker_level = 1.0;
 }
 
@@ -849,5 +853,5 @@
 	    PJ_LOG(1,(THIS_FILE, 
 		      "Argument \"%s\" is not valid. Use --help to see help",
-		      argv[pj_optind-1]));
+		      argv[pj_optind]));
 	    return -1;
 	}
@@ -1838,5 +1842,5 @@
     puts("| dq  Dump curr. call quality  | cc  Connect port         | dd  Dump detailed |");
     puts("|                              | cd  Disconnect port      | dc  Dump config   |");
-    puts("|  S  Send arbitrary REQUEST   |                          |  f  Save config   |");
+    puts("|  S  Send arbitrary REQUEST   |  V  Adjust audio Volume  |  f  Save config   |");
     puts("+------------------------------+--------------------------+-------------------+");
     puts("|  q  QUIT                                                                    |");
@@ -2714,4 +2718,22 @@
 	    break;
 
+	case 'V':
+	    /* Adjust audio volume */
+	    sprintf(buf, "Adjust mic level: [%4.1fx] ", app_config.mic_level);
+	    if (simple_input(buf,text,sizeof(text))) {
+		char *err;
+		app_config.mic_level = (float)strtod(text, &err);
+		pjsua_conf_adjust_rx_level(0, app_config.mic_level);
+	    }
+	    sprintf(buf, "Adjust speaker level: [%4.1fx] ", 
+		    app_config.speaker_level);
+	    if (simple_input(buf,text,sizeof(text))) {
+		char *err;
+		app_config.speaker_level = (float)strtod(text, &err);
+		pjsua_conf_adjust_tx_level(0, app_config.speaker_level);
+	    }
+
+	    break;
+
 	case 'd':
 	    if (menuin[1] == 'c') {
Index: /pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h
===================================================================
--- /pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 863)
+++ /pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 864)
@@ -2624,4 +2624,55 @@
 PJ_DECL(pj_status_t) pjsua_conf_disconnect(pjsua_conf_port_id source,
 					   pjsua_conf_port_id sink);
+
+
+/**
+ * Adjust the signal level to be transmitted from the bridge to the 
+ * specified port by making it louder or quieter.
+ *
+ * @param slot		The conference bridge slot number.
+ * @param level		Signal level adjustment. Value 1.0 means no level
+ *			adjustment, while value 0 means to mute the port.
+ *
+ * @return		PJ_SUCCESS on success, or the appropriate error code.
+ */
+PJ_DECL(pj_status_t) pjsua_conf_adjust_tx_level(pjsua_conf_port_id slot,
+						float level);
+
+/**
+ * Adjust the signal level to be received from the specified port (to
+ * the bridge) by making it louder or quieter.
+ *
+ * @param slot		The conference bridge slot number.
+ * @param level		Signal level adjustment. Value 1.0 means no level
+ *			adjustment, while value 0 means to mute the port.
+ *
+ * @return		PJ_SUCCESS on success, or the appropriate error code.
+ */
+PJ_DECL(pj_status_t) pjsua_conf_adjust_rx_level(pjsua_conf_port_id slot,
+						float level);
+
+/**
+ * Get last signal level transmitted to or received from the specified port.
+ * The signal level is an integer value in zero to 255, with zero indicates
+ * no signal, and 255 indicates the loudest signal level.
+ *
+ * @param slot		The conference bridge slot number.
+ * @param tx_level	Optional argument to receive the level of signal
+ *			transmitted to the specified port (i.e. the direction
+ *			is from the bridge to the port).
+ * @param rx_level	Optional argument to receive the level of signal
+ *			received from the port (i.e. the direction is from the
+ *			port to the bridge).
+ *
+ * @return		PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjsua_conf_get_signal_level(pjsua_conf_port_id slot,
+						 unsigned *tx_level,
+						 unsigned *rx_level);
+
+/**
+ * 
+ */
+
 
 
Index: /pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c
===================================================================
--- /pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c	(revision 863)
+++ /pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c	(revision 864)
@@ -674,4 +674,38 @@
 
 
+/*
+ * Adjust the signal level to be transmitted from the bridge to the 
+ * specified port by making it louder or quieter.
+ */
+PJ_DEF(pj_status_t) pjsua_conf_adjust_tx_level(pjsua_conf_port_id slot,
+					       float level)
+{
+    return pjmedia_conf_adjust_tx_level(pjsua_var.mconf, slot,
+					(int)((level-1) * 128));
+}
+
+/*
+ * Adjust the signal level to be received from the specified port (to
+ * the bridge) by making it louder or quieter.
+ */
+PJ_DEF(pj_status_t) pjsua_conf_adjust_rx_level(pjsua_conf_port_id slot,
+					       float level)
+{
+    return pjmedia_conf_adjust_rx_level(pjsua_var.mconf, slot,
+					(int)((level-1) * 128));
+}
+
+
+/*
+ * Get last signal level transmitted to or received from the specified port.
+ */
+PJ_DEF(pj_status_t) pjsua_conf_get_signal_level(pjsua_conf_port_id slot,
+						unsigned *tx_level,
+						unsigned *rx_level)
+{
+    return pjmedia_conf_get_signal_level(pjsua_var.mconf, slot, 
+					 tx_level, rx_level);
+}
+
 /*****************************************************************************
  * File player.
@@ -1009,5 +1043,5 @@
 {
     pjmedia_port *conf_port;
-    const pjmedia_snd_dev_info *cap_info, *play_info;
+    const pjmedia_snd_dev_info *play_info;
     unsigned clock_rates[] = { 0, 22050, 44100, 48000, 11025, 32000, 8000};
     unsigned selected_clock_rate = 0;
