From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> To: broonie@kernel.org Cc: vkoul@kernel.org, perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, ckeepax@opensource.cirrus.com, Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Subject: [RFC PATCH v2 2/6] ALSA: compress: add new ioctl for setting codec parameters Date: Tue, 21 Jul 2020 18:00:03 +0100 [thread overview] Message-ID: <20200721170007.4554-3-srinivas.kandagatla@linaro.org> (raw) In-Reply-To: <20200721170007.4554-1-srinivas.kandagatla@linaro.org> For gapless playback it is possible that each track can have different codec profile with same decoder, for example we have WMA album, we may have different tracks as WMA v9, WMA v10 and so on Or if DSP's like QDSP have abililty to switch decoders on single stream for each track, then this call could be used to set new codec parameters. Existing code does not allow to change this profile while doing gapless playback. This patch adds new SNDRV_COMPRESS_SET_CODEC_PARAMS IOCTL to allow userspace to set this new parameters required for new codec profile. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> --- .../sound/designs/compress-offload.rst | 6 ++++ include/sound/compress_driver.h | 5 +++ include/uapi/sound/compress_offload.h | 1 + sound/core/compress_offload.c | 34 +++++++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/Documentation/sound/designs/compress-offload.rst b/Documentation/sound/designs/compress-offload.rst index 935f325dbc77..305ccc7bfdd9 100644 --- a/Documentation/sound/designs/compress-offload.rst +++ b/Documentation/sound/designs/compress-offload.rst @@ -128,6 +128,12 @@ set_params cases decoders will ignore other fields, while encoders will strictly comply to the settings +set_codec_params + This routine is very much simillar to set_params but exculding stream + information. Only codec related information is set as part of this. + It is used in gapless playback where its required to change decoder + or its parameters for next track. This is optional. + get_params This routines returns the actual settings used by the DSP. Changes to the settings should remain the exception. diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h index 70cbc5095e72..d9c00bcfce9b 100644 --- a/include/sound/compress_driver.h +++ b/include/sound/compress_driver.h @@ -93,6 +93,9 @@ struct snd_compr_stream { * @set_params: Sets the compressed stream parameters, mandatory * This can be called in during stream creation only to set codec params * and the stream properties + * @set_codec_params: Sets the compressed stream codec parameters, Optional + * This can be called in during gapless next track codec change only to set + * codec params * @get_params: retrieve the codec parameters, mandatory * @set_metadata: Set the metadata values for a stream * @get_metadata: retrieves the requested metadata values from stream @@ -112,6 +115,8 @@ struct snd_compr_ops { int (*free)(struct snd_compr_stream *stream); int (*set_params)(struct snd_compr_stream *stream, struct snd_compr_params *params); + int (*set_codec_params)(struct snd_compr_stream *stream, + struct snd_codec *params); int (*get_params)(struct snd_compr_stream *stream, struct snd_codec *params); int (*set_metadata)(struct snd_compr_stream *stream, diff --git a/include/uapi/sound/compress_offload.h b/include/uapi/sound/compress_offload.h index 7184265c0b0d..c46286113a4b 100644 --- a/include/uapi/sound/compress_offload.h +++ b/include/uapi/sound/compress_offload.h @@ -172,6 +172,7 @@ struct snd_compr_metadata { struct snd_compr_metadata) #define SNDRV_COMPRESS_GET_METADATA _IOWR('C', 0x15,\ struct snd_compr_metadata) +#define SNDRV_COMPRESS_SET_CODEC_PARAMS _IOW('C', 0x16, struct snd_codec) #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_PAUSE _IO('C', 0x30) diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index af5824113246..184722643c97 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -590,6 +590,37 @@ static int snd_compress_check_input(struct snd_compr_params *params) } +static int snd_compr_set_codec_params(struct snd_compr_stream *stream, + unsigned long arg) +{ + struct snd_codec *params; + int retval; + + if (!stream->ops->set_codec_params) + return -EPERM; + + if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) + return -EPERM; + + /* codec params can be only set when next track has been signalled */ + if (stream->next_track == false) + return -EPERM; + + params = memdup_user((void __user *)arg, sizeof(*params)); + if (IS_ERR(params)) + return PTR_ERR(params); + + retval = snd_compress_check_codec_params(params); + if (retval) + goto out; + + retval = stream->ops->set_codec_params(stream, params); + +out: + kfree(params); + return retval; +} + static int snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg) { @@ -973,6 +1004,9 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) case _IOC_NR(SNDRV_COMPRESS_GET_PARAMS): retval = snd_compr_get_params(stream, arg); break; + case _IOC_NR(SNDRV_COMPRESS_SET_CODEC_PARAMS): + retval = snd_compr_set_codec_params(stream, arg); + break; case _IOC_NR(SNDRV_COMPRESS_SET_METADATA): retval = snd_compr_set_metadata(stream, arg); break; -- 2.21.0
WARNING: multiple messages have this Message-ID (diff)
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> To: broonie@kernel.org Cc: alsa-devel@alsa-project.org, ckeepax@opensource.cirrus.com, tiwai@suse.com, lgirdwood@gmail.com, linux-kernel@vger.kernel.org, vkoul@kernel.org, Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Subject: [RFC PATCH v2 2/6] ALSA: compress: add new ioctl for setting codec parameters Date: Tue, 21 Jul 2020 18:00:03 +0100 [thread overview] Message-ID: <20200721170007.4554-3-srinivas.kandagatla@linaro.org> (raw) In-Reply-To: <20200721170007.4554-1-srinivas.kandagatla@linaro.org> For gapless playback it is possible that each track can have different codec profile with same decoder, for example we have WMA album, we may have different tracks as WMA v9, WMA v10 and so on Or if DSP's like QDSP have abililty to switch decoders on single stream for each track, then this call could be used to set new codec parameters. Existing code does not allow to change this profile while doing gapless playback. This patch adds new SNDRV_COMPRESS_SET_CODEC_PARAMS IOCTL to allow userspace to set this new parameters required for new codec profile. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> --- .../sound/designs/compress-offload.rst | 6 ++++ include/sound/compress_driver.h | 5 +++ include/uapi/sound/compress_offload.h | 1 + sound/core/compress_offload.c | 34 +++++++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/Documentation/sound/designs/compress-offload.rst b/Documentation/sound/designs/compress-offload.rst index 935f325dbc77..305ccc7bfdd9 100644 --- a/Documentation/sound/designs/compress-offload.rst +++ b/Documentation/sound/designs/compress-offload.rst @@ -128,6 +128,12 @@ set_params cases decoders will ignore other fields, while encoders will strictly comply to the settings +set_codec_params + This routine is very much simillar to set_params but exculding stream + information. Only codec related information is set as part of this. + It is used in gapless playback where its required to change decoder + or its parameters for next track. This is optional. + get_params This routines returns the actual settings used by the DSP. Changes to the settings should remain the exception. diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h index 70cbc5095e72..d9c00bcfce9b 100644 --- a/include/sound/compress_driver.h +++ b/include/sound/compress_driver.h @@ -93,6 +93,9 @@ struct snd_compr_stream { * @set_params: Sets the compressed stream parameters, mandatory * This can be called in during stream creation only to set codec params * and the stream properties + * @set_codec_params: Sets the compressed stream codec parameters, Optional + * This can be called in during gapless next track codec change only to set + * codec params * @get_params: retrieve the codec parameters, mandatory * @set_metadata: Set the metadata values for a stream * @get_metadata: retrieves the requested metadata values from stream @@ -112,6 +115,8 @@ struct snd_compr_ops { int (*free)(struct snd_compr_stream *stream); int (*set_params)(struct snd_compr_stream *stream, struct snd_compr_params *params); + int (*set_codec_params)(struct snd_compr_stream *stream, + struct snd_codec *params); int (*get_params)(struct snd_compr_stream *stream, struct snd_codec *params); int (*set_metadata)(struct snd_compr_stream *stream, diff --git a/include/uapi/sound/compress_offload.h b/include/uapi/sound/compress_offload.h index 7184265c0b0d..c46286113a4b 100644 --- a/include/uapi/sound/compress_offload.h +++ b/include/uapi/sound/compress_offload.h @@ -172,6 +172,7 @@ struct snd_compr_metadata { struct snd_compr_metadata) #define SNDRV_COMPRESS_GET_METADATA _IOWR('C', 0x15,\ struct snd_compr_metadata) +#define SNDRV_COMPRESS_SET_CODEC_PARAMS _IOW('C', 0x16, struct snd_codec) #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_PAUSE _IO('C', 0x30) diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index af5824113246..184722643c97 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -590,6 +590,37 @@ static int snd_compress_check_input(struct snd_compr_params *params) } +static int snd_compr_set_codec_params(struct snd_compr_stream *stream, + unsigned long arg) +{ + struct snd_codec *params; + int retval; + + if (!stream->ops->set_codec_params) + return -EPERM; + + if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) + return -EPERM; + + /* codec params can be only set when next track has been signalled */ + if (stream->next_track == false) + return -EPERM; + + params = memdup_user((void __user *)arg, sizeof(*params)); + if (IS_ERR(params)) + return PTR_ERR(params); + + retval = snd_compress_check_codec_params(params); + if (retval) + goto out; + + retval = stream->ops->set_codec_params(stream, params); + +out: + kfree(params); + return retval; +} + static int snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg) { @@ -973,6 +1004,9 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) case _IOC_NR(SNDRV_COMPRESS_GET_PARAMS): retval = snd_compr_get_params(stream, arg); break; + case _IOC_NR(SNDRV_COMPRESS_SET_CODEC_PARAMS): + retval = snd_compr_set_codec_params(stream, arg); + break; case _IOC_NR(SNDRV_COMPRESS_SET_METADATA): retval = snd_compr_set_metadata(stream, arg); break; -- 2.21.0
next prev parent reply other threads:[~2020-07-21 17:03 UTC|newest] Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-07-21 17:00 [RFC PATCH v2 0/6] ALSA: compress: add support to change codec profile in gapless playback Srinivas Kandagatla 2020-07-21 17:00 ` Srinivas Kandagatla 2020-07-21 17:00 ` [RFC PATCH v2 1/6] ALSA: compress: move codec parameter check to a function Srinivas Kandagatla 2020-07-21 17:00 ` Srinivas Kandagatla 2020-07-21 19:56 ` Pierre-Louis Bossart 2020-07-21 19:56 ` Pierre-Louis Bossart 2020-07-21 17:00 ` Srinivas Kandagatla [this message] 2020-07-21 17:00 ` [RFC PATCH v2 2/6] ALSA: compress: add new ioctl for setting codec parameters Srinivas Kandagatla 2020-07-21 20:05 ` Pierre-Louis Bossart 2020-07-21 20:05 ` Pierre-Louis Bossart 2020-07-22 8:59 ` Srinivas Kandagatla 2020-07-22 8:59 ` Srinivas Kandagatla 2020-07-22 15:36 ` Pierre-Louis Bossart 2020-07-22 15:36 ` Pierre-Louis Bossart 2020-07-23 4:47 ` Vinod Koul 2020-07-23 4:47 ` Vinod Koul 2020-07-23 13:17 ` Pierre-Louis Bossart 2020-07-23 13:17 ` Pierre-Louis Bossart 2020-07-21 17:00 ` [RFC PATCH v2 3/6] ALSA: compress: add flags to snd_compr_caps to expose dsp caps Srinivas Kandagatla 2020-07-21 17:00 ` Srinivas Kandagatla 2020-07-21 17:00 ` [RFC PATCH v2 4/6] ASoC: compress: add snd_soc_dai_compr_set_codec_params() Srinivas Kandagatla 2020-07-21 17:00 ` Srinivas Kandagatla 2020-07-21 17:00 ` [RFC PATCH v2 5/6] ALSA: compress: bump the version Srinivas Kandagatla 2020-07-21 17:00 ` Srinivas Kandagatla 2020-07-21 17:00 ` [RFC PATCH v2 6/6] ASoC: q6asm-dai: add support to set_codec_params Srinivas Kandagatla 2020-07-21 17:00 ` Srinivas Kandagatla 2020-07-21 20:09 ` Pierre-Louis Bossart 2020-07-21 20:09 ` Pierre-Louis Bossart 2020-07-22 8:59 ` Srinivas Kandagatla 2020-07-22 8:59 ` Srinivas Kandagatla 2020-07-22 14:04 ` Daniel Baluta 2020-07-22 14:04 ` Daniel Baluta 2020-07-23 12:38 ` [RFC PATCH v2 0/6] ALSA: compress: add support to change codec profile in gapless playback Takashi Iwai 2020-07-23 12:38 ` Takashi Iwai 2020-07-23 13:05 ` Vinod Koul 2020-07-23 13:05 ` Vinod Koul 2020-07-23 13:17 ` Takashi Iwai 2020-07-23 13:17 ` Takashi Iwai 2020-07-23 15:56 ` Vinod Koul 2020-07-23 15:56 ` Vinod Koul 2020-07-23 20:33 ` Takashi Iwai 2020-07-23 20:33 ` Takashi Iwai 2020-08-06 11:08 ` Vinod Koul 2020-08-06 11:08 ` Vinod Koul 2020-08-06 16:28 ` Takashi Iwai 2020-08-06 16:28 ` Takashi Iwai
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200721170007.4554-3-srinivas.kandagatla@linaro.org \ --to=srinivas.kandagatla@linaro.org \ --cc=alsa-devel@alsa-project.org \ --cc=broonie@kernel.org \ --cc=ckeepax@opensource.cirrus.com \ --cc=lgirdwood@gmail.com \ --cc=linux-kernel@vger.kernel.org \ --cc=perex@perex.cz \ --cc=tiwai@suse.com \ --cc=vkoul@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.