summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-02-26 15:32:16 +0000
committerBenny Prijono <bennylp@teluu.com>2008-02-26 15:32:16 +0000
commit7562816f91e37a3a6807308ba538aa8e9631b6e4 (patch)
tree8762ca69133f4a34ee884d19f1647216437db618 /pjsip
parent4a8234bbb10ae3309f0c3fe2f0dcccf86060fe99 (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
Diffstat (limited to 'pjsip')
-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
3 files changed, 36 insertions, 6 deletions
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;
}