Index: chromeos/audio/cras_audio_handler.cc |
diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc |
index 64e4271b3d1bb3c714861f07f9ffaf90c4fa383f..456ce6cc54414a3d9f937324eb8f8dd1988c5456 100644 |
--- a/chromeos/audio/cras_audio_handler.cc |
+++ b/chromeos/audio/cras_audio_handler.cc |
@@ -613,14 +613,22 @@ void CrasAudioHandler::OutputNodeVolumeChanged(uint64_t node_id, int volume) { |
audio_pref_handler_->SetVolumeGainValue(*device, volume); |
if (initializing_audio_state_) { |
- // Reset the flag after the first OutputNodeVolumeChanged, just in case |
- // cras didn't respond to the initial SetOutputNodeVolume request. |
- initializing_audio_state_ = false; |
// Do not notify the observers for volume changed event if CrasAudioHandler |
- // is initializing its state, i.e., the volume change event is 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) |
+ // 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; |
+ } 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; |
+ } |
} |
FOR_EACH_OBSERVER(AudioObserver, observers_, |
@@ -730,6 +738,11 @@ void CrasAudioHandler::SetupAudioOutputState() { |
SetOutputMuteInternal(output_mute_on_); |
if (initializing_audio_state_) { |
+ // During power up, InitializeAudioState() could be called twice, first |
+ // 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_; |
} |