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