X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Faudioscrobbler.c;h=9aaccd341ebec89b63e8218049ccf5614a1ef749;hb=857535cbac9ec9bc54dec6f567dca6738c273e25;hp=2af57e783b875493b8b7c3e4e4337d70bbd480fb;hpb=449fd28aaf007c6411251dae9d0dbfdc65b135d1;p=vlc diff --git a/modules/misc/audioscrobbler.c b/modules/misc/audioscrobbler.c index 2af57e783b..9aaccd341e 100644 --- a/modules/misc/audioscrobbler.c +++ b/modules/misc/audioscrobbler.c @@ -38,7 +38,8 @@ # include "config.h" #endif -#include +#include +#include #include #include #include @@ -110,7 +111,6 @@ struct intf_sys_t static int Open ( vlc_object_t * ); static void Close ( vlc_object_t * ); -static void Unload ( intf_thread_t * ); static void Run ( intf_thread_t * ); static int ItemChange ( vlc_object_t *, const char *, vlc_value_t, @@ -180,13 +180,13 @@ static int Open( vlc_object_t *p_this ) p_intf->p_sys = p_sys; - vlc_mutex_init( p_this, &p_sys->lock ); + vlc_mutex_init( &p_sys->lock ); p_playlist = pl_Yield( p_intf ); PL_LOCK; var_AddCallback( p_playlist, "playlist-current", ItemChange, p_intf ); PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); p_intf->pf_run = Run; @@ -204,23 +204,26 @@ static void Close( vlc_object_t *p_this ) intf_sys_t *p_sys = p_intf->p_sys; p_playlist = pl_Yield( p_intf ); - PL_LOCK; + if( p_playlist ) + { + PL_LOCK; - var_DelCallback( p_playlist, "playlist-current", ItemChange, p_intf ); + var_DelCallback( p_playlist, "playlist-current", ItemChange, p_intf ); - p_input = p_playlist->p_input; - if ( p_input ) - { - vlc_object_yield( p_input ); + p_input = p_playlist->p_input; + if ( p_input ) + { + vlc_object_yield( p_input ); - if( p_sys->b_state_cb ) - var_DelCallback( p_input, "state", PlayingChange, p_intf ); + if( p_sys->b_state_cb ) + var_DelCallback( p_input, "state", PlayingChange, p_intf ); - vlc_object_release( p_input ); - } + vlc_object_release( p_input ); + } - PL_UNLOCK; - pl_Release( p_playlist ); + PL_UNLOCK; + pl_Release( p_intf ); + } p_intf->b_dead = true; /* we lock the mutex in case p_sys is being accessed from a callback */ @@ -240,19 +243,6 @@ static void Close( vlc_object_t *p_this ) } -/***************************************************************************** - * Unload: Unloads the audioscrobbler when encountering fatal errors - *****************************************************************************/ -static void Unload( intf_thread_t *p_this ) -{ - vlc_object_kill( p_this ); - vlc_object_detach( p_this ); - if( p_this->p_module ) - module_Unneed( p_this, p_this->p_module ); - vlc_mutex_destroy( &p_this->change_lock ); - vlc_object_release( p_this ); -} - /***************************************************************************** * Run : call Handshake() then submit songs *****************************************************************************/ @@ -270,28 +260,24 @@ static void Run( intf_thread_t *p_intf ) /* main loop */ for( ;; ) { - bool b_die = false, b_wait = false; + bool b_wait = false; vlc_object_lock( p_intf ); - if( vlc_object_alive( p_intf ) ) - { - if( mdate() < p_sys->next_exchange ) - /* wait until we can resubmit, i.e. */ - b_wait = !vlc_object_timedwait( p_intf, - p_sys->next_exchange ); - else - /* wait for data to submit */ - /* we are signaled each time there is a song to submit */ - vlc_object_wait( p_intf ); - } - b_die = !vlc_object_alive( p_intf ); - vlc_object_unlock( p_intf ); - - if( b_die ) + if( !vlc_object_alive( p_intf ) ) { + vlc_object_unlock( p_intf ); msg_Dbg( p_intf, "audioscrobbler is dying"); return; } + if( mdate() < p_sys->next_exchange ) + /* wait until we can resubmit, i.e. */ + b_wait = vlc_object_timedwait( p_intf, p_sys->next_exchange ) == 0; + else + /* wait for data to submit */ + /* we are signaled each time there is a song to submit */ + vlc_object_wait( p_intf ); + vlc_object_unlock( p_intf ); + if( b_wait ) continue; /* holding on until next_exchange */ @@ -303,7 +289,6 @@ static void Run( intf_thread_t *p_intf ) switch( Handshake( p_intf ) ) { case VLC_ENOMEM: - Unload( p_intf ); return; case VLC_ENOVAR: @@ -314,7 +299,6 @@ static void Run( intf_thread_t *p_intf ) "audioscrobbler plugin, and restart VLC.\n" "Visit http://www.last.fm/join/ to get an account.") ); - Unload( p_intf ); return; case VLC_SUCCESS: @@ -325,8 +309,7 @@ static void Run( intf_thread_t *p_intf ) break; case VLC_AUDIOSCROBBLER_EFATAL: - msg_Warn( p_intf, "Unloading..." ); - Unload( p_intf ); + msg_Warn( p_intf, "Exiting..." ); return; case VLC_EGENERIC: @@ -344,7 +327,6 @@ static void Run( intf_thread_t *p_intf ) if( !asprintf( &psz_submit, "s=%s", p_sys->psz_auth_token ) ) { /* Out of memory */ - Unload( p_intf ); return; } @@ -356,7 +338,7 @@ static void Run( intf_thread_t *p_intf ) p_song = &p_sys->p_queue[i_song]; if( !asprintf( &psz_submit_song, "&a%%5B%d%%5D=%s&t%%5B%d%%5D=%s" - "&i%%5B%d%%5D=%llu&o%%5B%d%%5D=P&r%%5B%d%%5D=" + "&i%%5B%d%%5D=%ju&o%%5B%d%%5D=P&r%%5B%d%%5D=" "&l%%5B%d%%5D=%d&b%%5B%d%%5D=%s" "&n%%5B%d%%5D=%s&m%%5B%d%%5D=%s", i_song, p_song->psz_a, i_song, p_song->psz_t, @@ -366,7 +348,6 @@ static void Run( intf_thread_t *p_intf ) ) ) { /* Out of memory */ vlc_mutex_unlock( &p_sys->lock ); - Unload( p_intf ); return; } psz_submit_tmp = psz_submit; @@ -376,7 +357,6 @@ static void Run( intf_thread_t *p_intf ) free( psz_submit_tmp ); free( psz_submit_song ); vlc_mutex_unlock( &p_sys->lock ); - Unload( p_intf ); return; } free( psz_submit_song ); @@ -523,13 +503,13 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var, if( !p_input || p_input->b_dead ) { PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); return VLC_SUCCESS; } vlc_object_yield( p_input ); PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); p_item = input_GetItem( p_input ); if( !p_item ) @@ -698,7 +678,7 @@ static int Handshake( intf_thread_t *p_this ) { char *psz_username, *psz_password; time_t timestamp; - char psz_timestamp[33]; + char psz_timestamp[21]; struct md5_s p_struct_md5; @@ -748,7 +728,8 @@ static int Handshake( intf_thread_t *p_this ) return VLC_ENOMEM; } - snprintf( psz_timestamp, 33, "%llu", (uintmax_t)timestamp ); + snprintf( psz_timestamp, sizeof( psz_timestamp ), "%"PRIu64, + (uint64_t)timestamp ); /* generates a md5 hash of : * - md5 hash of the password, plus @@ -929,13 +910,13 @@ static int ReadMetaData( intf_thread_t *p_this ) if( !p_input ) { PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_this ); return( VLC_SUCCESS ); } vlc_object_yield( p_input ); PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_this ); p_item = input_GetItem( p_input ); if( !p_item ) @@ -952,7 +933,6 @@ static int ReadMetaData( intf_thread_t *p_this ) free( psz_meta ); \ return VLC_ENOMEM; \ } \ - free( psz_meta ); \ } vlc_mutex_lock( &p_sys->lock ); @@ -968,6 +948,7 @@ static int ReadMetaData( intf_thread_t *p_this ) free( psz_meta ); return VLC_EGENERIC; } + free( psz_meta ); ALLOC_ITEM_META( p_sys->p_current_song.psz_t, Title ) else @@ -979,6 +960,7 @@ static int ReadMetaData( intf_thread_t *p_this ) free( psz_meta ); return VLC_EGENERIC; } + free( psz_meta ); /* Now we have read the mandatory meta data, so we can submit that info */ p_sys->b_submit = true; @@ -986,16 +968,19 @@ static int ReadMetaData( intf_thread_t *p_this ) ALLOC_ITEM_META( p_sys->p_current_song.psz_b, Album ) else p_sys->p_current_song.psz_b = calloc( 1, 1 ); + free( psz_meta ); ALLOC_ITEM_META( p_sys->p_current_song.psz_m, TrackID ) else p_sys->p_current_song.psz_m = calloc( 1, 1 ); + free( psz_meta ); p_sys->p_current_song.i_l = input_item_GetDuration( p_item ) / 1000000; ALLOC_ITEM_META( p_sys->p_current_song.psz_n, TrackNum ) else p_sys->p_current_song.psz_n = calloc( 1, 1 ); + free( psz_meta ); #undef ALLOC_ITEM_META msg_Dbg( p_this, "Meta data registered" );