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..a77c6f2504c72f88636d9147137667f79a0125a5 |
--- /dev/null |
+++ b/ash/system/win/audio/tray_audio_delegate_win.cc |
@@ -0,0 +1,102 @@ |
+// 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(); |
+ |
+ float level = 0.0f; |
+ if (FAILED(volume_control->GetMasterVolume(&level))) |
+ return 0; |
+ |
+ return static_cast<int>(std::roundf(level * 100.0f)); |
+} |
+ |
+int TrayAudioDelegateWin::GetActiveOutputDeviceIconId() { |
+ return kNoAudioDeviceIcon; |
+} |
+ |
+bool TrayAudioDelegateWin::HasAlternativeSources() { |
+ return false; |
+} |
+ |
+bool TrayAudioDelegateWin::IsOutputAudioMuted() { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control = |
+ CreateDefaultVolumeControl(); |
+ |
+ BOOL mute = FALSE; |
+ if (FAILED(volume_control->GetMute(&mute))) |
+ return false; |
+ |
+ return !!mute; |
+} |
+ |
+void TrayAudioDelegateWin::SetOutputAudioIsMuted(bool is_muted) { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control = |
+ CreateDefaultVolumeControl(); |
+ |
+ volume_control->SetMute(is_muted, NULL); |
+} |
+ |
+void TrayAudioDelegateWin::SetOutputVolumeLevel(int level) { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control = |
+ CreateDefaultVolumeControl(); |
+ |
+ float volume_level = static_cast<float>(level) / 100.0f; |
+ volume_control->SetMasterVolume(volume_level, NULL); |
+} |
+ |
+ScopedComPtr<ISimpleAudioVolume> |
henrika (OOO until Aug 14)
2014/02/26 09:10:05
It is not clear to me why you call this method in
tommi (sloooow) - chröme
2014/02/26 11:10:44
If these methods are infrequently called, then I t
zturner
2014/02/26 17:50:29
Yes, the default device changing is exactly the re
|
+TrayAudioDelegateWin::CreateDefaultVolumeControl() { |
+ ScopedComPtr<ISimpleAudioVolume> volume_control; |
+ ScopedComPtr<IAudioSessionManager> session_manager; |
+ |
+ ScopedComPtr<IMMDevice> device = |
+ media::CoreAudioUtil::CreateDefaultDevice(eRender, eConsole); |
+ if (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 |