sap.c: clean up playlist handling

parent f3b8af1f
...@@ -211,6 +211,7 @@ struct services_discovery_sys_t ...@@ -211,6 +211,7 @@ struct services_discovery_sys_t
/* playlist node */ /* playlist node */
playlist_item_t *p_node; playlist_item_t *p_node;
playlist_t *p_playlist;
/* charset conversion */ /* charset conversion */
vlc_iconv_t iconvHandle; vlc_iconv_t iconvHandle;
...@@ -276,7 +277,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -276,7 +277,6 @@ static int Open( vlc_object_t *p_this )
services_discovery_sys_t *p_sys = (services_discovery_sys_t *) services_discovery_sys_t *p_sys = (services_discovery_sys_t *)
malloc( sizeof( services_discovery_sys_t ) ); malloc( sizeof( services_discovery_sys_t ) );
playlist_t *p_playlist;
playlist_view_t *p_view; playlist_view_t *p_view;
char *psz_addr, *psz_charset; char *psz_addr, *psz_charset;
vlc_value_t val; vlc_value_t val;
...@@ -346,23 +346,22 @@ static int Open( vlc_object_t *p_this ) ...@@ -346,23 +346,22 @@ static int Open( vlc_object_t *p_this )
} }
/* Create our playlist node */ /* Create our playlist node */
p_playlist = (playlist_t *)vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST, p_sys->p_playlist = (playlist_t *)vlc_object_find( p_sd,
FIND_ANYWHERE ); VLC_OBJECT_PLAYLIST,
if( !p_playlist ) FIND_ANYWHERE );
if( !p_sys->p_playlist )
{ {
msg_Warn( p_sd, "unable to find playlist, cancelling SAP listening"); msg_Warn( p_sd, "unable to find playlist, cancelling SAP listening");
return VLC_EGENERIC; return VLC_EGENERIC;
} }
p_view = playlist_ViewFind( p_playlist, VIEW_CATEGORY ); p_view = playlist_ViewFind( p_sys->p_playlist, VIEW_CATEGORY );
p_sys->p_node = playlist_NodeCreate( p_playlist, VIEW_CATEGORY, p_sys->p_node = playlist_NodeCreate( p_sys->p_playlist, VIEW_CATEGORY,
_("SAP"), p_view->p_root ); _("SAP"), p_view->p_root );
p_sys->p_node->i_flags |= PLAYLIST_RO_FLAG; p_sys->p_node->i_flags |= PLAYLIST_RO_FLAG;
p_sys->p_node->i_flags =~ PLAYLIST_SKIP_FLAG; p_sys->p_node->i_flags =~ PLAYLIST_SKIP_FLAG;
val.b_bool = VLC_TRUE; val.b_bool = VLC_TRUE;
var_Set( p_playlist, "intf-change", val ); var_Set( p_sys->p_playlist, "intf-change", val );
vlc_object_release( p_playlist );
p_sys->i_announces = 0; p_sys->i_announces = 0;
p_sys->pp_announces = NULL; p_sys->pp_announces = NULL;
...@@ -468,7 +467,6 @@ static void Close( vlc_object_t *p_this ) ...@@ -468,7 +467,6 @@ static void Close( vlc_object_t *p_this )
services_discovery_t *p_sd = ( services_discovery_t* )p_this; services_discovery_t *p_sd = ( services_discovery_t* )p_this;
services_discovery_sys_t *p_sys = p_sd->p_sys; services_discovery_sys_t *p_sys = p_sd->p_sys;
playlist_t *p_playlist;
int i; int i;
for( i = p_sys->i_fd-1 ; i >= 0 ; i-- ) for( i = p_sys->i_fd-1 ; i >= 0 ; i-- )
...@@ -488,13 +486,11 @@ static void Close( vlc_object_t *p_this ) ...@@ -488,13 +486,11 @@ static void Close( vlc_object_t *p_this )
} }
FREE( p_sys->pp_announces ); FREE( p_sys->pp_announces );
p_playlist = (playlist_t *) vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST, if( p_sys->p_playlist )
FIND_ANYWHERE );
if( p_playlist )
{ {
playlist_NodeDelete( p_playlist, p_sys->p_node, VLC_TRUE , VLC_TRUE ); playlist_NodeDelete( p_sys->p_playlist, p_sys->p_node, VLC_TRUE,
vlc_object_release( p_playlist ); VLC_TRUE );
vlc_object_release( p_sys->p_playlist );
} }
vlc_iconv_close( p_sys->iconvHandle ); vlc_iconv_close( p_sys->iconvHandle );
...@@ -520,7 +516,6 @@ static void CloseDemux( vlc_object_t *p_this ) ...@@ -520,7 +516,6 @@ static void CloseDemux( vlc_object_t *p_this )
static void Run( services_discovery_t *p_sd ) static void Run( services_discovery_t *p_sd )
{ {
int i; int i;
playlist_t *p_playlist;
/* read SAP packets */ /* read SAP packets */
while( !p_sd->b_die ) while( !p_sd->b_die )
...@@ -540,25 +535,11 @@ static void Run( services_discovery_t *p_sd ) ...@@ -540,25 +535,11 @@ static void Run( services_discovery_t *p_sd )
if( mdate() - p_sd->p_sys->pp_announces[i]->i_last > i_timeout ) if( mdate() - p_sd->p_sys->pp_announces[i]->i_last > i_timeout )
{ {
struct sap_announce_t *p_announce; struct sap_announce_t *p_announce;
playlist_item_t * p_item;
p_announce = p_sd->p_sys->pp_announces[i]; p_announce = p_sd->p_sys->pp_announces[i];
/* Remove the playlist item */ /* Remove the playlist item */
p_playlist = vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST, playlist_LockDelete( p_sd->p_sys->p_playlist,
FIND_ANYWHERE ); p_announce->i_item_id );
if( p_playlist )
{
p_item = playlist_ItemGetById( p_playlist,
p_announce->i_item_id );
if( !p_item ) continue;
msg_Dbg( p_sd, "Time out for %s, deleting (%i/%i)",
p_item->input.psz_name,
i , p_sd->p_sys->i_announces );
playlist_Delete( p_playlist, p_announce->i_item_id );
vlc_object_release( p_playlist );
}
/* Remove the sap_announce from the array */ /* Remove the sap_announce from the array */
REMOVE_ELEM( p_sd->p_sys->pp_announces, REMOVE_ELEM( p_sd->p_sys->pp_announces,
...@@ -802,7 +783,6 @@ static int ParseSAP( services_discovery_t *p_sd, uint8_t *p_buffer, int i_read ) ...@@ -802,7 +783,6 @@ static int ParseSAP( services_discovery_t *p_sd, uint8_t *p_buffer, int i_read )
sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash,
sdp_t *p_sdp ) sdp_t *p_sdp )
{ {
playlist_t *p_playlist;
playlist_item_t *p_item, *p_child; playlist_item_t *p_item, *p_child;
char *psz_value; char *psz_value;
sap_announce_t *p_sap = (sap_announce_t *)malloc( sap_announce_t *p_sap = (sap_announce_t *)malloc(
...@@ -849,15 +829,6 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, ...@@ -849,15 +829,6 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash,
psz_value = GetAttribute( p_sap->p_sdp, "plgroup" ); psz_value = GetAttribute( p_sap->p_sdp, "plgroup" );
} }
p_playlist = (playlist_t *)vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST,
FIND_ANYWHERE );
if( !p_playlist )
{
msg_Err( p_sd, "playlist not found" );
free( p_sap );
return NULL;
}
if( psz_value != NULL ) if( psz_value != NULL )
{ {
char *psz_grp = convert_from_utf8( p_sd, psz_value ); char *psz_grp = convert_from_utf8( p_sd, psz_value );
...@@ -869,15 +840,15 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, ...@@ -869,15 +840,15 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash,
if( p_child == NULL ) if( p_child == NULL )
{ {
p_child = playlist_NodeCreate( p_playlist, VIEW_CATEGORY, p_child = playlist_NodeCreate( p_sd->p_sys->p_playlist,
psz_grp, p_sd->p_sys->p_node ); VIEW_CATEGORY, psz_grp,
p_sd->p_sys->p_node );
p_child->i_flags =~ PLAYLIST_SKIP_FLAG; p_child->i_flags =~ PLAYLIST_SKIP_FLAG;
} }
free( psz_grp ); free( psz_grp );
} }
else else
{ {
vlc_object_release( p_playlist );
msg_Err( p_sd, "out of memory"); msg_Err( p_sd, "out of memory");
free( p_sap ); free( p_sap );
return NULL; return NULL;
...@@ -891,10 +862,8 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, ...@@ -891,10 +862,8 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash,
p_item->i_flags &= ~PLAYLIST_SKIP_FLAG; p_item->i_flags &= ~PLAYLIST_SKIP_FLAG;
p_item->i_flags &= ~PLAYLIST_SAVE_FLAG; p_item->i_flags &= ~PLAYLIST_SAVE_FLAG;
playlist_NodeAddItem( p_playlist, p_item, VIEW_CATEGORY, p_child, playlist_NodeAddItem( p_sd->p_sys->p_playlist, p_item, VIEW_CATEGORY,
PLAYLIST_APPEND, PLAYLIST_END ); p_child, PLAYLIST_APPEND, PLAYLIST_END );
vlc_object_release( p_playlist );
p_sap->i_item_id = p_item->input.i_id; p_sap->i_item_id = p_item->input.i_id;
...@@ -1459,20 +1428,12 @@ static int RemoveAnnounce( services_discovery_t *p_sd, ...@@ -1459,20 +1428,12 @@ static int RemoveAnnounce( services_discovery_t *p_sd,
sap_announce_t *p_announce ) sap_announce_t *p_announce )
{ {
int i; int i;
playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_sd,
VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_announce->p_sdp ) FreeSDP( p_announce->p_sdp ); if( p_announce->p_sdp ) FreeSDP( p_announce->p_sdp );
if( !p_playlist )
{
free( p_announce );
return VLC_EGENERIC;
}
if( p_announce->i_item_id > -1 ) if( p_announce->i_item_id > -1 )
{ {
playlist_LockDelete( p_playlist, p_announce->i_item_id ); playlist_LockDelete( p_sd->p_sys->p_playlist, p_announce->i_item_id );
} }
for( i = 0; i< p_sd->p_sys->i_announces; i++) for( i = 0; i< p_sd->p_sys->i_announces; i++)
...@@ -1485,8 +1446,6 @@ static int RemoveAnnounce( services_discovery_t *p_sd, ...@@ -1485,8 +1446,6 @@ static int RemoveAnnounce( services_discovery_t *p_sd,
} }
} }
vlc_object_release( p_playlist );
free( p_announce ); free( p_announce );
return VLC_SUCCESS; return VLC_SUCCESS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment