2020-07-23 20:32:26 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
2021-03-02 21:39:09 -04:00
|
|
|
#include "EdGraph/EdGraph.h"
|
2021-08-30 14:08:45 -04:00
|
|
|
#include "IAudioParameterTransmitter.h"
|
2021-06-16 11:21:13 -04:00
|
|
|
#include "Metasound.h"
|
2021-01-22 03:05:22 -04:00
|
|
|
#include "MetasoundAssetBase.h"
|
2020-07-23 20:32:26 -04:00
|
|
|
#include "MetasoundFrontend.h"
|
2021-01-13 10:48:59 -04:00
|
|
|
#include "MetasoundFrontendDocument.h"
|
2021-08-18 15:16:57 -04:00
|
|
|
#include "MetasoundFrontendRegistries.h"
|
2021-02-16 01:26:50 -04:00
|
|
|
#include "MetasoundOperatorSettings.h"
|
2021-08-30 14:08:45 -04:00
|
|
|
#include "MetasoundParameterTransmitter.h"
|
2021-01-22 03:05:22 -04:00
|
|
|
#include "MetasoundRouter.h"
|
2020-07-23 20:32:26 -04:00
|
|
|
#include "Sound/SoundWaveProcedural.h"
|
2021-06-16 11:21:13 -04:00
|
|
|
#include "UObject/MetaData.h"
|
2020-07-23 20:32:26 -04:00
|
|
|
|
|
|
|
|
#include "MetasoundSource.generated.h"
|
|
|
|
|
|
2021-06-08 10:52:31 -04:00
|
|
|
|
2021-04-02 02:09:50 -04:00
|
|
|
/** Declares the output audio format of the UMetaSoundSource */
|
2020-12-14 15:48:27 -04:00
|
|
|
UENUM()
|
|
|
|
|
enum class EMetasoundSourceAudioFormat : uint8
|
|
|
|
|
{
|
2021-06-08 10:52:31 -04:00
|
|
|
// Mono audio output
|
|
|
|
|
Mono,
|
|
|
|
|
|
|
|
|
|
// Stereo audio output
|
|
|
|
|
Stereo,
|
|
|
|
|
|
|
|
|
|
COUNT UMETA(Hidden)
|
2020-12-14 15:48:27 -04:00
|
|
|
};
|
2020-07-23 20:32:26 -04:00
|
|
|
|
2021-03-02 21:39:09 -04:00
|
|
|
|
2020-07-23 20:32:26 -04:00
|
|
|
/**
|
2020-07-28 16:32:56 -04:00
|
|
|
* This Metasound type can be played as an audio source.
|
2020-07-23 20:32:26 -04:00
|
|
|
*/
|
|
|
|
|
UCLASS(hidecategories = object, BlueprintType)
|
2021-04-02 02:09:50 -04:00
|
|
|
class METASOUNDENGINE_API UMetaSoundSource : public USoundWaveProcedural, public FMetasoundAssetBase
|
2020-07-23 20:32:26 -04:00
|
|
|
{
|
|
|
|
|
GENERATED_BODY()
|
|
|
|
|
|
|
|
|
|
protected:
|
2020-08-05 12:47:19 -04:00
|
|
|
UPROPERTY(EditAnywhere, Category = CustomView)
|
2021-01-13 10:48:59 -04:00
|
|
|
FMetasoundFrontendDocument RootMetasoundDocument;
|
2020-12-14 15:48:27 -04:00
|
|
|
|
2021-07-27 15:36:03 -04:00
|
|
|
UPROPERTY()
|
2021-08-18 15:16:57 -04:00
|
|
|
TSet<FString> ReferencedAssetClassKeys;
|
|
|
|
|
|
2021-11-07 23:43:01 -05:00
|
|
|
UPROPERTY()
|
|
|
|
|
TSet<FSoftObjectPath> ReferenceAssetClassCache;
|
2021-07-27 15:36:03 -04:00
|
|
|
|
2020-07-23 20:32:26 -04:00
|
|
|
#if WITH_EDITORONLY_DATA
|
2021-05-14 11:31:26 -04:00
|
|
|
UPROPERTY()
|
2022-05-26 15:06:53 -04:00
|
|
|
TObjectPtr<UMetasoundEditorGraphBase> Graph;
|
2020-07-23 20:32:26 -04:00
|
|
|
#endif // WITH_EDITORONLY_DATA
|
|
|
|
|
|
|
|
|
|
public:
|
2021-04-02 02:09:50 -04:00
|
|
|
UMetaSoundSource(const FObjectInitializer& ObjectInitializer);
|
2020-07-23 20:32:26 -04:00
|
|
|
|
2020-12-14 15:48:27 -04:00
|
|
|
// The output audio format of the metasound source.
|
2021-03-24 16:42:25 -04:00
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Metasound)
|
2020-12-14 15:48:27 -04:00
|
|
|
EMetasoundSourceAudioFormat OutputFormat;
|
|
|
|
|
|
2021-06-16 11:21:13 -04:00
|
|
|
UPROPERTY(AssetRegistrySearchable)
|
|
|
|
|
FGuid AssetClassID;
|
|
|
|
|
|
2021-06-08 10:52:31 -04:00
|
|
|
#if WITH_EDITORONLY_DATA
|
2021-06-16 11:21:13 -04:00
|
|
|
UPROPERTY(AssetRegistrySearchable)
|
|
|
|
|
FString RegistryInputTypes;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(AssetRegistrySearchable)
|
|
|
|
|
FString RegistryOutputTypes;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(AssetRegistrySearchable)
|
|
|
|
|
int32 RegistryVersionMajor = 0;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(AssetRegistrySearchable)
|
|
|
|
|
int32 RegistryVersionMinor = 0;
|
|
|
|
|
|
2022-02-25 15:48:47 -05:00
|
|
|
//~ Begin UObject Interface.
|
|
|
|
|
virtual void PostLoad() override;
|
|
|
|
|
//~ End UObject Interface.
|
|
|
|
|
|
2021-06-16 11:21:13 -04:00
|
|
|
// Sets Asset Registry Metadata associated with this MetaSoundSource
|
|
|
|
|
virtual void SetRegistryAssetClassInfo(const Metasound::Frontend::FNodeClassInfo& InNodeInfo) override;
|
|
|
|
|
|
2020-07-30 16:57:04 -04:00
|
|
|
// Returns document name (for editor purposes, and avoids making document public for edit
|
|
|
|
|
// while allowing editor to reference directly)
|
|
|
|
|
static FName GetDocumentPropertyName()
|
|
|
|
|
{
|
2021-04-02 02:09:50 -04:00
|
|
|
return GET_MEMBER_NAME_CHECKED(UMetaSoundSource, RootMetasoundDocument);
|
2020-07-30 16:57:04 -04:00
|
|
|
}
|
2020-07-23 20:32:26 -04:00
|
|
|
|
2021-06-08 10:52:31 -04:00
|
|
|
// Name to display in editors
|
|
|
|
|
virtual FText GetDisplayName() const override;
|
2021-03-02 21:39:09 -04:00
|
|
|
|
2020-07-23 20:32:26 -04:00
|
|
|
// Returns the graph associated with this Metasound. Graph is required to be referenced on
|
|
|
|
|
// Metasound UObject for editor serialization purposes.
|
2021-04-02 02:09:50 -04:00
|
|
|
// @return Editor graph associated with UMetaSoundSource.
|
2021-06-08 10:52:31 -04:00
|
|
|
virtual UEdGraph* GetGraph() override;
|
|
|
|
|
virtual const UEdGraph* GetGraph() const override;
|
|
|
|
|
virtual UEdGraph& GetGraphChecked() override;
|
|
|
|
|
virtual const UEdGraph& GetGraphChecked() const override;
|
2020-07-23 20:32:26 -04:00
|
|
|
|
|
|
|
|
// Sets the graph associated with this Metasound. Graph is required to be referenced on
|
|
|
|
|
// Metasound UObject for editor serialization purposes.
|
2021-04-02 02:09:50 -04:00
|
|
|
// @param Editor graph associated with UMetaSoundSource.
|
2020-07-23 20:32:26 -04:00
|
|
|
virtual void SetGraph(UEdGraph* InGraph) override
|
|
|
|
|
{
|
2021-03-02 21:39:09 -04:00
|
|
|
Graph = CastChecked<UMetasoundEditorGraphBase>(InGraph);
|
2020-07-23 20:32:26 -04:00
|
|
|
}
|
2021-06-08 10:52:31 -04:00
|
|
|
#endif // #if WITH_EDITORONLY_DATA
|
|
|
|
|
|
|
|
|
|
#if WITH_EDITOR
|
|
|
|
|
virtual void PostEditUndo() override;
|
2020-07-23 20:32:26 -04:00
|
|
|
|
2021-04-02 02:09:50 -04:00
|
|
|
virtual bool GetRedrawThumbnail() const override
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void SetRedrawThumbnail(bool bInRedraw) override
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual bool CanVisualizeAsset() const override
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-28 16:21:39 -04:00
|
|
|
virtual void PostDuplicate(EDuplicateMode::Type InDuplicateMode) override;
|
|
|
|
|
|
2021-06-08 10:52:31 -04:00
|
|
|
virtual void PostEditChangeProperty(FPropertyChangedEvent& InEvent) override;
|
2020-12-14 15:48:27 -04:00
|
|
|
#endif // WITH_EDITOR
|
2020-07-23 20:32:26 -04:00
|
|
|
|
2021-08-18 15:16:57 -04:00
|
|
|
virtual const TSet<FString>& GetReferencedAssetClassKeys() const override
|
|
|
|
|
{
|
|
|
|
|
return ReferencedAssetClassKeys;
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-27 15:36:03 -04:00
|
|
|
virtual void BeginDestroy() override;
|
|
|
|
|
virtual void PreSave(FObjectPreSaveContext InSaveContext) override;
|
|
|
|
|
virtual void Serialize(FArchive& Ar) override;
|
|
|
|
|
|
2021-11-07 23:43:01 -05:00
|
|
|
virtual TSet<FSoftObjectPath>& GetReferencedAssetClassCache() override;
|
|
|
|
|
virtual const TSet<FSoftObjectPath>& GetReferencedAssetClassCache() const override;
|
2021-07-27 15:36:03 -04:00
|
|
|
|
2021-06-16 11:21:13 -04:00
|
|
|
// Returns Asset Metadata associated with this MetaSoundSource
|
|
|
|
|
virtual Metasound::Frontend::FNodeClassInfo GetAssetClassInfo() const override;
|
2021-06-08 10:52:31 -04:00
|
|
|
|
|
|
|
|
|
2021-11-22 15:55:50 -05:00
|
|
|
virtual bool ConformObjectDataToInterfaces() override;
|
2021-08-18 15:16:57 -04:00
|
|
|
|
2021-02-01 15:59:27 -04:00
|
|
|
UObject* GetOwningAsset() override
|
2020-07-23 20:32:26 -04:00
|
|
|
{
|
2021-02-01 15:59:27 -04:00
|
|
|
return this;
|
2020-07-23 20:32:26 -04:00
|
|
|
}
|
|
|
|
|
|
2021-02-01 15:59:27 -04:00
|
|
|
const UObject* GetOwningAsset() const override
|
|
|
|
|
{
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2020-07-23 20:32:26 -04:00
|
|
|
|
2021-08-30 14:08:45 -04:00
|
|
|
virtual void InitParameters(TArray<FAudioParameter>& InParametersToInit, FName InFeatureName) override;
|
2021-08-18 15:16:57 -04:00
|
|
|
virtual void InitResources() override;
|
|
|
|
|
|
2021-06-08 10:52:31 -04:00
|
|
|
virtual bool IsPlayable() const override;
|
|
|
|
|
virtual bool SupportsSubtitles() const override;
|
2022-01-18 18:05:56 -05:00
|
|
|
virtual float GetDuration() const override;
|
2021-12-10 20:37:31 -05:00
|
|
|
virtual bool ImplementsParameterInterface(Audio::FParameterInterfacePtr InInterface) const override;
|
2021-06-08 10:52:31 -04:00
|
|
|
virtual ISoundGeneratorPtr CreateSoundGenerator(const FSoundGeneratorInitParams& InParams) override;
|
2021-08-30 14:08:45 -04:00
|
|
|
virtual TUniquePtr<Audio::IParameterTransmitter> CreateParameterTransmitter(Audio::FParameterTransmitterInitParams&& InParams) const override;
|
|
|
|
|
virtual bool IsParameterValid(const FAudioParameter& InParameter) const override;
|
2022-01-18 18:05:56 -05:00
|
|
|
virtual bool IsLooping() const override;
|
|
|
|
|
virtual bool IsOneShot() const override;
|
2022-03-04 03:24:13 -05:00
|
|
|
virtual bool EnableSubmixSendsOnPreview() const override { return true; }
|
2020-12-14 15:48:27 -04:00
|
|
|
protected:
|
2021-11-18 19:26:47 -05:00
|
|
|
/** Gets all the default parameters for this Asset. */
|
|
|
|
|
virtual bool GetAllDefaultParameters(TArray<FAudioParameter>& OutParameters) const override;
|
|
|
|
|
|
2021-08-18 15:16:57 -04:00
|
|
|
virtual void SetReferencedAssetClassKeys(TSet<Metasound::Frontend::FNodeRegistryKey>&& InKeys) override;
|
|
|
|
|
|
2021-11-18 14:37:34 -05:00
|
|
|
bool IsParameterValid(const FAudioParameter& InParameter, const TMap<FName, FName>& InInputNameTypePairs) const;
|
|
|
|
|
|
2021-05-10 19:52:56 -04:00
|
|
|
Metasound::Frontend::FDocumentAccessPtr GetDocument() override
|
2020-12-14 15:48:27 -04:00
|
|
|
{
|
2021-05-10 19:52:56 -04:00
|
|
|
using namespace Metasound::Frontend;
|
2020-12-14 15:48:27 -04:00
|
|
|
// Return document using FAccessPoint to inform the TAccessPtr when the
|
|
|
|
|
// object is no longer valid.
|
2021-05-10 19:52:56 -04:00
|
|
|
return MakeAccessPtr<FDocumentAccessPtr>(RootMetasoundDocument.AccessPoint, RootMetasoundDocument);
|
2020-12-14 15:48:27 -04:00
|
|
|
}
|
|
|
|
|
|
2021-05-10 19:52:56 -04:00
|
|
|
Metasound::Frontend::FConstDocumentAccessPtr GetDocument() const override
|
2020-12-14 15:48:27 -04:00
|
|
|
{
|
2021-05-10 19:52:56 -04:00
|
|
|
using namespace Metasound::Frontend;
|
2020-12-14 15:48:27 -04:00
|
|
|
// Return document using FAccessPoint to inform the TAccessPtr when the
|
|
|
|
|
// object is no longer valid.
|
2021-05-10 19:52:56 -04:00
|
|
|
return MakeAccessPtr<FConstDocumentAccessPtr>(RootMetasoundDocument.AccessPoint, RootMetasoundDocument);
|
2020-12-14 15:48:27 -04:00
|
|
|
}
|
2020-07-23 20:32:26 -04:00
|
|
|
|
|
|
|
|
private:
|
2021-02-16 01:26:50 -04:00
|
|
|
Metasound::FOperatorSettings GetOperatorSettings(Metasound::FSampleRate InSampleRate) const;
|
2021-07-28 17:12:57 -04:00
|
|
|
Metasound::FMetasoundEnvironment CreateEnvironment() const;
|
|
|
|
|
Metasound::FMetasoundEnvironment CreateEnvironment(const FSoundGeneratorInitParams& InParams) const;
|
2021-08-30 14:08:45 -04:00
|
|
|
Metasound::FMetasoundEnvironment CreateEnvironment(const Audio::FParameterTransmitterInitParams& InParams) const;
|
2021-09-13 14:14:37 -04:00
|
|
|
const TArray<Metasound::FVertexName>& GetAudioOutputVertexKeys() const;
|
2020-11-17 17:52:08 -04:00
|
|
|
};
|