Skip to content

Commit

Permalink
core: Make sound player feature optional
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
bilelmoussaoui authored and Marge Bot committed Sep 2, 2022
1 parent f94189d commit 7902fa3
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 32 deletions.
3 changes: 3 additions & 0 deletions config.h.meson
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 7 additions & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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')
Expand Down
6 changes: 6 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
82 changes: 52 additions & 30 deletions src/core/meta-sound-player.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,31 @@

#include "config.h"

#ifdef HAVE_SOUND_PLAYER
#include <canberra.h>
#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;
Expand All @@ -48,6 +55,8 @@ struct _MetaPlayRequest
MetaSoundPlayer *player;
};

#endif

const char * const cache_allow_list[] = {
"bell-window-system",
"desktop-switch-left",
Expand All @@ -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,
Expand All @@ -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)
Expand Down Expand Up @@ -204,27 +218,31 @@ 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");
player->context = create_context (player->settings);

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:
Expand All @@ -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;

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

/**
Expand All @@ -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;
Expand All @@ -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
}
7 changes: 6 additions & 1 deletion src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ mutter_pkg_private_deps = [
gmodule_no_export_dep,
gnome_settings_daemon_dep,
json_glib_dep,
libcanberra_dep,
xkbcommon_dep,
]

Expand All @@ -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,
Expand Down

0 comments on commit 7902fa3

Please sign in to comment.