summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2010-05-05 04:23:27 +0000
committerLiong Sauw Ming <ming@teluu.com>2010-05-05 04:23:27 +0000
commit165f6a50faef766ca2532b717fe27f8e335e8265 (patch)
treecf9820da3385f51ad6da086a5e64a7ab1750b27a
parent810416dab92eeb54a9b01221ee9ff262305b13b5 (diff)
Implemented ticket #1065: audiodev register/unregister feature
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3159 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/include/pjmedia-audiodev/audiodev.h35
-rw-r--r--pjmedia/src/pjmedia-audiodev/audiodev.c55
2 files changed, 85 insertions, 5 deletions
diff --git a/pjmedia/include/pjmedia-audiodev/audiodev.h b/pjmedia/include/pjmedia-audiodev/audiodev.h
index 8f2ab783..5a523ca8 100644
--- a/pjmedia/include/pjmedia-audiodev/audiodev.h
+++ b/pjmedia/include/pjmedia-audiodev/audiodev.h
@@ -39,7 +39,7 @@ PJ_BEGIN_DECL
* @{
*/
-/**
+/**
* Type for device index.
*/
typedef pj_int32_t pjmedia_aud_dev_index;
@@ -428,6 +428,11 @@ typedef struct pjmedia_aud_stream pjmedia_aud_stream;
/** Forward declaration for audio device factory */
typedef struct pjmedia_aud_dev_factory pjmedia_aud_dev_factory;
+/* typedef for factory creation function */
+typedef pjmedia_aud_dev_factory*
+(*pjmedia_aud_dev_factory_create_func_ptr)(pj_pool_factory*);
+
+
/**
* Get string info for the specified capability.
*
@@ -510,6 +515,34 @@ PJ_DECL(pj_status_t) pjmedia_aud_subsys_shutdown(void);
/**
+ * Register a supported audio device factory to the audio subsystem. This
+ * function can only be called after calling #pjmedia_aud_subsys_init().
+ *
+ * @param adf The audio device factory.
+ *
+ * @return PJ_SUCCESS on successful operation or the appropriate
+ * error code.
+ */
+PJ_DECL(pj_status_t)
+pjmedia_aud_register_factory(pjmedia_aud_dev_factory_create_func_ptr adf);
+
+
+/**
+ * Unregister an audio device factory from the audio subsystem. This
+ * function can only be called after calling #pjmedia_aud_subsys_init().
+ * Devices from this factory will be unlisted. If a device from this factory
+ * is currently in use, then the behavior is undefined.
+ *
+ * @param adf The audio device factory.
+ *
+ * @return PJ_SUCCESS on successful operation or the appropriate
+ * error code.
+ */
+PJ_DECL(pj_status_t)
+pjmedia_aud_unregister_factory(pjmedia_aud_dev_factory_create_func_ptr adf);
+
+
+/**
* Get the number of sound devices installed in the system.
*
* @return The number of sound devices installed in the system.
diff --git a/pjmedia/src/pjmedia-audiodev/audiodev.c b/pjmedia/src/pjmedia-audiodev/audiodev.c
index 38c3b4ca..16c4a742 100644
--- a/pjmedia/src/pjmedia-audiodev/audiodev.c
+++ b/pjmedia/src/pjmedia-audiodev/audiodev.c
@@ -97,14 +97,14 @@ pjmedia_aud_dev_factory* pjmedia_null_audio_factory(pj_pool_factory *pf);
#define MAX_DRIVERS 16
#define MAX_DEVS 64
-/* typedef for factory creation function */
-typedef pjmedia_aud_dev_factory* (*create_func_ptr)(pj_pool_factory*);
/* driver structure */
struct driver
{
- create_func_ptr create; /* Creation function. */
- pjmedia_aud_dev_factory *f; /* Factory instance. */
+ /* Creation function */
+ pjmedia_aud_dev_factory_create_func_ptr create;
+ /* Factory instance */
+ pjmedia_aud_dev_factory *f;
char name[32]; /* Driver name */
unsigned dev_cnt; /* Number of devices */
unsigned start_idx; /* Start index in global list */
@@ -410,6 +410,53 @@ PJ_DEF(pj_status_t) pjmedia_aud_subsys_init(pj_pool_factory *pf)
return aud_subsys.dev_cnt ? PJ_SUCCESS : status;
}
+/* API: register an audio device factory to the audio subsystem. */
+PJ_DEF(pj_status_t)
+pjmedia_aud_register_factory(pjmedia_aud_dev_factory_create_func_ptr adf)
+{
+ pj_status_t status;
+
+ if (aud_subsys.init_count == 0)
+ return PJMEDIA_EAUD_INIT;
+
+ aud_subsys.drv[aud_subsys.drv_cnt].create = adf;
+ status = init_driver(aud_subsys.drv_cnt);
+ if (status == PJ_SUCCESS) {
+ aud_subsys.drv_cnt++;
+ } else {
+ deinit_driver(aud_subsys.drv_cnt);
+ }
+
+ return status;
+}
+
+/* API: unregister an audio device factory from the audio subsystem. */
+PJ_DEF(pj_status_t)
+pjmedia_aud_unregister_factory(pjmedia_aud_dev_factory_create_func_ptr adf)
+{
+ unsigned i, j;
+
+ if (aud_subsys.init_count == 0)
+ return PJMEDIA_EAUD_INIT;
+
+ for (i=0; i<aud_subsys.drv_cnt; ++i) {
+ struct driver *drv = &aud_subsys.drv[i];
+
+ if (drv->create == adf) {
+ for (j = drv->start_idx; j < drv->start_idx + drv->dev_cnt; j++)
+ {
+ aud_subsys.dev_list[j] = PJMEDIA_AUD_INVALID_DEV;
+ }
+
+ deinit_driver(i);
+ pj_bzero(drv, sizeof(*drv));
+ return PJ_SUCCESS;
+ }
+ }
+
+ return PJMEDIA_EAUD_ERR;
+}
+
/* API: get the pool factory registered to the audio subsystem. */
PJ_DEF(pj_pool_factory*) pjmedia_aud_subsys_get_pool_factory(void)
{