Index: ash/system/win/audio/tray_audio_delegate_win.cc |
diff --git a/ash/system/win/audio/tray_audio_delegate_win.cc b/ash/system/win/audio/tray_audio_delegate_win.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..57c7b56307e86ebff36b63473dbd28ddcb468cee |
--- /dev/null |
+++ b/ash/system/win/audio/tray_audio_delegate_win.cc |
@@ -0,0 +1,117 @@ |
+// Copyright 2014 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 "ash/system/win/audio/tray_audio_delegate_win.h" |
+ |
+#include <audiopolicy.h> |
+#include <cmath> |
+ |
+#include "grit/ash_resources.h" |
+#include "grit/ash_strings.h" |
+#include "media/audio/win/core_audio_util_win.h" |
+ |
+using base::win::ScopedComPtr; |
+ |
+namespace { |
+ |
+// Volume value which should be considered as muted in range [0, 100]. |
+const int kMuteThresholdPercent = 1; |
+ |
+// Lowest volume which is considered to be audible in the range [0, 100]. |
+const int kDefaultUnmuteVolumePercent = 4; |
+ |
+} // namespace |
+ |
+namespace ash { |
+namespace system { |
+ |
+void TrayAudioDelegateWin::AdjustOutputVolumeToAudibleLevel() { |
+ if (GetOutputVolumeLevel() <= kMuteThresholdPercent) |
+ SetOutputVolumeLevel(kDefaultUnmuteVolumePercent); |
+} |
+ |
+int TrayAudioDelegateWin::GetOutputDefaultVolumeMuteLevel() { |
+ return kMuteThresholdPercent; |
+} |
+ |
+int TrayAudioDelegateWin::GetOutputVolumeLevel() { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control = |
+ CreateDefaultVolumeControl(); |
+ if (!volume_control) |
+ return 0; |
+ |
+ float level = 0.0f; |
+ if (FAILED(volume_control->GetMasterVolume(&level))) |
+ return 0; |
+ |
+ // MSVC prior to 2013 doesn't have a round function. The below code is not |
+ // conformant to C99 round(), but since we know that 0 <= level <= 100, it |
+ // should be ok. |
+ return static_cast<int>(level + 0.5); |
+} |
+ |
+int TrayAudioDelegateWin::GetActiveOutputDeviceIconId() { |
+ return kNoAudioDeviceIcon; |
+} |
+ |
+bool TrayAudioDelegateWin::HasAlternativeSources() { |
+ return false; |
+} |
+ |
+bool TrayAudioDelegateWin::IsOutputAudioMuted() { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control = |
+ CreateDefaultVolumeControl(); |
+ |
+ if (!volume_control) |
+ return false; |
+ |
+ BOOL mute = FALSE; |
+ if (FAILED(volume_control->GetMute(&mute))) |
+ return false; |
+ |
+ return !!mute; |
+} |
+ |
+void TrayAudioDelegateWin::SetOutputAudioIsMuted(bool is_muted) { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control = |
+ CreateDefaultVolumeControl(); |
+ |
+ if (!volume_control) |
+ return; |
+ |
+ volume_control->SetMute(is_muted, NULL); |
+} |
+ |
+void TrayAudioDelegateWin::SetOutputVolumeLevel(int level) { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control = |
+ CreateDefaultVolumeControl(); |
+ |
+ if (!volume_control) |
+ return; |
+ |
+ float volume_level = static_cast<float>(level) / 100.0f; |
+ volume_control->SetMasterVolume(volume_level, NULL); |
+} |
+ |
+ScopedComPtr<ISimpleAudioVolume> |
+TrayAudioDelegateWin::CreateDefaultVolumeControl() { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control; |
+ ScopedComPtr<IAudioSessionManager> session_manager; |
+ |
+ ScopedComPtr<IMMDevice> device = |
+ media::CoreAudioUtil::CreateDefaultDevice(eRender, eConsole); |
+ if (!device || |
+ FAILED(device->Activate(__uuidof(IAudioSessionManager), CLSCTX_ALL, NULL, |
+ session_manager.ReceiveVoid()))) { |
+ return volume_control; |
+ } |
+ |
+ session_manager->GetSimpleAudioVolume(NULL, FALSE, |
+ volume_control.Receive()); |
+ |
+ return volume_control; |
+} |
+ |
+} // namespace system |
+} // namespace ash |