From a4246ff3a994d8ab64841f70b698917e39836bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 2 Apr 2008 20:18:58 +0000 Subject: Add initial support for OSSv4. Mixer still needs a bit more love, but even magic has its limits. Original commit message from CVS: * configure.ac: * sys/Makefile.am: * sys/oss4/Makefile.am: * sys/oss4/oss4-audio.c: * sys/oss4/oss4-audio.h: * sys/oss4/oss4-mixer-enum.c: * sys/oss4/oss4-mixer-enum.h: * sys/oss4/oss4-mixer-slider.c: * sys/oss4/oss4-mixer-slider.h: * sys/oss4/oss4-mixer-switch.c: * sys/oss4/oss4-mixer-switch.h: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-mixer.h: * sys/oss4/oss4-property-probe.c: * sys/oss4/oss4-property-probe.h: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-sink.h: * sys/oss4/oss4-soundcard.h: * sys/oss4/oss4-source.c: * sys/oss4/oss4-source.h: Add initial support for OSSv4. Mixer still needs a bit more love, but even magic has its limits. --- sys/oss4/oss4-mixer-switch.c | 169 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 sys/oss4/oss4-mixer-switch.c (limited to 'sys/oss4/oss4-mixer-switch.c') diff --git a/sys/oss4/oss4-mixer-switch.c b/sys/oss4/oss4-mixer-switch.c new file mode 100644 index 00000000..403abbc5 --- /dev/null +++ b/sys/oss4/oss4-mixer-switch.c @@ -0,0 +1,169 @@ +/* GStreamer OSS4 mixer on/off switch control + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * This 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. + * + * This 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 this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* A simple ON/OFF 'switch' in gnome-volume-control / GstMixer is represented + * by a GstMixerTrack with no channels. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#define NO_LEGACY_MIXER +#include "oss4-mixer-switch.h" +#include "oss4-soundcard.h" + +GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); +#define GST_CAT_DEFAULT oss4mixer_debug + +/* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ +G_DEFINE_TYPE (GstOss4MixerSwitch, gst_oss4_mixer_switch, GST_TYPE_MIXER_TRACK); + +static void +gst_oss4_mixer_switch_class_init (GstOss4MixerSwitchClass * klass) +{ + /* nothing to do here */ +} + +static void +gst_oss4_mixer_switch_init (GstOss4MixerSwitch * s) +{ + /* nothing to do here */ +} + +static GstMixerTrackFlags +gst_oss4_mixer_switch_get_switch_flag (GstMixerTrack * track) +{ + if ((track->flags & GST_MIXER_TRACK_INPUT)) { + return GST_MIXER_TRACK_RECORD; + } else if ((track->flags & GST_MIXER_TRACK_OUTPUT)) { + return GST_MIXER_TRACK_MUTE; + } else { + GST_ERROR_OBJECT (track, "switch neither input nor output track!?"); + } + return 0; +} + +gboolean +gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean enabled) +{ + GstMixerTrackFlags switch_flag; + GstMixerTrack *track; + int newval; + + track = GST_MIXER_TRACK (s); + switch_flag = gst_oss4_mixer_switch_get_switch_flag (track); + + newval = (enabled) ? 1 : 0; + + if (!!newval == !!(track->flags & switch_flag)) { + GST_LOG_OBJECT (s, "switch is already %d, doing nothing", newval); + return TRUE; + } + + if (!gst_oss4_mixer_set_control_val (s->mixer, s->mc, newval)) { + GST_WARNING_OBJECT (s, "could not set switch to %d", newval); + return FALSE; + } + + if (newval) { + track->flags |= switch_flag; + } else { + track->flags &= ~switch_flag; + } + + GST_LOG_OBJECT (s, "set switch to %d", newval); + + return TRUE; +} + +gboolean +gst_oss4_mixer_switch_get (GstOss4MixerSwitch * s, gboolean * enabled) +{ + GstMixerTrackFlags switch_flag; + GstMixerTrack *track; + int val = -1; + + track = GST_MIXER_TRACK (s); + switch_flag = gst_oss4_mixer_switch_get_switch_flag (track); + + if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &val) || val < 0) { + GST_WARNING_OBJECT (s, "could not get switch state"); + return FALSE; + } + + *enabled = (val != 0); + + if (!!val != !!(track->flags & switch_flag)) { + GST_INFO_OBJECT (s, "updating inconsistent switch state to %d", !!val); + if (*enabled) { + track->flags |= switch_flag; + } else { + track->flags &= ~switch_flag; + } + } + + + return TRUE; +} + +GstMixerTrack * +gst_oss4_mixer_switch_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc) +{ + GstOss4MixerSwitch *s; + GstMixerTrack *track; + int cur = -1; + + s = g_object_new (GST_TYPE_OSS4_MIXER_SWITCH, "untranslated-label", + mc->mixext.extname, NULL); + + s->mixer = mixer; + s->mc = mc; + + track = GST_MIXER_TRACK (s); + + /* caller will set track->label and track->flags */ + + track->num_channels = 0; + track->min_volume = 0; + track->max_volume = 0; + + if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &cur) || cur < 0) + return NULL; + + return track; +} + +/* This is called from the watch thread */ +void +gst_oss4_mixer_switch_process_change_unlocked (GstMixerTrack * track) +{ + GstOss4MixerSwitch *s = GST_OSS4_MIXER_SWITCH_CAST (track); + + if (!s->mc->changed) + return; + + if ((track->flags & GST_MIXER_TRACK_INPUT)) { + gst_mixer_record_toggled (GST_MIXER (s->mixer), track, !!s->mc->last_val); + } else { + gst_mixer_mute_toggled (GST_MIXER (s->mixer), track, !!s->mc->last_val); + } +} -- cgit v1.2.1