2 * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
23 * SECTION:element-alsasrc
26 * This element reads data from an audio card using the ALSA API.
29 * <title>Example pipelines</title>
31 * gst-launch-1.0 -v alsasrc ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=alsasrc.ogg
32 * ]| Record from a sound card using ALSA and encode to Ogg/Vorbis.
39 #include <sys/ioctl.h>
45 #include <alsa/asoundlib.h>
47 #include "gstalsasrc.h"
48 #include "gstalsadeviceprobe.h"
50 #include <gst/gst-i18n-plugin.h>
53 #define ESTRPIPE EPIPE
56 #define DEFAULT_PROP_DEVICE "default"
57 #define DEFAULT_PROP_DEVICE_NAME ""
58 #define DEFAULT_PROP_CARD_NAME ""
69 #define gst_alsasrc_parent_class parent_class
70 G_DEFINE_TYPE (GstAlsaSrc, gst_alsasrc, GST_TYPE_AUDIO_SRC);
72 static void gst_alsasrc_finalize (GObject * object);
73 static void gst_alsasrc_set_property (GObject * object,
74 guint prop_id, const GValue * value, GParamSpec * pspec);
75 static void gst_alsasrc_get_property (GObject * object,
76 guint prop_id, GValue * value, GParamSpec * pspec);
77 static GstStateChangeReturn gst_alsasrc_change_state (GstElement * element,
78 GstStateChange transition);
79 static GstCaps *gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter);
81 static gboolean gst_alsasrc_open (GstAudioSrc * asrc);
82 static gboolean gst_alsasrc_prepare (GstAudioSrc * asrc,
83 GstAudioRingBufferSpec * spec);
84 static gboolean gst_alsasrc_unprepare (GstAudioSrc * asrc);
85 static gboolean gst_alsasrc_close (GstAudioSrc * asrc);
86 static guint gst_alsasrc_read
87 (GstAudioSrc * asrc, gpointer data, guint length, GstClockTime * timestamp);
88 static guint gst_alsasrc_delay (GstAudioSrc * asrc);
89 static void gst_alsasrc_reset (GstAudioSrc * asrc);
91 /* AlsaSrc signals and args */
97 #if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
98 # define ALSA_SRC_FACTORY_ENDIANNESS "LITTLE_ENDIAN, BIG_ENDIAN"
100 # define ALSA_SRC_FACTORY_ENDIANNESS "BIG_ENDIAN, LITTLE_ENDIAN"
103 static GstStaticPadTemplate alsasrc_src_factory =
104 GST_STATIC_PAD_TEMPLATE ("src",
107 GST_STATIC_CAPS ("audio/x-raw, "
108 "format = (string) " GST_AUDIO_FORMATS_ALL ", "
109 "layout = (string) interleaved, "
110 "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
114 gst_alsasrc_finalize (GObject * object)
116 GstAlsaSrc *src = GST_ALSA_SRC (object);
118 g_free (src->device);
119 g_mutex_clear (&src->alsa_lock);
121 G_OBJECT_CLASS (parent_class)->finalize (object);
125 gst_alsasrc_class_init (GstAlsaSrcClass * klass)
127 GObjectClass *gobject_class;
128 GstElementClass *gstelement_class;
129 GstBaseSrcClass *gstbasesrc_class;
130 GstAudioSrcClass *gstaudiosrc_class;
132 gobject_class = (GObjectClass *) klass;
133 gstelement_class = (GstElementClass *) klass;
134 gstbasesrc_class = (GstBaseSrcClass *) klass;
135 gstaudiosrc_class = (GstAudioSrcClass *) klass;
137 gobject_class->finalize = gst_alsasrc_finalize;
138 gobject_class->get_property = gst_alsasrc_get_property;
139 gobject_class->set_property = gst_alsasrc_set_property;
141 gst_element_class_set_static_metadata (gstelement_class,
142 "Audio source (ALSA)", "Source/Audio",
143 "Read from a sound card via ALSA", "Wim Taymans <wim@fluendo.com>");
145 gst_element_class_add_static_pad_template (gstelement_class,
146 &alsasrc_src_factory);
148 gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_alsasrc_getcaps);
150 gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_alsasrc_open);
151 gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_alsasrc_prepare);
152 gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_alsasrc_unprepare);
153 gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_alsasrc_close);
154 gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_alsasrc_read);
155 gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_alsasrc_delay);
156 gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_alsasrc_reset);
157 gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_alsasrc_change_state);
159 g_object_class_install_property (gobject_class, PROP_DEVICE,
160 g_param_spec_string ("device", "Device",
161 "ALSA device, as defined in an asound configuration file",
162 DEFAULT_PROP_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
164 g_object_class_install_property (gobject_class, PROP_DEVICE_NAME,
165 g_param_spec_string ("device-name", "Device name",
166 "Human-readable name of the sound device",
167 DEFAULT_PROP_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
169 g_object_class_install_property (gobject_class, PROP_CARD_NAME,
170 g_param_spec_string ("card-name", "Card name",
171 "Human-readable name of the sound card",
172 DEFAULT_PROP_CARD_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
176 gst_alsasrc_set_property (GObject * object, guint prop_id,
177 const GValue * value, GParamSpec * pspec)
181 src = GST_ALSA_SRC (object);
185 g_free (src->device);
186 src->device = g_value_dup_string (value);
187 if (src->device == NULL) {
188 src->device = g_strdup (DEFAULT_PROP_DEVICE);
192 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
198 gst_alsasrc_get_property (GObject * object, guint prop_id,
199 GValue * value, GParamSpec * pspec)
203 src = GST_ALSA_SRC (object);
207 g_value_set_string (value, src->device);
209 case PROP_DEVICE_NAME:
210 g_value_take_string (value,
211 gst_alsa_find_device_name (GST_OBJECT_CAST (src),
212 src->device, src->handle, SND_PCM_STREAM_CAPTURE));
215 g_value_take_string (value,
216 gst_alsa_find_card_name (GST_OBJECT_CAST (src),
217 src->device, SND_PCM_STREAM_CAPTURE));
220 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
225 static GstStateChangeReturn
226 gst_alsasrc_change_state (GstElement * element, GstStateChange transition)
228 GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
229 GstAlsaSrc *alsa = GST_ALSA_SRC (element);
232 switch (transition) {
233 /* show the compiler that we care */
234 case GST_STATE_CHANGE_NULL_TO_READY:
235 case GST_STATE_CHANGE_READY_TO_PAUSED:
236 case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
237 case GST_STATE_CHANGE_PAUSED_TO_READY:
238 case GST_STATE_CHANGE_READY_TO_NULL:
241 case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
242 alsa->driver_timestamps = FALSE;
244 clk = gst_element_get_clock (element);
246 if (GST_IS_SYSTEM_CLOCK (clk)) {
248 g_object_get (clk, "clock-type", &clocktype, NULL);
249 if (clocktype == GST_CLOCK_TYPE_MONOTONIC) {
250 GST_INFO ("Using driver timestamps !");
251 alsa->driver_timestamps = TRUE;
255 gst_object_unref (clk);
259 ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
265 gst_alsasrc_init (GstAlsaSrc * alsasrc)
267 GST_DEBUG_OBJECT (alsasrc, "initializing");
269 alsasrc->device = g_strdup (DEFAULT_PROP_DEVICE);
270 alsasrc->cached_caps = NULL;
271 alsasrc->driver_timestamps = FALSE;
273 g_mutex_init (&alsasrc->alsa_lock);
276 #define CHECK(call, error) \
278 if ((err = call) < 0) \
284 gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
286 GstElementClass *element_class;
287 GstPadTemplate *pad_template;
289 GstCaps *caps, *templ_caps;
291 src = GST_ALSA_SRC (bsrc);
293 if (src->handle == NULL) {
294 GST_DEBUG_OBJECT (src, "device not open, using template caps");
295 return GST_BASE_SRC_CLASS (parent_class)->get_caps (bsrc, filter);
298 if (src->cached_caps) {
299 GST_LOG_OBJECT (src, "Returning cached caps");
301 return gst_caps_intersect_full (filter, src->cached_caps,
302 GST_CAPS_INTERSECT_FIRST);
304 return gst_caps_ref (src->cached_caps);
307 element_class = GST_ELEMENT_GET_CLASS (src);
308 pad_template = gst_element_class_get_pad_template (element_class, "src");
309 g_return_val_if_fail (pad_template != NULL, NULL);
311 templ_caps = gst_pad_template_get_caps (pad_template);
312 GST_INFO_OBJECT (src, "template caps %" GST_PTR_FORMAT, templ_caps);
314 caps = gst_alsa_probe_supported_formats (GST_OBJECT (src),
315 src->device, src->handle, templ_caps);
316 gst_caps_unref (templ_caps);
319 src->cached_caps = gst_caps_ref (caps);
322 GST_INFO_OBJECT (src, "returning caps %" GST_PTR_FORMAT, caps);
325 GstCaps *intersection;
328 gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
329 gst_caps_unref (caps);
337 set_hwparams (GstAlsaSrc * alsa)
341 snd_pcm_hw_params_t *params;
343 snd_pcm_hw_params_malloc (¶ms);
345 /* choose all parameters */
346 CHECK (snd_pcm_hw_params_any (alsa->handle, params), no_config);
347 /* set the interleaved read/write format */
348 CHECK (snd_pcm_hw_params_set_access (alsa->handle, params, alsa->access),
350 /* set the sample format */
351 CHECK (snd_pcm_hw_params_set_format (alsa->handle, params, alsa->format),
353 /* set the count of channels */
354 CHECK (snd_pcm_hw_params_set_channels (alsa->handle, params, alsa->channels),
356 /* set the stream rate */
358 CHECK (snd_pcm_hw_params_set_rate_near (alsa->handle, params, &rrate, NULL),
360 if (rrate != alsa->rate)
363 #ifndef GST_DISABLE_GST_DEBUG
364 /* get and dump some limits */
368 snd_pcm_hw_params_get_buffer_time_min (params, &min, NULL);
369 snd_pcm_hw_params_get_buffer_time_max (params, &max, NULL);
371 GST_DEBUG_OBJECT (alsa, "buffer time %u, min %u, max %u",
372 alsa->buffer_time, min, max);
374 snd_pcm_hw_params_get_period_time_min (params, &min, NULL);
375 snd_pcm_hw_params_get_period_time_max (params, &max, NULL);
377 GST_DEBUG_OBJECT (alsa, "period time %u, min %u, max %u",
378 alsa->period_time, min, max);
380 snd_pcm_hw_params_get_periods_min (params, &min, NULL);
381 snd_pcm_hw_params_get_periods_max (params, &max, NULL);
383 GST_DEBUG_OBJECT (alsa, "periods min %u, max %u", min, max);
387 if (alsa->buffer_time != -1) {
388 /* set the buffer time */
389 CHECK (snd_pcm_hw_params_set_buffer_time_near (alsa->handle, params,
390 &alsa->buffer_time, NULL), buffer_time);
391 GST_DEBUG_OBJECT (alsa, "buffer time %u", alsa->buffer_time);
393 if (alsa->period_time != -1) {
394 /* set the period time */
395 CHECK (snd_pcm_hw_params_set_period_time_near (alsa->handle, params,
396 &alsa->period_time, NULL), period_time);
397 GST_DEBUG_OBJECT (alsa, "period time %u", alsa->period_time);
400 /* write the parameters to device */
401 CHECK (snd_pcm_hw_params (alsa->handle, params), set_hw_params);
403 CHECK (snd_pcm_hw_params_get_buffer_size (params, &alsa->buffer_size),
406 CHECK (snd_pcm_hw_params_get_period_size (params, &alsa->period_size, NULL),
409 snd_pcm_hw_params_free (params);
415 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
416 ("Broken configuration for recording: no configurations available: %s",
417 snd_strerror (err)));
418 snd_pcm_hw_params_free (params);
423 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
424 ("Access type not available for recording: %s", snd_strerror (err)));
425 snd_pcm_hw_params_free (params);
430 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
431 ("Sample format not available for recording: %s", snd_strerror (err)));
432 snd_pcm_hw_params_free (params);
439 if ((alsa->channels) == 1)
440 msg = g_strdup (_("Could not open device for recording in mono mode."));
441 if ((alsa->channels) == 2)
442 msg = g_strdup (_("Could not open device for recording in stereo mode."));
443 if ((alsa->channels) > 2)
446 ("Could not open device for recording in %d-channel mode"),
448 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, ("%s", msg),
449 ("%s", snd_strerror (err)));
451 snd_pcm_hw_params_free (params);
456 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
457 ("Rate %iHz not available for recording: %s",
458 alsa->rate, snd_strerror (err)));
459 snd_pcm_hw_params_free (params);
464 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
465 ("Rate doesn't match (requested %iHz, get %iHz)", alsa->rate, err));
466 snd_pcm_hw_params_free (params);
471 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
472 ("Unable to set buffer time %i for recording: %s",
473 alsa->buffer_time, snd_strerror (err)));
474 snd_pcm_hw_params_free (params);
479 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
480 ("Unable to get buffer size for recording: %s", snd_strerror (err)));
481 snd_pcm_hw_params_free (params);
486 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
487 ("Unable to set period time %i for recording: %s", alsa->period_time,
488 snd_strerror (err)));
489 snd_pcm_hw_params_free (params);
494 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
495 ("Unable to get period size for recording: %s", snd_strerror (err)));
496 snd_pcm_hw_params_free (params);
501 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
502 ("Unable to set hw params for recording: %s", snd_strerror (err)));
503 snd_pcm_hw_params_free (params);
509 set_swparams (GstAlsaSrc * alsa)
512 snd_pcm_sw_params_t *params;
514 snd_pcm_sw_params_malloc (¶ms);
516 /* get the current swparams */
517 CHECK (snd_pcm_sw_params_current (alsa->handle, params), no_config);
518 /* allow the transfer when at least period_size samples can be processed */
519 CHECK (snd_pcm_sw_params_set_avail_min (alsa->handle, params,
520 alsa->period_size), set_avail);
521 /* start the transfer on first read */
522 CHECK (snd_pcm_sw_params_set_start_threshold (alsa->handle, params,
523 0), start_threshold);
524 /* use monotonic timestamping */
525 CHECK (snd_pcm_sw_params_set_tstamp_mode (alsa->handle, params,
526 SND_PCM_TSTAMP_MMAP), tstamp_mode);
528 #if GST_CHECK_ALSA_VERSION(1,0,16)
529 /* snd_pcm_sw_params_set_xfer_align() is deprecated, alignment is always 1 */
531 /* align all transfers to 1 sample */
532 CHECK (snd_pcm_sw_params_set_xfer_align (alsa->handle, params, 1), set_align);
535 /* write the parameters to the recording device */
536 CHECK (snd_pcm_sw_params (alsa->handle, params), set_sw_params);
538 snd_pcm_sw_params_free (params);
544 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
545 ("Unable to determine current swparams for playback: %s",
546 snd_strerror (err)));
547 snd_pcm_sw_params_free (params);
552 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
553 ("Unable to set start threshold mode for playback: %s",
554 snd_strerror (err)));
555 snd_pcm_sw_params_free (params);
560 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
561 ("Unable to set avail min for playback: %s", snd_strerror (err)));
562 snd_pcm_sw_params_free (params);
567 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
568 ("Unable to set tstamp mode for playback: %s", snd_strerror (err)));
569 snd_pcm_sw_params_free (params);
572 #if !GST_CHECK_ALSA_VERSION(1,0,16)
575 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
576 ("Unable to set transfer align for playback: %s", snd_strerror (err)));
577 snd_pcm_sw_params_free (params);
583 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
584 ("Unable to set sw params for playback: %s", snd_strerror (err)));
585 snd_pcm_sw_params_free (params);
591 alsasrc_parse_spec (GstAlsaSrc * alsa, GstAudioRingBufferSpec * spec)
593 switch (spec->type) {
594 case GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW:
595 switch (GST_AUDIO_INFO_FORMAT (&spec->info)) {
596 case GST_AUDIO_FORMAT_U8:
597 alsa->format = SND_PCM_FORMAT_U8;
599 case GST_AUDIO_FORMAT_S8:
600 alsa->format = SND_PCM_FORMAT_S8;
602 case GST_AUDIO_FORMAT_S16LE:
603 alsa->format = SND_PCM_FORMAT_S16_LE;
605 case GST_AUDIO_FORMAT_S16BE:
606 alsa->format = SND_PCM_FORMAT_S16_BE;
608 case GST_AUDIO_FORMAT_U16LE:
609 alsa->format = SND_PCM_FORMAT_U16_LE;
611 case GST_AUDIO_FORMAT_U16BE:
612 alsa->format = SND_PCM_FORMAT_U16_BE;
614 case GST_AUDIO_FORMAT_S24_32LE:
615 alsa->format = SND_PCM_FORMAT_S24_LE;
617 case GST_AUDIO_FORMAT_S24_32BE:
618 alsa->format = SND_PCM_FORMAT_S24_BE;
620 case GST_AUDIO_FORMAT_U24_32LE:
621 alsa->format = SND_PCM_FORMAT_U24_LE;
623 case GST_AUDIO_FORMAT_U24_32BE:
624 alsa->format = SND_PCM_FORMAT_U24_BE;
626 case GST_AUDIO_FORMAT_S32LE:
627 alsa->format = SND_PCM_FORMAT_S32_LE;
629 case GST_AUDIO_FORMAT_S32BE:
630 alsa->format = SND_PCM_FORMAT_S32_BE;
632 case GST_AUDIO_FORMAT_U32LE:
633 alsa->format = SND_PCM_FORMAT_U32_LE;
635 case GST_AUDIO_FORMAT_U32BE:
636 alsa->format = SND_PCM_FORMAT_U32_BE;
638 case GST_AUDIO_FORMAT_S24LE:
639 alsa->format = SND_PCM_FORMAT_S24_3LE;
641 case GST_AUDIO_FORMAT_S24BE:
642 alsa->format = SND_PCM_FORMAT_S24_3BE;
644 case GST_AUDIO_FORMAT_U24LE:
645 alsa->format = SND_PCM_FORMAT_U24_3LE;
647 case GST_AUDIO_FORMAT_U24BE:
648 alsa->format = SND_PCM_FORMAT_U24_3BE;
650 case GST_AUDIO_FORMAT_S20LE:
651 alsa->format = SND_PCM_FORMAT_S20_3LE;
653 case GST_AUDIO_FORMAT_S20BE:
654 alsa->format = SND_PCM_FORMAT_S20_3BE;
656 case GST_AUDIO_FORMAT_U20LE:
657 alsa->format = SND_PCM_FORMAT_U20_3LE;
659 case GST_AUDIO_FORMAT_U20BE:
660 alsa->format = SND_PCM_FORMAT_U20_3BE;
662 case GST_AUDIO_FORMAT_S18LE:
663 alsa->format = SND_PCM_FORMAT_S18_3LE;
665 case GST_AUDIO_FORMAT_S18BE:
666 alsa->format = SND_PCM_FORMAT_S18_3BE;
668 case GST_AUDIO_FORMAT_U18LE:
669 alsa->format = SND_PCM_FORMAT_U18_3LE;
671 case GST_AUDIO_FORMAT_U18BE:
672 alsa->format = SND_PCM_FORMAT_U18_3BE;
674 case GST_AUDIO_FORMAT_F32LE:
675 alsa->format = SND_PCM_FORMAT_FLOAT_LE;
677 case GST_AUDIO_FORMAT_F32BE:
678 alsa->format = SND_PCM_FORMAT_FLOAT_BE;
680 case GST_AUDIO_FORMAT_F64LE:
681 alsa->format = SND_PCM_FORMAT_FLOAT64_LE;
683 case GST_AUDIO_FORMAT_F64BE:
684 alsa->format = SND_PCM_FORMAT_FLOAT64_BE;
690 case GST_AUDIO_RING_BUFFER_FORMAT_TYPE_A_LAW:
691 alsa->format = SND_PCM_FORMAT_A_LAW;
693 case GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MU_LAW:
694 alsa->format = SND_PCM_FORMAT_MU_LAW;
700 alsa->rate = GST_AUDIO_INFO_RATE (&spec->info);
701 alsa->channels = GST_AUDIO_INFO_CHANNELS (&spec->info);
702 alsa->buffer_time = spec->buffer_time;
703 alsa->period_time = spec->latency_time;
704 alsa->access = SND_PCM_ACCESS_RW_INTERLEAVED;
706 if (spec->type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW && alsa->channels < 9)
707 gst_audio_ring_buffer_set_channel_positions (GST_AUDIO_BASE_SRC
708 (alsa)->ringbuffer, alsa_position[alsa->channels - 1]);
720 gst_alsasrc_open (GstAudioSrc * asrc)
725 alsa = GST_ALSA_SRC (asrc);
727 CHECK (snd_pcm_open (&alsa->handle, alsa->device, SND_PCM_STREAM_CAPTURE,
728 (alsa->driver_timestamps) ? 0 : SND_PCM_NONBLOCK), open_error);
736 GST_ELEMENT_ERROR (alsa, RESOURCE, BUSY,
737 (_("Could not open audio device for recording. "
738 "Device is being used by another application.")),
739 ("Device '%s' is busy", alsa->device));
741 GST_ELEMENT_ERROR (alsa, RESOURCE, OPEN_READ,
742 (_("Could not open audio device for recording.")),
743 ("Recording open error on device '%s': %s", alsa->device,
744 snd_strerror (err)));
751 gst_alsasrc_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
756 alsa = GST_ALSA_SRC (asrc);
758 if (!alsasrc_parse_spec (alsa, spec))
761 CHECK (snd_pcm_nonblock (alsa->handle, 0), non_block);
763 CHECK (set_hwparams (alsa), hw_params_failed);
764 CHECK (set_swparams (alsa), sw_params_failed);
765 CHECK (snd_pcm_prepare (alsa->handle), prepare_failed);
767 alsa->bpf = GST_AUDIO_INFO_BPF (&spec->info);
768 spec->segsize = alsa->period_size * alsa->bpf;
769 spec->segtotal = alsa->buffer_size / alsa->period_size;
772 snd_output_t *out_buf = NULL;
775 snd_output_buffer_open (&out_buf);
776 snd_pcm_dump_hw_setup (alsa->handle, out_buf);
777 snd_output_buffer_string (out_buf, &msg);
778 GST_DEBUG_OBJECT (alsa, "Hardware setup: \n%s", msg);
779 snd_output_close (out_buf);
780 snd_output_buffer_open (&out_buf);
781 snd_pcm_dump_sw_setup (alsa->handle, out_buf);
782 snd_output_buffer_string (out_buf, &msg);
783 GST_DEBUG_OBJECT (alsa, "Software setup: \n%s", msg);
784 snd_output_close (out_buf);
787 #ifdef SND_CHMAP_API_VERSION
788 if (spec->type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW && alsa->channels < 9) {
789 snd_pcm_chmap_t *chmap = snd_pcm_get_chmap (alsa->handle);
790 if (chmap && chmap->channels == alsa->channels) {
791 GstAudioChannelPosition pos[8];
792 if (alsa_chmap_to_channel_positions (chmap, pos))
793 gst_audio_ring_buffer_set_channel_positions (GST_AUDIO_BASE_SRC
794 (alsa)->ringbuffer, pos);
798 #endif /* SND_CHMAP_API_VERSION */
805 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
806 ("Error parsing spec"));
811 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
812 ("Could not set device to blocking: %s", snd_strerror (err)));
817 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
818 ("Setting of hwparams failed: %s", snd_strerror (err)));
823 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
824 ("Setting of swparams failed: %s", snd_strerror (err)));
829 GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
830 ("Prepare failed: %s", snd_strerror (err)));
836 gst_alsasrc_unprepare (GstAudioSrc * asrc)
840 alsa = GST_ALSA_SRC (asrc);
842 snd_pcm_drop (alsa->handle);
843 snd_pcm_hw_free (alsa->handle);
844 snd_pcm_nonblock (alsa->handle, 1);
850 gst_alsasrc_close (GstAudioSrc * asrc)
852 GstAlsaSrc *alsa = GST_ALSA_SRC (asrc);
854 snd_pcm_close (alsa->handle);
857 gst_caps_replace (&alsa->cached_caps, NULL);
863 * Underrun and suspend recovery
866 xrun_recovery (GstAlsaSrc * alsa, snd_pcm_t * handle, gint err)
868 GST_WARNING_OBJECT (alsa, "xrun recovery %d: %s", err, g_strerror (-err));
870 if (err == -EPIPE) { /* under-run */
871 err = snd_pcm_prepare (handle);
873 GST_WARNING_OBJECT (alsa,
874 "Can't recover from underrun, prepare failed: %s",
877 } else if (err == -ESTRPIPE) {
878 while ((err = snd_pcm_resume (handle)) == -EAGAIN)
879 g_usleep (100); /* wait until the suspend flag is released */
882 err = snd_pcm_prepare (handle);
884 GST_WARNING_OBJECT (alsa,
885 "Can't recover from suspend, prepare failed: %s",
894 gst_alsasrc_get_timestamp (GstAlsaSrc * asrc)
896 snd_pcm_status_t *status;
897 snd_htimestamp_t tstamp;
898 GstClockTime timestamp;
899 snd_pcm_uframes_t avail;
902 if (G_UNLIKELY (!asrc)) {
903 GST_ERROR_OBJECT (asrc, "No alsa handle created yet !");
904 return GST_CLOCK_TIME_NONE;
907 if (G_UNLIKELY (snd_pcm_status_malloc (&status) != 0)) {
908 GST_ERROR_OBJECT (asrc, "snd_pcm_status_malloc failed");
909 return GST_CLOCK_TIME_NONE;
912 if (G_UNLIKELY (snd_pcm_status (asrc->handle, status) != 0)) {
913 GST_ERROR_OBJECT (asrc, "snd_pcm_status failed");
914 return GST_CLOCK_TIME_NONE;
917 /* in case an xrun condition has occured we need to handle this */
918 if (snd_pcm_status_get_state (status) != SND_PCM_STATE_RUNNING) {
919 if (xrun_recovery (asrc, asrc->handle, err) < 0) {
920 GST_WARNING_OBJECT (asrc, "Could not recover from xrun condition !");
922 /* reload the status alsa status object, since recovery made it invalid */
923 if (G_UNLIKELY (snd_pcm_status (asrc->handle, status) != 0)) {
924 GST_ERROR_OBJECT (asrc, "snd_pcm_status failed");
928 /* get high resolution time stamp from driver */
929 snd_pcm_status_get_htstamp (status, &tstamp);
930 timestamp = GST_TIMESPEC_TO_TIME (tstamp);
932 /* max available frames sets the depth of the buffer */
933 avail = snd_pcm_status_get_avail (status);
935 /* calculate the timestamp of the next sample to be read */
936 timestamp -= gst_util_uint64_scale_int (avail, GST_SECOND, asrc->rate);
938 /* compensate for the fact that we really need the timestamp of the
939 * previously read data segment */
940 timestamp -= asrc->period_time * 1000;
942 snd_pcm_status_free (status);
944 GST_LOG_OBJECT (asrc, "ALSA timestamp : %" GST_TIME_FORMAT
945 ", delay %lu", GST_TIME_ARGS (timestamp), avail);
951 gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length,
952 GstClockTime * timestamp)
959 alsa = GST_ALSA_SRC (asrc);
961 cptr = length / alsa->bpf;
963 GST_ALSA_SRC_LOCK (asrc);
965 if ((err = snd_pcm_readi (alsa->handle, ptr, cptr)) < 0) {
966 if (err == -EAGAIN) {
967 GST_DEBUG_OBJECT (asrc, "Read error: %s", snd_strerror (err));
969 } else if (err == -ENODEV) {
970 goto device_disappeared;
971 } else if (xrun_recovery (alsa, alsa->handle, err) < 0) {
977 ptr += snd_pcm_frames_to_bytes (alsa->handle, err);
980 GST_ALSA_SRC_UNLOCK (asrc);
982 /* if driver timestamps are enabled we need to return this here */
983 if (alsa->driver_timestamps && timestamp)
984 *timestamp = gst_alsasrc_get_timestamp (alsa);
986 return length - (cptr * alsa->bpf);
990 GST_ALSA_SRC_UNLOCK (asrc);
991 return length; /* skip one period */
995 GST_ELEMENT_ERROR (asrc, RESOURCE, READ,
996 (_("Error recording from audio device. "
997 "The device has been disconnected.")), (NULL));
998 GST_ALSA_SRC_UNLOCK (asrc);
1004 gst_alsasrc_delay (GstAudioSrc * asrc)
1007 snd_pcm_sframes_t delay;
1010 alsa = GST_ALSA_SRC (asrc);
1012 res = snd_pcm_delay (alsa->handle, &delay);
1013 if (G_UNLIKELY (res < 0)) {
1014 GST_DEBUG_OBJECT (alsa, "snd_pcm_delay returned %d", res);
1018 return CLAMP (delay, 0, alsa->buffer_size);
1022 gst_alsasrc_reset (GstAudioSrc * asrc)
1027 alsa = GST_ALSA_SRC (asrc);
1029 GST_ALSA_SRC_LOCK (asrc);
1030 GST_DEBUG_OBJECT (alsa, "drop");
1031 CHECK (snd_pcm_drop (alsa->handle), drop_error);
1032 GST_DEBUG_OBJECT (alsa, "prepare");
1033 CHECK (snd_pcm_prepare (alsa->handle), prepare_error);
1034 GST_DEBUG_OBJECT (alsa, "reset done");
1035 GST_ALSA_SRC_UNLOCK (asrc);
1042 GST_ERROR_OBJECT (alsa, "alsa-reset: pcm drop error: %s",
1043 snd_strerror (err));
1044 GST_ALSA_SRC_UNLOCK (asrc);
1049 GST_ERROR_OBJECT (alsa, "alsa-reset: pcm prepare error: %s",
1050 snd_strerror (err));
1051 GST_ALSA_SRC_UNLOCK (asrc);