alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* ALSA hw sample rate conversion support
@ 2011-03-30 11:17 Aisheng Dong
  2011-03-30 13:27 ` Clemens Ladisch
  2011-03-30 15:32 ` Koul, Vinod
  0 siblings, 2 replies; 6+ messages in thread
From: Aisheng Dong @ 2011-03-30 11:17 UTC (permalink / raw)
  To: alsa-devel

Hi ALL,

Does ALSA core support hw sample rate conversion now?
Our soc has a HW sample rate converter module inside,
I wonder if current ALSA core provide interface to support hw sample
rate conversion?

Thanks

Regards
Aisheng

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: ALSA hw sample rate conversion support
  2011-03-30 11:17 ALSA hw sample rate conversion support Aisheng Dong
@ 2011-03-30 13:27 ` Clemens Ladisch
  2011-03-30 15:32 ` Koul, Vinod
  1 sibling, 0 replies; 6+ messages in thread
From: Clemens Ladisch @ 2011-03-30 13:27 UTC (permalink / raw)
  To: Aisheng Dong; +Cc: alsa-devel

Aisheng Dong wrote:
> Does ALSA core support hw sample rate conversion now?

Yes; this has always been supported for chips like Emu10k1.

> I wonder if current ALSA core provide interface to support hw sample
> rate conversion?

In your driver, set the ..._CONTINUOUS flag in the rates field (see the
section "Hardware Description" in the doc), and in the hw_params
callback, program the SRC according to the selected rate.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: ALSA hw sample rate conversion support
  2011-03-30 11:17 ALSA hw sample rate conversion support Aisheng Dong
  2011-03-30 13:27 ` Clemens Ladisch
@ 2011-03-30 15:32 ` Koul, Vinod
  2011-03-30 19:09   ` Liam Girdwood
  1 sibling, 1 reply; 6+ messages in thread
From: Koul, Vinod @ 2011-03-30 15:32 UTC (permalink / raw)
  To: Aisheng Dong, alsa-devel@alsa-project.org; +Cc: Mark, Liam

Aisheng Dong wrote:
> Hi ALL,
> 
> Does ALSA core support hw sample rate conversion now?
> Our soc has a HW sample rate converter module inside,
> I wonder if current ALSA core provide interface to support hw sample
> rate conversion?
> 
Assuming the SRC is inside SoC and you are converting sampling rate of stream
and sending at different rate, then I have a patch for you.
Basically the soc side hw_params should call a new API which call
codec_set_params() and sets the matching rate.

Something like this in soc-core

+int snd_soc_codec_set_params(struct snd_soc_codec *codec, unsigned int param)
+{
+       if (codec->driver->set_params)
+               return codec->driver->set_params(codec, param);
+       else
+               return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(snd_soc_codec_set_params);

Mark,
Would you okay with such a patch where DSP is doing some conversion and codec
will get different params from what stream is set up? And we make sure 
conversion is synced

~Vinod

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: ALSA hw sample rate conversion support
  2011-03-30 15:32 ` Koul, Vinod
@ 2011-03-30 19:09   ` Liam Girdwood
  2011-03-31 17:45     ` Question about your DSP topic branch - hw param fix up query Patrick Lai
  0 siblings, 1 reply; 6+ messages in thread
From: Liam Girdwood @ 2011-03-30 19:09 UTC (permalink / raw)
  To: Koul, Vinod; +Cc: alsa-devel@alsa-project.org, Mark, Aisheng Dong

On Wed, 2011-03-30 at 21:02 +0530, Koul, Vinod wrote:
> Aisheng Dong wrote:
> > Hi ALL,
> > 
> > Does ALSA core support hw sample rate conversion now?
> > Our soc has a HW sample rate converter module inside,
> > I wonder if current ALSA core provide interface to support hw sample
> > rate conversion?
> > 
> Assuming the SRC is inside SoC and you are converting sampling rate of stream
> and sending at different rate, then I have a patch for you.
> Basically the soc side hw_params should call a new API which call
> codec_set_params() and sets the matching rate.
> 
> Something like this in soc-core
> 
> +int snd_soc_codec_set_params(struct snd_soc_codec *codec, unsigned int param)
> +{
> +       if (codec->driver->set_params)
> +               return codec->driver->set_params(codec, param);
> +       else
> +               return -EINVAL;
> +}
> +EXPORT_SYMBOL_GPL(snd_soc_codec_set_params);
> 
> Mark,
> Would you okay with such a patch where DSP is doing some conversion and codec
> will get different params from what stream is set up? And we make sure 
> conversion is synced

Fwiw, I've already implemented a hw_params() fixup between the DSP and
CODEC drivers. This is in my dsp branch atm here :-

http://git.kernel.org/?p=linux/kernel/git/lrg/asoc-2.6.git;a=shortlog;h=refs/heads/topic/dsp-upstream

This allows us to rewrite channels, rates, formats etc. depending on the
use case and can be part of the machine driver e.g. (from sdp4430.c)

