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

Side by Side Diff: media/filters/audio_renderer_impl.cc

Issue 10823175: Switch AudioRenderSink::Callback to use AudioBus. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleanup MCR AudioBus usage. Created 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/audio_renderer_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "media/filters/audio_renderer_impl.h" 5 #include "media/filters/audio_renderer_impl.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 base::AutoLock auto_lock(lock_); 325 base::AutoLock auto_lock(lock_);
326 return algorithm_->playback_rate(); 326 return algorithm_->playback_rate();
327 } 327 }
328 328
329 bool AudioRendererImpl::IsBeforePrerollTime( 329 bool AudioRendererImpl::IsBeforePrerollTime(
330 const scoped_refptr<Buffer>& buffer) { 330 const scoped_refptr<Buffer>& buffer) {
331 return (state_ == kPrerolling) && buffer && !buffer->IsEndOfStream() && 331 return (state_ == kPrerolling) && buffer && !buffer->IsEndOfStream() &&
332 (buffer->GetTimestamp() + buffer->GetDuration()) < preroll_timestamp_; 332 (buffer->GetTimestamp() + buffer->GetDuration()) < preroll_timestamp_;
333 } 333 }
334 334
335 int AudioRendererImpl::Render(const std::vector<float*>& audio_data, 335 int AudioRendererImpl::Render(AudioBus* audio_bus,
336 int number_of_frames,
337 int audio_delay_milliseconds) { 336 int audio_delay_milliseconds) {
338 if (stopped_ || GetPlaybackRate() == 0.0f) { 337 if (stopped_ || GetPlaybackRate() == 0.0f) {
339 // Output silence if stopped. 338 // Output silence if stopped.
340 for (size_t i = 0; i < audio_data.size(); ++i) 339 audio_bus->Zero();
341 memset(audio_data[i], 0, sizeof(float) * number_of_frames);
342 return 0; 340 return 0;
343 } 341 }
344 342
345 // Adjust the playback delay. 343 // Adjust the playback delay.
346 base::TimeDelta request_delay = 344 base::TimeDelta request_delay =
347 base::TimeDelta::FromMilliseconds(audio_delay_milliseconds); 345 base::TimeDelta::FromMilliseconds(audio_delay_milliseconds);
348 346
349 // Finally we need to adjust the delay according to playback rate. 347 // Finally we need to adjust the delay according to playback rate.
350 if (GetPlaybackRate() != 1.0f) { 348 if (GetPlaybackRate() != 1.0f) {
351 request_delay = base::TimeDelta::FromMicroseconds( 349 request_delay = base::TimeDelta::FromMicroseconds(
352 static_cast<int64>(ceil(request_delay.InMicroseconds() * 350 static_cast<int64>(ceil(request_delay.InMicroseconds() *
353 GetPlaybackRate()))); 351 GetPlaybackRate())));
354 } 352 }
355 353
356 int bytes_per_frame = audio_parameters_.GetBytesPerFrame(); 354 int bytes_per_frame = audio_parameters_.GetBytesPerFrame();
357 355
358 const int buf_size = number_of_frames * bytes_per_frame; 356 const int buf_size = audio_bus->frames() * bytes_per_frame;
359 scoped_array<uint8> buf(new uint8[buf_size]); 357 scoped_array<uint8> buf(new uint8[buf_size]);
360 358
361 int frames_filled = FillBuffer(buf.get(), number_of_frames, request_delay); 359 int frames_filled = FillBuffer(buf.get(), audio_bus->frames(), request_delay);
362 int bytes_filled = frames_filled * bytes_per_frame; 360 int bytes_filled = frames_filled * bytes_per_frame;
363 DCHECK_LE(bytes_filled, buf_size); 361 DCHECK_LE(bytes_filled, buf_size);
364 UpdateEarliestEndTime(bytes_filled, request_delay, base::Time::Now()); 362 UpdateEarliestEndTime(bytes_filled, request_delay, base::Time::Now());
365 363
366 // Deinterleave each audio channel. 364 // Deinterleave each audio channel.
367 int channels = audio_data.size(); 365 int channels = audio_bus->channels();
368 for (int channel_index = 0; channel_index < channels; ++channel_index) { 366 for (int channel_index = 0; channel_index < channels; ++channel_index) {
369 media::DeinterleaveAudioChannel(buf.get(), 367 media::DeinterleaveAudioChannel(buf.get(),
370 audio_data[channel_index], 368 audio_bus->channel(channel_index),
371 channels, 369 channels,
372 channel_index, 370 channel_index,
373 bytes_per_frame / channels, 371 bytes_per_frame / channels,
374 frames_filled); 372 frames_filled);
375 373
376 // If FillBuffer() didn't give us enough data then zero out the remainder. 374 // If FillBuffer() didn't give us enough data then zero out the remainder.
377 if (frames_filled < number_of_frames) { 375 if (frames_filled < audio_bus->frames()) {
378 int frames_to_zero = number_of_frames - frames_filled; 376 int frames_to_zero = audio_bus->frames() - frames_filled;
379 memset(audio_data[channel_index] + frames_filled, 377 memset(audio_bus->channel(channel_index) + frames_filled, 0,
380 0, 378 sizeof(*audio_bus->channel(channel_index)) * frames_to_zero);
381 sizeof(float) * frames_to_zero);
382 } 379 }
383 } 380 }
384 return frames_filled; 381 return frames_filled;
385 } 382 }
386 383
387 uint32 AudioRendererImpl::FillBuffer(uint8* dest, 384 uint32 AudioRendererImpl::FillBuffer(uint8* dest,
388 uint32 requested_frames, 385 uint32 requested_frames,
389 const base::TimeDelta& playback_delay) { 386 const base::TimeDelta& playback_delay) {
390 base::TimeDelta current_time = kNoTimestamp(); 387 base::TimeDelta current_time = kNoTimestamp();
391 base::TimeDelta max_time = kNoTimestamp(); 388 base::TimeDelta max_time = kNoTimestamp();
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 case kUnderflow: 538 case kUnderflow:
542 case kRebuffering: 539 case kRebuffering:
543 case kStopped: 540 case kStopped:
544 if (status != PIPELINE_OK) 541 if (status != PIPELINE_OK)
545 error_cb_.Run(status); 542 error_cb_.Run(status);
546 return; 543 return;
547 } 544 }
548 } 545 }
549 546
550 } // namespace media 547 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/audio_renderer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698