summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-03-11 13:15:43 +0000
committerBenny Prijono <bennylp@teluu.com>2008-03-11 13:15:43 +0000
commitf1bb061d0d14ca661dd6d5dc981a1a5204357c2e (patch)
treece29e8610d5cfabcc8e333ff191f1905df2d9362 /pjsip
parentc2b574db5c151d0f71726bf7e9c604f50501f559 (diff)
More ticket #495: bug in snd_clock_rate causing unability to open sound device on WinCE
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1855 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c2
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c81
2 files changed, 48 insertions, 35 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 04d48023..40471583 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -162,7 +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->snd_clock_rate = 0;
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 bb572cc9..dea8b5b7 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -52,6 +52,9 @@ pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg)
pj_memcpy(&pjsua_var.media_cfg, cfg, sizeof(*cfg));
/* Normalize configuration */
+ if (pjsua_var.media_cfg.snd_clock_rate == 0) {
+ pjsua_var.media_cfg.snd_clock_rate = pjsua_var.media_cfg.clock_rate;
+ }
if (pjsua_var.media_cfg.has_ioqueue &&
pjsua_var.media_cfg.thread_cnt == 0)
@@ -184,8 +187,7 @@ pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg)
pjsua_var.mconf_cfg.bits_per_sample,
opt, &pjsua_var.mconf);
if (status != PJ_SUCCESS) {
- pjsua_perror(THIS_FILE,
- "Media stack initialization has returned error",
+ pjsua_perror(THIS_FILE, "Error creating conference bridge",
status);
return status;
}
@@ -1789,6 +1791,10 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev,
if (clock_rates[0] == 0)
clock_rates[0] = pjsua_var.media_cfg.clock_rate;
+ /* Get the port0 of the conference bridge. */
+ conf_port = pjmedia_conf_get_master_port(pjsua_var.mconf);
+ pj_assert(conf_port != NULL);
+
/* Attempts to open the sound device with different clock rates */
for (i=0; i<PJ_ARRAY_SIZE(clock_rates); ++i) {
char errmsg[PJ_ERR_MSG_SIZE];
@@ -1808,7 +1814,45 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev,
if (status == PJ_SUCCESS) {
selected_clock_rate = clock_rates[i];
- break;
+
+ /* If there's mismatch between sound port and conference's port,
+ * create a resample port to bridge them.
+ */
+ 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,
+ resample_opt,
+ &resample_port);
+ if (status != PJ_SUCCESS) {
+ pj_strerror(status, errmsg, sizeof(errmsg));
+ PJ_LOG(4, (THIS_FILE,
+ "Error creating resample port, trying next "
+ "clock rate",
+ errmsg));
+ pjmedia_snd_port_destroy(pjsua_var.snd_port);
+ pjsua_var.snd_port = NULL;
+ continue;
+ } else {
+ conf_port = resample_port;
+ break;
+ }
+
+ } else {
+ break;
+ }
}
pj_strerror(status, errmsg, sizeof(errmsg));
@@ -1820,42 +1864,11 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev,
return status;
}
- /* Get the port0 of the conference bridge. */
- conf_port = pjmedia_conf_get_master_port(pjsua_var.mconf);
- pj_assert(conf_port != NULL);
-
/* Set AEC */
pjmedia_snd_port_set_ec( pjsua_var.snd_port, pjsua_var.pool,
pjsua_var.media_cfg.ec_tail_len,
pjsua_var.media_cfg.ec_options);
- /* If there's mismatch between sound port and conference's port,
- * create a resample port to bridge them.
- */
- 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,
- resample_opt, &resample_port);
- if (status != PJ_SUCCESS) {
- pjsua_perror("Error creating resample port", THIS_FILE, status);
- return status;
- }
-
- conf_port = resample_port;
- }
-
/* Connect sound port to the bridge */
status = pjmedia_snd_port_connect(pjsua_var.snd_port,
conf_port );