* [PATCH v5 1/3] ALSA: compress: document the compress audio state machine
2020-06-29 13:47 [PATCH v5 0/3] ALSA: compress: Document stream states and fix gapless SM Vinod Koul
@ 2020-06-29 13:47 ` Vinod Koul
2020-07-07 9:54 ` Takashi Iwai
2020-06-29 13:47 ` [PATCH v5 2/3] ALSA: compress: document the compress gapless " Vinod Koul
2020-06-29 13:47 ` [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state Vinod Koul
2 siblings, 1 reply; 9+ messages in thread
From: Vinod Koul @ 2020-06-29 13:47 UTC (permalink / raw)
To: Takashi Iwai, Jaroslav Kysela
Cc: Vinod Koul, Amadeusz Sławiński, Srinivas Kandagatla,
Pierre-Louis Bossart, Charles Keepax, alsa-devel, linux-kernel
So we had some discussions of the stream states, so I thought it is a
good idea to document the state transitions, so add it documentation
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
---
.../sound/designs/compress-offload.rst | 51 +++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/Documentation/sound/designs/compress-offload.rst b/Documentation/sound/designs/compress-offload.rst
index ad4bfbdacc83..ad89af9b31c9 100644
--- a/Documentation/sound/designs/compress-offload.rst
+++ b/Documentation/sound/designs/compress-offload.rst
@@ -151,6 +151,57 @@ Modifications include:
- Addition of encoding options when required (derived from OpenMAX IL)
- Addition of rateControlSupported (missing in OpenMAX AL)
+State Machine
+=============
+
+The compressed audio stream state machine is described below ::
+
+ +----------+
+ | |
+ | OPEN |
+ | |
+ +----------+
+ |
+ |
+ | compr_set_params()
+ |
+ v
+ compr_free() +----------+
+ +------------------------------------| |
+ | | SETUP |
+ | +-------------------------| |<-------------------------+
+ | | compr_write() +----------+ |
+ | | ^ |
+ | | | compr_drain_notify() |
+ | | | or |
+ | | | compr_stop() |
+ | | | |
+ | | +----------+ |
+ | | | | |
+ | | | DRAIN | |
+ | | | | |
+ | | +----------+ |
+ | | ^ |
+ | | | |
+ | | | compr_drain() |
+ | | | |
+ | v | |
+ | +----------+ +----------+ |
+ | | | compr_start() | | compr_stop() |
+ | | PREPARE |------------------->| RUNNING |--------------------------+
+ | | | | | |
+ | +----------+ +----------+ |
+ | | | ^ |
+ | |compr_free() | | |
+ | | compr_pause() | | compr_resume() |
+ | | | | |
+ | v v | |
+ | +----------+ +----------+ |
+ | | | | | compr_stop() |
+ +--->| FREE | | PAUSE |---------------------------+
+ | | | |
+ +----------+ +----------+
+
Gapless Playback
================
--
2.26.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v5 1/3] ALSA: compress: document the compress audio state machine
2020-06-29 13:47 ` [PATCH v5 1/3] ALSA: compress: document the compress audio state machine Vinod Koul
@ 2020-07-07 9:54 ` Takashi Iwai
0 siblings, 0 replies; 9+ messages in thread
From: Takashi Iwai @ 2020-07-07 9:54 UTC (permalink / raw)
To: Vinod Koul
Cc: Takashi Iwai, Jaroslav Kysela, Amadeusz Sławiński,
Srinivas Kandagatla, Pierre-Louis Bossart, Charles Keepax,
alsa-devel, linux-kernel
On Mon, 29 Jun 2020 15:47:35 +0200,
Vinod Koul wrote:
>
> So we had some discussions of the stream states, so I thought it is a
> good idea to document the state transitions, so add it documentation
>
> Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>
Applied to for-next branch now. Thanks.
Takashi
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v5 2/3] ALSA: compress: document the compress gapless audio state machine
2020-06-29 13:47 [PATCH v5 0/3] ALSA: compress: Document stream states and fix gapless SM Vinod Koul
2020-06-29 13:47 ` [PATCH v5 1/3] ALSA: compress: document the compress audio state machine Vinod Koul
@ 2020-06-29 13:47 ` Vinod Koul
2020-07-07 9:54 ` Takashi Iwai
2020-06-29 13:47 ` [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state Vinod Koul
2 siblings, 1 reply; 9+ messages in thread
From: Vinod Koul @ 2020-06-29 13:47 UTC (permalink / raw)
To: Takashi Iwai, Jaroslav Kysela
Cc: Vinod Koul, Amadeusz Sławiński, Srinivas Kandagatla,
Pierre-Louis Bossart, Charles Keepax, alsa-devel, linux-kernel
Also documented the galpess transitions. Please note that these are not
really stream states, but show how the stream steps in gapless mode
Signed-off-by: Vinod Koul <vkoul@kernel.org>
---
.../sound/designs/compress-offload.rst | 32 +++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/Documentation/sound/designs/compress-offload.rst b/Documentation/sound/designs/compress-offload.rst
index ad89af9b31c9..935f325dbc77 100644
--- a/Documentation/sound/designs/compress-offload.rst
+++ b/Documentation/sound/designs/compress-offload.rst
@@ -250,6 +250,38 @@ Sequence flow for gapless would be:
(note: order for partial_drain and write for next track can be reversed as well)
+Gapless Playback SM
+===================
+
+For Gapless, we move from running state to partial drain and back, along
+with setting of meta_data and signalling for next track ::
+
+
+ +----------+
+ compr_drain_notify() | |
+ +------------------------>| RUNNING |
+ | | |
+ | +----------+
+ | |
+ | |
+ | | compr_next_track()
+ | |
+ | V
+ | +----------+
+ | | |
+ | |NEXT_TRACK|
+ | | |
+ | +----------+
+ | |
+ | |
+ | | compr_partial_drain()
+ | |
+ | V
+ | +----------+
+ | | |
+ +------------------------ | PARTIAL_ |
+ | DRAIN |
+ +----------+
Not supported
=============
--
2.26.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v5 2/3] ALSA: compress: document the compress gapless audio state machine
2020-06-29 13:47 ` [PATCH v5 2/3] ALSA: compress: document the compress gapless " Vinod Koul
@ 2020-07-07 9:54 ` Takashi Iwai
0 siblings, 0 replies; 9+ messages in thread
From: Takashi Iwai @ 2020-07-07 9:54 UTC (permalink / raw)
To: Vinod Koul
Cc: Takashi Iwai, Jaroslav Kysela, Amadeusz Sławiński,
Srinivas Kandagatla, Pierre-Louis Bossart, Charles Keepax,
alsa-devel, linux-kernel
On Mon, 29 Jun 2020 15:47:36 +0200,
Vinod Koul wrote:
>
> Also documented the galpess transitions. Please note that these are not
> really stream states, but show how the stream steps in gapless mode
>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>
Applied to for-next branch. Thanks.
Takashi
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state
2020-06-29 13:47 [PATCH v5 0/3] ALSA: compress: Document stream states and fix gapless SM Vinod Koul
2020-06-29 13:47 ` [PATCH v5 1/3] ALSA: compress: document the compress audio state machine Vinod Koul
2020-06-29 13:47 ` [PATCH v5 2/3] ALSA: compress: document the compress gapless " Vinod Koul
@ 2020-06-29 13:47 ` Vinod Koul
2020-07-01 14:20 ` Charles Keepax
2020-07-07 9:55 ` Takashi Iwai
2 siblings, 2 replies; 9+ messages in thread
From: Vinod Koul @ 2020-06-29 13:47 UTC (permalink / raw)
To: Takashi Iwai, Jaroslav Kysela
Cc: Vinod Koul, Amadeusz Sławiński, Srinivas Kandagatla,
Pierre-Louis Bossart, Charles Keepax, alsa-devel, linux-kernel
On partial_drain completion we should be in SNDRV_PCM_STATE_RUNNING
state, so set that for partially draining streams in
snd_compr_drain_notify() and use a flag for partially draining streams
While at it, add locks for stream state change in
snd_compr_drain_notify() as well.
Fixes: f44f2a5417b2 ("ALSA: compress: fix drain calls blocking other compress functions (v6)")
Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
---
include/sound/compress_driver.h | 10 +++++++++-
sound/core/compress_offload.c | 4 ++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
index 3df8d8c90191..8d23351f7ad7 100644
--- a/include/sound/compress_driver.h
+++ b/include/sound/compress_driver.h
@@ -66,6 +66,7 @@ struct snd_compr_runtime {
* @direction: stream direction, playback/recording
* @metadata_set: metadata set flag, true when set
* @next_track: has userspace signal next track transition, true when set
+ * @partial_drain: undergoing partial_drain for stream, true when set
* @private_data: pointer to DSP private data
* @dma_buffer: allocated buffer if any
*/
@@ -78,6 +79,7 @@ struct snd_compr_stream {
enum snd_compr_direction direction;
bool metadata_set;
bool next_track;
+ bool partial_drain;
void *private_data;
struct snd_dma_buffer dma_buffer;
};
@@ -187,7 +189,13 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)
if (snd_BUG_ON(!stream))
return;
- stream->runtime->state = SNDRV_PCM_STATE_SETUP;
+ /* for partial_drain case we are back to running state on success */
+ if (stream->partial_drain) {
+ stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
+ stream->partial_drain = false; /* clear this flag as well */
+ } else {
+ stream->runtime->state = SNDRV_PCM_STATE_SETUP;
+ }
wake_up(&stream->runtime->sleep);
}
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
index e618580feac4..1c4b2cf450a0 100644
--- a/sound/core/compress_offload.c
+++ b/sound/core/compress_offload.c
@@ -803,6 +803,9 @@ static int snd_compr_stop(struct snd_compr_stream *stream)
retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP);
if (!retval) {
+ /* clear flags and stop any drain wait */
+ stream->partial_drain = false;
+ stream->metadata_set = false;
snd_compr_drain_notify(stream);
stream->runtime->total_bytes_available = 0;
stream->runtime->total_bytes_transferred = 0;
@@ -960,6 +963,7 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream)
if (stream->next_track == false)
return -EPERM;
+ stream->partial_drain = true;
retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN);
if (retval) {
pr_debug("Partial drain returned failure\n");
--
2.26.2
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state
2020-06-29 13:47 ` [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state Vinod Koul
@ 2020-07-01 14:20 ` Charles Keepax
2020-07-01 15:04 ` Vinod Koul
2020-07-07 9:55 ` Takashi Iwai
1 sibling, 1 reply; 9+ messages in thread
From: Charles Keepax @ 2020-07-01 14:20 UTC (permalink / raw)
To: Vinod Koul
Cc: Takashi Iwai, Jaroslav Kysela, Amadeusz Sławiński,
Srinivas Kandagatla, Pierre-Louis Bossart, alsa-devel,
linux-kernel
On Mon, Jun 29, 2020 at 07:17:37PM +0530, Vinod Koul wrote:
> On partial_drain completion we should be in SNDRV_PCM_STATE_RUNNING
> state, so set that for partially draining streams in
> snd_compr_drain_notify() and use a flag for partially draining streams
>
> While at it, add locks for stream state change in
> snd_compr_drain_notify() as well.
>
> Fixes: f44f2a5417b2 ("ALSA: compress: fix drain calls blocking other compress functions (v6)")
> Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>
> ---
Worth noting I haven't actually tested the gapless, but keeps all
the compressed capture stuff happy.
Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Thanks,
Charles
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state
2020-07-01 14:20 ` Charles Keepax
@ 2020-07-01 15:04 ` Vinod Koul
0 siblings, 0 replies; 9+ messages in thread
From: Vinod Koul @ 2020-07-01 15:04 UTC (permalink / raw)
To: Charles Keepax
Cc: Takashi Iwai, Jaroslav Kysela, Amadeusz Sławiński,
Srinivas Kandagatla, Pierre-Louis Bossart, alsa-devel,
linux-kernel
On 01-07-20, 14:20, Charles Keepax wrote:
> On Mon, Jun 29, 2020 at 07:17:37PM +0530, Vinod Koul wrote:
> > On partial_drain completion we should be in SNDRV_PCM_STATE_RUNNING
> > state, so set that for partially draining streams in
> > snd_compr_drain_notify() and use a flag for partially draining streams
> >
> > While at it, add locks for stream state change in
> > snd_compr_drain_notify() as well.
> >
> > Fixes: f44f2a5417b2 ("ALSA: compress: fix drain calls blocking other compress functions (v6)")
> > Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> > Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> > Signed-off-by: Vinod Koul <vkoul@kernel.org>
> > ---
>
> Worth noting I haven't actually tested the gapless, but keeps all
> the compressed capture stuff happy.
Thanks for testing and review Charles.
Btw Srini is adding support to fcplay so that we can do gapless testing
without using HALs/players. Now that we have an public board (RB3) where
compress works out of box, we should build more things on top :)
--
~Vinod
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state
2020-06-29 13:47 ` [PATCH v5 3/3] ALSA: compress: fix partial_drain completion state Vinod Koul
2020-07-01 14:20 ` Charles Keepax
@ 2020-07-07 9:55 ` Takashi Iwai
1 sibling, 0 replies; 9+ messages in thread
From: Takashi Iwai @ 2020-07-07 9:55 UTC (permalink / raw)
To: Vinod Koul
Cc: Takashi Iwai, Jaroslav Kysela, Amadeusz Sławiński,
Srinivas Kandagatla, Pierre-Louis Bossart, Charles Keepax,
alsa-devel, linux-kernel
On Mon, 29 Jun 2020 15:47:37 +0200,
Vinod Koul wrote:
>
> On partial_drain completion we should be in SNDRV_PCM_STATE_RUNNING
> state, so set that for partially draining streams in
> snd_compr_drain_notify() and use a flag for partially draining streams
>
> While at it, add locks for stream state change in
> snd_compr_drain_notify() as well.
>
> Fixes: f44f2a5417b2 ("ALSA: compress: fix drain calls blocking other compress functions (v6)")
> Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>
Applied this one to for-linus branch (while other two are for 5.9), as
this is a fix.
thanks,
Takashi
^ permalink raw reply [flat|nested] 9+ messages in thread