static void gst_alsasrc_reset (GstAudioSrc * asrc) { GstAlsaSrc *alsa; gint err; alsa = GST_ALSA_SRC (asrc); GST_ALSA_SRC_LOCK (asrc); GST_DEBUG_OBJECT (alsa, "drop"); CHECK (snd_pcm_drop (alsa->handle), drop_error); GST_DEBUG_OBJECT (alsa, "prepare"); CHECK (snd_pcm_prepare (alsa->handle), prepare_error); GST_DEBUG_OBJECT (alsa, "reset done"); GST_ALSA_SRC_UNLOCK (asrc); return; /* ERRORS */ drop_error: { GST_ERROR_OBJECT (alsa, "alsa-reset: pcm drop error: %s", snd_strerror (err)); GST_ALSA_SRC_UNLOCK (asrc); return; } prepare_error: { GST_ERROR_OBJECT (alsa, "alsa-reset: pcm prepare error: %s", snd_strerror (err)); GST_ALSA_SRC_UNLOCK (asrc); return; } }
static guint gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length, GstClockTime * timestamp) { GstAlsaSrc *alsa; gint err; gint cptr; guint8 *ptr = data; alsa = GST_ALSA_SRC (asrc); cptr = length / alsa->bpf; GST_ALSA_SRC_LOCK (asrc); while (cptr > 0) { GST_DELAY_SRC_LOCK (asrc); err = snd_pcm_readi (alsa->handle, ptr, cptr); GST_DELAY_SRC_UNLOCK (asrc); if (err < 0) { if (err == -EAGAIN) { GST_DEBUG_OBJECT (asrc, "Read error: %s", snd_strerror (err)); continue; } else if (err == -ENODEV) { goto device_disappeared; } else if (xrun_recovery (alsa, alsa->handle, err) < 0) { goto read_error; } continue; } ptr += snd_pcm_frames_to_bytes (alsa->handle, err); cptr -= err; } GST_ALSA_SRC_UNLOCK (asrc); /* if driver timestamps are enabled we need to return this here */ if (alsa->driver_timestamps && timestamp) *timestamp = gst_alsasrc_get_timestamp (alsa); return length - (cptr * alsa->bpf); read_error: { GST_ALSA_SRC_UNLOCK (asrc); return length; /* skip one period */ } device_disappeared: { GST_ELEMENT_ERROR (asrc, RESOURCE, READ, (_("Error recording from audio device. " "The device has been disconnected.")), (NULL)); GST_ALSA_SRC_UNLOCK (asrc); return (guint) - 1; } }