2020-06-17 15:47:44 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "MetasoundAudioFormats.h"
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
|
|
|
|
#include "MetasoundAudioBuffer.h"
|
2021-01-13 10:48:59 -04:00
|
|
|
#include "MetasoundDataReference.h"
|
|
|
|
|
#include "MetasoundLiteral.h"
|
|
|
|
|
#include "MetasoundDataTypeRegistrationMacro.h"
|
2020-06-17 15:47:44 -04:00
|
|
|
|
2021-01-13 10:48:59 -04:00
|
|
|
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);
|
2020-11-04 14:26:37 -04:00
|
|
|
|
2020-06-17 15:47:44 -04:00
|
|
|
namespace Metasound
|
|
|
|
|
{
|
2020-07-20 00:05:22 -04:00
|
|
|
|
2020-06-17 15:47:44 -04:00
|
|
|
/* 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++)
|
|
|
|
|
{
|
2020-07-20 00:05:22 -04:00
|
|
|
FAudioBufferWriteRef Audio = FAudioBufferWriteRef::CreateNew(NumFrames);
|
2020-06-17 15:47:44 -04:00
|
|
|
Audio->Zero();
|
|
|
|
|
|
|
|
|
|
WritableBufferStorage.Add(Audio);
|
|
|
|
|
ReadableBufferStorage.Add(Audio);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetNumChannels(InNumChannels);
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-04 14:26:37 -04:00
|
|
|
FUnformattedAudio::FUnformattedAudio(const FOperatorSettings& InSettings, int32 InInitialNumChannels)
|
2020-07-27 14:12:55 -04:00
|
|
|
: FUnformattedAudio(InSettings.GetNumFramesPerBlock(), InInitialNumChannels, 8)
|
2020-07-20 00:05:22 -04:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-17 15:47:44 -04:00
|
|
|
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 */
|
|
|
|
|
|
2020-07-17 22:57:24 -04:00
|
|
|
FMultichannelAudioFormat::FMultichannelAudioFormat()
|
|
|
|
|
: NumChannels(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-17 15:47:44 -04:00
|
|
|
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++)
|
|
|
|
|
{
|
2020-07-20 00:05:22 -04:00
|
|
|
FAudioBufferWriteRef Audio = FAudioBufferWriteRef::CreateNew(InNumFrames);
|
2020-06-17 15:47:44 -04:00
|
|
|
Audio->Zero();
|
|
|
|
|
|
|
|
|
|
WritableBufferStorage.Add(Audio);
|
|
|
|
|
ReadableBufferStorage.Add(Audio);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WritableBuffers = WritableBufferStorage;
|
|
|
|
|
ReadableBuffers = ReadableBufferStorage;
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-04 14:26:37 -04:00
|
|
|
FMultichannelAudioFormat::FMultichannelAudioFormat(const FOperatorSettings& InSettings, int32 InNumChannels)
|
2020-07-27 14:12:55 -04:00
|
|
|
: FMultichannelAudioFormat(InSettings.GetNumFramesPerBlock(), InNumChannels)
|
2020-07-20 00:05:22 -04:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
2020-06-17 15:47:44 -04:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|