diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-02-26 15:32:16 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-02-26 15:32:16 +0000 |
commit | 7562816f91e37a3a6807308ba538aa8e9631b6e4 (patch) | |
tree | 8762ca69133f4a34ee884d19f1647216437db618 | |
parent | 4a8234bbb10ae3309f0c3fe2f0dcccf86060fe99 (diff) |
Ticket #495: ability to specify different clock rate when opening sound device
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1823 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 30 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 6 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 1 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 35 |
4 files changed, 62 insertions, 10 deletions
diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c index 39560f11..880f98d8 100644 --- a/pjsip-apps/src/pjsua/pjsua_app.c +++ b/pjsip-apps/src/pjsua/pjsua_app.c @@ -171,7 +171,8 @@ static void usage(void) puts (" --use-ice Enable ICE (default:no)"); puts (" --add-codec=name Manually add codec (default is to enable all)"); puts (" --dis-codec=name Disable codec (can be specified multiple times)"); - puts (" --clock-rate=N Override sound device clock rate"); + puts (" --clock-rate=N Override conference bridge clock rate"); + puts (" --snd-clock-rate=N Override sound device clock rate"); puts (" --null-audio Use NULL audio device"); puts (" --play-file=file Register WAV file in conference bridge."); puts (" This can be specified multiple times."); @@ -386,8 +387,8 @@ static pj_status_t parse_args(int argc, char *argv[], OPT_NAMESERVER, OPT_STUN_DOMAIN, OPT_STUN_SRV, OPT_ADD_BUDDY, OPT_OFFER_X_MS_MSG, OPT_NO_PRESENCE, OPT_AUTO_ANSWER, OPT_AUTO_HANGUP, OPT_AUTO_PLAY, OPT_AUTO_LOOP, - OPT_AUTO_CONF, OPT_CLOCK_RATE, OPT_USE_ICE, OPT_USE_SRTP, - OPT_SRTP_SECURE, + OPT_AUTO_CONF, OPT_CLOCK_RATE, OPT_SND_CLOCK_RATE, OPT_USE_ICE, + OPT_USE_SRTP, OPT_SRTP_SECURE, OPT_PLAY_FILE, OPT_PLAY_TONE, OPT_RTP_PORT, OPT_ADD_CODEC, OPT_ILBC_MODE, OPT_REC_FILE, OPT_AUTO_REC, OPT_COMPLEXITY, OPT_QUALITY, OPT_PTIME, OPT_NO_VAD, @@ -409,6 +410,7 @@ static pj_status_t parse_args(int argc, char *argv[], { "help", 0, 0, OPT_HELP}, { "version", 0, 0, OPT_VERSION}, { "clock-rate", 1, 0, OPT_CLOCK_RATE}, + { "snd-clock-rate", 1, 0, OPT_SND_CLOCK_RATE}, { "null-audio", 0, 0, OPT_NULL_AUDIO}, { "local-port", 1, 0, OPT_LOCAL_PORT}, { "ip-addr", 1, 0, OPT_IP_ADDR}, @@ -562,12 +564,22 @@ static pj_status_t parse_args(int argc, char *argv[], lval = pj_strtoul(pj_cstr(&tmp, pj_optarg)); if (lval < 8000 || lval > 48000) { PJ_LOG(1,(THIS_FILE, "Error: expecting value between " - "8000-48000 for clock rate")); + "8000-48000 for conference clock rate")); return PJ_EINVAL; } cfg->media_cfg.clock_rate = lval; break; + case OPT_SND_CLOCK_RATE: + lval = pj_strtoul(pj_cstr(&tmp, pj_optarg)); + if (lval < 8000 || lval > 48000) { + PJ_LOG(1,(THIS_FILE, "Error: expecting value between " + "8000-48000 for sound device clock rate")); + return PJ_EINVAL; + } + cfg->media_cfg.snd_clock_rate = lval; + break; + case OPT_LOCAL_PORT: /* local-port */ lval = pj_strtoul(pj_cstr(&tmp, pj_optarg)); if (lval < 0 || lval > 65535) { @@ -1388,6 +1400,16 @@ static int write_settings(const struct app_config *config, pj_strcat2(&cfg, line); } + if (config->media_cfg.snd_clock_rate != config->media_cfg.clock_rate) { + pj_ansi_sprintf(line, "--snd-clock-rate %d\n", + config->media_cfg.snd_clock_rate); + pj_strcat2(&cfg, line); + } else { + pj_ansi_sprintf(line, "#using default --snd-clock-rate %d\n", + config->media_cfg.snd_clock_rate); + pj_strcat2(&cfg, line); + } + /* quality */ if (config->media_cfg.quality != PJSUA_DEFAULT_CODEC_QUALITY) { pj_ansi_sprintf(line, "--quality %d\n", diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index 1e857b51..a095954a 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -3742,6 +3742,12 @@ struct pjsua_media_config unsigned clock_rate; /** + * Clock rate to be applied when opening the sound device. + * If value is zero, conference bridge clock rate will be used. + */ + unsigned snd_clock_rate; + + /** * Specify audio frame ptime. The value here will affect the * samples per frame of both the sound device and the conference * bridge. Specifying lower ptime will normally reduce the diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 9f0ff6e7..04d48023 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -162,6 +162,7 @@ PJ_DEF(void) pjsua_media_config_default(pjsua_media_config *cfg) pj_bzero(cfg, sizeof(*cfg)); cfg->clock_rate = PJSUA_DEFAULT_CLOCK_RATE; + cfg->snd_clock_rate = PJSUA_DEFAULT_CLOCK_RATE; cfg->audio_frame_ptime = PJSUA_DEFAULT_AUDIO_FRAME_PTIME; cfg->max_media_ports = PJSUA_MAX_CONF_PORTS; cfg->has_ioqueue = PJ_TRUE; diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 4a64b8f2..bb572cc9 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -1771,7 +1771,8 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev, { pjmedia_port *conf_port; const pjmedia_snd_dev_info *play_info; - unsigned clock_rates[] = { 0, 22050, 44100, 48000, 11025, 32000, 8000}; + unsigned clock_rates[] = {0, 22050, 44100, 48000, 32000, 16000, + 8000}; unsigned selected_clock_rate = 0; unsigned i; pjmedia_snd_stream *strm; @@ -1784,7 +1785,9 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev, /* Set default clock rate */ - clock_rates[0] = pjsua_var.media_cfg.clock_rate; + clock_rates[0] = pjsua_var.media_cfg.snd_clock_rate; + if (clock_rates[0] == 0) + clock_rates[0] = pjsua_var.media_cfg.clock_rate; /* Attempts to open the sound device with different clock rates */ for (i=0; i<PJ_ARRAY_SIZE(clock_rates); ++i) { @@ -1831,10 +1834,20 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev, */ if (selected_clock_rate != pjsua_var.media_cfg.clock_rate) { pjmedia_port *resample_port; + unsigned resample_opt = 0; + if (pjsua_var.media_cfg.quality >= 3 && + pjsua_var.media_cfg.quality <= 4) + { + resample_opt |= PJMEDIA_CONF_SMALL_FILTER; + } + else if (pjsua_var.media_cfg.quality < 3) { + resample_opt |= PJMEDIA_CONF_USE_LINEAR; + } + status = pjmedia_resample_port_create(pjsua_var.pool, conf_port, - selected_clock_rate, 0, - &resample_port); + selected_clock_rate, + resample_opt, &resample_port); if (status != PJ_SUCCESS) { pjsua_perror("Error creating resample port", THIS_FILE, status); return status; @@ -1863,8 +1876,18 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev, pjmedia_snd_stream_get_info(strm, &si); play_info = pjmedia_snd_get_dev_info(si.rec_id); - pjmedia_conf_set_port0_name(pjsua_var.mconf, - pj_cstr(&tmp, play_info->name)); + if (si.clock_rate != pjsua_var.media_cfg.clock_rate) { + char tmp_buf[128]; + int tmp_buf_len = sizeof(tmp_buf); + + tmp_buf_len = pj_ansi_snprintf(tmp_buf, sizeof(tmp_buf)-1, "%s (%dKHz)", + play_info->name, si.clock_rate/1000); + pj_strset(&tmp, tmp_buf, tmp_buf_len); + pjmedia_conf_set_port0_name(pjsua_var.mconf, &tmp); + } else { + pjmedia_conf_set_port0_name(pjsua_var.mconf, + pj_cstr(&tmp, play_info->name)); + } return PJ_SUCCESS; } |