static int mcbsp_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
			struct snd_pcm_hw_params *params)
{
	struct snd_interval *channels = hw_param_interval(params,
                                       SNDRV_PCM_HW_PARAM_CHANNELS);
	unsigned int be_id = rtd->dai_link->be_id;

	if (be_id == OMAP_ABE_DAI_MM_FM)
		channels->min = 2;
	else if (be_id == OMAP_ABE_DAI_BT_VX)
		channels->min = 1;
	snd_mask_set(&params->masks[SNDRV_PCM_HW_PARAM_FORMAT -
	                            SNDRV_PCM_HW_PARAM_FIRST_MASK],
	                            SNDRV_PCM_FORMAT_S16_LE);
	return 0;
}

static int dmic_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
			struct snd_pcm_hw_params *params)
{
	struct snd_interval *rate = hw_param_interval(params,
			SNDRV_PCM_HW_PARAM_RATE);

	/* The ABE will covert the FE rate to 96k */
	rate->min = rate->max = 96000;

	snd_mask_set(&params->masks[SNDRV_PCM_HW_PARAM_FORMAT -
	                            SNDRV_PCM_HW_PARAM_FIRST_MASK],
	                            SNDRV_PCM_FORMAT_S32_LE);
	return 0;
}

I intend to start upstreaming all this stuff when I return from holiday
on the 11th April (in time for 2.6.40).

Liam

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Question about your DSP topic branch - hw param fix up query
  2011-03-30 19:09   ` Liam Girdwood
@ 2011-03-31 17:45     ` Patrick Lai
  2011-03-31 21:35       ` Liam Girdwood
  0 siblings, 1 reply; 6+ messages in thread
From: Patrick Lai @ 2011-03-31 17:45 UTC (permalink / raw)
  To: Liam Girdwood; +Cc: alsa-devel@alsa-project.org, Mark

Change subject

> static int dmic_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
> 			struct snd_pcm_hw_params *params)
> {
> 	struct snd_interval *rate = hw_param_interval(params,
> 			SNDRV_PCM_HW_PARAM_RATE);
>
> 	/* The ABE will covert the FE rate to 96k */
> 	rate->min = rate->max = 96000;
>
> 	snd_mask_set(&params->masks[SNDRV_PCM_HW_PARAM_FORMAT -
> 	                            SNDRV_PCM_HW_PARAM_FIRST_MASK],
> 	                            SNDRV_PCM_FORMAT_S32_LE);
> 	return 0;
> }
Liam,

For sample rate conversion case, supplying back-end hw_params_fixup 
function would work. However, I am looking for run-time configuration of 
back-end channel mode. For scenario of multi-channel microphone input, I 
need to have a mean to specify channel mode of back-end depending on 
algorithm running on DSP while front-end channel mode is mono. Is there 
a hook in the framework to do that?

Thanks
Patrick

>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel


-- 
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Question about your DSP topic branch - hw param fix up query
  2011-03-31 17:45     ` Question about your DSP topic branch - hw param fix up query Patrick Lai
@ 2011-03-31 21:35       ` Liam Girdwood
  0 siblings, 0 replies; 6+ messages in thread
From: Liam Girdwood @ 2011-03-31 21:35 UTC (permalink / raw)
  To: Patrick Lai; +Cc: alsa-devel@alsa-project.org, Mark

On Thu, 2011-03-31 at 10:45 -0700, Patrick Lai wrote:
> Change subject
> 
> > static int dmic_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
> > 			struct snd_pcm_hw_params *params)
> > {
> > 	struct snd_interval *rate = hw_param_interval(params,
> > 			SNDRV_PCM_HW_PARAM_RATE);
> >
> > 	/* The ABE will covert the FE rate to 96k */
> > 	rate->min = rate->max = 96000;
> >
> > 	snd_mask_set(&params->masks[SNDRV_PCM_HW_PARAM_FORMAT -
> > 	                            SNDRV_PCM_HW_PARAM_FIRST_MASK],
> > 	                            SNDRV_PCM_FORMAT_S32_LE);
> > 	return 0;
> > }
> Liam,
> 
> For sample rate conversion case, supplying back-end hw_params_fixup 
> function would work. However, I am looking for run-time configuration of 
> back-end channel mode. For scenario of multi-channel microphone input, I 
> need to have a mean to specify channel mode of back-end depending on 
> algorithm running on DSP while front-end channel mode is mono. Is there 
> a hook in the framework to do that?
> 

Not atm, but it does sound like we need to add such a hook.

I'll add this to the conference agenda.

Thanks

Liam

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-03-31 21:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-30 11:17 ALSA hw sample rate conversion support Aisheng Dong
2011-03-30 13:27 ` Clemens Ladisch
2011-03-30 15:32 ` Koul, Vinod
2011-03-30 19:09   ` Liam Girdwood
2011-03-31 17:45     ` Question about your DSP topic branch - hw param fix up query Patrick Lai
2011-03-31 21:35       ` Liam Girdwood

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).