summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app.c30
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h6
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c1
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c35
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;
}