0

Consolidate volume_control_delegate and sysmte_tray_delegate

BUG=115936


Review URL: https://chromiumcodereview.appspot.com/10825264

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151607 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
jennyz@chromium.org
2012-08-14 23:34:24 +00:00
parent 66056fb423
commit 49a8253a36
13 changed files with 171 additions and 105 deletions

@ -499,16 +499,16 @@ bool AcceleratorController::PerformAction(int action,
HandleKeyboardBrightnessUp(accelerator);
break;
case VOLUME_MUTE:
if (volume_control_delegate_.get())
return volume_control_delegate_->HandleVolumeMute(accelerator);
return shell->tray_delegate()->GetVolumeControlDelegate()->
HandleVolumeMute(accelerator);
break;
case VOLUME_DOWN:
if (volume_control_delegate_.get())
return volume_control_delegate_->HandleVolumeDown(accelerator);
return shell->tray_delegate()->GetVolumeControlDelegate()->
HandleVolumeDown(accelerator);
break;
case VOLUME_UP:
if (volume_control_delegate_.get())
return volume_control_delegate_->HandleVolumeUp(accelerator);
return shell->tray_delegate()->GetVolumeControlDelegate()->
HandleVolumeUp(accelerator);
break;
case FOCUS_LAUNCHER:
if (shell->launcher())
@ -699,11 +699,6 @@ void AcceleratorController::SetScreenshotDelegate(
screenshot_delegate_.swap(screenshot_delegate);
}
void AcceleratorController::SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate> volume_control_delegate) {
volume_control_delegate_.swap(volume_control_delegate);
}
////////////////////////////////////////////////////////////////////////////////
// AcceleratorController, ui::AcceleratorTarget implementation:

