PKGBUILDs/extra/gnome-settings-daemon/07_use_gstreamer_volume.patch
2009-10-09 21:23:22 -05:00

2384 lines
76 KiB
Diff

Index: plugins/media-keys/acme-eject.png
===================================================================
Impossible d'afficher : fichier considéré comme binaire.
svn:mime-type = application/octet-stream
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/configure.ac gnome-settings-daemon-2.25.90.new/configure.ac
--- gnome-settings-daemon-2.25.90/configure.ac 2009-02-04 22:49:03.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/configure.ac 2009-02-11 14:47:35.000000000 +0100
@@ -224,8 +224,6 @@
dnl PulseAudio section
dnl ==============================================
-
-have_pulse=false
AC_ARG_ENABLE(pulse,
AC_HELP_STRING([--disable-pulse],
[turn off PulseAudio support]),
@@ -237,17 +235,104 @@
[WANT_PULSE=yes]) dnl Default value
if test x$WANT_PULSE = xyes ; then
- PA_REQUIRED_VERSION=0.9.12
- PKG_CHECK_MODULES(PULSE, glib-2.0 libpulse >= $PA_REQUIRED_VERSION libpulse-mainloop-glib >= $PA_REQUIRED_VERSION,
- [have_pulse=true
- AC_DEFINE(HAVE_PULSE, 1, [Define if PULSE sound server should be used])],
+ PKG_CHECK_MODULES(PULSE, libpulse >= 0.9.11,
+ AC_DEFINE(HAVE_PULSE, 1, [Define if PULSE sound server should be used]),
[have_pulse=false])
fi
-AM_CONDITIONAL(HAVE_PULSE, test "x$have_pulse" = "xtrue")
AC_SUBST(PULSE_CFLAGS)
AC_SUBST(PULSE_LIBS)
+dnl ==============================================
+dnl GStreamer section
+dnl ==============================================
+GST_MAJORMINOR=auto
+
+AC_ARG_ENABLE(gstreamer,
+AC_HELP_STRING([--enable-gstreamer],[use gstreamer if available (and optionally specify a version)]),
+[case "${enableval}" in
+ yes) ENABLE_GSTREAMER=yes ;;
+ 0.10) ENABLE_GSTREAMER=yes && GST_MAJORMINOR=0.10 ;;
+ no) ENABLE_GSTREAMER=no ;;
+ *) AC_MSG_ERROR([
+ *** Bad value ${enableval} for --enable-gstreamer
+ *** Please use one of the following:
+ *** --enable-gstreamer=0.10
+ ]) ;;
+esac],
+[ENABLE_GSTREAMER=yes]) dnl Default value
+
+have_gstreamer=no
+if test "x$ENABLE_GSTREAMER" = "xyes"; then
+ GST_REQS=0.10.1.2
+ PKGS="gstreamer-0.10 >= $GST_REQS gstreamer-plugins-base-0.10 >= $GST_REQS"
+
+ PKG_CHECK_MODULES(GST, $PKGS, have_gstreamer=yes,
+ AC_MSG_RESULT([no]))
+
+ if test "x$have_gstreamer" = "xyes"; then
+ GST_LIBS="$GST_LIBS -lgstinterfaces-0.10 -lgstaudio-0.10"
+ fi
+else
+ AC_MSG_NOTICE([*** GStreamer support disabled ***])
+fi
+AM_CONDITIONAL(HAVE_GSTREAMER, test "x$have_gstreamer" = "xyes")
+AC_SUBST(GST_LIBS)
+AC_SUBST(GST_CFLAGS)
+
+dnl ==============================================
+dnl OSS section
+dnl ==============================================
+
+have_oss=no
+if test "x$have_gstreamer" != "xyes"; then
+ AC_TRY_COMPILE([
+ #ifdef __NetBSD__
+ #include <sys/param.h>
+ #include <sys/sysctl.h>
+ #include <soundcard.h>
+ #else
+ #include <sys/soundcard.h>
+ #endif
+ ],[
+ int arg = SNDCTL_DSP_SETFRAGMENT;
+ ],[
+ have_oss=yes
+ ])
+ AC_MSG_CHECKING(for OSS audio support)
+ AC_MSG_RESULT($have_oss)
+fi
+
+AM_CONDITIONAL(HAVE_OSS, test x"$have_oss" = "xyes")
+
+dnl ==============================================
+dnl ALSA section
+dnl ==============================================
+
+have_alsa=no
+if test "x$have_gstreamer" != "xyes"; then
+ AC_ARG_ENABLE(alsa,
+ AC_HELP_STRING([--disable-alsa],
+ [turn off ALSA audio support]),
+ [case "${enableval}" in
+ yes) WANT_ALSA=yes ;;
+ no) WANT_ALSA=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --disable-alsa) ;;
+ esac],
+ [WANT_ALSA=yes]) dnl Default value
+
+ if test x$WANT_ALSA = xyes ; then
+ PKG_CHECK_MODULES(ALSA, alsa >= 0.9.0,
+ have_alsa=yes,
+ AC_MSG_RESULT([disabled]))
+ fi
+
+ AC_SUBST(ALSA_LIBS)
+ AC_SUBST(ALSA_CFLAGS)
+fi
+
+AM_CONDITIONAL(HAVE_ALSA, test x"$have_alsa" = "xyes")
+
# ---------------------------------------------------------------------------
# Enable Profiling
# ---------------------------------------------------------------------------
@@ -345,7 +430,7 @@
plugins/keybindings/Makefile
plugins/keyboard/Makefile
plugins/media-keys/Makefile
-plugins/media-keys/cut-n-paste/Makefile
+plugins/media-keys/actions/Makefile
plugins/mouse/Makefile
plugins/screensaver/Makefile
plugins/sound/Makefile
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/acme.glade gnome-settings-daemon-2.25.90.new/plugins/media-keys/acme.glade
--- gnome-settings-daemon-2.25.90/plugins/media-keys/acme.glade 2009-02-04 22:33:14.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/acme.glade 2009-02-11 14:47:35.000000000 +0100
@@ -1,55 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkWindow" id="dialog">
- <child>
- <widget class="GtkFrame" id="acme_frame">
- <property name="shadow_type">GTK_SHADOW_OUT</property>
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkVBox" id="acme_vbox">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkImage" id="acme_image">
- <property name="visible">True</property>
- <property name="icon_size">6</property>
- <property name="icon_name">audio-volume-high</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkProgressBar" id="acme_volume_progressbar">
- <property name="visible">True</property>
- <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
- <property name="fraction">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/acme.h gnome-settings-daemon-2.25.90.new/plugins/media-keys/acme.h
--- gnome-settings-daemon-2.25.90/plugins/media-keys/acme.h 2009-02-04 22:33:14.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/acme.h 2009-02-11 14:47:35.000000000 +0100
@@ -1,78 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2001 Bastien Nocera <hadess@hadess.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- * USA.
- */
-
-#ifndef __ACME_H__
-#define __ACME_H__
-
-#include "gsd-keygrab.h"
-
-#define GCONF_BINDING_DIR "/apps/gnome_settings_daemon/keybindings"
-#define GCONF_MISC_DIR "/apps/gnome_settings_daemon"
-
-enum {
- MUTE_KEY,
- VOLUME_DOWN_KEY,
- VOLUME_UP_KEY,
- POWER_KEY,
- EJECT_KEY,
- HOME_KEY,
- MEDIA_KEY,
- CALCULATOR_KEY,
- SEARCH_KEY,
- EMAIL_KEY,
- SLEEP_KEY,
- SCREENSAVER_KEY,
- HELP_KEY,
- WWW_KEY,
- PLAY_KEY,
- PAUSE_KEY,
- STOP_KEY,
- PREVIOUS_KEY,
- NEXT_KEY,
- HANDLED_KEYS
-};
-
-static struct {
- int key_type;
- const char *gconf_key;
- Key *key;
-} keys[HANDLED_KEYS] = {
- { MUTE_KEY, GCONF_BINDING_DIR "/volume_mute",NULL },
- { VOLUME_DOWN_KEY, GCONF_BINDING_DIR "/volume_down", NULL },
- { VOLUME_UP_KEY, GCONF_BINDING_DIR "/volume_up", NULL },
- { POWER_KEY, GCONF_BINDING_DIR "/power", NULL },
- { EJECT_KEY, GCONF_BINDING_DIR "/eject", NULL },
- { HOME_KEY, GCONF_BINDING_DIR "/home", NULL },
- { MEDIA_KEY, GCONF_BINDING_DIR "/media", NULL },
- { CALCULATOR_KEY, GCONF_BINDING_DIR "/calculator", NULL },
- { SEARCH_KEY, GCONF_BINDING_DIR "/search", NULL },
- { EMAIL_KEY, GCONF_BINDING_DIR "/email", NULL },
- { SLEEP_KEY, GCONF_BINDING_DIR "/sleep", NULL },
- { SCREENSAVER_KEY, GCONF_BINDING_DIR "/screensaver", NULL },
- { HELP_KEY, GCONF_BINDING_DIR "/help", NULL },
- { WWW_KEY, GCONF_BINDING_DIR "/www", NULL },
- { PLAY_KEY, GCONF_BINDING_DIR "/play", NULL },
- { PAUSE_KEY, GCONF_BINDING_DIR "/pause", NULL },
- { STOP_KEY, GCONF_BINDING_DIR "/stop", NULL },
- { PREVIOUS_KEY, GCONF_BINDING_DIR "/previous", NULL },
- { NEXT_KEY, GCONF_BINDING_DIR "/next", NULL },
-};
-
-#endif /* __ACME_H__ */
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme.glade gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme.glade
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme.glade 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme.glade 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,55 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="dialog">
+ <child>
+ <widget class="GtkFrame" id="acme_frame">
+ <property name="shadow_type">GTK_SHADOW_OUT</property>
+ <property name="visible">True</property>
+
+ <child>
+ <widget class="GtkVBox" id="acme_vbox">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">6</property>
+
+ <child>
+ <widget class="GtkImage" id="acme_image">
+ <property name="visible">True</property>
+ <property name="icon_size">6</property>
+ <property name="icon_name">audio-volume-high</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkProgressBar" id="acme_volume_progressbar">
+ <property name="visible">True</property>
+ <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
+ <property name="fraction">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme.h gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme.h
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme.h 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,78 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2001 Bastien Nocera <hadess@hadess.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef __ACME_H__
+#define __ACME_H__
+
+#include "gsd-keygrab.h"
+
+#define GCONF_BINDING_DIR "/apps/gnome_settings_daemon/keybindings"
+#define GCONF_MISC_DIR "/apps/gnome_settings_daemon"
+
+enum {
+ MUTE_KEY,
+ VOLUME_DOWN_KEY,
+ VOLUME_UP_KEY,
+ POWER_KEY,
+ EJECT_KEY,
+ HOME_KEY,
+ MEDIA_KEY,
+ CALCULATOR_KEY,
+ SEARCH_KEY,
+ EMAIL_KEY,
+ SLEEP_KEY,
+ SCREENSAVER_KEY,
+ HELP_KEY,
+ WWW_KEY,
+ PLAY_KEY,
+ PAUSE_KEY,
+ STOP_KEY,
+ PREVIOUS_KEY,
+ NEXT_KEY,
+ HANDLED_KEYS
+};
+
+static struct {
+ int key_type;
+ const char *gconf_key;
+ Key *key;
+} keys[HANDLED_KEYS] = {
+ { MUTE_KEY, GCONF_BINDING_DIR "/volume_mute",NULL },
+ { VOLUME_DOWN_KEY, GCONF_BINDING_DIR "/volume_down", NULL },
+ { VOLUME_UP_KEY, GCONF_BINDING_DIR "/volume_up", NULL },
+ { POWER_KEY, GCONF_BINDING_DIR "/power", NULL },
+ { EJECT_KEY, GCONF_BINDING_DIR "/eject", NULL },
+ { HOME_KEY, GCONF_BINDING_DIR "/home", NULL },
+ { MEDIA_KEY, GCONF_BINDING_DIR "/media", NULL },
+ { CALCULATOR_KEY, GCONF_BINDING_DIR "/calculator", NULL },
+ { SEARCH_KEY, GCONF_BINDING_DIR "/search", NULL },
+ { EMAIL_KEY, GCONF_BINDING_DIR "/email", NULL },
+ { SLEEP_KEY, GCONF_BINDING_DIR "/sleep", NULL },
+ { SCREENSAVER_KEY, GCONF_BINDING_DIR "/screensaver", NULL },
+ { HELP_KEY, GCONF_BINDING_DIR "/help", NULL },
+ { WWW_KEY, GCONF_BINDING_DIR "/www", NULL },
+ { PLAY_KEY, GCONF_BINDING_DIR "/play", NULL },
+ { PAUSE_KEY, GCONF_BINDING_DIR "/pause", NULL },
+ { STOP_KEY, GCONF_BINDING_DIR "/stop", NULL },
+ { PREVIOUS_KEY, GCONF_BINDING_DIR "/previous", NULL },
+ { NEXT_KEY, GCONF_BINDING_DIR "/next", NULL },
+};
+
+#endif /* __ACME_H__ */
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-alsa.c gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-alsa.c
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-alsa.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-alsa.c 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,326 @@
+/* acme-volume-alsa.c
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#include "config.h"
+#include "acme-volume-alsa.h"
+
+#include <alsa/asoundlib.h>
+
+#ifndef DEFAULT_CARD
+#define DEFAULT_CARD "default"
+#endif
+
+#undef LOG
+#ifdef LOG
+#define D(x...) g_message (x)
+#else
+#define D(x...)
+#endif
+
+#define ROUND(x) ((x - (int)x > 0.5) ? x+1 : x)
+
+struct AcmeVolumeAlsaPrivate
+{
+ long pmin, pmax;
+ gboolean has_mute, has_master;
+ snd_mixer_t *handle;
+ snd_mixer_elem_t *elem;
+ int saved_volume;
+ guint timer_id;
+};
+
+static int acme_volume_alsa_get_volume (AcmeVolume *self);
+static void acme_volume_alsa_set_volume (AcmeVolume *self, int val);
+static gboolean acme_volume_alsa_open (AcmeVolumeAlsa *self);
+static void acme_volume_alsa_close (AcmeVolumeAlsa *self);
+static gboolean acme_volume_alsa_close_real (AcmeVolumeAlsa *self);
+
+G_DEFINE_TYPE (AcmeVolumeAlsa, acme_volume_alsa, ACME_TYPE_VOLUME)
+
+static void
+acme_volume_alsa_finalize (GObject *object)
+{
+ AcmeVolumeAlsa *self;
+
+ self = ACME_VOLUME_ALSA (object);
+
+ if (self->_priv)
+ {
+ if (self->_priv->timer_id != 0)
+ {
+ g_source_remove (self->_priv->timer_id);
+ self->_priv->timer_id = 0;
+ }
+
+ acme_volume_alsa_close_real (self);
+ g_free (self->_priv);
+ self->_priv = NULL;
+ }
+
+ G_OBJECT_CLASS (acme_volume_alsa_parent_class)->finalize (object);
+}
+
+static void
+acme_volume_alsa_set_mute (AcmeVolume *vol, gboolean val)
+{
+ AcmeVolumeAlsa *self = (AcmeVolumeAlsa *) vol;
+
+ if (acme_volume_alsa_open (self) == FALSE)
+ return;
+
+ /* If we have a hardware mute */
+ if (self->_priv->has_mute)
+ {
+ snd_mixer_selem_set_playback_switch_all
+ (self->_priv->elem, !val);
+ acme_volume_alsa_close (self);
+ return;
+ }
+
+ acme_volume_alsa_close (self);
+
+ /* If we don't */
+ if (val == TRUE)
+ {
+ self->_priv->saved_volume = acme_volume_alsa_get_volume (vol);
+ acme_volume_alsa_set_volume (vol, 0);
+ } else {
+ if (self->_priv->saved_volume != -1)
+ acme_volume_alsa_set_volume (vol,
+ self->_priv->saved_volume);
+ }
+}
+
+static gboolean
+acme_volume_alsa_get_mute (AcmeVolume *vol)
+{
+ AcmeVolumeAlsa *self = (AcmeVolumeAlsa *) vol;
+ int ival;
+
+ if (acme_volume_alsa_open (self) == FALSE)
+ return FALSE;
+
+ if (self->_priv->has_mute)
+ {
+ snd_mixer_selem_get_playback_switch(self->_priv->elem,
+ SND_MIXER_SCHN_FRONT_LEFT, &ival);
+
+ acme_volume_alsa_close (self);
+
+ return !ival;
+ } else {
+ acme_volume_alsa_close (self);
+
+ return (acme_volume_alsa_get_volume (vol) == 0);
+ }
+}
+
+static int
+acme_volume_alsa_get_volume (AcmeVolume *vol)
+{
+ AcmeVolumeAlsa *self = (AcmeVolumeAlsa *) vol;
+ long lval, rval;
+ int tmp;
+ float alsa_vol;
+
+ if (acme_volume_alsa_open (self) == FALSE)
+ return 0;
+
+ snd_mixer_selem_get_playback_volume(self->_priv->elem,
+ SND_MIXER_SCHN_FRONT_LEFT, &lval);
+ snd_mixer_selem_get_playback_volume(self->_priv->elem,
+ SND_MIXER_SCHN_FRONT_RIGHT, &rval);
+
+ acme_volume_alsa_close (self);
+
+ alsa_vol = (lval + rval) / 2;
+ alsa_vol = alsa_vol * 100 / (self->_priv->pmax - self->_priv->pmin);
+ tmp = ROUND (alsa_vol);
+
+ return tmp;
+}
+
+static void
+acme_volume_alsa_set_volume (AcmeVolume *vol, int val)
+{
+ AcmeVolumeAlsa *self = (AcmeVolumeAlsa *) vol;
+ float volume;
+ int tmp;
+
+ if (acme_volume_alsa_open (self) == FALSE)
+ return;
+
+ volume = (float) val / 100 * (self->_priv->pmax - self->_priv->pmin);
+ volume = CLAMP (volume, self->_priv->pmin, self->_priv->pmax);
+ tmp = ROUND (volume);
+
+ snd_mixer_selem_set_playback_volume_all (self->_priv->elem, tmp);
+
+ acme_volume_alsa_close (self);
+}
+
+static int
+acme_volume_alsa_get_threshold (AcmeVolume *vol)
+{
+ AcmeVolumeAlsa *self = (AcmeVolumeAlsa *) vol;
+ int steps;
+
+ if (acme_volume_alsa_open (self) == FALSE)
+ return 1;
+
+ acme_volume_alsa_close (self);
+
+ steps = self->_priv->pmax - self->_priv->pmin;
+ return (steps > 0) ? 100 / steps + 1 : 1;
+}
+
+static gboolean
+acme_volume_alsa_close_real (AcmeVolumeAlsa *self)
+{
+ if (self->_priv == NULL)
+ return FALSE;
+
+ if (self->_priv->handle != NULL)
+ {
+ snd_mixer_detach (self->_priv->handle, DEFAULT_CARD);
+ snd_mixer_free (self->_priv->handle);
+ self->_priv->handle = NULL;
+ self->_priv->elem = NULL;
+ }
+
+ self->_priv->timer_id = 0;
+
+ return FALSE;
+}
+
+static gboolean
+acme_volume_alsa_open (AcmeVolumeAlsa *self)
+{
+ snd_mixer_selem_id_t *sid;
+ snd_mixer_t *handle;
+ snd_mixer_elem_t *elem;
+
+ if (self->_priv->timer_id != 0)
+ {
+ g_source_remove (self->_priv->timer_id);
+ self->_priv->timer_id = 0;
+ return TRUE;
+ }
+
+ /* open the mixer */
+ if (snd_mixer_open (&handle, 0) < 0)
+ {
+ D("snd_mixer_open");
+ return FALSE;
+ }
+ /* attach the handle to the default card */
+ if (snd_mixer_attach (handle, DEFAULT_CARD) <0)
+ {
+ D("snd_mixer_attach");
+ goto bail;
+ }
+ /* ? */
+ if (snd_mixer_selem_register (handle, NULL, NULL) < 0)
+ {
+ D("snd_mixer_selem_register");
+ goto bail;
+ }
+ if (snd_mixer_load (handle) < 0)
+ {
+ D("snd_mixer_load");
+ goto bail;
+ }
+
+ snd_mixer_selem_id_alloca (&sid);
+ snd_mixer_selem_id_set_name (sid, "Master");
+ elem = snd_mixer_find_selem (handle, sid);
+ if (!elem)
+ {
+ snd_mixer_selem_id_alloca (&sid);
+ snd_mixer_selem_id_set_name (sid, "PCM");
+ elem = snd_mixer_find_selem (handle, sid);
+ if (!elem)
+ {
+ D("snd_mixer_find_selem");
+ goto bail;
+ }
+ }
+
+ if (!snd_mixer_selem_has_playback_volume (elem))
+ {
+ D("snd_mixer_selem_has_playback_volume");
+ goto bail;
+ }
+
+ snd_mixer_selem_get_playback_volume_range (elem,
+ &(self->_priv->pmin),
+ &(self->_priv->pmax));
+
+ self->_priv->has_mute = snd_mixer_selem_has_playback_switch (elem);
+ self->_priv->handle = handle;
+ self->_priv->elem = elem;
+
+ return TRUE;
+
+bail:
+ acme_volume_alsa_close_real (self);
+ return FALSE;
+}
+
+static void
+acme_volume_alsa_close (AcmeVolumeAlsa *self)
+{
+ self->_priv->timer_id = g_timeout_add (4000,
+ (GSourceFunc) acme_volume_alsa_close_real, self);
+}
+
+static void
+acme_volume_alsa_init (AcmeVolumeAlsa *self)
+{
+ self->_priv = g_new0 (AcmeVolumeAlsaPrivate, 1);
+
+ if (acme_volume_alsa_open (self) == FALSE)
+ {
+ g_free (self->_priv);
+ self->_priv = NULL;
+ return;
+ }
+
+ if (self->_priv->handle != NULL) {
+ acme_volume_alsa_close_real (self);
+ return;
+ }
+}
+
+static void
+acme_volume_alsa_class_init (AcmeVolumeAlsaClass *klass)
+{
+ AcmeVolumeClass *volume_class = ACME_VOLUME_CLASS (klass);
+ G_OBJECT_CLASS (klass)->finalize = acme_volume_alsa_finalize;
+
+ volume_class->set_volume = acme_volume_alsa_set_volume;
+ volume_class->get_volume = acme_volume_alsa_get_volume;
+ volume_class->set_mute = acme_volume_alsa_set_mute;
+ volume_class->get_mute = acme_volume_alsa_get_mute;
+ volume_class->get_threshold = acme_volume_alsa_get_threshold;
+}
+
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-alsa.h gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-alsa.h
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-alsa.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-alsa.h 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,47 @@
+/* acme-volume-alsa.h
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include "acme-volume.h"
+
+#define ACME_TYPE_VOLUME_ALSA (acme_volume_get_type ())
+#define ACME_VOLUME_ALSA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ACME_TYPE_VOLUME_ALSA, AcmeVolumeAlsa))
+#define ACME_VOLUME_ALSA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ACME_TYPE_VOLUME_ALSA, AcmeVolumeAlsaClass))
+#define ACME_IS_VOLUME_ALSA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ACME_TYPE_VOLUME_ALSA))
+#define ACME_VOLUME_ALSA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ACME_TYPE_VOLUME_ALSA, AcmeVolumeAlsaClass))
+
+typedef struct AcmeVolumeAlsa AcmeVolumeAlsa;
+typedef struct AcmeVolumeAlsaClass AcmeVolumeAlsaClass;
+typedef struct AcmeVolumeAlsaPrivate AcmeVolumeAlsaPrivate;
+
+struct AcmeVolumeAlsa {
+ AcmeVolume parent;
+ AcmeVolumeAlsaPrivate *_priv;
+};
+
+struct AcmeVolumeAlsaClass {
+ AcmeVolumeClass parent;
+};
+
+GType acme_volume_alsa_get_type (void);
+
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume.c gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume.c
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume.c 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,125 @@
+/* acme-volume.c
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#include "config.h"
+#include "acme-volume.h"
+#ifdef HAVE_OSS
+#include "acme-volume-oss.h"
+#endif
+#ifdef HAVE_ALSA
+#include "acme-volume-alsa.h"
+#endif
+#ifdef HAVE_GSTREAMER
+#include "acme-volume-gstreamer.h"
+#endif
+
+G_DEFINE_TYPE (AcmeVolume, acme_volume, G_TYPE_OBJECT)
+
+static void
+acme_volume_class_init (AcmeVolumeClass *klass)
+{
+}
+
+static void
+acme_volume_init (AcmeVolume *vol)
+{
+}
+
+int
+acme_volume_get_volume (AcmeVolume *self)
+{
+ g_return_val_if_fail (self != NULL, 0);
+ g_return_val_if_fail (ACME_IS_VOLUME (self), 0);
+
+ return ACME_VOLUME_GET_CLASS (self)->get_volume (self);
+}
+
+void
+acme_volume_set_volume (AcmeVolume *self, int val)
+{
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (ACME_IS_VOLUME (self));
+
+ ACME_VOLUME_GET_CLASS (self)->set_volume (self, val);
+}
+
+gboolean
+acme_volume_get_mute (AcmeVolume *self)
+{
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (ACME_IS_VOLUME (self), FALSE);
+
+ return ACME_VOLUME_GET_CLASS (self)->get_mute (self);
+}
+
+void
+acme_volume_set_mute (AcmeVolume *self, gboolean val)
+{
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (ACME_IS_VOLUME (self));
+
+ ACME_VOLUME_GET_CLASS (self)->set_mute (self, val);
+}
+
+void
+acme_volume_mute_toggle (AcmeVolume *self)
+{
+ gboolean muted;
+
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (ACME_IS_VOLUME (self));
+
+ muted = ACME_VOLUME_GET_CLASS (self)->get_mute (self);
+ ACME_VOLUME_GET_CLASS (self)->set_mute (self, !muted);
+}
+
+int
+acme_volume_get_threshold (AcmeVolume *self)
+{
+ g_return_val_if_fail (self != NULL, 0);
+ g_return_val_if_fail (ACME_IS_VOLUME (self), 0);
+
+ return ACME_VOLUME_GET_CLASS (self)->get_threshold (self);
+}
+
+AcmeVolume *acme_volume_new (void)
+{
+ AcmeVolume *vol;
+
+#ifdef HAVE_GSTREAMER
+ vol = ACME_VOLUME (g_object_new (acme_volume_gstreamer_get_type (), NULL));
+ return vol;
+#endif
+#ifdef HAVE_ALSA
+ vol = ACME_VOLUME (g_object_new (acme_volume_alsa_get_type (), NULL));
+ if (vol != NULL && ACME_VOLUME_ALSA (vol)->_priv != NULL)
+ return vol;
+ if (ACME_VOLUME_ALSA (vol)->_priv == NULL)
+ g_object_unref (vol);
+#endif
+#ifdef HAVE_OSS
+ vol = ACME_VOLUME (g_object_new (acme_volume_oss_get_type (), NULL));
+ return vol;
+#endif
+ return NULL;
+}
+
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-dummy.c gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-dummy.c
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-dummy.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-dummy.c 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,82 @@
+/* acme-volume-dummy.c
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#include "config.h"
+#include "acme-volume-dummy.h"
+
+G_DEFINE_TYPE (AcmeVolumeDummy, acme_volume_dummy, ACME_TYPE_VOLUME)
+
+static void
+acme_volume_dummy_finalize (GObject *object)
+{
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (ACME_IS_VOLUME_DUMMY (object));
+
+ G_OBJECT_CLASS (acme_volume_dummy_parent_class)->finalize (object);
+}
+
+static void
+acme_volume_dummy_set_mute (AcmeVolume *vol, gboolean val)
+{
+}
+
+static gboolean
+acme_volume_dummy_get_mute (AcmeVolume *vol)
+{
+ return FALSE;
+}
+
+static int
+acme_volume_dummy_get_volume (AcmeVolume *vol)
+{
+ return 0;
+}
+
+static void
+acme_volume_dummy_set_volume (AcmeVolume *vol, int val)
+{
+}
+
+/* minimum step size (in percent) required to actually affect volume */
+static int
+acme_volume_dummy_get_threshold (AcmeVolume *vol)
+{
+ return 1;
+}
+
+static void
+acme_volume_dummy_init (AcmeVolumeDummy *vol)
+{
+}
+
+static void
+acme_volume_dummy_class_init (AcmeVolumeDummyClass *klass)
+{
+ AcmeVolumeClass *volume_class = ACME_VOLUME_CLASS (klass);
+ G_OBJECT_CLASS (klass)->finalize = acme_volume_dummy_finalize;
+
+ volume_class->set_volume = acme_volume_dummy_set_volume;
+ volume_class->get_volume = acme_volume_dummy_get_volume;
+ volume_class->set_mute = acme_volume_dummy_set_mute;
+ volume_class->get_mute = acme_volume_dummy_get_mute;
+ volume_class->get_threshold = acme_volume_dummy_get_threshold;
+}
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-dummy.h gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-dummy.h
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-dummy.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-dummy.h 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,44 @@
+/* acme-volume-dummy.h
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include "acme-volume.h"
+
+#define ACME_TYPE_VOLUME_DUMMY (acme_volume_dummy_get_type ())
+#define ACME_VOLUME_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ACME_TYPE_VOLUME_DUMMY, AcmeVolumeDummy))
+#define ACME_VOLUME_DUMMY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ACME_TYPE_VOLUME_DUMMY, AcmeVolumeDummyClass))
+#define ACME_IS_VOLUME_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ACME_TYPE_VOLUME_DUMMY))
+#define ACME_VOLUME_DUMMY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ACME_TYPE_VOLUME_DUMMY, AcmeVolumeDummyClass))
+
+typedef struct AcmeVolumeDummy AcmeVolumeDummy;
+typedef struct AcmeVolumeDummyClass AcmeVolumeDummyClass;
+
+struct AcmeVolumeDummy {
+ AcmeVolume parent;
+};
+
+struct AcmeVolumeDummyClass {
+ AcmeVolumeClass parent;
+};
+
+GType acme_volume_dummy_get_type (void);
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-gstreamer.c gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-gstreamer.c
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-gstreamer.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-gstreamer.c 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,432 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* acme-volume-gstreamer.c
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+ Copyright (C) 2004 Novell, Inc.
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ Jon Trowbridge <trow@ximian.com>
+ */
+
+#include "config.h"
+#include "acme-volume-gstreamer.h"
+
+#include <gst/gst.h>
+#include <gst/audio/mixerutils.h>
+#include <gst/interfaces/mixer.h>
+#include <gst/interfaces/propertyprobe.h>
+
+#include <gconf/gconf-client.h>
+
+#include <string.h>
+
+#define TIMEOUT 4
+
+#define DEFAULT_MIXER_DEVICE_KEY "/desktop/gnome/sound/default_mixer_device"
+#define DEFAULT_MIXER_TRACKS_KEY "/desktop/gnome/sound/default_mixer_tracks"
+
+#define ACME_VOLUME_GSTREAMER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ACME_TYPE_VOLUME_GSTREAMER, AcmeVolumeGStreamerPrivate))
+
+struct AcmeVolumeGStreamerPrivate
+{
+ GstMixer *mixer;
+ GList *mixer_tracks;
+ guint timer_id;
+ gdouble volume;
+ gboolean mute;
+ GConfClient *gconf_client;
+};
+
+G_DEFINE_TYPE (AcmeVolumeGStreamer, acme_volume_gstreamer, ACME_TYPE_VOLUME)
+
+static int acme_volume_gstreamer_get_volume (AcmeVolume *self);
+static void acme_volume_gstreamer_set_volume (AcmeVolume *self, int val);
+static gboolean acme_volume_gstreamer_open (AcmeVolumeGStreamer *self);
+static void acme_volume_gstreamer_close (AcmeVolumeGStreamer *self);
+static gboolean acme_volume_gstreamer_close_real (AcmeVolumeGStreamer *self);
+
+static void
+acme_volume_gstreamer_finalize (GObject *object)
+{
+ AcmeVolumeGStreamer *self;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (ACME_IS_VOLUME_GSTREAMER (object));
+
+ self = ACME_VOLUME_GSTREAMER (object);
+
+ if (self->_priv->timer_id != 0)
+ {
+ g_source_remove (self->_priv->timer_id);
+ self->_priv->timer_id = 0;
+ }
+ acme_volume_gstreamer_close_real (self);
+
+ if (self->_priv->gconf_client != NULL) {
+ g_object_unref (self->_priv->gconf_client);
+ self->_priv->gconf_client = NULL;
+ }
+
+ G_OBJECT_CLASS (acme_volume_gstreamer_parent_class)->finalize (object);
+}
+
+static void
+acme_volume_gstreamer_set_mute (AcmeVolume *vol, gboolean val)
+{
+ AcmeVolumeGStreamer *self = (AcmeVolumeGStreamer *) vol;
+ GList *t;
+
+ if (acme_volume_gstreamer_open (self) == FALSE)
+ return;
+
+ for (t = self->_priv->mixer_tracks; t != NULL; t = t->next)
+ {
+ GstMixerTrack *track = GST_MIXER_TRACK (t->data);
+ gst_mixer_set_mute (self->_priv->mixer, track, val);
+ }
+
+ if (val)
+ {
+ self->_priv->mute = TRUE;
+ } else {
+ self->_priv->mute = FALSE;
+
+ for (t = self->_priv->mixer_tracks; t != NULL; t = t->next)
+ {
+ GstMixerTrack *track = GST_MIXER_TRACK (t->data);
+ gint *volumes, n;
+ gdouble scale = (track->max_volume - track->min_volume) / 100.0;
+ gint vol = (gint) (self->_priv->volume * scale + track->min_volume + 0.5);
+
+ volumes = g_new (gint, track->num_channels);
+ for (n = 0; n < track->num_channels; n++)
+ volumes[n] = vol;
+ gst_mixer_set_volume (self->_priv->mixer, track, volumes);
+ g_free (volumes);
+ }
+ }
+
+ acme_volume_gstreamer_close (self);
+}
+
+static void
+update_state (AcmeVolumeGStreamer * self)
+{
+ gint *volumes, n;
+ gdouble vol = 0;
+ GstMixerTrack *track = GST_MIXER_TRACK (self->_priv->mixer_tracks->data);
+
+ /* update mixer by getting volume */
+ volumes = g_new0 (gint, track->num_channels);
+ gst_mixer_get_volume (self->_priv->mixer, track, volumes);
+ for (n = 0; n < track->num_channels; n++)
+ vol += volumes[n];
+ g_free (volumes);
+ vol /= track->num_channels;
+ vol = 100 * vol / (track->max_volume - track->min_volume);
+
+ /* update mute flag, and volume if not muted */
+ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE))
+ self->_priv->mute = TRUE;
+ else
+ self->_priv->volume = vol;
+}
+
+static gboolean
+acme_volume_gstreamer_get_mute (AcmeVolume *vol)
+{
+ AcmeVolumeGStreamer *self = (AcmeVolumeGStreamer *) vol;
+
+ if (acme_volume_gstreamer_open (self) == FALSE)
+ return FALSE;
+
+ update_state (self);
+ acme_volume_gstreamer_close (self);
+
+ return self->_priv->mute;
+}
+
+static int
+acme_volume_gstreamer_get_volume (AcmeVolume *vol)
+{
+ AcmeVolumeGStreamer *self = (AcmeVolumeGStreamer *) vol;
+
+ if (acme_volume_gstreamer_open (self) == FALSE)
+ return 0;
+
+ update_state (self);
+
+ acme_volume_gstreamer_close (self);
+
+ return (gint) (self->_priv->volume + 0.5);
+}
+
+static void
+acme_volume_gstreamer_set_volume (AcmeVolume *vol, int val)
+{
+ AcmeVolumeGStreamer *self = (AcmeVolumeGStreamer *) vol;
+ GList *t;
+
+ if (acme_volume_gstreamer_open (self) == FALSE)
+ return;
+
+ val = CLAMP (val, 0, 100);
+
+ for (t = self->_priv->mixer_tracks; t != NULL; t = t->next)
+ {
+ GstMixerTrack *track = GST_MIXER_TRACK (t->data);
+ gint *volumes, n;
+ gdouble scale = (track->max_volume - track->min_volume) / 100.0;
+ gint vol = (gint) (val * scale + track->min_volume + 0.5);
+
+ volumes = g_new (gint, track->num_channels);
+ for (n = 0; n < track->num_channels; n++)
+ volumes[n] = vol;
+ gst_mixer_set_volume (self->_priv->mixer, track, volumes);
+ g_free (volumes);
+ }
+
+ /* update state */
+ self->_priv->volume = val;
+
+ acme_volume_gstreamer_close (self);
+}
+
+static int
+acme_volume_gstreamer_get_threshold (AcmeVolume *vol)
+{
+ AcmeVolumeGStreamer *self = (AcmeVolumeGStreamer *) vol;
+ GList *t;
+ int steps = 101;
+
+ if (acme_volume_gstreamer_open (self) == FALSE)
+ return 1;
+
+ for (t = self->_priv->mixer_tracks; t != NULL; t = t->next)
+ {
+ GstMixerTrack *track = GST_MIXER_TRACK (t->data);
+ int track_steps = track->max_volume - track->min_volume;
+ if (track_steps > 0 && track_steps < steps)
+ steps = track_steps;
+ }
+
+ acme_volume_gstreamer_close (self);
+
+ return 100 / steps + 1;
+}
+
+static gboolean
+acme_volume_gstreamer_close_real (AcmeVolumeGStreamer *self)
+{
+ if (self->_priv->mixer != NULL)
+ {
+ gst_element_set_state (GST_ELEMENT (self->_priv->mixer), GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (self->_priv->mixer));
+ g_list_foreach (self->_priv->mixer_tracks, (GFunc) g_object_unref, NULL);
+ g_list_free (self->_priv->mixer_tracks);
+ self->_priv->mixer = NULL;
+ self->_priv->mixer_tracks = NULL;
+ }
+
+ self->_priv->timer_id = 0;
+ return FALSE;
+}
+
+/*
+ * _acme_set_mixer
+ * Arguments: mixer - pointer to mixer element
+ * data - pointer to user data (AcmeVolumeGStreamer to be modified)
+ * Returns: gboolean indicating success
+ */
+static gboolean
+_acme_set_mixer(GstMixer *mixer, gpointer user_data)
+{
+ const GList *tracks;
+
+ tracks = gst_mixer_list_tracks (mixer);
+
+ while (tracks != NULL) {
+ GstMixerTrack *track = GST_MIXER_TRACK (tracks->data);
+
+ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MASTER)) {
+ AcmeVolumeGStreamer *self;
+
+ self = ACME_VOLUME_GSTREAMER (user_data);
+
+ self->_priv->mixer = mixer;
+ self->_priv->mixer_tracks = g_list_append (self->_priv->mixer_tracks, g_object_ref (track));
+ return TRUE;
+ }
+
+ tracks = tracks->next;
+ }
+
+ return FALSE;
+}
+
+/* This is a modified version of code from gnome-media's gst-mixer */
+static gboolean
+acme_volume_gstreamer_open (AcmeVolumeGStreamer *vol)
+{
+ AcmeVolumeGStreamer *self = (AcmeVolumeGStreamer *) vol;
+ gchar *mixer_device, **factory_and_device = NULL;
+ GList *mixer_list;
+
+ if (self->_priv->timer_id != 0)
+ {
+ g_source_remove (self->_priv->timer_id);
+ self->_priv->timer_id = 0;
+ return TRUE;
+ }
+
+ mixer_device = gconf_client_get_string (self->_priv->gconf_client, DEFAULT_MIXER_DEVICE_KEY, NULL);
+ if (mixer_device != NULL)
+ {
+ factory_and_device = g_strsplit (mixer_device, ":", 2);
+ }
+
+ if (factory_and_device != NULL && factory_and_device[0] != NULL)
+ {
+ GstElement *element;
+
+ element = gst_element_factory_make (factory_and_device[0], NULL);
+
+ if (element != NULL) {
+ if (factory_and_device[1] != NULL &&
+ g_object_class_find_property (G_OBJECT_GET_CLASS (element), "device"))
+ {
+ g_object_set (G_OBJECT (element), "device", factory_and_device[1], NULL);
+ }
+
+ gst_element_set_state (element, GST_STATE_READY);
+
+ if (GST_IS_MIXER (element)) {
+ self->_priv->mixer = GST_MIXER (element);
+ } else {
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+ }
+ }
+ }
+
+ g_free (mixer_device);
+ g_strfreev (factory_and_device);
+
+ if (self->_priv->mixer != NULL)
+ {
+ const GList *m;
+ GSList *tracks, *t;
+
+ /* Try to use tracks saved in GConf */
+ tracks = gconf_client_get_list (self->_priv->gconf_client, DEFAULT_MIXER_TRACKS_KEY, GCONF_VALUE_STRING, NULL);
+
+ for (m = gst_mixer_list_tracks (self->_priv->mixer); m != NULL; m = m->next)
+ {
+ GstMixerTrack *track = GST_MIXER_TRACK (m->data);
+
+ for (t = tracks; t != NULL; t = t->next)
+ {
+ if (!strcmp (t->data, track->label))
+ {
+ self->_priv->mixer_tracks = g_list_append (self->_priv->mixer_tracks, g_object_ref (track));
+ }
+ }
+
+ }
+
+ g_slist_foreach (tracks, (GFunc)g_free, NULL);
+ g_slist_free (tracks);
+
+ /* If no track stored in GConf is avaiable try to use master track */
+ if (self->_priv->mixer_tracks == NULL)
+ {
+ for (m = gst_mixer_list_tracks (self->_priv->mixer); m != NULL; m = m->next)
+ {
+ GstMixerTrack *track = GST_MIXER_TRACK (m->data);
+
+ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MASTER)) {
+ self->_priv->mixer_tracks = g_list_append (self->_priv->mixer_tracks, g_object_ref (track));
+ break;
+ }
+ }
+ }
+ }
+
+ if (self->_priv->mixer != NULL)
+ {
+ if (self->_priv->mixer_tracks != NULL)
+ {
+ return TRUE;
+ } else {
+ gst_element_set_state (GST_ELEMENT (self->_priv->mixer), GST_STATE_NULL);
+ gst_object_unref (self->_priv->mixer);
+ }
+ }
+
+ /* Go through all elements of a certain class and check whether
+ * they implement a mixer. If so, walk through the tracks and look
+ * for first one named "volume".
+ *
+ * We should probably do something intelligent if we don't find an
+ * appropriate mixer/track. But now we do something stupid...
+ * everything just becomes a no-op.
+ */
+ mixer_list = gst_audio_default_registry_mixer_filter (_acme_set_mixer,
+ TRUE,
+ self);
+
+ if (mixer_list == NULL)
+ return FALSE;
+
+ /* do not unref the mixer as we keep the ref for self->priv->mixer */
+ g_list_free (mixer_list);
+
+ return TRUE;
+}
+
+static void
+acme_volume_gstreamer_close (AcmeVolumeGStreamer *self)
+{
+ self->_priv->timer_id = g_timeout_add_seconds (TIMEOUT,
+ (GSourceFunc) acme_volume_gstreamer_close_real, self);
+}
+
+static void
+acme_volume_gstreamer_init (AcmeVolumeGStreamer *self)
+{
+ self->_priv = ACME_VOLUME_GSTREAMER_GET_PRIVATE (self);
+ self->_priv->gconf_client = gconf_client_get_default ();
+}
+
+static void
+acme_volume_gstreamer_class_init (AcmeVolumeGStreamerClass *klass)
+{
+ AcmeVolumeClass *volume_class = ACME_VOLUME_CLASS (klass);
+ G_OBJECT_CLASS (klass)->finalize = acme_volume_gstreamer_finalize;
+
+ gst_init (NULL, NULL);
+
+ volume_class->set_volume = acme_volume_gstreamer_set_volume;
+ volume_class->get_volume = acme_volume_gstreamer_get_volume;
+ volume_class->set_mute = acme_volume_gstreamer_set_mute;
+ volume_class->get_mute = acme_volume_gstreamer_get_mute;
+ volume_class->get_threshold = acme_volume_gstreamer_get_threshold;
+
+ g_type_class_add_private (klass, sizeof (AcmeVolumeGStreamerPrivate));
+}
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-gstreamer.h gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-gstreamer.h
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-gstreamer.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-gstreamer.h 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,48 @@
+/* acme-volume-gstreamer.h
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+ Copyright (C) 2004 Novell, Inc.
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ Jon Trowbridge <trow@ximian.com>
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include "acme-volume.h"
+
+#define ACME_TYPE_VOLUME_GSTREAMER (acme_volume_gstreamer_get_type ())
+#define ACME_VOLUME_GSTREAMER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ACME_TYPE_VOLUME_GSTREAMER, AcmeVolumeGStreamer))
+#define ACME_VOLUME_GSTREAMER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ACME_TYPE_VOLUME_GSTREAMER, AcmeVolumeGStreamerClass))
+#define ACME_IS_VOLUME_GSTREAMER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ACME_TYPE_VOLUME_GSTREAMER))
+#define ACME_VOLUME_GSTREAMER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ACME_TYPE_VOLUME_GSTREAMER, AcmeVolumeGStreamerClass))
+
+typedef struct AcmeVolumeGStreamer AcmeVolumeGStreamer;
+typedef struct AcmeVolumeGStreamerClass AcmeVolumeGStreamerClass;
+typedef struct AcmeVolumeGStreamerPrivate AcmeVolumeGStreamerPrivate;
+
+struct AcmeVolumeGStreamer {
+ AcmeVolume parent;
+ AcmeVolumeGStreamerPrivate *_priv;
+};
+
+struct AcmeVolumeGStreamerClass {
+ AcmeVolumeClass parent;
+};
+
+GType acme_volume_gstreamer_get_type (void);
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume.h gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume.h
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume.h 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,63 @@
+/* acme-volume.h
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#ifndef _ACME_VOLUME_H
+#define _ACME_VOLUME_H
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define ACME_TYPE_VOLUME (acme_volume_get_type ())
+#define ACME_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ACME_TYPE_VOLUME, AcmeVolume))
+#define ACME_VOLUME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ACME_TYPE_VOLUME, AcmeVolumeClass))
+#define ACME_IS_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ACME_TYPE_VOLUME))
+#define ACME_VOLUME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ACME_TYPE_VOLUME, AcmeVolumeClass))
+
+typedef struct {
+ GObject parent;
+} AcmeVolume;
+
+typedef struct {
+ GObjectClass parent;
+
+ void (* set_volume) (AcmeVolume *self, int val);
+ int (* get_volume) (AcmeVolume *self);
+ void (* set_mute) (AcmeVolume *self, gboolean val);
+ int (* get_mute) (AcmeVolume *self);
+ int (* get_threshold) (AcmeVolume *self);
+} AcmeVolumeClass;
+
+GType acme_volume_get_type (void);
+int acme_volume_get_volume (AcmeVolume *self);
+void acme_volume_set_volume (AcmeVolume *self, int val);
+gboolean acme_volume_get_mute (AcmeVolume *self);
+void acme_volume_set_mute (AcmeVolume *self,
+ gboolean val);
+void acme_volume_mute_toggle (AcmeVolume *self);
+int acme_volume_get_threshold (AcmeVolume *self);
+AcmeVolume *acme_volume_new (void);
+
+G_END_DECLS
+
+#endif /* _ACME_VOLUME_H */
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-oss.c gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-oss.c
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-oss.c 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-oss.c 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,215 @@
+/* acme-volume-oss.c
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#include "config.h"
+#include "acme-volume-oss.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#ifdef __NetBSD__
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <soundcard.h>
+#else
+#include <sys/soundcard.h>
+#endif /* __NetBSD__ */
+
+struct AcmeVolumeOssPrivate
+{
+ gboolean use_pcm;
+ gboolean mixerpb;
+ int volume;
+ int saved_volume;
+ gboolean pcm_avail;
+ gboolean mute;
+};
+
+static int acme_volume_oss_get_volume (AcmeVolume *self);
+static void acme_volume_oss_set_volume (AcmeVolume *self, int val);
+static gboolean acme_volume_oss_mixer_check (AcmeVolumeOss *self, int fd);
+
+G_DEFINE_TYPE (AcmeVolumeOss, acme_volume_oss, ACME_TYPE_VOLUME)
+
+static void
+acme_volume_oss_finalize (GObject *object)
+{
+ AcmeVolumeOss *self;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (ACME_IS_VOLUME_OSS (object));
+
+ self = ACME_VOLUME_OSS (object);
+
+ g_return_if_fail (self->_priv != NULL);
+ g_free (self->_priv);
+
+ G_OBJECT_CLASS (acme_volume_oss_parent_class)->finalize (object);
+}
+
+static int
+acme_volume_oss_vol_check (int volume)
+{
+ return CLAMP (volume, 0, 100);
+}
+
+static void
+acme_volume_oss_set_mute (AcmeVolume *vol, gboolean val)
+{
+ AcmeVolumeOss *self = (AcmeVolumeOss *) vol;
+
+ if (self->_priv->mute == FALSE)
+ {
+ self->_priv->saved_volume =
+ acme_volume_oss_get_volume (vol);
+ acme_volume_oss_set_volume (vol, 0);
+ self->_priv->mute = TRUE;
+ } else {
+ acme_volume_oss_set_volume (vol, self->_priv->saved_volume);
+ self->_priv->mute = FALSE;
+ }
+}
+
+static gboolean
+acme_volume_oss_get_mute (AcmeVolume *vol)
+{
+ AcmeVolumeOss *self = (AcmeVolumeOss *) vol;
+
+ /* somebody else might have changed the volume */
+ if ((self->_priv->mute == TRUE) && (self->_priv->volume != 0))
+ {
+ self->_priv->mute = FALSE;
+ }
+
+ return self->_priv->mute;
+}
+
+static int
+acme_volume_oss_get_volume (AcmeVolume *vol)
+{
+ gint volume, r, l, fd;
+ AcmeVolumeOss *self = (AcmeVolumeOss *) vol;
+
+ fd = open ("/dev/mixer", O_RDONLY);
+ if (acme_volume_oss_mixer_check(self, fd) == FALSE)
+ {
+ volume = 0;
+ } else {
+ if (self->_priv->use_pcm && self->_priv->pcm_avail)
+ ioctl (fd, MIXER_READ (SOUND_MIXER_PCM), &volume);
+ else
+ ioctl (fd, MIXER_READ (SOUND_MIXER_VOLUME), &volume);
+ close (fd);
+
+ r = (volume & 0xff);
+ l = (volume & 0xff00) >> 8;
+ volume = (r + l) / 2;
+ volume = acme_volume_oss_vol_check (volume);
+ }
+
+ return volume;
+}
+
+static void
+acme_volume_oss_set_volume (AcmeVolume *vol, int val)
+{
+ int fd, tvol, volume;
+ AcmeVolumeOss *self = (AcmeVolumeOss *) vol;
+
+ volume = acme_volume_oss_vol_check (val);
+
+ fd = open ("/dev/mixer", O_RDONLY);
+ if (acme_volume_oss_mixer_check (self, fd) == FALSE)
+ {
+ return;
+ } else {
+ tvol = (volume << 8) + volume;
+ if (self->_priv->use_pcm && self->_priv->pcm_avail)
+ ioctl (fd, MIXER_WRITE (SOUND_MIXER_PCM), &tvol);
+ else
+ ioctl (fd, MIXER_WRITE (SOUND_MIXER_VOLUME), &tvol);
+ close (fd);
+ self->_priv->volume = volume;
+ }
+}
+
+static int
+acme_volume_oss_get_threshold (AcmeVolume *vol)
+{
+ return 1;
+}
+
+static void
+acme_volume_oss_init (AcmeVolumeOss *self)
+{
+ int fd;
+
+ self->_priv = g_new0 (AcmeVolumeOssPrivate, 1);
+
+ fd = open ("/dev/mixer", O_RDONLY);
+ if (acme_volume_oss_mixer_check(self, fd) == FALSE)
+ {
+ self->_priv->pcm_avail = FALSE;
+ } else {
+ int mask = 0;
+
+ ioctl (fd, SOUND_MIXER_READ_DEVMASK, &mask);
+ if (mask & ( 1 << SOUND_MIXER_PCM))
+ self->_priv->pcm_avail = TRUE;
+ else
+ self->_priv->pcm_avail = FALSE;
+ if (!(mask & ( 1 << SOUND_MIXER_VOLUME)))
+ self->_priv->use_pcm = TRUE;
+
+ close (fd);
+ }
+}
+
+static void
+acme_volume_oss_class_init (AcmeVolumeOssClass *klass)
+{
+ AcmeVolumeClass *volume_class = ACME_VOLUME_CLASS (klass);
+ G_OBJECT_CLASS (klass)->finalize = acme_volume_oss_finalize;
+
+ volume_class->set_volume = acme_volume_oss_set_volume;
+ volume_class->get_volume = acme_volume_oss_get_volume;
+ volume_class->set_mute = acme_volume_oss_set_mute;
+ volume_class->get_mute = acme_volume_oss_get_mute;
+ volume_class->get_threshold = acme_volume_oss_get_threshold;
+}
+
+static gboolean
+acme_volume_oss_mixer_check (AcmeVolumeOss *self, int fd)
+{
+ gboolean retval;
+
+ if (fd <0) {
+ if (self->_priv->mixerpb == FALSE) {
+ self->_priv->mixerpb = TRUE;
+ //FIXME
+ //volume_oss_fd_problem(self);
+ }
+ }
+ retval = (!self->_priv->mixerpb);
+ return retval;
+}
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-oss.h gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-oss.h
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/acme-volume-oss.h 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/acme-volume-oss.h 2009-02-11 14:47:35.000000000 +0100
@@ -0,0 +1,47 @@
+/* acme-volume-oss.h
+
+ Copyright (C) 2002, 2003 Bastien Nocera
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Bastien Nocera <hadess@hadess.net>
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include "acme-volume.h"
+
+#define ACME_TYPE_VOLUME_OSS (acme_volume_get_type ())
+#define ACME_VOLUME_OSS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ACME_TYPE_VOLUME_OSS, AcmeVolumeOss))
+#define ACME_VOLUME_OSS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ACME_TYPE_VOLUME_OSS, AcmeVolumeOssClass))
+#define ACME_IS_VOLUME_OSS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ACME_TYPE_VOLUME_OSS))
+#define ACME_VOLUME_OSS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ACME_TYPE_VOLUME_OSS, AcmeVolumeOssClass))
+
+typedef struct AcmeVolumeOss AcmeVolumeOss;
+typedef struct AcmeVolumeOssClass AcmeVolumeOssClass;
+typedef struct AcmeVolumeOssPrivate AcmeVolumeOssPrivate;
+
+struct AcmeVolumeOss {
+ AcmeVolume parent;
+ AcmeVolumeOssPrivate *_priv;
+};
+
+struct AcmeVolumeOssClass {
+ AcmeVolumeClass parent;
+};
+
+GType acme_volume_oss_get_type (void);
+
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/actions/Makefile.am gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/Makefile.am
--- gnome-settings-daemon-2.25.90/plugins/media-keys/actions/Makefile.am 1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/actions/Makefile.am 2009-02-11 14:48:08.000000000 +0100
@@ -0,0 +1,72 @@
+NULL =
+
+noinst_LTLIBRARIES = libacme.la
+
+libacme_la_SOURCES = \
+ acme.h \
+ acme-volume.c \
+ acme-volume.h \
+ acme-volume-dummy.c \
+ acme-volume-dummy.h \
+ $(NULL)
+
+libacme_la_CPPFLAGS = \
+ -I$(top_srcdir)/gnome-settings-daemon \
+ -I$(top_srcdir)/plugins/common \
+ -DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
+ $(AM_CPPFLAGS)
+
+libacme_la_CFLAGS = \
+ $(SETTINGS_PLUGIN_CFLAGS) \
+ $(GST_CFLAGS) \
+ $(AM_CFLAGS)
+
+libacme_la_LIBADD = \
+ $(NULL)
+
+if HAVE_GSTREAMER
+libacme_la_SOURCES += \
+ acme-volume-gstreamer.c \
+ acme-volume-gstreamer.h \
+ $(NULL)
+
+libacme_la_CPPFLAGS += -DHAVE_GSTREAMER
+
+libacme_la_LIBADD += $(GST_LIBS)
+
+else # HAVE_GSTREAMER
+
+if HAVE_ALSA
+libacme_la_SOURCES += \
+ acme-volume-alsa.c \
+ acme-volume-alsa.h \
+ $(NULL)
+
+libacme_la_CPPFLAGS += -DHAVE_ALSA
+
+libacme_la_LIBADD += $(ALSA_LIBS)
+
+else # HAVE_ALSA
+
+if HAVE_OSS
+libacme_la_SOURCES += \
+ acme-volume-oss.c \
+ acme-volume-oss.h \
+ $(NULL)
+
+libacme_la_CPPFLAGS += -DHAVE_OSS
+
+libacme_la_SOURCES += $(OSS_SOURCES)
+
+endif # HAVE_OSS
+endif # HAVE_ALSA
+endif # HAVE_GSTREAMER
+
+gladedir = $(pkgdatadir)
+glade_DATA = \
+ acme.glade \
+ $(NULL)
+
+EXTRA_DIST = \
+ $(glade_DATA) \
+ $(NULL)
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/gsd-media-keys-manager.c gnome-settings-daemon-2.25.90.new/plugins/media-keys/gsd-media-keys-manager.c
--- gnome-settings-daemon-2.25.90/plugins/media-keys/gsd-media-keys-manager.c 2009-02-04 22:33:14.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/gsd-media-keys-manager.c 2009-02-11 14:47:35.000000000 +0100
@@ -47,20 +47,16 @@
#include "gsd-media-keys-manager-glue.h"
#include "eggaccelerators.h"
-#include "acme.h"
+#include "actions/acme.h"
+#include "actions/acme-volume.h"
#include "gsd-media-keys-window.h"
-#ifdef HAVE_PULSE
-#include "gvc-mixer-control.h"
-#endif /* HAVE_PULSE */
-
#define GSD_DBUS_PATH "/org/gnome/SettingsDaemon"
#define GSD_DBUS_NAME "org.gnome.SettingsDaemon"
#define GSD_MEDIA_KEYS_DBUS_PATH GSD_DBUS_PATH "/MediaKeys"
#define GSD_MEDIA_KEYS_DBUS_NAME GSD_DBUS_NAME ".MediaKeys"
#define VOLUME_STEP 6 /* percents for one volume button press */
-#define MAX_VOLUME 65536.0
#if defined(__OpenBSD__)
# define EJECT_COMMAND "eject -t /dev/cd0"
@@ -83,14 +79,7 @@
struct GsdMediaKeysManagerPrivate
{
-#ifdef HAVE_PULSE
- /* Volume bits */
- GvcMixerControl *volume;
- GvcMixerStream *stream;
- /* Number of expected update signals, zero meaning we
- * shouldn't be showing any update dialogues */
- guint num_expected_update_signals;
-#endif /* HAVE_PULSE */
+ AcmeVolume *volume;
GtkWidget *dialog;
GConfClient *conf_client;
@@ -614,159 +603,76 @@
g_free (command);
}
-#ifdef HAVE_PULSE
-static void
-update_dialog (GsdMediaKeysManager *manager)
-{
- gboolean muted;
- guint vol;
-
- /* Not expecting a dialogue to show up */
- if (manager->priv->num_expected_update_signals == 0)
- return;
-
- /* If we aren't expecting any more updates, show the dialogue */
- manager->priv->num_expected_update_signals--;
- if (manager->priv->num_expected_update_signals != 0)
- return;
-
- vol = gvc_mixer_stream_get_volume (manager->priv->stream);
- muted = gvc_mixer_stream_get_is_muted (manager->priv->stream);
-
- dialog_init (manager);
- gsd_media_keys_window_set_volume_muted (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
- muted);
- gsd_media_keys_window_set_volume_level (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
- (int) (100 * (double)vol / PA_VOLUME_NORM));
- gsd_media_keys_window_set_action (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
- GSD_MEDIA_KEYS_WINDOW_ACTION_VOLUME);
- dialog_show (manager);
-}
-
-static void
-on_stream_event_notify (GObject *object,
- GParamSpec *pspec,
- GsdMediaKeysManager *manager)
-{
- update_dialog (manager);
-}
-
static void
do_sound_action (GsdMediaKeysManager *manager,
int type)
{
gboolean muted;
- guint vol, norm_vol_step;
- int vol_step;
+ int vol;
+ int vol_step;
+ GError *error = NULL;
- if (manager->priv->stream == NULL)
+ if (manager->priv->volume == NULL) {
return;
+ }
vol_step = gconf_client_get_int (manager->priv->conf_client,
GCONF_MISC_DIR "/volume_step",
- NULL);
+ &error);
- if (vol_step <= 0 || vol_step > 100)
+ if (error) {
vol_step = VOLUME_STEP;
+ g_error_free (error);
+ }
- norm_vol_step = PA_VOLUME_NORM * vol_step / 100;
+ if (vol_step > 0) {
+ int threshold = acme_volume_get_threshold (manager->priv->volume);
+ if (vol_step < threshold)
+ vol_step = threshold;
+ g_debug ("Using volume step of %d", vol_step);
+ }
/* FIXME: this is racy */
- vol = gvc_mixer_stream_get_volume (manager->priv->stream);
- muted = gvc_mixer_stream_get_is_muted (manager->priv->stream);
- /* By default, we would be showing a dialogue
- * based on the current values, eg. an unchanged dialogue */
- manager->priv->num_expected_update_signals = 0;
+ vol = acme_volume_get_volume (manager->priv->volume);
+ muted = acme_volume_get_mute (manager->priv->volume);
switch (type) {
case MUTE_KEY:
- manager->priv->num_expected_update_signals = 1;
- gvc_mixer_stream_change_is_muted (manager->priv->stream, !muted);
+ acme_volume_mute_toggle (manager->priv->volume);
break;
case VOLUME_DOWN_KEY:
- if (!muted && (vol <= norm_vol_step)) {
- manager->priv->num_expected_update_signals = 2;
- gvc_mixer_stream_change_is_muted (manager->priv->stream, !muted);
- gvc_mixer_stream_change_volume (manager->priv->stream, 0);
- } else if (!muted) {
- manager->priv->num_expected_update_signals = 1;
- gvc_mixer_stream_change_volume (manager->priv->stream, vol - norm_vol_step);
+ if (!muted && (vol <= vol_step)) {
+ acme_volume_mute_toggle (manager->priv->volume);
}
+ acme_volume_set_volume (manager->priv->volume, vol - vol_step);
break;
case VOLUME_UP_KEY:
if (muted) {
if (vol == 0) {
- manager->priv->num_expected_update_signals = 2;
- gvc_mixer_stream_change_volume (manager->priv->stream, vol + norm_vol_step);
- gvc_mixer_stream_change_is_muted (manager->priv->stream, !muted);
- } else {
- manager->priv->num_expected_update_signals = 1;
- gvc_mixer_stream_change_is_muted (manager->priv->stream, !muted);
+ acme_volume_set_volume (manager->priv->volume, vol + vol_step);
}
+ acme_volume_mute_toggle (manager->priv->volume);
} else {
- if (vol < MAX_VOLUME) {
- manager->priv->num_expected_update_signals = 1;
- if (vol + norm_vol_step >= MAX_VOLUME) {
- gvc_mixer_stream_change_volume (manager->priv->stream, MAX_VOLUME);
- } else {
- gvc_mixer_stream_change_volume (manager->priv->stream, vol + norm_vol_step);
- }
- }
+ acme_volume_set_volume (manager->priv->volume, vol + vol_step);
}
break;
}
- /* We didn't actually make any changes, so force showing the dialogue */
- if (manager->priv->num_expected_update_signals == 0) {
- manager->priv->num_expected_update_signals = 1;
- update_dialog (manager);
- }
-}
-
-static void
-update_default_sink (GsdMediaKeysManager *manager)
-{
- GvcMixerStream *stream;
-
- stream = gvc_mixer_control_get_default_sink (manager->priv->volume);
- if (stream == manager->priv->stream)
- return;
-
- if (manager->priv->stream != NULL) {
- g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->stream),
- G_CALLBACK (on_stream_event_notify), manager);
- g_object_unref (manager->priv->stream);
- manager->priv->stream = NULL;
- }
-
- if (stream != NULL) {
- manager->priv->stream = stream;
- g_signal_connect (G_OBJECT (manager->priv->stream), "notify::volume",
- G_CALLBACK (on_stream_event_notify), manager);
- g_signal_connect (G_OBJECT (manager->priv->stream), "notify::is-muted",
- G_CALLBACK (on_stream_event_notify), manager);
- } else {
- g_warning ("Unable to get default sink");
- }
-}
-
-static void
-on_control_ready (GvcMixerControl *control,
- GsdMediaKeysManager *manager)
-{
- update_default_sink (manager);
-}
+ muted = acme_volume_get_mute (manager->priv->volume);
+ vol = acme_volume_get_volume (manager->priv->volume);
-static void
-on_control_default_sink_changed (GvcMixerControl *control,
- guint id,
- GsdMediaKeysManager *manager)
-{
- update_default_sink (manager);
+ /* FIXME: AcmeVolume should probably emit signals
+ instead of doing it like this */
+ dialog_init (manager);
+ gsd_media_keys_window_set_volume_muted (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
+ muted);
+ gsd_media_keys_window_set_volume_level (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
+ vol);
+ gsd_media_keys_window_set_action (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
+ GSD_MEDIA_KEYS_WINDOW_ACTION_VOLUME);
+ dialog_show (manager);
}
-#endif /* HAVE_PULSE */
-
static gint
find_by_application (gconstpointer a,
gconstpointer b)
@@ -887,9 +793,7 @@
case MUTE_KEY:
case VOLUME_DOWN_KEY:
case VOLUME_UP_KEY:
-#ifdef HAVE_PULSE
do_sound_action (manager, type);
-#endif /* HAVE_PULSE */
break;
case POWER_KEY:
do_exit_action (manager);
@@ -1069,30 +973,16 @@
{
gnome_settings_profile_start (NULL);
-#ifdef HAVE_PULSE
/* initialise Volume handler
*
* We do this one here to force checking gstreamer cache, etc.
* The rest (grabbing and setting the keys) can happen in an
* idle.
*/
- gnome_settings_profile_start ("gvc_mixer_control_new");
-
- manager->priv->volume = gvc_mixer_control_new ();
-
- g_signal_connect (manager->priv->volume,
- "ready",
- G_CALLBACK (on_control_ready),
- manager);
- g_signal_connect (manager->priv->volume,
- "default-sink-changed",
- G_CALLBACK (on_control_default_sink_changed),
- manager);
+ gnome_settings_profile_start ("acme_volume_new");
+ manager->priv->volume = acme_volume_new ();
+ gnome_settings_profile_end ("acme_volume_new");
- gvc_mixer_control_open (manager->priv->volume);
-
- gnome_settings_profile_end ("gvc_mixer_control_new");
-#endif /* HAVE_PULSE */
g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager);
gnome_settings_profile_end (NULL);
@@ -1159,17 +1049,10 @@
g_slist_free (priv->screens);
priv->screens = NULL;
-#ifdef HAVE_PULSE
- if (priv->stream) {
- g_object_unref (priv->stream);
- priv->stream = NULL;
- }
-
if (priv->volume) {
g_object_unref (priv->volume);
priv->volume = NULL;
}
-#endif /* HAVE_PULSE */
if (priv->dialog != NULL) {
gtk_widget_destroy (priv->dialog);
diff -Nur -x '*.orig' -x '*~' gnome-settings-daemon-2.25.90/plugins/media-keys/Makefile.am gnome-settings-daemon-2.25.90.new/plugins/media-keys/Makefile.am
--- gnome-settings-daemon-2.25.90/plugins/media-keys/Makefile.am 2009-02-04 22:33:14.000000000 +0100
+++ gnome-settings-daemon-2.25.90.new/plugins/media-keys/Makefile.am 2009-02-11 14:48:13.000000000 +0100
@@ -1,12 +1,9 @@
NULL =
-SUBDIRS =
-plugin_LTLIBRARIES =
+SUBDIRS = actions
-if HAVE_PULSE
-SUBDIRS += cut-n-paste
-plugin_LTLIBRARIES += libmedia-keys.la
-endif
+plugin_LTLIBRARIES = \
+ libmedia-keys.la
BUILT_SOURCES = \
gsd-media-keys-manager-glue.h \
@@ -32,14 +29,13 @@
gsd-media-keys-manager.c \
gsd-media-keys-window.h \
gsd-media-keys-window.c \
- acme.h \
$(BUILT_SOURCES) \
$(NULL)
libmedia_keys_la_CPPFLAGS = \
-I$(top_srcdir)/gnome-settings-daemon \
-I$(top_srcdir)/plugins/common \
- -I$(top_srcdir)/plugins/media-keys/cut-n-paste \
+ -I$(top_builddir)/plugins/media-keys/actions \
-DPIXMAPDIR=\""$(pkgdatadir)"\" \
-DGLADEDIR=\""$(pkgdatadir)"\" \
-DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
@@ -53,10 +49,11 @@
$(GSD_PLUGIN_LDFLAGS)
libmedia_keys_la_LIBADD = \
- $(top_builddir)/plugins/common/libcommon.la \
- $(top_builddir)/plugins/media-keys/cut-n-paste/libgvc.la \
- $(SETTINGS_PLUGIN_LIBS) \
- $(XF86MISC_LIBS)
+ $(top_builddir)/plugins/common/libcommon.la \
+ $(top_builddir)/plugins/media-keys/actions/libacme.la \
+ $(SETTINGS_PLUGIN_LIBS) \
+ $(XF86MISC_LIBS) \
+ $(GST_LIBS)
plugin_in_files = \
media-keys.gnome-settings-plugin.in
@@ -76,7 +73,7 @@
test_media_window_CPPFLAGS = \
-I$(top_srcdir)/gnome-settings-daemon \
- -I$(top_srcdir)/plugins/media-keys/cut-n-paste \
+ -I$(top_builddir)/plugins/media-keys/actions \
-DPIXMAPDIR=\""$(pkgdatadir)"\" \
-DGLADEDIR=\""$(pkgdatadir)"\" \
-DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
@@ -104,7 +101,7 @@
test_media_keys_CPPFLAGS = \
-I$(top_srcdir)/gnome-settings-daemon \
-I$(top_srcdir)/plugins/common \
- -I$(top_srcdir)/plugins/media-keys/cut-n-paste \
+ -I$(top_builddir)/plugins/media-keys/actions \
-DPIXMAPDIR=\""$(pkgdatadir)"\" \
-DGLADEDIR=\""$(pkgdatadir)"\" \
-DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
@@ -115,35 +112,24 @@
$(AM_CFLAGS)
test_media_keys_LDADD = \
- $(top_builddir)/gnome-settings-daemon/libgsd-profile.la \
- $(top_builddir)/plugins/common/libcommon.la \
+ $(top_builddir)/gnome-settings-daemon/libgsd-profile.la \
+ $(top_builddir)/plugins/common/libcommon.la \
+ $(top_builddir)/plugins/media-keys/actions/libacme.la \
$(SETTINGS_DAEMON_LIBS) \
$(SETTINGS_PLUGIN_LIBS) \
$(XF86MISC_LIBS) \
$(GST_LIBS)
-if HAVE_PULSE
-test_media_keys_LDADD += $(top_builddir)/plugins/media-keys/cut-n-paste/libgvc.la
-endif
-
-gladedir = $(pkgdatadir)
-glade_DATA = \
- acme.glade \
- $(NULL)
-
pixmapsdir = $(pkgdatadir)
pixmaps_DATA = \
acme-eject.png \
$(NULL)
-DIST_SUBDIRS = cut-n-paste
-
EXTRA_DIST = \
gsd-media-keys-manager.xml \
gsd-marshal.list \
- $(plugin_in_files) \
- $(glade_DATA) \
- $(pixmaps_DATA)
+ $(pixmaps_DATA) \
+ $(plugin_in_files)
CLEANFILES = \
$(BUILT_SOURCES) \
--- gnome-settings-daemon-2.26.0/plugins/media-keys/Makefile.am 2009-03-16 09:35:38.000000000 -0500
+++ gnome-settings-daemon-2.26.0/plugins/media-keys/Makefile.am 2009-04-03 02:36:09.743750000 -0500
@@ -62,9 +62,7 @@ libmedia_keys_la_LIBADD = \
plugin_in_files = \
media-keys.gnome-settings-plugin.in
-if HAVE_PULSE
plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin)
-endif
noinst_PROGRAMS = \
test-media-keys \