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()); |