Chromium Code Reviews| 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..7af9f832ec4ed1cfea5be33361b721de93f1e0bc 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(); |
|
Mikhail
2016/09/08 07:44:12
wouldn't it be more accurate to use the following
miu
2016/09/08 20:46:48
Good catch! Yes, that sounds like a great idea. WD
James West
2016/09/13 07:40:50
I agree that's the correct way to do it. I impleme
|
| hr = audio_clock_->GetPosition(&position, NULL); |
| if (SUCCEEDED(hr)) { |
| // Stream position of the sample that is currently playing |
| @@ -525,17 +526,19 @@ 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; |
| + int audio_delay_frames = |
| + pos_last_sample_written_frames - pos_sample_playing_frames; |
| + |
| + target_playout_time += base::TimeDelta::FromMicroseconds( |
| + audio_delay_frames * base::Time::kMicrosecondsPerSecond / |
| + 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 +644,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()); |