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

Unified Diff: chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc

Issue 2324533002: [Chromecast] Fix fade-out frames in ALSA mixer (Closed)
Patch Set: 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
index 0a8f0a462da7a4550cd0060682e3d5ac05139214..1e7cc895cc43fcefb9ff7106d9cf1178d2614106 100644
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
@@ -69,6 +69,7 @@ StreamMixerAlsaInputImpl::StreamMixerAlsaInputImpl(
mixer_(mixer),
mixer_task_runner_(mixer_->task_runner()),
caller_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+ resample_ratio_(1.0),
state_(kStateUninitialized),
volume_multiplier_(1.0f),
queued_frames_(0),
@@ -80,12 +81,14 @@ StreamMixerAlsaInputImpl::StreamMixerAlsaInputImpl(
fade_out_frames_total_(0),
zeroed_frames_(0),
weak_factory_(this) {
+ LOG(INFO) << "Create " << this;
DCHECK(delegate_);
DCHECK(mixer_);
weak_this_ = weak_factory_.GetWeakPtr();
}
StreamMixerAlsaInputImpl::~StreamMixerAlsaInputImpl() {
+ LOG(INFO) << "Destroy " << this;
DCHECK(mixer_task_runner_->BelongsToCurrentThread());
}
@@ -111,10 +114,10 @@ void StreamMixerAlsaInputImpl::Initialize(
DCHECK(mixer_task_runner_->BelongsToCurrentThread());
DCHECK(!IsDeleting());
if (mixer_->output_samples_per_second() != input_samples_per_second_) {
- double resample_ratio = static_cast<double>(input_samples_per_second_) /
- mixer_->output_samples_per_second();
+ resample_ratio_ = static_cast<double>(input_samples_per_second_) /
+ mixer_->output_samples_per_second();
resampler_.reset(new ::media::MultiChannelResampler(
- kNumOutputChannels, resample_ratio, kDefaultReadSize,
+ kNumOutputChannels, resample_ratio_, kDefaultReadSize,
base::Bind(&StreamMixerAlsaInputImpl::ReadCB, base::Unretained(this))));
resampler_->PrimeWithSilence();
}
@@ -146,11 +149,14 @@ void StreamMixerAlsaInputImpl::PrepareToDelete(
{
base::AutoLock lock(queue_lock_);
if (state_ == kStateGotEos) {
- fade_out_frames_total_ = queued_frames_including_resampler_;
- fade_frames_remaining_ = queued_frames_including_resampler_;
+ fade_out_frames_total_ =
+ queued_frames_including_resampler_ / resample_ratio_;
+ fade_frames_remaining_ =
+ queued_frames_including_resampler_ / resample_ratio_;
} else if (state_ == kStateNormalPlayback) {
fade_out_frames_total_ =
- std::min(static_cast<int>(queued_frames_including_resampler_),
+ std::min(static_cast<int>(queued_frames_including_resampler_ /
+ resample_ratio_),
NormalFadeFrames());
fade_frames_remaining_ = fade_out_frames_total_;
}
@@ -221,6 +227,7 @@ void StreamMixerAlsaInputImpl::DidQueueData(bool end_of_stream) {
RUN_ON_MIXER_THREAD(DidQueueData, end_of_stream);
DCHECK(!IsDeleting());
if (end_of_stream) {
+ LOG(INFO) << "End of stream for " << this;
state_ = kStateGotEos;
} else if (state_ == kStateUninitialized) {
state_ = kStateNormalPlayback;
@@ -240,9 +247,10 @@ void StreamMixerAlsaInputImpl::AfterWriteFrames(
base::AutoLock lock(queue_lock_);
mixer_rendering_delay_ = mixer_rendering_delay;
queued_frames_ = 0;
- for (const auto& data : queue_)
+ for (const auto& data : queue_) {
queued_frames_ +=
data->data_size() / (kNumOutputChannels * sizeof(float));
+ }
queued_frames_ -= current_buffer_offset_;
DCHECK_GE(queued_frames_, 0);
queued_frames_including_resampler_ =
@@ -253,8 +261,10 @@ void StreamMixerAlsaInputImpl::AfterWriteFrames(
pending_data_ = nullptr;
total_delay = QueueData(data);
queued_more_data = true;
- if (data->end_of_stream())
+ if (data->end_of_stream()) {
+ LOG(INFO) << "End of stream for " << this;
state_ = kStateGotEos;
+ }
}
}
@@ -273,7 +283,8 @@ int StreamMixerAlsaInputImpl::MaxReadSize() {
{
base::AutoLock lock(queue_lock_);
if (state_ == kStateGotEos)
- return std::max(static_cast<int>(queued_frames_including_resampler_),
+ return std::max(static_cast<int>(queued_frames_including_resampler_ /
+ resample_ratio_),
kDefaultReadSize);
queued_frames = queued_frames_;
}
@@ -368,12 +379,13 @@ void StreamMixerAlsaInputImpl::FillFrames(int frame_delay,
}
frames_left -= frames_to_copy;
frames_filled += frames_to_copy;
- LOG_IF(WARNING, zeroed_frames_ > 0) << "Filled a total of "
- << zeroed_frames_ << " frames with 0";
+ LOG_IF(WARNING, state_ != kStateFinalFade && zeroed_frames_ > 0)
+ << "Filled a total of " << zeroed_frames_ << " frames with 0";
zeroed_frames_ = 0;
} else {
// No data left in queue; fill remaining frames with zeros.
- LOG_IF(WARNING, zeroed_frames_ == 0) << "Starting to fill frames with 0";
+ LOG_IF(WARNING, state_ != kStateFinalFade && zeroed_frames_ == 0)
+ << "Starting to fill frames with 0";
zeroed_frames_ += frames_left;
output->ZeroFramesPartial(frames_filled, frames_left);
frames_filled += frames_left;
@@ -485,6 +497,7 @@ void StreamMixerAlsaInputImpl::SetPaused(bool paused) {
void StreamMixerAlsaInputImpl::SetVolumeMultiplier(float multiplier) {
RUN_ON_MIXER_THREAD(SetVolumeMultiplier, multiplier);
+ LOG(INFO) << this << ": stream volume = " << multiplier;
DCHECK(!IsDeleting());
if (multiplier > 1.0f)
multiplier = 1.0f;
« no previous file with comments | « chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698