-static GstClockTime
-gst_alsasrc_get_timestamp (GstAlsaSrc * src)
-{
- snd_pcm_status_t *status;
- snd_htimestamp_t htstamp;
- snd_timestamp_t tstamp;
- GstClockTime timestamp;
- snd_pcm_uframes_t availmax;
- gint64 offset;
-
- GST_DEBUG_OBJECT (src, "Getting alsa timestamp!");
-
- if (!src) {
- GST_ERROR_OBJECT (src, "No alsa handle created yet !");
- return GST_CLOCK_TIME_NONE;
- }
-
- if (snd_pcm_status_malloc (&status) != 0) {
- GST_ERROR_OBJECT (src, "snd_pcm_status_malloc failed");
- return GST_CLOCK_TIME_NONE;
- }
-
- if (snd_pcm_status (src->handle, status) != 0) {
- GST_ERROR_OBJECT (src, "snd_pcm_status failed");
- snd_pcm_status_free (status);
- return GST_CLOCK_TIME_NONE;
- }
-
- /* get high resolution time stamp from driver */
- snd_pcm_status_get_htstamp (status, &htstamp);
- timestamp = GST_TIMESPEC_TO_TIME (htstamp);
- if (timestamp == 0) {
- GST_INFO_OBJECT (src,
- "This alsa source does support high resolution timestamps");
- snd_pcm_status_get_tstamp (status, &tstamp);
- timestamp = GST_TIMEVAL_TO_TIME (tstamp);
- if (timestamp == 0) {
- GST_INFO_OBJECT (src,
- "This alsa source does support low resolution timestamps");
- timestamp = gst_util_get_timestamp ();
- }
- }
- GST_DEBUG_OBJECT (src, "Base ts: %" GST_TIME_FORMAT,
- GST_TIME_ARGS (timestamp));
- if (timestamp == 0) {
- /* This timestamp is supposed to represent the last sample, so 0 (which
- can be returned on some ALSA setups (such as mine)) must mean that it
- is invalid, unless there's just one sample, but we'll ignore that. */
- GST_WARNING_OBJECT (src,
- "No timestamp returned from snd_pcm_status_get_htstamp");
- return GST_CLOCK_TIME_NONE;
- }
-
- /* 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 */
- offset = -gst_util_uint64_scale_int (availmax * 2, GST_SECOND, src->rate);
- /* Compensate for the delay until the package is available */
- offset += gst_util_uint64_scale_int (snd_pcm_status_get_delay (status),
- GST_SECOND, src->rate);
-
- snd_pcm_status_free (status);
-
- /* just in case, should not happen */
- if (-offset > timestamp)
- timestamp = 0;
- else
- timestamp -= offset;
-
- /* Take first ts into account */
- if (src->first_alsa_ts == GST_CLOCK_TIME_NONE) {
- src->first_alsa_ts = timestamp;
- }
- timestamp -= src->first_alsa_ts;
-
- GST_DEBUG_OBJECT (src, "ALSA timestamp : %" GST_TIME_FORMAT,
- GST_TIME_ARGS (timestamp));
- return timestamp;
-}
-