summaryrefslogtreecommitdiff
path: root/gnome-settings-daemon/actions/acme-volume-oss.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnome-settings-daemon/actions/acme-volume-oss.c')
-rw-r--r--gnome-settings-daemon/actions/acme-volume-oss.c213
1 files changed, 0 insertions, 213 deletions
diff --git a/gnome-settings-daemon/actions/acme-volume-oss.c b/gnome-settings-daemon/actions/acme-volume-oss.c
deleted file mode 100644
index 8c18c97ac..000000000
--- a/gnome-settings-daemon/actions/acme-volume-oss.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/* 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 GObjectClass *parent_class = NULL;
-
-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 (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 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;
-
- parent_class = g_type_class_peek_parent (klass);
-
- 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;
-}
-
-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;
-}
-