[alsa-devel] [PATCH] ALSA: USB: adjust for changed 3.8 USB API

Takashi Iwai tiwai at suse.de
Mon Apr 29 10:58:36 CEST 2013


At Sat, 27 Apr 2013 12:10:32 +0200,
Clemens Ladisch wrote:
> 
> The recent changes in the USB API ("implement new semantics for
> URB_ISO_ASAP") made the former meaning of the URB_ISO_ASAP flag the
> default, and changed this flag to mean that URBs can be delayed.
> This is not the behaviour wanted by any of the audio drivers because
> it leads to discontinuous playback with very small period sizes.
> Therefore, our URBs need to be submitted without this flag.
> 
> Reported-by: Joe Rayhawk <jrayhawk at fairlystable.org>
> Cc: <stable at vger.kernel.org> # 3.8 only
> Signed-off-by: Clemens Ladisch <clemens at ladisch.de>

Thanks, applied.


Takashi

> ---
>  sound/usb/6fire/pcm.c           |    1 -
>  sound/usb/caiaq/audio.c         |    3 ---
>  sound/usb/endpoint.c            |    5 ++---
>  sound/usb/misc/ua101.c          |    3 +--
>  sound/usb/usx2y/usb_stream.c    |    1 -
>  sound/usb/usx2y/usbusx2yaudio.c |    1 -
>  sound/usb/usx2y/usx2yhwdeppcm.c |    1 -
>  7 files changed, 3 insertions(+), 12 deletions(-)
> 
> diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c
> index e2ca12f..40dd50a 100644
> --- a/sound/usb/6fire/pcm.c
> +++ b/sound/usb/6fire/pcm.c
> @@ -575,7 +575,6 @@ static void usb6fire_pcm_init_urb(struct pcm_urb *urb,
>  	urb->instance.pipe = in ? usb_rcvisocpipe(chip->dev, ep)
>  			: usb_sndisocpipe(chip->dev, ep);
>  	urb->instance.interval = 1;
> -	urb->instance.transfer_flags = URB_ISO_ASAP;
>  	urb->instance.complete = handler;
>  	urb->instance.context = urb;
>  	urb->instance.number_of_packets = PCM_N_PACKETS_PER_URB;
> diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c
> index fde9a7a..b45e29b 100644
> --- a/sound/usb/caiaq/audio.c
> +++ b/sound/usb/caiaq/audio.c
> @@ -670,7 +670,6 @@ static void read_completed(struct urb *urb)
> 
>  	if (send_it) {
>  		out->number_of_packets = outframe;
> -		out->transfer_flags = URB_ISO_ASAP;
>  		usb_submit_urb(out, GFP_ATOMIC);
>  	} else {
>  		struct snd_usb_caiaq_cb_info *oinfo = out->context;
> @@ -686,7 +685,6 @@ requeue:
>  	}
> 
>  	urb->number_of_packets = FRAMES_PER_URB;
> -	urb->transfer_flags = URB_ISO_ASAP;
>  	usb_submit_urb(urb, GFP_ATOMIC);
>  }
> 
> @@ -751,7 +749,6 @@ static struct urb **alloc_urbs(struct snd_usb_caiaqdev *dev, int dir, int *ret)
>  						* BYTES_PER_FRAME;
>  		urbs[i]->context = &dev->data_cb_info[i];
>  		urbs[i]->interval = 1;
> -		urbs[i]->transfer_flags = URB_ISO_ASAP;
>  		urbs[i]->number_of_packets = FRAMES_PER_URB;
>  		urbs[i]->complete = (dir == SNDRV_PCM_STREAM_CAPTURE) ?
>  					read_completed : write_completed;
> diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
> index 21049b8..63cca3a 100644
> --- a/sound/usb/endpoint.c
> +++ b/sound/usb/endpoint.c
> @@ -677,7 +677,7 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep,
>  		if (!u->urb->transfer_buffer)
>  			goto out_of_memory;
>  		u->urb->pipe = ep->pipe;
> -		u->urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
> +		u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
>  		u->urb->interval = 1 << ep->datainterval;
>  		u->urb->context = u;
>  		u->urb->complete = snd_complete_urb;
> @@ -716,8 +716,7 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep,
>  		u->urb->transfer_dma = ep->sync_dma + i * 4;
>  		u->urb->transfer_buffer_length = 4;
>  		u->urb->pipe = ep->pipe;
> -		u->urb->transfer_flags = URB_ISO_ASAP |
> -					 URB_NO_TRANSFER_DMA_MAP;
> +		u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
>  		u->urb->number_of_packets = 1;
>  		u->urb->interval = 1 << ep->syncinterval;
>  		u->urb->context = u;
> diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c
> index 8b81cb5..6ad617b 100644
> --- a/sound/usb/misc/ua101.c
> +++ b/sound/usb/misc/ua101.c
> @@ -1120,8 +1120,7 @@ static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream,
>  			usb_init_urb(&urb->urb);
>  			urb->urb.dev = ua->dev;
>  			urb->urb.pipe = stream->usb_pipe;
> -			urb->urb.transfer_flags = URB_ISO_ASAP |
> -					URB_NO_TRANSFER_DMA_MAP;
> +			urb->urb.transfer_flags = URB_NO_TRANSFER_DMA_MAP;
>  			urb->urb.transfer_buffer = addr;
>  			urb->urb.transfer_dma = dma;
>  			urb->urb.transfer_buffer_length = max_packet_size;
> diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c
> index 1e7a47a..bf618e1 100644
> --- a/sound/usb/usx2y/usb_stream.c
> +++ b/sound/usb/usx2y/usb_stream.c
> @@ -69,7 +69,6 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
>  	     ++u, transfer += transfer_length) {
>  		struct urb *urb = urbs[u];
>  		struct usb_iso_packet_descriptor *desc;
> -		urb->transfer_flags = URB_ISO_ASAP;
>  		urb->transfer_buffer = transfer;
>  		urb->dev = dev;
>  		urb->pipe = pipe;
> diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c
> index 520ef96..b376532 100644
> --- a/sound/usb/usx2y/usbusx2yaudio.c
> +++ b/sound/usb/usx2y/usbusx2yaudio.c
> @@ -503,7 +503,6 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs)
>  			if (0 == i)
>  				atomic_set(&subs->state, state_STARTING3);
>  			urb->dev = usX2Y->dev;
> -			urb->transfer_flags = URB_ISO_ASAP;
>  			for (pack = 0; pack < nr_of_packs(); pack++) {
>  				urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack;
>  				urb->iso_frame_desc[pack].length = subs->maxpacksize;
> diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c
> index cc56007..f2a1acd 100644
> --- a/sound/usb/usx2y/usx2yhwdeppcm.c
> +++ b/sound/usb/usx2y/usx2yhwdeppcm.c
> @@ -443,7 +443,6 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs)
>  					if (0 == u)
>  						atomic_set(&subs->state, state_STARTING3);
>  					urb->dev = usX2Y->dev;
> -					urb->transfer_flags = URB_ISO_ASAP;
>  					for (pack = 0; pack < nr_of_packs(); pack++) {
>  						urb->iso_frame_desc[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs());
>  						urb->iso_frame_desc[pack].length = subs->maxpacksize;
> 


More information about the Alsa-devel mailing list