blob: 49227383e414f2b37af46db4d778c4db3cec5e49 [file] [log] [blame]
// Copyright 2016 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 "chromecast/media/cma/backend/media_pipeline_backend_manager.h"
#include <algorithm>
#include "base/memory/ptr_util.h"
#include "chromecast/media/cma/backend/media_pipeline_backend_wrapper.h"
#include "chromecast/public/cast_media_shlib.h"
namespace chromecast {
namespace media {
MediaPipelineBackendManager::MediaPipelineBackendManager(
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner)
: media_task_runner_(std::move(media_task_runner)) {
}
MediaPipelineBackendManager::~MediaPipelineBackendManager() {
}
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());
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;
}
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::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);
}
}
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;
}
}
} // namespace media
} // namespace chromecast