Chromium Code Reviews| Index: media/audio/android/opensles_output.cc |
| diff --git a/media/audio/android/opensles_output.cc b/media/audio/android/opensles_output.cc |
| index 5dc916ae03a565994736814dfee7d47ba2fc332d..fc2d810244f101866bb8078c09a7bd65f2e54939 100644 |
| --- a/media/audio/android/opensles_output.cc |
| +++ b/media/audio/android/opensles_output.cc |
| @@ -6,6 +6,7 @@ |
| #include "base/logging.h" |
| #include "base/macros.h" |
| +#include "base/time/time.h" |
| #include "base/trace_event/trace_event.h" |
| #include "media/audio/android/audio_manager_android.h" |
| @@ -340,16 +341,27 @@ void OpenSLESOutputStream::FillBufferQueueNoLock() { |
| // Calculate the position relative to the number of frames written. |
| uint32_t position_in_ms = 0; |
| SLresult err = (*player_)->GetPosition(player_, &position_in_ms); |
| - const int delay = |
| + // Given the position of the playback head, compute the approximate number of |
| + // frames that have been queued to the buffer but not yet played out. |
| + // Note that the value returned by GetFramesToTarget() is negative because |
| + // more frames have been added to |delay_calculator_| than have been played |
| + // out and thus the target timestamp is earlier than the current timestamp of |
| + // |delay_calculator_|. |
| + const int delay_frames = |
| err == SL_RESULT_SUCCESS |
| ? -delay_calculator_.GetFramesToTarget( |
| - base::TimeDelta::FromMilliseconds(position_in_ms)) * |
| - bytes_per_frame_ |
| + base::TimeDelta::FromMilliseconds(position_in_ms)) |
| : 0; |
| - DCHECK_GE(delay, 0); |
| + DCHECK_GE(delay_frames, 0); |
| + |
| + // Convert the frame delay to time. |
| + const base::TimeDelta delay = base::TimeDelta::FromMicroseconds( |
| + delay_frames * base::Time::kMicrosecondsPerSecond / |
|
chcunningham
2016/09/23 20:53:29
int division
jameswest
2016/09/29 00:52:24
Moved to utility function.
|
| + format_.samplesPerSec); |
| // Read data from the registered client source. |
| - const int frames_filled = callback_->OnMoreData(audio_bus_.get(), delay, 0); |
| + const int frames_filled = |
| + callback_->OnMoreData(delay, base::TimeTicks::Now(), 0, audio_bus_.get()); |
| if (frames_filled <= 0) { |
| // Audio source is shutting down, or halted on error. |
| return; |