Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bd172dc authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: lola - Allow granularity changes



Add some sanity checks.
Change PCM parameters appropriately per granularity.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 972505cc
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -587,14 +587,31 @@ static int __devinit lola_create(struct snd_card *card, struct pci_dev *pci,
	chip->pci = pci;
	chip->irq = -1;

	chip->sample_rate_min = sample_rate_min[dev];
	chip->granularity = granularity[dev];
	/* FIXME */
	if (chip->granularity != LOLA_GRANULARITY_MAX) {
	switch (chip->granularity) {
	case 8:
		chip->sample_rate_max = 48000;
		break;
	case 16:
		chip->sample_rate_max = 96000;
		break;
	case 32:
		chip->sample_rate_max = 192000;
		break;
	default:
		snd_printk(KERN_WARNING SFX
			   "Only %d granularity is supported for now\n",
			   LOLA_GRANULARITY_MAX);
			   "Invalid granularity %d, reset to %d\n",
			   chip->granularity, LOLA_GRANULARITY_MAX);
		chip->granularity = LOLA_GRANULARITY_MAX;
		chip->sample_rate_max = 192000;
		break;
	}
	chip->sample_rate_min = sample_rate_min[dev];
	if (chip->sample_rate_min > chip->sample_rate_max) {
		snd_printk(KERN_WARNING SFX
			   "Invalid sample_rate_min %d, reset to 16000\n",
			   chip->sample_rate_min);
		chip->sample_rate_min = 16000;
	}

	err = pci_request_regions(pci, DRVNAME);
+1 −0
Original line number Diff line number Diff line
@@ -367,6 +367,7 @@ struct lola {
	/* parameters */
	unsigned int granularity;
	unsigned int sample_rate_min;
	unsigned int sample_rate_max;

	/* flags */
	unsigned int running :1;
+4 −2
Original line number Diff line number Diff line
@@ -178,14 +178,16 @@ static int lola_pcm_open(struct snd_pcm_substream *substream)
	str->opened = 1;
	runtime->hw = lola_pcm_hw;
	runtime->hw.channels_max = pcm->num_streams - str->index;
	runtime->hw.rate_min = chip->sample_rate_min;
	runtime->hw.rate_max = chip->sample_rate_max;
	snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
	/* period size = multiple of chip->granularity (8, 16 or 32 frames)
	 * use LOLA_GRANULARITY_MAX = 32 for instance
	 */
	snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
				   LOLA_GRANULARITY_MAX);
				   chip->granularity);
	snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
				   LOLA_GRANULARITY_MAX);
				   chip->granularity);
	mutex_unlock(&chip->open_mutex);
	return 0;
}