Files
UnrealEngine/Engine/Plugins/Media/ElectraPlayer/Source/ElectraPlayerPlugin/Private/ElectraPlayerAudioSample.h
2025-05-18 13:04:45 +08:00

92 lines
3.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "IMediaAudioSample.h"
#include "MediaObjectPool.h"
#include "Misc/Timespan.h"
#include "Templates/SharedPointer.h"
#include "MediaAudioDecoderOutput.h"
// IMediaAudioSample impl
// is used as audio decoder output
// contains decoded audio samples ready for playback along with corresponding metadata
// owns binary data so can be cached
class FElectraPlayerAudioSample :
public IMediaAudioSample,
public IMediaPoolable
{
public:
FElectraPlayerAudioSample()
{
}
~FElectraPlayerAudioSample()
{
}
void Initialize(const IAudioDecoderOutputPtr& InDecoderOutput)
{
DecoderOutput = InDecoderOutput;
}
const void* GetBuffer() override
{ return DecoderOutput ? DecoderOutput->GetBuffer() : nullptr; }
uint32 GetChannels() const override
{ return DecoderOutput ? DecoderOutput->GetChannels() : 0; }
FTimespan GetDuration() const override
{ return DecoderOutput ? DecoderOutput->GetDuration() : FTimespan::Zero(); }
EMediaAudioSampleFormat GetFormat() const override
{
static_assert((int32)EMediaAudioSampleFormat::Undefined == (int32)IAudioDecoderOutput::ESampleFormat::Undefined, "check enums are identical");
static_assert((int32)EMediaAudioSampleFormat::Double == (int32)IAudioDecoderOutput::ESampleFormat::Double, "check enums are identical");
static_assert((int32)EMediaAudioSampleFormat::Float == (int32)IAudioDecoderOutput::ESampleFormat::Float, "check enums are identical");
static_assert((int32)EMediaAudioSampleFormat::Int8 == (int32)IAudioDecoderOutput::ESampleFormat::Int8, "check enums are identical");
static_assert((int32)EMediaAudioSampleFormat::Int16 == (int32)IAudioDecoderOutput::ESampleFormat::Int16, "check enums are identical");
static_assert((int32)EMediaAudioSampleFormat::Int32 == (int32)IAudioDecoderOutput::ESampleFormat::Int32, "check enums are identical");
return DecoderOutput ? (EMediaAudioSampleFormat)DecoderOutput->GetFormat() : EMediaAudioSampleFormat::Undefined;
}
uint32 GetFrames() const override
{ return DecoderOutput ? DecoderOutput->GetFrames() : 0; }
uint32 GetSampleRate() const override
{ return DecoderOutput ? DecoderOutput->GetSampleRate() : 0; }
FMediaTimeStamp GetTime() const override
{
if (!DecoderOutput)
{
return FMediaTimeStamp();
}
FDecoderTimeStamp TimeStamp = DecoderOutput->GetTime();
return FMediaTimeStamp(TimeStamp.Time, TimeStamp.SequenceIndex);
}
uint32 GetMaxBufferBytes() const
{ return DecoderOutput ? DecoderOutput->GetReservedBufferBytes() : 0; }
virtual void SetTime(const FMediaTimeStamp& InTime)
{
if (DecoderOutput)
{
DecoderOutput->SetTime(FDecoderTimeStamp(InTime.Time, InTime.GetIndexValue()));
}
}
virtual void InitializePoolable() override;
virtual void ShutdownPoolable() override;
private:
IAudioDecoderOutputPtr DecoderOutput;
};
using FElectraPlayerAudioSamplePtr = TSharedPtr<FElectraPlayerAudioSample, ESPMode::ThreadSafe>;
using FElectraPlayerAudioSamplePool = TMediaObjectPool<FElectraPlayerAudioSample>;