Skip to content

Commit

Permalink
USB: gadget: f_audio_source: Adjust packet timing to reduce glitches
Browse files Browse the repository at this point in the history
Increase max packet size and clean up timing logic so we can better
recover from not getting an interrupt in time for a SOF.

Signed-off-by: Mike Lockwood <lockwood@google.com>
  • Loading branch information
Mike Lockwood authored and pershoot committed Jul 26, 2012
1 parent cbfcc03 commit 6d496f8
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions drivers/usb/gadget-ics/f_audio_source.c
Expand Up @@ -25,11 +25,11 @@
/* Each frame is two 16 bit integers (one per channel) */
#define BYTES_PER_FRAME 4
#define FRAMES_PER_MSEC (SAMPLE_RATE / 1000)
/* Add one to FRAMES_PER_MSEC to adjust for round-off above */
#define IN_EP_MAX_PACKET_SIZE ((FRAMES_PER_MSEC + 1) * BYTES_PER_FRAME)

#define IN_EP_MAX_PACKET_SIZE 256

/* Number of requests to allocate */
#define IN_EP_REQ_COUNT 16
#define IN_EP_REQ_COUNT 4

#define AUDIO_AC_INTERFACE 0
#define AUDIO_AS_INTERFACE 1
Expand Down Expand Up @@ -339,25 +339,26 @@ static void audio_send(struct audio_dev *audio)

runtime = audio->substream->runtime;

/* compute number of frames to send */
now = ktime_get();
msecs = ktime_to_ns(now) - ktime_to_ns(audio->start_time);
do_div(msecs, 1000000);
/* Add a bit to msecs so we queue some extra requests in case
* we miss a few SOFs due to interrupts being disabled or CPU load.
*/
msecs += IN_EP_REQ_COUNT/2;
frames = msecs * SAMPLE_RATE;
do_div(frames, 1000);

/* Readjust our frames_sent if we fall too far behind.
* If we get too far behind it is better to drop some frames than
* to keep sending data too fast in an attempt to catch up.
*/
if (frames - audio->frames_sent > 2 * FRAMES_PER_MSEC * IN_EP_REQ_COUNT)
if (frames - audio->frames_sent > 10 * FRAMES_PER_MSEC)
audio->frames_sent = frames - FRAMES_PER_MSEC;

frames -= audio->frames_sent;

/* We need to send something to keep the pipeline going */
if (frames <= 0)
frames = FRAMES_PER_MSEC;

while (frames > 0) {
req = audio_req_get(audio);
if (!req)
Expand Down

0 comments on commit 6d496f8

Please sign in to comment.