Index: chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc |
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc |
index 88e96b36aa078a533888abd17c4578e745721622..acf268f5068b214ccf269a56efc05befdb602304 100644 |
--- a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc |
+++ b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc |
@@ -5,7 +5,9 @@ |
#include "chromecast/media/cma/backend/media_pipeline_backend_wrapper.h" |
#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
#include "chromecast/media/cma/backend/media_pipeline_backend_manager.h" |
+#include "chromecast/public/cast_media_shlib.h" |
namespace chromecast { |
namespace media { |
@@ -13,46 +15,49 @@ namespace media { |
using DecoderType = MediaPipelineBackendManager::DecoderType; |
MediaPipelineBackendWrapper::MediaPipelineBackendWrapper( |
- std::unique_ptr<MediaPipelineBackend> backend, |
- int stream_type, |
- float stream_type_volume, |
+ const media::MediaPipelineDeviceParams& params, |
MediaPipelineBackendManager* backend_manager) |
- : backend_(std::move(backend)), |
- stream_type_(stream_type), |
- audio_decoder_wrapper_(nullptr), |
- stream_type_volume_(stream_type_volume), |
- is_initialized_(false), |
+ : backend_(base::WrapUnique( |
+ media::CastMediaShlib::CreateMediaPipelineBackend(params))), |
+ backend_manager_(backend_manager), |
+ sfx_backend_(params.audio_type == |
+ media::MediaPipelineDeviceParams::kAudioStreamSoundEffects), |
+ have_audio_decoder_(false), |
have_video_decoder_(false), |
- backend_manager_(backend_manager) { |
+ playing_(false) { |
DCHECK(backend_); |
+ DCHECK(backend_manager_); |
} |
MediaPipelineBackendWrapper::~MediaPipelineBackendWrapper() { |
- backend_manager_->OnMediaPipelineBackendDestroyed(this); |
- |
- if (audio_decoder_wrapper_) |
- backend_manager_->DecrementDecoderCount(DecoderType::AUDIO_DECODER); |
+ if (have_audio_decoder_) |
+ backend_manager_->DecrementDecoderCount( |
+ sfx_backend_ ? DecoderType::SFX_DECODER : DecoderType::AUDIO_DECODER); |
if (have_video_decoder_) |
backend_manager_->DecrementDecoderCount(DecoderType::VIDEO_DECODER); |
+ |
+ if (playing_) { |
+ LOG(WARNING) << "Destroying media backend while still in 'playing' state"; |
+ if (have_audio_decoder_ && !sfx_backend_) { |
+ backend_manager_->UpdatePlayingAudioCount(-1); |
+ } |
+ } |
} |
MediaPipelineBackend::AudioDecoder* |
MediaPipelineBackendWrapper::CreateAudioDecoder() { |
- DCHECK(!is_initialized_); |
- if (audio_decoder_wrapper_) |
- return nullptr; |
+ DCHECK(!have_audio_decoder_); |
- if (!backend_manager_->IncrementDecoderCount(DecoderType::AUDIO_DECODER)) |
+ if (!backend_manager_->IncrementDecoderCount( |
+ sfx_backend_ ? DecoderType::SFX_DECODER : DecoderType::AUDIO_DECODER)) |
return nullptr; |
+ have_audio_decoder_ = true; |
- audio_decoder_wrapper_.reset( |
- new AudioDecoderWrapper(backend_->CreateAudioDecoder())); |
- return audio_decoder_wrapper_.get(); |
+ return backend_->CreateAudioDecoder(); |
} |
MediaPipelineBackend::VideoDecoder* |
MediaPipelineBackendWrapper::CreateVideoDecoder() { |
- DCHECK(!is_initialized_); |
DCHECK(!have_video_decoder_); |
if (!backend_manager_->IncrementDecoderCount(DecoderType::VIDEO_DECODER)) |
@@ -63,28 +68,36 @@ MediaPipelineBackendWrapper::CreateVideoDecoder() { |
} |
bool MediaPipelineBackendWrapper::Initialize() { |
- DCHECK(!is_initialized_); |
- is_initialized_ = backend_->Initialize(); |
- if (is_initialized_ && audio_decoder_wrapper_) |
- audio_decoder_wrapper_->SetStreamTypeVolume(stream_type_volume_); |
- |
- return is_initialized_; |
+ return backend_->Initialize(); |
} |
bool MediaPipelineBackendWrapper::Start(int64_t start_pts) { |
- return backend_->Start(start_pts); |
+ if (!backend_->Start(start_pts)) { |
+ return false; |
+ } |
+ SetPlaying(true); |
+ return true; |
} |
void MediaPipelineBackendWrapper::Stop() { |
backend_->Stop(); |
+ SetPlaying(false); |
} |
bool MediaPipelineBackendWrapper::Pause() { |
- return backend_->Pause(); |
+ if (!backend_->Pause()) { |
+ return false; |
+ } |
+ SetPlaying(false); |
+ return true; |
} |
bool MediaPipelineBackendWrapper::Resume() { |
- return backend_->Resume(); |
+ if (!backend_->Resume()) { |
+ return false; |
+ } |
+ SetPlaying(true); |
+ return true; |
} |
int64_t MediaPipelineBackendWrapper::GetCurrentPts() { |
@@ -95,15 +108,14 @@ bool MediaPipelineBackendWrapper::SetPlaybackRate(float rate) { |
return backend_->SetPlaybackRate(rate); |
} |
-int MediaPipelineBackendWrapper::GetStreamType() const { |
- return stream_type_; |
-} |
- |
-void MediaPipelineBackendWrapper::SetStreamTypeVolume( |
- float stream_type_volume) { |
- stream_type_volume_ = stream_type_volume; |
- if (is_initialized_ && audio_decoder_wrapper_) |
- audio_decoder_wrapper_->SetStreamTypeVolume(stream_type_volume_); |
+void MediaPipelineBackendWrapper::SetPlaying(bool playing) { |
+ if (playing == playing_) { |
+ return; |
+ } |
+ playing_ = playing; |
+ if (have_audio_decoder_ && !sfx_backend_) { |
+ backend_manager_->UpdatePlayingAudioCount(playing_ ? 1 : -1); |
+ } |
} |
} // namespace media |