At Thu, 13 May 2004 10:53:48 -0700,
Loc Ho wrote:
>
> Hi,
>
> Also, after looking at the snd memory allocation routines, the
> unique tag are type, id, and flag. The type is "continous". The id is
> formated by the device ID, stream number, and substream number. The
> flag is the kernel memory flag. I already discussed the ID in my
> previous email (see below). Therefore, it will NOT be unique across
> multiple card!!!
hmm, you're right.
obviously it's a bug of snd-usb-audio.
the attached patch should fix the problem.
Takashi
Index: alsa-kernel/usb/usbaudio.c
===================================================================
RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.100
diff -u -r1.100 usbaudio.c
--- alsa-kernel/usb/usbaudio.c 7 May 2004 10:08:49 -0000 1.100
+++ alsa-kernel/usb/usbaudio.c 13 May 2004 18:05:45 -0000
@@ -2036,6 +2036,7 @@
static void init_substream(snd_usb_stream_t *as, int stream, struct audioformat *fp)
{
snd_usb_substream_t *subs = &as->substream[stream];
+ snd_pcm_substream_t *pcms;
INIT_LIST_HEAD(&subs->fmt_list);
spin_lock_init(&subs->lock);
@@ -2047,7 +2048,12 @@
subs->ops = audio_urb_ops[stream];
else
subs->ops = audio_urb_ops_high_speed[stream];
- snd_pcm_lib_preallocate_pages(as->pcm->streams[stream].substream,
+ /* set up the unique device id with the card index number */
+ pcms = as->pcm->streams[stream].substream;
+ pcms->dma_device.id = (as->pcm->device << 16) |
+ (pcms->stream << 8) | (pcms->number + 1) |
+ (as->chip->card->number + 1) << 24;
+ snd_pcm_lib_preallocate_pages(pcms,
SNDRV_DMA_TYPE_CONTINUOUS,
snd_dma_continuous_data(GFP_KERNEL),
64 * 1024, 128 * 1024);