Files
UnrealEngineUWP/Engine/Source/Runtime/AudioCodecEngine/Private/DecoderBackCompat.cpp
maxwell hayes f6ea79f30b Adding seek and looping ability to metasound wave playe node.
#rb Aaron.McLeran
#jira UEAU-728, UEAU-587, wave
#preflight 6050099457edcb0001511a4e

#ROBOMERGE-SOURCE: CL 15708178 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v781-15675533)

[CL 15708220 by maxwell hayes in ue5-main branch]
2021-03-15 22:10:18 -04:00

106 lines
2.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "DecoderBackCompat.h"
#include "DecoderInputBackCompat.h"
#include "AudioDecompress.h"
namespace Audio
{
static const FCodecDetails Details =
{
TEXT("BackCompat"),
TEXT("BackCompat"),
1,
{ FCodecFeatures::HasDecoder }
};
bool FBackCompatCodec::SupportsPlatform(FName InPlatformName) const
{
// Everything right now.
return true;
}
const FCodecDetails& FBackCompatCodec::GetDetails() const
{
return Details;
}
const FCodecDetails& FBackCompatCodec::GetDetailsStatic()
{
return Details;
}
ICodec::FDecoderPtr FBackCompatCodec::CreateDecoder(
IDecoder::FDecoderInputPtr InSrc,
IDecoder::FDecoderOutputPtr InDst)
{
return MakeUnique<FBackCompat>(
InSrc,
InDst
);
}
FBackCompat::FBackCompat(IDecoder::FDecoderInputPtr InSrc, IDecoder::FDecoderOutputPtr InDst)
: Src(InSrc)
, Dst(InDst)
{
audio_ensure(InSrc->FindSection(Desc));
FDecodedFormatInfo Info { Desc.NumChannels, Desc.NumFramesPerSec, EBitRepresentation::Int16_Interleaved };
Reqs = Dst->GetRequirements(Info);
ResidualBuffer.SetNum(Reqs.NumSampleFramesWanted * Desc.NumChannels);
}
Audio::IDecoder::FDecodeReturn FBackCompat::Decode(bool bLoop)
{
uint32 NumFramesRemaining = Reqs.NumSampleFramesWanted;
FBackCompatInput& BackCompatSrc = static_cast<FBackCompatInput&>(*Src);
ICompressedAudioInfo* Info = BackCompatSrc.GetInfo();
bool bFinished = false;
IDecoderOutput::FPushedAudioDetails PushedDetails(
Desc.NumFramesPerSec,
Desc.NumChannels,
FrameOffset
);
uint32 BuffSizeInBytes = ResidualBuffer.Num() * sizeof(int16);
uint32 BuffSizeInFrames = Reqs.NumSampleFramesWanted;
uint8* Buff = (uint8*)ResidualBuffer.GetData();
while(!bFinished && NumFramesRemaining > 0)
{
int32 NumBytesStreamed = BuffSizeInBytes;
if (BackCompatSrc.Wave->IsStreaming())
{
bFinished = Info->StreamCompressedData(Buff, bLoop, BuffSizeInBytes, NumBytesStreamed);
}
else
{
bFinished = Info->ReadCompressedData(Buff, bLoop, BuffSizeInBytes);
}
PushedDetails.SampleFramesStartOffset = FrameOffset;
ResidualBuffer.SetNum(NumBytesStreamed / sizeof(int16));
Dst->PushAudio(
PushedDetails,
MakeArrayView(ResidualBuffer)
);
FrameOffset += BuffSizeInFrames;
NumFramesRemaining -= BuffSizeInFrames;
}
if(!bFinished)
{
return EDecodeResult::MoreDataRemaining;
}
else if (bLoop) // (bFinished is true)
{
return EDecodeResult::Looped;
}
else // (bFinished is true and we aren't looping)
{
return EDecodeResult::Finished;
}
}
}