Files
UnrealEngineUWP/Engine/Source/Runtime/AudioExtensions/Private/AudioParameterInterface.cpp
Rob Gay 3dc8f2ddfe - Add ability to send MetaSound object parameter types that are not SoundWaves
- Cache Audio Parameters on AudioComponent properly so they can be modified prior to playback.
- Migrate AudioComponentParameterization to SoundGeneratorParameterInterface
- AudioComponent now inherits from SoundGeneratorParameterInterface
- Unify code path with default transmitter implemented in SoundBase for legacy SoundCue parameter system

Other Minor updates:
- Rename to "Audio Instance" to "Audio Parameter" for clarity

#rb phil.popp
#jira UE-123951
#jira UE-123979
#preflight 612d0053423a8f00012ba195

[CL 17355572 by Rob Gay in ue5-main branch]
2021-08-30 14:07:44 -04:00

165 lines
3.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "AudioParameterInterface.h"
#include "IAudioProxyInitializer.h"
namespace AudioParameterPrivate
{
template <typename T>
void SetOrMergeArray(const TArray<T>& InArray, TArray<T>& OutArray, bool bInMerge)
{
if (bInMerge)
{
OutArray.Append(InArray);
}
else
{
OutArray = InArray;
}
}
}
void FAudioParameter::Merge(const FAudioParameter& InParameter, bool bInTakeName, bool bInTakeType, bool bInMergeArrayTypes)
{
if (bInTakeName)
{
ParamName = InParameter.ParamName;
}
if (bInTakeType)
{
ParamType = InParameter.ParamType;
}
switch (InParameter.ParamType)
{
case EAudioParameterType::Boolean:
{
BoolParam = InParameter.BoolParam;
}
break;
case EAudioParameterType::BooleanArray:
{
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayBoolParam, ArrayBoolParam, bInMergeArrayTypes);
}
break;
case EAudioParameterType::Float:
{
FloatParam = InParameter.FloatParam;
}
break;
case EAudioParameterType::FloatArray:
{
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayFloatParam, ArrayFloatParam, bInMergeArrayTypes);
}
break;
case EAudioParameterType::Integer:
case EAudioParameterType::NoneArray:
{
if (bInMergeArrayTypes)
{
IntParam += InParameter.IntParam;
}
else
{
IntParam = InParameter.IntParam;
}
}
break;
case EAudioParameterType::IntegerArray:
{
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayIntParam, ArrayIntParam, bInMergeArrayTypes);
}
break;
case EAudioParameterType::None:
{
FloatParam = InParameter.FloatParam;
BoolParam = InParameter.BoolParam;
IntParam = InParameter.IntParam;
ObjectParam = InParameter.ObjectParam;
StringParam = InParameter.StringParam;
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayBoolParam, ArrayBoolParam, bInMergeArrayTypes);
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayFloatParam, ArrayFloatParam, bInMergeArrayTypes);
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayIntParam, ArrayIntParam, bInMergeArrayTypes);
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayObjectParam, ArrayObjectParam, bInMergeArrayTypes);
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayStringParam, ArrayStringParam, bInMergeArrayTypes);
if (!bInMergeArrayTypes)
{
ObjectProxies.Reset();
}
for (const Audio::IProxyDataPtr& ProxyPtr : InParameter.ObjectProxies)
{
if (ensure(ProxyPtr.IsValid()))
{
ObjectProxies.Emplace(ProxyPtr->Clone());
}
}
}
break;
case EAudioParameterType::Object:
{
ObjectParam = InParameter.ObjectParam;
ObjectProxies.Reset();
for (const Audio::IProxyDataPtr& ProxyPtr : InParameter.ObjectProxies)
{
if (ensure(ProxyPtr.IsValid()))
{
ObjectProxies.Emplace(ProxyPtr->Clone());
}
}
}
break;
case EAudioParameterType::ObjectArray:
{
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayObjectParam, ArrayObjectParam, bInMergeArrayTypes);
if (!bInMergeArrayTypes)
{
ObjectProxies.Reset();
}
for (const Audio::IProxyDataPtr& ProxyPtr : InParameter.ObjectProxies)
{
if (ensure(ProxyPtr.IsValid()))
{
ObjectProxies.Emplace(ProxyPtr->Clone());
}
}
}
break;
case EAudioParameterType::String:
{
StringParam = InParameter.StringParam;
}
break;
case EAudioParameterType::StringArray:
{
AudioParameterPrivate::SetOrMergeArray(InParameter.ArrayStringParam, ArrayStringParam, bInMergeArrayTypes);
}
break;
default:
break;
}
}
UAudioParameterInterface::UAudioParameterInterface(FObjectInitializer const& InObjectInitializer)
: UInterface(InObjectInitializer)
{
}