summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2014-02-18 01:41:45 +0000
committerBenny Prijono <bennylp@teluu.com>2014-02-18 01:41:45 +0000
commit705a5aad8174993ca69db59c0fa9eb2098b60b21 (patch)
treeb518ff2e21eed724e9b97332f3848653608e74a2
parent3ed38e37eafd76b8efcf36fe69adcd3c96847db8 (diff)
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
-rw-r--r--pjmedia/src/pjmedia-audiodev/bdimad_dev.c50
-rw-r--r--third_party/bdsound/include/bdimad.h47
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;i<playbackDeviceCount;i++) {
wf->dev_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,
&param->ec_enabled);
}
+ if(param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE) {
+ stream_set_capBDIMAD(&strm->base,
+ PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
+ &param->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 @@
*
* - <b>Usage</b>
* \n There are only a couple of things the customer have to pay attention on
- * §when using bdIMAD library.
+ * �when using bdIMAD library.
*
* - <b>Initialization</b>
* \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 <code>pBdIMADInstance</code>
* 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
+ * <code>pBdIMADInstance</code>.
+ * @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
+ * <code>pBdIMADInstance</code>.
+ * @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
}