At Thu, 27 Nov 2003 17:23:43 +0100, I wrote: > > At Thu, 27 Nov 2003 18:16:05 +0200 (EET), > Kai Vehmanen wrote: > > > > On Wed, 26 Nov 2003, Takashi Iwai wrote: > > > > >> On the same machine, alsa-driver-0.9.8 works fine, but not with 1.0.0pre1 > > >> and 1.0.0pre3. > > > what do you mean exactly "don't work" in the above? > > > the operation is blocked, or returns an error? > > > if it's blocked, check /proc/asound/card0/pcm0*/sub0/* files. > > > > I think I found the problem. In 1.0.0preX, the supported sampling rate > > is limited to 48000Hz and this causes all kinds of problems if running > > with lower rates (I've mostly tested running at 8000Hz) - i.e. when > > using alsa-lib for sr-conversion. > > > > With 1.0.0pre3, for example "arecord -r 8000 - |aplay -r 8000 -" produces > > constant xruns. A similar app that relies on poll()/select(), fails even > > more severely. When looking at... > > > > /proc/asound/card0/pcm0p/sub0/hw_params and > > /proc/asound/card0/pcm0c/sub0/hw_params > > > > .. the rate is locked to 48000 with 1.0.0pre3.
do you mean both for playback and capture, or only on capture side? if the playback rate isn't set correctly (i.e. aplay -Dhw with 44.1kHz doesn't work), it's a serious problem. but, if it's a capture side, right now i found and fixed a bug. could you try and check whether it works for you? Takashi
Index: alsa-kernel/pci/ac97/ac97_pcm.c =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/pci/ac97/ac97_pcm.c,v retrieving revision 1.4 diff -u -r1.4 ac97_pcm.c --- alsa-kernel/pci/ac97/ac97_pcm.c 24 Nov 2003 11:12:24 -0000 1.4 +++ alsa-kernel/pci/ac97/ac97_pcm.c 27 Nov 2003 18:04:19 -0000 @@ -145,6 +145,19 @@ } }}; +/* FIXME: more various mappings for ADC? */ +static unsigned char rate_cregs[9] = { + AC97_PCM_LR_ADC_RATE, /* 3 */ + AC97_PCM_LR_ADC_RATE, /* 4 */ + 0xff, /* 5 */ + AC97_PCM_MIC_ADC_RATE, /* 6 */ + 0xff, /* 7 */ + 0xff, /* 8 */ + 0xff, /* 9 */ + 0xff, /* 10 */ + 0xff, /* 11 */ +}; + static unsigned char get_slot_reg(struct ac97_pcm *pcm, unsigned short cidx, unsigned short slot, int dbl) { @@ -152,7 +165,10 @@ return 0xff; if (slot > 11) return 0xff; - return rate_reg_tables[dbl][pcm->r[dbl].rate_table[cidx]][slot - 3]; + if (pcm->stream == SNDRV_PCM_STREAM_PLAYBACK) + return rate_preg_tables[dbl][pcm->r[dbl].rate_table[cidx]][slot - 3]; + else + return rate_cregs[slot - 3]; } static int set_spdif_rate(ac97_t *ac97, unsigned short rate) @@ -380,7 +396,6 @@ const struct ac97_pcm *pcm; struct ac97_pcm *rpcms, *rpcm; unsigned short avail_slots[2][4]; - unsigned short all_slots[2][4]; unsigned char rate_table[2][4]; unsigned short tmp, slots; unsigned int rates; @@ -390,7 +405,7 @@ if (rpcms == NULL) return -ENOMEM; memset(avail_slots, 0, sizeof(avail_slots)); - memset(all_slots, 0, sizeof(all_slots)); + memset(rate_table, 0, sizeof(rate_table)); for (i = 0; i < 4; i++) { codec = bus->codec[i]; if (! codec) @@ -401,8 +416,6 @@ for (j = 0; j < i; j++) avail_slots[1][i] &= ~avail_slots[1][j]; } - all_slots[0][i] = avail_slots[0][i]; - all_slots[1][i] = avail_slots[1][i]; } /* FIXME: add double rate allocation */ /* first step - exclusive devices */ @@ -430,7 +443,7 @@ if (tmp) { rpcm->r[0].rslots[j] = tmp; rpcm->r[0].codec[j] = bus->codec[j]; - rpcm->r[0].rate_table[j] = rate_table[0][j]; + rpcm->r[0].rate_table[j] = rate_table[pcm->stream][j]; rates = get_rates(rpcm, j, tmp, 0); avail_slots[pcm->stream][j] &= ~tmp; }