Re: ALSA -18 infinite loop

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi ,


We are able to do usb audio disconnect with some change in
retire_capture_urb() function .
but we are not sure whether our way to handle this is right or not .
kindly review as i find the error code in retire_capture_urb and
snd_complete() almost same till 2.6.36 kernel .

we checked for error case in retire_capture_urb  here and return -1 from here :

static int retire_capture_urb(struct snd_usb_substream *subs,
struct snd_pcm_runtime *runtime,      struct urb *urb)
{
	for (i = 0; i < urb->number_of_packets; i++) {
		cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset;
		if (urb->iso_frame_desc[i].status) {
			snd_printd(KERN_ERR "frame %d active: %d\n", i,
urb->iso_frame_desc[i].status);
+++++++++++++                      if (urb->iso_frame_desc[i].status
== -71 )  //can check for -18 here also , we get -71 followed by -18
+++++++++++++                          return -1 ;           // return
-1 when if (urb->iso_frame_desc[i].status = -71
		
			// continue;
		}


when we applied this , we find that
in snd_complete_urb() function , these statement executes :

if ((subs->running && subs->ops.retire(subs, substream->runtime, urb))
clear_bit(ctx->index, &subs->active_mask);

in our case here err remains 0 so below statement   donot executes :
//
if (err < 0)
{
			snd_printd(KERN_ERR "cannot submit urb (err = %d)\n", err);
			snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
}
//

now i have few questions :

1) in snd_complete_urb function :

we have first  if statement as :
if ((subs->running && subs->ops.retire(subs, substream->runtime, urb)) ||

ours is capture only device and subs->ops.retire = retire_capture_urb here

in original implementation   , retire_capture_urb always returns 0 .

Since subs->ops.retire(subs, substream->runtime, urb) always return 0 ,
when this condition if ((subs->running && subs->ops.retire(subs,
substream->runtime, urb)) can come true ?

is it right ,  if retire_capture_urb should return -1 on error like we
did above for our case .

2)
with our modification : in snd_complete_urb function
only this statement executes :

clear_bit(ctx->index, &subs->active_mask);

and usb audio disconnects after some time .


but these statements donot execute as err = 0 :
if (err < 0) {
			snd_printd(KERN_ERR "cannot submit urb (err = %d)\n", err);
			snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
	}

my question is this :

at usb audio disconnect , will just clear_bit of subs->active_mask
will do the job for all cleanup required ,
or call snd_pcm_stop() should also be called to do  complete cleanup
at usb audio disconnect ?


Please find time to review my observations and questions .

Thanx & Regards
Amit Nagal





























On Fri, Oct 22, 2010 at 12:52 PM, Clemens Ladisch <clemens@xxxxxxxxxx> wrote:
>>>>>> any clues / pointer to functions .changes which can resolve this
>>>>>> problem in existing linux kernel ?
>>>>
>>>> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=history;f=sound/usb;hb=HEAD
>
> There are three patches with "disconnect" in their title, two of which
> are for the MIDI driver.
>

------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in  U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store 
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Alsa-user mailing list
Alsa-user@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-user


[Index of Archives]     [ALSA Devel]     [Linux Audio Users]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]

  Powered by Linux