dbus: Implement the MPRIS v2.1, as published on http://www.mpris.org
[vlc.git] / modules / control / dbus / dbus_common.h
1 /*****************************************************************************
2  * dbus-common.h : Common header for D-Bus control modules
3  *****************************************************************************
4  * Copyright © 2006-2008 Rafaël Carré
5  * Copyright © 2007-2010 Mirsal Ennaime
6  * Copyright © 2009-2010 The VideoLAN team
7  * $Id$
8  *
9  * Authors:    Mirsal Ennaime <mirsal dot ennaime at gmailcom>
10  *             Rafaël Carré <funman at videolanorg>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25  *****************************************************************************/
26
27 #ifndef _VLC_DBUS_COMMON_H
28 #define _VLC_DBUS_COMMON_H
29
30 #include <vlc_common.h>
31 #include <vlc_interface.h>
32 #include <vlc_aout.h>
33 #include <dbus/dbus.h>
34
35 #define DBUS_MPRIS_OBJECT_PATH "/org/mpris/MediaPlayer2"
36
37 /* MACROS */
38
39 #define INTF ((intf_thread_t *)p_this)
40 #define PL   (INTF->p_sys->p_playlist)
41
42 #define DBUS_METHOD( method_function ) \
43     static DBusHandlerResult method_function \
44             ( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
45
46 #define DBUS_SIGNAL( signal_function ) \
47     static DBusHandlerResult signal_function \
48             ( DBusConnection *p_conn, void *p_data )
49
50 #define REPLY_INIT \
51     DBusMessage* p_msg = dbus_message_new_method_return( p_from ); \
52     if( !p_msg ) return DBUS_HANDLER_RESULT_NEED_MEMORY; \
53
54 #define REPLY_SEND \
55     if( !dbus_connection_send( p_conn, p_msg, NULL ) ) \
56         return DBUS_HANDLER_RESULT_NEED_MEMORY; \
57     dbus_connection_flush( p_conn ); \
58     dbus_message_unref( p_msg ); \
59     return DBUS_HANDLER_RESULT_HANDLED
60
61 #define SIGNAL_INIT( interface, path, signal ) \
62     DBusMessage *p_msg = dbus_message_new_signal( path, \
63         interface, signal ); \
64     if( !p_msg ) return DBUS_HANDLER_RESULT_NEED_MEMORY; \
65
66 #define SIGNAL_SEND \
67     if( !dbus_connection_send( p_conn, p_msg, NULL ) ) \
68         return DBUS_HANDLER_RESULT_NEED_MEMORY; \
69     dbus_message_unref( p_msg ); \
70     dbus_connection_flush( p_conn ); \
71     return DBUS_HANDLER_RESULT_HANDLED
72
73 #define OUT_ARGUMENTS \
74     DBusMessageIter args; \
75     dbus_message_iter_init_append( p_msg, &args )
76
77 #define DBUS_ADD( dbus_type, value ) \
78     if( !dbus_message_iter_append_basic( &args, dbus_type, value ) ) \
79         return DBUS_HANDLER_RESULT_NEED_MEMORY
80
81 #define ADD_STRING( s ) DBUS_ADD( DBUS_TYPE_STRING, s )
82 #define ADD_DOUBLE( d ) DBUS_ADD( DBUS_TYPE_DOUBLE, d )
83 #define ADD_BOOL( b ) DBUS_ADD( DBUS_TYPE_BOOLEAN, b )
84 #define ADD_INT32( i ) DBUS_ADD( DBUS_TYPE_INT32, i )
85 #define ADD_INT64( i ) DBUS_ADD( DBUS_TYPE_INT64, i )
86 #define ADD_BYTE( b ) DBUS_ADD( DBUS_TYPE_BYTE, b )
87
88 #define MPRIS_TRACKID_FORMAT "/org/videolan/vlc/playlist/%d"
89
90 struct intf_sys_t
91 {
92     DBusConnection *p_conn;
93     playlist_t     *p_playlist;
94     bool            b_meta_read;
95     dbus_int32_t    i_player_caps;
96     dbus_int32_t    i_playing_state;
97     bool            b_can_play;
98     bool            b_dead;
99     vlc_array_t    *p_events;
100     vlc_array_t    *p_timeouts;
101     vlc_array_t    *p_watches;
102     int             p_pipe_fds[2];
103     vlc_mutex_t     lock;
104     input_thread_t *p_input;
105     mtime_t         i_last_input_pos; /* Only access it from the input thread */
106     mtime_t         i_last_input_pos_event; /* idem */
107     bool            b_unique;
108 };
109
110 enum
111 {
112     SIGNAL_ITEM_CURRENT,
113     SIGNAL_INTF_CHANGE,
114     SIGNAL_PLAYLIST_ITEM_APPEND,
115     SIGNAL_PLAYLIST_ITEM_DELETED,
116     SIGNAL_INPUT_METADATA,
117     SIGNAL_RANDOM,
118     SIGNAL_REPEAT,
119     SIGNAL_LOOP,
120     SIGNAL_STATE,
121     SIGNAL_RATE,
122     SIGNAL_SEEK,
123     SIGNAL_CAN_SEEK,
124     SIGNAL_CAN_PAUSE,
125     SIGNAL_VOLUME_CHANGE,
126     SIGNAL_VOLUME_MUTED
127 };
128
129 enum
130 {
131     PLAYBACK_STATE_INVALID = -1,
132     PLAYBACK_STATE_PLAYING = 0,
133     PLAYBACK_STATE_PAUSED  = 1,
134     PLAYBACK_STATE_STOPPED = 2
135 };
136
137 int DemarshalSetPropertyValue( DBusMessage *p_msg, void *p_arg );
138 int GetInputMeta  ( input_item_t* p_input, DBusMessageIter *args );
139
140 #endif //dbus-common.h