Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
1a70c09a
Commit
1a70c09a
authored
Jan 29, 2008
by
Rafaël Carré
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dbus: fix warnings, implement GetCaps method (the signal is still missing)
parent
94a67470
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
115 additions
and
4 deletions
+115
-4
modules/control/dbus.c
modules/control/dbus.c
+112
-3
modules/control/dbus.h
modules/control/dbus.h
+3
-1
No files found.
modules/control/dbus.c
View file @
1a70c09a
/*****************************************************************************
* dbus.c : D-Bus control interface
*****************************************************************************
* Copyright © 2006-200
7
Rafaël Carré
* Copyright © 2006-200
8
Rafaël Carré
* Copyright © 2007 Mirsal Ennaime
* $Id$
*
...
...
@@ -31,7 +31,7 @@
* extract:
* "If you use this low-level API directly, you're signing up for some pain."
*
* MPRIS Specification (still drafting on
Oct, 23 of 2007
):
* MPRIS Specification (still drafting on
Jan, 23 of 2008
):
* http://wiki.xmms2.xmms.se/index.php/MPRIS
*/
...
...
@@ -53,6 +53,8 @@
#include <vlc_meta.h>
#include <vlc_input.h>
#include <vlc_playlist.h>
#include <vlc_demux.h>
#include <vlc_access.h>
/*****************************************************************************
* Local prototypes.
...
...
@@ -74,10 +76,23 @@ static int StatusChangeEmit( vlc_object_t *, const char *, vlc_value_t,
static
int
GetInputMeta
(
input_item_t
*
,
DBusMessageIter
*
);
static
int
MarshalStatus
(
intf_thread_t
*
,
DBusMessageIter
*
,
vlc_bool_t
);
/* GetCaps() capabilities */
enum
{
CAPS_NONE
=
0
,
CAPS_CAN_GO_NEXT
=
1
<<
0
,
CAPS_CAN_GO_PREV
=
1
<<
1
,
CAPS_CAN_PAUSE
=
1
<<
2
,
CAPS_CAN_PLAY
=
1
<<
3
,
CAPS_CAN_SEEK
=
1
<<
4
,
CAPS_CAN_PROVIDE_METADATA
=
1
<<
5
};
struct
intf_sys_t
{
DBusConnection
*
p_conn
;
vlc_bool_t
b_meta_read
;
dbus_int32_t
i_caps
;
};
/*****************************************************************************
...
...
@@ -284,10 +299,63 @@ DBUS_METHOD( GetCurrentMetadata )
REPLY_SEND
;
}
DBUS_METHOD
(
GetCaps
)
{
REPLY_INIT
;
OUT_ARGUMENTS
;
playlist_t
*
p_playlist
=
pl_Yield
(
(
vlc_object_t
*
)
p_this
);
PL_LOCK
;
dbus_int32_t
i_caps
=
CAPS_NONE
;
/* FIXME:
* Every capability should be checked in a callback, modifying p_sys->i_caps
* so we can send a signal whenever it changes.
* When it is done, GetCaps method will just return p_sys->i_caps
*/
if
(
p_playlist
->
items
.
i_size
>
0
)
i_caps
|=
CAPS_CAN_PLAY
|
CAPS_CAN_GO_PREV
|
CAPS_CAN_GO_NEXT
;
if
(
p_playlist
->
p_input
)
{
access_t
*
p_access
=
(
access_t
*
)
vlc_object_find
(
p_playlist
->
p_input
,
VLC_OBJECT_ACCESS
,
FIND_CHILD
);
if
(
p_access
)
{
vlc_bool_t
b_can_pause
;
if
(
!
access2_Control
(
p_access
,
ACCESS_CAN_PAUSE
,
&
b_can_pause
)
&&
b_can_pause
)
i_caps
|=
CAPS_CAN_PAUSE
;
vlc_object_release
(
p_access
);
}
demux_t
*
p_demux
=
(
demux_t
*
)
vlc_object_find
(
p_playlist
->
p_input
,
VLC_OBJECT_DEMUX
,
FIND_CHILD
);
if
(
p_demux
)
{
/* XXX: is: demux can seek and access can not a possibility ? */
vlc_bool_t
b_can_seek
;
if
(
!
stream_Control
(
p_demux
->
s
,
STREAM_CAN_SEEK
,
&
b_can_seek
)
&&
b_can_seek
)
i_caps
|=
CAPS_CAN_SEEK
;
vlc_object_release
(
p_demux
);
}
}
if
(
((
intf_thread_t
*
)
p_this
)
->
p_sys
->
b_meta_read
)
i_caps
|=
CAPS_CAN_PROVIDE_METADATA
;
PL_UNLOCK
;
ADD_INT32
(
&
i_caps
);
REPLY_SEND
;
}
/* Media Player information */
DBUS_METHOD
(
Identity
)
{
VLC_UNUSED
(
p_this
);
REPLY_INIT
;
OUT_ARGUMENTS
;
char
*
psz_identity
;
...
...
@@ -533,6 +601,7 @@ DBUS_METHOD( Random )
DBUS_METHOD
(
handle_introspect_root
)
{
/* handles introspection of root object */
VLC_UNUSED
(
p_this
);
REPLY_INIT
;
OUT_ARGUMENTS
;
ADD_STRING
(
&
psz_introspection_xml_data_root
);
...
...
@@ -541,6 +610,7 @@ DBUS_METHOD( handle_introspect_root )
DBUS_METHOD
(
handle_introspect_player
)
{
VLC_UNUSED
(
p_this
);
REPLY_INIT
;
OUT_ARGUMENTS
;
ADD_STRING
(
&
psz_introspection_xml_data_player
);
...
...
@@ -549,6 +619,7 @@ DBUS_METHOD( handle_introspect_player )
DBUS_METHOD
(
handle_introspect_tracklist
)
{
VLC_UNUSED
(
p_this
);
REPLY_INIT
;
OUT_ARGUMENTS
;
ADD_STRING
(
&
psz_introspection_xml_data_tracklist
);
...
...
@@ -582,7 +653,7 @@ DBUS_METHOD( handle_player )
{
if
(
dbus_message_is_method_call
(
p_from
,
DBUS_INTERFACE_INTROSPECTABLE
,
"Introspect"
)
)
return
handle_introspect_player
(
p_conn
,
p_from
,
p_this
);
return
handle_introspect_player
(
p_conn
,
p_from
,
p_this
);
/* here D-Bus method's names are associated to an handler */
...
...
@@ -599,6 +670,7 @@ DBUS_METHOD( handle_player )
METHOD_FUNC
(
"PositionGet"
,
PositionGet
);
METHOD_FUNC
(
"GetStatus"
,
GetStatus
);
METHOD_FUNC
(
"GetMetadata"
,
GetCurrentMetadata
);
METHOD_FUNC
(
"GetCaps"
,
GetCaps
);
return
DBUS_HANDLER_RESULT_NOT_YET_HANDLED
;
}
...
...
@@ -638,6 +710,7 @@ static int Open( vlc_object_t *p_this )
return
VLC_ENOMEM
;
p_sys
->
b_meta_read
=
VLC_FALSE
;
p_sys
->
i_caps
=
CAPS_NONE
;
dbus_error_init
(
&
error
);
...
...
@@ -773,6 +846,7 @@ DBUS_SIGNAL( StatusChangeSignal )
static
int
StateChange
(
vlc_object_t
*
p_this
,
const
char
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
)
{
VLC_UNUSED
(
psz_var
);
VLC_UNUSED
(
oldval
);
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_data
;
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
...
...
@@ -804,6 +878,8 @@ static int StateChange( vlc_object_t *p_this, const char* psz_var,
static
int
StatusChangeEmit
(
vlc_object_t
*
p_this
,
const
char
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
)
{
VLC_UNUSED
(
p_this
);
VLC_UNUSED
(
psz_var
);
VLC_UNUSED
(
oldval
);
VLC_UNUSED
(
newval
);
intf_thread_t
*
p_intf
=
p_data
;
if
(
p_intf
->
b_dead
)
...
...
@@ -860,6 +936,39 @@ static int TrackChange( vlc_object_t *p_this, const char *psz_var,
TrackChangeSignal
(
p_sys
->
p_conn
,
p_item
);
}
dbus_int32_t
i_caps
=
CAPS_NONE
;
if
(
p_playlist
->
items
.
i_size
>
0
)
i_caps
|=
CAPS_CAN_PLAY
|
CAPS_CAN_GO_PREV
|
CAPS_CAN_GO_NEXT
;
if
(
p_playlist
->
p_input
)
{
access_t
*
p_access
=
(
access_t
*
)
vlc_object_find
(
p_playlist
->
p_input
,
VLC_OBJECT_ACCESS
,
FIND_CHILD
);
if
(
p_access
)
{
vlc_bool_t
b_can_pause
;
if
(
!
access2_Control
(
p_access
,
ACCESS_CAN_PAUSE
,
&
b_can_pause
)
&&
b_can_pause
)
i_caps
|=
CAPS_CAN_PAUSE
;
vlc_object_release
(
p_access
);
}
demux_t
*
p_demux
=
(
demux_t
*
)
vlc_object_find
(
p_playlist
->
p_input
,
VLC_OBJECT_DEMUX
,
FIND_CHILD
);
if
(
p_demux
)
{
/* XXX: is: demux can seek and access can not a possibility ? */
vlc_bool_t
b_can_seek
;
if
(
!
stream_Control
(
p_demux
->
s
,
STREAM_CAN_SEEK
,
&
b_can_seek
)
&&
b_can_seek
)
i_caps
|=
CAPS_CAN_SEEK
;
vlc_object_release
(
p_demux
);
}
}
if
(
((
intf_thread_t
*
)
p_this
)
->
p_sys
->
b_meta_read
)
i_caps
|=
CAPS_CAN_PROVIDE_METADATA
;
var_AddCallback
(
p_input
,
"state"
,
StateChange
,
p_intf
);
vlc_object_release
(
p_input
);
...
...
modules/control/dbus.h
View file @
1a70c09a
...
...
@@ -33,7 +33,6 @@
/* MACROS */
/* DBus related */
#define DBUS_METHOD( method_function ) \
static DBusHandlerResult method_function \
( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
...
...
@@ -142,6 +141,9 @@ const char* psz_introspection_xml_data_player =
" <method name=
\"
GetMetadata
\"
>
\n
"
" <arg type=
\"
a{sv}
\"
direction=
\"
out
\"
/>
\n
"
" </method>
\n
"
" <method name=
\"
GetCaps
\"
>
\n
"
" <arg type=
\"
i
\"
direction=
\"
out
\"
/>
\n
"
" </method>
\n
"
" <signal name=
\"
TrackChange
\"
>
\n
"
" <arg type=
\"
a{sv}
\"
/>
\n
"
" </signal>
\n
"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment