]> git.sesse.net Git - vlc/blobdiff - modules/control/dbus.c
ParseExecute: robustify and cleanup
[vlc] / modules / control / dbus.c
index f6eec5aba2c0e16bc29b425cd35abbadb5beb3f9..bd59f824745b517c94fe658c375192191f20cf69 100644 (file)
@@ -112,6 +112,7 @@ struct intf_sys_t
     bool            b_dead;
     vlc_array_t    *p_events;
     vlc_mutex_t     lock;
+    input_thread_t *p_input;
 };
 
 typedef struct
@@ -704,6 +705,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->b_meta_read = false;
     p_sys->i_caps = CAPS_NONE;
     p_sys->b_dead = false;
+    p_sys->p_input = NULL;
 
     dbus_error_init( &error );
 
@@ -745,10 +747,9 @@ static int Open( vlc_object_t *p_this )
     p_sys->p_events = vlc_array_new();
     vlc_mutex_init( &p_sys->lock );
 
-    p_playlist = pl_Hold( p_intf );
+    p_playlist = pl_Get( p_intf );
     p_sys->p_playlist = p_playlist;
 
-    PL_LOCK;
     var_AddCallback( p_playlist, "item-current", AllCallback, p_intf );
     var_AddCallback( p_playlist, "intf-change", AllCallback, p_intf );
     var_AddCallback( p_playlist, "playlist-item-append", AllCallback, p_intf );
@@ -756,7 +757,6 @@ static int Open( vlc_object_t *p_this )
     var_AddCallback( p_playlist, "random", AllCallback, p_intf );
     var_AddCallback( p_playlist, "repeat", AllCallback, p_intf );
     var_AddCallback( p_playlist, "loop", AllCallback, p_intf );
-    PL_UNLOCK;
 
     UpdateCaps( p_intf );
 
@@ -772,7 +772,6 @@ static void Close   ( vlc_object_t *p_this )
     intf_thread_t   *p_intf     = (intf_thread_t*) p_this;
     intf_sys_t      *p_sys      = p_intf->p_sys;
     playlist_t      *p_playlist = p_sys->p_playlist;
-    input_thread_t  *p_input;
 
     var_DelCallback( p_playlist, "item-current", AllCallback, p_intf );
     var_DelCallback( p_playlist, "intf-change", AllCallback, p_intf );
@@ -782,13 +781,11 @@ static void Close   ( vlc_object_t *p_this )
     var_DelCallback( p_playlist, "repeat", AllCallback, p_intf );
     var_DelCallback( p_playlist, "loop", AllCallback, p_intf );
 
-    p_input = playlist_CurrentInput( p_playlist );
-    if ( p_input )
+    if( p_sys->p_input )
     {
-        var_DelCallback( p_input, "state", AllCallback, p_intf );
-        vlc_object_release( p_input );
+        var_DelCallback( p_sys->p_input, "state", AllCallback, p_intf );
+        vlc_object_release( p_sys->p_input );
     }
-    pl_Release( p_intf );
 
     dbus_connection_unref( p_sys->p_conn );
 
@@ -1067,6 +1064,13 @@ static int TrackChange( intf_thread_t *p_intf )
     if( p_intf->p_sys->b_dead )
         return VLC_SUCCESS;
 
+    if( p_sys->p_input )
+    {
+        var_DelCallback( p_sys->p_input, "state", AllCallback, p_intf );
+        vlc_object_release( p_sys->p_input );
+        p_sys->p_input = NULL;
+    }
+
     p_sys->b_meta_read = false;
 
     p_input = playlist_CurrentInput( p_playlist );
@@ -1088,9 +1092,9 @@ static int TrackChange( intf_thread_t *p_intf )
         TrackChangeSignal( p_sys->p_conn, p_item );
     }
 
+    p_sys->p_input = p_input;
     var_AddCallback( p_input, "state", AllCallback, p_intf );
 
-    vlc_object_release( p_input );
     return VLC_SUCCESS;
 }
 
