| 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..a49a9302588f140aa46a2e01744c55ae49b9f41d 100644
|
| --- a/media/audio/android/opensles_output.cc
|
| +++ b/media/audio/android/opensles_output.cc
|
| @@ -6,8 +6,10 @@
|
|
|
| #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"
|
| +#include "media/base/audio_timestamp_helper.h"
|
|
|
| #define LOG_ON_FAILURE_AND_RETURN(op, ...) \
|
| do { \
|
| @@ -340,16 +342,25 @@ 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);
|
| +
|
| + const base::TimeDelta delay =
|
| + AudioTimestampHelper::FramesToTime(delay_frames, 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;
|
|
|