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;
                                }

Reply via email to