Files
UnrealEngineUWP/Engine/Source/Runtime/AudioExtensions/Private/AudioParameter.cpp
rob gay d2e6910760 MetaSounds Interfaces Checkpoint 2:
- Version up source archetypes to become two interfaces: channel interfaces (mono/stereo) & base source namespace
- Clean-up Interface panel to support namespacing better
- Fix bugs with assuming interfaces are always and the only base namespace members
- Allow namespacing for any arbitrary interface member
- Add lock icon to clarify what interface members cannot be modified individually (i.e. cannot add, remove, or rename them as they are interface members)
- Organize members alphabetically
#jira UE-135000
#rnx
#rb phil.popp
#preflight 61a7d1079c77d610079303ec

#ROBOMERGE-AUTHOR: rob.gay
#ROBOMERGE-SOURCE: CL 18344347 in //UE5/Release-5.0/... via CL 18344412
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v895-18170469)

[CL 18344446 by rob gay in ue5-release-engine-test branch]
2021-12-01 15:59:03 -05:00

233 lines
5.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "AudioParameter.h"
namespace Audio
{
namespace ParameterPrivate
{
template <typename T>
void SetOrMergeArray(const TArray<T>& InArray, TArray<T>& OutArray, bool bInMerge)
{
if (bInMerge)
{
OutArray.Append(InArray);
}
else
{
OutArray = InArray;
}
}
} // ParameterPrivate
const FString FParameterPath::NamespaceDelimiter = TEXT(AUDIO_PARAMETER_NAMESPACE_PATH_DELIMITER);
FName FParameterPath::CombineNames(FName InLeft, FName InRight)
{
if (InLeft.IsNone())
{
return InRight;
}
const FString FullName = FString::Join(TArray<FString>({ *InLeft.ToString(), *InRight.ToString() }), *NamespaceDelimiter);
return FName(FullName);
}
void FParameterPath::SplitName(FName InFullName, FName& OutNamespace, FName& OutParameterName)
{
FString FullName = InFullName.ToString();
const int32 IndexOfDelim = FullName.Find(NamespaceDelimiter, ESearchCase::IgnoreCase, ESearchDir::FromEnd);
if (IndexOfDelim != INDEX_NONE)
{
OutNamespace = FName(*FullName.Left(IndexOfDelim));
OutParameterName = FName(*FullName.RightChop(IndexOfDelim + 1));
}
else
{
OutNamespace = FName();
OutParameterName = InFullName;
}
}
} // namespace Audio
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:
{
Audio::ParameterPrivate::SetOrMergeArray(InParameter.ArrayBoolParam, ArrayBoolParam, bInMergeArrayTypes);
}
break;
case EAudioParameterType::Float:
{
FloatParam = InParameter.FloatParam;
}
break;
case EAudioParameterType::FloatArray:
{
Audio::ParameterPrivate::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:
{
Audio::ParameterPrivate::SetOrMergeArray(InParameter.ArrayIntParam, ArrayIntParam, bInMergeArrayTypes);
}
break;
case EAudioParameterType::None:
{
FloatParam = InParameter.FloatParam;
BoolParam = InParameter.BoolParam;
IntParam = InParameter.IntParam;
ObjectParam = InParameter.ObjectParam;
StringParam = InParameter.StringParam;
Audio::ParameterPrivate::SetOrMergeArray(InParameter.ArrayBoolParam, ArrayBoolParam, bInMergeArrayTypes);
Audio::ParameterPrivate::SetOrMergeArray(InParameter.ArrayFloatParam, ArrayFloatParam, bInMergeArrayTypes);
Audio::ParameterPrivate::SetOrMergeArray(InParameter.ArrayIntParam, ArrayIntParam, bInMergeArrayTypes);
Audio::ParameterPrivate::SetOrMergeArray(InParameter.ArrayObjectParam, ArrayObjectParam, bInMergeArrayTypes);
Audio::ParameterPrivate::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:
{
Audio::ParameterPrivate::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:
{
Audio::ParameterPrivate::SetOrMergeArray(InParameter.ArrayStringParam, ArrayStringParam, bInMergeArrayTypes);
}
break;
default:
break;
}
}
void FAudioParameter::Merge(TArray<FAudioParameter>&& InParams, TArray<FAudioParameter>& OutParams)
{
if (InParams.IsEmpty())
{
return;
}
if (OutParams.IsEmpty())
{
OutParams.Append(MoveTemp(InParams));
return;
}
auto SortParamsPredicate = [](const FAudioParameter& A, const FAudioParameter& B) { return A.ParamName.FastLess(B.ParamName); };
InParams.Sort(SortParamsPredicate);
OutParams.Sort(SortParamsPredicate);
for (int32 i = OutParams.Num() - 1; i >= 0; --i)
{
while (!InParams.IsEmpty())
{
FAudioParameter& OutParam = OutParams[i];
if (InParams.Last().ParamName.FastLess(OutParam.ParamName))
{
break;
}
constexpr bool bAllowShrinking = false;
FAudioParameter NewParam = InParams.Pop(bAllowShrinking);
if (NewParam.ParamName == OutParam.ParamName)
{
NewParam.Merge(OutParam);
OutParam = MoveTemp(NewParam);
}
else
{
OutParams.Emplace(MoveTemp(NewParam));
}
}
}
}