source: roaraudio/plugins/gstreamer0.10/roarmixer.c @ 2074:02705c69f766

Last change on this file since 2074:02705c69f766 was 2074:02705c69f766, checked in by phi, 15 years ago

done some bad things to get it work again

File size: 6.7 KB
Line 
1//roarmixer.c:
2/* GStreamer
3 * Copyright (C) <2005> Arwed v. Merkatz <v.merkatz@gmx.net>
4 * Copyright (C) <2008> Philipp 'ph3-der-loewe' Schafft
5 * Copyright (C) <2009> Philipp 'ph3-der-loewe' Schafft
6 *                            <lion@lion.leolix.org>
7 *
8 * roarmixer.h: an RoarAudio audio mixer
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Library General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 * Library General Public License for more details.
19 *
20 * You should have received a copy of the GNU Library General Public
21 * License along with this library; if not, write to the
22 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 * Boston, MA 02111-1307, USA.
24 */
25
26
27#include "roarmixer.h"
28
29GST_DEBUG_CATEGORY_EXTERN (roar_debug);
30#define GST_CAT_DEFAULT roar_debug
31
32enum
33{
34  PROP_DEVICE_NAME = 1
35};
36
37
38static const GstElementDetails gst_roar_mixer_element_details =
39GST_ELEMENT_DETAILS ("RoarAudio Mixer",
40    "Generic/Audio",
41    "Control sound input and output levels with RoarAudio",
42    "Philipp 'ph3-der-loewe' Schafft <lion@lion.leolix.org>");
43
44GST_BOILERPLATE_WITH_INTERFACE (GstRoarMixerElement, gst_roar_mixer_element,
45    GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER,
46    gst_roar_mixer_element);
47
48GST_IMPLEMENT_ROAR_MIXER_METHODS (GstRoarMixerElement, gst_roar_mixer_element);
49
50static GstStateChangeReturn gst_roar_mixer_element_change_state (GstElement *
51    element, GstStateChange transition);
52
53static void gst_roar_mixer_element_get_property (GObject * object,
54    guint prop_id, GValue * value, GParamSpec * pspec);
55
56static void
57gst_roar_mixer_element_base_init (gpointer klass)
58{
59  gst_element_class_set_details (GST_ELEMENT_CLASS (klass),
60      &gst_roar_mixer_element_details);
61}
62
63static void
64gst_roar_mixer_element_class_init (GstRoarMixerElementClass * klass)
65{
66  GstElementClass *element_class;
67  GObjectClass *gobject_class;
68
69  element_class = (GstElementClass *) klass;
70  gobject_class = (GObjectClass *) klass;
71
72  gobject_class->get_property = gst_roar_mixer_element_get_property;
73
74  g_object_class_install_property (gobject_class, PROP_DEVICE_NAME,
75      g_param_spec_string ("device-name", "Device name",
76          "Human-readable name of the sound device", "", G_PARAM_READABLE));
77
78  element_class->change_state =
79      GST_DEBUG_FUNCPTR (gst_roar_mixer_element_change_state);
80}
81
82static void
83gst_roar_mixer_element_init (GstRoarMixerElement * this,
84    GstRoarMixerElementClass * g_class)
85{
86  this->mixer = NULL;
87}
88
89static void
90gst_roar_mixer_element_get_property (GObject * object, guint prop_id,
91    GValue * value, GParamSpec * pspec)
92{
93  GstRoarMixerElement *this = GST_ROAR_MIXER_ELEMENT (object);
94
95  switch (prop_id) {
96    case PROP_DEVICE_NAME:
97      if (this->mixer) {
98        g_value_set_string (value, this->mixer->cardname);
99      } else {
100        g_value_set_string (value, NULL);
101      }
102      break;
103    default:
104      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
105      break;
106  }
107}
108
109static GstStateChangeReturn
110gst_roar_mixer_element_change_state (GstElement * element,
111    GstStateChange transition)
112{
113  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
114  GstRoarMixerElement *this = GST_ROAR_MIXER_ELEMENT (element);
115
116  switch (transition) {
117    case GST_STATE_CHANGE_NULL_TO_READY:
118      if (!this->mixer) {
119        this->mixer = gst_roarmixer_new ("/dev/mixer", GST_ROAR_MIXER_ALL);
120      }
121      break;
122      break;
123    default:
124      break;
125  }
126
127  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
128  if (ret == GST_STATE_CHANGE_FAILURE)
129    return ret;
130
131  switch (transition) {
132    case GST_STATE_CHANGE_READY_TO_NULL:
133      if (this->mixer) {
134        gst_roarmixer_free (this->mixer);
135        this->mixer = NULL;
136      }
137      break;
138    default:
139      break;
140  }
141
142  return ret;
143}
144
145
146gboolean gst_roarmixer_factory_init (GstPlugin * plugin) {
147  if (!gst_element_register(plugin, "roarmixer", GST_RANK_MARGINAL,
148                            GST_TYPE_ROAR_MIXER_ELEMENT))
149    return FALSE;
150
151  return TRUE;
152}
153
154GstRoarMixer*    gst_roarmixer_new                (const gchar *device,
155                                                 GstRoarMixerDirection dir) {
156  GstRoarMixer *ret = NULL;
157
158  g_return_val_if_fail(device != NULL, NULL);
159
160  ret = g_new0(GstRoarMixer, 1);
161
162  ret->device = g_strdup(device);
163  ret->dir    = dir;
164  ret->cardname = g_strdup("RoarAudio Default Device");
165
166/*
167  if (!gst_ossmixer_open (ret))
168    goto error;
169*/
170
171  if ( roar_simple_connect(&(ret->con), NULL, "gstroarmixer") == -1 )
172   goto error;
173
174  return ret;
175
176error:
177  if (ret)
178    gst_roarmixer_free (ret);
179
180  return NULL;
181}
182
183void            gst_roarmixer_free               (GstRoarMixer *mixer) {
184  g_return_if_fail(mixer != NULL);
185
186  if (mixer->device) {
187    g_free(mixer->device);
188    mixer->device = NULL;
189  }
190
191  if (mixer->cardname) {
192    g_free(mixer->cardname);
193    mixer->cardname = NULL;
194  }
195
196  if (mixer->tracklist) {
197    g_list_foreach(mixer->tracklist, (GFunc) g_object_unref, NULL);
198    g_list_free(mixer->tracklist);
199    mixer->tracklist = NULL;
200  }
201
202  roar_disconnect(&(mixer->con));
203
204  g_free (mixer);
205}
206
207/* unused with G_DISABLE_* */
208static G_GNUC_UNUSED gboolean gst_roarmixer_contains_track (GstRoarMixer * mixer,
209                                                            GstRoarMixerTrack * roartrack) {
210  const GList *item;
211
212  for (item = mixer->tracklist; item != NULL; item = item->next)
213    if (item->data == roartrack)
214      return TRUE;
215
216  return FALSE;
217}
218
219const GList*    gst_roarmixer_list_tracks        (GstRoarMixer * mixer) {
220 return (const GList *) mixer->tracklist;
221}
222
223void            gst_roarmixer_set_volume         (GstRoarMixer * mixer,
224                                                 GstMixerTrack * track,
225                                                 gint * volumes) {
226}
227void            gst_roarmixer_get_volume         (GstRoarMixer * mixer,
228                                                 GstMixerTrack * track,
229                                                 gint * volumes) {
230}
231void            gst_roarmixer_set_record         (GstRoarMixer * mixer,
232                                                 GstMixerTrack * track,
233                                                 gboolean record) {
234}
235void            gst_roarmixer_set_mute           (GstRoarMixer * mixer,
236                                                 GstMixerTrack * track,
237                                                 gboolean mute) {
238}
239
240//ll
Note: See TracBrowser for help on using the repository browser.