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:
Bilal Elmoussaoui 2022-04-26 15:00:46 +02:00 committed by Marge Bot
parent f94189d4eb
commit 7902fa3f9f
5 changed files with 74 additions and 32 deletions

View File

@ -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

View File

@ -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')

View File

@ -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,

View File

@ -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
} }

View File

@ -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,