Files
UnrealEngineUWP/Engine/Plugins/Runtime/Metasound/Source/MetasoundStandardNodes/Private/MetasoundAudioFormats.cpp
phil popp 4cdd926b68 Metasound Frontend Revamp
- New node name {namespace.name.variant}
- PointIDs for exact pin-to-pin connections
- TAccessPtr updates
- Controller/Handle interface
- Document Handle
- Frontend Transforms
- Input/Output node external registration
- Revamped document model

#rb Max.Hayes, Rob.Gay
#jira UEAU-626

[CL 15066822 by phil popp in ue5-main branch]
2021-01-13 10:48:59 -04:00

128 lines
3.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MetasoundAudioFormats.h"
#include "CoreMinimal.h"
#include "MetasoundAudioBuffer.h"
#include "MetasoundDataReference.h"
#include "MetasoundLiteral.h"
#include "MetasoundDataTypeRegistrationMacro.h"
REGISTER_METASOUND_DATATYPE(Metasound::FUnformattedAudio, "Audio:Unformatted");
REGISTER_METASOUND_DATATYPE(Metasound::FMonoAudioFormat, "Audio:Mono");
REGISTER_METASOUND_DATATYPE(Metasound::FStereoAudioFormat, "Audio:Stereo");
REGISTER_METASOUND_DATATYPE(Metasound::FMultichannelAudioFormat, "Audio:Multichannel", ELiteralType::Integer);
namespace Metasound
{
/* FUnformattedAudio */
FUnformattedAudio::FUnformattedAudio(int32 InNumFrames, int32 InNumChannels, int32 InMaxNumChannels)
: NumFrames(InNumFrames)
, NumChannels(0)
, MaxNumChannels(InMaxNumChannels)
{
NumFrames = FMath::Max(NumFrames, 0);
MaxNumChannels = FMath::Max(MaxNumChannels, 0);
for (int32 i = 0; i < MaxNumChannels; i++)
{
FAudioBufferWriteRef Audio = FAudioBufferWriteRef::CreateNew(NumFrames);
Audio->Zero();
WritableBufferStorage.Add(Audio);
ReadableBufferStorage.Add(Audio);
}
SetNumChannels(InNumChannels);
}
FUnformattedAudio::FUnformattedAudio(const FOperatorSettings& InSettings, int32 InInitialNumChannels)
: FUnformattedAudio(InSettings.GetNumFramesPerBlock(), InInitialNumChannels, 8)
{
}
int32 FUnformattedAudio::SetNumChannels(int32 InNumChannels)
{
NumChannels = FMath::Max(0, FMath::Min(InNumChannels, MaxNumChannels));
ReadableBuffers = TArrayView<const FAudioBufferReadRef>(ReadableBufferStorage.GetData(), NumChannels);
WritableBuffers = TArrayView<const FAudioBufferWriteRef>(WritableBufferStorage.GetData(), NumChannels);
return NumChannels;
}
/* FMultichannelAudioFormat */
FMultichannelAudioFormat::FMultichannelAudioFormat()
: NumChannels(0)
{
}
FMultichannelAudioFormat::FMultichannelAudioFormat(int32 InNumFrames, int32 InNumChannels)
: NumChannels(InNumChannels)
{
NumChannels = FMath::Max(0, NumChannels);
InNumFrames = FMath::Max(0, InNumFrames);
for (int32 i = 0; i < NumChannels; i++)
{
FAudioBufferWriteRef Audio = FAudioBufferWriteRef::CreateNew(InNumFrames);
Audio->Zero();
WritableBufferStorage.Add(Audio);
ReadableBufferStorage.Add(Audio);
}
WritableBuffers = WritableBufferStorage;
ReadableBuffers = ReadableBufferStorage;
}
FMultichannelAudioFormat::FMultichannelAudioFormat(const FOperatorSettings& InSettings, int32 InNumChannels)
: FMultichannelAudioFormat(InSettings.GetNumFramesPerBlock(), InNumChannels)
{}
FMultichannelAudioFormat::FMultichannelAudioFormat(TArrayView<const FAudioBufferWriteRef> InWriteRefs)
: NumChannels(InWriteRefs.Num())
{
if (NumChannels > 0)
{
const int32 NumFrames = InWriteRefs[0]->Num();
for (const FAudioBufferWriteRef& Ref : InWriteRefs)
{
checkf(NumFrames == Ref->Num(), TEXT("All buffers must have same number of frames (%d != %d)"), NumFrames, Ref->Num());
WritableBufferStorage.Add(Ref);
ReadableBufferStorage.Add(Ref);
}
WritableBuffers = WritableBufferStorage;
ReadableBuffers = ReadableBufferStorage;
}
}
FMultichannelAudioFormat::FMultichannelAudioFormat(TArrayView<const FAudioBufferReadRef> InReadRefs)
: NumChannels(InReadRefs.Num())
{
if (NumChannels > 0)
{
const int32 NumFrames = InReadRefs[0]->Num();
for (const FAudioBufferReadRef& Ref : InReadRefs)
{
checkf(NumFrames == Ref->Num(), TEXT("All buffers must have same number of frames (%d != %d)"), NumFrames, Ref->Num());
WritableBufferStorage.Add(WriteCast(Ref));
ReadableBufferStorage.Add(Ref);
}
WritableBuffers = WritableBufferStorage;
ReadableBuffers = ReadableBufferStorage;
}
}
}