]> www.infradead.org Git - users/hch/misc.git/commitdiff
ALSA: compress_offload: Add SNDRV_COMPRESS_TSTAMP64 ioctl
authorJoris Verhaegen <verhaegen@google.com>
Fri, 5 Sep 2025 09:12:55 +0000 (10:12 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 8 Sep 2025 07:33:24 +0000 (09:33 +0200)
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
include/uapi/sound/compress_offload.h
sound/core/compress_offload.c

index abd0ea3f86eedcc5f79218f836b2967919fc374b..70b8921601f93196cd797c76cae4117b6949808a 100644 (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)
index d3164aa07158dc786d8acf3384bb81511c43964e..445220fdb6a0857601b3687b50b423ced90edc6e 100644 (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: