Implement input position control
[vlc.git] / modules / control / dbus.c
index 57f4c85..dad21f5 100644 (file)
@@ -55,6 +55,7 @@
 #include "dbus.h"
 
 #include <vlc/vlc.h>
+#include <vlc/aout.h>
 #include <vlc/intf.h>
 #include <vlc_meta.h>
 #include <vlc_input.h>
@@ -105,7 +106,100 @@ DBUS_METHOD( Quit )
     playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this );
     playlist_Stop( p_playlist );
     pl_Release( ((vlc_object_t*) p_this) );
-    ((vlc_object_t*)p_this)->b_die = VLC_TRUE;
+    ((vlc_object_t*)p_this)->p_libvlc->b_die = VLC_TRUE;
+    REPLY_SEND;
+}
+
+DBUS_METHOD( PositionGet )
+{ /* returns position as an int in the range [0;1000] */
+    REPLY_INIT;
+    OUT_ARGUMENTS;
+    vlc_value_t position;
+    dbus_uint16_t i_pos;
+
+    playlist_t *p_playlist = pl_Yield( ((vlc_object_t*) p_this) );
+    input_thread_t *p_input = p_playlist->p_input;
+
+    if( !p_input )
+        i_pos = 0;
+    else
+    {
+        var_Get( p_input, "position", &position );
+        i_pos = position.f_float * 1000 ;
+    }
+    ADD_UINT16( &i_pos );
+    pl_Release( ((vlc_object_t*) p_this) );
+    REPLY_SEND;
+}
+
+DBUS_METHOD( PositionSet )
+{ /* set position from an int in the range [0;1000] */
+
+    REPLY_INIT;
+    vlc_value_t position;
+    dbus_uint16_t i_pos;
+
+    DBusError error;
+    dbus_error_init( &error );
+
+    dbus_message_get_args( p_from, &error,
+            DBUS_TYPE_UINT16, &i_pos,
+            DBUS_TYPE_INVALID );
+
+    if( dbus_error_is_set( &error ) )
+    {
+        msg_Err( (vlc_object_t*) p_this, "D-Bus message reading : %s\n",
+                error.message );
+        dbus_error_free( &error );
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+    playlist_t *p_playlist = pl_Yield( ((vlc_object_t*) p_this) );
+    input_thread_t *p_input = p_playlist->p_input;
+
+    if( p_input )
+    {
+        position.f_float = ((float)i_pos) / 1000;
+        var_Set( p_input, "position", position );
+    }
+    pl_Release( ((vlc_object_t*) p_this) );
+    REPLY_SEND;
+}
+
+DBUS_METHOD( VolumeGet )
+{ /* returns volume in percentage */
+    REPLY_INIT;
+    OUT_ARGUMENTS;
+    dbus_uint16_t i_vol;
+    /* 2nd argument of aout_VolumeGet is uint16 */
+    aout_VolumeGet( (vlc_object_t*) p_this, &i_vol );
+    i_vol = ( 100 * i_vol ) / AOUT_VOLUME_MAX;
+    ADD_UINT16( &i_vol );
+    REPLY_SEND;
+}
+
+DBUS_METHOD( VolumeSet )
+{ /* set volume in percentage */
+    REPLY_INIT;
+
+    DBusError error;
+    dbus_error_init( &error );
+
+    dbus_uint16_t i_vol;
+
+    dbus_message_get_args( p_from, &error,
+            DBUS_TYPE_UINT16, &i_vol,
+            DBUS_TYPE_INVALID );
+
+    if( dbus_error_is_set( &error ) )
+    {
+        msg_Err( (vlc_object_t*) p_this, "D-Bus message reading : %s\n",
+                error.message );
+        dbus_error_free( &error );
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+
+    aout_VolumeSet( (vlc_object_t*) p_this, ( AOUT_VOLUME_MAX / 100 ) * i_vol );
+
     REPLY_SEND;
 }
 
@@ -135,6 +229,21 @@ DBUS_METHOD( Stop )
     pl_Release( ((vlc_object_t*) p_this) );
     REPLY_SEND;
 }
+
+DBUS_METHOD( GetPlayingItem )
+{ /* return the current item */
+    REPLY_INIT;
+    OUT_ARGUMENTS;
+    char psz_no_input = '\0';
+    char *p_psz_no_input = &psz_no_input;
+    playlist_t *p_playlist = pl_Yield( ((vlc_object_t*) p_this) );
+    input_thread_t *p_input = p_playlist->p_input;
+    ADD_STRING( ( p_input ) ? &p_input->input.p_item->psz_name :
+            &p_psz_no_input );
+    pl_Release( ((vlc_object_t*) p_this) );
+    REPLY_SEND;
+}
+
 DBUS_METHOD( GetPlayStatus )
 { /* return a string */
     REPLY_INIT;
@@ -143,7 +252,6 @@ DBUS_METHOD( GetPlayStatus )
     char *psz_play;
     vlc_value_t val;
     playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this );
-    PL_LOCK;
     input_thread_t *p_input = p_playlist->p_input;
 
     if( !p_input )
@@ -158,7 +266,6 @@ DBUS_METHOD( GetPlayStatus )
         else psz_play = strdup( "unknown" );
     }
     
