// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMECAST_MEDIA_COMMON_AUDIO_DECODER_WRAPPER_H_
#define CHROMECAST_MEDIA_COMMON_AUDIO_DECODER_WRAPPER_H_
#include <memory>
#include "base/memory/ref_counted.h"
#include "chromecast/media/api/cma_backend.h"
#include "chromecast/media/common/audio_decoder_software_wrapper.h"
#include "chromecast/media/common/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(
MediaPipelineBackend::AudioDecoder* backend_decoder,
AudioContentType type,
MediaPipelineBackendManager::BufferDelegate* buffer_delegate);
ActiveAudioDecoderWrapper(const ActiveAudioDecoderWrapper&) = delete;
ActiveAudioDecoderWrapper& operator=(const ActiveAudioDecoderWrapper&) =
delete;
~ActiveAudioDecoderWrapper() override;
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;
AudioTrackTimestamp GetAudioTrackTimestamp() override;
int GetStartThresholdInFrames() override;
bool RequiresDecryption() override;
AudioDecoderSoftwareWrapper decoder_;
const AudioContentType content_type_;
MediaPipelineBackendManager::BufferDelegate* const buffer_delegate_;
bool initialized_;
bool delegate_active_;
float stream_volume_multiplier_;
scoped_refptr<DecoderBufferBase> pushed_buffer_;
};
class AudioDecoderWrapper : public CmaBackend::AudioDecoder {
public:
// Create a functional "real" AudioDecoder.
AudioDecoderWrapper(
MediaPipelineBackend::AudioDecoder* backend_decoder,
AudioContentType type,
MediaPipelineBackendManager::BufferDelegate* buffer_delegate);
// Create a "fake" AudioDecoder that's already in revoked state.
AudioDecoderWrapper(AudioContentType type);
AudioDecoderWrapper(const AudioDecoderWrapper&) = delete;
AudioDecoderWrapper& operator=(const AudioDecoderWrapper&) = delete;
~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;
AudioTrackTimestamp GetAudioTrackTimestamp() override;
int GetStartThresholdInFrames() override;
bool RequiresDecryption() override;
bool decoder_revoked_;
std::unique_ptr<DestructableAudioDecoder> audio_decoder_;
};
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_MEDIA_COMMON_AUDIO_DECODER_WRAPPER_H_