diff --git a/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h b/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h index 649772732749ace1a6f37e2dcdb3a1dc0fd08a97..d07639d9ee137814d8038889c7587656bf04b40c 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h +++ b/linphone/mediastreamer2/include/mediastreamer2/mssndcard.h @@ -39,6 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. struct _MSSndCardManager{ MSList *cards; + MSList *descs; }; /** @@ -206,6 +207,12 @@ void ms_snd_card_manager_add_card(MSSndCardManager *m, MSSndCard *c); */ void ms_snd_card_manager_register_desc(MSSndCardManager *m, MSSndCardDesc *desc); +/** + * Ask all registered MSSndCardDesc to re-detect their soundcards. + * @param m The sound card manager. +**/ +void ms_snd_card_manager_reload(MSSndCardManager *m); + /** @} */ /** diff --git a/linphone/mediastreamer2/include/mediastreamer2/mswebcam.h b/linphone/mediastreamer2/include/mediastreamer2/mswebcam.h index 3628dae3ff79d28a83ee0c8041faa5d9e17da41d..f56f1f81b8b0818b0f7d96d9425533ab98c44767 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/mswebcam.h +++ b/linphone/mediastreamer2/include/mediastreamer2/mswebcam.h @@ -39,6 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. struct _MSWebCamManager{ MSList *cams; + MSList *descs; }; /** @@ -94,15 +95,15 @@ extern "C"{ MSWebCamManager * ms_web_cam_manager_get(void); /** - * Destroy a sound card manager object. + * Destroy the webcam manager object. * */ void ms_web_cam_manager_destroy(void); /** - * Retreive a sound card object based on its name. + * Retreive a webcam object based on its name. * - * @param m A sound card manager containing sound cards. + * @param m A webcam manager containing webcam. * @param id A name for card to search. * * Returns: MSWebCam if successfull, NULL otherwise. @@ -110,9 +111,9 @@ void ms_web_cam_manager_destroy(void); MSWebCam * ms_web_cam_manager_get_cam(MSWebCamManager *m, const char *id); /** - * Retreive the default sound card object. + * Retreive the default webcam object. * - * @param m A sound card manager containing sound cards. + * @param m A webcam manager containing webcams. * * Returns: MSWebCam if successfull, NULL otherwise. */ @@ -128,7 +129,7 @@ MSWebCam * ms_web_cam_manager_get_default_cam(MSWebCamManager *m); const MSList * ms_web_cam_manager_get_list(MSWebCamManager *m); /** - * Add a sound card object in a webcam manager's list. + * Add a webcam object in a webcam manager's list. * * @param m A webcam manager containing webcams * @param c A web cam object. @@ -137,7 +138,7 @@ const MSList * ms_web_cam_manager_get_list(MSWebCamManager *m); void ms_web_cam_manager_add_cam(MSWebCamManager *m, MSWebCam *c); /** - * Add a sound card object on top of list of the webcam manager's list. + * Add a webcam object on top of list of the webcam manager's list. * * @param m A webcam manager containing webcams * @param c A web cam object. @@ -147,18 +148,26 @@ void ms_web_cam_manager_prepend_cam(MSWebCamManager *m, MSWebCam *c); /** - * Register a sound card description in a sound card manager. + * Register a webcam descriptor in a webcam manager. * - * @param m A sound card manager containing sound cards. - * @param desc A sound card description object. + * @param m A webcam manager containing sound cards. + * @param desc A webcam descriptor object. * */ void ms_web_cam_manager_register_desc(MSWebCamManager *m, MSWebCamDesc *desc); + +/** + * Ask all registered MSWebCamDesc to detect the webcams again. + * + * @param m A webcam manager +**/ +void ms_web_cam_manager_reload(MSWebCamManager *m); + /** * Create an INPUT filter based on the selected camera. * - * @param obj A sound card object. + * @param obj A webcam object. * * Returns: A MSFilter if successfull, NULL otherwise. */ diff --git a/linphone/mediastreamer2/src/mssndcard.c b/linphone/mediastreamer2/src/mssndcard.c index 19e09d8e930b62b27b4139311b2059ee3eff2219..2313b85dc4edf0c9e2b7a6c338f02d2178013aa6 100644 --- a/linphone/mediastreamer2/src/mssndcard.c +++ b/linphone/mediastreamer2/src/mssndcard.c @@ -27,6 +27,7 @@ static MSSndCardManager *scm=NULL; static MSSndCardManager * create_manager(){ MSSndCardManager *obj=(MSSndCardManager *)ms_new(MSSndCardManager,1); obj->cards=NULL; + obj->descs=NULL; return obj; } @@ -34,6 +35,7 @@ void ms_snd_card_manager_destroy(void){ if (scm!=NULL){ ms_list_for_each(scm->cards,(void (*)(void*))ms_snd_card_destroy); ms_list_free(scm->cards); + ms_list_free(scm->descs); } ms_free(scm); scm=NULL; @@ -96,11 +98,25 @@ void ms_snd_card_manager_add_card(MSSndCardManager *m, MSSndCard *c){ m->cards=ms_list_append(m->cards,c); } -void ms_snd_card_manager_register_desc(MSSndCardManager *m, MSSndCardDesc *desc){ +static void card_detect(MSSndCardManager *m, MSSndCardDesc *desc){ if (desc->detect!=NULL) desc->detect(m); } +void ms_snd_card_manager_register_desc(MSSndCardManager *m, MSSndCardDesc *desc){ + m->descs=ms_list_append(m->descs,desc); + card_detect(m,desc); +} + +void ms_snd_card_manager_reload(MSSndCardManager *m){ + MSList *elem; + ms_list_for_each(m->cards,(void (*)(void*))ms_snd_card_destroy); + ms_list_free(m->cards); + m->cards=NULL; + for(elem=m->descs;elem!=NULL;elem=elem->next) + card_detect(m,(MSSndCardDesc*)elem->data); +} + MSSndCard * ms_snd_card_dup(MSSndCard *card){ MSSndCard *obj=NULL; if (card->desc->duplicate!=NULL) diff --git a/linphone/mediastreamer2/src/mswebcam.c b/linphone/mediastreamer2/src/mswebcam.c index 5548c9295ea41466b9aa564a2b12ccdad37ce709..fa360ec4e54ca32295f1d032465830fe25043276 100644 --- a/linphone/mediastreamer2/src/mswebcam.c +++ b/linphone/mediastreamer2/src/mswebcam.c @@ -29,6 +29,7 @@ static MSWebCamManager *scm=NULL; static MSWebCamManager * create_manager(){ MSWebCamManager *obj=(MSWebCamManager *)ms_new(MSWebCamManager,1); obj->cams=NULL; + obj->descs=NULL; return obj; } @@ -36,6 +37,7 @@ void ms_web_cam_manager_destroy(void){ if (scm!=NULL){ ms_list_for_each(scm->cams,(void (*)(void*))ms_web_cam_destroy); ms_list_free(scm->cams); + ms_list_free(scm->descs); } ms_free(scm); scm=NULL; @@ -58,9 +60,9 @@ MSWebCam * ms_web_cam_manager_get_cam(MSWebCamManager *m, const char *id){ } MSWebCam * ms_web_cam_manager_get_default_cam(MSWebCamManager *m){ - if (m->cams!=NULL) - return (MSWebCam*)m->cams->data; - return NULL; + if (m->cams!=NULL) + return (MSWebCam*)m->cams->data; + return NULL; } const MSList * ms_web_cam_manager_get_list(MSWebCamManager *m){ @@ -77,11 +79,25 @@ void ms_web_cam_manager_prepend_cam(MSWebCamManager *m, MSWebCam *c){ m->cams=ms_list_prepend(m->cams,c); } -void ms_web_cam_manager_register_desc(MSWebCamManager *m, MSWebCamDesc *desc){ +static void cam_detect(MSWebCamManager *m, MSWebCamDesc *desc){ if (desc->detect!=NULL) desc->detect(m); } +void ms_web_cam_manager_register_desc(MSWebCamManager *m, MSWebCamDesc *desc){ + m->descs=ms_list_append(m->descs,desc); + cam_detect(m,desc); +} + +void ms_web_cam_manager_reload(MSWebCamManager *m){ + MSList *elem; + ms_list_for_each(m->cams,(void (*)(void*))ms_web_cam_destroy); + ms_list_free(m->cams); + m->cams=NULL; + for(elem=m->descs;elem!=NULL;elem=elem->next) + cam_detect(m,(MSWebCamDesc*)elem->data); +} + MSWebCam * ms_web_cam_new(MSWebCamDesc *desc){ MSWebCam *obj=(MSWebCam *)ms_new(MSWebCam,1); obj->desc=desc; diff --git a/linphone/oRTP/configure.ac b/linphone/oRTP/configure.ac index 7cfdec4a44cfa5373039cc939e05c02267862bc6..6cd22fbbe692fb6d3bce2d12efec609d6ffb0cb0 100644 --- a/linphone/oRTP/configure.ac +++ b/linphone/oRTP/configure.ac @@ -202,6 +202,20 @@ if test "$memcheck_enabled" = "yes" ; then fi fi +AC_ARG_ENABLE(so-reuseaddr, + [ --enable-so-reuseaddr=[yes/no] enables SO_REUSEADDR socket option in the rtp_session_set_local_addr() function.], + [case "${enableval}" in + yes) so_reuseaddr_enabled=yes;; + no) so_reuseaddr_enabled=no;; + *) AC_MSG_ERROR("Bad value for --enable-so-reuseaddr");; + esac], + [so_reuseaddr_enabled=yes]) + +if test "$so_reuseaddr_enabled" = "yes" ; then + AC_DEFINE(SO_REUSE_ADDR,1,[Defined when SO_REUSEADDR socket option in the rtp_session_set_local_addr() function is enabled]) +fi + + dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(poll.h sys/poll.h sys/uio.h fcntl.h sys/time.h unistd.h sys/audio.h linux/soundcard.h) diff --git a/linphone/oRTP/src/ortp-config-win32.h b/linphone/oRTP/src/ortp-config-win32.h index 6227ef64b71cbdf44147a70aa4091eb5db6e75ae..d98265ee779b3a8706e0ca86b503443eb21a32b0 100644 --- a/linphone/oRTP/src/ortp-config-win32.h +++ b/linphone/oRTP/src/ortp-config-win32.h @@ -29,3 +29,6 @@ #define RTP_DEBUG 1 #define HAVE_SRTP 1 + +/* enables SO_REUSEADDR socket option in the rtp_session_set_local_addr() function */ +#define SO_REUSE_ADDR 1 diff --git a/linphone/oRTP/src/rtpsession_inet.c b/linphone/oRTP/src/rtpsession_inet.c index 0a9927bfffa80cc3280691983fbe1cc08f30d3b0..27c319d5d0f5981947149af9560c129bee88b535 100644 --- a/linphone/oRTP/src/rtpsession_inet.c +++ b/linphone/oRTP/src/rtpsession_inet.c @@ -246,13 +246,19 @@ rtp_session_set_local_addr (RtpSession * session, const char * addr, int port) { ortp_socket_t sock; int sockfamily; + bool_t reuse_addr; if (session->rtp.socket>=0){ /* don't rebind, but close before*/ rtp_session_release_sockets(session); } +#ifdef SO_REUSE_ADDR + reuse_addr=TRUE; +#else + reuse_addr=FALSE; +#endif /* try to bind the rtp port */ if (port>0) - sock=create_and_bind(addr,port,&sockfamily,TRUE); + sock=create_and_bind(addr,port,&sockfamily,reuse_addr); else sock=create_and_bind_random(addr,&sockfamily,&port); if (sock!=-1){ @@ -261,7 +267,7 @@ rtp_session_set_local_addr (RtpSession * session, const char * addr, int port) session->rtp.socket=sock; session->rtp.loc_port=port; /*try to bind rtcp port */ - sock=create_and_bind(addr,port+1,&sockfamily,TRUE); + sock=create_and_bind(addr,port+1,&sockfamily,reuse_addr); if (sock!=-1){ session->rtcp.sockfamily=sockfamily; session->rtcp.socket=sock;