[alsa-devel] snd_usb_caiaq bug?

Daniel Mack daniel at caiaq.org
Thu Jan 8 23:11:53 CET 2009


Hi Takashi,

On Thu, Jan 08, 2009 at 03:37:30PM +0100, Takashi Iwai wrote:
> > 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.
> 
> OK, it's simple to fix.
> The below is the latest version I committed now to sound git tree.
> It'll be pushed to 2.6.29 (and stable kernels) later.

Thanks a lot for your help - I was on vacation until now and had very
limited ways to follow that thread. I would, however, apprectiate the
driver version number would be increased for this change, as it makes
tracking of user error reports better trackable.

Do you want me to send in a patch for that or is it easier if you do
it yourself?

Thanks and best regards,
Daniel

> ---
> 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..f19fd36 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);
>  }
>  
>  
> @@ -161,16 +167,14 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
>  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);
>  }
>

Acked-by: Daniel Mack <daniel at caiaq.de>



More information about the Alsa-devel mailing list