| Index: chromeos/audio/cras_audio_handler.cc
|
| diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc
|
| index 6a12d344cf4e662c2368882f380ed6b82867c889..8a2f8876e5c89a7c3569e9766ae4618881458bd9 100644
|
| --- a/chromeos/audio/cras_audio_handler.cc
|
| +++ b/chromeos/audio/cras_audio_handler.cc
|
| @@ -376,6 +376,13 @@ void CrasAudioHandler::SetOutputVolumePercent(int volume_percent) {
|
| }
|
| }
|
|
|
| +void CrasAudioHandler::SetOutputVolumePercentWithoutNotifyingObservers(
|
| + int volume_percent,
|
| + AutomatedVolumeChangeReason reason) {
|
| + automated_volume_change_reasons_.push_back(reason);
|
| + SetOutputVolumePercent(volume_percent);
|
| +}
|
| +
|
| // TODO: Rename the 'Percent' to something more meaningful.
|
| void CrasAudioHandler::SetInputGainPercent(int gain_percent) {
|
| // TODO(jennyz): Should we set all input devices' gain to the same level?
|
| @@ -613,27 +620,36 @@ void CrasAudioHandler::OutputNodeVolumeChanged(uint64_t node_id, int volume) {
|
| output_volume_ = volume;
|
| audio_pref_handler_->SetVolumeGainValue(*device, volume);
|
|
|
| - if (initializing_audio_state_) {
|
| - // Do not notify the observers for volume changed event if CrasAudioHandler
|
| - // is initializing its state, i.e., the volume change event is in responding
|
| - // to SetOutputNodeVolume request from intializaing audio state, not
|
| - // from user action, no need to notify UI to pop uo the volume slider bar.
|
| - if (init_node_id_ == node_id && init_volume_ == volume) {
|
| - init_volume_count_--;
|
| - if (!init_volume_count_)
|
| - initializing_audio_state_ = false;
|
| - return;
|
| + bool should_notify = true;
|
| + if (!automated_volume_change_reasons_.empty()) {
|
| + AutomatedVolumeChangeReason reason =
|
| + automated_volume_change_reasons_.front();
|
| + if (reason == VOLUME_CHANGE_INITIALIZING_AUDIO_STATE &&
|
| + (init_node_id_ != node_id || init_volume_ != volume)) {
|
| + // A SetOutputNodeVolume request may be dropped if cras isn't ready
|
| + // during initialization. In this case, we clear the pending automated
|
| + // volume change reasons as they might also be dropped by cras.
|
| + LOG(WARNING) << "OutputNodeVolumeChanged signal dropped during the "
|
| + "initialization.";
|
| + automated_volume_change_reasons_.clear();
|
| } else {
|
| - // Reset the initializing_audio_state_ in case SetOutputNodeVolume request
|
| - // is lost by cras due to cras is not ready when CrasAudioHandler is being
|
| - // initialized.
|
| - initializing_audio_state_ = false;
|
| - init_volume_count_ = 0;
|
| + // In other cases, sequential AutomatedVolumeChangeReason corresponds to
|
| + // sequential avoiding notifying observers.
|
| + should_notify = false;
|
| + automated_volume_change_reasons_.pop_front();
|
| }
|
| }
|
|
|
| - FOR_EACH_OBSERVER(AudioObserver, observers_,
|
| - OnOutputNodeVolumeChanged(node_id, volume));
|
| + if (std::find(automated_volume_change_reasons_.begin(),
|
| + automated_volume_change_reasons_.end(),
|
| + VOLUME_CHANGE_INITIALIZING_AUDIO_STATE) ==
|
| + automated_volume_change_reasons_.end())
|
| + initializing_audio_state_ = false;
|
| +
|
| + if (should_notify) {
|
| + FOR_EACH_OBSERVER(AudioObserver, observers_,
|
| + OnOutputNodeVolumeChanged(node_id, volume));
|
| + }
|
| }
|
|
|
| void CrasAudioHandler::ActiveOutputNodeChanged(uint64_t node_id) {
|
| @@ -743,9 +759,11 @@ void CrasAudioHandler::SetupAudioOutputState() {
|
| // by CrasAudioHandler constructor, then by cras server restarting signal,
|
| // both sending SetOutputNodeVolume requests, and could lead to two
|
| // OutputNodeVolumeChanged signals.
|
| - init_volume_count_++;
|
| init_node_id_ = active_output_node_id_;
|
| init_volume_ = output_volume_;
|
| + SetOutputVolumePercentWithoutNotifyingObservers(
|
| + output_volume_, VOLUME_CHANGE_INITIALIZING_AUDIO_STATE);
|
| + return;
|
| }
|
| SetOutputNodeVolume(active_output_node_id_, output_volume_);
|
| }
|
|
|