aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2016-11-12 17:36:28 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2016-11-12 17:36:28 +0000
commitebd60d5f50f0b9196eebf9113e734682b18d561f (patch)
tree4a01e526558bf7710fe78d417502f90d6e4841e0
parent175a986844b97d4d67b5193cd1a65cf19aea5339 (diff)
downloadsrc-ebd60d5f50f0b9196eebf9113e734682b18d561f.tar.gz
src-ebd60d5f50f0b9196eebf9113e734682b18d561f.zip
MFC r308437 and r308461:
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. Allow higher sample rates to have more jitter than lower ones. PR: 208791
Notes
Notes: svn path=/stable/8/; revision=308574
-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 c55740311e18..6e882e569856 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -2047,9 +2047,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;