1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
// 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/chromeos/audio/audio_handler.h"
#include <algorithm>
#include <cmath>
#include "base/logging.h"
#include "base/memory/singleton.h"
#include "chrome/browser/browser_process.h"
#if defined(USE_CRAS)
#include "chrome/browser/chromeos/audio/audio_mixer_cras.h"
#else
#include "chrome/browser/chromeos/audio/audio_mixer_alsa.h"
#endif
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/browser_thread.h"
using std::max;
using std::min;
namespace chromeos {
namespace {
// Default value for the volume pref, as a percent in the range [0.0, 100.0].
const double kDefaultVolumePercent = 75.0;
// Values used for muted preference.
const int kPrefMuteOff = 0;
const int kPrefMuteOn = 1;
static AudioHandler* g_audio_handler = NULL;
} // namespace
// static
void AudioHandler::Initialize() {
CHECK(!g_audio_handler);
g_audio_handler = new AudioHandler();
}
// static
void AudioHandler::Shutdown() {
// We may call Shutdown without calling Initialize, e.g. if we exit early.
if (g_audio_handler) {
delete g_audio_handler;
g_audio_handler = NULL;
}
}
// static
AudioHandler* AudioHandler::GetInstance() {
VLOG_IF(1, !g_audio_handler)
<< "AudioHandler::GetInstance() called with NULL global instance.";
return g_audio_handler;
}
// static
void AudioHandler::RegisterPrefs(PrefService* local_state) {
if (!local_state->FindPreference(prefs::kAudioVolumePercent))
local_state->RegisterDoublePref(prefs::kAudioVolumePercent,
kDefaultVolumePercent,
PrefService::UNSYNCABLE_PREF);
if (!local_state->FindPreference(prefs::kAudioMute))
local_state->RegisterIntegerPref(prefs::kAudioMute,
kPrefMuteOff,
PrefService::UNSYNCABLE_PREF);
// Register the old decibel-based pref so we can clear it.
// TODO(derat): Remove this after R20: http://crbug.com/112039
if (!local_state->FindPreference(prefs::kAudioVolumeDb))
local_state->RegisterDoublePref(prefs::kAudioVolumeDb,
0,
PrefService::UNSYNCABLE_PREF);
local_state->ClearPref(prefs::kAudioVolumeDb);
local_state->UnregisterPreference(prefs::kAudioVolumeDb);
}
double AudioHandler::GetVolumePercent() {
return mixer_->GetVolumePercent();
}
void AudioHandler::SetVolumePercent(double volume_percent) {
volume_percent = min(max(volume_percent, 0.0), 100.0);
mixer_->SetVolumePercent(volume_percent);
prefs_->SetDouble(prefs::kAudioVolumePercent, volume_percent);
FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnVolumeChanged());
}
void AudioHandler::AdjustVolumeByPercent(double adjust_by_percent) {
SetVolumePercent(mixer_->GetVolumePercent() + adjust_by_percent);
}
bool AudioHandler::IsMuted() {
return mixer_->IsMuted();
}
void AudioHandler::SetMuted(bool mute) {
mixer_->SetMuted(mute);
prefs_->SetInteger(prefs::kAudioMute, mute ? kPrefMuteOn : kPrefMuteOff);
FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnVolumeChanged());
}
void AudioHandler::AddVolumeObserver(VolumeObserver* observer) {
volume_observers_.AddObserver(observer);
}
void AudioHandler::RemoveVolumeObserver(VolumeObserver* observer) {
volume_observers_.RemoveObserver(observer);
}
AudioHandler::AudioHandler()
#if defined(USE_CRAS)
: mixer_(new AudioMixerCras()),
#else
: mixer_(new AudioMixerAlsa()),
#endif
prefs_(g_browser_process->local_state()) {
mixer_->SetVolumePercent(prefs_->GetDouble(prefs::kAudioVolumePercent));
mixer_->SetMuted(prefs_->GetInteger(prefs::kAudioMute) == kPrefMuteOn);
mixer_->Init();
}
AudioHandler::~AudioHandler() {
mixer_.reset();
};
} // namespace chromeos
|