diff --git a/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h b/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h index 63be4c5730eaa8cf87aac8310f5895c9ccade7ac..ea197482fb53a35bffc4b062a37d05b409754961 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h +++ b/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h @@ -96,6 +96,7 @@ typedef int (*MSSndCardGetControlFunc)(struct _MSSndCard *obj, MSSndCardControlE typedef struct _MSFilter * (*MSSndCardCreateReaderFunc)(struct _MSSndCard *obj); typedef struct _MSFilter * (*MSSndCardCreateWriterFunc)(struct _MSSndCard *obj); typedef struct _MSSndCard * (*MSSndCardDuplicateFunc)(struct _MSSndCard *obj); +typedef void (*MSSndCardUnloadFunc)(MSSndCardManager *obj); struct _MSSndCardDesc{ const char *driver_type; @@ -110,6 +111,7 @@ struct _MSSndCardDesc{ MSSndCardCreateWriterFunc create_writer; MSSndCardUninitFunc uninit; MSSndCardDuplicateFunc duplicate; + MSSndCardUnloadFunc unload; }; diff --git a/linphone/mediastreamer2/src/mssndcard.c b/linphone/mediastreamer2/src/mssndcard.c index faa6b55455fdde828c8d23bb0464cdc9a35e2e4c..593e3ec8fee7a35e9404cbf930970fb92c078eb3 100644 --- a/linphone/mediastreamer2/src/mssndcard.c +++ b/linphone/mediastreamer2/src/mssndcard.c @@ -33,6 +33,12 @@ static MSSndCardManager * create_manager(){ void ms_snd_card_manager_destroy(void){ if (scm!=NULL){ + MSList *elem; + for(elem=scm->descs;elem!=NULL;elem=elem->next){ + MSSndCardDesc *desc = (MSSndCardDesc*)elem->data; + if (desc->unload!=NULL) + desc->unload(scm); + } ms_list_for_each(scm->cards,(void (*)(void*))ms_snd_card_destroy); ms_list_free(scm->cards); ms_list_free(scm->descs); diff --git a/linphone/mediastreamer2/src/winsnd2.c b/linphone/mediastreamer2/src/winsnd2.c index 5f77c9444fdab970e1bb345295499717154e079d..56a0e3cd247f584b7c59ef24f9fb4e2134808be0 100755 --- a/linphone/mediastreamer2/src/winsnd2.c +++ b/linphone/mediastreamer2/src/winsnd2.c @@ -669,6 +669,7 @@ static void winsndcard_uninit(MSSndCard *card){ static void winsndcard_detect(MSSndCardManager *m); static MSSndCard *winsndcard_dup(MSSndCard *obj); +static void winsndcard_unload(MSSndCardManager *m); MSSndCardDesc winsnd_card_desc={ "MME", @@ -682,7 +683,8 @@ MSSndCardDesc winsnd_card_desc={ ms_winsnd_read_new, ms_winsnd_write_new, winsndcard_uninit, - winsndcard_dup + winsndcard_dup, + winsndcard_unload }; static MSSndCard *winsndcard_dup(MSSndCard *obj){ @@ -796,7 +798,7 @@ static void mark_as_removed(MSSndCardManager *m){ } } -static ms_thread_t poller_thread; +static ms_thread_t poller_thread=NULL; static bool_t poller_running=TRUE; static void * new_device_polling_thread(void *ignore){ @@ -821,15 +823,13 @@ static void stop_poller(){ poller_thread=NULL; } +static void winsndcard_unload(MSSndCardManager *m){ + stop_poller(); +} + static void winsndcard_detect(MSSndCardManager *m){ - static int doitonce = 0; _winsndcard_detect(m); - if (doitonce==0) - { - doitonce++; - ms_thread_create(&poller_thread,NULL,new_device_polling_thread,NULL); - atexit(&stop_poller); - } + ms_thread_create(&poller_thread,NULL,new_device_polling_thread,NULL); } typedef struct WinSnd{ diff --git a/linphone/mediastreamer2/src/winsndds.cpp b/linphone/mediastreamer2/src/winsndds.cpp index 08ea04122ab7bde945e7a2989ecae1a291c5153c..d04b76bfa5f01b3a934e56c11cff610d6914c7ec 100644 --- a/linphone/mediastreamer2/src/winsndds.cpp +++ b/linphone/mediastreamer2/src/winsndds.cpp @@ -766,6 +766,7 @@ static void winsnddscard_uninit(MSSndCard *card){ static void winsnddscard_detect(MSSndCardManager *m); static MSSndCard *winsnddscard_dup(MSSndCard *obj); +static void winsnddscard_unload(MSSndCardManager *m); MSSndCardDesc winsndds_card_desc={ "DirectSound", @@ -779,7 +780,8 @@ MSSndCardDesc winsndds_card_desc={ ms_winsndds_read_new, ms_winsndds_write_new, winsnddscard_uninit, - winsnddscard_dup + winsnddscard_dup, + winsnddscard_unload }; static MSSndCard *winsnddscard_dup(MSSndCard *obj){ @@ -991,7 +993,7 @@ static void mark_as_removed(MSSndCardManager *m){ } } -static ms_thread_t poller_thread; +static ms_thread_t poller_thread=NULL; static bool_t poller_running=TRUE; static void * new_device_polling_thread(void *ignore){ @@ -1016,15 +1018,13 @@ static void stop_poller(){ poller_thread=NULL; } +static void winsnddscard_unload(MSSndCardManager *m){ + stop_poller(); +} + static void winsnddscard_detect(MSSndCardManager *m){ - static int doitonce = 0; _winsnddscard_detect(m); - if (doitonce==0) - { - doitonce++; - ms_thread_create(&poller_thread,NULL,new_device_polling_thread,NULL); - atexit(&stop_poller); - } + ms_thread_create(&poller_thread,NULL,new_device_polling_thread,NULL); } typedef struct WinSndDs{