X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ext%2Falsa%2Fgstalsasrc.c;h=82615e141d4f5ec7db71c19d12a163bb0e8089dd;hb=fb6d09055ae90979682fa4b1c6ee4f4abdaafd8f;hp=425dc7f5947925ea33c18a0a63d6610e4e0181cd;hpb=3fab57b5cf84180cbf95600071349e19214a9df0;p=platform%2Fupstream%2Fgstreamer.git diff --git a/ext/alsa/gstalsasrc.c b/ext/alsa/gstalsasrc.c index 425dc7f..82615e1 100644 --- a/ext/alsa/gstalsasrc.c +++ b/ext/alsa/gstalsasrc.c @@ -48,6 +48,7 @@ #include "gstalsasrc.h" #include "gstalsadeviceprobe.h" +#include "gst/glib-compat-private.h" #include @@ -81,18 +82,12 @@ static GstCaps *gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter); 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 @@ -164,10 +159,7 @@ gst_alsasrc_class_init (GstAlsaSrcClass * klass) 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); @@ -193,49 +185,6 @@ gst_alsasrc_class_init (GstAlsaSrcClass * klass) 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) @@ -286,57 +235,6 @@ gst_alsasrc_get_property (GObject * object, guint prop_id, } } -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) { @@ -344,7 +242,6 @@ 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 (); } @@ -368,7 +265,7 @@ gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter) 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) { @@ -385,6 +282,8 @@ gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter) 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); @@ -626,7 +525,7 @@ set_sw_params: } static gboolean -alsasrc_parse_spec (GstAlsaSrc * alsa, GstRingBufferSpec * spec) +alsasrc_parse_spec (GstAlsaSrc * alsa, GstAudioRingBufferSpec * spec) { switch (spec->type) { case GST_BUFTYPE_RAW: @@ -637,88 +536,88 @@ alsasrc_parse_spec (GstAlsaSrc * alsa, GstRingBufferSpec * spec) 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: @@ -785,7 +684,7 @@ open_error: } static gboolean -gst_alsasrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) +gst_alsasrc_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec) { GstAlsaSrc *alsa; gint err;