diff options
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/include/pjmedia-audiodev/audiodev.h | 35 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-audiodev/audiodev.c | 55 |
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) { |