// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/ash/volume_controller_chromeos.h" #include "ash/ash_switches.h" #include "ash/audio/sounds.h" #include "base/command_line.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/system_private/system_private_api.h" #include "chromeos/audio/chromeos_sounds.h" #include "chromeos/chromeos_switches.h" #include "content/public/browser/user_metrics.h" #include "grit/browser_resources.h" #include "media/audio/sounds/sounds_manager.h" #include "ui/base/resource/resource_bundle.h" using chromeos::CrasAudioHandler; namespace { // Percent by which the volume should be changed when a volume key is pressed. const double kStepPercentage = 4.0; bool VolumeAdjustSoundEnabled() { return !CommandLine::ForCurrentProcess()->HasSwitch( chromeos::switches::kDisableVolumeAdjustSound); } void PlayVolumeAdjustSound() { if (VolumeAdjustSoundEnabled()) ash::PlaySystemSoundIfSpokenFeedback(chromeos::SOUND_VOLUME_ADJUST); } } // namespace VolumeController::VolumeController() { CrasAudioHandler::Get()->AddAudioObserver(this); ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); if (VolumeAdjustSoundEnabled()) { media::SoundsManager::Get()->Initialize( chromeos::SOUND_VOLUME_ADJUST, bundle.GetRawDataResource(IDR_SOUND_VOLUME_ADJUST_WAV)); } } VolumeController::~VolumeController() { if (CrasAudioHandler::IsInitialized()) CrasAudioHandler::Get()->RemoveAudioObserver(this); } bool VolumeController::HandleVolumeMute(const ui::Accelerator& accelerator) { if (accelerator.key_code() == ui::VKEY_VOLUME_MUTE) content::RecordAction(base::UserMetricsAction("Accel_VolumeMute_F8")); CrasAudioHandler::Get()->SetOutputMute(true); return true; } bool VolumeController::HandleVolumeDown(const ui::Accelerator& accelerator) { if (accelerator.key_code() == ui::VKEY_VOLUME_DOWN) content::RecordAction(base::UserMetricsAction("Accel_VolumeDown_F9")); CrasAudioHandler* audio_handler = CrasAudioHandler::Get(); if (audio_handler->IsOutputMuted()) { audio_handler->SetOutputVolumePercent(0); } else { audio_handler->AdjustOutputVolumeByPercent(-kStepPercentage); if (audio_handler->IsOutputVolumeBelowDefaultMuteLvel()) audio_handler->SetOutputMute(true); else PlayVolumeAdjustSound(); } return true; } bool VolumeController::HandleVolumeUp(const ui::Accelerator& accelerator) { if (accelerator.key_code() == ui::VKEY_VOLUME_UP) content::RecordAction(base::UserMetricsAction("Accel_VolumeUp_F10")); CrasAudioHandler* audio_handler = CrasAudioHandler::Get(); bool play_sound = false; if (audio_handler->IsOutputMuted()) { audio_handler->SetOutputMute(false); audio_handler->AdjustOutputVolumeToAudibleLevel(); play_sound = true; } else { play_sound = audio_handler->GetOutputVolumePercent() != 100; audio_handler->AdjustOutputVolumeByPercent(kStepPercentage); } if (play_sound) PlayVolumeAdjustSound(); return true; } void VolumeController::OnOutputVolumeChanged() { CrasAudioHandler* audio_handler = CrasAudioHandler::Get(); extensions::DispatchVolumeChangedEvent( audio_handler->GetOutputVolumePercent(), audio_handler->IsOutputMuted()); } void VolumeController::OnOutputMuteChanged() { CrasAudioHandler* audio_handler = CrasAudioHandler::Get(); extensions::DispatchVolumeChangedEvent( audio_handler->GetOutputVolumePercent(), audio_handler->IsOutputMuted()); }