| Index: chrome/browser/chromeos/login/login_display_host_impl.cc
|
| diff --git a/chrome/browser/chromeos/login/login_display_host_impl.cc b/chrome/browser/chromeos/login/login_display_host_impl.cc
|
| index 8b24997b548401f5c47ad5a67340a1d567297cb4..cd2ece829b9a891155c9d9f5b4ff712027b98a2a 100644
|
| --- a/chrome/browser/chromeos/login/login_display_host_impl.cc
|
| +++ b/chrome/browser/chromeos/login/login_display_host_impl.cc
|
| @@ -83,7 +83,8 @@
|
|
|
| namespace {
|
|
|
| -const int kStartupSoundInitialDelayMs = 500;
|
| +// Maximum delay for startup sound after 'loginPromptVisible' signal.
|
| +const int kStartupSoundMaxDelayMs = 2000;
|
|
|
| // URL which corresponds to the login WebUI.
|
| const char kLoginURL[] = "chrome://oobe/login";
|
| @@ -172,13 +173,6 @@ class AnimationObserver : public ui::ImplicitAnimationObserver {
|
| DISALLOW_COPY_AND_ASSIGN(AnimationObserver);
|
| };
|
|
|
| -void PlayStartupSoundHelper(bool startup_sound_honors_spoken_feedback) {
|
| - if (!startup_sound_honors_spoken_feedback ||
|
| - chromeos::AccessibilityManager::Get()->IsSpokenFeedbackEnabled()) {
|
| - media::SoundsManager::Get()->Play(media::SoundsManager::SOUND_STARTUP);
|
| - }
|
| -}
|
| -
|
| // ShowLoginWizard is split into two parts. This function is sometimes called
|
| // from ShowLoginWizard(), and sometimes from OnLanguageSwitchedCallback()
|
| // (if locale was updated).
|
| @@ -264,10 +258,10 @@ LoginDisplayHostImpl::LoginDisplayHostImpl(const gfx::Rect& background_bounds)
|
| auto_enrollment_check_done_(false),
|
| finalize_animation_type_(ANIMATION_WORKSPACE),
|
| animation_weak_ptr_factory_(this),
|
| - startup_sound_requested_(false),
|
| startup_sound_played_(false),
|
| startup_sound_honors_spoken_feedback_(false) {
|
| DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this);
|
| + CrasAudioHandler::Get()->AddAudioObserver(this);
|
|
|
| // We need to listen to CLOSE_ALL_BROWSERS_REQUEST but not APP_TERMINATING
|
| // because/ APP_TERMINATING will never be fired as long as this keeps
|
| @@ -353,10 +347,29 @@ LoginDisplayHostImpl::LoginDisplayHostImpl(const gfx::Rect& background_bounds)
|
| << " wait_for_wp_load_: " << waiting_for_wallpaper_load_
|
| << " wait_for_pods_: " << waiting_for_user_pods_
|
| << " init_webui_hidden_: " << initialize_webui_hidden_;
|
| +
|
| + ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
|
| + std::vector<base::StringPiece> sound_resources(
|
| + media::SoundsManager::SOUND_COUNT);
|
| + sound_resources[media::SoundsManager::SOUND_STARTUP] =
|
| + bundle.GetRawDataResource(IDR_SOUND_STARTUP_WAV);
|
| + sound_resources[media::SoundsManager::SOUND_LOCK] =
|
| + bundle.GetRawDataResource(IDR_SOUND_LOCK_WAV);
|
| + sound_resources[media::SoundsManager::SOUND_UNLOCK] =
|
| + bundle.GetRawDataResource(IDR_SOUND_UNLOCK_WAV);
|
| + sound_resources[media::SoundsManager::SOUND_SHUTDOWN] =
|
| + bundle.GetRawDataResource(IDR_SOUND_SHUTDOWN_WAV);
|
| + for (size_t i = 0; i < sound_resources.size(); ++i) {
|
| + DCHECK(!sound_resources[i].empty()) << "System sound " << i << " "
|
| + << "missing.";
|
| + }
|
| + if (!media::SoundsManager::Get()->Initialize(sound_resources))
|
| + LOG(ERROR) << "Failed to initialize SoundsManager.";
|
| }
|
|
|
| LoginDisplayHostImpl::~LoginDisplayHostImpl() {
|
| DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this);
|
| + CrasAudioHandler::Get()->RemoveAudioObserver(this);
|
|
|
| views::FocusManager::set_arrow_key_traversal_enabled(false);
|
| ResetLoginWindowAndView();
|
| @@ -488,7 +501,8 @@ void LoginDisplayHostImpl::GetAutoEnrollmentCheckResult(
|
| void LoginDisplayHostImpl::StartWizard(
|
| const std::string& first_screen_name,
|
| scoped_ptr<DictionaryValue> screen_parameters) {
|
| - TryToPlayStartupSound(false);
|
| + startup_sound_honors_spoken_feedback_ = false;
|
| + TryToPlayStartupSound();
|
|
|
| // Keep parameters to restore if renderer crashes.
|
| restore_path_ = RESTORE_WIZARD;
|
| @@ -563,7 +577,8 @@ void LoginDisplayHostImpl::StartUserAdding(
|
|
|
| void LoginDisplayHostImpl::StartSignInScreen(
|
| const LoginScreenContext& context) {
|
| - TryToPlayStartupSound(true);
|
| + startup_sound_honors_spoken_feedback_ = true;
|
| + TryToPlayStartupSound();
|
|
|
| restore_path_ = RESTORE_SIGN_IN;
|
| is_showing_login_ = true;
|
| @@ -787,6 +802,10 @@ void LoginDisplayHostImpl::EmitLoginPromptVisibleCalled() {
|
| OnLoginPromptVisible();
|
| }
|
|
|
| +void LoginDisplayHostImpl::OnActiveOutputNodeChanged() {
|
| + TryToPlayStartupSound();
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // LoginDisplayHostImpl, private
|
|
|
| @@ -1010,69 +1029,31 @@ void LoginDisplayHostImpl::NotifyAutoEnrollmentCheckResult(
|
| callbacks[i].Run(should_auto_enroll);
|
| }
|
|
|
| -void LoginDisplayHostImpl::TryToPlayStartupSound(bool honor_spoken_feedback) {
|
| - if (startup_sound_requested_)
|
| +void LoginDisplayHostImpl::TryToPlayStartupSound() {
|
| + if (startup_sound_played_ || login_prompt_visible_time_.is_null() ||
|
| + !CrasAudioHandler::Get()->GetActiveOutputNode()) {
|
| return;
|
| - startup_sound_requested_ = true;
|
| - startup_sound_honors_spoken_feedback_ = honor_spoken_feedback;
|
| - if (!login_prompt_visible_time_.is_null())
|
| - PlayStartupSound();
|
| -}
|
| + }
|
|
|
| -void LoginDisplayHostImpl::OnLoginPromptVisible() {
|
| - if (!login_prompt_visible_time_.is_null())
|
| + // Don't play startup sound if login prompt is already visible for a
|
| + // long time.
|
| + if (base::TimeTicks::Now() - login_prompt_visible_time_ >
|
| + base::TimeDelta::FromMilliseconds(kStartupSoundMaxDelayMs)) {
|
| return;
|
| -
|
| - ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
|
| - std::vector<base::StringPiece> sound_resources(
|
| - media::SoundsManager::SOUND_COUNT);
|
| - sound_resources[media::SoundsManager::SOUND_STARTUP] =
|
| - bundle.GetRawDataResource(IDR_SOUND_STARTUP_WAV);
|
| - sound_resources[media::SoundsManager::SOUND_LOCK] =
|
| - bundle.GetRawDataResource(IDR_SOUND_LOCK_WAV);
|
| - sound_resources[media::SoundsManager::SOUND_UNLOCK] =
|
| - bundle.GetRawDataResource(IDR_SOUND_UNLOCK_WAV);
|
| - sound_resources[media::SoundsManager::SOUND_SHUTDOWN] =
|
| - bundle.GetRawDataResource(IDR_SOUND_SHUTDOWN_WAV);
|
| - for (size_t i = 0; i < sound_resources.size(); ++i) {
|
| - DCHECK(!sound_resources[i].empty()) << "System sound " << i << " "
|
| - << "missing.";
|
| }
|
| - if (!media::SoundsManager::Get()->Initialize(sound_resources))
|
| - LOG(ERROR) << "Failed to initialize SoundsManager.";
|
|
|
| - login_prompt_visible_time_ = base::TimeTicks::Now();
|
| - if (startup_sound_requested_ && !startup_sound_played_)
|
| - PlayStartupSound();
|
| + if (!startup_sound_honors_spoken_feedback_ ||
|
| + chromeos::AccessibilityManager::Get()->IsSpokenFeedbackEnabled()) {
|
| + startup_sound_played_ = true;
|
| + media::SoundsManager::Get()->Play(media::SoundsManager::SOUND_STARTUP);
|
| + }
|
| }
|
|
|
| -void LoginDisplayHostImpl::PlayStartupSound() {
|
| - if (startup_sound_played_)
|
| +void LoginDisplayHostImpl::OnLoginPromptVisible() {
|
| + if (!login_prompt_visible_time_.is_null())
|
| return;
|
| - startup_sound_played_ = true;
|
| -
|
| - // TODO (ygorshenin@): remove this as soon as crbug.com/315108 will
|
| - // be fixed.
|
| - return;
|
| -
|
| - const base::TimeDelta delay =
|
| - base::TimeDelta::FromMilliseconds(kStartupSoundInitialDelayMs);
|
| - const base::TimeDelta delta =
|
| - base::TimeTicks::Now() - login_prompt_visible_time_;
|
| -
|
| - // Cras audio server starts initialization after
|
| - // login-prompt-visible signal from session manager. Alas, but it
|
| - // doesn't send notifications after initialization. Thus, we're
|
| - // trying to play startup sound after some delay.
|
| - if (delta > delay) {
|
| - PlayStartupSoundHelper(startup_sound_honors_spoken_feedback_);
|
| - } else {
|
| - base::MessageLoop::current()->PostDelayedTask(
|
| - FROM_HERE,
|
| - base::Bind(&PlayStartupSoundHelper,
|
| - startup_sound_honors_spoken_feedback_),
|
| - delay - delta);
|
| - }
|
| + login_prompt_visible_time_ = base::TimeTicks::Now();
|
| + TryToPlayStartupSound();
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|