Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1227)

Unified Diff: media/audio/win/audio_low_latency_output_win.cc

Issue 2101303004: Pass delay and timestamp to AudioSourceCallback::OnMoreData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Changes based on comments Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());

Powered by Google App Engine
This is Rietveld 408576698