]> err.no Git - linux-2.6/commitdiff
[ALSA] usb-audio - sanity-check sync feedback frequency values
authorClemens Ladisch <clemens@ladisch.de>
Fri, 13 May 2005 05:44:13 +0000 (07:44 +0200)
committerJaroslav Kysela <perex@suse.cz>
Sun, 29 May 2005 08:08:50 +0000 (10:08 +0200)
USB generic driver
Check that the synchronization feedback frequency values returned by the
device are more or less near the nominal frequency.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
sound/usb/usbaudio.c

index c360ab9783d50b731986295ba6c0fc259015732b..a6ed0d08337e486ad46841e3dc0af5875a53da0e 100644 (file)
@@ -452,17 +452,11 @@ static int retire_playback_sync_urb(snd_usb_substream_t *subs,
        if (urb->iso_frame_desc[0].status == 0 &&
            urb->iso_frame_desc[0].actual_length == 3) {
                f = combine_triple((u8*)urb->transfer_buffer) << 2;
-#if 0
-               if (f < subs->freqn - (subs->freqn>>3) || f > subs->freqmax) {
-                       snd_printd(KERN_WARNING "requested frequency %d (%u,%03uHz) out of range (current nominal %d (%u,%03uHz))\n",
-                                  f, f >> 14, (f & ((1 << 14) - 1) * 1000) / ((1 << 14) - 1),
-                                  subs->freqn, subs->freqn >> 14, (subs->freqn & ((1 << 14) - 1) * 1000) / ((1 << 14) - 1));
-                       continue;
+               if (f >= subs->freqn - subs->freqn / 8 && f <= subs->freqmax) {
+                       spin_lock_irqsave(&subs->lock, flags);
+                       subs->freqm = f;
+                       spin_unlock_irqrestore(&subs->lock, flags);
                }
-#endif
-               spin_lock_irqsave(&subs->lock, flags);
-               subs->freqm = f;
-               spin_unlock_irqrestore(&subs->lock, flags);
        }
 
        return 0;
@@ -484,9 +478,11 @@ static int retire_playback_sync_urb_hs(snd_usb_substream_t *subs,
        if (urb->iso_frame_desc[0].status == 0 &&
            urb->iso_frame_desc[0].actual_length == 4) {
                f = combine_quad((u8*)urb->transfer_buffer) & 0x0fffffff;
-               spin_lock_irqsave(&subs->lock, flags);
-               subs->freqm = f;
-               spin_unlock_irqrestore(&subs->lock, flags);
+               if (f >= subs->freqn - subs->freqn / 8 && f <= subs->freqmax) {
+                       spin_lock_irqsave(&subs->lock, flags);
+                       subs->freqm = f;
+                       spin_unlock_irqrestore(&subs->lock, flags);
+               }
        }
 
        return 0;