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

Side by Side Diff: chromecast/media/audio/cast_audio_mixer.cc

Issue 2101303004: Pass delay and timestamp to AudioSourceCallback::OnMoreData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Fix Windows CQ errors. Created 4 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/media/audio/cast_audio_mixer.h" 5 #include "chromecast/media/audio/cast_audio_mixer.h"
6 6
7 #include "base/logging.h"
7 #include "chromecast/media/audio/cast_audio_manager.h" 8 #include "chromecast/media/audio/cast_audio_manager.h"
8 #include "chromecast/media/audio/cast_audio_output_stream.h" 9 #include "chromecast/media/audio/cast_audio_output_stream.h"
9 #include "media/base/channel_layout.h" 10 #include "media/base/channel_layout.h"
10 11
11 namespace { 12 namespace {
12 const int kBitsPerSample = 16; 13 const int kBitsPerSample = 16;
13 const int kFramesPerBuffer = 1024; 14 const int kFramesPerBuffer = 1024;
14 const int kSampleRate = 48000; 15 const int kSampleRate = 48000;
15 } // namespace 16 } // namespace
16 17
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); 134 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread());
134 135
135 *volume = volume_; 136 *volume = volume_;
136 } 137 }
137 138
138 // ::media::AudioConverter::InputCallback implementation 139 // ::media::AudioConverter::InputCallback implementation
139 double ProvideInput(::media::AudioBus* audio_bus, 140 double ProvideInput(::media::AudioBus* audio_bus,
140 uint32_t frames_delayed) override { 141 uint32_t frames_delayed) override {
141 DCHECK(source_callback_); 142 DCHECK(source_callback_);
142 143
143 uint32_t bytes_delay = frames_delayed * input_params_.GetBytesPerFrame(); 144 const base::TimeDelta delay = base::TimeDelta::FromMicroseconds(
144 source_callback_->OnMoreData(audio_bus, bytes_delay, 0); 145 frames_delayed * base::Time::kMicrosecondsPerSecond /
146 input_params_.sample_rate());
chcunningham 2016/09/23 20:53:29 int division
jameswest 2016/09/29 00:52:24 Moved to utility function.
147 source_callback_->OnMoreData(delay, base::TimeTicks::Now(), 0, audio_bus);
145 return volume_; 148 return volume_;
146 } 149 }
147 150
148 CastAudioManager* const audio_manager_; 151 CastAudioManager* const audio_manager_;
149 CastAudioMixer* const audio_mixer_; 152 CastAudioMixer* const audio_mixer_;
150 153
151 std::unique_ptr<ResamplerProxy> proxy_; 154 std::unique_ptr<ResamplerProxy> proxy_;
152 AudioSourceCallback* source_callback_; 155 AudioSourceCallback* source_callback_;
153 const ::media::AudioParameters input_params_; 156 const ::media::AudioParameters input_params_;
154 const ::media::AudioParameters output_params_; 157 const ::media::AudioParameters output_params_;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 void CastAudioMixer::RemoveInput( 241 void CastAudioMixer::RemoveInput(
239 ::media::AudioConverter::InputCallback* input_callback) { 242 ::media::AudioConverter::InputCallback* input_callback) {
240 DCHECK(thread_checker_.CalledOnValidThread()); 243 DCHECK(thread_checker_.CalledOnValidThread());
241 244
242 mixer_->RemoveInput(input_callback); 245 mixer_->RemoveInput(input_callback);
243 // Stop |output_stream_| if there are no inputs and the stream is running. 246 // Stop |output_stream_| if there are no inputs and the stream is running.
244 if (mixer_->empty() && output_stream_) 247 if (mixer_->empty() && output_stream_)
245 output_stream_->Stop(); 248 output_stream_->Stop();
246 } 249 }
247 250
248 int CastAudioMixer::OnMoreData(::media::AudioBus* dest, 251 int CastAudioMixer::OnMoreData(base::TimeDelta delay,
249 uint32_t total_bytes_delay, 252 base::TimeTicks /* delay_timestamp */,
250 uint32_t frames_skipped) { 253 int /* prior_frames_skipped */,
254 ::media::AudioBus* dest) {
251 DCHECK(thread_checker_.CalledOnValidThread()); 255 DCHECK(thread_checker_.CalledOnValidThread());
252 256
253 uint32_t frames_delayed = 257 uint32_t frames_delayed = delay.InSecondsF() * output_params_.sample_rate();
chcunningham 2016/09/23 20:53:29 What do you think about delay in frames instead of
miu 2016/09/28 23:04:41 I'm torn between both, myself. But, overall, I sup
jameswest 2016/09/29 00:52:24 I'm personally ambivalent. One thing I'll add is t
254 total_bytes_delay / output_params_.GetBytesPerFrame();
255 mixer_->ConvertWithDelay(frames_delayed, dest); 258 mixer_->ConvertWithDelay(frames_delayed, dest);
256 return dest->frames(); 259 return dest->frames();
257 } 260 }
258 261
259 void CastAudioMixer::OnError(::media::AudioOutputStream* stream) { 262 void CastAudioMixer::OnError(::media::AudioOutputStream* stream) {
260 DCHECK(thread_checker_.CalledOnValidThread()); 263 DCHECK(thread_checker_.CalledOnValidThread());
261 DCHECK(output_stream_ == stream); 264 DCHECK(output_stream_ == stream);
262 265
263 // TODO(ameyak): Add rate limiting. If errors are seen to occur 266 // TODO(ameyak): Add rate limiting. If errors are seen to occur
264 // above some arbitrary value in a specified amount 267 // above some arbitrary value in a specified amount
(...skipping 10 matching lines...) Expand all
275 // Assume error state 278 // Assume error state
276 output_stream_->Close(); 279 output_stream_->Close();
277 output_stream_ = nullptr; 280 output_stream_ = nullptr;
278 error_ = true; 281 error_ = true;
279 for (auto it = proxy_streams_.begin(); it != proxy_streams_.end(); it++) 282 for (auto it = proxy_streams_.begin(); it != proxy_streams_.end(); it++)
280 (*it)->OnError(); 283 (*it)->OnError();
281 } 284 }
282 } 285 }
283 286
284 } // namespace media 287 } // namespace media
285 } // namespace chromecast 288 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698