[alsa-devel] [PATCH - ice1724 1/1] ALSA: ice1724 - constrain runtime rates for locked internal rate

Takashi Iwai tiwai at suse.de
Mon Mar 5 15:18:51 CET 2012


At Fri,  2 Mar 2012 22:09:39 +0100,
pavel.hofman at ivitera.com wrote:
> 
> From: Pavel Hofman <pavel.hofman at ivitera.com>
> 
> The driver already defines control "Multi Track Rate Locking" which
> locks the card at current rate if switched to internal clock. This patch
> limits the runtime rates to this rate only, allowing proper reporting
> of the card capabilities, and e.g. automatic rate conversion by the plug
> plugin to the currently locked rate.
> 
> Signed-off-by: Pavel Hofman <pavel.hofman at ivitera.com>

Thanks, applied.


Takashi

> 
> diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c
> index 9236297..812d10e 100644
> --- a/sound/pci/ice1712/ice1724.c
> +++ b/sound/pci/ice1712/ice1724.c
> @@ -1013,6 +1013,25 @@ static int set_rate_constraints(struct snd_ice1712 *ice,
>  					  ice->hw_rates);
>  }
>  
> +/* if the card has the internal rate locked (is_pro_locked), limit runtime
> +   hw rates to the current internal rate only.
> +*/
> +static void constrain_rate_if_locked(struct snd_pcm_substream *substream)
> +{
> +	struct snd_ice1712 *ice = snd_pcm_substream_chip(substream);
> +	struct snd_pcm_runtime *runtime = substream->runtime;
> +	unsigned int rate;
> +	if (is_pro_rate_locked(ice)) {
> +		rate = ice->get_rate(ice);
> +		if (rate >= runtime->hw.rate_min
> +		    && rate <= runtime->hw.rate_max) {
> +			runtime->hw.rate_min = rate;
> +			runtime->hw.rate_max = rate;
> +		}
> +	}
> +}
> +
> +
>  /* multi-channel playback needs alignment 8x32bit regardless of the channels
>   * actually used
>   */
> @@ -1046,6 +1065,7 @@ static int snd_vt1724_playback_pro_open(struct snd_pcm_substream *substream)
>  				   VT1724_BUFFER_ALIGN);
>  	snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
>  				   VT1724_BUFFER_ALIGN);
> +	constrain_rate_if_locked(substream);
>  	if (ice->pro_open)
>  		ice->pro_open(ice, substream);
>  	return 0;
> @@ -1066,6 +1086,7 @@ static int snd_vt1724_capture_pro_open(struct snd_pcm_substream *substream)
>  				   VT1724_BUFFER_ALIGN);
>  	snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
>  				   VT1724_BUFFER_ALIGN);
> +	constrain_rate_if_locked(substream);
>  	if (ice->pro_open)
>  		ice->pro_open(ice, substream);
>  	return 0;
> @@ -1215,6 +1236,7 @@ static int snd_vt1724_playback_spdif_open(struct snd_pcm_substream *substream)
>  				   VT1724_BUFFER_ALIGN);
>  	snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
>  				   VT1724_BUFFER_ALIGN);
> +	constrain_rate_if_locked(substream);
>  	if (ice->spdif.ops.open)
>  		ice->spdif.ops.open(ice, substream);
>  	return 0;
> @@ -1251,6 +1273,7 @@ static int snd_vt1724_capture_spdif_open(struct snd_pcm_substream *substream)
>  				   VT1724_BUFFER_ALIGN);
>  	snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
>  				   VT1724_BUFFER_ALIGN);
> +	constrain_rate_if_locked(substream);
>  	if (ice->spdif.ops.open)
>  		ice->spdif.ops.open(ice, substream);
>  	return 0;
> -- 
> 1.7.0.4
> 


More information about the Alsa-devel mailing list