]> git.sesse.net Git - vlc/blobdiff - modules/control/dbus.c
Contribs: remove dead patches
[vlc] / modules / control / dbus.c
index eeefed7d9c92ba7133e377365cc0af5f419456ee..bd59f824745b517c94fe658c375192191f20cf69 100644 (file)
@@ -52,6 +52,7 @@
 #include <vlc_aout.h>
 #include <vlc_interface.h>
 #include <vlc_playlist.h>
+#include <vlc_meta.h>
 
 #include <math.h>
 
@@ -111,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
@@ -418,8 +420,11 @@ DBUS_METHOD( GetCurrentTrack )
     REPLY_INIT;
     OUT_ARGUMENTS;
 
-    /* XXX: how about locking?! */
+    playlist_t *p_playlist = PL;
+
+    PL_LOCK;
     dbus_int32_t i_position = PL->i_current_index;
+    PL_UNLOCK;
 
     ADD_INT32( &i_position );
     REPLY_SEND;
@@ -461,9 +466,11 @@ DBUS_METHOD( GetLength )
 {
     REPLY_INIT;
     OUT_ARGUMENTS;
+    playlist_t *p_playlist = PL;
 
-    /* XXX: how about locking */
+    PL_LOCK;
     dbus_int32_t i_elements = PL->current.i_size;
+    PL_UNLOCK;
 
     ADD_INT32( &i_elements );
     REPLY_SEND;
@@ -698,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 );
 
@@ -739,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 );
@@ -750,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 );
 
@@ -766,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 );
@@ -776,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 );
 
@@ -910,7 +913,7 @@ static int AllCallback( vlc_object_t *p_this, const char *psz_var,
  *****************************************************************************/
 DBUS_SIGNAL( CapsChangeSignal )
 {
-    SIGNAL_INIT( "CapsChange" );
+    SIGNAL_INIT( MPRIS_DBUS_PLAYER_PATH, "CapsChange" );
     OUT_ARGUMENTS;
 
     ADD_INT32( &((intf_thread_t*)p_data)->p_sys->i_caps );
@@ -922,7 +925,7 @@ DBUS_SIGNAL( CapsChangeSignal )
  *****************************************************************************/
 DBUS_SIGNAL( TrackListChangeSignal )
 { /* emit the new tracklist lengh */
-    SIGNAL_INIT("TrackListChange");
+    SIGNAL_INIT( MPRIS_DBUS_TRACKLIST_PATH, "TrackListChange");
     OUT_ARGUMENTS;
 
     /* XXX: locking */
@@ -969,7 +972,7 @@ static int TrackListChangeEmit( intf_thread_t *p_intf, int signal, int i_node )
 
 DBUS_SIGNAL( TrackChangeSignal )
 { /* emit the metadata of the new item */
-    SIGNAL_INIT( "TrackChange" );
+    SIGNAL_INIT( MPRIS_DBUS_PLAYER_PATH, "TrackChange" );
     OUT_ARGUMENTS;
 
     input_item_t *p_item = (input_item_t*) p_data;
@@ -984,7 +987,7 @@ DBUS_SIGNAL( TrackChangeSignal )
 
 DBUS_SIGNAL( StatusChangeSignal )
 { /* send the updated status info on the bus */
-    SIGNAL_INIT( "StatusChange" );
+    SIGNAL_INIT( MPRIS_DBUS_PLAYER_PATH, "StatusChange" );
     OUT_ARGUMENTS;
 
     /* we're called from a callback of input_thread_t, so it can not be
@@ -1061,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 );
@@ -1082,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;
 }
 
@@ -1157,47 +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", "tracknum",
-    "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 )
-        ADD_META( 17, DBUS_TYPE_INT32, p_input->p_meta->i_status );
+    {
+        int i_status = vlc_meta_GetStatus( p_input->p_meta );
+        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;
 }