OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/cma/backend/alsa/stream_mixer_alsa_input_impl.h" | 5 #include "chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 caller_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 69 caller_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
70 state_(kStateUninitialized), | 70 state_(kStateUninitialized), |
71 volume_multiplier_(1.0f), | 71 volume_multiplier_(1.0f), |
72 queued_frames_(0), | 72 queued_frames_(0), |
73 queued_frames_including_resampler_(0), | 73 queued_frames_including_resampler_(0), |
74 current_buffer_offset_(0), | 74 current_buffer_offset_(0), |
75 max_queued_frames_(kMaxInputQueueUs * input_samples_per_second / | 75 max_queued_frames_(kMaxInputQueueUs * input_samples_per_second / |
76 base::Time::kMicrosecondsPerSecond), | 76 base::Time::kMicrosecondsPerSecond), |
77 fade_frames_remaining_(0), | 77 fade_frames_remaining_(0), |
78 fade_out_frames_total_(0), | 78 fade_out_frames_total_(0), |
| 79 zeroed_frames_(0), |
79 weak_factory_(this) { | 80 weak_factory_(this) { |
80 DCHECK(delegate_); | 81 DCHECK(delegate_); |
81 DCHECK(mixer_); | 82 DCHECK(mixer_); |
82 weak_this_ = weak_factory_.GetWeakPtr(); | 83 weak_this_ = weak_factory_.GetWeakPtr(); |
83 } | 84 } |
84 | 85 |
85 StreamMixerAlsaInputImpl::~StreamMixerAlsaInputImpl() { | 86 StreamMixerAlsaInputImpl::~StreamMixerAlsaInputImpl() { |
86 DCHECK(mixer_task_runner_->BelongsToCurrentThread()); | 87 DCHECK(mixer_task_runner_->BelongsToCurrentThread()); |
87 } | 88 } |
88 | 89 |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 const float* buffer_samples = | 357 const float* buffer_samples = |
357 reinterpret_cast<const float*>(buffer->data()); | 358 reinterpret_cast<const float*>(buffer->data()); |
358 for (int i = 0; i < kNumOutputChannels; ++i) { | 359 for (int i = 0; i < kNumOutputChannels; ++i) { |
359 const float* buffer_channel = buffer_samples + (buffer_frames * i); | 360 const float* buffer_channel = buffer_samples + (buffer_frames * i); |
360 memcpy(output->channel(i) + frames_filled, | 361 memcpy(output->channel(i) + frames_filled, |
361 buffer_channel + buffer_offset, | 362 buffer_channel + buffer_offset, |
362 frames_to_copy * sizeof(float)); | 363 frames_to_copy * sizeof(float)); |
363 } | 364 } |
364 frames_left -= frames_to_copy; | 365 frames_left -= frames_to_copy; |
365 frames_filled += frames_to_copy; | 366 frames_filled += frames_to_copy; |
| 367 LOG_IF(WARNING, zeroed_frames_ > 0) |
| 368 << "Filled a total of " << zeroed_frames_ << " frames with 0"; |
| 369 zeroed_frames_ = 0; |
366 } else { | 370 } else { |
367 // No data left in queue; fill remaining frames with zeros. | 371 // No data left in queue; fill remaining frames with zeros. |
368 LOG(WARNING) << "Filling " << frames_left << " frames with 0"; | 372 LOG_IF(WARNING, zeroed_frames_ == 0) << "Starting to fill frames with 0"; |
| 373 zeroed_frames_ += frames_left; |
369 output->ZeroFramesPartial(frames_filled, frames_left); | 374 output->ZeroFramesPartial(frames_filled, frames_left); |
370 frames_filled += frames_left; | 375 frames_filled += frames_left; |
371 frames_left = 0; | 376 frames_left = 0; |
372 break; | 377 break; |
373 } | 378 } |
374 } | 379 } |
375 | 380 |
376 DCHECK_EQ(0, frames_left); | 381 DCHECK_EQ(0, frames_left); |
377 DCHECK_EQ(frames, frames_filled); | 382 DCHECK_EQ(frames, frames_filled); |
378 } | 383 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 DCHECK(!IsDeleting()); | 448 DCHECK(!IsDeleting()); |
444 if (paused) { | 449 if (paused) { |
445 if (state_ == kStateUninitialized) { | 450 if (state_ == kStateUninitialized) { |
446 state_ = kStatePaused; | 451 state_ = kStatePaused; |
447 } else if (state_ == kStateNormalPlayback) { | 452 } else if (state_ == kStateNormalPlayback) { |
448 fade_frames_remaining_ = NormalFadeFrames() - fade_frames_remaining_; | 453 fade_frames_remaining_ = NormalFadeFrames() - fade_frames_remaining_; |
449 state_ = (fade_frames_remaining_ ? kStateFadingOut : kStatePaused); | 454 state_ = (fade_frames_remaining_ ? kStateFadingOut : kStatePaused); |
450 } else { | 455 } else { |
451 return; | 456 return; |
452 } | 457 } |
453 LOG(INFO) << "Pausing"; | 458 LOG(INFO) << "Pausing " << this; |
454 } else { | 459 } else { |
455 if (state_ == kStateFadingOut) { | 460 if (state_ == kStateFadingOut) { |
456 fade_frames_remaining_ = NormalFadeFrames() - fade_frames_remaining_; | 461 fade_frames_remaining_ = NormalFadeFrames() - fade_frames_remaining_; |
457 } else if (state_ == kStatePaused) { | 462 } else if (state_ == kStatePaused) { |
458 fade_frames_remaining_ = NormalFadeFrames(); | 463 fade_frames_remaining_ = NormalFadeFrames(); |
459 } else { | 464 } else { |
460 return; | 465 return; |
461 } | 466 } |
462 LOG(INFO) << "Unpausing"; | 467 LOG(INFO) << "Unpausing " << this; |
463 state_ = kStateNormalPlayback; | 468 state_ = kStateNormalPlayback; |
464 } | 469 } |
465 DCHECK_GE(fade_frames_remaining_, 0); | 470 DCHECK_GE(fade_frames_remaining_, 0); |
466 | 471 |
467 if (state_ == kStateFadingOut) { | 472 if (state_ == kStateFadingOut) { |
468 // Tell the mixer that some more data might be available (since when fading | 473 // Tell the mixer that some more data might be available (since when fading |
469 // out, we can drain the queue completely). | 474 // out, we can drain the queue completely). |
470 mixer_->OnFramesQueued(); | 475 mixer_->OnFramesQueued(); |
471 } | 476 } |
472 } | 477 } |
473 | 478 |
474 void StreamMixerAlsaInputImpl::SetVolumeMultiplier(float multiplier) { | 479 void StreamMixerAlsaInputImpl::SetVolumeMultiplier(float multiplier) { |
475 RUN_ON_MIXER_THREAD(SetVolumeMultiplier, multiplier); | 480 RUN_ON_MIXER_THREAD(SetVolumeMultiplier, multiplier); |
476 DCHECK(!IsDeleting()); | 481 DCHECK(!IsDeleting()); |
477 if (multiplier > 1.0f) | 482 if (multiplier > 1.0f) |
478 multiplier = 1.0f; | 483 multiplier = 1.0f; |
479 if (multiplier < 0.0f) | 484 if (multiplier < 0.0f) |
480 multiplier = 0.0f; | 485 multiplier = 0.0f; |
481 volume_multiplier_ = multiplier; | 486 volume_multiplier_ = multiplier; |
482 } | 487 } |
483 | 488 |
484 } // namespace media | 489 } // namespace media |
485 } // namespace chromecast | 490 } // namespace chromecast |
OLD | NEW |