ALSA: lola - Allow granularity changes
Add some sanity checks. Change PCM parameters appropriately per granularity. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
972505ccde
commit
8bd172dc96
@ -587,14 +587,31 @@ static int __devinit lola_create(struct snd_card *card, struct pci_dev *pci,
|
|||||||
chip->pci = pci;
|
chip->pci = pci;
|
||||||
chip->irq = -1;
|
chip->irq = -1;
|
||||||
|
|
||||||
chip->sample_rate_min = sample_rate_min[dev];
|
|
||||||
chip->granularity = granularity[dev];
|
chip->granularity = granularity[dev];
|
||||||
/* FIXME */
|
switch (chip->granularity) {
|
||||||
if (chip->granularity != LOLA_GRANULARITY_MAX) {
|
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
|
snd_printk(KERN_WARNING SFX
|
||||||
"Only %d granularity is supported for now\n",
|
"Invalid granularity %d, reset to %d\n",
|
||||||
LOLA_GRANULARITY_MAX);
|
chip->granularity, LOLA_GRANULARITY_MAX);
|
||||||
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);
|
err = pci_request_regions(pci, DRVNAME);
|
||||||
|
@ -367,6 +367,7 @@ struct lola {
|
|||||||
/* parameters */
|
/* parameters */
|
||||||
unsigned int granularity;
|
unsigned int granularity;
|
||||||
unsigned int sample_rate_min;
|
unsigned int sample_rate_min;
|
||||||
|
unsigned int sample_rate_max;
|
||||||
|
|
||||||
/* flags */
|
/* flags */
|
||||||
unsigned int running :1;
|
unsigned int running :1;
|
||||||
|
@ -178,14 +178,16 @@ static int lola_pcm_open(struct snd_pcm_substream *substream)
|
|||||||
str->opened = 1;
|
str->opened = 1;
|
||||||
runtime->hw = lola_pcm_hw;
|
runtime->hw = lola_pcm_hw;
|
||||||
runtime->hw.channels_max = pcm->num_streams - str->index;
|
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);
|
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
|
||||||
/* period size = multiple of chip->granularity (8, 16 or 32 frames)
|
/* period size = multiple of chip->granularity (8, 16 or 32 frames)
|
||||||
* use LOLA_GRANULARITY_MAX = 32 for instance
|
* use LOLA_GRANULARITY_MAX = 32 for instance
|
||||||
*/
|
*/
|
||||||
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
|
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,
|
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||||
LOLA_GRANULARITY_MAX);
|
chip->granularity);
|
||||||
mutex_unlock(&chip->open_mutex);
|
mutex_unlock(&chip->open_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user