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
content / renderer / pepper / pepper_audio_controller.cc [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/renderer/pepper/pepper_audio_controller.h"
#include "content/renderer/pepper/pepper_audio_output_host.h"
#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
#include "content/renderer/pepper/ppb_audio_impl.h"
namespace content {
PepperAudioController::PepperAudioController(
PepperPluginInstanceImpl* instance)
: instance_(instance) {
DCHECK(instance_);
}
PepperAudioController::~PepperAudioController() {
if (instance_)
OnPepperInstanceDeleted();
}
void PepperAudioController::AddInstance(PPB_Audio_Impl* audio) {
if (!instance_)
return;
if (ppb_audios_.count(audio))
return;
StartPlaybackIfFirstInstance();
ppb_audios_.insert(audio);
}
void PepperAudioController::AddInstance(PepperAudioOutputHost* audio_output) {
if (!instance_)
return;
if (audio_output_hosts_.count(audio_output))
return;
StartPlaybackIfFirstInstance();
audio_output_hosts_.insert(audio_output);
}
void PepperAudioController::RemoveInstance(PPB_Audio_Impl* audio) {
if (!instance_)
return;
if (!ppb_audios_.count(audio))
return;
ppb_audios_.erase(audio);
StopPlaybackIfLastInstance();
}
void PepperAudioController::RemoveInstance(
PepperAudioOutputHost* audio_output) {
if (!instance_)
return;
if (!audio_output_hosts_.count(audio_output))
return;
audio_output_hosts_.erase(audio_output);
StopPlaybackIfLastInstance();
}
void PepperAudioController::SetVolume(double volume) {
if (!instance_)
return;
for (PPB_Audio_Impl* ppb_audio : ppb_audios_) {
ppb_audio->SetVolume(volume);
}
for (PepperAudioOutputHost* audio_output_host : audio_output_hosts_) {
audio_output_host->SetVolume(volume);
}
}
void PepperAudioController::OnPepperInstanceDeleted() {
DCHECK(instance_);
if (!audio_output_hosts_.empty() || !ppb_audios_.empty())
NotifyPlaybackStopsOnEmpty();
ppb_audios_.clear();
audio_output_hosts_.clear();
instance_ = nullptr;
}
void PepperAudioController::NotifyPlaybackStopsOnEmpty() {
DCHECK(instance_);
mojom::PepperPluginInstanceHost* instance_host =
instance_->GetPepperPluginInstanceHost();
if (instance_host)
instance_host->StopsPlayback();
}
void PepperAudioController::StartPlaybackIfFirstInstance() {
DCHECK(instance_);
if (audio_output_hosts_.empty() && ppb_audios_.empty()) {
mojom::PepperPluginInstanceHost* instance_host =
instance_->GetPepperPluginInstanceHost();
if (instance_host)
instance_host->StartsPlayback();
}
}
void PepperAudioController::StopPlaybackIfLastInstance() {
DCHECK(instance_);
if (audio_output_hosts_.empty() && ppb_audios_.empty())
NotifyPlaybackStopsOnEmpty();
}
} // namespace content