@ -83,17 +83,10 @@ class ASH_EXPORT AcceleratorController : public ui::AcceleratorTarget {
keyboard_brightness_control_delegate);
void SetScreenshotDelegate(
scoped_ptr<ScreenshotDelegate> screenshot_delegate);
void SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate> volume_control_delegate);
BrightnessControlDelegate* brightness_control_delegate() const {
return brightness_control_delegate_.get();
}
VolumeControlDelegate* volume_control_delegate() const {
return volume_control_delegate_.get();
}
private:
// Initializes the accelerators this class handles as a target.
void Init();
@ -116,7 +109,6 @@ class ASH_EXPORT AcceleratorController : public ui::AcceleratorTarget {
scoped_ptr<KeyboardBrightnessControlDelegate>
keyboard_brightness_control_delegate_;
scoped_ptr<ScreenshotDelegate> screenshot_delegate_;
scoped_ptr<VolumeControlDelegate> volume_control_delegate_;
// A map from accelerators to the AcceleratorAction values, which are used in
// the implementation.

@ -11,6 +11,7 @@
#include "ash/shell_window_ids.h"
#include "ash/system/brightness/brightness_control_delegate.h"
#include "ash/system/keyboard_brightness/keyboard_brightness_control_delegate.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/test/ash_test_base.h"
#include "ash/test/test_shell_delegate.h"
#include "ash/volume_control_delegate.h"
@ -143,6 +144,16 @@ class DummyVolumeControlDelegate : public VolumeControlDelegate {
}
virtual void SetVolumePercent(double percent) OVERRIDE {
}
virtual bool IsAudioMuted() const OVERRIDE {
return false;
}
virtual void SetAudioMuted(bool muted) OVERRIDE {
}
virtual float GetVolumeLevel() const OVERRIDE {
return 0.0;
}
virtual void SetVolumeLevel(float level) OVERRIDE {
}
int handle_volume_mute_count() const {
return handle_volume_mute_count_;
@ -615,12 +626,12 @@ TEST_F(AcceleratorControllerTest, GlobalAccelerators) {
const ui::Accelerator f9(ui::VKEY_F9, ui::EF_NONE);
const ui::Accelerator f10(ui::VKEY_F10, ui::EF_NONE);
{
EXPECT_FALSE(GetController()->Process(f8));
EXPECT_FALSE(GetController()->Process(f9));
EXPECT_FALSE(GetController()->Process(f10));
EXPECT_TRUE(GetController()->Process(f8));
EXPECT_TRUE(GetController()->Process(f9));
EXPECT_TRUE(GetController()->Process(f10));
DummyVolumeControlDelegate* delegate =
new DummyVolumeControlDelegate(false);
GetController()->SetVolumeControlDelegate(
ash::Shell::GetInstance()->tray_delegate()->SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate>(delegate).Pass());
EXPECT_EQ(0, delegate->handle_volume_mute_count());
EXPECT_FALSE(GetController()->Process(f8));
@ -637,7 +648,7 @@ TEST_F(AcceleratorControllerTest, GlobalAccelerators) {
}
{
DummyVolumeControlDelegate* delegate = new DummyVolumeControlDelegate(true);
GetController()->SetVolumeControlDelegate(
ash::Shell::GetInstance()->tray_delegate()->SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate>(delegate).Pass());
EXPECT_EQ(0, delegate->handle_volume_mute_count());
EXPECT_TRUE(GetController()->Process(f8));
@ -658,7 +669,7 @@ TEST_F(AcceleratorControllerTest, GlobalAccelerators) {
{
DummyVolumeControlDelegate* delegate =
new DummyVolumeControlDelegate(false);
GetController()->SetVolumeControlDelegate(
ash::Shell::GetInstance()->tray_delegate()->SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate>(delegate).Pass());
EXPECT_EQ(0, delegate->handle_volume_mute_count());
EXPECT_FALSE(GetController()->Process(volume_mute));
@ -675,7 +686,7 @@ TEST_F(AcceleratorControllerTest, GlobalAccelerators) {
}
{
DummyVolumeControlDelegate* delegate = new DummyVolumeControlDelegate(true);
GetController()->SetVolumeControlDelegate(
ash::Shell::GetInstance()->tray_delegate()->SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate>(delegate).Pass());
EXPECT_EQ(0, delegate->handle_volume_mute_count());
EXPECT_TRUE(GetController()->Process(volume_mute));

@ -10,6 +10,7 @@
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_views.h"
#include "ash/volume_control_delegate.h"
#include "base/utf_string_conversions.h"
#include "grit/ash_strings.h"
#include "grit/ui_resources.h"
@ -39,8 +40,19 @@ const int kVolumeImageHeight = 25;
// The one for mute is at the 0 index and the other
// four are used for ascending volume levels.
const int kVolumeLevels = 4;
bool IsAudioMuted() {
return Shell::GetInstance()->tray_delegate()->
GetVolumeControlDelegate()->IsAudioMuted();
}
float GetVolumeLevel() {
return Shell::GetInstance()->tray_delegate()->
GetVolumeControlDelegate()->GetVolumeLevel();
}
} // namespace
namespace tray {
class VolumeButton : public views::ToggleImageButton {
@ -58,10 +70,8 @@ class VolumeButton : public views::ToggleImageButton {
virtual ~VolumeButton() {}
void Update() {
ash::SystemTrayDelegate* delegate =
ash::Shell::GetInstance()->tray_delegate();
float level = delegate->GetVolumeLevel();
int image_index = delegate->IsAudioMuted() ?
float level = GetVolumeLevel();
int image_index = IsAudioMuted() ?
0 : (level == 1.0 ?
kVolumeLevels :
std::max(1, int(std::ceil(level * (kVolumeLevels - 1)))));
@ -101,9 +111,7 @@ class MuteButton : public ash::internal::TrayBarButtonWithTitle {
virtual ~MuteButton() {}
void Update() {
ash::SystemTrayDelegate* delegate =
ash::Shell::GetInstance()->tray_delegate();
UpdateButton(delegate->IsAudioMuted());
UpdateButton(IsAudioMuted());
SchedulePaint();
}
@ -115,7 +123,7 @@ class VolumeSlider : public views::Slider {
explicit VolumeSlider(views::SliderListener* listener)
: views::Slider(listener, views::Slider::HORIZONTAL) {
set_focus_border_color(kFocusBorderColor);
SetValue(ash::Shell::GetInstance()->tray_delegate()->GetVolumeLevel());
SetValue(GetVolumeLevel());
SetAccessibleName(
ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
IDS_ASH_STATUS_TRAY_VOLUME));
@ -124,7 +132,7 @@ class VolumeSlider : public views::Slider {
virtual ~VolumeSlider() {}
void Update() {
UpdateState(!ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted());
UpdateState(!IsAudioMuted());
}
DISALLOW_COPY_AND_ASSIGN(VolumeSlider);
@ -179,9 +187,8 @@ class VolumeView : public views::View,
virtual void ButtonPressed(views::Button* sender,
const ui::Event& event) OVERRIDE {
CHECK(sender == icon_ || sender == mute_);
ash::SystemTrayDelegate* delegate =
ash::Shell::GetInstance()->tray_delegate();
delegate->SetAudioMuted(!delegate->IsAudioMuted());
ash::Shell::GetInstance()->tray_delegate()->
GetVolumeControlDelegate()->SetAudioMuted(!IsAudioMuted());
}
// Overridden from views:SliderListener.
@ -190,9 +197,8 @@ class VolumeView : public views::View,
float old_value,
views::SliderChangeReason reason) OVERRIDE {
if (reason == views::VALUE_CHANGED_BY_USER) {
ash::SystemTrayDelegate* delegate =
ash::Shell::GetInstance()->tray_delegate();
delegate->SetVolumeLevel(value);
ash::Shell::GetInstance()->tray_delegate()->
GetVolumeControlDelegate()->SetVolumeLevel(value);
}
icon_->Update();
}
@ -216,9 +222,7 @@ TrayVolume::~TrayVolume() {
}
bool TrayVolume::GetInitialVisibility() {
ash::SystemTrayDelegate* delegate =
ash::Shell::GetInstance()->tray_delegate();
return delegate->IsAudioMuted();
return IsAudioMuted();
}
views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) {
@ -248,7 +252,7 @@ void TrayVolume::OnVolumeChanged(float percent) {
tray_view()->SetVisible(GetInitialVisibility());
if (volume_view_) {
if (ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted())
if (IsAudioMuted())
percent = 0.0;
volume_view_->SetVolumeLevel(percent);
SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds);

@ -14,6 +14,7 @@
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/web_notification/web_notification_tray.h"
#include "ash/volume_control_delegate.h"
#include "base/i18n/time_formatting.h"
#include "base/utf_string_conversions.h"
#include "ui/aura/window.h"
@ -22,15 +23,46 @@ namespace ash {
namespace {
class DummyVolumeControlDelegate : public VolumeControlDelegate {
public:
DummyVolumeControlDelegate() {}
virtual ~DummyVolumeControlDelegate() {}
virtual bool HandleVolumeMute(const ui::Accelerator& accelerator) OVERRIDE {
return true;
}
virtual bool HandleVolumeDown(const ui::Accelerator& accelerator) OVERRIDE {
return true;
}
virtual bool HandleVolumeUp(const ui::Accelerator& accelerator) OVERRIDE {
return true;
}
virtual void SetVolumePercent(double percent) OVERRIDE {
}
virtual bool IsAudioMuted() const OVERRIDE {
return true;
}
virtual void SetAudioMuted(bool muted) OVERRIDE {
}
virtual float GetVolumeLevel() const OVERRIDE {
return 0.0;
}
virtual void SetVolumeLevel(float level) OVERRIDE {
}
private:
DISALLOW_COPY_AND_ASSIGN(DummyVolumeControlDelegate);
};
class DummySystemTrayDelegate : public SystemTrayDelegate {
public:
DummySystemTrayDelegate()
: muted_(false),
wifi_enabled_(true),
: wifi_enabled_(true),
cellular_enabled_(true),
bluetooth_enabled_(true),
volume_(0.5),
caps_lock_enabled_(false) {
caps_lock_enabled_(false),
volume_control_delegate_(
ALLOW_THIS_IN_INITIALIZER_LIST(new DummyVolumeControlDelegate)) {
}
virtual ~DummySystemTrayDelegate() {}
@ -91,22 +123,6 @@ class DummySystemTrayDelegate : public SystemTrayDelegate {
virtual void ShowHelp() OVERRIDE {
}
virtual bool IsAudioMuted() const OVERRIDE {
return muted_;
}
virtual void SetAudioMuted(bool muted) OVERRIDE {
muted_ = muted;
}
virtual float GetVolumeLevel() const OVERRIDE {
return volume_;
}
virtual void SetVolumeLevel(float volume) OVERRIDE {
volume_ = volume;
}
virtual bool IsCapsLockOn() const OVERRIDE {
return caps_lock_enabled_;
}
@ -260,13 +276,22 @@ class DummySystemTrayDelegate : public SystemTrayDelegate {
virtual void ChangeProxySettings() OVERRIDE {
}
bool muted_;
virtual VolumeControlDelegate* GetVolumeControlDelegate() const OVERRIDE {
return volume_control_delegate_.get();
}
virtual void SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate> delegate) OVERRIDE {
volume_control_delegate_.swap(delegate);
}
bool wifi_enabled_;
bool cellular_enabled_;
bool bluetooth_enabled_;
float volume_;
bool caps_lock_enabled_;
gfx::ImageSkia null_image_;
scoped_ptr<VolumeControlDelegate> volume_control_delegate_;
DISALLOW_COPY_AND_ASSIGN(DummySystemTrayDelegate);
};

@ -13,6 +13,7 @@
#include "ash/system/user/login_status.h"
#include "base/file_path.h"
#include "base/i18n/time_formatting.h"
#include "base/memory/scoped_ptr.h"
#include "base/string16.h"
#include "ui/gfx/image/image_skia.h"
@ -96,6 +97,8 @@ struct ASH_EXPORT IMEInfo {
typedef std::vector<IMEInfo> IMEInfoList;
class VolumeControlDelegate;
class SystemTrayDelegate {
public:
virtual ~SystemTrayDelegate() {}
@ -142,18 +145,6 @@ class SystemTrayDelegate {
// Shows help.
virtual void ShowHelp() = 0;
// Is the system audio muted?
virtual bool IsAudioMuted() const = 0;
// Mutes/Unmutes the audio system.
virtual void SetAudioMuted(bool muted) = 0;
// Gets the volume level. The range is [0, 1.0].
virtual float GetVolumeLevel() const = 0;
// Sets the volume level. The range is [0, 1.0].
virtual void SetVolumeLevel(float level) = 0;
// Gets whether the caps lock is on.
virtual bool IsCapsLockOn() const = 0;
@ -278,6 +269,14 @@ class SystemTrayDelegate {
// Shows UI for changing proxy settings.
virtual void ChangeProxySettings() = 0;
// Returns VolumeControlDelegate.
virtual VolumeControlDelegate* GetVolumeControlDelegate() const = 0;
// Sets VolumeControlDelegate.
virtual void SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate> delegate) = 0;
};
} // namespace ash

@ -20,6 +20,18 @@ class VolumeControlDelegate {
virtual bool HandleVolumeDown(const ui::Accelerator& accelerator) = 0;
virtual bool HandleVolumeUp(const ui::Accelerator& accelerator) = 0;
// Is the system audio muted?
virtual bool IsAudioMuted() const = 0;
// Mutes/Unmutes the audio system.
virtual void SetAudioMuted(bool muted) = 0;
// Gets the volume level. The range is [0, 1.0].
virtual float GetVolumeLevel() const = 0;
// Sets the volume level. The range is [0, 1.0].
virtual void SetVolumeLevel(float level) = 0;
// Requests that the volume be set to |percent|, in the range
// [0.0, 100.0].
virtual void SetVolumePercent(double percent) = 0;

@ -13,6 +13,7 @@
#include "ash/shell_delegate.h"
#include "ash/shell_window_ids.h"
#include "ash/system/brightness/brightness_control_delegate.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/volume_control_delegate.h"
#include "ash/wm/property_util.h"
#include "ash/wm/window_animations.h"
@ -692,10 +693,8 @@ bool SystemGestureEventFilter::HandleDeviceControl(
if (delegate)
delegate->SetBrightnessPercent(100.0 - percent, true);
} else if (start_location_ == BEZEL_START_RIGHT) {
ash::VolumeControlDelegate* delegate =
accelerator->volume_control_delegate();
if (delegate)
delegate->SetVolumePercent(100.0 - percent);
Shell::GetInstance()->tray_delegate()->GetVolumeControlDelegate()->
SetVolumePercent(100.0 - percent);
} else {
return true;
}

@ -10,6 +10,7 @@
#include "ash/launcher/launcher_model.h"
#include "ash/shell.h"
#include "ash/system/brightness/brightness_control_delegate.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/test/ash_test_base.h"
#include "ash/test/test_launcher_delegate.h"
#include "ash/volume_control_delegate.h"
@ -69,6 +70,17 @@ class DummyVolumeControlDelegate : public VolumeControlDelegate,
virtual void SetVolumePercent(double percent) OVERRIDE {
SetPercent(percent);
}
virtual bool IsAudioMuted() const OVERRIDE {
return false;
}
virtual void SetAudioMuted(bool muted) OVERRIDE {
}
virtual float GetVolumeLevel() const OVERRIDE {
return 0.0;
}
virtual void SetVolumeLevel(float level) OVERRIDE {
}
private:
DISALLOW_COPY_AND_ASSIGN(DummyVolumeControlDelegate);
@ -199,7 +211,7 @@ TEST_F(SystemGestureEventFilterTest, DeviceControl) {
DummyVolumeControlDelegate* delegateVolume =
new DummyVolumeControlDelegate();
accelerator->SetVolumeControlDelegate(
ash::Shell::GetInstance()->tray_delegate()->SetVolumeControlDelegate(
scoped_ptr<VolumeControlDelegate>(delegateVolume).Pass());
const int kTouchId = 5;

@ -21,6 +21,7 @@
#include "ash/system/tray/system_tray.h"
#include "ash/system/user/update_observer.h"
#include "ash/system/user/user_observer.h"
#include "ash/volume_control_delegate.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
#include "base/chromeos/chromeos_version.h"
@ -56,6 +57,7 @@
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/volume_controller_chromeos.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/chrome_pages.h"
@ -171,7 +173,9 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
search_key_mapped_to_(input_method::kSearchKey),
screen_locked_(false),
connected_network_state_(STATE_UNKNOWN),
data_promo_notification_(new DataPromoNotification()) {
data_promo_notification_(new DataPromoNotification()),
volume_control_delegate_(ALLOW_THIS_IN_INITIALIZER_LIST(
new VolumeController)) {
AudioHandler::GetInstance()->AddVolumeObserver(this);
DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this);
DBusThreadManager::Get()->GetPowerManagerClient()->RequestStatusUpdate(
@ -337,22 +341,6 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
chrome::ShowHelp(GetAppropriateBrowser(), chrome::HELP_SOURCE_MENU);
}
virtual bool IsAudioMuted() const OVERRIDE {
return AudioHandler::GetInstance()->IsMuted();
}
virtual void SetAudioMuted(bool muted) OVERRIDE {
return AudioHandler::GetInstance()->SetMuted(muted);
}
virtual float GetVolumeLevel() const OVERRIDE {
return AudioHandler::GetInstance()->GetVolumePercent() / 100.f;
}
virtual void SetVolumeLevel(float level) OVERRIDE {
AudioHandler::GetInstance()->SetVolumePercent(level * 100.f);
}
virtual bool IsCapsLockOn() const OVERRIDE {
input_method::InputMethodManager* ime_manager =
input_method::InputMethodManager::GetInstance();
@ -721,6 +709,15 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
BaseLoginDisplayHost::default_host()->OpenProxySettings();
}
virtual ash::VolumeControlDelegate* GetVolumeControlDelegate() const OVERRIDE
{
return volume_control_delegate_.get();
}
virtual void SetVolumeControlDelegate(
scoped_ptr<ash::VolumeControlDelegate> delegate) OVERRIDE {
volume_control_delegate_.swap(delegate);
}
private:
// Returns the last active browser. If there is no such browser, creates a new
// browser window with an empty tab and returns it.
@ -1250,6 +1247,8 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
scoped_ptr<DataPromoNotification> data_promo_notification_;
scoped_ptr<ash::VolumeControlDelegate> volume_control_delegate_;
DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegate);
};

@ -29,7 +29,6 @@
#include "base/chromeos/chromeos_version.h"
#include "chrome/browser/chromeos/input_method/input_method_manager.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/ui/ash/volume_controller_chromeos.h"
#include "chrome/browser/ui/ash/brightness_controller_chromeos.h"
#include "chrome/browser/ui/ash/ime_controller_chromeos.h"
#include "chrome/browser/ui/ash/keyboard_brightness_controller_chromeos.h"
@ -87,9 +86,6 @@ void OpenAsh() {
shell->accelerator_controller()->SetKeyboardBrightnessControlDelegate(
scoped_ptr<ash::KeyboardBrightnessControlDelegate>(
new KeyboardBrightnessController).Pass());
shell->accelerator_controller()->SetVolumeControlDelegate(
scoped_ptr<ash::VolumeControlDelegate>(new VolumeController).Pass());
ash::Shell::GetInstance()->high_contrast_controller()->SetEnabled(
chromeos::accessibility::IsHighContrastEnabled());

@ -67,6 +67,24 @@ bool VolumeController::HandleVolumeUp(const ui::Accelerator& accelerator) {
return true;
}
bool VolumeController::IsAudioMuted() const {
return chromeos::AudioHandler::GetInstance()->IsMuted();
}
void VolumeController::SetAudioMuted(bool muted) {
chromeos::AudioHandler::GetInstance()->SetMuted(muted);
}
// Gets the volume level. The range is [0, 1.0].
float VolumeController::GetVolumeLevel() const {
return chromeos::AudioHandler::GetInstance()->GetVolumePercent() / 100.f;
}
// Sets the volume level. The range is [0, 1.0].
void VolumeController::SetVolumeLevel(float level) {
chromeos::AudioHandler::GetInstance()->SetVolumePercent(level * 100.f);
}
void VolumeController::SetVolumePercent(double percent) {
chromeos::AudioHandler* audio_handler = chromeos::AudioHandler::GetInstance();
audio_handler->SetVolumePercent(percent);

@ -20,6 +20,10 @@ class VolumeController : public ash::VolumeControlDelegate {
virtual bool HandleVolumeMute(const ui::Accelerator& accelerator) OVERRIDE;
virtual bool HandleVolumeDown(const ui::Accelerator& accelerator) OVERRIDE;
virtual bool HandleVolumeUp(const ui::Accelerator& accelerator) OVERRIDE;
virtual bool IsAudioMuted() const OVERRIDE;
virtual void SetAudioMuted(bool muted) OVERRIDE;
virtual float GetVolumeLevel() const OVERRIDE;
virtual void SetVolumeLevel(float level) OVERRIDE;
virtual void SetVolumePercent(double percent) OVERRIDE;
private: