source: roaraudio/plugins/gstreamer0.10/roarmixer.c @ 2073:9032ae5f36c7

Last change on this file since 2073:9032ae5f36c7 was 2073:9032ae5f36c7, checked in by phi, 15 years ago

copyed a lot code from the oss mixer

File size: 6.6 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_ROARMIXER))
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
165/*
166  if (!gst_ossmixer_open (ret))
167    goto error;
168*/
169
170  if ( roar_simple_connect(&(ret->con), NULL, "gstroarmixer") == -1 )
171   goto error;
172
173  return ret;
174
175error:
176  if (ret)
177    gst_roarmixer_free (ret);
178
179  return NULL;
180}
181
182void            gst_roarmixer_free               (GstRoarMixer *mixer) {
183  g_return_if_fail(mixer != NULL);
184
185  if (mixer->device) {
186    g_free(mixer->device);
187    mixer->device = NULL;
188  }
189
190  if (mixer->cardname) {
191    g_free(mixer->cardname);
192    mixer->cardname = NULL;
193  }
194
195  if (mixer->tracklist) {
196    g_list_foreach(mixer->tracklist, (GFunc) g_object_unref, NULL);
197    g_list_free(mixer->tracklist);
198    mixer->tracklist = NULL;
199  }
200
201  roar_disconnect(&(mixer->con));
202
203  g_free (mixer);
204}
205
206/* unused with G_DISABLE_* */
207static G_GNUC_UNUSED gboolean gst_roarmixer_contains_track (GstRoarMixer * mixer,
208                                                            GstRoarMixerTrack * roartrack) {
209  const GList *item;
210
211  for (item = mixer->tracklist; item != NULL; item = item->next)
212    if (item->data == roartrack)
213      return TRUE;
214
215  return FALSE;
216}
217
218const GList*    gst_roarmixer_list_tracks        (GstRoarMixer * mixer) {
219 return (const GList *) mixer->tracklist;
220}
221
222void            gst_roarmixer_set_volume         (GstRoarMixer * mixer,
223                                                 GstMixerTrack * track,
224                                                 gint * volumes) {
225}
226void            gst_roarmixer_get_volume         (GstRoarMixer * mixer,
227                                                 GstMixerTrack * track,
228                                                 gint * volumes) {
229}
230void            gst_roarmixer_set_record         (GstRoarMixer * mixer,
231                                                 GstMixerTrack * track,
232                                                 gboolean record) {
233}
234void            gst_roarmixer_set_mute           (GstRoarMixer * mixer,
235                                                 GstMixerTrack * track,
236                                                 gboolean mute) {
237}
238
239//ll
Note: See TracBrowser for help on using the repository browser.