2025-04-09 02:35:22 +09:00

491 lines
14 KiB
C++

// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2025.
#pragma once
#include "UObject/Class.h"
#include "Engine/EngineTypes.h"
#include "GenericPlatform/GenericPlatform.h"
#include "fmod_common.h"
#include "FMODSettings.generated.h"
class Paths;
UENUM()
enum EFMODLogging
{
LEVEL_NONE = 0,
LEVEL_ERROR = 1,
LEVEL_WARNING = 2,
LEVEL_LOG = 4
};
UENUM()
namespace EFMODSpeakerMode
{
enum Type
{
// The speakers are stereo
Stereo,
// 5.1 speaker setup
Surround_5_1,
// 7.1 speaker setup
Surround_7_1,
// 7.1.4 speaker setup
Surround_7_1_4
};
}
UENUM()
namespace EFMODOutput
{
enum Type
{
/** Picks the best output mode for the platform.This is the default. */
TYPE_AUTODETECT,
/** All - Perform all mixing but discard the final output. */
TYPE_NOSOUND,
/** Win / UWP / Xbox One / Game Core - Windows Audio Session API. (Default on Windows, Xbox One, Game Core and UWP) */
TYPE_WASAPI,
/** Win - Low latency ASIO 2.0. */
TYPE_ASIO,
/** Linux - Pulse Audio. (Default on Linux if available) */
TYPE_PULSEAUDIO,
/** Linux - Advanced Linux Sound Architecture. (Default on Linux if PulseAudio isn't available) */
TYPE_ALSA,
/** Mac / iOS - Core Audio. (Default on Mac and iOS) */
TYPE_COREAUDIO,
/** Android - Java Audio Track. (Default on Android 2.2 and below) */
TYPE_AUDIOTRACK,
/** Android - OpenSL ES. (Default on Android 2.3 up to 7.1) */
TYPE_OPENSL,
/** PS4 / PS5 - Audio Out. (Default on PS4, PS5) */
TYPE_AUDIOOUT,
/** PS4 - Audio3D. */
TYPE_AUDIO3D,
/** Switch - nn::audio. (Default on Switch) */
TYPE_NNAUDIO,
/** Win10 / Xbox One / Game Core - Windows Sonic. */
TYPE_WINSONIC,
/** Android - AAudio. (Default on Android 8.1 and above) */
TYPE_AAUDIO,
};
}
UENUM()
namespace EFMODPlatforms
{
enum Type
{
Windows,
Linux,
Mac,
Android,
IOS,
PS4,
PS5,
Deprecated,
Switch,
XboxOne,
XSX,
Editor
};
}
UENUM()
namespace EFMODCodec
{
enum Type
{
VORBIS,
FADPCM,
OPUS,
XMA,
AT9,
};
}
USTRUCT()
struct FFMODPlatformSettings
{
GENERATED_USTRUCT_BODY()
// Real Channel Count
UPROPERTY(config, EditAnywhere, Category = PlatformSettings, meta = (ClampMin = "0"))
int32 RealChannelCount;
/**
* Sample rate to use, or 0 to match system rate.
* eg. 0, 22050, 24000, 32000, 44100, 48000.
*/
UPROPERTY(config, EditAnywhere, Category = PlatformSettings, meta = (ClampMin = "0"))
int32 SampleRate;
/**
* Project Output Format, should match the mode set up for the Studio project.
*/
UPROPERTY(config, EditAnywhere, Category = PlatformSettings)
TEnumAsByte<EFMODSpeakerMode::Type> SpeakerMode;
/**
* Built-in output types that can be used to run the mixer.
*/
UPROPERTY(config, EditAnywhere, Category = PlatformSettings)
TEnumAsByte<EFMODOutput::Type> OutputType;
/**
* Use specified memory pool size, units in bytes. Disabled by default.
* FMOD may become unstable if the limit is exceeded!
*/
UPROPERTY(config, EditAnywhere, Category = PlatformSettings, meta = (ClampMin = "0", DisplayName = "Memory Pool Size"))
int32 CustomPoolSize;
/* Codecs
*/
UPROPERTY(config, EditAnywhere, Category = PlatformSettings, meta = (ClampMin = "0"))
TMap<TEnumAsByte<EFMODCodec::Type>, int32> Codecs;
FFMODPlatformSettings()
: RealChannelCount(64)
, SampleRate(0)
, SpeakerMode(EFMODSpeakerMode::Surround_5_1)
, OutputType(EFMODOutput::TYPE_AUTODETECT)
, CustomPoolSize(0)
{}
};
USTRUCT()
struct FFMODProjectLocale
{
GENERATED_USTRUCT_BODY()
/**
* Human readable locale name, displayed in Blueprints.
*/
UPROPERTY(config, EditAnywhere, Category = Localization)
FString LocaleName;
/**
* Locale code. Must correspond to project locale codes in FMOD Studio project.
*/
UPROPERTY(config, EditAnywhere, Category = Localization)
FString LocaleCode;
/**
* Default locale at startup. Only one locale should be marked as default.
*/
UPROPERTY(config, EditAnywhere, Category = Localization)
bool bDefault;
FFMODProjectLocale()
: bDefault(false)
{}
};
UCLASS(config = Engine, defaultconfig)
class FMODSTUDIO_API UFMODSettings : public UObject
{
GENERATED_UCLASS_BODY()
friend class SSettingsMessage;
friend class FFMODStudioEditorModule;
friend class FFMODAssetTable;
friend class FFMODStudioModule;
friend class FFMODAssetBuilder;
friend class UFMODGenerateAssetsCommandlet;
public:
/**
* Whether to load all banks at startup.
*/
UPROPERTY(config, EditAnywhere, Category = Basic)
bool bLoadAllBanks;
/**
* Whether to load all bank sample data into memory at startup.
*/
UPROPERTY(config, EditAnywhere, Category = Basic)
bool bLoadAllSampleData;
/**
* Enable live update in non-final builds.
*/
UPROPERTY(config, EditAnywhere, Category = Basic)
bool bEnableLiveUpdate;
/**
* Enable live update in Editor for Auditioning. *Requires Restart*
*/
UPROPERTY(Config, EditAnywhere, Category = Basic, meta = (ConfigRestartRequired = true))
bool bEnableEditorLiveUpdate;
/**
* Path to find your studio bank output directory, relative to Content directory.
*/
UPROPERTY(config, EditAnywhere, Category = Basic, meta = (RelativeToGameContentDir))
FDirectoryPath BankOutputDirectory;
/** Project Output Format, should match the mode set up for the Studio project. */
UPROPERTY(config, EditAnywhere, Category = Basic)
TEnumAsByte<EFMODSpeakerMode::Type> OutputFormat;
/**
* Built-in output types that can be used to run the mixer.
*/
UPROPERTY(config, EditAnywhere, Category = Basic)
TEnumAsByte<EFMODOutput::Type> OutputType;
/**
* Locales for localized banks. These should match the project locales configured in the FMOD Studio project.
*/
UPROPERTY(config, EditAnywhere, Category = Localization)
TArray<FFMODProjectLocale> Locales;
/**
* The signal level at which channels are virtualized. Virtual channels are processed, but do not produce any output.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
float Vol0VirtualLevel;
/**
* Sample rate to use, or 0 to match system rate.
* eg. 0, 22050, 24000, 32000, 44100, 48000.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
int32 SampleRate;
/**
* Whether to match hardware sample rate where reasonable (44.1kHz to 48kHz).
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
bool bMatchHardwareSampleRate;
/**
* Number of actual software voices that can be used at once.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
int32 RealChannelCount;
/**
* Total number of voices available that can be either real or virtual.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
int32 TotalChannelCount;
/**
* DSP mixer buffer length (eg. 512, 1024) or 0 for system default.
* When changing the Buffer Length, Buffer Count also needs to be set.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
int32 DSPBufferLength;
/**
* DSP mixer buffer count (eg. 2, 4) or 0 for system default.
* When changing the Buffer Count, Buffer Length also needs to be set.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
int32 DSPBufferCount;
/**
* File buffer size in bytes (2048 by default).
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
int32 FileBufferSize;
/**
* Studio update period in milliseconds, or 0 for default (which means 20ms).
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
int32 StudioUpdatePeriod;
/**
* Output device to choose at system start up, or empty for default.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
FString InitialOutputDriverName;
/**
* Lock all mixer buses at startup, making sure they are created up front.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
bool bLockAllBuses;
/**
* Use specified memory pool size for platform, units in bytes. Disabled by default.
* FMOD may become unstable if the limit is exceeded!
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = "0"))
int32 MemoryPoolSize;
/**
* Codecs
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = "0"))
TMap<TEnumAsByte<EFMODCodec::Type>, int32> Codecs;
/**
* Live update port to use, or 0 for default.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced, meta = (EditCondition = "bEnableLiveUpdate"))
int32 LiveUpdatePort;
/**
* Live update port to use while in editor for auditioning. *Requires Restart*
*/
UPROPERTY(config, EditAnywhere, Category = Advanced, meta = (EditCondition = "bEnableEditorLiveUpdate", ConfigRestartRequired = true))
int32 EditorLiveUpdatePort;
/**
* Delay in seconds before automatically reloading modified banks from disk. This can be extended if building
* banks takes a long time and UE4 tries to reload banks before building is completed.
* Set to 0 to disable automatic bank reloading.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
int32 ReloadBanksDelay;
/**
* Will log internal API errors when enabled.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced, meta = (DisplayName = "Enable API Error Logging"))
bool bEnableAPIErrorLogging;
/**
* Enable memory tracking.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
bool bEnableMemoryTracking;
/**
* Extra plugin files to load.
* The plugin files should sit alongside the FMOD dynamic libraries in the ThirdParty directory.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
TArray<FString> PluginFiles;
/**
* Directory for content to appear in content window. Be careful changing this!
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString ContentBrowserPrefix;
/**
* Force platform directory name, or leave empty for automatic (Desktop/Mobile/PS4/XBoxOne)
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString ForcePlatformName;
/**
* Name of master bank. The default in Studio is "Master Bank".
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString MasterBankName;
/**
* Skip bank files of the given name.
* Can be used to load all banks except for a certain set, such as localization banks.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString SkipLoadBankName;
/*
* Specify the key for loading sounds from encrypted banks.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced, meta = (DisplayName = "Encryption Key"))
FString StudioBankKey;
/**
* Force wav writer output, for debugging only. Setting this will prevent normal sound output!
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString WavWriterPath;
/*
* Specify the logging level to use in a debug/development build.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
TEnumAsByte<EFMODLogging> LoggingLevel;
/**
* Name of the parameter used in Studio to control Occlusion effects.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString OcclusionParameter;
/**
* Name of the parameter used in Studio to control Ambient volume.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString AmbientVolumeParameter;
/**
* Name of the parameter used in Studio to control Ambient LPF effects.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced)
FString AmbientLPFParameter;
/**
* Enables/Disables the FMODAudioLink modules.
*/
UPROPERTY(config, EditAnywhere, Category = Advanced, meta = (ConfigRestartRequired=true))
bool bFMODAudioLinkEnabled;
/*
* Used to specify platform specific settings.
*/
UPROPERTY(config, EditAnywhere, Category = PlatformSettings)
TMap<TEnumAsByte<EFMODPlatforms::Type>, FFMODPlatformSettings> Platforms;
private:
/** Is the bank path set up . */
bool IsBankPathSet() const { return !BankOutputDirectory.Path.IsEmpty(); }
/** Get the full bank path. Uses the game's content directory as a base. */
FString GetFullBankPath() const;
/** Get the master bank filename. */
FString GetMasterBankFilename() const;
/** Get the master assets bank filename. */
FString GetMasterAssetsBankFilename() const;
/** Get the master strings bank filename. */
FString GetMasterStringsBankFilename() const;
/** Get the speaker mode for the current platform. */
EFMODSpeakerMode::Type GetSpeakerMode() const;
/** Get the output type for the current platform. */
EFMODOutput::Type GetOutputType() const;
/** Get the sample rate for the current platform. */
FString GetFullContentPath() const;
/** Get the sample rate for the current platform. */
int32 GetSampleRate() const;
/** Get the custom memory pool size for the current platform. */
int32 GetMemoryPoolSize() const;
/** Get the real channel count for the current platform. */
int32 GetRealChannelCount() const;
/** Set the maximum codecs for the current platform. */
TMap<TEnumAsByte<EFMODCodec::Type>, int32> GetCodecs() const;
/** List of generated folder names that contain FMOD uassets. */
TArray<FString> GeneratedFolders = {
TEXT("Banks"),
TEXT("Buses"),
TEXT("Events"),
TEXT("Reverbs"),
TEXT("Snapshots"),
TEXT("VCAs")
};
#if WITH_EDITOR
/** Get the path desktop banks. */
FString GetDesktopBankPath() const;
/** Check the settings for any configuration issues. */
enum EProblem
{
Okay,
BankPathNotSet,
PackagingSettingsBad
};
EProblem Check() const;
virtual void PostEditChangeProperty(FPropertyChangedEvent& e) override;
#endif // WITH_EDITOR
};