Commit f20a5397 authored by Joris Verhaegen's avatar Joris Verhaegen Committed by Takashi Iwai
Browse files

ALSA: compress_offload: Add SNDRV_COMPRESS_TSTAMP64 ioctl



The previous patch introduced the internal infrastructure for handling
64-bit timestamps. This patch exposes this capability to user-space.

Define the new ioctl command SNDRV_COMPRESS_TSTAMP64, which allows
applications to fetch the overflow-safe struct snd_compr_tstamp64.

The ioctl dispatch table is updated to handle the new command by
calling a new snd_compr_tstamp64 handler, while the legacy path is
renamed to snd_compr_tstamp32 for clarity.

This patch bumps the SNDRV_COMPRESS_VERSION to 0.4.0.

Reviewed-by: default avatarMiller Liang <millerliang@google.com>
Tested-by: default avatarJoris Verhaegen <verhaegen@google.com>
Signed-off-by: default avatarJoris Verhaegen <verhaegen@google.com>
Reviewed-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Acked-by: default avatarMark Brown <broonie@kernel.org>
Acked-by: default avatarVinod Koul <vkoul@kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20250905091301.2711705-3-verhaegen@google.com
parent 2c92e2fb
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -13,8 +13,7 @@
#include <sound/asound.h>
#include <sound/compress_params.h>


#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 3, 0)
#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 4, 0)
/**
 * struct snd_compressed_buffer - compressed buffer
 * @fragment_size: size of buffer fragment in bytes
@@ -208,6 +207,7 @@ struct snd_compr_task_status {
 * Note: only codec params can be changed runtime and stream params cant be
 * SNDRV_COMPRESS_GET_PARAMS: Query codec params
 * SNDRV_COMPRESS_TSTAMP: get the current timestamp value
 * SNDRV_COMPRESS_TSTAMP64: get the current timestamp value in 64 bit format
 * SNDRV_COMPRESS_AVAIL: get the current buffer avail value.
 * This also queries the tstamp properties
 * SNDRV_COMPRESS_PAUSE: Pause the running stream
@@ -230,6 +230,7 @@ struct snd_compr_task_status {
						 struct snd_compr_metadata)
#define SNDRV_COMPRESS_TSTAMP		_IOR('C', 0x20, struct snd_compr_tstamp)
#define SNDRV_COMPRESS_AVAIL		_IOR('C', 0x21, struct snd_compr_avail)
#define SNDRV_COMPRESS_TSTAMP64		_IOR('C', 0x22, struct snd_compr_tstamp64)
#define SNDRV_COMPRESS_PAUSE		_IO('C', 0x30)
#define SNDRV_COMPRESS_RESUME		_IO('C', 0x31)
#define SNDRV_COMPRESS_START		_IO('C', 0x32)
+13 −6
Original line number Diff line number Diff line
@@ -736,18 +736,23 @@ snd_compr_set_metadata(struct snd_compr_stream *stream, unsigned long arg)
	return retval;
}

static inline int
snd_compr_tstamp(struct snd_compr_stream *stream, unsigned long arg)
static inline int snd_compr_tstamp(struct snd_compr_stream *stream,
				   unsigned long arg, bool is_32bit)
{
	struct snd_compr_tstamp64 tstamp64 = { 0 };
	struct snd_compr_tstamp tstamp32 = { 0 };
	const void *copy_from = &tstamp64;
	size_t copy_size = sizeof(tstamp64);
	int ret;

	ret = snd_compr_update_tstamp(stream, &tstamp64);
	if (ret == 0) {
		if (is_32bit) {
			snd_compr_tstamp32_from_64(&tstamp32, &tstamp64);
		ret = copy_to_user((struct snd_compr_tstamp __user *)arg,
				   &tstamp32, sizeof(tstamp32)) ?
			copy_from = &tstamp32;
			copy_size = sizeof(tstamp32);
		}
		ret = copy_to_user((void __user *)arg, copy_from, copy_size) ?
			      -EFAULT :
			      0;
	}
@@ -1327,7 +1332,9 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)

	switch (cmd) {
	case SNDRV_COMPRESS_TSTAMP:
		return snd_compr_tstamp(stream, arg);
		return snd_compr_tstamp(stream, arg, true);
	case SNDRV_COMPRESS_TSTAMP64:
		return snd_compr_tstamp(stream, arg, false);
	case SNDRV_COMPRESS_AVAIL:
		return snd_compr_ioctl_avail(stream, arg);
	case SNDRV_COMPRESS_PAUSE: