Implement input position control
[vlc.git] / modules / control / dbus.c
index 2e31aa0..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>
@@ -109,6 +110,99 @@ DBUS_METHOD( Quit )
     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;
+}
+
 DBUS_METHOD( Next )
 { /* next playlist item */
     REPLY_INIT;
@@ -291,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;
 }