diff options
-rw-r--r-- | pjmedia/src/pjmedia/conf_switch.c | 6 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 24 |
2 files changed, 22 insertions, 8 deletions
diff --git a/pjmedia/src/pjmedia/conf_switch.c b/pjmedia/src/pjmedia/conf_switch.c index f5d6b78c..1e13e738 100644 --- a/pjmedia/src/pjmedia/conf_switch.c +++ b/pjmedia/src/pjmedia/conf_switch.c @@ -590,6 +590,12 @@ PJ_DEF(pj_status_t) pjmedia_conf_connect_port( pjmedia_conf *conf, break; } + /* Update master port info shortcut, note that application may update + * the master port info when the audio device needs to be reopened with + * a new format to match to ports connection format. + */ + conf->ports[0]->samples_per_frame = PJMEDIA_PIA_SPF(conf->ports[0]->info); + if (i == src_port->listener_cnt) { src_port->listener_slots[src_port->listener_cnt] = sink_slot; ++conf->connect_cnt; diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index b6a53642..2f5c0b5b 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -3717,14 +3717,22 @@ static pj_status_t open_snd_dev(pjmedia_snd_port_param *param) * derived from the sound device setting, so update the setting. */ if (pjsua_var.is_mswitch) { - pj_memcpy(&conf_port->info.fmt, ¶m->base.ext_fmt, - sizeof(conf_port->info.fmt)); - conf_port->info.fmt.det.aud.clock_rate = param->base.clock_rate; - conf_port->info.fmt.det.aud.frame_time_usec = param->base.samples_per_frame* - 1000000 / - param->base.clock_rate; - conf_port->info.fmt.det.aud.channel_count = param->base.channel_count; - conf_port->info.fmt.det.aud.bits_per_sample = 16; + if (param->base.flags & PJMEDIA_AUD_DEV_CAP_EXT_FORMAT) { + conf_port->info.fmt = param->base.ext_fmt; + } else { + unsigned bps, ptime_usec; + bps = param->base.clock_rate * param->base.bits_per_sample; + ptime_usec = param->base.samples_per_frame / + param->base.channel_count * 1000000 / + param->base.clock_rate; + pjmedia_format_init_audio(&conf_port->info.fmt, + PJMEDIA_FORMAT_PCM, + param->base.clock_rate, + param->base.channel_count, + param->base.bits_per_sample, + ptime_usec, + bps, bps); + } } |