@@ -1163,50 +1167,57 @@ static int GetInputMeta( input_item_t* p_input,
                         DBusMessageIter *args )
 {
     DBusMessageIter dict, dict_entry, variant;
-    /* We need the track length to be expressed in milli-seconds
-     * instead of µ-seconds */
-    dbus_int64_t i_length = ( input_item_GetDuration( p_input ) / 1000 );
+    /** The duration of the track can be expressed in second, milli-seconds and
+        µ-seconds */
+    dbus_int64_t i_mtime = input_item_GetDuration( p_input );
+    dbus_uint32_t i_time = i_mtime / 1000000;
+    dbus_int64_t i_length = i_mtime / 1000;
 
     const char* ppsz_meta_items[] =
     {
-    "title", "artist", "genre", "copyright", "album", "tracknumber",
-    "description", "rating", "date", "setting", "url", "language",
-    "nowplaying", "publisher", "encodedby", "arturl", "trackid",
-    "status", "location", "length", "video-codec", "audio-codec",
-    "video-bitrate", "audio-bitrate", "audio-samplerate"
+    /* Official MPRIS metas */
+    "location", "title", "artist", "album", "tracknumber", "time", "mtime",
+    "genre", "rating", "date", "arturl",
+    "audio-bitrate", "audio-samplerate", "video-bitrate",
+    /* VLC specifics metas */
+    "audio-codec", "copyright", "description", "encodedby", "language", "length",
+    "nowplaying", "publisher", "setting", "status", "trackid", "url",
+    "video-codec"
     };
 
     dbus_message_iter_open_container( args, DBUS_TYPE_ARRAY, "{sv}", &dict );
 
-    ADD_VLC_META_STRING( 0,  Title );
-    ADD_VLC_META_STRING( 1,  Artist );
-    ADD_VLC_META_STRING( 2,  Genre );
-    ADD_VLC_META_STRING( 3,  Copyright );
-    ADD_VLC_META_STRING( 4,  Album );
-    ADD_VLC_META_STRING( 5,  TrackNum );
-    ADD_VLC_META_STRING( 6,  Description );
-    ADD_VLC_META_STRING( 7,  Rating );
-    ADD_VLC_META_STRING( 8,  Date );
-    ADD_VLC_META_STRING( 9,  Setting );
-    ADD_VLC_META_STRING( 10, URL );
-    ADD_VLC_META_STRING( 11, Language );
-    ADD_VLC_META_STRING( 12, NowPlaying );
-    ADD_VLC_META_STRING( 13, Publisher );
-    ADD_VLC_META_STRING( 14, EncodedBy );
-    ADD_VLC_META_STRING( 15, ArtURL );
-    ADD_VLC_META_STRING( 16, TrackID );
+    ADD_VLC_META_STRING( 0,  URI );
+    ADD_VLC_META_STRING( 1,  Title );
+    ADD_VLC_META_STRING( 2,  Artist );
+    ADD_VLC_META_STRING( 3,  Album );
+    ADD_VLC_META_STRING( 4,  TrackNum );
+    ADD_META( 5, DBUS_TYPE_UINT32, i_time );
+    ADD_META( 6, DBUS_TYPE_UINT32, i_mtime );
+    ADD_VLC_META_STRING( 7,  Genre );
+    ADD_VLC_META_STRING( 8,  Rating );
+    ADD_VLC_META_STRING( 9,  Date );
+    ADD_VLC_META_STRING( 10, ArtURL );
+
+    ADD_VLC_META_STRING( 15, Copyright );
+    ADD_VLC_META_STRING( 16, Description );
+    ADD_VLC_META_STRING( 17, EncodedBy );
+    ADD_VLC_META_STRING( 18, Language );
+    ADD_META( 19, DBUS_TYPE_INT64, i_length );
+    ADD_VLC_META_STRING( 20, NowPlaying );
+    ADD_VLC_META_STRING( 21, Publisher );
+    ADD_VLC_META_STRING( 22, Setting );
+    ADD_VLC_META_STRING( 24, TrackID );
+    ADD_VLC_META_STRING( 25, URL );
 
     vlc_mutex_lock( &p_input->lock );
     if( p_input->p_meta )
     {
         int i_status = vlc_meta_GetStatus( p_input->p_meta );
-        ADD_META( 17, DBUS_TYPE_INT32, i_status );
+        ADD_META( 23, DBUS_TYPE_INT32, i_status );
     }
     vlc_mutex_unlock( &p_input->lock );
 
-    ADD_VLC_META_STRING( 18, URI );
-    ADD_META( 19, DBUS_TYPE_INT64, i_length );
-
     dbus_message_iter_close_container( args, &dict );
     return VLC_SUCCESS;
 }