From 705a5aad8174993ca69db59c0fa9eb2098b60b21 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 18 Feb 2014 01:41:45 +0000 Subject: Fixed #1736: Update to bdSound's bdiMad audio device to support output routing. Thanks Andrea for the patch. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4748 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia-audiodev/bdimad_dev.c | 50 ++++++++++++++++++++++++++++++- third_party/bdsound/include/bdimad.h | 47 +++++++++++++++++++++++++++-- 2 files changed, 93 insertions(+), 4 deletions(-) diff --git a/pjmedia/src/pjmedia-audiodev/bdimad_dev.c b/pjmedia/src/pjmedia-audiodev/bdimad_dev.c index d3eefe2d..697db2e5 100644 --- a/pjmedia/src/pjmedia-audiodev/bdimad_dev.c +++ b/pjmedia/src/pjmedia-audiodev/bdimad_dev.c @@ -318,7 +318,7 @@ static pj_status_t factory_refresh(pjmedia_aud_dev_factory *f) for(i=0;idev_info[captureDeviceCount+i].deviceId = captureDeviceCount+i; wf->dev_info[captureDeviceCount+i].info.caps = - PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING; + PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING | PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE; wf->dev_info[captureDeviceCount+i].info.default_samples_per_sec = BD_IMAD_DEFAULT_FREQ; strcpy(wf->dev_info[captureDeviceCount+i].info.driver, "BD_IMAD"); @@ -425,6 +425,10 @@ static pj_status_t factory_default_param(pjmedia_aud_dev_factory *f, param->ec_enabled = PJ_TRUE; } + if(di->info.caps & PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE) { + param->output_route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER; + } + return PJ_SUCCESS; } @@ -927,6 +931,18 @@ static pj_status_t stream_set_capBDIMAD(pjmedia_aud_stream *s, } } + if(cap == PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE) { + pjmedia_aud_dev_route outputRoute = *(pjmedia_aud_dev_route*)pval; + if(strm->param.output_route!=outputRoute) + res = bdIMADpj_setRouteOutputDevice(strm->bdIMADpjInstance, (bdIMADpj_out_dev_route) outputRoute, &strm->bdIMADpjWarningPtr); + if(res == BD_PJ_OK) { + strm->param.output_route = outputRoute; + return PJ_SUCCESS; + } else { + return PJMEDIA_AUDIODEV_ERRNO_FROM_BDIMAD(res); + } + } + return PJMEDIA_EAUD_INVCAP; } @@ -1011,6 +1027,12 @@ static pj_status_t factory_create_streamBDIMAD(pjmedia_aud_dev_factory *f, ¶m->ec_enabled); } + if(param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE) { + stream_set_capBDIMAD(&strm->base, + PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE, + ¶m->output_route); + } + strm->base.op = &stream_op; *p_aud_strm = &strm->base; @@ -1060,6 +1082,17 @@ static pj_status_t stream_get_param(pjmedia_aud_stream *s, { pi->flags |= PJMEDIA_AUD_DEV_CAP_EC; } + if(stream_get_cap(s, PJMEDIA_AUD_DEV_CAP_EC, &pi->ec_enabled) == PJ_SUCCESS) + { + pi->flags |= PJMEDIA_AUD_DEV_CAP_EC; + } + + + // Get the Route Output Device setting + if(stream_get_cap(s, PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE, &pi->output_route) == PJ_SUCCESS) + { + pi->flags |= PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE; + } return PJ_SUCCESS; } @@ -1113,6 +1146,16 @@ static pj_status_t stream_get_capBDIMAD(pjmedia_aud_stream *s, } else { return PJMEDIA_AUDIODEV_ERRNO_FROM_BDIMAD(res); } + } + else if(cap == PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE) { + pjmedia_aud_dev_route routeOutDev; + res = bdIMADpj_getRouteOutputDevice(strm->bdIMADpjInstance,(bdIMADpj_out_dev_route*)&routeOutDev); + if(res == BD_PJ_OK) { + *(pjmedia_aud_dev_route*)pval = routeOutDev; + return PJ_SUCCESS; + } else { + return PJMEDIA_AUDIODEV_ERRNO_FROM_BDIMAD(res); + } } else { return PJMEDIA_EAUD_INVCAP; } @@ -1176,9 +1219,14 @@ static pj_status_t stream_start(pjmedia_aud_stream *s) } #if defined (_MSC_VER) +#ifdef _DEBUG +#pragma comment ( lib, "bdClientValidationd.lib" ) +#pragma comment ( lib, "bdIMADpjd.lib" ) +#else #pragma comment ( lib, "bdClientValidation.lib" ) #pragma comment ( lib, "bdIMADpj.lib" ) #endif +#endif #endif /* PJMEDIA_AUDIO_DEV_HAS_BDIMAD */ diff --git a/third_party/bdsound/include/bdimad.h b/third_party/bdsound/include/bdimad.h index 929fc213..f70b4444 100644 --- a/third_party/bdsound/include/bdimad.h +++ b/third_party/bdsound/include/bdimad.h @@ -51,7 +51,7 @@ * * - Usage * \n There are only a couple of things the customer have to pay attention on - * §when using bdIMAD library. + * �when using bdIMAD library. * * - Initialization * \n Since the bdIMAD library provide itself the echo cancellation @@ -340,6 +340,22 @@ typedef struct bdIMADpj_libVersion_t{ char *buildDate; /**< build date. */ } bdIMADpj_libVersion_t; + +/** + * @brief Audio output routing setting to pass to set and get route output device functions. + */ +typedef enum bdIMADpj_out_dev_route{ + /** Default route. */ + BD_AUD_DEV_ROUTE_DEFAULT = 0, + + /** Route to loudspeaker */ + BD_AUD_DEV_ROUTE_LOUDSPEAKER = 1, + + /** Route to earpiece */ + BD_AUD_DEV_ROUTE_EARPIECE = 2 +}bdIMADpj_out_dev_route; + + /** * @} */ @@ -408,7 +424,7 @@ BDIMADPJ_API bdIMADpj_Status bdIMADpj_FreeStructures( * \n Note, the pBdIMADInstance * is modified with the applied settings. * @param[out] **ppWarningMessages Pointer to pointer to a - * ::bdIMADpj_Warnings_t sructure, + * ::bdIMADpj_Warnings_t structure, * which reports the warnings after the * initialization. * @return ::BD_PJ_OK if the function has been @@ -513,7 +529,7 @@ BDIMADPJ_API bdIMADpj_Status bdIMADpj_ClearAllWarnings( * @return ::BD_PJ_OK if the function has been * performed successfully, otherwise * return an error (refer to - * §::bdIMADpj_Status). + * �::bdIMADpj_Status). */ BDIMADPJ_API bdIMADpj_Status bdIMADpj_setParameter(bdIMADpj bdIMADInstance, bdIMADpj_Parameter parameterName, void *pValue); @@ -536,6 +552,31 @@ BDIMADPJ_API bdIMADpj_Status bdIMADpj_setParameter(bdIMADpj bdIMADInstance, BDIMADPJ_API bdIMADpj_Status bdIMADpj_getParameter(bdIMADpj bdIMADInstance, bdIMADpj_Parameter parameterName, void *pValue); +/** + * @brief Is used to set the route of the output device of the bdIMAD object pointed by the + * pBdIMADInstance. + * @param[in] bdIMADInstance bdIMAD object. + * @param[in] outputRoute Indicate the route of the output device to set. + * @param[out] **ppWarningMessages Pointer to pointer to a + * ::bdIMADpj_Warnings_t structure, + * which reports the warnings after the + * set function. + * @return ::BD_PJ_OK if the function has been + * performed successfully, otherwise return + * an error (refer to ::bdIMADpj_Status). + */ +BDIMADPJ_API bdIMADpj_Status bdIMADpj_setRouteOutputDevice(bdIMADpj bdIMADInstance, bdIMADpj_out_dev_route outputRoute, bdIMADpj_Warnings_t **ppWarningMessages); + +/** + * @brief Is used to get the route of the output device of the bdIMAD object pointed by the + * pBdIMADInstance. + * @param[in] bdIMADInstance bdIMAD object. + * @param[out] *outputRoute Is a pointer to the route of the output device currently setted. + * @return ::BD_PJ_OK if the function has been + * performed successfully, otherwise return + * an error (refer to ::bdIMADpj_Status). + */ +BDIMADPJ_API bdIMADpj_Status bdIMADpj_getRouteOutputDevice(bdIMADpj bdIMADInstance, bdIMADpj_out_dev_route *outputRoute); #ifdef __cplusplus } -- cgit v1.2.3