summaryrefslogtreecommitdiff
path: root/multimedia/gstreamer1/plugins-base/files/sndiosrc.c
diff options
context:
space:
mode:
authorShokara Kou <kou@13f0.net>2024-03-03 20:55:12 -0500
committerShokara Kou <kou@13f0.net>2024-03-03 20:55:12 -0500
commit9846421274ab6c5bce74731965de217773906f1b (patch)
tree205319d922db719a8af3b0ee362bc67c10788803 /multimedia/gstreamer1/plugins-base/files/sndiosrc.c
parent9ef2923df41c3aa9718897e92b83e0d5b352bfb9 (diff)
import multimedia/gstreamer1
Diffstat (limited to 'multimedia/gstreamer1/plugins-base/files/sndiosrc.c')
-rw-r--r--multimedia/gstreamer1/plugins-base/files/sndiosrc.c228
1 files changed, 228 insertions, 0 deletions
diff --git a/multimedia/gstreamer1/plugins-base/files/sndiosrc.c b/multimedia/gstreamer1/plugins-base/files/sndiosrc.c
new file mode 100644
index 0000000..ee610e4
--- /dev/null
+++ b/multimedia/gstreamer1/plugins-base/files/sndiosrc.c
@@ -0,0 +1,228 @@
1/*
2 * Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
3 * Copyright (C) 2012 Alexandre Ratchov <alex@caoua.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/**
19 * SECTION:element-sndiosrc
20 * @see_also: #GstAutoAudioSrc
21 *
22 * <refsect2>
23 * <para>
24 * This element retrieves samples from a sound card using sndio.
25 * </para>
26 * <para>
27 * Simple example pipeline that records an Ogg/Vorbis file via sndio:
28 * <programlisting>
29 * gst-launch -v sndiosrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=foo.ogg
30 * </programlisting>
31 * </para>
32 * </refsect2>
33 */
34
35#ifdef HAVE_CONFIG_H
36#include "config.h"
37#endif
38
39#include "sndiosrc.h"
40#include "gstsndio.h"
41
42GST_DEBUG_CATEGORY_EXTERN (gst_sndio_debug);
43#define GST_CAT_DEFAULT gst_sndio_debug
44
45#define gst_sndiosrc_parent_class parent_class
46G_DEFINE_TYPE_WITH_CODE (GstSndioSrc, gst_sndiosrc, GST_TYPE_AUDIO_SRC,
47 G_IMPLEMENT_INTERFACE (GST_TYPE_STREAM_VOLUME, NULL));
48
49static void gst_sndiosrc_finalize (GObject * object);
50static GstCaps *gst_sndiosrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter);
51static gboolean gst_sndiosrc_open (GstAudioSrc * asrc);
52static gboolean gst_sndiosrc_close (GstAudioSrc * asrc);
53static gboolean gst_sndiosrc_prepare (GstAudioSrc * asrc,
54 GstAudioRingBufferSpec * spec);
55static gboolean gst_sndiosrc_unprepare (GstAudioSrc * asrc);
56static guint gst_sndiosrc_read (GstAudioSrc * asrc, gpointer data,
57 guint length, GstClockTime * timestamp);
58static guint gst_sndiosrc_delay (GstAudioSrc * asrc);
59static void gst_sndiosrc_reset (GstAudioSrc * asrc);
60static void gst_sndiosrc_set_property (GObject * object, guint prop_id,
61 const GValue * value, GParamSpec * pspec);
62static void gst_sndiosrc_get_property (GObject * object,
63 guint prop_id, GValue * value, GParamSpec * pspec);
64
65static GstStaticPadTemplate sndiosrc_factory =
66 GST_STATIC_PAD_TEMPLATE ("src",
67 GST_PAD_SRC,
68 GST_PAD_ALWAYS,
69 GST_STATIC_CAPS (GST_SNDIO_CAPS_STRING)
70 );
71
72static void
73gst_sndiosrc_init (GstSndioSrc * src)
74{
75 gst_sndio_init (&src->sndio, G_OBJECT(src));
76 /* XXX not implemented */
77 src->sndio.driver_timestamps = FALSE;
78}
79
80static void
81gst_sndiosrc_finalize (GObject * object)
82{
83 GstSndioSrc *src = GST_SNDIOSRC (object);
84
85 gst_sndio_finalize (&src->sndio);
86 G_OBJECT_CLASS (parent_class)->finalize (object);
87}
88
89static GstCaps *
90gst_sndiosrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
91{
92 GstSndioSrc *src = GST_SNDIOSRC (bsrc);
93
94 return gst_sndio_getcaps (&src->sndio, filter);
95}
96
97static gboolean
98gst_sndiosrc_open (GstAudioSrc * asrc)
99{
100 GstSndioSrc *src = GST_SNDIOSRC (asrc);
101
102 return gst_sndio_open (&src->sndio, SIO_REC);
103}
104
105static gboolean
106gst_sndiosrc_close (GstAudioSrc * asrc)
107{
108 GstSndioSrc *src = GST_SNDIOSRC (asrc);
109
110 return gst_sndio_close (&src->sndio);
111}
112
113static gboolean
114gst_sndiosrc_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
115{
116 GstSndioSrc *src = GST_SNDIOSRC (asrc);
117
118 return gst_sndio_prepare (&src->sndio, spec);
119}
120
121static gboolean
122gst_sndiosrc_unprepare (GstAudioSrc * asrc)
123{
124 GstSndioSrc *src = GST_SNDIOSRC (asrc);
125
126 return gst_sndio_unprepare (&src->sndio);
127}
128
129static guint
130gst_sndiosrc_read (GstAudioSrc * asrc, gpointer data, guint length,
131 GstClockTime * timestamp)
132{
133 GstSndioSrc *src = GST_SNDIOSRC (asrc);
134 guint done;
135
136 if (length == 0)
137 return 0;
138 done = sio_read (src->sndio.hdl, data, length);
139 if (done == 0) {
140 GST_ELEMENT_ERROR (src, RESOURCE, READ,
141 ("Failed to read data from sndio"), (NULL));
142 return 0;
143 }
144 src->sndio.delay -= done;
145 return done;
146}
147
148static guint
149gst_sndiosrc_delay (GstAudioSrc * asrc)
150{
151 GstSndioSrc *src = GST_SNDIOSRC (asrc);
152
153 return GST_SNDIO_DELAY(&src->sndio);
154}
155
156static void
157gst_sndiosrc_reset (GstAudioSrc * asrc)
158{
159}
160
161static void
162gst_sndiosrc_set_property (GObject * object, guint prop_id,
163 const GValue * value, GParamSpec * pspec)
164{
165 GstSndioSrc *src = GST_SNDIOSRC (object);
166
167 gst_sndio_set_property (&src->sndio, prop_id, value, pspec);
168}
169
170static void
171gst_sndiosrc_get_property (GObject * object, guint prop_id, GValue * value,
172 GParamSpec * pspec)
173{
174 GstSndioSrc *src = GST_SNDIOSRC (object);
175
176 gst_sndio_get_property (&src->sndio, prop_id, value, pspec);
177}
178
179static void
180gst_sndiosrc_class_init (GstSndioSrcClass * klass)
181{
182 GObjectClass *gobject_class;
183 GstElementClass *gstelement_class;
184 GstBaseSrcClass *gstbasesrc_class;
185 GstAudioBaseSrcClass *gstbaseaudiosrc_class;
186 GstAudioSrcClass *gstaudiosrc_class;
187 gobject_class = (GObjectClass *) klass;
188 gstelement_class = (GstElementClass *) klass;
189 gstbasesrc_class = (GstBaseSrcClass *) klass;
190 gstbaseaudiosrc_class = (GstAudioBaseSrcClass *) klass;
191 gstaudiosrc_class = (GstAudioSrcClass *) klass;
192
193 parent_class = g_type_class_peek_parent (klass);
194
195 gobject_class->finalize = gst_sndiosrc_finalize;
196 gobject_class->get_property = gst_sndiosrc_get_property;
197 gobject_class->set_property = gst_sndiosrc_set_property;
198
199 gst_element_class_set_static_metadata (gstelement_class,
200 "Audio src (sndio)", "Src/Audio",
201 "Input from a sound card via sndio",
202 "Jacob Meuser <jakemsr@sdf.lonestar.org>");
203
204 gst_element_class_add_pad_template (gstelement_class,
205 gst_static_pad_template_get (&sndiosrc_factory));
206
207 gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_sndiosrc_getcaps);
208 gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_sndiosrc_open);
209 gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_sndiosrc_prepare);
210 gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_sndiosrc_unprepare);
211 gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_sndiosrc_close);
212 gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_sndiosrc_read);
213 gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_sndiosrc_delay);
214 gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_sndiosrc_reset);
215
216 g_object_class_install_property (gobject_class, PROP_DEVICE,
217 g_param_spec_string ("device", "Device",
218 "sndio device as defined in sndio(7)",
219 SIO_DEVANY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
220 g_object_class_install_property (gobject_class, PROP_VOLUME,
221 g_param_spec_double ("volume", "Volume",
222 "Linear volume of this stream, 1.0=100%", 0.0, 1.0,
223 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
224 g_object_class_install_property (gobject_class, PROP_MUTE,
225 g_param_spec_boolean ("mute", "Mute",
226 "Mute state of this stream", FALSE,
227 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
228}