#include "gstalsasrc.h"
#include "gstalsadeviceprobe.h"
+#include "gst/glib-compat-private.h"
#include <gst/gst-i18n-plugin.h>
static gboolean gst_alsasrc_open (GstAudioSrc * asrc);
static gboolean gst_alsasrc_prepare (GstAudioSrc * asrc,
- GstRingBufferSpec * spec);
+ GstAudioRingBufferSpec * spec);
static gboolean gst_alsasrc_unprepare (GstAudioSrc * asrc);
static gboolean gst_alsasrc_close (GstAudioSrc * asrc);
static guint gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length);
static guint gst_alsasrc_delay (GstAudioSrc * asrc);
static void gst_alsasrc_reset (GstAudioSrc * asrc);
-static GstStateChangeReturn gst_alsasrc_change_state (GstElement * element,
- GstStateChange transition);
-static GstFlowReturn gst_alsasrc_create (GstBaseSrc * bsrc, guint64 offset,
- guint length, GstBuffer ** outbuf);
-static GstClockTime gst_alsasrc_get_timestamp (GstAlsaSrc * src);
-
/* AlsaSrc signals and args */
enum
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&alsasrc_src_factory));
- gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_alsasrc_change_state);
-
gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_alsasrc_getcaps);
- gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_alsasrc_create);
gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_alsasrc_open);
gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_alsasrc_prepare);
DEFAULT_PROP_CARD_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
}
-static GstClockTime
-gst_alsasrc_get_timestamp (GstAlsaSrc * src)
-{
- snd_pcm_status_t *status;
- snd_htimestamp_t tstamp;
- GstClockTime timestamp;
- snd_pcm_uframes_t availmax;
-
- GST_DEBUG_OBJECT (src, "Getting alsa timestamp!");
-
- if (!src) {
- GST_ERROR_OBJECT (src, "No alsa handle created yet !");
- return 0;
- }
-
- if (snd_pcm_status_malloc (&status) != 0) {
- GST_ERROR_OBJECT (src, "snd_pcm_status_malloc failed");
- }
-
- if (snd_pcm_status (src->handle, status) != 0) {
- GST_ERROR_OBJECT (src, "snd_pcm_status failed");
- }
-
- /* get high resolution time stamp from driver */
- snd_pcm_status_get_htstamp (status, &tstamp);
- timestamp = GST_TIMESPEC_TO_TIME (tstamp);
-
- /* Max available frames sets the depth of the buffer */
- availmax = snd_pcm_status_get_avail_max (status);
-
- /* Compensate the fact that the timestamp references the last sample */
- timestamp -= gst_util_uint64_scale_int (availmax * 2, GST_SECOND, src->rate);
- /* Compensate for the delay until the package is available */
- timestamp += gst_util_uint64_scale_int (snd_pcm_status_get_delay (status),
- GST_SECOND, src->rate);
-
- snd_pcm_status_free (status);
-
- GST_DEBUG_OBJECT (src, "ALSA timestamp : %" GST_TIME_FORMAT,
- GST_TIME_ARGS (timestamp));
- return timestamp;
-}
-
static void
gst_alsasrc_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
}
}
-static GstStateChangeReturn
-gst_alsasrc_change_state (GstElement * element, GstStateChange transition)
-{
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
- GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (element);
- GstAlsaSrc *asrc = GST_ALSA_SRC (element);
- GstClock *clk;
-
- switch (transition) {
- /* Show the compiler that we care */
- case GST_STATE_CHANGE_NULL_TO_READY:
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- case GST_STATE_CHANGE_READY_TO_NULL:
- break;
-
- case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
- clk = src->clock;
- asrc->driver_timestamps = FALSE;
- if (GST_IS_SYSTEM_CLOCK (clk)) {
- gint clocktype;
- g_object_get (clk, "clock-type", &clocktype, NULL);
- if (clocktype == GST_CLOCK_TYPE_MONOTONIC) {
- asrc->driver_timestamps = TRUE;
- }
- }
- break;
- }
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- return ret;
-}
-
-static GstFlowReturn
-gst_alsasrc_create (GstBaseSrc * bsrc, guint64 offset, guint length,
- GstBuffer ** outbuf)
-{
- GstFlowReturn ret = GST_FLOW_OK;
- GstAlsaSrc *asrc = GST_ALSA_SRC (bsrc);
-
- ret =
- GST_BASE_SRC_CLASS (parent_class)->create (bsrc, offset, length, outbuf);
- if (asrc->driver_timestamps == TRUE && *outbuf) {
- GST_BUFFER_TIMESTAMP (*outbuf) =
- gst_alsasrc_get_timestamp ((GstAlsaSrc *) bsrc);
- }
-
- return ret;
-}
-
static void
gst_alsasrc_init (GstAlsaSrc * alsasrc)
{
alsasrc->device = g_strdup (DEFAULT_PROP_DEVICE);
alsasrc->cached_caps = NULL;
- alsasrc->driver_timestamps = FALSE;
alsasrc->alsa_lock = g_mutex_new ();
}
if (src->handle == NULL) {
GST_DEBUG_OBJECT (src, "device not open, using template caps");
- return NULL; /* base class will get template caps for us */
+ return GST_BASE_SRC_CLASS (parent_class)->get_caps (bsrc, filter);
}
if (src->cached_caps) {
g_return_val_if_fail (pad_template != NULL, NULL);
templ_caps = gst_pad_template_get_caps (pad_template);
+ GST_INFO_OBJECT (src, "template caps %" GST_PTR_FORMAT, templ_caps);
+
caps = gst_alsa_probe_supported_formats (GST_OBJECT (src), src->handle,
templ_caps);
gst_caps_unref (templ_caps);
}
static gboolean
-alsasrc_parse_spec (GstAlsaSrc * alsa, GstRingBufferSpec * spec)
+alsasrc_parse_spec (GstAlsaSrc * alsa, GstAudioRingBufferSpec * spec)
{
switch (spec->type) {
case GST_BUFTYPE_RAW:
case GST_AUDIO_FORMAT_S8:
alsa->format = SND_PCM_FORMAT_S8;
break;
- case GST_AUDIO_FORMAT_S16_LE:
+ case GST_AUDIO_FORMAT_S16LE:
alsa->format = SND_PCM_FORMAT_S16_LE;
break;
- case GST_AUDIO_FORMAT_S16_BE:
+ case GST_AUDIO_FORMAT_S16BE:
alsa->format = SND_PCM_FORMAT_S16_BE;
break;
- case GST_AUDIO_FORMAT_U16_LE:
+ case GST_AUDIO_FORMAT_U16LE:
alsa->format = SND_PCM_FORMAT_U16_LE;
break;
- case GST_AUDIO_FORMAT_U16_BE:
+ case GST_AUDIO_FORMAT_U16BE:
alsa->format = SND_PCM_FORMAT_U16_BE;
break;
- case GST_AUDIO_FORMAT_S24_LE:
+ case GST_AUDIO_FORMAT_S24_32LE:
alsa->format = SND_PCM_FORMAT_S24_LE;
break;
- case GST_AUDIO_FORMAT_S24_BE:
+ case GST_AUDIO_FORMAT_S24_32BE:
alsa->format = SND_PCM_FORMAT_S24_BE;
break;
- case GST_AUDIO_FORMAT_U24_LE:
+ case GST_AUDIO_FORMAT_U24_32LE:
alsa->format = SND_PCM_FORMAT_U24_LE;
break;
- case GST_AUDIO_FORMAT_U24_BE:
+ case GST_AUDIO_FORMAT_U24_32BE:
alsa->format = SND_PCM_FORMAT_U24_BE;
break;
- case GST_AUDIO_FORMAT_S32_LE:
+ case GST_AUDIO_FORMAT_S32LE:
alsa->format = SND_PCM_FORMAT_S32_LE;
break;
- case GST_AUDIO_FORMAT_S32_BE:
+ case GST_AUDIO_FORMAT_S32BE:
alsa->format = SND_PCM_FORMAT_S32_BE;
break;
- case GST_AUDIO_FORMAT_U32_LE:
+ case GST_AUDIO_FORMAT_U32LE:
alsa->format = SND_PCM_FORMAT_U32_LE;
break;
- case GST_AUDIO_FORMAT_U32_BE:
+ case GST_AUDIO_FORMAT_U32BE:
alsa->format = SND_PCM_FORMAT_U32_BE;
break;
- case GST_AUDIO_FORMAT_S24_3LE:
+ case GST_AUDIO_FORMAT_S24LE:
alsa->format = SND_PCM_FORMAT_S24_3LE;
break;
- case GST_AUDIO_FORMAT_S24_3BE:
+ case GST_AUDIO_FORMAT_S24BE:
alsa->format = SND_PCM_FORMAT_S24_3BE;
break;
- case GST_AUDIO_FORMAT_U24_3LE:
+ case GST_AUDIO_FORMAT_U24LE:
alsa->format = SND_PCM_FORMAT_U24_3LE;
break;
- case GST_AUDIO_FORMAT_U24_3BE:
+ case GST_AUDIO_FORMAT_U24BE:
alsa->format = SND_PCM_FORMAT_U24_3BE;
break;
- case GST_AUDIO_FORMAT_S20_3LE:
+ case GST_AUDIO_FORMAT_S20LE:
alsa->format = SND_PCM_FORMAT_S20_3LE;
break;
- case GST_AUDIO_FORMAT_S20_3BE:
+ case GST_AUDIO_FORMAT_S20BE:
alsa->format = SND_PCM_FORMAT_S20_3BE;
break;
- case GST_AUDIO_FORMAT_U20_3LE:
+ case GST_AUDIO_FORMAT_U20LE:
alsa->format = SND_PCM_FORMAT_U20_3LE;
break;
- case GST_AUDIO_FORMAT_U20_3BE:
+ case GST_AUDIO_FORMAT_U20BE:
alsa->format = SND_PCM_FORMAT_U20_3BE;
break;
- case GST_AUDIO_FORMAT_S18_3LE:
+ case GST_AUDIO_FORMAT_S18LE:
alsa->format = SND_PCM_FORMAT_S18_3LE;
break;
- case GST_AUDIO_FORMAT_S18_3BE:
+ case GST_AUDIO_FORMAT_S18BE:
alsa->format = SND_PCM_FORMAT_S18_3BE;
break;
- case GST_AUDIO_FORMAT_U18_3LE:
+ case GST_AUDIO_FORMAT_U18LE:
alsa->format = SND_PCM_FORMAT_U18_3LE;
break;
- case GST_AUDIO_FORMAT_U18_3BE:
+ case GST_AUDIO_FORMAT_U18BE:
alsa->format = SND_PCM_FORMAT_U18_3BE;
break;
- case GST_AUDIO_FORMAT_F32_LE:
+ case GST_AUDIO_FORMAT_F32LE:
alsa->format = SND_PCM_FORMAT_FLOAT_LE;
break;
- case GST_AUDIO_FORMAT_F32_BE:
+ case GST_AUDIO_FORMAT_F32BE:
alsa->format = SND_PCM_FORMAT_FLOAT_BE;
break;
- case GST_AUDIO_FORMAT_F64_LE:
+ case GST_AUDIO_FORMAT_F64LE:
alsa->format = SND_PCM_FORMAT_FLOAT64_LE;
break;
- case GST_AUDIO_FORMAT_F64_BE:
+ case GST_AUDIO_FORMAT_F64BE:
alsa->format = SND_PCM_FORMAT_FLOAT64_BE;
break;
default:
}
static gboolean
-gst_alsasrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
+gst_alsasrc_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
{
GstAlsaSrc *alsa;
gint err;