tinycompress: Add support for compress_set_codec_params API

Add support for compress_set_codec_params API which is used
to send codec parameters from clients directly.

CRs-Fixed: 2926417

Change-Id: I83f52378e288f15bccfc8a7798d33943a02d5e52
diff --git a/compress.c b/compress.c
index ac2c73f..c4276f6 100644
--- a/compress.c
+++ b/compress.c
@@ -619,6 +619,23 @@
 	return oops(compress, EIO, "poll signalled unhandled event");
 }
 
+int compress_set_codec_params(struct compress *compress,
+	struct snd_codec *codec) {
+	struct snd_compr_params params;
+
+	if (!is_compress_running(compress))
+		return oops(compress, ENODEV, "device not ready");
+
+	params.buffer.fragment_size = compress->config->fragment_size;
+	params.buffer.fragments = compress->config->fragments;
+	memcpy(&params.codec, codec, sizeof(params.codec));
+
+	if (compress->ops->ioctl(compress->data, SNDRV_COMPRESS_SET_PARAMS, &params))
+		return oops(compress, errno, "cannot set device");
+
+	return 0;
+}
+
 #ifdef ENABLE_EXTENDED_COMPRESS_FORMAT
 int compress_get_metadata(struct compress *compress,
 		struct snd_compr_metadata *mdata) {
diff --git a/compress_plugin.c b/compress_plugin.c
index 7a5538d..eac0f38 100644
--- a/compress_plugin.c
+++ b/compress_plugin.c
@@ -84,7 +84,9 @@
 	struct compress_plugin *plugin = plug_data->plugin;
 	int rc;
 
-	if (plugin->state != COMPRESS_PLUG_STATE_OPEN)
+	if (plugin->state == COMPRESS_PLUG_STATE_RUNNING)
+		return plugin->ops->set_params(plugin, params);
+	else if (plugin->state != COMPRESS_PLUG_STATE_OPEN)
 		return -EBADFD;
 
 	if (params->buffer.fragment_size == 0 ||
diff --git a/include/tinycompress/tinycompress.h b/include/tinycompress/tinycompress.h
index 0ab7134..d430e4d 100644
--- a/include/tinycompress/tinycompress.h
+++ b/include/tinycompress/tinycompress.h
@@ -309,6 +309,17 @@
 /* utility functions */
 unsigned int compress_get_alsa_rate(unsigned int rate);
 
+ /*
+  * compress_set_codec_params: set codec config intended for next track
+  * if DSP has support to switch CODEC config during gapless playback
+  * This API is expected to be called after compress_next_track is called
+  * return 0 on success, negative on error
+  *
+  * @compress: compress stream for which metadata has to set
+  * @codec: codec configuration for next track
+  */
+int compress_set_codec_params(struct compress *compress, struct snd_codec *codec);
+
 #ifdef ENABLE_EXTENDED_COMPRESS_FORMAT
 /* set metadata */
 int compress_set_metadata(struct compress *compress,