-    PL_UNLOCK;
     pl_Release( p_playlist );
 
     ADD_STRING( &psz_play );
@@ -173,23 +280,26 @@ DBUS_METHOD( TogglePause )
 
     vlc_value_t val;
     playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this );
-    PL_LOCK;
     input_thread_t *p_input = p_playlist->p_input;
-
-    if( p_input )
+    if( p_input != NULL )
     {
         var_Get( p_input, "state", &val );
         if( val.i_int != PAUSE_S )
         {
             val.i_int = PAUSE_S;
+            playlist_Pause( p_playlist );
         }
         else
         {
             val.i_int = PLAYING_S;
+            playlist_Play( p_playlist );
         }
-        var_Set( p_input, "state", val );
     }
-    PL_UNLOCK;
+    else
+    {
+        val.i_int = PLAYING_S;
+        playlist_Play( p_playlist );
+    }
     pl_Release( p_playlist );
 
     dbus_bool_t pause = ( val.i_int == PLAYING_S ) ? TRUE : FALSE;
@@ -213,7 +323,6 @@ DBUS_METHOD( AddMRL )
     DBusError error;
     dbus_error_init( &error );
 
-    intf_thread_t *p_intf = (intf_thread_t*) p_this;
     char *psz_mrl;
     dbus_bool_t b_play;
 
@@ -224,19 +333,15 @@ DBUS_METHOD( AddMRL )
 
     if( dbus_error_is_set( &error ) )
     {
-        printf("error: %s\n", error.message );
+        msg_Err( (vlc_object_t*) p_this, "D-Bus message reading : %s\n",
+                error.message );
         dbus_error_free( &error );
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
     playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this );
-    input_item_t *p_item = input_ItemNew( p_intf, psz_mrl, NULL );
-    if( p_item )
-    {
-        playlist_AddInput( p_playlist, p_item,
-            ( b_play == TRUE ) ? PLAYLIST_GO|PLAYLIST_APPEND : PLAYLIST_APPEND,
-            PLAYLIST_END, VLC_TRUE );
-    }
+    playlist_Add( p_playlist, psz_mrl, NULL, PLAYLIST_APPEND |
+            ( ( b_play == TRUE ) ? PLAYLIST_GO : 0 ) , PLAYLIST_END, VLC_TRUE );
     pl_Release( p_playlist );
 
     REPLY_SEND;
@@ -272,6 +377,7 @@ DBUS_METHOD( handle_messages )
     /* here D-Bus method's names are associated to an handler */
 
     METHOD_FUNC( "GetPlayStatus",   GetPlayStatus );
+    METHOD_FUNC( "GetPlayingItem",  GetPlayingItem );
     METHOD_FUNC( "AddMRL",          AddMRL );
     METHOD_FUNC( "TogglePause",     TogglePause );
     METHOD_FUNC( "Nothing",         Nothing );
@@ -279,6 +385,10 @@ DBUS_METHOD( handle_messages )
     METHOD_FUNC( "Next",            Next );
     METHOD_FUNC( "Quit",            Quit );
     METHOD_FUNC( "Stop",            Stop );
+    METHOD_FUNC( "VolumeSet",       VolumeSet );
+    METHOD_FUNC( "VolumeGet",       VolumeGet );
+    METHOD_FUNC( "PositionSet",     PositionSet );
+    METHOD_FUNC( "PositionGet",     PositionGet );
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
@@ -313,17 +423,8 @@ static int Open( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
-    /* we request the service org.videolan.vlc */    
-    dbus_bus_request_name( p_conn, VLC_DBUS_SERVICE,
-            DBUS_NAME_FLAG_REPLACE_EXISTING , &error );
-    if (dbus_error_is_set( &error ) )
-    { 
-        msg_Err( p_this, "Error requesting %s service: %s\n", VLC_DBUS_SERVICE,
-                error.message );
-        dbus_error_free( &error );
-        free( p_sys );
-        return VLC_EGENERIC;
-    }
+    /* we unregister the object /, registered by libvlc */
+    dbus_connection_unregister_object_path( p_conn, "/" );
 
     /* we register the object /org/videolan/vlc */
     dbus_connection_register_object_path( p_conn, VLC_DBUS_OBJECT_PATH,