core: Make sound player feature optional
Mutter can play sounds in some contexts and also provides an API for libmutter users to do so using libcanberra internally. In some specific use cases of Mutter, we would like to not depend on libcanberra and not have any sound playing feature by default. The changes keeps the sound player API but make it no-op if the sound_player feature is disabled to not make it possible to break a gnome-shell build. See https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2270 for relevant discussion Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2375>
This commit is contained in:
parent
f94189d4eb
commit
7902fa3f9f
@ -61,6 +61,9 @@
|
|||||||
/* Defined if gnome-desktop is enabled */
|
/* Defined if gnome-desktop is enabled */
|
||||||
#mesondefine HAVE_GNOME_DESKTOP
|
#mesondefine HAVE_GNOME_DESKTOP
|
||||||
|
|
||||||
|
/* Defined if sound player is enabled */
|
||||||
|
#mesondefine HAVE_SOUND_PLAYER
|
||||||
|
|
||||||
/* Building with SM support */
|
/* Building with SM support */
|
||||||
#mesondefine HAVE_SM
|
#mesondefine HAVE_SM
|
||||||
|
|
||||||
|
@ -124,7 +124,6 @@ json_glib_dep = dependency('json-glib-1.0', version: json_glib_req)
|
|||||||
xkbcommon_dep = dependency('xkbcommon', version: xkbcommon_req)
|
xkbcommon_dep = dependency('xkbcommon', version: xkbcommon_req)
|
||||||
ice_dep = dependency('ice')
|
ice_dep = dependency('ice')
|
||||||
atk_dep = dependency('atk', version: atk_req)
|
atk_dep = dependency('atk', version: atk_req)
|
||||||
libcanberra_dep = dependency('libcanberra', version: libcanberra_req)
|
|
||||||
dbus_dep = dependency('dbus-1')
|
dbus_dep = dependency('dbus-1')
|
||||||
colord_dep = dependency('colord', version: colord_req)
|
colord_dep = dependency('colord', version: colord_req)
|
||||||
lcms2_dep = dependency('lcms2', version: lcms2_req)
|
lcms2_dep = dependency('lcms2', version: lcms2_req)
|
||||||
@ -170,6 +169,11 @@ if have_gnome_desktop
|
|||||||
gnome_desktop_dep = dependency('gnome-desktop-3.0')
|
gnome_desktop_dep = dependency('gnome-desktop-3.0')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
have_sound_player = get_option('sound_player')
|
||||||
|
if have_sound_player
|
||||||
|
libcanberra_dep = dependency('libcanberra', version: libcanberra_req)
|
||||||
|
endif
|
||||||
|
|
||||||
have_gl = get_option('opengl')
|
have_gl = get_option('opengl')
|
||||||
if have_gl
|
if have_gl
|
||||||
gl_dep = dependency('gl')
|
gl_dep = dependency('gl')
|
||||||
@ -500,6 +504,7 @@ cdata.set('HAVE_LIBSYSTEMD', have_libsystemd)
|
|||||||
cdata.set('HAVE_NATIVE_BACKEND', have_native_backend)
|
cdata.set('HAVE_NATIVE_BACKEND', have_native_backend)
|
||||||
cdata.set('HAVE_REMOTE_DESKTOP', have_remote_desktop)
|
cdata.set('HAVE_REMOTE_DESKTOP', have_remote_desktop)
|
||||||
cdata.set('HAVE_GNOME_DESKTOP', have_gnome_desktop)
|
cdata.set('HAVE_GNOME_DESKTOP', have_gnome_desktop)
|
||||||
|
cdata.set('HAVE_SOUND_PLAYER', have_sound_player)
|
||||||
cdata.set('HAVE_EGL_DEVICE', have_egl_device)
|
cdata.set('HAVE_EGL_DEVICE', have_egl_device)
|
||||||
cdata.set('HAVE_WAYLAND_EGLSTREAM', have_wayland_eglstream)
|
cdata.set('HAVE_WAYLAND_EGLSTREAM', have_wayland_eglstream)
|
||||||
cdata.set('HAVE_LIBGUDEV', have_libgudev)
|
cdata.set('HAVE_LIBGUDEV', have_libgudev)
|
||||||
@ -658,6 +663,7 @@ summary('Native Backend', have_native_backend, section: 'Options')
|
|||||||
summary('EGL Device', have_egl_device, section: 'Options')
|
summary('EGL Device', have_egl_device, section: 'Options')
|
||||||
summary('Remote desktop', have_remote_desktop, section: 'Options')
|
summary('Remote desktop', have_remote_desktop, section: 'Options')
|
||||||
summary('libgnome-desktop', have_gnome_desktop, section: 'Options')
|
summary('libgnome-desktop', have_gnome_desktop, section: 'Options')
|
||||||
|
summary('Sound player', have_sound_player, section: 'Options')
|
||||||
summary('gudev', have_libgudev, section: 'Options')
|
summary('gudev', have_libgudev, section: 'Options')
|
||||||
summary('Wacom', have_libwacom, section: 'Options')
|
summary('Wacom', have_libwacom, section: 'Options')
|
||||||
summary('SM', have_sm, section: 'Options')
|
summary('SM', have_sm, section: 'Options')
|
||||||
|
@ -93,6 +93,12 @@ option('libwacom',
|
|||||||
description: 'Enable libwacom support'
|
description: 'Enable libwacom support'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
option('sound_player',
|
||||||
|
type: 'boolean',
|
||||||
|
value: true,
|
||||||
|
description: 'Enable sound player support using libcanberra',
|
||||||
|
)
|
||||||
|
|
||||||
option('pango_ft2',
|
option('pango_ft2',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
value: true,
|
value: true,
|
||||||
|
@ -21,24 +21,31 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
#include <canberra.h>
|
#include <canberra.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "meta/meta-sound-player.h"
|
#include "meta/meta-sound-player.h"
|
||||||
|
|
||||||
#define EVENT_SOUNDS_KEY "event-sounds"
|
#define EVENT_SOUNDS_KEY "event-sounds"
|
||||||
#define THEME_NAME_KEY "theme-name"
|
#define THEME_NAME_KEY "theme-name"
|
||||||
|
|
||||||
typedef struct _MetaPlayRequest MetaPlayRequest;
|
|
||||||
|
|
||||||
struct _MetaSoundPlayer
|
struct _MetaSoundPlayer
|
||||||
{
|
{
|
||||||
GObject parent;
|
GObject parent;
|
||||||
GThreadPool *queue;
|
GThreadPool *queue;
|
||||||
GSettings *settings;
|
GSettings *settings;
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
ca_context *context;
|
ca_context *context;
|
||||||
|
#endif
|
||||||
uint32_t id_pool;
|
uint32_t id_pool;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
|
|
||||||
|
typedef struct _MetaPlayRequest MetaPlayRequest;
|
||||||
|
|
||||||
struct _MetaPlayRequest
|
struct _MetaPlayRequest
|
||||||
{
|
{
|
||||||
ca_proplist *props;
|
ca_proplist *props;
|
||||||
@ -48,6 +55,8 @@ struct _MetaPlayRequest
|
|||||||
MetaSoundPlayer *player;
|
MetaSoundPlayer *player;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
const char * const cache_allow_list[] = {
|
const char * const cache_allow_list[] = {
|
||||||
"bell-window-system",
|
"bell-window-system",
|
||||||
"desktop-switch-left",
|
"desktop-switch-left",
|
||||||
@ -59,6 +68,31 @@ const char * const cache_allow_list[] = {
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MetaSoundPlayer, meta_sound_player, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (MetaSoundPlayer, meta_sound_player, G_TYPE_OBJECT)
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_sound_player_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaSoundPlayer *player = META_SOUND_PLAYER (object);
|
||||||
|
|
||||||
|
g_object_unref (player->settings);
|
||||||
|
g_thread_pool_free (player->queue, FALSE, TRUE);
|
||||||
|
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
|
ca_context_destroy (player->context);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_sound_player_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_sound_player_class_init (MetaSoundPlayerClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_sound_player_finalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
|
|
||||||
static MetaPlayRequest *
|
static MetaPlayRequest *
|
||||||
meta_play_request_new (MetaSoundPlayer *player,
|
meta_play_request_new (MetaSoundPlayer *player,
|
||||||
ca_proplist *props,
|
ca_proplist *props,
|
||||||
@ -82,26 +116,6 @@ meta_play_request_free (MetaPlayRequest *req)
|
|||||||
g_free (req);
|
g_free (req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_sound_player_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
MetaSoundPlayer *player = META_SOUND_PLAYER (object);
|
|
||||||
|
|
||||||
g_object_unref (player->settings);
|
|
||||||
g_thread_pool_free (player->queue, FALSE, TRUE);
|
|
||||||
ca_context_destroy (player->context);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_sound_player_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_sound_player_class_init (MetaSoundPlayerClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->finalize = meta_sound_player_finalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cancelled_cb (GCancellable *cancellable,
|
cancelled_cb (GCancellable *cancellable,
|
||||||
MetaPlayRequest *req)
|
MetaPlayRequest *req)
|
||||||
@ -204,9 +218,21 @@ create_context (GSettings *settings)
|
|||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
build_ca_proplist (ca_proplist *props,
|
||||||
|
const char *event_property,
|
||||||
|
const char *event_id,
|
||||||
|
const char *event_description)
|
||||||
|
{
|
||||||
|
ca_proplist_sets (props, event_property, event_id);
|
||||||
|
ca_proplist_sets (props, CA_PROP_EVENT_DESCRIPTION, event_description);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_SOUND_PLAYER */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_sound_player_init (MetaSoundPlayer *player)
|
meta_sound_player_init (MetaSoundPlayer *player)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
player->queue = g_thread_pool_new ((GFunc) play_sound,
|
player->queue = g_thread_pool_new ((GFunc) play_sound,
|
||||||
player, 1, FALSE, NULL);
|
player, 1, FALSE, NULL);
|
||||||
player->settings = g_settings_new ("org.gnome.desktop.sound");
|
player->settings = g_settings_new ("org.gnome.desktop.sound");
|
||||||
@ -214,17 +240,9 @@ meta_sound_player_init (MetaSoundPlayer *player)
|
|||||||
|
|
||||||
g_signal_connect (player->settings, "changed",
|
g_signal_connect (player->settings, "changed",
|
||||||
G_CALLBACK (settings_changed_cb), player);
|
G_CALLBACK (settings_changed_cb), player);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
build_ca_proplist (ca_proplist *props,
|
|
||||||
const char *event_property,
|
|
||||||
const char *event_id,
|
|
||||||
const char *event_description)
|
|
||||||
{
|
|
||||||
ca_proplist_sets (props, event_property, event_id);
|
|
||||||
ca_proplist_sets (props, CA_PROP_EVENT_DESCRIPTION, event_description);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_sound_player_play_from_theme:
|
* meta_sound_player_play_from_theme:
|
||||||
@ -241,6 +259,7 @@ meta_sound_player_play_from_theme (MetaSoundPlayer *player,
|
|||||||
const char *description,
|
const char *description,
|
||||||
GCancellable *cancellable)
|
GCancellable *cancellable)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
MetaPlayRequest *req;
|
MetaPlayRequest *req;
|
||||||
ca_proplist *props;
|
ca_proplist *props;
|
||||||
|
|
||||||
@ -258,6 +277,7 @@ meta_sound_player_play_from_theme (MetaSoundPlayer *player,
|
|||||||
|
|
||||||
req = meta_play_request_new (player, props, cancellable);
|
req = meta_play_request_new (player, props, cancellable);
|
||||||
g_thread_pool_push (player->queue, req, NULL);
|
g_thread_pool_push (player->queue, req, NULL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -275,6 +295,7 @@ meta_sound_player_play_from_file (MetaSoundPlayer *player,
|
|||||||
const char *description,
|
const char *description,
|
||||||
GCancellable *cancellable)
|
GCancellable *cancellable)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_SOUND_PLAYER
|
||||||
MetaPlayRequest *req;
|
MetaPlayRequest *req;
|
||||||
ca_proplist *props;
|
ca_proplist *props;
|
||||||
char *path;
|
char *path;
|
||||||
@ -293,4 +314,5 @@ meta_sound_player_play_from_file (MetaSoundPlayer *player,
|
|||||||
|
|
||||||
req = meta_play_request_new (player, props, cancellable);
|
req = meta_play_request_new (player, props, cancellable);
|
||||||
g_thread_pool_push (player->queue, req, NULL);
|
g_thread_pool_push (player->queue, req, NULL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ mutter_pkg_private_deps = [
|
|||||||
gmodule_no_export_dep,
|
gmodule_no_export_dep,
|
||||||
gnome_settings_daemon_dep,
|
gnome_settings_daemon_dep,
|
||||||
json_glib_dep,
|
json_glib_dep,
|
||||||
libcanberra_dep,
|
|
||||||
xkbcommon_dep,
|
xkbcommon_dep,
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -37,6 +36,12 @@ if have_gnome_desktop
|
|||||||
]
|
]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if have_sound_player
|
||||||
|
mutter_pkg_private_deps += [
|
||||||
|
libcanberra_dep,
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
if have_gl
|
if have_gl
|
||||||
mutter_pkg_deps += [
|
mutter_pkg_deps += [
|
||||||
gl_dep,
|
gl_dep,
|
||||||
|
Loading…
Reference in New Issue
Block a user