From 7902fa3f9fb9e772f0b74ed86f1c7ea8489ee601 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Tue, 26 Apr 2022 15:00:46 +0200 Subject: [PATCH] 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: --- config.h.meson | 3 ++ meson.build | 8 +++- meson_options.txt | 6 +++ src/core/meta-sound-player.c | 82 +++++++++++++++++++++++------------- src/meson.build | 7 ++- 5 files changed, 74 insertions(+), 32 deletions(-) diff --git a/config.h.meson b/config.h.meson index e6ff572f5..c7724b24f 100644 --- a/config.h.meson +++ b/config.h.meson @@ -61,6 +61,9 @@ /* Defined if gnome-desktop is enabled */ #mesondefine HAVE_GNOME_DESKTOP +/* Defined if sound player is enabled */ +#mesondefine HAVE_SOUND_PLAYER + /* Building with SM support */ #mesondefine HAVE_SM diff --git a/meson.build b/meson.build index cbfc8946a..45ed455dd 100644 --- a/meson.build +++ b/meson.build @@ -124,7 +124,6 @@ json_glib_dep = dependency('json-glib-1.0', version: json_glib_req) xkbcommon_dep = dependency('xkbcommon', version: xkbcommon_req) ice_dep = dependency('ice') atk_dep = dependency('atk', version: atk_req) -libcanberra_dep = dependency('libcanberra', version: libcanberra_req) dbus_dep = dependency('dbus-1') colord_dep = dependency('colord', version: colord_req) lcms2_dep = dependency('lcms2', version: lcms2_req) @@ -170,6 +169,11 @@ if have_gnome_desktop gnome_desktop_dep = dependency('gnome-desktop-3.0') 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') if have_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_REMOTE_DESKTOP', have_remote_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_WAYLAND_EGLSTREAM', have_wayland_eglstream) 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('Remote desktop', have_remote_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('Wacom', have_libwacom, section: 'Options') summary('SM', have_sm, section: 'Options') diff --git a/meson_options.txt b/meson_options.txt index 61b99d9e0..cddcc1a47 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -93,6 +93,12 @@ option('libwacom', description: 'Enable libwacom support' ) +option('sound_player', + type: 'boolean', + value: true, + description: 'Enable sound player support using libcanberra', +) + option('pango_ft2', type: 'boolean', value: true, diff --git a/src/core/meta-sound-player.c b/src/core/meta-sound-player.c index e2d103893..29f831bab 100644 --- a/src/core/meta-sound-player.c +++ b/src/core/meta-sound-player.c @@ -21,24 +21,31 @@ #include "config.h" +#ifdef HAVE_SOUND_PLAYER #include +#endif #include "meta/meta-sound-player.h" #define EVENT_SOUNDS_KEY "event-sounds" #define THEME_NAME_KEY "theme-name" -typedef struct _MetaPlayRequest MetaPlayRequest; struct _MetaSoundPlayer { GObject parent; GThreadPool *queue; GSettings *settings; +#ifdef HAVE_SOUND_PLAYER ca_context *context; +#endif uint32_t id_pool; }; +#ifdef HAVE_SOUND_PLAYER + +typedef struct _MetaPlayRequest MetaPlayRequest; + struct _MetaPlayRequest { ca_proplist *props; @@ -48,6 +55,8 @@ struct _MetaPlayRequest MetaSoundPlayer *player; }; +#endif + const char * const cache_allow_list[] = { "bell-window-system", "desktop-switch-left", @@ -59,6 +68,31 @@ const char * const cache_allow_list[] = { 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 * meta_play_request_new (MetaSoundPlayer *player, ca_proplist *props, @@ -82,26 +116,6 @@ meta_play_request_free (MetaPlayRequest *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 cancelled_cb (GCancellable *cancellable, MetaPlayRequest *req) @@ -204,9 +218,21 @@ create_context (GSettings *settings) 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 meta_sound_player_init (MetaSoundPlayer *player) { +#ifdef HAVE_SOUND_PLAYER player->queue = g_thread_pool_new ((GFunc) play_sound, player, 1, FALSE, NULL); 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_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: @@ -241,6 +259,7 @@ meta_sound_player_play_from_theme (MetaSoundPlayer *player, const char *description, GCancellable *cancellable) { +#ifdef HAVE_SOUND_PLAYER MetaPlayRequest *req; ca_proplist *props; @@ -258,6 +277,7 @@ meta_sound_player_play_from_theme (MetaSoundPlayer *player, req = meta_play_request_new (player, props, cancellable); g_thread_pool_push (player->queue, req, NULL); +#endif } /** @@ -275,6 +295,7 @@ meta_sound_player_play_from_file (MetaSoundPlayer *player, const char *description, GCancellable *cancellable) { +#ifdef HAVE_SOUND_PLAYER MetaPlayRequest *req; ca_proplist *props; char *path; @@ -293,4 +314,5 @@ meta_sound_player_play_from_file (MetaSoundPlayer *player, req = meta_play_request_new (player, props, cancellable); g_thread_pool_push (player->queue, req, NULL); +#endif } diff --git a/src/meson.build b/src/meson.build index 7b6237968..1dce13e13 100644 --- a/src/meson.build +++ b/src/meson.build @@ -27,7 +27,6 @@ mutter_pkg_private_deps = [ gmodule_no_export_dep, gnome_settings_daemon_dep, json_glib_dep, - libcanberra_dep, xkbcommon_dep, ] @@ -37,6 +36,12 @@ if have_gnome_desktop ] endif +if have_sound_player + mutter_pkg_private_deps += [ + libcanberra_dep, + ] +endif + if have_gl mutter_pkg_deps += [ gl_dep,