| Index: chromecast/media/cma/backend/media_pipeline_backend_manager.cc
|
| diff --git a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
|
| index df0b8895edc67e32640572d6d93148a00357eea2..216b1d5f8f50afb53a62bf8b31a4abefb9d91b81 100644
|
| --- a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
|
| +++ b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
|
| @@ -7,10 +7,10 @@
|
| #include <algorithm>
|
| #include <limits>
|
|
|
| +#include "base/location.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "chromecast/chromecast_features.h"
|
| #include "chromecast/media/cma/backend/media_pipeline_backend_wrapper.h"
|
| -#include "chromecast/public/cast_media_shlib.h"
|
|
|
| namespace chromecast {
|
| namespace media {
|
| @@ -18,16 +18,19 @@ namespace {
|
| #if BUILDFLAG(IS_CAST_AUDIO_ONLY)
|
| constexpr int kAudioDecoderLimit = std::numeric_limits<int>::max();
|
| #else
|
| -constexpr int kAudioDecoderLimit = 2;
|
| +constexpr int kAudioDecoderLimit = 1;
|
| #endif
|
| } // namespace
|
|
|
| MediaPipelineBackendManager::MediaPipelineBackendManager(
|
| scoped_refptr<base::SingleThreadTaskRunner> media_task_runner)
|
| - : media_task_runner_(std::move(media_task_runner)) {
|
| - DCHECK_EQ(2, NUM_DECODER_TYPES);
|
| - decoder_count_[AUDIO_DECODER] = 0;
|
| - decoder_count_[VIDEO_DECODER] = 0;
|
| + : media_task_runner_(std::move(media_task_runner)),
|
| + playing_noneffects_audio_streams_count_(0),
|
| + allow_volume_feedback_observers_(
|
| + new base::ObserverListThreadSafe<AllowVolumeFeedbackObserver>()) {
|
| + for (int i = 0; i < NUM_DECODER_TYPES; ++i) {
|
| + decoder_count_[i] = 0;
|
| + }
|
| }
|
|
|
| MediaPipelineBackendManager::~MediaPipelineBackendManager() {
|
| @@ -37,22 +40,7 @@ std::unique_ptr<MediaPipelineBackend>
|
| MediaPipelineBackendManager::CreateMediaPipelineBackend(
|
| const media::MediaPipelineDeviceParams& params) {
|
| DCHECK(media_task_runner_->BelongsToCurrentThread());
|
| - return CreateMediaPipelineBackend(params, 0);
|
| -}
|
| -
|
| -std::unique_ptr<MediaPipelineBackend>
|
| -MediaPipelineBackendManager::CreateMediaPipelineBackend(
|
| - const media::MediaPipelineDeviceParams& params,
|
| - int stream_type) {
|
| - DCHECK(media_task_runner_->BelongsToCurrentThread());
|
| - LOG(INFO) << "Creating a " << params.device_id << " stream.";
|
| - std::unique_ptr<MediaPipelineBackend> backend_ptr(
|
| - new MediaPipelineBackendWrapper(
|
| - base::WrapUnique(
|
| - media::CastMediaShlib::CreateMediaPipelineBackend(params)),
|
| - stream_type, GetVolumeMultiplier(stream_type), this));
|
| - media_pipeline_backends_.push_back(backend_ptr.get());
|
| - return backend_ptr;
|
| + return base::MakeUnique<MediaPipelineBackendWrapper>(params, this);
|
| }
|
|
|
| bool MediaPipelineBackendManager::IncrementDecoderCount(DecoderType type) {
|
| @@ -72,42 +60,35 @@ void MediaPipelineBackendManager::DecrementDecoderCount(DecoderType type) {
|
| DCHECK(media_task_runner_->BelongsToCurrentThread());
|
| DCHECK(type < NUM_DECODER_TYPES);
|
| DCHECK(decoder_count_[type] > 0);
|
| +
|
| decoder_count_[type]--;
|
| }
|
|
|
| -void MediaPipelineBackendManager::OnMediaPipelineBackendDestroyed(
|
| - const MediaPipelineBackend* backend) {
|
| - DCHECK(media_task_runner_->BelongsToCurrentThread());
|
| - media_pipeline_backends_.erase(
|
| - std::remove(media_pipeline_backends_.begin(),
|
| - media_pipeline_backends_.end(), backend),
|
| - media_pipeline_backends_.end());
|
| -}
|
| +void MediaPipelineBackendManager::UpdatePlayingAudioCount(int change) {
|
| + DCHECK(change == -1 || change == 1) << "bad count change: " << change;
|
|
|
| -void MediaPipelineBackendManager::SetVolumeMultiplier(int stream_type,
|
| - float volume) {
|
| - DCHECK(media_task_runner_->BelongsToCurrentThread());
|
| - volume = std::max(0.0f, std::min(volume, 1.0f));
|
| - volume_by_stream_type_[stream_type] = volume;
|
| -
|
| - // Set volume for each open media pipeline backends.
|
| - for (auto it = media_pipeline_backends_.begin();
|
| - it != media_pipeline_backends_.end(); it++) {
|
| - MediaPipelineBackendWrapper* wrapper =
|
| - static_cast<MediaPipelineBackendWrapper*>(*it);
|
| - if (wrapper->GetStreamType() == stream_type)
|
| - wrapper->SetStreamTypeVolume(volume);
|
| + // Volume feedback sounds are only allowed when there are no non-effects
|
| + // audio streams playing.
|
| + bool prev_allow_feedback = (playing_noneffects_audio_streams_count_ == 0);
|
| + playing_noneffects_audio_streams_count_ += change;
|
| + DCHECK_GE(playing_noneffects_audio_streams_count_, 0);
|
| + bool new_allow_feedback = (playing_noneffects_audio_streams_count_ == 0);
|
| +
|
| + if (new_allow_feedback != prev_allow_feedback) {
|
| + allow_volume_feedback_observers_->Notify(
|
| + FROM_HERE, &AllowVolumeFeedbackObserver::AllowVolumeFeedbackSounds,
|
| + new_allow_feedback);
|
| }
|
| }
|
|
|
| -float MediaPipelineBackendManager::GetVolumeMultiplier(int stream_type) {
|
| - DCHECK(media_task_runner_->BelongsToCurrentThread());
|
| - auto it = volume_by_stream_type_.find(stream_type);
|
| - if (it == volume_by_stream_type_.end()) {
|
| - return 1.0;
|
| - } else {
|
| - return it->second;
|
| - }
|
| +void MediaPipelineBackendManager::AddAllowVolumeFeedbackObserver(
|
| + AllowVolumeFeedbackObserver* observer) {
|
| + allow_volume_feedback_observers_->AddObserver(observer);
|
| +}
|
| +
|
| +void MediaPipelineBackendManager::RemoveAllowVolumeFeedbackObserver(
|
| + AllowVolumeFeedbackObserver* observer) {
|
| + allow_volume_feedback_observers_->RemoveObserver(observer);
|
| }
|
|
|
| } // namespace media
|
|
|