diff options
author | Liong Sauw Ming <ming@teluu.com> | 2010-05-05 04:23:27 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2010-05-05 04:23:27 +0000 |
commit | 165f6a50faef766ca2532b717fe27f8e335e8265 (patch) | |
tree | cf9820da3385f51ad6da086a5e64a7ab1750b27a /pjmedia/src/pjmedia-audiodev/audiodev.c | |
parent | 810416dab92eeb54a9b01221ee9ff262305b13b5 (diff) |
Implemented ticket #1065: audiodev register/unregister feature
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3159 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia-audiodev/audiodev.c')
-rw-r--r-- | pjmedia/src/pjmedia-audiodev/audiodev.c | 55 |
1 files changed, 51 insertions, 4 deletions
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) { |