| Index: media/audio/win/audio_low_latency_output_win.cc
|
| diff --git a/media/audio/win/audio_low_latency_output_win.cc b/media/audio/win/audio_low_latency_output_win.cc
|
| index 9fa035d80ba6aec06859dfcea5c2f04202e0e1cd..9206e685ba3636e9ba7ca63dc4af1806c75bf55f 100644
|
| --- a/media/audio/win/audio_low_latency_output_win.cc
|
| +++ b/media/audio/win/audio_low_latency_output_win.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/macros.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "base/time/time.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "base/win/scoped_propvariant.h"
|
| #include "media/audio/audio_device_description.h"
|
| @@ -511,7 +512,7 @@ bool WASAPIAudioOutputStream::RenderAudioFromSource(UINT64 device_frequency) {
|
| // can typically be utilized by an acoustic echo-control (AEC)
|
| // unit at the render side.
|
| UINT64 position = 0;
|
| - uint32_t audio_delay_bytes = 0;
|
| + base::TimeTicks target_playout_time = base::TimeTicks::Now();
|
| hr = audio_clock_->GetPosition(&position, NULL);
|
| if (SUCCEEDED(hr)) {
|
| // Stream position of the sample that is currently playing
|
| @@ -525,17 +526,18 @@ bool WASAPIAudioOutputStream::RenderAudioFromSource(UINT64 device_frequency) {
|
| size_t pos_last_sample_written_frames =
|
| num_written_frames_ + packet_size_frames_;
|
|
|
| - // Derive the actual delay value which will be fed to the
|
| - // render client using the OnMoreData() callback.
|
| - audio_delay_bytes = (pos_last_sample_written_frames -
|
| - pos_sample_playing_frames) * format_.Format.nBlockAlign;
|
| + double audio_delay_frames =
|
| + pos_last_sample_written_frames - pos_sample_playing_frames;
|
| +
|
| + target_playout_time += base::TimeDelta::FromSecondsD(
|
| + audio_delay_frames / format_.Format.nSamplesPerSec);
|
| }
|
|
|
| // Read a data packet from the registered client source and
|
| // deliver a delay estimate in the same callback to the client.
|
|
|
| int frames_filled =
|
| - source_->OnMoreData(audio_bus_.get(), audio_delay_bytes, 0);
|
| + source_->OnMoreData(target_playout_time, 0, audio_bus_.get());
|
| uint32_t num_filled_bytes = frames_filled * format_.Format.nBlockAlign;
|
| DCHECK_LE(num_filled_bytes, packet_size_bytes_);
|
|
|
| @@ -641,7 +643,7 @@ HRESULT WASAPIAudioOutputStream::ExclusiveModeInitialization(
|
| }
|
|
|
| void WASAPIAudioOutputStream::StopThread() {
|
| - if (render_thread_ ) {
|
| + if (render_thread_) {
|
| if (render_thread_->HasBeenStarted()) {
|
| // Wait until the thread completes and perform cleanup.
|
| SetEvent(stop_render_event_.Get());
|
|
|