diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-12-26 02:27:14 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-12-26 02:27:14 +0000 |
commit | 66ba60640c9016496736679a5f5d4f76ca9c92b4 (patch) | |
tree | a71e50cfd9d35fad717f020cc586c2fed0dd540f | |
parent | 2fe9c7e503a9599ed0361e10bb6ba1c4bf311e4c (diff) |
Ticket #51: Added audio level adjustment to PJSUA-API
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@864 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjmedia/src/pjmedia/conference.c | 20 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 26 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 51 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 36 |
4 files changed, 125 insertions, 8 deletions
diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c index 026f376a..75837c42 100644 --- a/pjmedia/src/pjmedia/conference.c +++ b/pjmedia/src/pjmedia/conference.c @@ -61,6 +61,7 @@ static FILE *fhnd_rec; #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 #define INVALID_SLOT ((SLOT_TYPE)-1) @@ -1137,7 +1138,10 @@ PJ_DEF(pj_status_t) pjmedia_conf_adjust_rx_level( pjmedia_conf *conf, PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL); /* 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]; @@ -1164,7 +1168,10 @@ PJ_DEF(pj_status_t) pjmedia_conf_adjust_tx_level( pjmedia_conf *conf, PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL); /* 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]; @@ -1364,7 +1371,8 @@ static pj_status_t write_port(pjmedia_conf *conf, struct conf_port *cport, * 16bit sample storage. */ 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 */ if (itemp > 32767) itemp = 32767; @@ -1396,7 +1404,8 @@ static pj_status_t write_port(pjmedia_conf *conf, struct conf_port *cport, itemp = unsigned2pcm(cport->mix_buf[j] / cport->src_level); /* 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 */ if (itemp > 32767) itemp = 32767; @@ -1650,7 +1659,8 @@ static pj_status_t get_frame(pjmedia_port *this_port, * 16bit sample storage. */ 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 */ if (itemp > 32767) itemp = 32767; diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c index 24868a9f..42395174 100644 --- a/pjsip-apps/src/pjsua/pjsua_app.c +++ b/pjsip-apps/src/pjsua/pjsua_app.c @@ -76,6 +76,9 @@ static struct app_config pjmedia_snd_port *snd; #endif + float mic_level, + speaker_level; + } app_config; @@ -209,6 +212,7 @@ static void default_config(struct app_config *cfg) cfg->rec_id = PJSUA_INVALID_ID; cfg->wav_port = PJSUA_INVALID_ID; cfg->rec_port = PJSUA_INVALID_ID; + cfg->mic_level = cfg->speaker_level = 1.0; } @@ -848,7 +852,7 @@ static pj_status_t parse_args(int argc, char *argv[], default: PJ_LOG(1,(THIS_FILE, "Argument \"%s\" is not valid. Use --help to see help", - argv[pj_optind-1])); + argv[pj_optind])); return -1; } } @@ -1837,7 +1841,7 @@ static void keystroke_help(void) puts("| # Send DTMF string | cl List ports | d Dump status |"); 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 |"); puts("+=============================================================================+"); @@ -2713,6 +2717,24 @@ void console_app_main(const pj_str_t *uri_to_call) } 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') { char settings[2000]; diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index cb8d4643..87481b1d 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -2625,6 +2625,57 @@ 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); + +/** + * + */ + + + /***************************************************************************** * File player. */ diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 87d7d6df..07af5fbb 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -673,6 +673,40 @@ PJ_DEF(pj_status_t) pjsua_conf_disconnect( pjsua_conf_port_id source, } +/* + * 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. */ @@ -1008,7 +1042,7 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev, int playback_dev) { 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; unsigned i; |