| Index: ash/system/chromeos/audio/tray_audio.cc
|
| diff --git a/ash/system/chromeos/audio/tray_audio.cc b/ash/system/chromeos/audio/tray_audio.cc
|
| index 7d85e0811d4d455b50f7d55c32a482933078a14d..22c15d72d649491aeae6efcf6d54f9bc8cb18feb 100644
|
| --- a/ash/system/chromeos/audio/tray_audio.cc
|
| +++ b/ash/system/chromeos/audio/tray_audio.cc
|
| @@ -37,6 +37,8 @@
|
| #include "ui/views/layout/box_layout.h"
|
| #include "ui/views/view.h"
|
|
|
| +using chromeos::CrasAudioHandler;
|
| +
|
| namespace ash {
|
| namespace internal {
|
|
|
| @@ -57,7 +59,7 @@ const int kVolumeLevels = 4;
|
|
|
| bool IsAudioMuted() {
|
| if(ash::switches::UseNewAudioHandler()) {
|
| - return chromeos::CrasAudioHandler::Get()->IsOutputMuted();
|
| + return CrasAudioHandler::Get()->IsOutputMuted();
|
| } else {
|
| return Shell::GetInstance()->system_tray_delegate()->
|
| GetVolumeControlDelegate()->IsAudioMuted();
|
| @@ -66,7 +68,7 @@ bool IsAudioMuted() {
|
|
|
| float GetVolumeLevel() {
|
| if (ash::switches::UseNewAudioHandler()) {
|
| - return chromeos::CrasAudioHandler::Get()->GetOutputVolumePercent() / 100.0f;
|
| + return CrasAudioHandler::Get()->GetOutputVolumePercent() / 100.0f;
|
| } else {
|
| return Shell::GetInstance()->system_tray_delegate()->
|
| GetVolumeControlDelegate()->GetVolumeLevel();
|
| @@ -220,7 +222,14 @@ class VolumeView : public ActionableView,
|
| Layout();
|
| }
|
|
|
| + // Sets volume level on slider_, |percent| is ranged from [0.00] to [1.00].
|
| void SetVolumeLevel(float percent) {
|
| + // Slider's value is in finer granularity than audio volume level(0.01),
|
| + // there will be a small discrepancy between slider's value and volume level
|
| + // on audio side. To avoid the jittering in slider UI, do not set change
|
| + // slider value if the change is less than 1%.
|
| + if (std::abs(percent-slider_->value()) < 0.01)
|
| + return;
|
| // The change in volume will be reflected via accessibility system events,
|
| // so we prevent the UI event from being sent here.
|
| slider_->set_enable_accessibility_events(false);
|
| @@ -242,8 +251,7 @@ class VolumeView : public ActionableView,
|
| return;
|
| }
|
|
|
| - chromeos::CrasAudioHandler* audio_handler =
|
| - chromeos::CrasAudioHandler::Get();
|
| + CrasAudioHandler* audio_handler = CrasAudioHandler::Get();
|
| bool show_more = audio_handler->has_alternative_output() ||
|
| audio_handler->has_alternative_input();
|
| more_->SetVisible(show_more);
|
| @@ -264,6 +272,26 @@ class VolumeView : public ActionableView,
|
| }
|
| }
|
|
|
| + void HandleVolumeUp(int volume) {
|
| + CrasAudioHandler* audio_handler = CrasAudioHandler::Get();
|
| + audio_handler->SetOutputVolumePercent(volume);
|
| + if (audio_handler->IsOutputMuted() &&
|
| + !audio_handler->IsOutputVolumeBelowDefaultMuteLvel())
|
| + audio_handler->SetOutputMute(false);
|
| + }
|
| +
|
| + void HandleVolumeDown(int volume) {
|
| + CrasAudioHandler* audio_handler = CrasAudioHandler::Get();
|
| + audio_handler->SetOutputVolumePercent(volume);
|
| + if (audio_handler->IsOutputVolumeBelowDefaultMuteLvel() &&
|
| + !audio_handler->IsOutputMuted()) {
|
| + audio_handler->SetOutputMute(true);
|
| + } else if (!audio_handler->IsOutputVolumeBelowDefaultMuteLvel() &&
|
| + audio_handler->IsOutputMuted()) {
|
| + audio_handler->SetOutputMute(false);
|
| + }
|
| + }
|
| +
|
| // Overridden from views::View.
|
| virtual void Layout() OVERRIDE {
|
| views::View::Layout();
|
| @@ -309,7 +337,10 @@ class VolumeView : public ActionableView,
|
| const ui::Event& event) OVERRIDE {
|
| CHECK(sender == icon_);
|
| if (ash::switches::UseNewAudioHandler()) {
|
| - chromeos::CrasAudioHandler::Get()->SetOutputMute(!IsAudioMuted());
|
| + bool mute_on = !IsAudioMuted();
|
| + CrasAudioHandler::Get()->SetOutputMute(mute_on);
|
| + if (!mute_on)
|
| + CrasAudioHandler::Get()->AdjustOutputVolumeToAudibleLevel();
|
| } else {
|
| ash::Shell::GetInstance()->system_tray_delegate()->
|
| GetVolumeControlDelegate()->SetAudioMuted(!IsAudioMuted());
|
| @@ -323,10 +354,17 @@ class VolumeView : public ActionableView,
|
| views::SliderChangeReason reason) OVERRIDE {
|
| if (reason == views::VALUE_CHANGED_BY_USER) {
|
| if (ash::switches::UseNewAudioHandler()) {
|
| - chromeos::CrasAudioHandler::Get()->
|
| - SetOutputVolumePercent(value * 100.0f);
|
| - }
|
| - else {
|
| + int volume = value * 100.0f;
|
| + int old_volume = CrasAudioHandler::Get()->GetOutputVolumePercent();
|
| + // Do not call change audio volume if the difference is less than
|
| + // 1%, which is beyond cras audio api's granularity for output volume.
|
| + if (std::abs(volume - old_volume) < 1)
|
| + return;
|
| + if (volume > old_volume)
|
| + HandleVolumeUp(volume);
|
| + else
|
| + HandleVolumeDown(volume);
|
| + } else {
|
| ash::Shell::GetInstance()->system_tray_delegate()->
|
| GetVolumeControlDelegate()->SetVolumeLevel(value);
|
| }
|
| @@ -385,7 +423,7 @@ class AudioDetailedView : public TrayDetailsView,
|
| output_devices_.clear();
|
| input_devices_.clear();
|
| chromeos::AudioDeviceList devices;
|
| - chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices);
|
| + CrasAudioHandler::Get()->GetAudioDevices(&devices);
|
| for (size_t i = 0; i < devices.size(); ++i) {
|
| if (devices[i].is_input)
|
| input_devices_.push_back(devices[i]);
|
| @@ -450,9 +488,9 @@ class AudioDetailedView : public TrayDetailsView,
|
| return;
|
| chromeos::AudioDevice& device = iter->second;
|
| if (device.is_input)
|
| - chromeos::CrasAudioHandler::Get()->SetActiveInputNode(device.id);
|
| + CrasAudioHandler::Get()->SetActiveInputNode(device.id);
|
| else
|
| - chromeos::CrasAudioHandler::Get()->SetActiveOutputNode(device.id);
|
| + CrasAudioHandler::Get()->SetActiveOutputNode(device.id);
|
| }
|
| }
|
|
|
| @@ -474,15 +512,15 @@ TrayAudio::TrayAudio(SystemTray* system_tray)
|
| audio_detail_(NULL),
|
| pop_up_volume_view_(false) {
|
| if (ash::switches::UseNewAudioHandler())
|
| - chromeos::CrasAudioHandler::Get()->AddAudioObserver(this);
|
| + CrasAudioHandler::Get()->AddAudioObserver(this);
|
| else
|
| Shell::GetInstance()->system_tray_notifier()->AddAudioObserver(this);
|
| }
|
|
|
| TrayAudio::~TrayAudio() {
|
| if (ash::switches::UseNewAudioHandler()) {
|
| - if (chromeos::CrasAudioHandler::IsInitialized())
|
| - chromeos::CrasAudioHandler::Get()->RemoveAudioObserver(this);
|
| + if (CrasAudioHandler::IsInitialized())
|
| + CrasAudioHandler::Get()->RemoveAudioObserver(this);
|
| } else {
|
| Shell::GetInstance()->system_tray_notifier()->RemoveAudioObserver(this);
|
| }
|
|
|