int (*get_hpointer)(void *compress_data,
unsigned int *avail, struct timespec *tstamp);
int (*get_tstamp)(void *compress_data,
- unsigned int *samples, unsigned int *sampling_rate);
- int (*get_tstamp64)(void *compress_data,
unsigned long long *samples, unsigned int *sampling_rate);
int (*write)(void *compress_data, const void *buf, size_t size);
int (*read)(void *compress_data, void *buf, size_t size);
int compress_get_tstamp(struct compress *compress,
unsigned int *samples, unsigned int *sampling_rate)
{
- return compress->ops->get_tstamp(compress->data, samples, sampling_rate);
+ unsigned long long _samples;
+ int ret;
+
+ ret = compress->ops->get_tstamp(compress->data, &_samples, sampling_rate);
+ if (ret >= 0)
+ *samples = (unsigned int)_samples;
+ return ret;
}
int compress_get_tstamp64(struct compress *compress,
unsigned long long *samples, unsigned int *sampling_rate)
{
- return compress->ops->get_tstamp64(compress->data, samples, sampling_rate);
+ return compress->ops->get_tstamp(compress->data, samples, sampling_rate);
}
int compress_write(struct compress *compress, const void *buf, unsigned int size)
return 0;
}
-static int compress_hw_get_tstamp(void *data,
- unsigned int *samples, unsigned int *sampling_rate)
+static int compress_hw_get_tstamp_32(struct compress_hw_data *compress,
+ unsigned long long *samples, unsigned int *sampling_rate)
{
- struct compress_hw_data *compress = (struct compress_hw_data *)data;
struct snd_compr_tstamp ktstamp;
- if (!is_compress_hw_ready(compress))
- return oops(compress, ENODEV, "device not ready");
-
if (ioctl(compress->fd, SNDRV_COMPRESS_TSTAMP, &ktstamp))
return oops(compress, errno, "cannot get tstamp");
return 0;
}
-static int compress_hw_get_tstamp64(void *data,
+static int compress_hw_get_tstamp_64(struct compress_hw_data *compress,
unsigned long long *samples, unsigned int *sampling_rate)
{
- struct compress_hw_data *compress = (struct compress_hw_data *)data;
struct snd_compr_tstamp64 ktstamp;
- if (!is_compress_hw_ready(compress))
- return oops(compress, ENODEV, "device not ready");
-
if (ioctl(compress->fd, SNDRV_COMPRESS_TSTAMP64, &ktstamp))
return oops(compress, errno, "cannot get tstamp64");
return 0;
}
+static int compress_hw_get_tstamp(void *data,
+ unsigned long long *samples, unsigned int *sampling_rate)
+{
+ struct compress_hw_data *compress = (struct compress_hw_data *)data;
+
+ if (!is_compress_hw_ready(compress))
+ return oops(compress, ENODEV, "device not ready");
+
+ if (get_compress_hw_version(compress) >= SNDRV_PROTOCOL_VERSION(0, 4, 0))
+ return compress_hw_get_tstamp_64(compress, samples, sampling_rate);
+ else
+ return compress_hw_get_tstamp_32(compress, samples, sampling_rate);
+}
+
static int compress_hw_write(void *data, const void *buf, size_t size)
{
struct compress_hw_data *compress = (struct compress_hw_data *)data;
.close = compress_hw_close,
.get_hpointer = compress_hw_get_hpointer,
.get_tstamp = compress_hw_get_tstamp,
- .get_tstamp64 = compress_hw_get_tstamp64,
.write = compress_hw_write,
.read = compress_hw_read,
.start = compress_hw_start,