Commit 662ed774 authored by Rafaël Carré's avatar Rafaël Carré

Input access locking, part 2.

Fix [21193]
parent a387a1ff
......@@ -26,6 +26,11 @@
#error You are not libvlc or one of its plugins. You cannot include this file
#endif
#ifndef __USE_GNU
#define __USE_GNU
#endif
#include <string.h> /* strcasestr() */
/* __ is need because conflict with <vlc/input.h> */
#ifndef _VLC__INPUT_H
#define _VLC__INPUT_H 1
......@@ -222,11 +227,11 @@ static inline void input_item_SetMeta( input_item_t *p_i, vlc_meta_type_t meta_t
{
vlc_event_t event;
//vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock( &p_i->lock );
if( !p_i->p_meta )
p_i->p_meta = vlc_meta_New();
vlc_meta_Set( p_i->p_meta, meta_type, psz_val );
//vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock( &p_i->lock );
/* Notify interested third parties */
event.type = vlc_InputItemMetaChanged;
......@@ -236,10 +241,10 @@ static inline void input_item_SetMeta( input_item_t *p_i, vlc_meta_type_t meta_t
static inline vlc_bool_t input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz )
{
//vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock( &p_i->lock );
const char * meta = vlc_meta_Get( p_i->p_meta, meta_type );
vlc_bool_t ret = meta && strcasestr( meta, psz );
//vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock( &p_i->lock );
return ret;
}
......@@ -247,26 +252,26 @@ static inline vlc_bool_t input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_
static inline char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type )
{
char * psz = NULL;
//vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock( &p_i->lock );
if( !p_i->p_meta )
{
//vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock( &p_i->lock );
return NULL;
}
if( vlc_meta_Get( p_i->p_meta, meta_type ) )
psz = strdup( vlc_meta_Get( p_i->p_meta, meta_type ) );
//vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock( &p_i->lock );
return psz;
}
static inline char * input_item_GetName( input_item_t * p_i )
{
//vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock( &p_i->lock );
char *psz_s = p_i->psz_name ? strdup( p_i->psz_name ) : NULL;
//vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock( &p_i->lock );
return psz_s;
}
......
......@@ -124,21 +124,22 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
if( !p_input ) return VLC_SUCCESS;
vlc_object_yield( p_input );
if( p_input->b_dead || !input_GetItem(p_input)->psz_name )
char *psz_name = input_item_GetName( input_GetItem( p_input ) );
if( p_input->b_dead || !psz_name )
{
/* Not playing anything ... */
free( psz_name );
vlc_object_release( p_input );
return VLC_SUCCESS;
}
free( psz_name );
/* Playing something ... */
psz_artist = input_item_GetArtist( input_GetItem(p_input) ) ?
strdup( input_item_GetArtist( input_GetItem(p_input) ) ) :
strdup( "" );
psz_album = input_item_GetAlbum( input_GetItem(p_input) ) ?
strdup( input_item_GetAlbum( input_GetItem(p_input) ) ) :
strdup("" );
psz_title = strdup( input_GetItem(p_input)->psz_name );
psz_artist = input_item_GetArtist( input_GetItem( p_input ) );
if( psz_artist == NULL ) psz_artist = strdup( "" );
psz_album = input_item_GetAlbum( input_GetItem( p_input ) ) ;
if( psz_album == NULL ) psz_album = strdup( "" );
psz_title = input_item_GetName( input_GetItem( p_input ) );
if( psz_title == NULL ) psz_title = strdup( N_("(no title)") );
snprintf( psz_tmp, GROWL_MAX_LENGTH, "%s %s %s",
psz_title, psz_artist, psz_album );
......
......@@ -150,13 +150,11 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
}
/* Playing something ... */
psz_artist = input_item_GetArtist( input_GetItem(p_input) ) ?
strdup( input_item_GetArtist( input_GetItem(p_input) ) ) :
strdup( _("no artist") );
psz_album = input_item_GetAlbum( input_GetItem(p_input) ) ?
strdup( input_item_GetAlbum( input_GetItem(p_input) ) ) :
strdup( _("no album") );
psz_title = strdup( input_GetItem(p_input)->psz_name );
psz_artist = input_item_GetArtist( input_GetItem( p_input ) );
if( psz_artist == NULL ) psz_artist = strdup( _("no artist") );
psz_album = input_item_GetAlbum( input_GetItem( p_input ) ) ;
if( psz_album == NULL ) psz_album = strdup( _("no album") );
psz_title = input_item_GetName( input_GetItem( p_input ) );
vlc_object_release( p_input );
......
......@@ -65,13 +65,11 @@ static void DoChildren( playlist_t *p_playlist, playlist_export_t *p_export,
assert( p_current->p_input->psz_uri );
/* General info */
if( p_current->p_input->psz_name &&
strcmp( p_current->p_input->psz_uri,
p_current->p_input->psz_name ) )
char *psz_name = input_item_GetName( p_current->p_input );
if( psz_name && strcmp( p_current->p_input->psz_uri, psz_name ) )
{
char *psz_artist = input_item_GetArtist( p_current->p_input ) ?
strdup( input_item_GetArtist( p_current->p_input ) ):
strdup( "" );
char *psz_artist = input_item_GetArtist( p_current->p_input );
if( psz_artist == NULL ) psz_artist = strdup( "" );
if( psz_artist && *psz_artist )
{
/* write EXTINF with artist */
......@@ -87,9 +85,9 @@ static void DoChildren( playlist_t *p_playlist, playlist_export_t *p_export,
(int)( p_current->p_input->i_duration/1000000 ),
p_current->p_input->psz_name);
}
if( psz_artist )
free( psz_artist );
}
free( psz_name );
/* VLC specific options */
for( j = 0; j < p_current->p_input->i_options; j++ )
......
......@@ -163,11 +163,10 @@ static void xspf_export_item( playlist_item_t *p_item, FILE *p_file,
}
/* -> the artist/creator */
psz = input_item_GetArtist( p_item->p_input ) ?
strdup( input_item_GetArtist( p_item->p_input ) ):
strdup( "" );
psz = input_item_GetArtist( p_item->p_input );
if( psz == NULL ) psz = strdup( "" );
psz_temp = convert_xml_special_chars( psz );
if( psz ) free( psz );
free( psz );
if( *psz_temp )
{
fprintf( p_file, "\t\t\t<creator>%s</creator>\n", psz_temp );
......@@ -175,11 +174,10 @@ static void xspf_export_item( playlist_item_t *p_item, FILE *p_file,
free( psz_temp );
/* -> the album */
psz = input_item_GetAlbum( p_item->p_input ) ?
strdup( input_item_GetAlbum( p_item->p_input ) ):
strdup( "" );
psz = input_item_GetAlbum( p_item->p_input );
if( psz == NULL ) psz = strdup( "" );
psz_temp = convert_xml_special_chars( psz );
if( psz ) free( psz );
free( psz );
if( *psz_temp )
{
fprintf( p_file, "\t\t\t<album>%s</album>\n", psz_temp );
......@@ -187,24 +185,22 @@ static void xspf_export_item( playlist_item_t *p_item, FILE *p_file,
free( psz_temp );
/* -> the track number */
psz = input_item_GetTrackNum( p_item->p_input ) ?
strdup( input_item_GetTrackNum( p_item->p_input ) ):
strdup( "" );
psz = input_item_GetTrackNum( p_item->p_input );
if( psz == NULL ) psz = strdup( "" );
if( psz )
{
if( *psz )
{
fprintf( p_file, "\t\t\t<trackNum>%i</trackNum>\n", atoi( psz ) );
}
free( psz );
}
free( psz );
/* -> the description */
psz = input_item_GetDescription( p_item->p_input ) ?
strdup( input_item_GetDescription( p_item->p_input ) ):
strdup( "" );
psz = input_item_GetDescription( p_item->p_input );
if( psz == NULL ) psz = strdup( "" );
psz_temp = convert_xml_special_chars( psz );
if( psz ) free( psz );
free( psz );
if( *psz_temp )
{
fprintf( p_file, "\t\t\t<annotation>%s</annotation>\n", psz_temp );
......
......@@ -416,12 +416,10 @@ static char *TitleGet( vlc_object_t *p_this )
if( p_input )
{
if( !EMPTY_STR( input_item_GetTitle( input_GetItem(p_input) ) ) )
{
psz_title = strdup( input_item_GetTitle( input_GetItem(p_input) ) );
}
else
psz_title = strdup( input_item_GetTitle( input_GetItem( p_input ) ) );
if( EMPTY_STR( psz_title ) )
{
free( psz_title );
char *psz = strrchr( input_GetItem(p_input)->psz_uri, '/' );
if( psz )
......
......@@ -152,7 +152,7 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
p_cat = malloc( sizeof( info_category_t ) );
if( !p_cat )
{
vlc_mutex_lock( &p_input->p->input.p_item->lock );
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
return VLC_EGENERIC;
}
p_cat->psz_name = strdup( psz_cat );
......@@ -180,7 +180,7 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
p_info = malloc( sizeof( info_t ) );
if( !p_info )
{
vlc_mutex_lock( &p_input->p->input.p_item->lock );
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
return VLC_EGENERIC;
}
......
......@@ -487,12 +487,10 @@ static void EsOutProgramSelect( es_out_t *out, es_out_pgrm_t *p_pgrm )
}
/* Update now playing */
vlc_mutex_lock( &p_input->p->input.p_item->lock );
input_item_SetNowPlaying( p_input->p->input.p_item,
p_pgrm->psz_now_playing );
input_item_SetPublisher( p_input->p->input.p_item,
p_pgrm->psz_publisher );
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
var_SetBool( p_sys->p_input, "intf-change", VLC_TRUE );
}
......@@ -672,11 +670,7 @@ static void EsOutProgramMeta( es_out_t *out, int i_group, vlc_meta_t *p_meta )
if( psz_provider )
{
if( p_sys->p_pgrm == p_pgrm )
{
vlc_mutex_lock( &p_input->p->input.p_item->lock );
input_item_SetPublisher( p_input->p->input.p_item, psz_provider );
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
}
input_Control( p_input, INPUT_ADD_INFO, psz_cat, input_MetaTypeToLocalizedString(vlc_meta_Publisher), psz_provider );
}
char ** ppsz_all_keys = vlc_dictionary_all_keys( &p_meta->extra_tags );
......@@ -798,10 +792,8 @@ static void EsOutProgramEpg( es_out_t *out, int i_group, vlc_epg_t *p_epg )
if( p_epg->p_current && p_epg->p_current->psz_name && *p_epg->p_current->psz_name )
p_pgrm->psz_now_playing = strdup( p_epg->p_current->psz_name );
vlc_mutex_lock( &p_input->p->input.p_item->lock );
if( p_pgrm == p_sys->p_pgrm )
input_item_SetNowPlaying( p_input->p->input.p_item, p_pgrm->psz_now_playing );
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
if( p_pgrm->psz_now_playing )
{
......
......@@ -254,9 +254,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
input_Control( p_input, INPUT_DEL_INFO,
_(VLC_META_INFO_CAT),
_(VLC_META_NOW_PLAYING) );
vlc_mutex_lock( &p_item->lock );
input_item_SetNowPlaying( p_item, NULL );
vlc_mutex_unlock( &p_item->lock );
/* */
if( p_input->b_preparsing )
......@@ -2505,39 +2503,44 @@ static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta )
static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta )
{
input_item_t *p_item = p_input->p->input.p_item;
char * psz_saved_arturl = NULL;
const char * psz_arturl = NULL;
char * psz_arturl = NULL;
char *psz_title = NULL;
int i;
int i_arturl_event = VLC_FALSE;
if( !p_meta )
return;
psz_arturl = input_item_GetArtURL( p_item );
vlc_mutex_lock( &p_item->lock );
if( vlc_meta_Get( p_meta, vlc_meta_Title ) && !p_item->b_fixed_name )
psz_title = strdup( vlc_meta_Get( p_meta, vlc_meta_Title ) );
if( input_item_GetArtURL( p_item ) )
psz_saved_arturl = strdup( input_item_GetArtURL( p_item ) );
vlc_meta_Merge( p_item->p_meta, p_meta );
if( psz_saved_arturl && *psz_saved_arturl )
input_item_SetArtURL( p_item, psz_saved_arturl );
if( psz_arturl && *psz_arturl )
{
vlc_meta_Set( p_item->p_meta, vlc_meta_ArtworkURL, psz_arturl );
i_arturl_event = VLC_TRUE;
}
free( psz_saved_arturl );
vlc_meta_Delete( p_meta );
psz_arturl = input_item_GetArtURL( p_item );
if( psz_arturl && !strncmp( psz_arturl, "attachment://", strlen("attachment") ) )
{
/* Don't look for art cover if sout
* XXX It can change when sout has meta data support */
if( p_input->p->p_sout && !p_input->b_preparsing )
input_item_SetArtURL( p_item, "" );
{
vlc_meta_Set( p_item->p_meta, vlc_meta_ArtworkURL, "" );
i_arturl_event = VLC_TRUE;
}
else
input_ExtractAttachmentAndCacheArt( p_input );
}
free( psz_arturl );
input_item_SetPreparsed( p_item, VLC_TRUE );
......@@ -2550,6 +2553,16 @@ static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta )
}
vlc_mutex_unlock( &p_item->lock );
if( i_arturl_event == VLC_TRUE )
{
vlc_event_t event;
/* Notify interested third parties */
event.type = vlc_InputItemMetaChanged;
event.u.input_item_meta_changed.meta_type = vlc_meta_ArtworkURL;
vlc_event_send( &p_item->event_manager, &event );
}
if( psz_title )
{
input_Control( p_input, INPUT_SET_NAME, psz_title );
......
This diff is collapsed.
......@@ -454,16 +454,20 @@ int playlist_PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
{
vlc_bool_t b_has_art;
vlc_mutex_lock( &p_input->lock );
/* p_input->p_meta should not be null after a successfull CreateThread */
b_has_art = !EMPTY_STR( input_item_GetArtURL( p_input ) );
vlc_mutex_unlock( &p_input->lock );
char *psz_arturl, *psz_name;
psz_arturl = input_item_GetArtURL( p_input );
psz_name = input_item_GetName( p_input );
/* p_input->p_meta should not be null after a successfull CreateThread*/
b_has_art = !EMPTY_STR( psz_arturl );
if( !b_has_art )
{
PL_DEBUG( "requesting art for %s", p_input->psz_name );
PL_DEBUG( "requesting art for %s", psz_name );
playlist_AskForArtEnqueue( p_playlist, p_input );
}
free( psz_arturl );
free( psz_name );
}
val.i_int = p_input->i_id;
......
......@@ -527,6 +527,8 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj )
* This only checks for meta, not for art
* \todo don't do this for things we won't get meta for, like vids
*/
char *psz_arturl = input_item_GetArtURL( p_current );
char *psz_name = input_item_GetName( p_current );
if( !input_MetaSatisfied( p_playlist, p_current, &i_m, &i_o ) )
{
preparse_item_t p;
......@@ -542,11 +544,10 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj )
}
/* We already have all needed meta, but we need art right now */
else if( p_playlist->p_fetcher->i_art_policy == ALBUM_ART_ALL &&
EMPTY_STR( input_item_GetArtURL( p_current ) ) )
EMPTY_STR( psz_arturl ) )
{
preparse_item_t p;
PL_DEBUG("meta ok for %s, need to fetch art",
p_current->psz_name );
PL_DEBUG("meta ok for %s, need to fetch art", psz_name );
p.p_item = p_current;
p.b_fetch_art = VLC_TRUE;
vlc_mutex_lock( &p_playlist->p_fetcher->object_lock );
......@@ -559,10 +560,11 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj )
else
{
PL_DEBUG( "no fetch required for %s (art currently %s)",
p_current->psz_name,
input_item_GetArtURL( p_current ));
psz_name, psz_arturl );
vlc_gc_decref( p_current );
}
free( psz_name );
free( psz_arturl );
PL_UNLOCK;
}
else
......
......@@ -657,17 +657,19 @@ static void GoAndPreparse( playlist_t *p_playlist, int i_mode,
vlc_cond_signal( &p_playlist->object_wait );
}
/* Preparse if PREPARSE or SPREPARSE & not enough meta */
char *psz_artist = input_item_GetArtist( p_item_cat->p_input );
char *psz_album = input_item_GetAlbum( p_item_cat->p_input );
if( p_playlist->b_auto_preparse &&
(i_mode & PLAYLIST_PREPARSE ||
( i_mode & PLAYLIST_SPREPARSE &&
( EMPTY_STR( input_item_GetArtist( p_item_cat->p_input ) ) ||
( EMPTY_STR( input_item_GetAlbum( p_item_cat->p_input ) ) ) )
( EMPTY_STR( psz_artist ) || ( EMPTY_STR( psz_album ) ) )
) ) )
playlist_PreparseEnqueue( p_playlist, p_item_cat->p_input );
/* If we already have it, signal it */
else if( !EMPTY_STR( input_item_GetArtist( p_item_cat->p_input ) ) &&
!EMPTY_STR( input_item_GetAlbum( p_item_cat->p_input ) ) )
else if( !EMPTY_STR( psz_artist ) && !EMPTY_STR( psz_album ) )
input_item_SetPreparsed( p_item_cat->p_input, VLC_TRUE );
free( psz_artist );
free( psz_album );
}
/* Add the playlist item to the requested node and fire a notification */
......
......@@ -638,18 +638,23 @@ char *str_format_time( const char *tformat )
}
#define INSERT_STRING( check, string ) \
if( check && string ) \
if( check ) \
{ \
int len = strlen( string ); \
psz_meta = string; \
if( string ) \
{ \
int len = strlen( psz_meta ); \
dst = realloc( dst, \
i_size = i_size + len + 1 ); \
strncpy( d, string, len+1 ); \
strncpy( d, psz_meta, len+1 ); \
d += len; \
free( psz_meta ); \
} \
else \
{ \
*d = '-'; \
d++; \
} \
}
char *__str_format_meta( vlc_object_t *p_object, const char *string )
{
......@@ -681,6 +686,7 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string )
{
switch( *s )
{
char *psz_meta; /* used by INSERT_STRING */
case 'a':
INSERT_STRING( p_item, input_item_GetArtist(p_item) );
break;
......
......@@ -1642,10 +1642,14 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
{
i_now = mdate();
i_stop = i_now + (mtime_t)(p_vout->i_title_timeout * 1000);
if( !EMPTY_STR(input_item_GetNowPlaying(input_GetItem(p_input))) )
char *psz_nowplaying =
input_item_GetNowPlaying( input_GetItem( p_input ) );
char *psz_artist = input_item_GetArtist( input_GetItem( p_input ) );
char *psz_name = input_item_GetName( input_GetItem( p_input ) );
if( !EMPTY_STR( psz_nowplaying ) )
{
vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN,
input_item_GetNowPlaying(input_GetItem(p_input)), NULL,
psz_nowplaying, NULL,
p_vout->i_title_position,
30 + p_vout->fmt_in.i_width
- p_vout->fmt_in.i_visible_width
......@@ -1653,17 +1657,14 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
20 + p_vout->fmt_in.i_y_offset,
i_now, i_stop );
}
else if( !EMPTY_STR(input_item_GetArtist(input_GetItem(p_input))) )
else if( !EMPTY_STR( psz_artist ) )
{
char *psz_string = NULL;
psz_string = malloc( strlen(input_GetItem(p_input)->psz_name) ) +
strlen( input_item_GetArtist(input_GetItem(p_input)) );
psz_string = malloc( strlen( psz_name ) + strlen( psz_artist ) );
if( psz_string )
{
sprintf( psz_string, "%s - %s",
input_GetItem(p_input)->psz_name,
input_item_GetArtist(input_GetItem(p_input)) );
sprintf( psz_string, "%s - %s", psz_name, psz_artist );
vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN,
psz_string, NULL,
......@@ -1679,7 +1680,7 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
else
{
vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN,
input_GetItem(p_input)->psz_name, NULL,
psz_name, NULL,
p_vout->i_title_position,
30 + p_vout->fmt_in.i_width
- p_vout->fmt_in.i_visible_width
......@@ -1688,5 +1689,8 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
i_now, i_stop );
}
vlc_object_release( p_input );
free( psz_artist );
free( psz_name );
free( psz_nowplaying );
}
}
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