summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2012-04-24 10:26:07 +0000
committerLiong Sauw Ming <ming@teluu.com>2012-04-24 10:26:07 +0000
commit9683edf167e5ba635e4c0e9355757c830f36f4ff (patch)
treec4553cecd8e4eb5fc6ca5f9b153f53c674cb97f0
parent4a1a62eeeaeff0ed21f856d1955925bcc4d916aa (diff)
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
-rw-r--r--pjmedia/include/pjmedia/echo.h7
-rw-r--r--pjmedia/src/pjmedia-audiodev/coreaudio_dev.c5
-rw-r--r--pjmedia/src/pjmedia/sound_port.c19
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(&param_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;