Reorganise D-BUS interface code and introduce an MPRIS interface.
This commit is contained in:
+27
-1
@@ -72,7 +72,7 @@ shairport_sync_SOURCES += mdns_dns_sd.c
|
||||
endif
|
||||
|
||||
if USE_DBUS
|
||||
shairport_sync_SOURCES += shairport-sync-dbus-service.c shairport-sync-dbus-interface.c dacp.c
|
||||
shairport_sync_SOURCES += shairport-sync-dbus-service.c shairport-sync-dbus-interface.c
|
||||
BUILT_SOURCES = shairport-sync-dbus-interface.h shairport-sync-dbus-interface.c
|
||||
# We don't want to install this header
|
||||
noinst_HEADERS = $(BUILT_SOURCES)
|
||||
@@ -87,6 +87,32 @@ shairport-sync-dbus-interface.c: org.gnome.ShairportSync.xml
|
||||
gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-dbus-interface org.gnome.ShairportSync.xml
|
||||
endif
|
||||
|
||||
if USE_DBUS_CORE_AND_DACP
|
||||
shairport_sync_SOURCES += dacp.c
|
||||
endif
|
||||
|
||||
if USE_MPRIS
|
||||
shairport_sync_SOURCES += shairport-sync-mpris-service.c shairport-sync-mpris-interface.c shairport-sync-mpris-player-interface.c
|
||||
BUILT_SOURCES = shairport-sync-mpris-interface.h shairport-sync-mpris-interface.c shairport-sync-mpris-player-interface.h shairport-sync-mpris-player-interface.c
|
||||
# We don't want to install this header
|
||||
noinst_HEADERS = $(BUILT_SOURCES)
|
||||
# Correctly clean the generated headers, but keep the xml description
|
||||
CLEANFILES = $(BUILT_SOURCES)
|
||||
|
||||
#Rule to generate the binding headers
|
||||
shairport-sync-mpris-interface.h: org.mpris.MediaPlayer2.xml
|
||||
gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-interface org.mpris.MediaPlayer2.xml
|
||||
|
||||
shairport-sync-mpris-interface.c: org.mpris.MediaPlayer2.xml
|
||||
gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-interface org.mpris.MediaPlayer2.xml
|
||||
|
||||
shairport-sync-mpris-player-interface.h: org.mpris.MediaPlayer2.Player.xml
|
||||
gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-player-interface org.mpris.MediaPlayer2.Player.xml
|
||||
|
||||
shairport-sync-mpris-player-interface.c: org.mpris.MediaPlayer2.Player.xml
|
||||
gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-player-interface org.mpris.MediaPlayer2.Player.xml
|
||||
endif
|
||||
|
||||
if USE_DBUS_CLIENT
|
||||
#Make it, but don't install it anywhere
|
||||
noinst_PROGRAMS = shairport-sync-dbus-test-client
|
||||
|
||||
@@ -33,6 +33,13 @@
|
||||
#define SAFAMILY sa_family
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_DBUS) || defined(HAVE_MPRIS)
|
||||
enum dbus_session_type {
|
||||
DBT_system = 0, // use the session bus
|
||||
DBT_session, // use the system bus
|
||||
} dbt_type;
|
||||
#endif
|
||||
|
||||
enum endian_type {
|
||||
SS_LITTLE_ENDIAN = 0,
|
||||
SS_PDP_ENDIAN,
|
||||
@@ -42,7 +49,7 @@ enum endian_type {
|
||||
enum stuffing_type {
|
||||
ST_basic = 0, // straight deletion or insertion of a frame in a 352-frame packet
|
||||
ST_soxr, // use libsoxr to make a 352 frame packet one frame longer or shorter
|
||||
} type;
|
||||
} s_type;
|
||||
|
||||
enum playback_mode_type {
|
||||
ST_stereo = 0,
|
||||
@@ -73,6 +80,7 @@ enum sps_format_t {
|
||||
|
||||
typedef struct {
|
||||
config_t *cfg;
|
||||
char *appName; // normally the app is called shairport-syn, but it may be symlinked
|
||||
char *password;
|
||||
char *service_name; // the name for the shairport service, e.g. "Shairport Sync Version %v running
|
||||
// on host %h"
|
||||
@@ -158,6 +166,12 @@ typedef struct {
|
||||
int loudness;
|
||||
float loudness_reference_volume_db;
|
||||
int alsa_use_playback_switch_for_mute;
|
||||
#if defined(HAVE_DBUS)
|
||||
enum dbus_session_type dbus_service_bus_type;
|
||||
#endif
|
||||
#if defined(HAVE_MPRIS)
|
||||
enum dbus_session_type mpris_service_bus_type;
|
||||
#endif
|
||||
|
||||
} shairport_cfg;
|
||||
|
||||
|
||||
@@ -283,6 +283,17 @@ AC_ARG_WITH(dbus-test-client, [ --with-dbus-test-client = compile dbus test cli
|
||||
], )
|
||||
AM_CONDITIONAL([USE_DBUS_CLIENT], [test "x$HAS_DBUS_CLIENT" = "x1"])
|
||||
|
||||
# Look for mpris flag
|
||||
AC_ARG_WITH(mpris, [ --with-mpris = choose mpris support], [
|
||||
AC_MSG_RESULT(>>Including mpris support)
|
||||
HAS_MPRIS=1
|
||||
AC_DEFINE([HAVE_MPRIS], 1, [Needed by the compiler.])
|
||||
PKG_CHECK_MODULES([GIO_UNIX], [gio-unix-2.0 >= 2.30.0],[CFLAGS="${GIO_UNIX_CFLAGS} ${CFLAGS}" LIBS="${GIO_UNIX_LIBS} ${LIBS}"],[AC_MSG_ERROR(dbus messaging support for mpris requires the glib 2.0 library -- libglib2.0-dev suggested!)])
|
||||
], )
|
||||
AM_CONDITIONAL([USE_MPRIS], [test "x$HAS_MPRIS" = "x1"])
|
||||
|
||||
AM_CONDITIONAL([USE_DBUS_CORE_AND_DACP], [test "x$HAS_MPRIS" = "x1" -o "x$HAS_DBUS" = "x1"])
|
||||
|
||||
if test "x${with_systemd}" = xyes ; then
|
||||
# Find systemd unit dir
|
||||
AC_ARG_WITH([systemdsystemunitdir],
|
||||
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
|
||||
<node>
|
||||
<interface name='org.mpris.MediaPlayer2.Player'>
|
||||
<method name='Next'/>
|
||||
<method name='Previous'/>
|
||||
<method name='Pause'/>
|
||||
<method name='PlayPause'/>
|
||||
<method name='Stop'/>
|
||||
<method name='StopAfterCurrent'/> <!-- Cantata addition -->
|
||||
<method name='Play'/>
|
||||
<method name='Seek'>
|
||||
<arg direction='in' name='Offset' type='x'/>
|
||||
</method>
|
||||
<method name='SetPosition'>
|
||||
<arg direction='in' name='TrackId' type='o'/>
|
||||
<arg direction='in' name='Position' type='x'/>
|
||||
</method>
|
||||
<method name='OpenUri'>
|
||||
<arg direction='in' name='Uri' type='s'/>
|
||||
</method>
|
||||
<signal name='Seeked'>
|
||||
<arg name='Position' type='x'/>
|
||||
</signal>
|
||||
<property name='PlaybackStatus' type='s' access='read'/>
|
||||
<property name='LoopStatus' type='s' access='readwrite'/>
|
||||
<property name='Rate' type='d' access='readwrite'/>
|
||||
<property name='Shuffle' type='b' access='readwrite'/>
|
||||
<property name='Metadata' type='a{sv}' access='read'>
|
||||
<annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/>
|
||||
</property>
|
||||
<property name='Volume' type='d' access='readwrite'/>
|
||||
<property name='Position' type='x' access='read'/>
|
||||
<property name='MinimumRate' type='d' access='read'/>
|
||||
<property name='MaximumRate' type='d' access='read'/>
|
||||
<property name='CanGoNext' type='b' access='read'/>
|
||||
<property name='CanGoPrevious' type='b' access='read'/>
|
||||
<property name='CanPlay' type='b' access='read'/>
|
||||
<property name='CanPause' type='b' access='read'/>
|
||||
<property name='CanSeek' type='b' access='read'/>
|
||||
<property name='CanControl' type='b' access='read'/>
|
||||
</interface>
|
||||
</node>
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
|
||||
|
||||
<node>
|
||||
<interface name="org.mpris.MediaPlayer2">
|
||||
<method name="Raise"/>
|
||||
|
||||
<method name="Quit"/>
|
||||
|
||||
<property name="CanQuit" type="b" access="read"/>
|
||||
|
||||
<property name="CanRaise" type="b" access="read"/>
|
||||
|
||||
<property name="HasTrackList" type="b" access="read"/>
|
||||
|
||||
<property name="Identity" type="s" access="read"/>
|
||||
|
||||
<property name="DesktopEntry" type="s" access="read"/>
|
||||
|
||||
<property name="SupportedUriSchemes" type="as" access="read"/>
|
||||
|
||||
<property name="SupportedMimeTypes" type="as" access="read"/>
|
||||
</interface>
|
||||
</node>
|
||||
@@ -2485,7 +2485,7 @@ void player_volume(double airplay_volume, rtsp_conn_info *conn) {
|
||||
// %d.",overall_volume,relative_volume,actual_volume);
|
||||
// debug(1,"Our actual speaker volume is %d.",actual_volume);
|
||||
conn->dacp_volume = actual_volume; // this is needed to prevent a loop
|
||||
shairport_sync_set_volume(SHAIRPORT_SYNC(skeleton), actual_volume);
|
||||
shairport_sync_set_volume(SHAIRPORT_SYNC(shairportSyncSkeleton), actual_volume);
|
||||
#endif
|
||||
player_volume_without_notification(airplay_volume, conn);
|
||||
}
|
||||
|
||||
@@ -42,6 +42,10 @@ general =
|
||||
// audio_backend_latency_offset_in_seconds = 0.0; // Set this offset to compensate for a fixed delay in the audio back end. E.g. if the output device delays by 100 ms, set this to -0.1.
|
||||
// audio_backend_buffer_desired_length_in_seconds = 0.15; // If set too small, buffer underflow occurs on low-powered machines. Too long and the response time to volume changes becomes annoying. Default is 0.15 seconds in the alsa backend, 0.35 seconds in the pa backend and 1.0 seconds otherwise.
|
||||
// audio_backend_silent_lead_in_time = 2.0; // This optional advanced setting, from 0.0 and 4.0 seconds, sets the length of the period of silence that precedes the start of the audio. The default is the latency, usually 2.0 seconds. Values greater than the latency are ignored. Values that are too low will affect initial synchronisation.
|
||||
// dbus_service_bus = "system"; // The Shairport Sync dbus interface, if selected at compilation, will appear
|
||||
// as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".
|
||||
// mpris_service_bus = "system"; // The Shairport Sync mpris interface, if selected at compilation, will appear
|
||||
// as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -7,12 +7,15 @@
|
||||
<!-- Only user shairport-sync can own the Shairport Sync service -->
|
||||
<policy user="shairport-sync">
|
||||
<allow own="org.gnome.ShairportSync"/>
|
||||
<allow own="org.mpris.MediaPlayer2.ShairportSync"/>
|
||||
</policy>
|
||||
|
||||
<!-- Allow anyone to invoke methods on Shairport Sync server -->
|
||||
<policy context="default">
|
||||
<allow send_destination="org.gnome.ShairportSync"/>
|
||||
<allow send_destination="org.mpris.MediaPlayer2.ShairportSync"/>
|
||||
<allow receive_sender="org.gnome.ShairportSync"/>
|
||||
<allow receive_sender="org.mpris.MediaPlayer2.ShairportSync"/>
|
||||
</policy>
|
||||
|
||||
</busconfig>
|
||||
|
||||
@@ -177,37 +177,59 @@ static gboolean on_handle_remote_command(ShairportSync *skeleton, GDBusMethodInv
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void on_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) {
|
||||
static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) {
|
||||
|
||||
skeleton = shairport_sync_skeleton_new();
|
||||
debug(1,"Well-known interface name \"%s\" acquired for %s.",name,config.appName);
|
||||
shairportSyncSkeleton = shairport_sync_skeleton_new();
|
||||
|
||||
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skeleton), connection,
|
||||
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(shairportSyncSkeleton), connection,
|
||||
"/org/gnome/ShairportSync", NULL);
|
||||
|
||||
shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(skeleton),
|
||||
shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(shairportSyncSkeleton),
|
||||
config.loudness_reference_volume_db);
|
||||
debug(1, "Loudness threshold is %f.", config.loudness_reference_volume_db);
|
||||
|
||||
if (config.loudness == 0) {
|
||||
shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(skeleton), FALSE);
|
||||
shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(shairportSyncSkeleton), FALSE);
|
||||
debug(1, "Loudness is off");
|
||||
} else {
|
||||
shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(skeleton), TRUE);
|
||||
shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(shairportSyncSkeleton), TRUE);
|
||||
debug(1, "Loudness is on");
|
||||
}
|
||||
|
||||
g_signal_connect(skeleton, "notify::loudness-filter-active",
|
||||
g_signal_connect(shairportSyncSkeleton, "notify::loudness-filter-active",
|
||||
G_CALLBACK(notify_loudness_filter_active_callback), NULL);
|
||||
g_signal_connect(skeleton, "notify::loudness-threshold",
|
||||
g_signal_connect(shairportSyncSkeleton, "notify::loudness-threshold",
|
||||
G_CALLBACK(notify_loudness_threshold_callback), NULL);
|
||||
g_signal_connect(skeleton, "notify::volume", G_CALLBACK(notify_volume_callback), NULL);
|
||||
g_signal_connect(skeleton, "handle-remote-command", G_CALLBACK(on_handle_remote_command), NULL);
|
||||
g_signal_connect(shairportSyncSkeleton, "notify::volume", G_CALLBACK(notify_volume_callback), NULL);
|
||||
g_signal_connect(shairportSyncSkeleton, "handle-remote-command", G_CALLBACK(on_handle_remote_command), NULL);
|
||||
debug(1,"Shairport Sync D-BUS service started on interface \"%s\".",name);
|
||||
}
|
||||
|
||||
static void on_dbus_name_lost_again(GDBusConnection *connection, const gchar *name, gpointer user_data) {
|
||||
warn("Could not acquire an Shairport Sync D-BUS interface.");
|
||||
}
|
||||
|
||||
static void on_dbus_name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data) {
|
||||
debug(1,"Could not acquire well-known interface name \"%s\" -- will try adding the process number to the end of it.",name);
|
||||
pid_t pid = getpid();
|
||||
char interface_name[256] = "";
|
||||
sprintf(interface_name,"org.gnome.ShairportSync.i%d",pid);
|
||||
GBusType dbus_bus_type = G_BUS_TYPE_SYSTEM;
|
||||
if (config.dbus_service_bus_type==DBT_session)
|
||||
dbus_bus_type = G_BUS_TYPE_SESSION;
|
||||
debug(1,"Looking for well-known interface name \"%s\".",interface_name);
|
||||
g_bus_own_name(dbus_bus_type, interface_name, G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
|
||||
on_dbus_name_acquired, on_dbus_name_lost_again, NULL, NULL);
|
||||
}
|
||||
|
||||
int start_dbus_service() {
|
||||
skeleton = NULL;
|
||||
g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.gnome.ShairportSync", G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
|
||||
on_name_acquired, NULL, NULL, NULL);
|
||||
// G_BUS_TYPE_SESSION or G_BUS_TYPE_SYSTEM
|
||||
shairportSyncSkeleton = NULL;
|
||||
GBusType dbus_bus_type = G_BUS_TYPE_SYSTEM;
|
||||
if (config.dbus_service_bus_type==DBT_session)
|
||||
dbus_bus_type = G_BUS_TYPE_SESSION;
|
||||
debug(1,"Looking for well-known name \"org.gnome.ShairportSync\".");
|
||||
g_bus_own_name(dbus_bus_type, "org.gnome.ShairportSync", G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
|
||||
on_dbus_name_acquired, on_dbus_name_lost, NULL, NULL);
|
||||
return 0; // this is just to quieten a compiler warning
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#include "shairport-sync-dbus-interface.h"
|
||||
|
||||
ShairportSync *skeleton;
|
||||
ShairportSync *shairportSyncSkeleton;
|
||||
|
||||
int start_dbus_service();
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,241 @@
|
||||
/*
|
||||
* Generated by gdbus-codegen 2.48.2. DO NOT EDIT.
|
||||
*
|
||||
* The license of this code is the same as for the source it was derived from.
|
||||
*/
|
||||
|
||||
#ifndef __SHAIRPORT_SYNC_MPRIS_INTERFACE_H__
|
||||
#define __SHAIRPORT_SYNC_MPRIS_INTERFACE_H__
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* Declarations for org.mpris.MediaPlayer2 */
|
||||
|
||||
#define TYPE_ORG_MPRIS_MEDIA_PLAYER2 (org_mpris_media_player2_get_type ())
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2, OrgMprisMediaPlayer2))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2, OrgMprisMediaPlayer2Iface))
|
||||
|
||||
struct _OrgMprisMediaPlayer2;
|
||||
typedef struct _OrgMprisMediaPlayer2 OrgMprisMediaPlayer2;
|
||||
typedef struct _OrgMprisMediaPlayer2Iface OrgMprisMediaPlayer2Iface;
|
||||
|
||||
struct _OrgMprisMediaPlayer2Iface
|
||||
{
|
||||
GTypeInterface parent_iface;
|
||||
|
||||
|
||||
gboolean (*handle_quit) (
|
||||
OrgMprisMediaPlayer2 *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*handle_raise) (
|
||||
OrgMprisMediaPlayer2 *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*get_can_quit) (OrgMprisMediaPlayer2 *object);
|
||||
|
||||
gboolean (*get_can_raise) (OrgMprisMediaPlayer2 *object);
|
||||
|
||||
const gchar * (*get_desktop_entry) (OrgMprisMediaPlayer2 *object);
|
||||
|
||||
gboolean (*get_has_track_list) (OrgMprisMediaPlayer2 *object);
|
||||
|
||||
const gchar * (*get_identity) (OrgMprisMediaPlayer2 *object);
|
||||
|
||||
const gchar *const * (*get_supported_mime_types) (OrgMprisMediaPlayer2 *object);
|
||||
|
||||
const gchar *const * (*get_supported_uri_schemes) (OrgMprisMediaPlayer2 *object);
|
||||
|
||||
};
|
||||
|
||||
GType org_mpris_media_player2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDBusInterfaceInfo *org_mpris_media_player2_interface_info (void);
|
||||
guint org_mpris_media_player2_override_properties (GObjectClass *klass, guint property_id_begin);
|
||||
|
||||
|
||||
/* D-Bus method call completion functions: */
|
||||
void org_mpris_media_player2_complete_raise (
|
||||
OrgMprisMediaPlayer2 *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_complete_quit (
|
||||
OrgMprisMediaPlayer2 *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
|
||||
|
||||
/* D-Bus method calls: */
|
||||
void org_mpris_media_player2_call_raise (
|
||||
OrgMprisMediaPlayer2 *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_call_raise_finish (
|
||||
OrgMprisMediaPlayer2 *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_call_raise_sync (
|
||||
OrgMprisMediaPlayer2 *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_call_quit (
|
||||
OrgMprisMediaPlayer2 *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_call_quit_finish (
|
||||
OrgMprisMediaPlayer2 *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_call_quit_sync (
|
||||
OrgMprisMediaPlayer2 *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
|
||||
|
||||
/* D-Bus property accessors: */
|
||||
gboolean org_mpris_media_player2_get_can_quit (OrgMprisMediaPlayer2 *object);
|
||||
void org_mpris_media_player2_set_can_quit (OrgMprisMediaPlayer2 *object, gboolean value);
|
||||
|
||||
gboolean org_mpris_media_player2_get_can_raise (OrgMprisMediaPlayer2 *object);
|
||||
void org_mpris_media_player2_set_can_raise (OrgMprisMediaPlayer2 *object, gboolean value);
|
||||
|
||||
gboolean org_mpris_media_player2_get_has_track_list (OrgMprisMediaPlayer2 *object);
|
||||
void org_mpris_media_player2_set_has_track_list (OrgMprisMediaPlayer2 *object, gboolean value);
|
||||
|
||||
const gchar *org_mpris_media_player2_get_identity (OrgMprisMediaPlayer2 *object);
|
||||
gchar *org_mpris_media_player2_dup_identity (OrgMprisMediaPlayer2 *object);
|
||||
void org_mpris_media_player2_set_identity (OrgMprisMediaPlayer2 *object, const gchar *value);
|
||||
|
||||
const gchar *org_mpris_media_player2_get_desktop_entry (OrgMprisMediaPlayer2 *object);
|
||||
gchar *org_mpris_media_player2_dup_desktop_entry (OrgMprisMediaPlayer2 *object);
|
||||
void org_mpris_media_player2_set_desktop_entry (OrgMprisMediaPlayer2 *object, const gchar *value);
|
||||
|
||||
const gchar *const *org_mpris_media_player2_get_supported_uri_schemes (OrgMprisMediaPlayer2 *object);
|
||||
gchar **org_mpris_media_player2_dup_supported_uri_schemes (OrgMprisMediaPlayer2 *object);
|
||||
void org_mpris_media_player2_set_supported_uri_schemes (OrgMprisMediaPlayer2 *object, const gchar *const *value);
|
||||
|
||||
const gchar *const *org_mpris_media_player2_get_supported_mime_types (OrgMprisMediaPlayer2 *object);
|
||||
gchar **org_mpris_media_player2_dup_supported_mime_types (OrgMprisMediaPlayer2 *object);
|
||||
void org_mpris_media_player2_set_supported_mime_types (OrgMprisMediaPlayer2 *object, const gchar *const *value);
|
||||
|
||||
|
||||
/* ---- */
|
||||
|
||||
#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY (org_mpris_media_player2_proxy_get_type ())
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, OrgMprisMediaPlayer2Proxy))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, OrgMprisMediaPlayer2ProxyClass))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, OrgMprisMediaPlayer2ProxyClass))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY))
|
||||
|
||||
typedef struct _OrgMprisMediaPlayer2Proxy OrgMprisMediaPlayer2Proxy;
|
||||
typedef struct _OrgMprisMediaPlayer2ProxyClass OrgMprisMediaPlayer2ProxyClass;
|
||||
typedef struct _OrgMprisMediaPlayer2ProxyPrivate OrgMprisMediaPlayer2ProxyPrivate;
|
||||
|
||||
struct _OrgMprisMediaPlayer2Proxy
|
||||
{
|
||||
/*< private >*/
|
||||
GDBusProxy parent_instance;
|
||||
OrgMprisMediaPlayer2ProxyPrivate *priv;
|
||||
};
|
||||
|
||||
struct _OrgMprisMediaPlayer2ProxyClass
|
||||
{
|
||||
GDBusProxyClass parent_class;
|
||||
};
|
||||
|
||||
GType org_mpris_media_player2_proxy_get_type (void) G_GNUC_CONST;
|
||||
|
||||
#if GLIB_CHECK_VERSION(2, 44, 0)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2Proxy, g_object_unref)
|
||||
#endif
|
||||
|
||||
void org_mpris_media_player2_proxy_new (
|
||||
GDBusConnection *connection,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_finish (
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_sync (
|
||||
GDBusConnection *connection,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_proxy_new_for_bus (
|
||||
GBusType bus_type,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_for_bus_finish (
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_for_bus_sync (
|
||||
GBusType bus_type,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
|
||||
/* ---- */
|
||||
|
||||
#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON (org_mpris_media_player2_skeleton_get_type ())
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, OrgMprisMediaPlayer2Skeleton))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, OrgMprisMediaPlayer2SkeletonClass))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, OrgMprisMediaPlayer2SkeletonClass))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON))
|
||||
|
||||
typedef struct _OrgMprisMediaPlayer2Skeleton OrgMprisMediaPlayer2Skeleton;
|
||||
typedef struct _OrgMprisMediaPlayer2SkeletonClass OrgMprisMediaPlayer2SkeletonClass;
|
||||
typedef struct _OrgMprisMediaPlayer2SkeletonPrivate OrgMprisMediaPlayer2SkeletonPrivate;
|
||||
|
||||
struct _OrgMprisMediaPlayer2Skeleton
|
||||
{
|
||||
/*< private >*/
|
||||
GDBusInterfaceSkeleton parent_instance;
|
||||
OrgMprisMediaPlayer2SkeletonPrivate *priv;
|
||||
};
|
||||
|
||||
struct _OrgMprisMediaPlayer2SkeletonClass
|
||||
{
|
||||
GDBusInterfaceSkeletonClass parent_class;
|
||||
};
|
||||
|
||||
GType org_mpris_media_player2_skeleton_get_type (void) G_GNUC_CONST;
|
||||
|
||||
#if GLIB_CHECK_VERSION(2, 44, 0)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2Skeleton, g_object_unref)
|
||||
#endif
|
||||
|
||||
OrgMprisMediaPlayer2 *org_mpris_media_player2_skeleton_new (void);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __SHAIRPORT_SYNC_MPRIS_INTERFACE_H__ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,496 @@
|
||||
/*
|
||||
* Generated by gdbus-codegen 2.48.2. DO NOT EDIT.
|
||||
*
|
||||
* The license of this code is the same as for the source it was derived from.
|
||||
*/
|
||||
|
||||
#ifndef __SHAIRPORT_SYNC_MPRIS_PLAYER_INTERFACE_H__
|
||||
#define __SHAIRPORT_SYNC_MPRIS_PLAYER_INTERFACE_H__
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* Declarations for org.mpris.MediaPlayer2.Player */
|
||||
|
||||
#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER (org_mpris_media_player2_player_get_type ())
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, OrgMprisMediaPlayer2Player))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, OrgMprisMediaPlayer2PlayerIface))
|
||||
|
||||
struct _OrgMprisMediaPlayer2Player;
|
||||
typedef struct _OrgMprisMediaPlayer2Player OrgMprisMediaPlayer2Player;
|
||||
typedef struct _OrgMprisMediaPlayer2PlayerIface OrgMprisMediaPlayer2PlayerIface;
|
||||
|
||||
struct _OrgMprisMediaPlayer2PlayerIface
|
||||
{
|
||||
GTypeInterface parent_iface;
|
||||
|
||||
|
||||
|
||||
gboolean (*handle_next) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*handle_open_uri) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation,
|
||||
const gchar *arg_Uri);
|
||||
|
||||
gboolean (*handle_pause) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*handle_play) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*handle_play_pause) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*handle_previous) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*handle_seek) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation,
|
||||
gint64 arg_Offset);
|
||||
|
||||
gboolean (*handle_set_position) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation,
|
||||
const gchar *arg_TrackId,
|
||||
gint64 arg_Position);
|
||||
|
||||
gboolean (*handle_stop) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*handle_stop_after_current) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
gboolean (*get_can_control) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gboolean (*get_can_go_next) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gboolean (*get_can_go_previous) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gboolean (*get_can_pause) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gboolean (*get_can_play) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gboolean (*get_can_seek) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
const gchar * (*get_loop_status) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gdouble (*get_maximum_rate) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
GVariant * (*get_metadata) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gdouble (*get_minimum_rate) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
const gchar * (*get_playback_status) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gint64 (*get_position) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gdouble (*get_rate) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gboolean (*get_shuffle) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
gdouble (*get_volume) (OrgMprisMediaPlayer2Player *object);
|
||||
|
||||
void (*seeked) (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
gint64 arg_Position);
|
||||
|
||||
};
|
||||
|
||||
GType org_mpris_media_player2_player_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDBusInterfaceInfo *org_mpris_media_player2_player_interface_info (void);
|
||||
guint org_mpris_media_player2_player_override_properties (GObjectClass *klass, guint property_id_begin);
|
||||
|
||||
|
||||
/* D-Bus method call completion functions: */
|
||||
void org_mpris_media_player2_player_complete_next (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_previous (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_pause (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_play_pause (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_stop (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_stop_after_current (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_play (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_seek (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_set_position (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
void org_mpris_media_player2_player_complete_open_uri (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
GDBusMethodInvocation *invocation);
|
||||
|
||||
|
||||
|
||||
/* D-Bus signal emissions functions: */
|
||||
void org_mpris_media_player2_player_emit_seeked (
|
||||
OrgMprisMediaPlayer2Player *object,
|
||||
gint64 arg_Position);
|
||||
|
||||
|
||||
|
||||
/* D-Bus method calls: */
|
||||
void org_mpris_media_player2_player_call_next (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_next_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_next_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_previous (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_previous_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_previous_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_pause (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_pause_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_pause_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_play_pause (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_play_pause_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_play_pause_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_stop (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_stop_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_stop_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_stop_after_current (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_stop_after_current_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_stop_after_current_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_play (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_play_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_play_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_seek (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
gint64 arg_Offset,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_seek_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_seek_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
gint64 arg_Offset,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_set_position (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
const gchar *arg_TrackId,
|
||||
gint64 arg_Position,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_set_position_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_set_position_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
const gchar *arg_TrackId,
|
||||
gint64 arg_Position,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_call_open_uri (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
const gchar *arg_Uri,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_open_uri_finish (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
gboolean org_mpris_media_player2_player_call_open_uri_sync (
|
||||
OrgMprisMediaPlayer2Player *proxy,
|
||||
const gchar *arg_Uri,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
|
||||
|
||||
/* D-Bus property accessors: */
|
||||
const gchar *org_mpris_media_player2_player_get_playback_status (OrgMprisMediaPlayer2Player *object);
|
||||
gchar *org_mpris_media_player2_player_dup_playback_status (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_playback_status (OrgMprisMediaPlayer2Player *object, const gchar *value);
|
||||
|
||||
const gchar *org_mpris_media_player2_player_get_loop_status (OrgMprisMediaPlayer2Player *object);
|
||||
gchar *org_mpris_media_player2_player_dup_loop_status (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_loop_status (OrgMprisMediaPlayer2Player *object, const gchar *value);
|
||||
|
||||
gdouble org_mpris_media_player2_player_get_rate (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_rate (OrgMprisMediaPlayer2Player *object, gdouble value);
|
||||
|
||||
gboolean org_mpris_media_player2_player_get_shuffle (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_shuffle (OrgMprisMediaPlayer2Player *object, gboolean value);
|
||||
|
||||
GVariant *org_mpris_media_player2_player_get_metadata (OrgMprisMediaPlayer2Player *object);
|
||||
GVariant *org_mpris_media_player2_player_dup_metadata (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_metadata (OrgMprisMediaPlayer2Player *object, GVariant *value);
|
||||
|
||||
gdouble org_mpris_media_player2_player_get_volume (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_volume (OrgMprisMediaPlayer2Player *object, gdouble value);
|
||||
|
||||
gint64 org_mpris_media_player2_player_get_position (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_position (OrgMprisMediaPlayer2Player *object, gint64 value);
|
||||
|
||||
gdouble org_mpris_media_player2_player_get_minimum_rate (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_minimum_rate (OrgMprisMediaPlayer2Player *object, gdouble value);
|
||||
|
||||
gdouble org_mpris_media_player2_player_get_maximum_rate (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_maximum_rate (OrgMprisMediaPlayer2Player *object, gdouble value);
|
||||
|
||||
gboolean org_mpris_media_player2_player_get_can_go_next (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_can_go_next (OrgMprisMediaPlayer2Player *object, gboolean value);
|
||||
|
||||
gboolean org_mpris_media_player2_player_get_can_go_previous (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_can_go_previous (OrgMprisMediaPlayer2Player *object, gboolean value);
|
||||
|
||||
gboolean org_mpris_media_player2_player_get_can_play (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_can_play (OrgMprisMediaPlayer2Player *object, gboolean value);
|
||||
|
||||
gboolean org_mpris_media_player2_player_get_can_pause (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_can_pause (OrgMprisMediaPlayer2Player *object, gboolean value);
|
||||
|
||||
gboolean org_mpris_media_player2_player_get_can_seek (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_can_seek (OrgMprisMediaPlayer2Player *object, gboolean value);
|
||||
|
||||
gboolean org_mpris_media_player2_player_get_can_control (OrgMprisMediaPlayer2Player *object);
|
||||
void org_mpris_media_player2_player_set_can_control (OrgMprisMediaPlayer2Player *object, gboolean value);
|
||||
|
||||
|
||||
/* ---- */
|
||||
|
||||
#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (org_mpris_media_player2_player_proxy_get_type ())
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, OrgMprisMediaPlayer2PlayerProxy))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, OrgMprisMediaPlayer2PlayerProxyClass))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, OrgMprisMediaPlayer2PlayerProxyClass))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY))
|
||||
|
||||
typedef struct _OrgMprisMediaPlayer2PlayerProxy OrgMprisMediaPlayer2PlayerProxy;
|
||||
typedef struct _OrgMprisMediaPlayer2PlayerProxyClass OrgMprisMediaPlayer2PlayerProxyClass;
|
||||
typedef struct _OrgMprisMediaPlayer2PlayerProxyPrivate OrgMprisMediaPlayer2PlayerProxyPrivate;
|
||||
|
||||
struct _OrgMprisMediaPlayer2PlayerProxy
|
||||
{
|
||||
/*< private >*/
|
||||
GDBusProxy parent_instance;
|
||||
OrgMprisMediaPlayer2PlayerProxyPrivate *priv;
|
||||
};
|
||||
|
||||
struct _OrgMprisMediaPlayer2PlayerProxyClass
|
||||
{
|
||||
GDBusProxyClass parent_class;
|
||||
};
|
||||
|
||||
GType org_mpris_media_player2_player_proxy_get_type (void) G_GNUC_CONST;
|
||||
|
||||
#if GLIB_CHECK_VERSION(2, 44, 0)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2PlayerProxy, g_object_unref)
|
||||
#endif
|
||||
|
||||
void org_mpris_media_player2_player_proxy_new (
|
||||
GDBusConnection *connection,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_finish (
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_sync (
|
||||
GDBusConnection *connection,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void org_mpris_media_player2_player_proxy_new_for_bus (
|
||||
GBusType bus_type,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_for_bus_finish (
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_for_bus_sync (
|
||||
GBusType bus_type,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *object_path,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
|
||||
/* ---- */
|
||||
|
||||
#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (org_mpris_media_player2_player_skeleton_get_type ())
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, OrgMprisMediaPlayer2PlayerSkeleton))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, OrgMprisMediaPlayer2PlayerSkeletonClass))
|
||||
#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, OrgMprisMediaPlayer2PlayerSkeletonClass))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON))
|
||||
#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON))
|
||||
|
||||
typedef struct _OrgMprisMediaPlayer2PlayerSkeleton OrgMprisMediaPlayer2PlayerSkeleton;
|
||||
typedef struct _OrgMprisMediaPlayer2PlayerSkeletonClass OrgMprisMediaPlayer2PlayerSkeletonClass;
|
||||
typedef struct _OrgMprisMediaPlayer2PlayerSkeletonPrivate OrgMprisMediaPlayer2PlayerSkeletonPrivate;
|
||||
|
||||
struct _OrgMprisMediaPlayer2PlayerSkeleton
|
||||
{
|
||||
/*< private >*/
|
||||
GDBusInterfaceSkeleton parent_instance;
|
||||
OrgMprisMediaPlayer2PlayerSkeletonPrivate *priv;
|
||||
};
|
||||
|
||||
struct _OrgMprisMediaPlayer2PlayerSkeletonClass
|
||||
{
|
||||
GDBusInterfaceSkeletonClass parent_class;
|
||||
};
|
||||
|
||||
GType org_mpris_media_player2_player_skeleton_get_type (void) G_GNUC_CONST;
|
||||
|
||||
#if GLIB_CHECK_VERSION(2, 44, 0)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2PlayerSkeleton, g_object_unref)
|
||||
#endif
|
||||
|
||||
OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_skeleton_new (void);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __SHAIRPORT_SYNC_MPRIS_PLAYER_INTERFACE_H__ */
|
||||
@@ -0,0 +1,80 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "player.h"
|
||||
#include "rtsp.h"
|
||||
|
||||
#include "rtp.h"
|
||||
|
||||
#include "dacp.h"
|
||||
|
||||
#include "shairport-sync-mpris-service.h"
|
||||
|
||||
static void on_mpris_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) {
|
||||
|
||||
const char* empty_string_array[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
debug(1,"MPRIS well-known interface name \"%s\" acquired for %s.",name,config.appName);
|
||||
mprisPlayerSkeleton = org_mpris_media_player2_skeleton_new();
|
||||
mprisPlayerPlayerSkeleton = org_mpris_media_player2_player_skeleton_new();
|
||||
|
||||
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(mprisPlayerSkeleton), connection,
|
||||
"/org/mpris/MediaPlayer2", NULL);
|
||||
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(mprisPlayerPlayerSkeleton), connection,
|
||||
"/org/mpris/MediaPlayer2", NULL);
|
||||
|
||||
org_mpris_media_player2_set_desktop_entry(mprisPlayerSkeleton, "shairport-sync");
|
||||
org_mpris_media_player2_set_identity(mprisPlayerSkeleton, "Shairport Sync");
|
||||
org_mpris_media_player2_set_can_quit(mprisPlayerSkeleton, FALSE);
|
||||
org_mpris_media_player2_set_can_raise(mprisPlayerSkeleton, FALSE);
|
||||
org_mpris_media_player2_set_has_track_list(mprisPlayerSkeleton, FALSE);
|
||||
org_mpris_media_player2_set_supported_uri_schemes (mprisPlayerSkeleton,empty_string_array);
|
||||
org_mpris_media_player2_set_supported_mime_types (mprisPlayerSkeleton, empty_string_array);
|
||||
|
||||
org_mpris_media_player2_player_set_playback_status (mprisPlayerPlayerSkeleton, "stop");
|
||||
org_mpris_media_player2_player_set_loop_status (mprisPlayerPlayerSkeleton, "off");
|
||||
org_mpris_media_player2_player_set_volume (mprisPlayerPlayerSkeleton, 0.5);
|
||||
org_mpris_media_player2_player_set_minimum_rate (mprisPlayerPlayerSkeleton,1.0);
|
||||
org_mpris_media_player2_player_set_maximum_rate (mprisPlayerPlayerSkeleton,1.0);
|
||||
org_mpris_media_player2_player_set_can_go_next (mprisPlayerPlayerSkeleton,FALSE);
|
||||
org_mpris_media_player2_player_set_can_go_previous (mprisPlayerPlayerSkeleton,FALSE);
|
||||
org_mpris_media_player2_player_set_can_play (mprisPlayerPlayerSkeleton, TRUE);
|
||||
org_mpris_media_player2_player_set_can_pause (mprisPlayerPlayerSkeleton,FALSE);
|
||||
org_mpris_media_player2_player_set_can_seek (mprisPlayerPlayerSkeleton, FALSE);
|
||||
org_mpris_media_player2_player_set_can_control (mprisPlayerPlayerSkeleton, TRUE);
|
||||
debug(1,"MPRIS service started on interface \"%s\".",name);
|
||||
}
|
||||
|
||||
static void on_mpris_name_lost_again(GDBusConnection *connection, const gchar *name, gpointer user_data) {
|
||||
warn("Could not acquire an MPRIS interface.");
|
||||
}
|
||||
|
||||
static void on_mpris_name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data) {
|
||||
debug(1,"Could not acquire well-known interface name \"%s\" -- will try adding the process number to the end of it.",name);
|
||||
pid_t pid = getpid();
|
||||
char interface_name[256] = "";
|
||||
sprintf(interface_name,"org.mpris.MediaPlayer2.ShairportSync.i%d",pid);
|
||||
GBusType mpris_bus_type = G_BUS_TYPE_SYSTEM;
|
||||
if (config.mpris_service_bus_type==DBT_session)
|
||||
mpris_bus_type = G_BUS_TYPE_SESSION;
|
||||
debug(1,"Looking for well-known interface name \"%s\".",interface_name);
|
||||
g_bus_own_name(mpris_bus_type, interface_name, G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
|
||||
on_mpris_name_acquired, on_mpris_name_lost_again, NULL, NULL);
|
||||
}
|
||||
|
||||
int start_mpris_service() {
|
||||
mprisPlayerSkeleton = NULL;
|
||||
mprisPlayerPlayerSkeleton = NULL;
|
||||
GBusType mpris_bus_type = G_BUS_TYPE_SYSTEM;
|
||||
if (config.mpris_service_bus_type==DBT_session)
|
||||
mpris_bus_type = G_BUS_TYPE_SESSION;
|
||||
debug(1,"Looking for well-known name \"org.mpris.MediaPlayer2.ShairportSync\".");
|
||||
g_bus_own_name(mpris_bus_type, "org.mpris.MediaPlayer2.ShairportSync", G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
|
||||
on_mpris_name_acquired, on_mpris_name_lost, NULL, NULL);
|
||||
return 0; // this is just to quieten a compiler warning
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
#ifndef MPRIS_SERVICE_H
|
||||
#define MPRIS_SERVICE_H
|
||||
|
||||
#include "shairport-sync-mpris-interface.h"
|
||||
#include "shairport-sync-mpris-player-interface.h"
|
||||
|
||||
OrgMprisMediaPlayer2 *mprisPlayerSkeleton;
|
||||
OrgMprisMediaPlayer2Player *mprisPlayerPlayerSkeleton;
|
||||
|
||||
int start_mpris_service();
|
||||
|
||||
#endif /* #ifndef MPRIS_SERVICE_H */
|
||||
+48
-5
@@ -62,6 +62,11 @@
|
||||
#include "shairport-sync-dbus-service.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MPRIS
|
||||
#include "shairport-sync-mpris-service.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include "common.h"
|
||||
#include "mdns.h"
|
||||
#include "rtp.h"
|
||||
@@ -78,7 +83,6 @@
|
||||
#endif
|
||||
|
||||
static int shutting_down = 0;
|
||||
static char *appName = NULL;
|
||||
char configuration_file_path[4096 + 1];
|
||||
char actual_configuration_file_path[4096 + 1];
|
||||
|
||||
@@ -223,6 +227,12 @@ char *get_version_string() {
|
||||
#endif
|
||||
#ifdef CONFIG_METADATA
|
||||
strcat(version_string, "-metadata");
|
||||
#endif
|
||||
#ifdef HAVE_DBUS
|
||||
strcat(version_string, "-dbus");
|
||||
#endif
|
||||
#ifdef HAVE_MPRIS
|
||||
strcat(version_string, "-mpris");
|
||||
#endif
|
||||
strcat(version_string, "-sysconfdir:");
|
||||
strcat(version_string, SYSCONFDIR);
|
||||
@@ -854,6 +864,31 @@ int parse_options(int argc, char **argv) {
|
||||
config_error_file(&config_file_stuff), config_error_text(&config_file_stuff));
|
||||
}
|
||||
}
|
||||
#if defined(HAVE_DBUS)
|
||||
/* Get the dbus service sbus setting. */
|
||||
if (config_lookup_string(config.cfg, "general.dbus_service_bus", &str)) {
|
||||
if (strcasecmp(str, "system") == 0)
|
||||
config.dbus_service_bus_type = DBT_system;
|
||||
else if (strcasecmp(str, "session") == 0)
|
||||
config.dbus_service_bus_type = DBT_session;
|
||||
else
|
||||
die("Invalid dbus_service_bus option choice \"%s\". It should be \"system\" (default) or \"session\"");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_MPRIS)
|
||||
/* Get the mpris service sbus setting. */
|
||||
if (config_lookup_string(config.cfg, "general.mpris_service_bus", &str)) {
|
||||
if (strcasecmp(str, "system") == 0)
|
||||
config.mpris_service_bus_type = DBT_system;
|
||||
else if (strcasecmp(str, "session") == 0)
|
||||
config.mpris_service_bus_type = DBT_session;
|
||||
else
|
||||
die("Invalid mpris_service_bus option choice \"%s\". It should be \"system\" (default) or \"session\"");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
free(config_file_real_path);
|
||||
}
|
||||
|
||||
@@ -1030,8 +1065,11 @@ const char *pid_file_proc(void) {
|
||||
}
|
||||
|
||||
void exit_function() {
|
||||
debug(1,"exit function called...");
|
||||
if (config.cfg)
|
||||
config_destroy(config.cfg);
|
||||
if (config.appName)
|
||||
free(config.appName);
|
||||
// probably should be freeing malloc'ed memory here, including strdup-created strings...
|
||||
}
|
||||
|
||||
@@ -1044,8 +1082,8 @@ int main(int argc, char **argv) {
|
||||
// this is a bit weird, but apparently necessary
|
||||
char *basec = strdup(argv[0]);
|
||||
char *bname = basename(basec);
|
||||
appName = strdup(bname);
|
||||
if (appName == NULL)
|
||||
config.appName = strdup(bname);
|
||||
if (config.appName == NULL)
|
||||
die("can not allocate memory for the app name!");
|
||||
free(basec);
|
||||
|
||||
@@ -1078,7 +1116,7 @@ int main(int argc, char **argv) {
|
||||
// strcat(configuration_file_path, "/shairport-sync"); // thinking about adding a special
|
||||
// shairport-sync directory
|
||||
strcat(configuration_file_path, "/");
|
||||
strcat(configuration_file_path, appName);
|
||||
strcat(configuration_file_path, config.appName);
|
||||
strcat(configuration_file_path, ".conf");
|
||||
config.configfile = configuration_file_path;
|
||||
|
||||
@@ -1496,11 +1534,16 @@ int main(int argc, char **argv) {
|
||||
metadata_init(); // create the metadata pipe if necessary
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DBUS
|
||||
#if defined(HAVE_DBUS) || defined(HAVE_MPRIS)
|
||||
// Start up DBUS services after initial settings are all made
|
||||
debug(1, "Starting up D-Bus services");
|
||||
pthread_create(&dbus_thread, NULL, &dbus_thread_func, NULL);
|
||||
#ifdef HAVE_DBUS
|
||||
start_dbus_service();
|
||||
#endif
|
||||
#ifdef HAVE_MPRIS
|
||||
start_mpris_service();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
daemon_log(LOG_INFO, "Successful Startup");
|
||||
|
||||
Reference in New Issue
Block a user