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: Miller Liang <millerliang@google.com>
Tested-by: Joris Verhaegen <verhaegen@google.com>
Signed-off-by: Joris Verhaegen <verhaegen@google.com>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Acked-by: Mark Brown <broonie@kernel.org>
Acked-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20250905091301.2711705-3-verhaegen@google.com
This commit is contained in:
Joris Verhaegen 2025-09-05 10:12:55 +01:00 committed by Takashi Iwai
parent 2c92e2fbe9
commit f20a53974f
2 changed files with 16 additions and 8 deletions

View file

@ -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)

View file

@ -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) {
snd_compr_tstamp32_from_64(&tstamp32, &tstamp64);
ret = copy_to_user((struct snd_compr_tstamp __user *)arg,
&tstamp32, sizeof(tstamp32)) ?
if (is_32bit) {
snd_compr_tstamp32_from_64(&tstamp32, &tstamp64);
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: