blob: 22b0ab2c1f963cf26861634e8930c28575a5862c [file] [log] [blame]
// Copyright 2017 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.
#ifndef CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_
#define CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_
#include <memory>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "chromecast/media/cma/backend/audio_decoder_software_wrapper.h"
#include "chromecast/media/cma/backend/cma_backend.h"
#include "chromecast/media/cma/backend/media_pipeline_backend_manager.h"
#include "chromecast/public/media/media_pipeline_backend.h"
namespace chromecast {
namespace media {
enum class AudioContentType;
// Make the destructor of CmaBackend::AudioDecoder() public.
class DestructableAudioDecoder : public CmaBackend::AudioDecoder {
public:
~DestructableAudioDecoder() override = default;
virtual void OnInitialized() = 0;
};
class ActiveAudioDecoderWrapper : public DestructableAudioDecoder {
public:
ActiveAudioDecoderWrapper(
MediaPipelineBackendManager* backend_manager,
MediaPipelineBackend::AudioDecoder* backend_decoder,
AudioContentType type,
MediaPipelineBackendManager::BufferDelegate* buffer_delegate);
~ActiveAudioDecoderWrapper() override;
void SetGlobalVolumeMultiplier(float multiplier);
AudioContentType content_type() const { return content_type_; }
private:
// DestructableAudioDecoder implementation:
void OnInitialized() override;
void SetDelegate(Delegate* delegate) override;
BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override;
bool SetConfig(const AudioConfig& config) override;
bool SetVolume(float multiplier) override;
RenderingDelay GetRenderingDelay() override;
void GetStatistics(Statistics* statistics) override;
bool RequiresDecryption() override;
MediaPipelineBackendManager* const backend_manager_;
AudioDecoderSoftwareWrapper decoder_;
const AudioContentType content_type_;
MediaPipelineBackendManager::BufferDelegate* const buffer_delegate_;
bool initialized_;
bool delegate_active_;
float global_volume_multiplier_;
float stream_volume_multiplier_;
scoped_refptr<DecoderBufferBase> pushed_buffer_;
DISALLOW_COPY_AND_ASSIGN(ActiveAudioDecoderWrapper);
};
class AudioDecoderWrapper : public CmaBackend::AudioDecoder {
public:
// Create a functional "real" AudioDecoder.
AudioDecoderWrapper(
MediaPipelineBackendManager* backend_manager,
MediaPipelineBackend::AudioDecoder* backend_decoder,
AudioContentType type,
MediaPipelineBackendManager::BufferDelegate* buffer_delegate);
// Create a "fake" AudioDecoder that's already in revoked state.
AudioDecoderWrapper(AudioContentType type);
~AudioDecoderWrapper() override;
void OnInitialized();
void Revoke();
private:
// CmaBackend::AudioDecoder implementation:
void SetDelegate(Delegate* delegate) override;
BufferStatus PushBuffer(scoped_refptr<DecoderBufferBase> buffer) override;
bool SetConfig(const AudioConfig& config) override;
bool SetVolume(float multiplier) override;
RenderingDelay GetRenderingDelay() override;
void GetStatistics(Statistics* statistics) override;
bool RequiresDecryption() override;
bool decoder_revoked_;
std::unique_ptr<DestructableAudioDecoder> audio_decoder_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderWrapper);
};
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_