static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group) { int fd = net_ConnectUDP (obj, group, IPPORT_SAP, 255); if (fd == -1) return NULL; sap_address_t *addr = malloc (sizeof (*addr)); if (addr == NULL) { net_Close (fd); return NULL; } strlcpy (addr->group, group, sizeof (addr->group)); addr->fd = fd; addr->origlen = sizeof (addr->orig); getsockname (fd, (struct sockaddr *)&addr->orig, &addr->origlen); addr->interval = var_CreateGetInteger (obj, "sap-interval"); vlc_mutex_init (&addr->lock); vlc_cond_init (&addr->wait); addr->session_count = 0; addr->first = NULL; if (vlc_clone (&addr->thread, RunThread, addr, VLC_THREAD_PRIORITY_LOW)) { msg_Err (obj, "unable to spawn SAP announce thread"); net_Close (fd); free (addr); return NULL; } return addr; }
/***************************************************************************** * Activate: initialize and create stuff *****************************************************************************/ static int Activate( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t*)p_this; int fd; if( config_GetInt( p_intf, "netsync-master" ) <= 0 ) { char *psz_master = config_GetPsz( p_intf, "netsync-master-ip" ); if( psz_master == NULL ) { msg_Err( p_intf, "master address not specified" ); return VLC_EGENERIC; } fd = net_ConnectUDP( VLC_OBJECT(p_intf), psz_master, NETSYNC_PORT, -1 ); free( psz_master ); } else fd = net_ListenUDP1( VLC_OBJECT(p_intf), NULL, NETSYNC_PORT ); if( fd == -1 ) { msg_Err( p_intf, "Netsync socket failure" ); return VLC_EGENERIC; } p_intf->p_sys = (void *)(intptr_t)fd; p_intf->pf_run = Run; return VLC_SUCCESS; }
/***************************************************************************** * Activate: initialize and create stuff *****************************************************************************/ static int Open(vlc_object_t *object) { intf_thread_t *intf = (intf_thread_t*)object; intf_sys_t *sys; int fd; if (!var_InheritBool(intf, "netsync-master")) { char *psz_master = var_InheritString(intf, "netsync-master-ip"); if (psz_master == NULL) { msg_Err(intf, "master address not specified"); return VLC_EGENERIC; } fd = net_ConnectUDP(VLC_OBJECT(intf), psz_master, NETSYNC_PORT, -1); free(psz_master); } else { fd = net_ListenUDP1(VLC_OBJECT(intf), NULL, NETSYNC_PORT); } if (fd == -1) { msg_Err(intf, "Netsync socket failure"); return VLC_EGENERIC; } intf->pf_run = NULL; intf->p_sys = sys = malloc(sizeof(*sys)); if (!sys) { net_Close(fd); return VLC_ENOMEM; } sys->fd = fd; sys->is_master = var_InheritBool(intf, "netsync-master"); sys->timeout = var_InheritInteger(intf, "netsync-timeout"); if (sys->timeout < 500) sys->timeout = 500; sys->playlist = pl_Get(intf); sys->input = NULL; var_AddCallback(sys->playlist, "input-current", PlaylistEvent, intf); return VLC_SUCCESS; }