Commit 4767de3a authored by Sergey Ulanov's avatar Sergey Ulanov Committed by Commit Bot

[Fuchsia] Allow SetVolume on uninitialized FuchsiaAudioRenderer

initialized. FuchsiaAudioRenderer was not handling this correctly.
It was trying to call AudioConsumer.BindVolumeControl before the
AudioConsumer is connected. As result it was logging an error
message about disconnected VolumeControl without setting the volume.
Updated SetVolume() implementation to persist the volume value and
send it as soon as AudioConsumer is connected.

AudioRenderer: :SetVolume() may be called before the renderer is
Change-Id: Ic5418c2c002c1181da01e8a278b0b53845baee47
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2481958
Auto-Submit: Sergey Ulanov <sergeyu@chromium.org>
Commit-Queue: Kevin Marshall <kmarshall@chromium.org>
Reviewed-by: default avatarKevin Marshall <kmarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#818564}
parent 099f31e4
......@@ -113,6 +113,8 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream,
OnError(AUDIO_RENDERER_ERROR);
});
UpdateVolume();
audio_consumer_.events().OnEndOfStream = [this]() { OnEndOfStream(); };
RequestAudioConsumerStatus();
......@@ -145,6 +147,18 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream,
std::move(init_cb_).Run(PIPELINE_OK);
}
void FuchsiaAudioRenderer::UpdateVolume() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(audio_consumer_);
if (!volume_control_) {
audio_consumer_->BindVolumeControl(volume_control_.NewRequest());
volume_control_.set_error_handler([](zx_status_t status) {
ZX_LOG(ERROR, status) << "VolumeControl disconnected.";
});
}
volume_control_->SetVolume(volume_);
}
void FuchsiaAudioRenderer::InitializeStreamSink(
const AudioDecoderConfig& config) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
......@@ -228,13 +242,9 @@ void FuchsiaAudioRenderer::StartPlaying() {
void FuchsiaAudioRenderer::SetVolume(float volume) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!volume_control_) {
audio_consumer_->BindVolumeControl(volume_control_.NewRequest());
volume_control_.set_error_handler([](zx_status_t status) {
ZX_LOG(ERROR, status) << "VolumeControl disconnected.";
});
}
volume_control_->SetVolume(volume);
volume_ = volume;
if (audio_consumer_)
UpdateVolume();
}
void FuchsiaAudioRenderer::SetLatencyHint(
......
......@@ -85,6 +85,10 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource {
// Resets AudioConsumer and reports error to the |client_|.
void OnError(PipelineStatus Status);
// Connects |volume_control_|, if it hasn't been connected, and then sets
// |volume_|.
void UpdateVolume();
// Initializes |stream_sink_|. Called during initialization and every time
// configuration changes.
void InitializeStreamSink(const AudioDecoderConfig& config);
......@@ -129,6 +133,8 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource {
fuchsia::media::StreamSinkPtr stream_sink_;
fuchsia::media::audio::VolumeControlPtr volume_control_;
float volume_ = 1.0;
DemuxerStream* demuxer_stream_ = nullptr;
bool is_demuxer_read_pending_ = false;
bool drop_next_demuxer_read_result_ = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment