Hi,
I tried the last patch, and I think we got it. I made some few tests, and every thing is Ok for me now. No more crash, no more messages in dmesg. I just had a warning during compilation, but I think this is not really important :
sound/usb/caiaq/caiaq-midi.c: In function \u2018snd_usb_caiaq_midi_output_done\u2019: sound/usb/caiaq/caiaq-midi.c:170: attention : unused variable \u2018buf\u2019
Perhaps this is not the same line (170) as you but, in my file, it concerns the last function.
Thank you very much for your help !
Cheers,
Mysth-R 2009/1/8 Takashi Iwai tiwai@suse.de
At Thu, 8 Jan 2009 02:34:46 +0100, Marco Santamaria wrote:
Unfortunately I have to correct my previous message.
After a load test with jack + qsynth + rosegarden (sample rate=88200,
frames/
period=256, periods/buffer=3), using a 16 tracks midi file and a 29MB
sound
font, the following message appeared:
[ 1098.445807] ALSA /home/marco/build/linux-2.6.24-19-rt/alsa-1.0.17/ driver-patched/alsa-driver-1.0.17/usb/caiaq/../../alsa-kernel/usb/caiaq/ caiaq-midi.c:84: snd-usb-caiaq log: snd_usb_caiaq_midi_send(f64c66c0): usb_submit_urb() failed, -22
Hmm... what about this version?
Takashi
diff --git a/sound/usb/caiaq/caiaq-device.h b/sound/usb/caiaq/caiaq-device.h index f9fbdba..ab56e73 100644 --- a/sound/usb/caiaq/caiaq-device.h +++ b/sound/usb/caiaq/caiaq-device.h @@ -75,6 +75,7 @@ struct snd_usb_caiaqdev { wait_queue_head_t ep1_wait_queue; wait_queue_head_t prepare_wait_queue; int spec_received, audio_parm_answer;
int midi_out_active; char vendor_name[CAIAQ_USB_STR_LEN]; char product_name[CAIAQ_USB_STR_LEN];
diff --git a/sound/usb/caiaq/caiaq-midi.c b/sound/usb/caiaq/caiaq-midi.c index 30b57f9..18bbe38 100644 --- a/sound/usb/caiaq/caiaq-midi.c +++ b/sound/usb/caiaq/caiaq-midi.c @@ -59,6 +59,11 @@ static int snd_usb_caiaq_midi_output_open(struct snd_rawmidi_substream *substrea
static int snd_usb_caiaq_midi_output_close(struct snd_rawmidi_substream *substream) {
struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
if (dev->midi_out_active) {
usb_kill_urb(&dev->midi_out_urb);
dev->midi_out_active = 0;
} return 0;
}
@@ -69,7 +74,8 @@ static void snd_usb_caiaq_midi_send(struct snd_usb_caiaqdev *dev,
dev->midi_out_buf[0] = EP1_CMD_MIDI_WRITE; dev->midi_out_buf[1] = 0; /* port */
len = snd_rawmidi_transmit_peek(substream, dev->midi_out_buf+3,
EP1_BUFSIZE-3);
len = snd_rawmidi_transmit(substream, dev->midi_out_buf + 3,
EP1_BUFSIZE - 3); if (len <= 0) return;
@@ -79,24 +85,24 @@ static void snd_usb_caiaq_midi_send(struct snd_usb_caiaqdev *dev,
ret = usb_submit_urb(&dev->midi_out_urb, GFP_ATOMIC); if (ret < 0)
log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed,
%d\n",
substream, ret);
log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed,"
"ret=%d, len=%d\n",
substream, ret, len);
else
dev->midi_out_active = 1;
}
static void snd_usb_caiaq_midi_output_trigger(struct snd_rawmidi_substream *substream, int up) { struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
if (dev->midi_out_substream != NULL)
return;
if (!up) {
if (up) {
dev->midi_out_substream = substream;
if (!dev->midi_out_active)
snd_usb_caiaq_midi_send(dev, substream);
} else { dev->midi_out_substream = NULL;
return; }
dev->midi_out_substream = substream;
snd_usb_caiaq_midi_send(dev, substream);
}
@@ -163,14 +169,13 @@ void snd_usb_caiaq_midi_output_done(struct urb* urb) struct snd_usb_caiaqdev *dev = urb->context; char *buf = urb->transfer_buffer;
dev->midi_out_active = 0; if (urb->status != 0) return; if (!dev->midi_out_substream) return;
snd_rawmidi_transmit_ack(dev->midi_out_substream, buf[2]);
dev->midi_out_substream = NULL; snd_usb_caiaq_midi_send(dev, dev->midi_out_substream);
}