From 9683edf167e5ba635e4c0e9355757c830f36f4ff Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Tue, 24 Apr 2012 10:26:07 +0000 Subject: Fixed #1494: Use EC options to determine whether to use device/software EC git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@4079 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/echo.h | 7 ++++++- pjmedia/src/pjmedia-audiodev/coreaudio_dev.c | 5 +++++ pjmedia/src/pjmedia/sound_port.c | 19 +++++++++++++------ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/pjmedia/include/pjmedia/echo.h b/pjmedia/include/pjmedia/echo.h index ba7f8897..4ed62ee9 100644 --- a/pjmedia/include/pjmedia/echo.h +++ b/pjmedia/include/pjmedia/echo.h @@ -95,8 +95,13 @@ typedef enum pjmedia_echo_flag * created for the echo canceller will use simple FIFO mechanism, i.e. * without using WSOLA to expand and shrink audio samples. */ - PJMEDIA_ECHO_USE_SIMPLE_FIFO = 32 + PJMEDIA_ECHO_USE_SIMPLE_FIFO = 32, + /** + * If PJMEDIA_ECHO_USE_SW_ECHO flag is specified, software echo canceller + * will be used instead of device EC. + */ + PJMEDIA_ECHO_USE_SW_ECHO = 64 } pjmedia_echo_flag; diff --git a/pjmedia/src/pjmedia-audiodev/coreaudio_dev.c b/pjmedia/src/pjmedia-audiodev/coreaudio_dev.c index c5a3e621..d0718979 100644 --- a/pjmedia/src/pjmedia-audiodev/coreaudio_dev.c +++ b/pjmedia/src/pjmedia-audiodev/coreaudio_dev.c @@ -1964,6 +1964,11 @@ static pj_status_t ca_stream_set_cap(pjmedia_aud_stream *s, strm->cf->io_comp = io_comp; strm->param.ec_enabled = *(pj_bool_t*)pval; + PJ_LOG(4, (THIS_FILE, "Using %s audio unit", + (desc.componentSubType == + kAudioUnitSubType_RemoteIO? "RemoteIO": + "VoiceProcessingIO"))); + return PJ_SUCCESS; } #endif diff --git a/pjmedia/src/pjmedia/sound_port.c b/pjmedia/src/pjmedia/sound_port.c index 35f91dc9..b1bfa965 100644 --- a/pjmedia/src/pjmedia/sound_port.c +++ b/pjmedia/src/pjmedia/sound_port.c @@ -225,11 +225,14 @@ static pj_status_t start_sound_device( pj_pool_t *pool, pj_memcpy(¶m_copy, &snd_port->aud_param, sizeof(param_copy)); if (param_copy.flags & PJMEDIA_AUD_DEV_CAP_EC) { /* EC is wanted */ - if (snd_port->aud_caps & PJMEDIA_AUD_DEV_CAP_EC) { + if ((snd_port->prm_ec_options & PJMEDIA_ECHO_USE_SW_ECHO) == 0 && + snd_port->aud_caps & PJMEDIA_AUD_DEV_CAP_EC) + { /* Device supports EC */ /* Nothing to do */ } else { - /* Device doesn't support EC, remove EC settings from + /* Application wants to use software EC or device + * doesn't support EC, remove EC settings from * device parameters */ param_copy.flags &= ~(PJMEDIA_AUD_DEV_CAP_EC | @@ -261,11 +264,13 @@ static pj_status_t start_sound_device( pj_pool_t *pool, (snd_port->clock_rate / snd_port->samples_per_frame); - /* Create software EC if parameter specifies EC but device - * doesn't support EC. Only do this if the format is PCM! + /* Create software EC if parameter specifies EC and + * (app specifically requests software EC or device + * doesn't support EC). Only do this if the format is PCM! */ if ((snd_port->aud_param.flags & PJMEDIA_AUD_DEV_CAP_EC) && - (snd_port->aud_caps & PJMEDIA_AUD_DEV_CAP_EC)==0 && + ((snd_port->aud_caps & PJMEDIA_AUD_DEV_CAP_EC)==0 || + (snd_port->prm_ec_options & PJMEDIA_ECHO_USE_SW_ECHO) != 0) && param_copy.ext_fmt.id == PJMEDIA_FORMAT_PCM) { if ((snd_port->aud_param.flags & PJMEDIA_AUD_DEV_CAP_EC_TAIL)==0) { @@ -505,7 +510,9 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_set_ec( pjmedia_snd_port *snd_port, PJ_EINVALIDOP); /* Determine whether we use device or software EC */ - if (snd_port->aud_caps & PJMEDIA_AUD_DEV_CAP_EC) { + if ((snd_port->prm_ec_options & PJMEDIA_ECHO_USE_SW_ECHO) == 0 && + snd_port->aud_caps & PJMEDIA_AUD_DEV_CAP_EC) + { /* We use device EC */ pj_bool_t ec_enabled; -- cgit v1.2.3