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