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 /pjsip | |
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
Diffstat (limited to 'pjsip')
-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 |
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; } |