alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
To: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>, broonie@kernel.org
Cc: alsa-devel@alsa-project.org, ckeepax@opensource.cirrus.com,
	lgirdwood@gmail.com, linux-kernel@vger.kernel.org,
	tiwai@suse.com, vkoul@kernel.org
Subject: Re: [PATCH 10/11] ASoC: qdsp6-dai: add gapless support
Date: Wed, 8 Jul 2020 08:32:02 -0500	[thread overview]
Message-ID: <cf9b2d33-9b63-f3d2-2e51-a88c528dad53@linux.intel.com> (raw)
In-Reply-To: <04a7f696-e23d-5563-7cc3-aedfaf2c7636@linaro.org>


>>> Add support to gapless playback by implementing metadata,
>>> next_track, drain and partial drain support.
>>>
>>> Gapless on Q6ASM is implemented by opening 2 streams in a single asm 
>>> stream
>>
>> What does 'in a single asm stream' means?
> 
> 
> So in QDSP6 ASM (Audio Stream Manager) terminology we have something 
> called "asm session" for each ASoC FE DAI, Each asm session can be 
> connected with multiple streams (upto 8 I think). However there will be 
> only one active stream at anytime. Also there only single data buffer 
> associated with each asm session.
> 
> For Gapless usecase, we can keep two streams open for one asm-session, 
> allowing us to fill in data on second stream while first stream is playing.

Ah, that's interesting, thanks for the details. So you have one DMA 
transfer and the data from the previous and next track are provided in 
consecutive bytes in a ring buffer, but at the DSP level you have a 
switch that will feed data for the previous and next tracks into 
different decoders, yes?

If that is the case, indeed the extension you suggested earlier to 
change the profile is valid. You could even change the format I guess.

To avoid confusion I believe the capabilities would need to be extended 
so that applications know that gapless playback is supported across 
unrelated profiles/formats. The point is that you don't want a 
traditional implementation to use a capability that isn't supported in 
hardware or will lead to audio issues.

>>> and toggling them on next track.
>>
>> It really seems to me that you have two streams at the lowest level, 
>> along with the knowledge of how many samples to remove/insert and 
>> hence could do a much better job - including gapless support between 
>> unrelated profiles and cross-fading - without the partial drain and 
>> next_track mechanism that was defined assuming a single stream/profile.
> At the end of the day its a single session with one data buffer but with 
> multiple streams.
> 
> Achieving cross fade should be easy with this design.

looks like it indeed.

> We need those hooks for partial drain and next track to allow us to 
> switch between streams and pass silence information to respective stream 
> ids.

right, but the key point is 'switch between streams'. That means a more 
complex/capable implementation that should be advertised as such to 
applications. This is not the default behavior assumed initially: to 
allow for minimal implementations in memory-constrained devices, we 
assumed gapless was supported with a single decoder.

Maybe the right way to do this is extend the snd_compr_caps structure:

/**
  * struct snd_compr_caps - caps descriptor
  * @codecs: pointer to array of codecs
  * @direction: direction supported. Of type snd_compr_direction
  * @min_fragment_size: minimum fragment supported by DSP
  * @max_fragment_size: maximum fragment supported by DSP
  * @min_fragments: min fragments supported by DSP
  * @max_fragments: max fragments supported by DSP
  * @num_codecs: number of codecs supported
  * @reserved: reserved field
  */
struct snd_compr_caps {
	__u32 num_codecs;
	__u32 direction;
	__u32 min_fragment_size;
	__u32 max_fragment_size;
	__u32 min_fragments;
	__u32 max_fragments;
	__u32 codecs[MAX_NUM_CODECS];
	__u32 reserved[11];
} __attribute__((packed, aligned(4)));


and use a reserved field to provide info on capabilities, and filter the 
set_codec_params() addition based this capability - i.e. return -ENOTSUP 
in 'traditional' implementations based on a single 'stream'/decoder 
instance.

  reply	other threads:[~2020-07-08 13:33 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-07 16:36 [PATCH 00/11] ASoC: qdsp6: add gapless compressed audio support Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 01/11] ASoC: q6asm: add command opcode to timeout error report Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 02/11] ASoC: q6asm: rename misleading session id variable Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 03/11] ASoC: q6asm: make commands specific to streams Srinivas Kandagatla
2020-07-07 16:52   ` Pierre-Louis Bossart
2020-07-08  9:44     ` Srinivas Kandagatla
2020-07-08 13:13       ` Mark Brown
2020-07-08 15:26         ` Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 04/11] ASoC: q6asm: use flags directly from asm-dai Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 05/11] ASoC: q6asm: add length to write command token Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 06/11] ASoC: q6asm: add support to remove intial and trailing silence Srinivas Kandagatla
2020-07-07 16:55   ` Pierre-Louis Bossart
2020-07-08  9:44     ` Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 07/11] ASoC: q6asm: add support to gapless flag in asm open Srinivas Kandagatla
2020-07-07 16:57   ` Pierre-Louis Bossart
2020-07-08  9:44     ` Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 08/11] ASoC: q6asm-dai: add next track metadata support Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 09/11] ASoC: qdsp6: use dev_err instead of pr_err Srinivas Kandagatla
2020-07-07 16:36 ` [PATCH 10/11] ASoC: qdsp6-dai: add gapless support Srinivas Kandagatla
2020-07-07 17:07   ` Pierre-Louis Bossart
2020-07-08  9:44     ` Srinivas Kandagatla
2020-07-08 13:32       ` Pierre-Louis Bossart [this message]
2020-07-08 13:42         ` Mark Brown
2020-07-08 15:23         ` Srinivas Kandagatla
2020-07-08 16:58           ` Pierre-Louis Bossart
2020-07-07 16:36 ` [PATCH 11/11] ASoC: q6asm-dai: add support to copy callback Srinivas Kandagatla
2020-07-08 13:32 ` [PATCH 00/11] ASoC: qdsp6: add gapless compressed audio support Mark Brown
2020-07-08 15:24   ` Srinivas Kandagatla
2020-07-08 16:59 ` Mark Brown

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=cf9b2d33-9b63-f3d2-2e51-a88c528dad53@linux.intel.com \
    --to=pierre-louis.bossart@linux.intel.com \
    --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=srinivas.kandagatla@linaro.org \
    --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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).