Index: content/renderer/pepper/pepper_audio_controller.cc |
diff --git a/content/renderer/pepper/pepper_audio_controller.cc b/content/renderer/pepper/pepper_audio_controller.cc |
index 88d80f11bd02c441888e1403291875582f4b4e00..759666ea3a7fb0718dfdc6714d805c1fb1e34d08 100644 |
--- a/content/renderer/pepper/pepper_audio_controller.cc |
+++ b/content/renderer/pepper/pepper_audio_controller.cc |
@@ -4,6 +4,7 @@ |
#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" |
#include "content/renderer/render_frame_impl.h" |
@@ -27,15 +28,22 @@ void PepperAudioController::AddInstance(PPB_Audio_Impl* audio) { |
if (ppb_audios_.count(audio)) |
return; |
- if (ppb_audios_.empty()) { |
- RenderFrameImpl* render_frame = instance_->render_frame(); |
- if (render_frame) |
- render_frame->PepperStartsPlayback(instance_); |
- } |
+ 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; |
@@ -44,8 +52,19 @@ void PepperAudioController::RemoveInstance(PPB_Audio_Impl* audio) { |
ppb_audios_.erase(audio); |
- if (ppb_audios_.empty()) |
- NotifyPlaybackStopsOnEmpty(); |
+ 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) { |
@@ -54,15 +73,19 @@ void PepperAudioController::SetVolume(double volume) { |
for (auto* ppb_audio : ppb_audios_) |
ppb_audio->SetVolume(volume); |
+ |
+ for (auto* audio_output_host : audio_output_hosts_) |
+ audio_output_host->SetVolume(volume); |
} |
void PepperAudioController::OnPepperInstanceDeleted() { |
DCHECK(instance_); |
- if (!ppb_audios_.empty()) |
+ if (!audio_output_hosts_.empty() || !ppb_audios_.empty()) |
NotifyPlaybackStopsOnEmpty(); |
ppb_audios_.clear(); |
+ audio_output_hosts_.clear(); |
instance_ = nullptr; |
} |
@@ -74,4 +97,21 @@ void PepperAudioController::NotifyPlaybackStopsOnEmpty() { |
render_frame->PepperStopsPlayback(instance_); |
} |
+void PepperAudioController::StartPlaybackIfFirstInstance() { |
+ DCHECK(instance_); |
+ |
+ if (audio_output_hosts_.empty() && ppb_audios_.empty()) { |
+ RenderFrameImpl* render_frame = instance_->render_frame(); |
+ if (render_frame) |
+ render_frame->PepperStartsPlayback(instance_); |
+ } |
+} |
+ |
+void PepperAudioController::StopPlaybackIfLastInstance() { |
+ DCHECK(instance_); |
+ |
+ if (audio_output_hosts_.empty() && ppb_audios_.empty()) |
+ NotifyPlaybackStopsOnEmpty(); |
+} |
+ |
} // namespace content |