[alsa-devel] [Alsa-user] Ticks when playing to USB DAC at high sample rates

Daniel Mack zonque at gmail.com
Thu Nov 22 20:29:05 CET 2012


Hi Jeffrey,

sorry for the late reply.

On 08.11.2012 19:54, Jeffrey Barish wrote:
> On Wed 07 November 2012 10:01:14 Daniel Mack wrote:
>> On 07.11.2012 00:54, Jeffrey Barish wrote:
>>> I guess that snd_usb_pcm_prepare is called by the core usb system to
>>> prepare the snd driver.  Anyway, snd_usb_pcm_prepare calls
>>> configure_endpoint with a substream.  Then configure_endpoint calls
>>> snd_usb_endpoint_set_params with the data endpoint that corresponds to
>>> the substream.  snd_usb_endpoint_set_params calls data_ep_set_params with
>>> the data ep and data_ep_set_params sets nurbs to 2 for the data endpoint.
>>>
>>> snd_usb_endpoint_set_params has code to call sync_ep_set_params when the
>>> endpoint is type sync.  sync_ep_set_params sets nurbs to 4 (why?). 
>>> However, snd_usb_endpoint_set_params never invokes the call to
>>> sync_ep_set_params because ep->type is always data.  Back up:
>>> snd_usb_endpoint_set_params is called from configure_endpoint.  It is
>>> called from an if block contingent on the substream's having a sync
>>> endpoint.  It does.  However, the call to snd_usb_endpoint_set_params
>>> passes subs->data_endpoint as the first argument, so
>>> snd_usb_endpoint_set_params simply repeats the operations it performed as
>>> a result of the previous invocation.  I presume that the first argument
>>> to the second call to snd_usb_endpoint_set_params should be
>>> subs->sync_endpoint.
>> Eh. You clearly spotted a bug here. The rally interesting thing is that
>> that it didn't bite us earlier, as it's in since 3.6.
> 
> Here's the diff.  I can't figure out how to submit a patch.
> 
> --- sound/usb/pcm.c.orig        2012-11-08 11:43:57.309732860 -0700
> +++ sound/usb/pcm.c     2012-11-08 11:41:06.512420658 -0700
> @@ -456,7 +456,7 @@ static int configure_endpoint(struct snd
>                 return ret;
>  
>         if (subs->sync_endpoint)
> -               ret = snd_usb_endpoint_set_params(subs->data_endpoint,
> +               ret = snd_usb_endpoint_set_params(subs->sync_endpoint,
>                                                   subs->pcm_format,
>                                                   subs->channels,
>                                                   subs->period_bytes,

Thanks - I just sent out a patch for this.



Daniel




More information about the Alsa-devel mailing list