At Tue, 10 Feb 2009 21:54:32 +0100, Holger Dehnhardt wrote:
After some time I found the following bug:
static void snd_mtpav_inmidi_h(struct mtpav *mcrd, u8 inbyte) { if (inbyte >= 0xf8) { /* real-time midi code */ --> snd_mtpav_inmidi_process(mcrd, inbyte); //here the inmidiport is not translated to the prtnumber, so // snd_mtpav_inmidi_process the port with an index of some 80000 // in the ports array of the mtpav struct was called
Good catch. I think the patch below should fix the problem.
The following change made the driver work: static void snd_mtpav_inmidi_h(struct mtpav *mcrd, u8 inbyte) { if (inbyte >= 0xf8) { /* real-time midi code */ mcrd->inmidiport = translate_hwport_to_subdevice(mcrd, inbyte);
This isn't correct since inbyte is supposed to be under 0x13.
After that I realised, that with the recent driver - even without my change - playing midi files din not work anymore. Only the first midi event was sent to the interface, everything else was dropped somewhere.
So a diff between the last workin version and the recent version showed only one change:
What was the last working version exactly?
699,701c703,705 < card = snd_card_new(index, id, THIS_MODULE, sizeof(*mtp_card)); < if (! card)
< return -ENOMEM;
err = snd_card_create(index, id, THIS_MODULE, sizeof(*mtp_card),
&card);
if (err < 0) return err;
which seems due to an api change. After rolling that back to the old (deprecated) way of creating the sound card, everything works fine.
This must be some coincidence. This API change has nothing to do.
thanks,
Takashi
--- diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c index 5b89c08..48b64e6 100644 --- a/sound/drivers/mtpav.c +++ b/sound/drivers/mtpav.c @@ -706,7 +706,6 @@ static int __devinit snd_mtpav_probe(struct platform_device *dev) mtp_card->card = card; mtp_card->irq = -1; mtp_card->share_irq = 0; - mtp_card->inmidiport = 0xffffffff; mtp_card->inmidistate = 0; mtp_card->outmidihwport = 0xffffffff; init_timer(&mtp_card->timer); @@ -719,6 +718,8 @@ static int __devinit snd_mtpav_probe(struct platform_device *dev) if (err < 0) goto __error;
+ mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST; + err = snd_mtpav_get_ISA(mtp_card); if (err < 0) goto __error;