Skip to content

Commit e700daa

Browse files
committed
Crash fix: Skip-ahead logic in LoopbackStream.
Updates the skip-ahead logic in audio::LoopbackStream to skip forward by one more buffer. Because of integer truncation/rounding issues when converting between units (samples→microseconds), the previous logic might occasionally not skip-ahead far enough in time. In these cases, the next buffer generation time would be a point-in-time a few microseconds in the past, which would rightly trigger a DCHECK(). Bug: 847487 Change-Id: I1b8495e4b9dc71c95ad5bcc6ee5dd252dd54a364 Reviewed-on: https://chromium-review.googlesource.com/1077613 Reviewed-by: Xiangjun Zhang <[email protected]> Commit-Queue: Yuri Wiitala <[email protected]> Cr-Original-Commit-Position: refs/heads/master@{#562692}(cherry picked from commit a157e95) Reviewed-on: https://chromium-review.googlesource.com/1081475 Reviewed-by: Yuri Wiitala <[email protected]> Cr-Commit-Position: refs/branch-heads/3440@{#70} Cr-Branched-From: 010ddcf-refs/heads/master@{#561733}
1 parent 64bef94 commit e700daa

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

services/audio/loopback_stream.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -355,13 +355,15 @@ void LoopbackStream::FlowNetwork::GenerateMoreAudio() {
355355
(now - first_generate_time_).InMicroseconds() *
356356
output_params_.sample_rate() / base::Time::kMicrosecondsPerSecond;
357357
if (frames_elapsed_ < required_frames_elapsed) {
358-
// Audio generation has fallen behind. Skip ahead to the next interval.
359358
TRACE_EVENT_INSTANT1("audio", "GenerateMoreAudio Is Behind",
360359
TRACE_EVENT_SCOPE_THREAD, "frames_behind",
361360
(required_frames_elapsed - frames_elapsed_));
362-
frames_elapsed_ = ((required_frames_elapsed + frames_per_buffer - 1) /
363-
frames_per_buffer) *
364-
frames_per_buffer;
361+
// Audio generation has fallen behind. Skip-ahead the frame counter so that
362+
// audio generation will resume for the next buffer after the one that
363+
// should be generating right now. http://crbug.com/847487
364+
const int64_t required_buffers_elapsed =
365+
((required_frames_elapsed + frames_per_buffer - 1) / frames_per_buffer);
366+
frames_elapsed_ = (required_buffers_elapsed + 1) * frames_per_buffer;
365367
}
366368
next_generate_time_ =
367369
first_generate_time_ +

0 commit comments

Comments
 (0)