Re: [PATCH] ALSA: usb: improve delay reporting

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

 



On 05.04.2018 16:13, Pierre-Louis Bossart wrote:
On 4/5/18 6:49 AM, Georg Chini wrote:
On 04.04.2018 21:24, Pierre-Louis Bossart wrote:
On 04/04/2018 08:57 AM, Georg Chini wrote:

Currently, the kernel uses only the number of USB frames to interpolate the delay between sending or receiving URB's. This limits the granuarity of the delay reports to one millisecond because the frame counter is updated in a millisecond interval.

This patch additionally uses time stamps to achieve higher precision of the reported delay. If the time difference computed using time stamps does not deviate more than one millisecond from the difference computed using frames, it is assumed that the
system time difference delivers the more precise delay estimate.

This will significantly increase the precision of the reported delay in the majority of cases where sound card clock and system clock are almost in sync while falling back to the old method for the rare cases where the two times differ too much.
I am all for better delay estimates but I have mixed feelings about this - and some hardware-related parts are broken.

Well, I only stumbled into this because of the recent delay estimation issues in pulseaudio, so forgive my ignorance about ALSA. If the general idea of the patch is not right, just ignore
my other comments and drop the patch.

It's complicated to change this part of the code. When I added the use of the frame counter some 5 years back, it created all sorts of issues on various platforms that I was not even aware of.

Your implementation raises obvious questions and would need quite a bit of revalidation. In its current state it's not ready for prime time.

OK, so as I said, just forget about it.


  @@ -1334,7 +1347,9 @@ static void retire_capture_urb(struct snd_usb_substream *subs,
            /* realign last_frame_number */
          subs->last_frame_number = current_frame_number;
-        subs->last_frame_number &= 0xFF; /* keep 8 LSBs */

You can't remove this, this models the fact that only 8 bits are valid in the frame counter.

This is not necessary because the value is
only used in snd_usb_pcm_delay() and (a - b) & 0xff = (a - b & 0xff) & 0xff. You can prove this by writing a and b as a = 256 * a1 + a2 and b = 256 * b1 + b2 with a2
and b2 smaller than 256.

the number of valid bits varies in different controllers so the goal was to align on the common denominator - 8 bits only.
The common denominator will still be 8 bits, using & 0xff once in snd_usb_pcm_delay() when the frame difference is calculated has exactly the same effect, so doing it here
is unnecessary.
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel




[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux