blob: ed95959b5452f4771c33a56848b0b27bcb17088d [file] [log] [blame]
// Copyright 2015 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/alsa/media_pipeline_backend_alsa.h"
#include <limits>
#include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/cma/backend/alsa/audio_decoder_alsa.h"
#include "chromecast/media/cma/backend/video_decoder_null.h"
namespace chromecast {
namespace media {
MediaPipelineBackendAlsa::MediaPipelineBackendAlsa(
const MediaPipelineDeviceParams& params)
: state_(kStateUninitialized), params_(params) {
}
MediaPipelineBackendAlsa::~MediaPipelineBackendAlsa() {
}
MediaPipelineBackendAlsa::AudioDecoder*
MediaPipelineBackendAlsa::CreateAudioDecoder() {
DCHECK_EQ(kStateUninitialized, state_);
if (audio_decoder_)
return nullptr;
audio_decoder_.reset(new AudioDecoderAlsa(this));
return audio_decoder_.get();
}
MediaPipelineBackendAlsa::VideoDecoder*
MediaPipelineBackendAlsa::CreateVideoDecoder() {
DCHECK_EQ(kStateUninitialized, state_);
if (video_decoder_)
return nullptr;
video_decoder_.reset(new VideoDecoderNull());
return video_decoder_.get();
}
bool MediaPipelineBackendAlsa::Initialize() {
DCHECK_EQ(kStateUninitialized, state_);
if (audio_decoder_)
audio_decoder_->Initialize();
state_ = kStateInitialized;
return true;
}
bool MediaPipelineBackendAlsa::Start(int64_t start_pts) {
DCHECK_EQ(kStateInitialized, state_);
if (audio_decoder_ && !audio_decoder_->Start(start_pts))
return false;
state_ = kStatePlaying;
return true;
}
void MediaPipelineBackendAlsa::Stop() {
DCHECK(state_ == kStatePlaying || state_ == kStatePaused) << "Invalid state "
<< state_;
if (audio_decoder_)
audio_decoder_->Stop();
state_ = kStateInitialized;
}
bool MediaPipelineBackendAlsa::Pause() {
DCHECK_EQ(kStatePlaying, state_);
if (audio_decoder_ && !audio_decoder_->Pause())
return false;
state_ = kStatePaused;
return true;
}
bool MediaPipelineBackendAlsa::Resume() {
DCHECK_EQ(kStatePaused, state_);
if (audio_decoder_ && !audio_decoder_->Resume())
return false;
state_ = kStatePlaying;
return true;
}
bool MediaPipelineBackendAlsa::SetPlaybackRate(float rate) {
if (audio_decoder_) {
return audio_decoder_->SetPlaybackRate(rate);
}
return true;
}
int64_t MediaPipelineBackendAlsa::GetCurrentPts() {
if (audio_decoder_)
return audio_decoder_->current_pts();
return std::numeric_limits<int64_t>::min();
}
bool MediaPipelineBackendAlsa::Primary() const {
return (params_.audio_type !=
MediaPipelineDeviceParams::kAudioStreamSoundEffects);
}
std::string MediaPipelineBackendAlsa::DeviceId() const {
return params_.device_id;
}
const scoped_refptr<base::SingleThreadTaskRunner>&
MediaPipelineBackendAlsa::GetTaskRunner() const {
return static_cast<TaskRunnerImpl*>(params_.task_runner)->runner();
}
} // namespace media
} // namespace chromecast