Update of /cvsroot/alsa/alsa-kernel/usb In directory sc8-pr-cvs1:/tmp/cvs-serv4642
Modified Files: usbaudio.c Log Message: - added a workaround for M-Audio Audiophile USB. - avoid async out and adaptive in if other methods are available. - fixed the hw_constraint check for 24bit formats. Index: usbaudio.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v retrieving revision 1.68 retrieving revision 1.69 diff -u -r1.68 -r1.69 --- usbaudio.c 13 Nov 2003 11:20:20 -0000 1.68 +++ usbaudio.c 13 Nov 2003 12:36:44 -0000 1.69 @@ -966,6 +966,7 @@ { struct list_head *p; struct audioformat *found = NULL; + int cur_attr = 0, attr; list_for_each(p, &subs->fmt_list) { struct audioformat *fp; @@ -982,9 +983,37 @@ if (i >= fp->nr_rates) continue; } + attr = fp->ep_attr & EP_ATTR_MASK; + if (! found) { + found = fp; + cur_attr = attr; + continue; + } + /* avoid async out and adaptive in if the other method + * supports the same format. + * this is a workaround for the case like + * M-audio audiophile USB. + */ + if (attr != cur_attr) { + if ((attr == EP_ATTR_ASYNC && + subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || + (attr == EP_ATTR_ADAPTIVE && + subs->direction == SNDRV_PCM_STREAM_CAPTURE)) + continue; + if ((cur_attr == EP_ATTR_ASYNC && + subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || + (cur_attr == EP_ATTR_ADAPTIVE && + subs->direction == SNDRV_PCM_STREAM_CAPTURE)) { + found = fp; + cur_attr = attr; + continue; + } + } /* find the format with the largest max. packet size */ - if (! found || fp->maxpacksize > found->maxpacksize) + if (fp->maxpacksize > found->maxpacksize) { found = fp; + cur_attr = attr; + } } return found; } @@ -1441,7 +1470,7 @@ fp = list_entry(p, struct audioformat, list); if (! hw_check_valid_format(params, fp)) continue; - fbits |= (1UL << fp->format); + fbits |= (1ULL << fp->format); } oldbits[0] = fmt->bits[0]; @@ -1466,6 +1495,7 @@ u32 channels[64]; u32 rates[64]; u32 cmaster, rmaster; + u32 rate_min = 0, rate_max = 0; struct list_head *p; memset(channels, 0, sizeof(channels)); @@ -1477,6 +1507,15 @@ /* unconventional channels? */ if (f->channels > 32) return 1; + /* continuous rate min/max matches? */ + if (f->rates & SNDRV_PCM_RATE_CONTINUOUS) { + if (rate_min && f->rate_min != rate_min) + return 1; + if (rate_max && f->rate_max != rate_max) + return 1; + rate_min = f->rate_min; + rate_max = f->rate_max; + } /* combination of continuous rates and fixed rates? */ if (rates[f->format] & SNDRV_PCM_RATE_CONTINUOUS) { if (f->rates != rates[f->format]) @@ -2020,10 +2059,20 @@ pcm_format = SNDRV_PCM_FORMAT_S8; break; case 2: - pcm_format = SNDRV_PCM_FORMAT_S16_LE; + /* M-Audio audiophile USB workaround */ + if (dev->descriptor.idVendor == 0x0763 && + dev->descriptor.idProduct == 0x2003) + pcm_format = SNDRV_PCM_FORMAT_S16_BE; /* grrr, big endian!! */ + else + pcm_format = SNDRV_PCM_FORMAT_S16_LE; break; case 3: - pcm_format = SNDRV_PCM_FORMAT_S24_3LE; + /* M-Audio audiophile USB workaround */ + if (dev->descriptor.idVendor == 0x0763 && + dev->descriptor.idProduct == 0x2003) + pcm_format = SNDRV_PCM_FORMAT_S24_3BE; /* grrr, big endian!! */ + else + pcm_format = SNDRV_PCM_FORMAT_S24_3LE; break; case 4: pcm_format = SNDRV_PCM_FORMAT_S32_LE; ------------------------------------------------------- This SF.Net email sponsored by: ApacheCon 2003, 16-19 November in Las Vegas. Learn firsthand the latest developments in Apache, PHP, Perl, XML, Java, MySQL, WebDAV, and more! http://www.apachecon.com/ _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog