]> git.alsa-project.org Git - tinycompress.git/commitdiff
src: lib: Add API to set codec parameters for next track
authorMohammad Rafi Shaik <quic_mohs@quicinc.com>
Tue, 1 Nov 2022 07:59:27 +0000 (13:29 +0530)
committerJaroslav Kysela <perex@perex.cz>
Wed, 22 Nov 2023 08:08:06 +0000 (09:08 +0100)
For gapless playback usecase where each track differs in encoding,
new codec parameters that need to be propagated to kernel is done
via compress_set_codec_params()

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Mohammad Rafi Shaik <quic_mohs@quicinc.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
include/tinycompress/compress_ops.h
include/tinycompress/tinycompress.h
src/lib/compress.c
src/lib/compress_hw.c

index 9b204a6e7680699fc7204e1e8bb0d73f8cb5a26b..2ee8d156475cd8ad59ef7378a33bf13f6880abc8 100644 (file)
@@ -42,6 +42,7 @@ struct compress_ops {
        int (*is_compress_running)(void *compress_data);
        int (*is_compress_ready)(void *compress_data);
        const char *(*get_error)(void *compress_data);
+       int (*set_codec_params)(void *compress_data, struct snd_codec *codec);
 };
 
 #endif /* end of __COMPRESS_OPS_H__ */
index c710a6198d7ebc2984ab8dc8a9eacc471a7346a1..a8b4e589b9d5f130558a09d5e5e739c3485cefba 100644 (file)
@@ -307,6 +307,17 @@ int is_compress_ready(struct compress *compress);
 /* Returns a human readable reason for the last error */
 const char *compress_get_error(struct compress *compress);
 
+/*
+ * compress_set_param: set codec config intended for next track
+ * if DSP has support to switch CODEC config during gapless playback
+ *
+ * return 0 on success, negative on error
+ *
+ * @compress: compress stream for which metadata has to set
+ * @config: stream config for next track
+ */
+int compress_set_codec_params(struct compress *compress, struct snd_codec *codec);
+
 #if defined(__cplusplus)
 } // extern "C"
 #endif
index 68f1b55c710319cc2f08b97a967ac91b3660c9d5..5a8fd04514c6b1299424ac2702ccd5e7d1d9bcfe 100644 (file)
@@ -310,3 +310,7 @@ int compress_wait(struct compress *compress, int timeout_ms)
        return compress->ops->wait(compress->data, timeout_ms);
 }
 
+int compress_set_codec_params(struct compress *compress, struct snd_codec *codec)
+{
+       return compress->ops->set_codec_params(compress->data, codec);
+}
index 9944f0e1a333798aa20abbb311a7640d84736451..5aabae021aac3294f04ff172f3e705b81d27ceb7 100644 (file)
@@ -573,6 +573,31 @@ static int compress_hw_wait(void *data, int timeout_ms)
        return oops(compress, EIO, "poll signalled unhandled event");
 }
 
+static int compress_hw_set_codec_params(void *data, struct snd_codec *codec)
+{
+       struct compress_hw_data *compress = (struct compress_hw_data *)data;
+       struct snd_compr_params params;
+
+       if (!is_compress_hw_ready(compress))
+               return oops(compress, ENODEV, "device not ready\n");
+
+       if (!codec)
+               return oops(compress, EINVAL, "passed bad config\n");
+
+       if (!compress->next_track)
+               return oops(compress, EPERM,
+                           "set CODEC params while next track not signalled is not allowed");
+
+       params.buffer.fragment_size = compress->config->fragment_size;
+       params.buffer.fragments = compress->config->fragments;
+       memcpy(&params.codec, codec, sizeof(params.codec));
+
+       if (ioctl(compress->fd, SNDRV_COMPRESS_SET_PARAMS, &params))
+               return oops(compress, errno, "cannot set param for next track\n");
+
+       return 0;
+}
+
 struct compress_ops compress_hw_ops = {
        .open_by_name = compress_hw_open_by_name,
        .close = compress_hw_close,
@@ -595,5 +620,6 @@ struct compress_ops compress_hw_ops = {
        .is_compress_running = is_compress_hw_running,
        .is_compress_ready = is_compress_hw_ready,
        .get_error = compress_hw_get_error,
+       .set_codec_params = compress_hw_set_codec_params,
 };