summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/sound/usb/uaudio.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index 99369ca..1a530f2 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -2084,9 +2084,23 @@ uaudio_chan_play_sync_callback(struct usb_xfer *xfer, usb_error_t error)
* Use feedback value as fallback when there is no
* recording channel:
*/
- if (ch->priv_sc->sc_rec_chan.num_alt == 0)
- ch->jitter_curr = temp - sample_rate;
+ if (ch->priv_sc->sc_rec_chan.num_alt == 0) {
+ int32_t jitter_max = howmany(sample_rate, 16000);
+ /*
+ * Range check the jitter values to avoid
+ * bogus sample rate adjustments. The expected
+ * deviation should not be more than 1Hz per
+ * second. The USB v2.0 specification also
+ * mandates this requirement. Refer to chapter
+ * 5.12.4.2 about feedback.
+ */
+ ch->jitter_curr = temp - sample_rate;
+ if (ch->jitter_curr > jitter_max)
+ ch->jitter_curr = jitter_max;
+ else if (ch->jitter_curr < -jitter_max)
+ ch->jitter_curr = -jitter_max;
+ }
ch->feedback_rate = temp;
break;
OpenPOWER on IntegriCloud