fixed issue

This commit is contained in:
Ji Yoon Rhee
2024-02-10 17:06:19 -05:00
parent b045551102
commit 2c8481bd61
647 changed files with 97393 additions and 6970 deletions

View File

@ -0,0 +1,26 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAudioComponent.h"
#include "FMODAmbientSound.generated.h"
/** FMOD Ambient Sound.
*/
UCLASS(AutoExpandCategories = Audio, ClassGroup = Sounds, hidecategories(Collision, Input))
class FMODSTUDIO_API AFMODAmbientSound : public AActor
{
GENERATED_UCLASS_BODY()
public:
/** The Audio component for this actor */
UPROPERTY(Category = Sound, VisibleAnywhere, BlueprintReadOnly, meta = (ExposeFunctionCategories = "Sound"))
UFMODAudioComponent *AudioComponent;
// Begin AActor interface.
#if WITH_EDITOR
virtual void CheckForErrors() override;
virtual bool GetReferencedContentObjects(TArray<UObject *> &Objects) const override;
#endif
// End AActor interface.
};

View File

@ -0,0 +1,31 @@
#pragma once
#include "Animation/AnimNotifies/AnimNotify.h"
#include "FMODEvent.h"
#include "FMODAnimNotifyPlay.generated.h"
UCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = "Play FMOD Event"))
class FMODSTUDIO_API UFMODAnimNotifyPlay : public UAnimNotify
{
GENERATED_BODY()
public:
UFMODAnimNotifyPlay();
// Begin UAnimNotify interface
virtual void Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq) override;
virtual FString GetNotifyName_Implementation() const override;
// End UAnimNotify interface
// If this sound should follow its owner
UPROPERTY(EditAnywhere, Category = "FMOD Anim Notify")
uint32 bFollow : 1;
// Socket or bone name to attach sound to
UPROPERTY(EditAnywhere, Category = "FMOD Anim Notify", meta = (EditCondition = "bFollow"))
FString AttachName;
// Sound to Play
UPROPERTY(EditAnywhere, Category = "FMOD Anim Notify", BlueprintReadWrite)
class UFMODEvent* Event;
};

View File

@ -0,0 +1,29 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "Misc/Guid.h"
#include "CoreMinimal.h"
#include "FMODAsset.generated.h"
/**
* FMOD Asset.
*/
UCLASS(BlueprintType)
class FMODSTUDIO_API UFMODAsset : public UObject
{
GENERATED_UCLASS_BODY()
public:
/** The unique Guid, which matches the one exported from FMOD Studio */
UPROPERTY()
FGuid AssetGuid;
protected:
/** Get tags to show in content view */
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;
private:
/** Non default instances of UFMODAsset are assets */
virtual bool IsAsset() const override;
};

View File

@ -0,0 +1,425 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "Containers/Map.h"
#include "Runtime/Launch/Resources/Version.h"
#include "Sound/SoundAttenuation.h"
#include "AudioDevice.h"
#include "FMODStudioModule.h"
#include "FMODUtils.h"
#include "FMODAudioComponent.generated.h"
// Event property
UENUM()
namespace EFMODEventProperty
{
enum Type
{
/* Priority to set on low-level channels created by this event instance (-1 to 256). */
ChannelPriority,
/** Schedule delay to synchronized playback for multiple tracks in DSP clocks, or -1 for default. */
ScheduleDelay,
/** Schedule look-ahead on the timeline in DSP clocks, or -1 for default. */
ScheduleLookahead,
/** Override the event's 3D minimum distance, or -1 for default. */
MinimumDistance,
/** Override the event's 3D maximum distance, or -1 for default. */
MaximumDistance,
/** Number of options */
Count
};
}
/** Used to store callback info from FMOD thread to our event */
struct FTimelineMarkerProperties
{
FString Name;
int32 Position;
FTimelineMarkerProperties()
: Position(0)
{}
};
/** Used to store callback info from FMOD thread to our event */
struct FTimelineBeatProperties
{
int32 Bar;
int32 Beat;
int32 Position;
float Tempo;
int32 TimeSignatureUpper;
int32 TimeSignatureLower;
FTimelineBeatProperties()
: Bar(0)
, Beat(0)
, Position(0)
, Tempo(0.0f)
, TimeSignatureUpper(0)
, TimeSignatureLower(0)
{}
};
USTRUCT(BlueprintType)
struct FFMODAttenuationDetails
{
GENERATED_USTRUCT_BODY()
/** Should we use Attenuation set in Studio or be able to modify in Editor. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FMOD|Attenuation")
uint32 bOverrideAttenuation : 1;
/** Override the event's 3D minimum distance. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FMOD|Attenuation",
meta = (ClampMin = "0.0", UIMin = "0.0", EditCondition = "bOverrideAttenuation"))
float MinimumDistance;
/** Override the event's 3D maximum distance. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FMOD|Attenuation",
meta = (ClampMin = "0.0", UIMin = "0.0", EditCondition = "bOverrideAttenuation"))
float MaximumDistance;
FFMODAttenuationDetails()
: bOverrideAttenuation(false)
, MinimumDistance(1.0f)
, MaximumDistance(10.0f)
{}
};
USTRUCT(BlueprintType)
struct FFMODOcclusionDetails
{
GENERATED_USTRUCT_BODY()
/** Enable Occlusion Settings. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FMOD|Occlusion")
bool bEnableOcclusion;
/* Which trace channel to use for audio occlusion checks. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FMOD|Occlusion", meta = (EditCondition = "bEnableOcclusion"))
TEnumAsByte<enum ECollisionChannel> OcclusionTraceChannel;
/** Whether or not to enable complex geometry occlusion checks. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FMOD|Occlusion", meta=(EditCondition = "bEnableOcclusion"))
bool bUseComplexCollisionForOcclusion;
FFMODOcclusionDetails()
: bEnableOcclusion(false)
, OcclusionTraceChannel(ECC_Visibility)
, bUseComplexCollisionForOcclusion(false)
{}
};
/** called when an event stops, either because it played to completion or because a Stop() call turned it off early */
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnEventStopped);
/** called when a sound stops */
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSoundStopped);
/** called when we reach a named marker on the timeline */
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnTimelineMarker, FString, Name, int32, Position);
/** called when we reach a beat on the timeline */
DECLARE_DYNAMIC_MULTICAST_DELEGATE_SixParams(
FOnTimelineBeat, int32, Bar, int32, Beat, int32, Position, float, Tempo, int32, TimeSignatureUpper, int32, TimeSignatureLower);
namespace FMOD
{
class DSP;
class Sound;
namespace Studio
{
class EventDescription;
class EventInstance;
}
}
struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES;
struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES;
/**
* Plays FMOD Studio events.
*/
UCLASS(Blueprintable, ClassGroup = (Audio, Common), hidecategories = (Object, ActorComponent, Physics, Rendering, Mobility, LOD),
ShowCategories = Trigger, meta = (BlueprintSpawnableComponent))
class FMODSTUDIO_API UFMODAudioComponent : public USceneComponent
{
GENERATED_UCLASS_BODY()
friend struct FFMODEventControlExecutionToken;
friend FMOD_RESULT F_CALLBACK UFMODAudioComponent_EventCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters);
public:
/** The event asset to use for this sound. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)
UFMODEvent* Event;
/** Event parameter cache. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, SimpleDisplay, Category = FMODAudio)
TMap<FName, float> ParameterCache;
/** Sound name used for programmer sound. Will look up the name in any loaded audio table. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)
FString ProgrammerSoundName;
/** Enable timeline callbacks for this sound, so that OnTimelineMarker and OnTimelineBeat can be used. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)
uint32 bEnableTimelineCallbacks : 1;
/** Auto destroy this component on completion. */
UPROPERTY()
uint32 bAutoDestroy : 1;
/** Stop sound when owner is destroyed. */
UPROPERTY()
uint32 bStopWhenOwnerDestroyed : 1;
/** Whether we apply gain and low-pass based on audio zones. */
uint32 bApplyAmbientVolumes : 1;
/** Whether we apply gain and low-pass based on occlusion onto a parameter. */
uint32 bApplyOcclusionParameter:1;
/** Called when an event stops, either because it played to completion or because a Stop() call turned it off early. */
UPROPERTY(BlueprintAssignable)
FOnEventStopped OnEventStopped;
/** Called when a sound stops. */
UPROPERTY(BlueprintAssignable)
FOnSoundStopped OnSoundStopped;
/** Called when we reach a named marker (if bEnableTimelineCallbacks is true). */
UPROPERTY(BlueprintAssignable)
FOnTimelineMarker OnTimelineMarker;
/** Called when we reach a beat of a tempo (if bEnableTimelineCallbacks is true). */
UPROPERTY(BlueprintAssignable)
FOnTimelineBeat OnTimelineBeat;
/** New Event to be used by the FMODAudioComponent. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetEvent(UFMODEvent *NewEvent);
/** Start a sound playing on an audio component. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void Play();
/** Stop an audio component playing its sound cue, issue any delegates if needed. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void Stop();
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void Release();
/** Allow an event to continue past a sustain point. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void KeyOff();
/** Return true if this component is currently playing an event. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
bool IsPlaying();
/** Sets the volume level. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetVolume(float volume);
/** Sets the pitch multiplier. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetPitch(float pitch);
/** Pause/Unpause an audio component. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetPaused(bool paused);
/** Set a parameter of the Event. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetParameter(FName Name, float Value);
/** Will be deprecated in FMOD 2.01, use `GetParameterValue(FName, float, float)` instead.
* Get parameter value from the Event.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
float GetParameter(FName Name);
/** Get parameter value from the Event.
* @param Name - Name of parameter
* @param UserValue - Parameter value as set from the public API.
* @param FinalValue - Final combined parameter value.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void GetParameterValue(FName Name, float &UserValue, float &FinalValue);
/** Set a property of the Event. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetProperty(EFMODEventProperty::Type Property, float Value);
/** Get a property of the Event. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
float GetProperty(EFMODEventProperty::Type Property);
/** Get the event length in milliseconds. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
int32 GetLength() const;
/** Set the timeline position in milliseconds. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetTimelinePosition(int32 Time);
/** Get the timeline position in milliseconds. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
int32 GetTimelinePosition();
/** Set the sound name to use for programmer sound. Will look up the name in any loaded audio table. */
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Components")
void SetProgrammerSoundName(FString Value);
/** Set a programmer sound to use for this audio component. Lifetime of sound must exceed that of the audio component. */
void SetProgrammerSound(FMOD::Sound *Sound);
/** FMOD Custom Attenuation Details. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)
struct FFMODAttenuationDetails AttenuationDetails;
/** FMOD Custom Occlusion Details. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)
struct FFMODOcclusionDetails OcclusionDetails;
/** Actual Studio instance handle. */
FMOD::Studio::EventInstance *StudioInstance;
// Begin UObject interface.
#if WITH_EDITOR
virtual void PostEditChangeProperty(FPropertyChangedEvent &e) override;
#endif // WITH_EDITOR
virtual void PostLoad() override;
// End UObject interface.
// Begin USceneComponent Interface
virtual void Activate(bool bReset = false) override;
virtual void Deactivate() override;
// End USceneComponent Interface
protected:
// Begin UObject interface.
virtual void OnUpdateTransform(EUpdateTransformFlags UpdateTransformFlags, ETeleportType Teleport = ETeleportType::None) override;
// End UObject interface.
// Begin USceneComponent Interface
virtual FString GetDetailedInfoInternal() const override;
// End USceneComponent Interface
private:
bool bDefaultParameterValuesCached;
/** Stored properties to apply next time we create an instance. */
float StoredProperties[EFMODEventProperty::Count];
/** Internal play function which can play events in the editor. */
void PlayInternal(EFMODSystemContext::Type Context, bool bReset = false);
/** Cache default event parameter values. */
void CacheDefaultParameterValues();
/** Check that only player driven parameters are added to the cache. */
void UpdateCachedParameterValues();
/** Update gain and low-pass based on interior volumes. */
void UpdateInteriorVolumes();
/** Update attenuation if we have it set. */
void UpdateAttenuation();
/** Apply Volume and LPF into event. */
void ApplyVolumeLPF();
/** Timeline Marker callback. */
void EventCallbackAddMarker(struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES *props);
/** Timeline Beat callback. */
void EventCallbackAddBeat(struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES *props);
/** Programmer Sound Create callback. */
void EventCallbackCreateProgrammerSound(struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *props);
/** Programmer Sound Destroy callback. */
void EventCallbackDestroyProgrammerSound(struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *props);
/** Called when the event has finished stopping. */
void OnPlaybackCompleted();
void EventCallbackSoundStopped();
bool TriggerSoundStoppedDelegate;
// Begin ActorComponent interface.
/** Called when a component is registered, after Scene is set, but before CreateRenderState_Concurrent or OnCreatePhysicsState are called. */
virtual void OnRegister() override;
/** Called when a component is unregistered. Called after DestroyRenderState_Concurrent and OnDestroyPhysicsState are called. */
virtual void OnUnregister() override;
/** Overridable function called whenever this actor is being removed from a level. */
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
/** Function called every frame on this ActorComponent. Only executes if the component is registered, and also PrimaryComponentTick.bCanEverTick must be set to true. */
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;
// End ActorComponent interface.
#if WITH_EDITORONLY_DATA
void UpdateSpriteTexture();
#endif
/** Release any cached parameters then the Studio Instance. */
void ReleaseEventCache();
/** Release the Studio Instance. */
void ReleaseEventInstance();
/** Check if a parameter is game controlled or automated to determine if it should be cached. */
bool ShouldCacheParameter(const FMOD_STUDIO_PARAMETER_DESCRIPTION& ParameterDescription);
/** Return a cached reference to the current IFMODStudioModule.*/
IFMODStudioModule& GetStudioModule()
{
if (Module == nullptr)
{
Module = &IFMODStudioModule::Get();
}
return *Module;
}
/** Stored reference to the current IFMODStudioModule. */
IFMODStudioModule* Module;
// Settings for ambient volume effects.
/** Timer used for volumes fading in and out. Used for automating volume and/or LPF with Ambient Zones. */
double InteriorLastUpdateTime;
/** Previous interior volume value. Used for automating volume and/or LPF with Ambient Zones. */
float SourceInteriorVolume;
/** Previous interior LPF value. Used for automating volume and/or LPF with Ambient Zones. */
float SourceInteriorLPF;
/** Current interior volume value. Used for automating volume and/or LPF with Ambient Zones. */
float CurrentInteriorVolume;
/** Current interior LPF value. Used for automating volume and/or LPF with Ambient Zones. */
float CurrentInteriorLPF;
/** Calculated Ambient volume level for that frame. Used for automating volume and/or LPF with Ambient Zones. */
float AmbientVolume;
/** Calculated Ambient LPF level for that frame. Used for automating volume and/or LPF with Ambient Zones. */
float AmbientLPF;
/** Previously set Volume value. Used for automating volume and/or LPF with Ambient Zones. */
float LastVolume;
/** Previously set LPF value. Used for automating volume and/or LPF with Ambient Zones. */
float LastLPF;
/** Was the object occluded in the previous frame. */
bool wasOccluded;
/** Stored ID of the Occlusion parameter of the Event (if applicable). */
FMOD_STUDIO_PARAMETER_ID OcclusionID;
/** Stored ID of the Volume parameter of the Event (if applicable). */
FMOD_STUDIO_PARAMETER_ID AmbientVolumeID;
/** Stored ID of the LPF parameter of the Event (if applicable). */
FMOD_STUDIO_PARAMETER_ID AmbientLPFID;
// Tempo and marker callbacks.
/** A scope lock used specifically for callbacks. */
FCriticalSection CallbackLock;
/** Stores the Timeline Markers as they are triggered. */
TArray<FTimelineMarkerProperties> CallbackMarkerQueue;
/** Stores the Timeline Beats as they are triggered. */
TArray<FTimelineBeatProperties> CallbackBeatQueue;
/** Direct assignment of programmer sound from other C++ code. */
FMOD::Sound *ProgrammerSound;
bool NeedDestroyProgrammerSoundCallback;
/** The length of the current Event in milliseconds. */
int32 EventLength;
};

View File

@ -0,0 +1,22 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAsset.h"
#include "FMODBank.generated.h"
/**
* FMOD Bank Asset.
*/
UCLASS()
class FMODSTUDIO_API UFMODBank : public UFMODAsset
{
GENERATED_UCLASS_BODY()
private:
/** Get tags to show in content view */
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;
/** Descriptive name */
virtual FString GetDesc() override;
};

View File

@ -0,0 +1,322 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAudioComponent.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Containers/UnrealString.h"
#include "FMODBlueprintStatics.generated.h"
class UFMODAudioComponent;
namespace FMOD
{
namespace Studio
{
class EventDescription;
class EventInstance;
}
}
class UFMODAsset;
class UFMODEvent;
class USceneComponent;
USTRUCT(BlueprintType)
struct FFMODEventInstance
{
GENERATED_USTRUCT_BODY()
FMOD::Studio::EventInstance *Instance;
};
UENUM(BlueprintType)
enum EFMOD_STUDIO_STOP_MODE
{
ALLOWFADEOUT,
IMMEDIATE
};
UCLASS()
class FMODSTUDIO_API UFMODBlueprintStatics : public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()
/** Plays an event. This returns an FMOD Event Instance. The sound does not travel with any actor.
* @param Event - event to play
* @param bAutoPlay - Start the event automatically.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD",
meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject", AdvancedDisplay = "2", bAutoPlay = "true",
UnsafeDuringActorConstruction = "true"))
static FFMODEventInstance PlayEvent2D(UObject *WorldContextObject, UFMODEvent *Event, bool bAutoPlay);
/** Plays an event at the given location. This returns an FMOD Event Instance. The sound does not travel with any actor.
* @param Event - event to play
* @param Location - World position to play event at
* @param bAutoPlay - Start the event automatically.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD",
meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject", AdvancedDisplay = "2", bAutoPlay = "true",
UnsafeDuringActorConstruction = "true"))
static FFMODEventInstance PlayEventAtLocation(UObject *WorldContextObject, UFMODEvent *Event, const FTransform &Location, bool bAutoPlay);
/** Plays an event attached to and following the specified component.
* @param Event - event to play
* @param AttachComponent - Component to attach to.
* @param AttachPointName - Optional named point within the AttachComponent to play the sound at
* @param Location - Depending on the value of Location Type this is either a relative offset from the attach component/point or an absolute world position that will be translated to a relative offset
* @param LocationType - Specifies whether Location is a relative offset or an absolute world position
* @param bStopWhenAttachedToDestroyed - Specifies whether the sound should stop playing when the owner of the attach to component is destroyed.
* @param bAutoPlay - Start the event automatically.
* @param bAutoDestroy - Automatically destroy the audio component when the sound is stopped.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD",
meta = (AdvancedDisplay = "2", UnsafeDuringActorConstruction = "true", bAutoPlay = "true", bAutoDestroy = "true"))
static class UFMODAudioComponent *PlayEventAttached(UFMODEvent *Event, USceneComponent *AttachToComponent, FName AttachPointName,
FVector Location, EAttachLocation::Type LocationType, bool bStopWhenAttachedToDestroyed, bool bAutoPlay, bool bAutoDestroy);
/** Find an asset by name.
* @param EventName - The asset name
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static UFMODAsset *FindAssetByName(const FString &Name);
/** Find an event by name.
* @param EventName - The event name
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static UFMODEvent *FindEventByName(const FString &Name);
/** Loads a bank.
* @param Bank - bank to load
* @param bBlocking - determines whether the bank will load synchronously
* @param bLoadSampleData - determines whether sample data will be preloaded immediately
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true", bBlocking = "true"))
static void LoadBank(class UFMODBank *Bank, bool bBlocking, bool bLoadSampleData);
/** Unloads a bank.
* @param Bank - bank to unload
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true"))
static void UnloadBank(class UFMODBank *Bank);
/** Returns true if a bank is loaded.
* @param Bank - bank to query
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true"))
static bool IsBankLoaded(class UFMODBank *Bank);
/** Load bank sample data.
* @param Bank - bank to load sample data from
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true"))
static void LoadBankSampleData(class UFMODBank *Bank);
/** Unload bank sample data.
* @param Bank - bank to unload sample data from
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true"))
static void UnloadBankSampleData(class UFMODBank *Bank);
/** Load event sample data. This can be done ahead of time to avoid loading stalls.
* @param Event - event to load sample data from.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD",
meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject", UnsafeDuringActorConstruction = "true"))
static void LoadEventSampleData(UObject *WorldContextObject, UFMODEvent *Event);
/** Unload event sample data.
* @param Event - event to load sample data from.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD",
meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject", UnsafeDuringActorConstruction = "true"))
static void UnloadEventSampleData(UObject *WorldContextObject, UFMODEvent *Event);
/** Return a list of all event instances that are playing for this event.
Be careful using this function because it is possible to find and alter any playing sound, even ones owned by other audio components.
* @param Event - event to find instances from.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD",
meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject", UnsafeDuringActorConstruction = "true"))
static TArray<FFMODEventInstance> FindEventInstances(UObject *WorldContextObject, UFMODEvent *Event);
/** Set volume on a bus
* @param Bus - bus to use
* @param Volume - volume
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Bus", meta = (UnsafeDuringActorConstruction = "true"))
static void BusSetVolume(class UFMODBus *Bus, float Volume);
/** Pause/Unpause all events going through this bus
* @param Bus - bus to use
* @param bPaused - paused
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Bus", meta = (UnsafeDuringActorConstruction = "true"))
static void BusSetPaused(class UFMODBus *Bus, bool bPaused);
/** Mute/Unmute this bus
* @param Bus - bus to use
* @param bMute - mute
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Bus", meta = (UnsafeDuringActorConstruction = "true"))
static void BusSetMute(class UFMODBus *Bus, bool bMute);
/** Stops all EventInstances routed into the bus
* @param Bus - bus to use
* @param stopMode - desired stop mode
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|Bus", meta = (UnsafeDuringActorConstruction = "true"))
static void BusStopAllEvents(class UFMODBus *Bus, EFMOD_STUDIO_STOP_MODE stopMode);
/** Set volume on a VCA
* @param Vca - VCA to use
* @param Volume - volume
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|VCA", meta = (UnsafeDuringActorConstruction = "true"))
static void VCASetVolume(class UFMODVCA *Vca, float Volume);
/** Set a global parameter from the System.
* @param Name - Name of parameter
* @param Value - Value of parameter
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true"))
static void SetGlobalParameterByName(FName Name, float Value);
/** Will be deprecated in FMOD 2.01, use `GetGlobalParameterValueByName(FName, float, float)` instead.
* Get a global parameter from the System.
* @param Name - Name of parameter
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true"))
static float GetGlobalParameterByName(FName Name);
/** Get a global parameter from the System.
* @param Name - Name of parameter
* @param UserValue - Parameter value as set from the public API.
* @param FinalValue - Final combined parameter value.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD", meta = (UnsafeDuringActorConstruction = "true"))
static void GetGlobalParameterValueByName(FName Name, float &UserValue, float &FinalValue);
/** Returns whether this FMOD Event Instance is valid. The instance will be invalidated when the sound stops.
* @param EventInstance - Event instance
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static bool EventInstanceIsValid(FFMODEventInstance EventInstance);
/** Set volume on an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Value - Volume to set
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceSetVolume(FFMODEventInstance EventInstance, float Volume);
/** Set pitch on an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Value - Volume to set
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceSetPitch(FFMODEventInstance EventInstance, float Pitch);
/** Pause/Unpause an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Paused - Whether to pause or unpause
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceSetPaused(FFMODEventInstance EventInstance, bool Paused);
/** Set a parameter on an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Name - Name of parameter
* @param Value - Value of parameter
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceSetParameter(FFMODEventInstance EventInstance, FName Name, float Value);
/** Will be deprecated in FMOD 2.01, use `EventInstanceGetParameterValue(FFMODEventInstance, FName, float, float)` instead.
* Get a parameter on an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Name - Name of parameter
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static float EventInstanceGetParameter(FFMODEventInstance EventInstance, FName Name);
/** Get a parameter on an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Name - Name of parameter
* @param UserValue - Parameter value as set from the public API.
* @param FinalValue - Final combined parameter value.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceGetParameterValue(FFMODEventInstance EventInstance, FName Name, float &UserValue, float &FinalValue);
/** Set an FMOD event property on an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Property - Property to set
* @param Value - Value to set
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceSetProperty(FFMODEventInstance EventInstance, EFMODEventProperty::Type Property, float Value);
/** Plays an FMOD Event Instance.
* @param EventInstance - Event instance
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstancePlay(FFMODEventInstance EventInstance);
/** Stop an FMOD Event Instance.
* @param EventInstance - Event instance
* @param Release - Whether to release the Event Instance
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceStop(FFMODEventInstance EventInstance, bool Release = false);
/** Release an FMOD Event Instance.
* @param EventInstance - Event instance
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceRelease(FFMODEventInstance EventInstance);
/** Allow an FMOD Event Instance to continue past a sustain point.
* @param EventInstance - Event instance
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceKeyOff(FFMODEventInstance EventInstance);
/** Set 3D attributes on a FMOD Event Instance.
* @param EventInstance - Event instance
* @param Location - Location to place event
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD|EventInstance", meta = (UnsafeDuringActorConstruction = "true"))
static void EventInstanceSetTransform(FFMODEventInstance EventInstance, const FTransform &Location);
/** List all output device names.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static TArray<FString> GetOutputDrivers();
/** Set current output device by name or part of the name.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static void SetOutputDriverByName(FString NewDriverName);
/** Set current output device by its index from GetOutputDrivers.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static void SetOutputDriverByIndex(int NewDriverIndex);
/** Suspend the FMOD mixer. Used when suspending the application.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static void MixerSuspend();
/** Resume the FMOD mixer. Used when resuming the application.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static void MixerResume();
/** Set the active locale for subsequent bank loads.
*/
UFUNCTION(BlueprintCallable, Category = "Audio|FMOD")
static void SetLocale(const FString& Locale);
};

View File

@ -0,0 +1,22 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAsset.h"
#include "FMODBus.generated.h"
/**
* FMOD Bus Asset.
*/
UCLASS()
class FMODSTUDIO_API UFMODBus : public UFMODAsset
{
GENERATED_UCLASS_BODY()
private:
/** Get tags to show in content view */
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;
/** Descriptive name */
virtual FString GetDesc() override;
};

View File

@ -0,0 +1,28 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAsset.h"
#include "FMODEvent.generated.h"
struct FMOD_STUDIO_PARAMETER_DESCRIPTION;
/**
* FMOD Event Asset.
*/
UCLASS()
class FMODSTUDIO_API UFMODEvent : public UFMODAsset
{
GENERATED_UCLASS_BODY()
public:
/** Get parameter descriptions for this event */
void GetParameterDescriptions(TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> &Parameters) const;
private:
/** Get tags to show in content view */
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;
/** Descriptive name */
virtual FString GetDesc() override;
};

View File

@ -0,0 +1,22 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAsset.h"
#include "FMODPort.generated.h"
/**
* FMOD Port Asset.
*/
UCLASS()
class FMODSTUDIO_API UFMODPort : public UFMODAsset
{
GENERATED_UCLASS_BODY()
private:
/** Get tags to show in content view */
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;
/** Descriptive name */
virtual FString GetDesc() override;
};

View File

@ -0,0 +1,509 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#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 FCustomPoolSizes
{
GENERATED_USTRUCT_BODY()
/** Default = 0 (Disabled) units in bytes*/
UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = "0"))
int32 Desktop;
/** Default = 0 (Disabled) units in bytes*/
UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = "0"))
int32 Mobile;
/** Default = 0 (Disabled) units in bytes*/
UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = "0"))
int32 PS4;
/** Default = 0 (Disabled) units in bytes*/
UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = "0"))
int32 Switch;
/** Default = 0 (Disabled) units in bytes*/
UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = "0"))
int32 XboxOne;
FCustomPoolSizes()
: Desktop(0)
, Mobile(0)
, PS4(0)
, Switch(0)
, XboxOne(0)
{}
};
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"))
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)
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;
/**
* Whether to enable vol0virtual, which means voices with low volume will automatically go virtual to save CPU.
*/
UPROPERTY(config, EditAnywhere, Category = InitSettings)
bool bVol0Virtual;
/**
* If vol0virtual is enabled, the signal level at which to make channels virtual.
*/
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)
FCustomPoolSizes MemoryPoolSizes;
/**
* 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"))
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;
/*
* 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. */
bool SetCodecs(FMOD_ADVANCEDSETTINGS& advSettings) 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;
#endif // WITH_EDITOR
};

View File

@ -0,0 +1,19 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODEvent.h"
#include "FMODSnapshot.generated.h"
/**
* FMOD Snapshot Asset.
*/
UCLASS()
class FMODSTUDIO_API UFMODSnapshot : public UFMODEvent
{
GENERATED_UCLASS_BODY()
private:
/** Descriptive name */
virtual FString GetDesc() override;
};

View File

@ -0,0 +1,29 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAsset.h"
#include "Sound/ReverbEffect.h"
#include "FMODSnapshotReverb.generated.h"
/**
* FMOD Event Asset.
*/
UCLASS()
class FMODSTUDIO_API UFMODSnapshotReverb : public UReverbEffect
{
GENERATED_UCLASS_BODY()
public:
/** The unique Guid, which matches the one exported from FMOD Studio */
UPROPERTY()
FGuid AssetGuid;
private:
/** Non default instances of UFMODAsset are assets */
virtual bool IsAsset() const override;
#if WITH_EDITORONLY_DATA
virtual void PostEditChangeProperty(FPropertyChangedEvent &PropertyChangedEvent) override;
#endif // EDITORONLY_DATA
};

View File

@ -0,0 +1,22 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODAsset.h"
#include "FMODVCA.generated.h"
/**
* FMOD VCA Asset.
*/
UCLASS()
class FMODSTUDIO_API UFMODVCA : public UFMODAsset
{
GENERATED_UCLASS_BODY()
private:
/** Get tags to show in content view */
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;
/** Descriptive name */
virtual FString GetDesc() override;
};

View File

@ -0,0 +1,259 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
using UnrealBuildTool;
using System;
using System.IO;
using System.Collections.Generic;
namespace UnrealBuildTool.Rules
{
public class FMODStudio : ModuleRules
{
string LibRootDirectory { get { return Path.Combine(ModuleDirectory, @"..\..\Binaries\"); } }
protected virtual string FMODLibDir { get { return null; } }
protected virtual string ConsoleLinkExt { get { return null; } }
protected virtual string ConsoleDllExt { get { return null; } }
protected virtual string ConsoleLibPrefix { get { return null; } }
protected virtual bool ConsoleRuntimeDependencies { get { return true; } }
protected virtual bool ConsoleDelayLoad { get { return false; } }
protected virtual bool LinkDebugFiles { get { return false; } }
protected virtual bool CopyLibs { get { return false; } }
public FMODStudio(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PrivatePCHHeaderFile = "Private/FMODStudioPrivatePCH.h";
bUseUnity = false;
PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Public/FMOD"));
PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, "Classes"));
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"CoreUObject",
"Engine",
"Media",
"Projects"
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"MovieScene",
"MovieSceneTracks"
}
);
if (Target.bBuildEditor == true)
{
PublicDependencyModuleNames.Add("DeveloperToolSettings");
PrivateDependencyModuleNames.Add("AssetRegistry");
PrivateDependencyModuleNames.Add("Settings");
PrivateDependencyModuleNames.Add("UnrealEd");
}
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
}
);
string configName = "";
if (Target.Configuration != UnrealTargetConfiguration.Shipping)
{
configName = "L";
PublicDefinitions.Add("FMODSTUDIO_LINK_LOGGING=1");
}
else
{
configName = "";
PublicDefinitions.Add("FMODSTUDIO_LINK_RELEASE=1");
}
string linkExtension = "";
string dllExtension = "";
string libPrefix = "";
string libPath = FMODLibDir;
bool bAddRuntimeDependencies = true;
bool bAddDelayLoad = false;
bool bLinkDebugFiles = false;
if (libPath == null)
{
string platformName = Target.Platform.ToString();
libPath = System.IO.Path.Combine(LibRootDirectory, platformName);
if (Target.IsInPlatformGroup(UnrealPlatformGroup.Windows))
{
linkExtension = "_vc.lib";
dllExtension = ".dll";
bAddDelayLoad = true;
}
else if (Target.Platform == UnrealTargetPlatform.Mac)
{
linkExtension = dllExtension = ".dylib";
libPrefix = "lib";
libPath = System.IO.Path.Combine(ModuleDirectory, "../../Libs/Mac/");
}
else if (Target.Platform == UnrealTargetPlatform.Android)
{
bAddRuntimeDependencies = false; // Don't use this system
linkExtension = dllExtension = ".so";
libPrefix = "lib";
}
else if (Target.Platform == UnrealTargetPlatform.IOS)
{
linkExtension = "_iphoneos.a";
libPrefix = "lib";
bAddRuntimeDependencies = false;
}
else if (Target.Platform == UnrealTargetPlatform.TVOS)
{
linkExtension = "_appletvos.a";
libPrefix = "lib";
bAddRuntimeDependencies = false;
}
else if (Target.Platform == UnrealTargetPlatform.Linux)
{
libPath = System.IO.Path.Combine(libPath, "x86_64");
linkExtension = ".so";
dllExtension = ".so";
libPrefix = "lib";
}
}
else
{
linkExtension = ConsoleLinkExt;
dllExtension = ConsoleDllExt;
libPrefix = ConsoleLibPrefix;
bAddRuntimeDependencies = ConsoleRuntimeDependencies;
bAddDelayLoad = ConsoleDelayLoad;
bLinkDebugFiles = LinkDebugFiles;
}
// Collapse the directory path, otherwise MacOS has issues with plugin paths.
libPath = Utils.CleanDirectorySeparators(libPath);
string fmodLibName = System.String.Format("{0}fmod{1}{2}", libPrefix, configName, linkExtension);
string fmodStudioLibName = System.String.Format("{0}fmodstudio{1}{2}", libPrefix, configName, linkExtension);
string fmodDllName = System.String.Format("{0}fmod{1}{2}", libPrefix, configName, dllExtension);
string fmodStudioDllName = System.String.Format("{0}fmodstudio{1}{2}", libPrefix, configName, dllExtension);
string fmodLibPath = System.IO.Path.Combine(libPath, fmodLibName);
string fmodStudioLibPath = System.IO.Path.Combine(libPath, fmodStudioLibName);
string fmodDllPath = System.IO.Path.Combine(libPath, fmodDllName);
string fmodStudioDllPath = System.IO.Path.Combine(libPath, fmodStudioDllName);
System.Collections.Generic.List<string> plugins = GetPlugins(libPath);
if (Target.IsInPlatformGroup(UnrealPlatformGroup.Android))
{
string[] archs = new string[] { "arm64-v8a", "x86_64" };
foreach (string arch in archs)
{
string LibPath = System.IO.Path.Combine(libPath, arch);
PublicAdditionalLibraries.Add(System.String.Format("{0}/{1}", LibPath, fmodLibName));
PublicAdditionalLibraries.Add(System.String.Format("{0}/{1}", LibPath, fmodStudioLibName));
}
}
else
{
PublicAdditionalLibraries.Add(fmodLibPath);
PublicAdditionalLibraries.Add(fmodStudioLibPath);
}
if (CopyLibs)
{
RuntimeDependencies.Add("$(TargetOutputDir)/" + fmodDllName, fmodDllPath);
RuntimeDependencies.Add("$(TargetOutputDir)/" + fmodStudioDllName, fmodStudioDllPath);
foreach (string plugin in plugins)
{
string pluginPath = System.IO.Path.Combine(libPath, plugin + dllExtension);
System.Console.WriteLine("Adding reference to FMOD plugin: " + pluginPath);
RuntimeDependencies.Add("$(TargetOutputDir)/" + plugin + dllExtension, pluginPath);
}
}
else if (bAddRuntimeDependencies)
{
RuntimeDependencies.Add(fmodDllPath);
RuntimeDependencies.Add(fmodStudioDllPath);
foreach (string plugin in plugins)
{
string pluginPath = System.IO.Path.Combine(libPath, plugin + dllExtension);
System.Console.WriteLine("Adding reference to FMOD plugin: " + pluginPath);
RuntimeDependencies.Add(pluginPath);
}
}
if (bLinkDebugFiles)
{
RuntimeDependencies.Add(fmodDllPath + ".debug", StagedFileType.DebugNonUFS);
RuntimeDependencies.Add(fmodStudioDllPath + ".debug", StagedFileType.DebugNonUFS);
}
if (bAddDelayLoad)
{
PublicDelayLoadDLLs.AddRange(
new string[] {
fmodDllName,
fmodStudioDllName
}
);
}
if (Target.Platform == UnrealTargetPlatform.Android)
{
string APLName = System.String.Format("FMODStudio{0}_APL.xml", configName);
string RelAPLPath = Utils.MakePathRelativeTo(System.IO.Path.Combine(ModuleDirectory, APLName), Target.RelativeEnginePath);
System.Console.WriteLine("Adding {0}", RelAPLPath);
AdditionalPropertiesForReceipt.Add("AndroidPlugin", RelAPLPath);
foreach (string PluginName in System.IO.Directory.GetFiles(libPath))
{
if (PluginName.EndsWith("_APL.xml", System.StringComparison.OrdinalIgnoreCase))
{
string RelPluginPath = Utils.MakePathRelativeTo(PluginName, Target.RelativeEnginePath);
System.Console.WriteLine("Adding {0}", RelPluginPath);
AdditionalPropertiesForReceipt.Add("AndroidPlugin", RelPluginPath);
}
}
}
}
private System.Collections.Generic.List<string> GetPlugins(string BasePath)
{
System.Collections.Generic.List<string> AllPlugins = new System.Collections.Generic.List<string>();
string PluginListName = System.IO.Path.Combine(BasePath, "plugins.txt");
if (System.IO.File.Exists(PluginListName))
{
try
{
foreach (string FullEntry in System.IO.File.ReadAllLines(PluginListName))
{
string Entry = FullEntry.Trim();
if (Entry.Length > 0)
{
AllPlugins.Add(Entry);
}
}
}
catch (System.Exception ex)
{
System.Console.WriteLine("Failed to read plugin list file: {0}", ex.Message);
}
}
return AllPlugins;
}
}
}

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!--GearVR plugin additions-->
<root xmlns:android="http://schemas.android.com/apk/res/android">
<!-- init section is always evaluated once per architecture -->
<init>
<log text="FMODStudio APL init (logging build)"/>
<setString result="ConfigSuffix" value="L"/>
</init>
<!-- optional additions to proguard -->
<proguardAdditions>
<insert>
-keep class org.fmod.** {
*;
}
-dontwarn org.fmod.**
</insert>
</proguardAdditions>
<!-- optional files or directories to copy to Intermediate/Android/APK -->
<resourceCopies>
<log text="FMODStudio APL copying files for $S(Architecture)"/>
<copyFile src="$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmod$S(ConfigSuffix).so"
dst="$S(BuildDir)/libs/$S(Architecture)/libfmod$S(ConfigSuffix).so" />
<copyFile src="$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so"
dst="$S(BuildDir)/libs/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so" />
<copyFile src="$S(PluginDir)/../../Binaries/Android/fmod.jar"
dst="$S(BuildDir)/libs/fmod.jar" />
</resourceCopies>
<!-- optional additions to GameActivity onCreate in GameActivity.java -->
<gameActivityOnCreateAdditions>
<insert>
// Initialize FMOD Studio jar file
org.fmod.FMOD.init(this);
</insert>
</gameActivityOnCreateAdditions>
<!-- optional additions to GameActivity onDestroy in GameActivity.java -->
<gameActivityOnDestroyAdditions>
<insert>
// Shutdown FMOD Studio jar file
org.fmod.FMOD.close();
</insert>
</gameActivityOnDestroyAdditions>
<!-- optional libraries to load in GameActivity.java before libUE4.so -->
<soLoadLibrary>
<log text="FMODStudio APL adding loadLibrary references"/>
<loadLibrary name="fmod$S(ConfigSuffix)" failmsg="libfmod$S(ConfigSuffix) not loaded and required!" />
<loadLibrary name="fmodstudio$S(ConfigSuffix)" failmsg="libfmodstudio$S(ConfigSuffix) not loaded and required!" />
</soLoadLibrary>
</root>

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!--GearVR plugin additions-->
<root xmlns:android="http://schemas.android.com/apk/res/android">
<!-- init section is always evaluated once per architecture -->
<init>
<log text="FMODStudio APL init (shipping build)"/>
<setString result="ConfigSuffix" value=""/>
</init>
<!-- optional additions to proguard -->
<proguardAdditions>
<insert>
-keep class org.fmod.** {
*;
}
-dontwarn org.fmod.**
</insert>
</proguardAdditions>
<!-- optional files or directories to copy to Intermediate/Android/APK -->
<resourceCopies>
<log text="FMODStudio APL copying files for $S(Architecture)"/>
<copyFile src="$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmod$S(ConfigSuffix).so"
dst="$S(BuildDir)/libs/$S(Architecture)/libfmod$S(ConfigSuffix).so" />
<copyFile src="$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so"
dst="$S(BuildDir)/libs/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so" />
<copyFile src="$S(PluginDir)/../../Binaries/Android/fmod.jar"
dst="$S(BuildDir)/libs/fmod.jar" />
</resourceCopies>
<!-- optional additions to GameActivity onCreate in GameActivity.java -->
<gameActivityOnCreateAdditions>
<insert>
// Initialize FMOD Studio jar file
org.fmod.FMOD.init(this);
</insert>
</gameActivityOnCreateAdditions>
<!-- optional additions to GameActivity onDestroy in GameActivity.java -->
<gameActivityOnDestroyAdditions>
<insert>
// Shutdown FMOD Studio jar file
org.fmod.FMOD.close();
</insert>
</gameActivityOnDestroyAdditions>
<!-- optional libraries to load in GameActivity.java before libUE4.so -->
<soLoadLibrary>
<log text="FMODStudio APL adding loadLibrary references"/>
<loadLibrary name="fmod$S(ConfigSuffix)" failmsg="libfmod$S(ConfigSuffix) not loaded and required!" />
<loadLibrary name="fmodstudio$S(ConfigSuffix)" failmsg="libfmodstudio$S(ConfigSuffix) not loaded and required!" />
</soLoadLibrary>
</root>

View File

@ -0,0 +1,69 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODAmbientSound.h"
#include "FMODEvent.h"
#include "Logging/MessageLog.h"
#include "Misc/UObjectToken.h"
#include "Misc/MapErrors.h"
#define LOCTEXT_NAMESPACE "FMODAmbientSound"
AFMODAmbientSound::AFMODAmbientSound(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
AudioComponent = ObjectInitializer.CreateDefaultSubobject<UFMODAudioComponent>(this, TEXT("FMODAudioComponent0"));
AudioComponent->bAutoActivate = true;
AudioComponent->bStopWhenOwnerDestroyed = true;
AudioComponent->Mobility = EComponentMobility::Movable;
RootComponent = AudioComponent;
bReplicates = false;
SetHidden(true);
SetCanBeDamaged(true);
}
#if WITH_EDITOR
void AFMODAmbientSound::CheckForErrors(void)
{
Super::CheckForErrors();
if (!AudioComponent)
{
FFormatNamedArguments Arguments;
Arguments.Add(TEXT("ActorName"), FText::FromString(GetName()));
FMessageLog("MapCheck")
.Warning()
->AddToken(FUObjectToken::Create(this))
->AddToken(FTextToken::Create(FText::Format(
LOCTEXT("MapCheck_Message_AudioComponentNull", "{ActorName} : Ambient sound actor has NULL AudioComponent property - please delete"),
Arguments)))
->AddToken(FMapErrorToken::Create(FMapErrors::AudioComponentNull));
}
else if (AudioComponent->Event == NULL)
{
FFormatNamedArguments Arguments;
Arguments.Add(TEXT("ActorName"), FText::FromString(GetName()));
FMessageLog("MapCheck")
.Warning()
->AddToken(FUObjectToken::Create(this))
->AddToken(FTextToken::Create(
FText::Format(LOCTEXT("MapCheck_Message_EventNull", "{ActorName} : Ambient sound actor has NULL Event property"), Arguments)))
->AddToken(FMapErrorToken::Create(FMapErrors::SoundCueNull));
}
}
bool AFMODAmbientSound::GetReferencedContentObjects(TArray<UObject *> &Objects) const
{
if (IsValid(AudioComponent) && AudioComponent->Event)
{
Objects.Add(AudioComponent->Event);
}
return true;
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,46 @@
#include "FMODAnimNotifyPlay.h"
#include "FMODBlueprintStatics.h"
#include "Components/SkeletalMeshComponent.h"
#include "Kismet/KismetSystemLibrary.h"
UFMODAnimNotifyPlay::UFMODAnimNotifyPlay()
: Super()
{
bFollow = false;
Event = nullptr;
#if WITH_EDITORONLY_DATA
NotifyColor = FColor(196, 142, 255, 255);
#endif // WITH_EDITORONLY_DATA
}
void UFMODAnimNotifyPlay::Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq)
{
if (Event)
{
if (bFollow)
{
// Play event attached
UFMODBlueprintStatics::PlayEventAttached(
Event, MeshComp, *AttachName, FVector(0, 0, 0), EAttachLocation::KeepRelativeOffset, false, true, true);
}
else
{
// Play event at location
UFMODBlueprintStatics::PlayEventAtLocation(MeshComp, Event, MeshComp->GetComponentTransform(), true);
}
}
}
FString UFMODAnimNotifyPlay::GetNotifyName_Implementation() const
{
if (Event)
{
return Event->GetName();
}
else
{
return Super::GetNotifyName_Implementation();
}
}

View File

@ -0,0 +1,24 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODAsset.h"
#include "FMODStudioModule.h"
static const TCHAR *FMODAssetTypeStrings[] = { TEXT("Bank"), TEXT("Event"), TEXT("VCA"), TEXT("Bus"), TEXT("Invalid") };
UFMODAsset::UFMODAsset(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
bool UFMODAsset::IsAsset() const
{
return this != GetClass()->GetDefaultObject();
}
/** Get tags to show in content view */
void UFMODAsset::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const
{
Super::GetAssetRegistryTags(OutTags);
OutTags.Add(
UObject::FAssetRegistryTag("Guid", AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces), UObject::FAssetRegistryTag::TT_Alphabetical));
}

View File

@ -0,0 +1 @@
#include "FMODAssetLookup.h"

View File

@ -0,0 +1,19 @@
// Copyright (c), Firelight Technologies Pty, Ltd.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "FMODAssetLookup.generated.h"
USTRUCT()
struct FMODSTUDIO_API FFMODAssetLookupRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|AssetLookup")
FString PackageName;
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|AssetLookup")
FString AssetName;
};

View File

@ -0,0 +1,230 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODAssetTable.h"
#include "FMODAssetLookup.h"
#include "FMODEvent.h"
#include "FMODSnapshot.h"
#include "FMODSnapshotReverb.h"
#include "FMODBank.h"
#include "FMODBankLookup.h"
#include "FMODBus.h"
#include "FMODVCA.h"
#include "FMODUtils.h"
#include "FMODSettings.h"
#include "FMODFileCallbacks.h"
#include "FMODStudioPrivatePCH.h"
#include "fmod_studio.hpp"
#include "HAL/FileManager.h"
#include "Misc/Paths.h"
#include "UObject/Package.h"
FFMODAssetTable::FFMODAssetTable()
: BankLookup(nullptr),
AssetLookup(nullptr)
{
}
void FFMODAssetTable::AddReferencedObjects(FReferenceCollector& Collector)
{
// The garbage collector will clean up any objects which aren't referenced, doing this tells the garbage collector our lookups are referenced
// (the GC knows not to remove objects referenced by a UPROPERTY, doing this manually is required because our members aren't UPROPERTYs)
if (BankLookup)
{
Collector.AddReferencedObject(BankLookup);
}
if (AssetLookup)
{
Collector.AddReferencedObject(AssetLookup);
}
}
void FFMODAssetTable::Load()
{
const UFMODSettings &Settings = *GetDefault<UFMODSettings>();
FString PackagePath = Settings.GetFullContentPath() / PrivateDataPath();
FString PackageName = PackagePath + BankLookupName();
UPackage *Package = CreatePackage(*PackageName);
Package->FullyLoad();
BankLookup = FindObject<UFMODBankLookup>(Package, *BankLookupName(), true);
if (BankLookup)
{
UE_LOG(LogFMOD, Display, TEXT("Loaded bank lookup"));
}
else
{
TCHAR msg[] = TEXT("Failed to load bank lookup");
if (IsRunningCommandlet())
{
// If we're running in a commandlet (maybe we're cooking or running FMODGenerateAssets
// commandlet) Display a message but don't cause the build to Error out.
UE_LOG(LogFMOD, Display, msg);
}
else
{
// If we're running in game or in editor, log this as an Error
UE_LOG(LogFMOD, Error, msg);
}
}
PackageName = PackagePath + AssetLookupName();
Package = CreatePackage(*PackageName);
Package->FullyLoad();
AssetLookup = FindObject<UDataTable>(Package, *AssetLookupName(), true);
if (AssetLookup)
{
UE_LOG(LogFMOD, Display, TEXT("Loaded asset lookup"));
}
else
{
TCHAR msg[] = TEXT("Failed to load asset lookup");
if (IsRunningCommandlet())
{
// If we're running in a commandlet (maybe we're cooking or running FMODGenerateAssets
// commandlet) Display a message but don't cause the build to Error out.
UE_LOG(LogFMOD, Display, msg);
}
else
{
// If we're running in game or in editor, log this as an Error
UE_LOG(LogFMOD, Error, msg);
}
}
}
FString FFMODAssetTable::GetBankPathByGuid(const FGuid& Guid) const
{
FString BankPath;
if (!BankLookup)
{
UE_LOG(LogFMOD, Error, TEXT("Bank lookup not loaded"));
return BankPath;
}
FString GUID = Guid.ToString(EGuidFormats::DigitsWithHyphensInBraces);
FName BankTableName(*GUID);
FFMODLocalizedBankTable *BankTable = BankLookup->DataTable->FindRow<FFMODLocalizedBankTable>(BankTableName, nullptr, false);
if (BankTable)
{
BankPath = GetLocalizedBankPath(BankTable->Banks);
}
return BankPath;
}
FString FFMODAssetTable::GetLocalizedBankPath(const UDataTable* BankTable) const
{
FName RowName(*ActiveLocale);
FFMODLocalizedBankRow *Row = BankTable->FindRow<FFMODLocalizedBankRow>(RowName, nullptr, false);
if (!Row)
{
RowName = FName("<NON-LOCALIZED>");
Row = BankTable->FindRow<FFMODLocalizedBankRow>(RowName, nullptr, false);
}
FString BankPath;
if (Row)
{
BankPath = Row->Path;
}
return BankPath;
}
FString FFMODAssetTable::GetBankPath(const UFMODBank &Bank) const
{
FString BankPath = GetBankPathByGuid(Bank.AssetGuid);
if (BankPath.IsEmpty())
{
UE_LOG(LogFMOD, Warning, TEXT("Could not find disk file for bank %s"), *Bank.GetName());
}
return BankPath;
}
FString FFMODAssetTable::GetMasterBankPath() const
{
return BankLookup ? BankLookup->MasterBankPath : FString();
}
FString FFMODAssetTable::GetMasterStringsBankPath() const
{
return BankLookup ? BankLookup->MasterStringsBankPath : FString();
}
FString FFMODAssetTable::GetMasterAssetsBankPath() const
{
return BankLookup ? BankLookup->MasterAssetsBankPath : FString();
}
void FFMODAssetTable::SetLocale(const FString &LocaleCode)
{
ActiveLocale = LocaleCode;
}
FString FFMODAssetTable::GetLocale() const
{
return ActiveLocale;
}
void FFMODAssetTable::GetAllBankPaths(TArray<FString> &Paths, bool IncludeMasterBank) const
{
if (BankLookup)
{
const UFMODSettings &Settings = *GetDefault<UFMODSettings>();
BankLookup->DataTable->ForeachRow<FFMODLocalizedBankTable>(nullptr, [this, &Paths, IncludeMasterBank, &Settings](const FName &, const FFMODLocalizedBankTable& OuterRow) {
FString BankPath = GetLocalizedBankPath(OuterRow.Banks);
bool Skip = false;
if (BankPath.IsEmpty())
{
// Never expect to be in here, but should skip empty paths
return;
}
if (!IncludeMasterBank)
{
Skip = (BankPath == Settings.GetMasterBankFilename() || BankPath == Settings.GetMasterAssetsBankFilename() || BankPath == Settings.GetMasterStringsBankFilename());
}
if (!Skip)
{
Paths.Push(Settings.GetFullBankPath() / BankPath);
}
});
}
else
{
UE_LOG(LogFMOD, Error, TEXT("Bank lookup not loaded"));
}
}
UFMODAsset *FFMODAssetTable::GetAssetByStudioPath(const FString &InStudioPath) const
{
UFMODAsset *Asset = nullptr;
if (AssetLookup)
{
FFMODAssetLookupRow *Row = AssetLookup->FindRow<FFMODAssetLookupRow>(FName(*InStudioPath), nullptr);
if (Row)
{
UPackage *Package = CreatePackage(*(Row->PackageName));
Package->FullyLoad();
Asset = FindObject<UFMODAsset>(Package, *(Row->AssetName));
}
}
return Asset;
}

View File

@ -0,0 +1,47 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "UObject/GCObject.h"
class UDataTable;
class UFMODAsset;
class UFMODBank;
class UFMODBankLookup;
class FFMODAssetTable : public FGCObject
{
public:
FFMODAssetTable();
//~ FGCObject
void AddReferencedObjects(FReferenceCollector& Collector) override;
virtual FString GetReferencerName() const override
{
return TEXT("FFMODAssetTable");
}
void Load();
FString GetBankPath(const UFMODBank &Bank) const;
FString GetMasterBankPath() const;
FString GetMasterStringsBankPath() const;
FString GetMasterAssetsBankPath() const;
void SetLocale(const FString &LocaleCode);
FString GetLocale() const;
void GetAllBankPaths(TArray<FString> &BankPaths, bool IncludeMasterBank) const;
UFMODAsset *GetAssetByStudioPath(const FString &InStudioPath) const;
static inline FString PrivateDataPath() { return FString(TEXT("PrivateIntegrationData/")); }
static inline FString BankLookupName() { return FString(TEXT("BankLookup")); }
static inline FString AssetLookupName() { return FString(TEXT("AssetLookup")); }
private:
FString GetBankPathByGuid(const FGuid& Guid) const;
FString GetLocalizedBankPath(const UDataTable* BankTable) const;
FString ActiveLocale;
UFMODBankLookup *BankLookup;
UDataTable *AssetLookup;
};

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODBank.h"
#include "FMODStudioModule.h"
UFMODBank::UFMODBank(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
/** Get tags to show in content view */
void UFMODBank::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const
{
Super::GetAssetRegistryTags(OutTags);
}
FString UFMODBank::GetDesc()
{
return FString::Printf(TEXT("Bank %s"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));
}

View File

@ -0,0 +1,6 @@
#include "FMODBankLookup.h"
UFMODBankLookup::UFMODBankLookup(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, DataTable(nullptr)
{}

View File

@ -0,0 +1,42 @@
// Copyright (c), Firelight Technologies Pty, Ltd.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "FMODBankLookup.generated.h"
USTRUCT()
struct FMODSTUDIO_API FFMODLocalizedBankRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|BankLookup")
FString Path;
};
USTRUCT()
struct FMODSTUDIO_API FFMODLocalizedBankTable : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|BankLookup")
UDataTable *Banks = nullptr;
};
UCLASS()
class FMODSTUDIO_API UFMODBankLookup : public UObject
{
GENERATED_UCLASS_BODY()
public:
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|BankLookup")
UDataTable *DataTable;
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|BankLookup")
FString MasterBankPath;
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|BankLookup")
FString MasterAssetsBankPath;
UPROPERTY(VisibleAnywhere, Category="FMOD|Internal|BankLookup")
FString MasterStringsBankPath;
};

View File

@ -0,0 +1,672 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODBlueprintStatics.h"
#include "FMODAudioComponent.h"
#include "FMODSettings.h"
#include "FMODStudioModule.h"
#include "FMODUtils.h"
#include "FMODBank.h"
#include "FMODEvent.h"
#include "FMODBus.h"
#include "FMODVCA.h"
#include "fmod_studio.hpp"
#include "fmod_errors.h"
#include "FMODStudioPrivatePCH.h"
/////////////////////////////////////////////////////
// UFMODBlueprintStatics
UFMODBlueprintStatics::UFMODBlueprintStatics(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
FFMODEventInstance UFMODBlueprintStatics::PlayEvent2D(UObject *WorldContextObject, class UFMODEvent *Event, bool bAutoPlay)
{
return PlayEventAtLocation(WorldContextObject, Event, FTransform(), bAutoPlay);
}
FFMODEventInstance UFMODBlueprintStatics::PlayEventAtLocation(
UObject *WorldContextObject, class UFMODEvent *Event, const FTransform &Location, bool bAutoPlay)
{
FFMODEventInstance Instance;
Instance.Instance = nullptr;
UWorld *ThisWorld = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull);
if (FMODUtils::IsWorldAudible(ThisWorld, false) && IsValid(Event))
{
FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);
if (EventDesc != nullptr)
{
FMOD::Studio::EventInstance *EventInst = nullptr;
EventDesc->createInstance(&EventInst);
if (EventInst != nullptr)
{
FMOD_3D_ATTRIBUTES EventAttr = { { 0 } };
FMODUtils::Assign(EventAttr, Location);
EventInst->set3DAttributes(&EventAttr);
if (bAutoPlay)
{
EventInst->start();
EventInst->release();
}
Instance.Instance = EventInst;
}
}
}
return Instance;
}
class UFMODAudioComponent *UFMODBlueprintStatics::PlayEventAttached(class UFMODEvent *Event, class USceneComponent *AttachToComponent,
FName AttachPointName, FVector Location, EAttachLocation::Type LocationType, bool bStopWhenAttachedToDestroyed, bool bAutoPlay, bool bAutoDestroy)
{
if (!IFMODStudioModule::Get().UseSound())
{
return nullptr;
}
if (Event == nullptr)
{
return nullptr;
}
if (AttachToComponent == nullptr)
{
UE_LOG(LogFMOD, Warning, TEXT("UFMODBlueprintStatics::PlayEventAttached: NULL AttachComponent specified!"));
return nullptr;
}
AActor *Actor = AttachToComponent->GetOwner();
// Avoid creating component if we're trying to play a sound on an already destroyed actor.
if (!IsValid(Actor))
{
return nullptr;
}
UFMODAudioComponent *AudioComponent;
if (Actor)
{
// Use actor as outer if we have one.
AudioComponent = NewObject<UFMODAudioComponent>(Actor);
}
else
{
// Let engine pick the outer (transient package).
AudioComponent = NewObject<UFMODAudioComponent>();
}
check(AudioComponent);
AudioComponent->Event = Event;
AudioComponent->bAutoActivate = false;
AudioComponent->bAutoDestroy = bAutoDestroy;
AudioComponent->bStopWhenOwnerDestroyed = bStopWhenAttachedToDestroyed;
#if WITH_EDITORONLY_DATA
AudioComponent->bVisualizeComponent = false;
#endif
AudioComponent->RegisterComponentWithWorld(AttachToComponent->GetWorld());
AudioComponent->AttachToComponent(AttachToComponent, FAttachmentTransformRules::KeepRelativeTransform, AttachPointName);
if (LocationType == EAttachLocation::KeepWorldPosition)
{
AudioComponent->SetWorldLocation(Location);
}
else
{
AudioComponent->SetRelativeLocation(Location);
}
if (bAutoPlay)
{
AudioComponent->Play();
}
return AudioComponent;
}
UFMODAsset *UFMODBlueprintStatics::FindAssetByName(const FString &Name)
{
return IFMODStudioModule::Get().FindAssetByName(Name);
}
UFMODEvent *UFMODBlueprintStatics::FindEventByName(const FString &Name)
{
return IFMODStudioModule::Get().FindEventByName(Name);
}
void UFMODBlueprintStatics::LoadBank(class UFMODBank *Bank, bool bBlocking, bool bLoadSampleData)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bank))
{
UE_LOG(LogFMOD, Log, TEXT("LoadBank %s"), *Bank->GetName());
FString BankPath = IFMODStudioModule::Get().GetBankPath(*Bank);
FMOD::Studio::Bank *bank = nullptr;
FMOD_STUDIO_LOAD_BANK_FLAGS flags = (bBlocking || bLoadSampleData) ? FMOD_STUDIO_LOAD_BANK_NORMAL : FMOD_STUDIO_LOAD_BANK_NONBLOCKING;
FMOD_RESULT result = StudioSystem->loadBankFile(TCHAR_TO_UTF8(*BankPath), flags, &bank);
if (result != FMOD_OK)
{
UE_LOG(LogFMOD, Error, TEXT("Failed to load bank %s: %s"), *Bank->GetName(), UTF8_TO_TCHAR(FMOD_ErrorString(result)));
}
if (result == FMOD_OK && bLoadSampleData)
{
bank->loadSampleData();
}
}
}
void UFMODBlueprintStatics::UnloadBank(class UFMODBank *Bank)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bank))
{
UE_LOG(LogFMOD, Log, TEXT("UnloadBank %s"), *Bank->GetName());
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);
FMOD::Studio::Bank *bank = nullptr;
FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);
if (result == FMOD_OK && bank != nullptr)
{
bank->unload();
}
}
}
bool UFMODBlueprintStatics::IsBankLoaded(class UFMODBank *Bank)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bank))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);
FMOD::Studio::Bank *bank = nullptr;
FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);
if (result == FMOD_OK && bank != nullptr)
{
FMOD_STUDIO_LOADING_STATE loadingState;
if (bank->getLoadingState(&loadingState) == FMOD_OK)
{
return (loadingState == FMOD_STUDIO_LOADING_STATE_LOADED);
}
}
}
return false;
}
void UFMODBlueprintStatics::LoadBankSampleData(class UFMODBank *Bank)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bank))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);
FMOD::Studio::Bank *bank = nullptr;
FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);
if (result == FMOD_OK && bank != nullptr)
{
bank->loadSampleData();
}
}
}
void UFMODBlueprintStatics::UnloadBankSampleData(class UFMODBank *Bank)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bank))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);
FMOD::Studio::Bank *bank = nullptr;
FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);
if (result == FMOD_OK && bank != nullptr)
{
bank->unloadSampleData();
}
}
}
void UFMODBlueprintStatics::LoadEventSampleData(UObject *WorldContextObject, class UFMODEvent *Event)
{
if (IsValid(Event))
{
FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);
if (EventDesc != nullptr)
{
EventDesc->loadSampleData();
}
}
}
void UFMODBlueprintStatics::UnloadEventSampleData(UObject *WorldContextObject, class UFMODEvent *Event)
{
if (IsValid(Event))
{
FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);
if (EventDesc != nullptr)
{
EventDesc->unloadSampleData();
}
}
}
TArray<FFMODEventInstance> UFMODBlueprintStatics::FindEventInstances(UObject *WorldContextObject, UFMODEvent *Event)
{
TArray<FFMODEventInstance> Instances;
if (IsValid(Event))
{
FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);
if (EventDesc != nullptr)
{
int Capacity = 0;
EventDesc->getInstanceCount(&Capacity);
if (Capacity > 0)
{
TArray<FMOD::Studio::EventInstance *> InstancePointers;
InstancePointers.SetNum(Capacity, true);
int Count = 0;
EventDesc->getInstanceList(InstancePointers.GetData(), Capacity, &Count);
Instances.SetNum(Count, true);
for (int i = 0; i < Count; ++i)
{
Instances[i].Instance = InstancePointers[i];
}
}
}
}
return Instances;
}
void UFMODBlueprintStatics::BusSetVolume(class UFMODBus *Bus, float Volume)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bus))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);
FMOD::Studio::Bus *bus = nullptr;
FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);
if (result == FMOD_OK && bus != nullptr)
{
bus->setVolume(Volume);
}
}
}
void UFMODBlueprintStatics::BusSetPaused(class UFMODBus *Bus, bool bPaused)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bus))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);
FMOD::Studio::Bus *bus = nullptr;
FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);
if (result == FMOD_OK && bus != nullptr)
{
bus->setPaused(bPaused);
}
}
}
void UFMODBlueprintStatics::BusSetMute(class UFMODBus *Bus, bool bMute)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bus))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);
FMOD::Studio::Bus *bus = nullptr;
FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);
if (result == FMOD_OK && bus != nullptr)
{
bus->setMute(bMute);
}
}
}
void UFMODBlueprintStatics::BusStopAllEvents(UFMODBus *Bus, EFMOD_STUDIO_STOP_MODE stopMode)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Bus))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);
FMOD::Studio::Bus *bus = nullptr;
FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);
if (result == FMOD_OK && bus != nullptr)
{
bus->stopAllEvents((FMOD_STUDIO_STOP_MODE)stopMode);
}
}
}
void UFMODBlueprintStatics::VCASetVolume(class UFMODVCA *Vca, float Volume)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr && IsValid(Vca))
{
FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Vca->AssetGuid);
FMOD::Studio::VCA *vca = nullptr;
FMOD_RESULT result = StudioSystem->getVCAByID(&guid, &vca);
if (result == FMOD_OK && vca != nullptr)
{
vca->setVolume(Volume);
}
}
}
void UFMODBlueprintStatics::SetGlobalParameterByName(FName Name, float Value)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr)
{
FMOD_RESULT Result = StudioSystem->setParameterByName(TCHAR_TO_UTF8(*Name.ToString()), Value);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to set parameter %s"), *Name.ToString());
}
}
}
float UFMODBlueprintStatics::GetGlobalParameterByName(FName Name)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
float Value = 0.0f;
if (StudioSystem != nullptr)
{
FMOD_RESULT Result = StudioSystem->getParameterByName(TCHAR_TO_UTF8(*Name.ToString()), &Value);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to get event instance parameter %s"), *Name.ToString());
}
}
return Value;
}
void UFMODBlueprintStatics::GetGlobalParameterValueByName(FName Name, float &UserValue, float &FinalValue)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr)
{
FMOD_RESULT Result = StudioSystem->getParameterByName(TCHAR_TO_UTF8(*Name.ToString()), &UserValue, &FinalValue);
if (Result != FMOD_OK)
{
UserValue = FinalValue = 0.0f;
UE_LOG(LogFMOD, Warning, TEXT("Failed to get event instance parameter %s"), *Name.ToString());
}
}
}
bool UFMODBlueprintStatics::EventInstanceIsValid(FFMODEventInstance EventInstance)
{
if (EventInstance.Instance)
{
return EventInstance.Instance->isValid();
}
return false;
}
void UFMODBlueprintStatics::EventInstanceSetVolume(FFMODEventInstance EventInstance, float Volume)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->setVolume(Volume);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to set event instance volume"));
}
}
}
void UFMODBlueprintStatics::EventInstanceSetPitch(FFMODEventInstance EventInstance, float Pitch)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->setPitch(Pitch);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to set event instance pitch"));
}
}
}
void UFMODBlueprintStatics::EventInstanceSetPaused(FFMODEventInstance EventInstance, bool Paused)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->setPaused(Paused);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to pause event instance"));
}
}
}
void UFMODBlueprintStatics::EventInstanceSetParameter(FFMODEventInstance EventInstance, FName Name, float Value)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->setParameterByName(TCHAR_TO_UTF8(*Name.ToString()), Value);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to set event instance parameter %s"), *Name.ToString());
}
}
}
float UFMODBlueprintStatics::EventInstanceGetParameter(FFMODEventInstance EventInstance, FName Name)
{
float Value = 0.0f;
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->getParameterByName(TCHAR_TO_UTF8(*Name.ToString()), &Value);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to get event instance parameter %s"), *Name.ToString());
}
}
return Value;
}
void UFMODBlueprintStatics::EventInstanceGetParameterValue(FFMODEventInstance EventInstance, FName Name, float &UserValue, float &FinalValue)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->getParameterByName(TCHAR_TO_UTF8(*Name.ToString()), &UserValue, &FinalValue);
if (Result != FMOD_OK)
{
UserValue = FinalValue = 0.0f;
UE_LOG(LogFMOD, Warning, TEXT("Failed to get event instance parameter %s"), *Name.ToString());
}
}
}
void UFMODBlueprintStatics::EventInstanceSetProperty(FFMODEventInstance EventInstance, EFMODEventProperty::Type Property, float Value)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->setProperty((FMOD_STUDIO_EVENT_PROPERTY)Property, Value);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to set event instance property type %d to value %f (%s)"), (int)Property, Value,
FMOD_ErrorString(Result));
}
}
}
void UFMODBlueprintStatics::EventInstancePlay(FFMODEventInstance EventInstance)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->start();
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to play event instance"));
}
// Once we start playing, allow instance to be cleaned up when it finishes
EventInstance.Instance->release();
}
}
void UFMODBlueprintStatics::EventInstanceStop(FFMODEventInstance EventInstance, bool Release)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to stop event instance"));
}
else
{
if (Release)
{
EventInstanceRelease(EventInstance);
//EventInstance.Instance->release();
}
}
}
}
void UFMODBlueprintStatics::EventInstanceRelease(FFMODEventInstance EventInstance)
{
if (EventInstance.Instance)
{
FMOD_RESULT Result = EventInstance.Instance->release();
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to release event instance"));
}
}
}
void UFMODBlueprintStatics::EventInstanceKeyOff(FFMODEventInstance EventInstance)
{
if (EventInstance.Instance)
{
EventInstance.Instance->keyOff();
}
}
void UFMODBlueprintStatics::EventInstanceSetTransform(FFMODEventInstance EventInstance, const FTransform &Location)
{
if (EventInstance.Instance)
{
FMOD_3D_ATTRIBUTES attr = { { 0 } };
FMODUtils::Assign(attr, Location);
FMOD_RESULT Result = EventInstance.Instance->set3DAttributes(&attr);
if (Result != FMOD_OK)
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to set transform on event instance"));
}
}
}
TArray<FString> UFMODBlueprintStatics::GetOutputDrivers()
{
TArray<FString> AllNames;
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr)
{
FMOD::System *LowLevelSystem = nullptr;
verifyfmod(StudioSystem->getCoreSystem(&LowLevelSystem));
int DriverCount = 0;
verifyfmod(LowLevelSystem->getNumDrivers(&DriverCount));
for (int id = 0; id < DriverCount; ++id)
{
char DriverNameUTF8[256] = {};
verifyfmod(LowLevelSystem->getDriverInfo(id, DriverNameUTF8, sizeof(DriverNameUTF8), 0, 0, 0, 0));
FString DriverName(UTF8_TO_TCHAR(DriverNameUTF8));
AllNames.Add(DriverName);
}
}
return AllNames;
}
void UFMODBlueprintStatics::SetOutputDriverByName(FString NewDriverName)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr)
{
FMOD::System *LowLevelSystem = nullptr;
verifyfmod(StudioSystem->getCoreSystem(&LowLevelSystem));
int DriverIndex = -1;
int DriverCount = 0;
verifyfmod(LowLevelSystem->getNumDrivers(&DriverCount));
for (int id = 0; id < DriverCount; ++id)
{
char DriverNameUTF8[256] = {};
verifyfmod(LowLevelSystem->getDriverInfo(id, DriverNameUTF8, sizeof(DriverNameUTF8), 0, 0, 0, 0));
FString DriverName(UTF8_TO_TCHAR(DriverNameUTF8));
UE_LOG(LogFMOD, Log, TEXT("Driver %d: %s"), id, *DriverName);
if (DriverName.Contains(NewDriverName))
{
DriverIndex = id;
}
}
if (DriverIndex >= 0)
{
UE_LOG(LogFMOD, Log, TEXT("Selected driver %d"), DriverIndex);
verifyfmod(LowLevelSystem->setDriver(DriverIndex));
}
else
{
UE_LOG(LogFMOD, Warning, TEXT("Did not find driver of name '%s'"), *NewDriverName);
}
}
}
void UFMODBlueprintStatics::SetOutputDriverByIndex(int NewDriverIndex)
{
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr)
{
FMOD::System *LowLevelSystem = nullptr;
verifyfmod(StudioSystem->getCoreSystem(&LowLevelSystem));
int DriverCount = 0;
verifyfmod(LowLevelSystem->getNumDrivers(&DriverCount));
if (NewDriverIndex >= 0 && NewDriverIndex < DriverCount)
{
UE_LOG(LogFMOD, Log, TEXT("Selected driver %d"), NewDriverIndex);
verifyfmod(LowLevelSystem->setDriver(NewDriverIndex));
}
else
{
UE_LOG(LogFMOD, Warning, TEXT("Driver %d out of range"), NewDriverIndex);
}
}
}
void UFMODBlueprintStatics::MixerSuspend()
{
UE_LOG(LogFMOD, Log, TEXT("MixerSuspend called"));
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr)
{
FMOD::System *LowLevelSystem = nullptr;
verifyfmod(StudioSystem->getCoreSystem(&LowLevelSystem));
verifyfmod(LowLevelSystem->mixerSuspend());
}
}
void UFMODBlueprintStatics::MixerResume()
{
UE_LOG(LogFMOD, Log, TEXT("MixerResume called"));
FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);
if (StudioSystem != nullptr)
{
FMOD::System *LowLevelSystem = nullptr;
verifyfmod(StudioSystem->getCoreSystem(&LowLevelSystem));
verifyfmod(LowLevelSystem->mixerResume());
}
}
void UFMODBlueprintStatics::SetLocale(const FString& Locale)
{
IFMODStudioModule::Get().SetLocale(Locale);
}

View File

@ -0,0 +1,20 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODBus.h"
#include "FMODStudioModule.h"
UFMODBus::UFMODBus(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
/** Get tags to show in content view */
void UFMODBus::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const
{
Super::GetAssetRegistryTags(OutTags);
}
FString UFMODBus::GetDesc()
{
return FString::Printf(TEXT("Bus %s"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));
}

View File

@ -0,0 +1,58 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEvent.h"
#include "FMODStudioModule.h"
#include "fmod_studio.hpp"
UFMODEvent::UFMODEvent(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
/** Get tags to show in content view */
void UFMODEvent::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const
{
Super::GetAssetRegistryTags(OutTags);
if (IFMODStudioModule::Get().AreBanksLoaded())
{
FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(this, EFMODSystemContext::Max);
bool bOneshot = false;
bool bStream = false;
bool b3D = false;
if (EventDesc)
{
EventDesc->isOneshot(&bOneshot);
EventDesc->isStream(&bStream);
EventDesc->is3D(&b3D);
}
OutTags.Add(UObject::FAssetRegistryTag("Oneshot", bOneshot ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical));
OutTags.Add(UObject::FAssetRegistryTag("Streaming", bStream ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical));
OutTags.Add(UObject::FAssetRegistryTag("3D", b3D ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical));
}
}
FString UFMODEvent::GetDesc()
{
return FString::Printf(TEXT("Event %s"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));
}
void UFMODEvent::GetParameterDescriptions(TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> &Parameters) const
{
if (IFMODStudioModule::Get().AreBanksLoaded())
{
FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(this, EFMODSystemContext::Auditioning);
if (EventDesc)
{
int ParameterCount;
EventDesc->getParameterDescriptionCount(&ParameterCount);
Parameters.SetNumUninitialized(ParameterCount);
for (int ParameterIndex = 0; ParameterIndex < ParameterCount; ++ParameterIndex)
{
EventDesc->getParameterDescriptionByIndex(ParameterIndex, &Parameters[ParameterIndex]);
}
}
}
}

View File

@ -0,0 +1,346 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2015.
#include "FMODFileCallbacks.h"
#include "fmod_errors.h"
#include "FMODUtils.h"
#include "HAL/FileManager.h"
#include "GenericPlatform/GenericPlatformProcess.h"
#include "HAL/Runnable.h"
#include "HAL/RunnableThread.h"
#include "Misc/ScopeLock.h"
#include "FMODStudioPrivatePCH.h"
FMOD_RESULT F_CALLBACK FMODLogCallback(FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message)
{
if (flags & FMOD_DEBUG_LEVEL_ERROR)
{
UE_LOG(LogFMOD, Error, TEXT("%s(%d) - %s"), UTF8_TO_TCHAR(file), line, UTF8_TO_TCHAR(message));
}
else if (flags & FMOD_DEBUG_LEVEL_WARNING)
{
FString Message = UTF8_TO_TCHAR(message);
UE_LOG(LogFMOD, Warning, TEXT("%s(%d) - %s"), UTF8_TO_TCHAR(file), line, *Message);
if (GIsEditor)
{
int32 StartIndex = Message.Find(TEXT("Missing DSP plugin '"));
if (StartIndex != INDEX_NONE)
{
int32 Len = FString(TEXT("Missing DSP plugin '")).Len();
int32 EndIndex;
if (Message.FindLastChar('\'', EndIndex) && EndIndex != INDEX_NONE && StartIndex + Len < EndIndex)
{
FString PluginName = Message.Mid(StartIndex + Len, EndIndex - StartIndex - Len);
FModuleManager::GetModuleChecked<IFMODStudioModule>("FMODStudio").AddRequiredPlugin(PluginName);
}
}
}
}
else if (flags & FMOD_DEBUG_LEVEL_LOG)
{
UE_LOG(LogFMOD, Log, TEXT("%s(%d) - %s"), UTF8_TO_TCHAR(file), line, UTF8_TO_TCHAR(message));
}
return FMOD_OK;
}
FMOD_RESULT F_CALLBACK FMODErrorCallback(FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void* commanddata2, void *userdata)
{
FMOD_ERRORCALLBACK_INFO *callbackInfo = (FMOD_ERRORCALLBACK_INFO *)commanddata1;
if ((callbackInfo->instancetype == FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL || callbackInfo->instancetype == FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL)
&& callbackInfo->result == FMOD_ERR_INVALID_HANDLE)
{
return FMOD_OK;
}
UE_LOG(LogFMOD, Error, TEXT("%s(%s) returned error %d (\"%s\") for instance type: %d (0x%d)."),
UTF8_TO_TCHAR(callbackInfo->functionname), UTF8_TO_TCHAR(callbackInfo->functionparams), (int)callbackInfo->result,
UTF8_TO_TCHAR(FMOD_ErrorString(callbackInfo->result)), (int)callbackInfo->instancetype, callbackInfo->instance);
return FMOD_OK;
}
class FFMODFileSystem : public FRunnable
{
public:
FFMODFileSystem()
: mHandleIn(nullptr)
, mName(nullptr)
, mFileSize(nullptr)
, mHandleOut(nullptr)
, mBuffer(nullptr)
, mSizeBytes(0)
, mBytesRead(nullptr)
, mSeekPosition(0)
, mCommand(COMMAND_MAX)
, mResult(FMOD_OK)
, mReferenceCount(0)
, mThread(nullptr)
, mCommandReadyEvent(nullptr)
, mCommandCompleteEvent(nullptr)
{
}
static FMOD_RESULT F_CALLBACK OpenCallback(const char *name, unsigned int *filesize, void **handle, void * /*userdata*/);
static FMOD_RESULT F_CALLBACK CloseCallback(void *handle, void * /*userdata*/);
static FMOD_RESULT F_CALLBACK ReadCallback(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void * /*userdata*/);
static FMOD_RESULT F_CALLBACK SeekCallback(void *handle, unsigned int pos, void * /*userdata*/);
static FMOD_RESULT OpenInternal(const char *name, unsigned int *filesize, void **handle);
static FMOD_RESULT CloseInternal(void *handle);
static FMOD_RESULT ReadInternal(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread);
static FMOD_RESULT SeekInternal(void *handle, unsigned int pos);
void IncrementReferenceCount()
{
FScopeLock lock(&mCrit);
++mReferenceCount;
if (mReferenceCount == 1)
{
check(!mThread);
mCommandReadyEvent = FGenericPlatformProcess::GetSynchEventFromPool();
mCommandCompleteEvent = FGenericPlatformProcess::GetSynchEventFromPool();
mThread = FRunnableThread::Create(this, TEXT("FMOD File Access Coordinator"));
}
}
void DecrementReferenceCount()
{
FScopeLock lock(&mCrit);
check(mReferenceCount > 0);
check(mThread);
--mReferenceCount;
if (mReferenceCount == 0)
{
verifyfmod(RunCommand(COMMAND_STOP));
mThread->WaitForCompletion();
FGenericPlatformProcess::ReturnSynchEventToPool(mCommandReadyEvent);
mCommandReadyEvent = nullptr;
FGenericPlatformProcess::ReturnSynchEventToPool(mCommandCompleteEvent);
mCommandCompleteEvent = nullptr;
delete mThread;
mThread = nullptr;
}
}
void Attach(FMOD::System *system, int32 fileBufferSize)
{
check(mThread);
verifyfmod(system->setFileSystem(OpenCallback, CloseCallback, ReadCallback, SeekCallback, 0, 0, fileBufferSize));
}
uint32 Run() override
{
bool stopRequested = false;
while (!stopRequested)
{
mCommandReadyEvent->Wait();
switch (mCommand)
{
case COMMAND_OPEN:
mResult = OpenInternal(mName, mFileSize, mHandleOut);
break;
case COMMAND_CLOSE:
mResult = CloseInternal(mHandleIn);
break;
case COMMAND_READ:
mResult = ReadInternal(mHandleIn, mBuffer, mSizeBytes, mBytesRead);
break;
case COMMAND_SEEK:
mResult = SeekInternal(mHandleIn, mSeekPosition);
break;
case COMMAND_STOP:
stopRequested = true;
mResult = FMOD_OK;
break;
}
mCommandCompleteEvent->Trigger();
}
return 0;
}
private:
enum Command
{
COMMAND_OPEN,
COMMAND_CLOSE,
COMMAND_READ,
COMMAND_SEEK,
COMMAND_STOP,
COMMAND_MAX,
};
FMOD_RESULT RunCommand(Command command)
{
check(mThread);
mCommand = command;
mCommandReadyEvent->Trigger();
mCommandCompleteEvent->Wait();
return mResult;
}
// Parameter for Close, Seek and Read
void *mHandleIn;
// Parameters for Open
const char *mName;
unsigned int *mFileSize;
void **mHandleOut;
// Parameters for Read
void *mBuffer;
unsigned int mSizeBytes;
unsigned int *mBytesRead;
// Parameter for Seek
unsigned int mSeekPosition;
Command mCommand;
FMOD_RESULT mResult;
int mReferenceCount;
FRunnableThread *mThread;
FEvent *mCommandReadyEvent;
FEvent *mCommandCompleteEvent;
FCriticalSection mCrit;
};
static FFMODFileSystem gFileSystem;
FMOD_RESULT F_CALLBACK FFMODFileSystem::OpenCallback(const char *name, unsigned int *filesize, void **handle, void * /*userdata*/)
{
FScopeLock lock(&gFileSystem.mCrit);
gFileSystem.mName = name;
gFileSystem.mFileSize = filesize;
gFileSystem.mHandleOut = handle;
return gFileSystem.RunCommand(COMMAND_OPEN);
}
FMOD_RESULT FFMODFileSystem::OpenInternal(const char *name, unsigned int *filesize, void **handle)
{
if (name)
{
FArchive *Archive = IFileManager::Get().CreateFileReader(UTF8_TO_TCHAR(name));
UE_LOG(LogFMOD, Verbose, TEXT("FFMODFileSystem::OpenInternal opening '%s' returned archive %p"), UTF8_TO_TCHAR(name), Archive);
if (!Archive)
{
return FMOD_ERR_FILE_NOTFOUND;
}
*filesize = Archive->TotalSize();
*handle = Archive;
UE_LOG(LogFMOD, Verbose, TEXT(" TotalSize = %d"), *filesize);
}
return FMOD_OK;
}
FMOD_RESULT F_CALLBACK FFMODFileSystem::CloseCallback(void *handle, void * /*userdata*/)
{
FScopeLock lock(&gFileSystem.mCrit);
gFileSystem.mHandleIn = handle;
return gFileSystem.RunCommand(COMMAND_CLOSE);
}
FMOD_RESULT FFMODFileSystem::CloseInternal(void *handle)
{
if (!handle)
{
return FMOD_ERR_INVALID_PARAM;
}
FArchive *Archive = (FArchive *)handle;
UE_LOG(LogFMOD, Verbose, TEXT("FFMODFileSystem::CloseCallback closing archive %p"), Archive);
delete Archive;
return FMOD_OK;
}
FMOD_RESULT F_CALLBACK FFMODFileSystem::ReadCallback(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void * /*userdata*/)
{
FScopeLock lock(&gFileSystem.mCrit);
gFileSystem.mHandleIn = handle;
gFileSystem.mBuffer = buffer;
gFileSystem.mSizeBytes = sizebytes;
gFileSystem.mBytesRead = bytesread;
return gFileSystem.RunCommand(COMMAND_READ);
}
FMOD_RESULT FFMODFileSystem::ReadInternal(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread)
{
if (!handle)
{
return FMOD_ERR_INVALID_PARAM;
}
if (bytesread)
{
FArchive *Archive = (FArchive *)handle;
int64 BytesLeft = Archive->TotalSize() - Archive->Tell();
int64 ReadAmount = FMath::Min((int64)sizebytes, BytesLeft);
Archive->Serialize(buffer, ReadAmount);
*bytesread = (unsigned int)ReadAmount;
if (ReadAmount < (int64)sizebytes)
{
UE_LOG(LogFMOD, Verbose, TEXT(" -> EOF "));
return FMOD_ERR_FILE_EOF;
}
}
return FMOD_OK;
}
FMOD_RESULT F_CALLBACK FFMODFileSystem::SeekCallback(void *handle, unsigned int pos, void * /*userdata*/)
{
FScopeLock lock(&gFileSystem.mCrit);
gFileSystem.mHandleIn = handle;
gFileSystem.mSeekPosition = pos;
return gFileSystem.RunCommand(COMMAND_SEEK);
}
FMOD_RESULT FFMODFileSystem::SeekInternal(void *handle, unsigned int pos)
{
if (!handle)
{
return FMOD_ERR_INVALID_PARAM;
}
FArchive *Archive = (FArchive *)handle;
Archive->Seek(pos);
return FMOD_OK;
}
void AcquireFMODFileSystem()
{
gFileSystem.IncrementReferenceCount();
}
void ReleaseFMODFileSystem()
{
gFileSystem.DecrementReferenceCount();
}
void AttachFMODFileSystem(FMOD::System *system, int32 fileBufferSize)
{
gFileSystem.Attach(system, fileBufferSize);
}

View File

@ -0,0 +1,13 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "fmod.hpp"
#include "GenericPlatform/GenericPlatform.h"
FMOD_RESULT F_CALLBACK FMODLogCallback(FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message);
FMOD_RESULT F_CALLBACK FMODErrorCallback(FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void *commanddata2, void *userdata);
void AcquireFMODFileSystem();
void ReleaseFMODFileSystem();
void AttachFMODFileSystem(FMOD::System *system, FGenericPlatformTypes::int32 fileBufferSize);

View File

@ -0,0 +1,86 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODListener.h"
#include "Misc/App.h"
#include "AudioDefines.h"
#include "Sound/AudioVolume.h"
float FFMODListener::Interpolate(const double EndTime)
{
if (FApp::GetCurrentTime() < InteriorStartTime)
{
return (0.0f);
}
if (FApp::GetCurrentTime() >= EndTime)
{
return (1.0f);
}
float InterpValue = (float)((FApp::GetCurrentTime() - InteriorStartTime) / (EndTime - InteriorStartTime));
return (InterpValue);
}
void FFMODListener::UpdateCurrentInteriorSettings()
{
// Store the interpolation value, not the actual value
InteriorVolumeInterp = Interpolate(InteriorEndTime);
ExteriorVolumeInterp = Interpolate(ExteriorEndTime);
InteriorLPFInterp = Interpolate(InteriorLPFEndTime);
ExteriorLPFInterp = Interpolate(ExteriorLPFEndTime);
}
void FFMODListener::ApplyInteriorSettings(class AAudioVolume *InVolume, const FInteriorSettings &Settings)
{
if (InteriorSettings != Settings)
{
// Use previous/ current interpolation time if we're transitioning to the default worldsettings zone.
InteriorStartTime = FApp::GetCurrentTime();
InteriorEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.InteriorTime : Settings.InteriorTime);
ExteriorEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.ExteriorTime : Settings.ExteriorTime);
InteriorLPFEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.InteriorLPFTime : Settings.InteriorLPFTime);
ExteriorLPFEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.ExteriorLPFTime : Settings.ExteriorLPFTime);
InteriorSettings = Settings;
}
Volume = InVolume;
}
FFMODInteriorSettings::FFMODInteriorSettings()
: bIsWorldSettings(false)
, ExteriorVolume(1.0f)
, ExteriorTime(0.5f)
, ExteriorLPF(MAX_FILTER_FREQUENCY)
, ExteriorLPFTime(0.5f)
, InteriorVolume(1.0f)
, InteriorTime(0.5f)
, InteriorLPF(MAX_FILTER_FREQUENCY)
, InteriorLPFTime(0.5f)
{
}
bool FFMODInteriorSettings::operator==(const FInteriorSettings &Other) const
{
return (this->bIsWorldSettings == Other.bIsWorldSettings) && (this->ExteriorVolume == Other.ExteriorVolume) &&
(this->ExteriorTime == Other.ExteriorTime) && (this->ExteriorLPF == Other.ExteriorLPF) &&
(this->ExteriorLPFTime == Other.ExteriorLPFTime) && (this->InteriorVolume == Other.InteriorVolume) &&
(this->InteriorTime == Other.InteriorTime) && (this->InteriorLPF == Other.InteriorLPF) && (this->InteriorLPFTime == Other.InteriorLPFTime);
}
bool FFMODInteriorSettings::operator!=(const FInteriorSettings &Other) const
{
return !(*this == Other);
}
FFMODInteriorSettings &FFMODInteriorSettings::operator=(FInteriorSettings Other)
{
bIsWorldSettings = Other.bIsWorldSettings;
ExteriorVolume = Other.ExteriorVolume;
ExteriorTime = Other.ExteriorTime;
ExteriorLPF = Other.ExteriorLPF;
ExteriorLPFTime = Other.ExteriorLPFTime;
InteriorVolume = Other.InteriorVolume;
InteriorTime = Other.InteriorTime;
InteriorLPF = Other.InteriorLPF;
InteriorLPFTime = Other.InteriorLPFTime;
return *this;
}

View File

@ -0,0 +1,85 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "GenericPlatform/GenericPlatform.h"
#include "UObject/Object.h"
#include "Math/Vector.h"
struct FInteriorSettings;
/** Struct encapsulating settings for interior areas. */
struct FFMODInteriorSettings
{
uint32 bIsWorldSettings : 1;
float ExteriorVolume;
float ExteriorTime;
float ExteriorLPF;
float ExteriorLPFTime;
float InteriorVolume;
float InteriorTime;
float InteriorLPF;
float InteriorLPFTime;
FFMODInteriorSettings();
bool operator==(const FInteriorSettings &Other) const;
bool operator!=(const FInteriorSettings &Other) const;
FFMODInteriorSettings &operator=(FInteriorSettings Other);
};
/** A direct copy of FListener (which doesn't have external linkage, unfortunately) **/
struct FFMODListener
{
FTransform Transform;
FVector Velocity;
struct FFMODInteriorSettings InteriorSettings;
/** The volume the listener resides in */
class AAudioVolume *Volume;
/** The times of interior volumes fading in and out */
double InteriorStartTime;
double InteriorEndTime;
double ExteriorEndTime;
double InteriorLPFEndTime;
double ExteriorLPFEndTime;
float InteriorVolumeInterp;
float InteriorLPFInterp;
float ExteriorVolumeInterp;
float ExteriorLPFInterp;
FVector GetUp() const { return Transform.GetUnitAxis(EAxis::Z); }
FVector GetFront() const { return Transform.GetUnitAxis(EAxis::Y); }
FVector GetRight() const { return Transform.GetUnitAxis(EAxis::X); }
/**
* Works out the interp value between source and end
*/
float Interpolate(const double EndTime);
/**
* Gets the current state of the interior settings for the listener
*/
void UpdateCurrentInteriorSettings();
/**
* Apply the interior settings to ambient sounds
*/
void ApplyInteriorSettings(class AAudioVolume *Volume, const FInteriorSettings &Settings);
FFMODListener()
: Transform(FTransform::Identity)
, Velocity(ForceInit)
, Volume(NULL)
, InteriorStartTime(0.0)
, InteriorEndTime(0.0)
, ExteriorEndTime(0.0)
, InteriorLPFEndTime(0.0)
, ExteriorLPFEndTime(0.0)
, InteriorVolumeInterp(0.f)
, InteriorLPFInterp(0.f)
, ExteriorVolumeInterp(0.f)
, ExteriorLPFInterp(0.f)
{
}
};

View File

@ -0,0 +1,22 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "Containers/UnrealString.h"
#include "fmod_common.h"
#include "FMODSettings.h"
FString FMODPlatform_GetDllPath(const TCHAR *ShortName, bool bExplicitPath, bool bUseLibPrefix);
EFMODPlatforms::Type FMODPlatform_CurrentPlatform();
FString FMODPlatform_PlatformName();
void FMODPlatform_SetRealChannelCount(FMOD_ADVANCEDSETTINGS* advSettings);
int FMODPlatform_MemoryPoolSize();
#ifdef FMOD_PLATFORM_LOAD_DLL
void* FMODPlatformLoadDll(const TCHAR* LibToLoad);
#endif
FMOD_RESULT FMODPlatformSystemSetup();

View File

@ -0,0 +1,20 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODPort.h"
#include "FMODStudioModule.h"
UFMODPort::UFMODPort(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
/** Get tags to show in content view */
void UFMODPort::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const
{
Super::GetAssetRegistryTags(OutTags);
}
FString UFMODPort::GetDesc()
{
return FString::Printf(TEXT("Port %s"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));
}

View File

@ -0,0 +1,249 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODSettings.h"
#include "Misc/Paths.h"
#if WITH_EDITOR
#include "Settings/ProjectPackagingSettings.h"
#endif
#ifdef FMOD_PLATFORM_HEADER
#include "FMODPlatform.h"
#endif
//////////////////////////////////////////////////////////////////////////
// UPaperRuntimeSettings
inline EFMODPlatforms::Type CurrentPlatform()
{
EFMODPlatforms::Type platform;
#if defined(FMOD_PLATFORM_HEADER)
platform = FMODPlatform_CurrentPlatform();
#elif WITH_EDITOR
platform = EFMODPlatforms::Editor;
#elif PLATFORM_WINDOWS
platform = EFMODPlatforms::Windows;
#elif PLATFORM_LINUX
platform = EFMODPlatforms::Linux;
#elif PLATFORM_MAC
platform = EFMODPlatforms::Mac;
#elif PLATFORM_ANDROID
platform = EFMODPlatforms::Android;
#elif PLATFORM_IOS || PLATFORM_TVOS
platform = EFMODPlatforms::IOS;
#endif
return platform;
}
UFMODSettings::UFMODSettings(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
, bLoadAllBanks(true)
, bLoadAllSampleData(false)
, bEnableLiveUpdate(true)
, bEnableEditorLiveUpdate(false)
, OutputFormat(EFMODSpeakerMode::Surround_5_1)
, OutputType(EFMODOutput::TYPE_AUTODETECT)
, bVol0Virtual(true)
, Vol0VirtualLevel(0.001f)
, SampleRate(0)
, bMatchHardwareSampleRate(true)
, RealChannelCount(64)
, TotalChannelCount(512)
, DSPBufferLength(0)
, DSPBufferCount(0)
, FileBufferSize(2048)
, StudioUpdatePeriod(0)
, bLockAllBuses(false)
, LiveUpdatePort(9264)
, EditorLiveUpdatePort(9265)
, ReloadBanksDelay(5)
, bEnableAPIErrorLogging(false)
, bEnableMemoryTracking(false)
, ContentBrowserPrefix(TEXT("/Game/FMOD/"))
, MasterBankName(TEXT("Master"))
, LoggingLevel(LEVEL_WARNING)
{
BankOutputDirectory.Path = TEXT("FMOD");
}
FString UFMODSettings::GetFullBankPath() const
{
FString FullPath = BankOutputDirectory.Path;
if (FPaths::IsRelative(FullPath))
{
FullPath = FPaths::ProjectContentDir() / FullPath;
}
if (ForcePlatformName == TEXT("."))
{
// Leave path without subdirectory
}
else if (!ForcePlatformName.IsEmpty())
{
FullPath = FullPath / ForcePlatformName;
}
else
{
#ifdef FMOD_PLATFORM_HEADER
FString PlatformName = FMODPlatform_PlatformName();
#elif PLATFORM_IOS || PLATFORM_TVOS || PLATFORM_ANDROID
FString PlatformName = "Mobile";
#else
FString PlatformName = "Desktop";
#endif
FullPath = FullPath / PlatformName;
}
return FullPath;
}
FString UFMODSettings::GetMasterBankFilename() const
{
return MasterBankName + TEXT(".bank");
}
FString UFMODSettings::GetMasterAssetsBankFilename() const
{
return MasterBankName + TEXT(".assets.bank");
}
FString UFMODSettings::GetMasterStringsBankFilename() const
{
return MasterBankName + TEXT(".strings.bank");
}
FString UFMODSettings::GetFullContentPath() const
{
return ContentBrowserPrefix;
}
#if WITH_EDITOR
FString UFMODSettings::GetDesktopBankPath() const
{
FString Path = BankOutputDirectory.Path;
if (ForcePlatformName.IsEmpty())
{
Path = Path / "Desktop";
}
else if (ForcePlatformName != TEXT("."))
{
Path = Path / ForcePlatformName;
}
return Path;
}
UFMODSettings::EProblem UFMODSettings::Check() const
{
if (!IsBankPathSet())
{
return BankPathNotSet;
}
// Check packaging settings to ensure that only the correct bank output directory for desktop (or forced platform) banks is set-up for staging
FString DesktopBankPath = GetDesktopBankPath();
UProjectPackagingSettings* PackagingSettings = Cast<UProjectPackagingSettings>(UProjectPackagingSettings::StaticClass()->GetDefaultObject());
bool bCorrectPathAdded = false;
bool bOtherPathsAdded = false;
bool bAssetsToCookAdded = false;
for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Num(); ++i)
{
if (PackagingSettings->DirectoriesToAlwaysStageAsNonUFS[i].Path.StartsWith(BankOutputDirectory.Path))
{
if (PackagingSettings->DirectoriesToAlwaysStageAsNonUFS[i].Path == DesktopBankPath)
{
bCorrectPathAdded = true;
}
else
{
bOtherPathsAdded = true;
}
}
}
for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsUFS.Num(); ++i)
{
if (PackagingSettings->DirectoriesToAlwaysStageAsUFS[i].Path.StartsWith(BankOutputDirectory.Path))
{
bOtherPathsAdded = true;
break;
}
}
for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysCook.Num(); ++i)
{
if (PackagingSettings->DirectoriesToAlwaysCook[i].Path.StartsWith(GetFullContentPath()))
{
bAssetsToCookAdded = true;
break;
}
}
if (!bCorrectPathAdded || bOtherPathsAdded || !bAssetsToCookAdded)
{
return PackagingSettingsBad;
}
return Okay;
}
#endif // WITH_EDITOR
EFMODSpeakerMode::Type UFMODSettings::GetSpeakerMode() const
{
return Platforms.Contains(CurrentPlatform()) ? Platforms.Find(CurrentPlatform())->SpeakerMode : OutputFormat;
}
EFMODOutput::Type UFMODSettings::GetOutputType() const
{
return Platforms.Contains(CurrentPlatform()) ? Platforms.Find(CurrentPlatform())->OutputType : OutputType;
}
int32 UFMODSettings::GetSampleRate() const
{
return Platforms.Contains(CurrentPlatform()) ? Platforms.Find(CurrentPlatform())->SampleRate : SampleRate;
}
int32 UFMODSettings::GetMemoryPoolSize() const
{
return (Platforms.Contains(CurrentPlatform()) ? Platforms.Find(CurrentPlatform())->CustomPoolSize : 0);
}
int32 UFMODSettings::GetRealChannelCount() const
{
return Platforms.Contains(CurrentPlatform()) ? Platforms.Find(CurrentPlatform())->RealChannelCount : RealChannelCount;
}
bool UFMODSettings::SetCodecs(FMOD_ADVANCEDSETTINGS& advSettings) const
{
const FFMODPlatformSettings* platform = Platforms.Find(CurrentPlatform());
if (platform == nullptr)
{
return false;
}
TMap<TEnumAsByte<EFMODCodec::Type>, int32> codecList = platform->Codecs;
for (const TPair<TEnumAsByte<EFMODCodec::Type>, int32>& pair : codecList)
{
switch (pair.Key)
{
case EFMODCodec::XMA:
advSettings.maxXMACodecs = pair.Value;
break;
case EFMODCodec::AT9:
advSettings.maxAT9Codecs = pair.Value;
break;
case EFMODCodec::FADPCM:
advSettings.maxFADPCMCodecs = pair.Value;
break;
case EFMODCodec::OPUS:
advSettings.maxOpusCodecs = pair.Value;
break;
case EFMODCodec::VORBIS:
default:
advSettings.maxVorbisCodecs = pair.Value;
break;
}
}
return true;
}

View File

@ -0,0 +1,14 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODSnapshot.h"
#include "FMODStudioModule.h"
UFMODSnapshot::UFMODSnapshot(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
FString UFMODSnapshot::GetDesc()
{
return FString::Printf(TEXT("Snapshot %s"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));
}

View File

@ -0,0 +1,19 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODSnapshotReverb.h"
UFMODSnapshotReverb::UFMODSnapshotReverb(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
bool UFMODSnapshotReverb::IsAsset() const
{
return this != GetClass()->GetDefaultObject();
}
#if WITH_EDITORONLY_DATA
void UFMODSnapshotReverb::PostEditChangeProperty(FPropertyChangedEvent &PropertyChangedEvent)
{
}
#endif // EDITORONLY_DATA

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,9 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Components/SceneComponent.h"
#include "Runtime/Launch/Resources/Version.h"
DECLARE_LOG_CATEGORY_EXTERN(LogFMOD, Log, All);

View File

@ -0,0 +1,20 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODVCA.h"
#include "FMODStudioModule.h"
UFMODVCA::UFMODVCA(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
}
/** Get tags to show in content view */
void UFMODVCA::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const
{
Super::GetAssetRegistryTags(OutTags);
}
FString UFMODVCA::GetDesc()
{
return FString::Printf(TEXT("VCA %s"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));
}

View File

@ -0,0 +1,45 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEventControlSection.h"
#include "Channels/MovieSceneChannelProxy.h"
#include "UObject/SequencerObjectVersion.h"
#include "UObject/Package.h"
FFMODEventControlChannel::FFMODEventControlChannel()
{
SetEnum(StaticEnum<EFMODEventControlKey>());
}
UFMODEventControlSection::UFMODEventControlSection(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
SetRange(TRange<FFrameNumber>::All());
int32 LinkerCustomVersion = GetLinkerCustomVersion(FSequencerObjectVersion::GUID);
EMovieSceneCompletionMode CompletionMode;
if (LinkerCustomVersion < FSequencerObjectVersion::WhenFinishedDefaultsToRestoreState)
{
CompletionMode = EMovieSceneCompletionMode::KeepState;
}
else if (LinkerCustomVersion < FSequencerObjectVersion::WhenFinishedDefaultsToProjectDefault)
{
CompletionMode = EMovieSceneCompletionMode::RestoreState;
}
else
{
CompletionMode = EMovieSceneCompletionMode::ProjectDefault;
}
EvalOptions.EnableAndSetCompletionMode(CompletionMode);
#if WITH_EDITOR
ChannelProxy = MakeShared<FMovieSceneChannelProxy>(ControlKeys, FMovieSceneChannelMetaData(), TMovieSceneExternalValue<uint8>());
#else
ChannelProxy = MakeShared<FMovieSceneChannelProxy>(ControlKeys);
#endif
}

View File

@ -0,0 +1,80 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Curves/KeyHandle.h"
#include "MovieSceneClipboard.h"
#include "MovieSceneSection.h"
#include "Channels/MovieSceneByteChannel.h"
#include "FMODEventControlSection.generated.h"
/** Defines the types of FMOD event control keys. */
UENUM()
enum class EFMODEventControlKey : uint8
{
Stop = 0,
Play = 1
};
USTRUCT()
struct FFMODEventControlChannel : public FMovieSceneByteChannel
{
GENERATED_BODY()
FFMODEventControlChannel();
};
template <>
struct TStructOpsTypeTraits<FFMODEventControlChannel> : public TStructOpsTypeTraitsBase2<FFMODEventControlChannel>
{
enum { WithStructuredSerializeFromMismatchedTag = true };
};
template <>
struct TMovieSceneChannelTraits<FFMODEventControlChannel> : TMovieSceneChannelTraitsBase<FFMODEventControlChannel>
{
enum { SupportsDefaults = false };
#if WITH_EDITOR
/** Byte channels can have external values (ie, they can get their values from external objects for UI purposes) */
typedef TMovieSceneExternalValue<uint8> ExtendedEditorDataType;
#endif
};
/** FMOD Event control section */
UCLASS(MinimalAPI)
class UFMODEventControlSection : public UMovieSceneSection
{
GENERATED_UCLASS_BODY()
public:
/** Channel containing the event control keys */
UPROPERTY()
FFMODEventControlChannel ControlKeys;
};
inline void AssignValue(FFMODEventControlChannel *InChannel, FKeyHandle InKeyHandle, EFMODEventControlKey InValue)
{
TMovieSceneChannelData<uint8> ChannelData = InChannel->GetData();
int32 ValueIndex = ChannelData.GetIndex(InKeyHandle);
if (ValueIndex != INDEX_NONE)
{
ChannelData.GetValues()[ValueIndex] = (uint8)InValue;
}
}
inline bool EvaluateChannel(const FFMODEventControlChannel *InChannel, FFrameTime InTime, EFMODEventControlKey &OutValue)
{
uint8 RawValue = 0;
if (InChannel->Evaluate(InTime, RawValue))
{
OutValue = (EFMODEventControlKey)RawValue;
return true;
}
return false;
}

View File

@ -0,0 +1,139 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEventControlSectionTemplate.h"
#include "FMODAmbientSound.h"
#include "FMODAudioComponent.h"
#include "Evaluation/MovieSceneEvaluation.h"
#include "IMovieScenePlayer.h"
struct FPlayingToken : IMovieScenePreAnimatedToken
{
FPlayingToken(UObject &InObject)
{
bPlaying = false;
if (UFMODAudioComponent *AudioComponent = Cast<UFMODAudioComponent>(&InObject))
{
if (IsValid(AudioComponent))
{
bPlaying = AudioComponent->IsPlaying();
}
}
}
virtual void RestoreState(UObject &Object, const UE::MovieScene::FRestoreStateParams& Params) override
{
UFMODAudioComponent *AudioComponent = CastChecked<UFMODAudioComponent>(&Object);
if (AudioComponent)
{
if (bPlaying)
{
AudioComponent->Play();
}
else
{
AudioComponent->Stop();
}
}
}
private:
bool bPlaying;
};
struct FPlayingTokenProducer : IMovieScenePreAnimatedTokenProducer
{
static FMovieSceneAnimTypeID GetAnimTypeID() { return TMovieSceneAnimTypeID<FPlayingTokenProducer>(); }
private:
virtual IMovieScenePreAnimatedTokenPtr CacheExistingState(UObject &Object) const override { return FPlayingToken(Object); }
};
struct FFMODEventKeyState : IPersistentEvaluationData
{
FKeyHandle LastKeyHandle;
FKeyHandle InvalidKeyHandle;
};
struct FFMODEventControlExecutionToken : IMovieSceneExecutionToken
{
FFMODEventControlExecutionToken(EFMODEventControlKey InEventControlKey, FFrameTime InKeyTime)
: EventControlKey(InEventControlKey)
, KeyTime(InKeyTime)
{
}
/** Execute this token, operating on all objects referenced by 'Operand' */
virtual void Execute(const FMovieSceneContext &Context, const FMovieSceneEvaluationOperand &Operand, FPersistentEvaluationData &PersistentData,
IMovieScenePlayer &Player)
{
for (TWeakObjectPtr<> &WeakObject : Player.FindBoundObjects(Operand))
{
UFMODAudioComponent *AudioComponent = Cast<UFMODAudioComponent>(WeakObject.Get());
if (!AudioComponent)
{
AFMODAmbientSound *AmbientSound = Cast<AFMODAmbientSound>(WeakObject.Get());
AudioComponent = AmbientSound ? AmbientSound->AudioComponent : nullptr;
}
if (IsValid(AudioComponent))
{
Player.SavePreAnimatedState(*AudioComponent, FPlayingTokenProducer::GetAnimTypeID(), FPlayingTokenProducer());
if (EventControlKey == EFMODEventControlKey::Play)
{
if (AudioComponent->IsPlaying())
{
AudioComponent->Stop();
}
EFMODSystemContext::Type SystemContext =
(GWorld && GWorld->WorldType == EWorldType::Editor) ? EFMODSystemContext::Editor : EFMODSystemContext::Runtime;
AudioComponent->PlayInternal(SystemContext);
}
else if (EventControlKey == EFMODEventControlKey::Stop)
{
AudioComponent->Stop();
}
}
}
}
EFMODEventControlKey EventControlKey;
FFrameTime KeyTime;
};
FFMODEventControlSectionTemplate::FFMODEventControlSectionTemplate(const UFMODEventControlSection &Section)
: ControlKeys(Section.ControlKeys)
{
}
void FFMODEventControlSectionTemplate::Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,
const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const
{
const bool bPlaying = Context.IsSilent() == false && Context.GetDirection() == EPlayDirection::Forwards &&
Context.GetRange().Size<FFrameTime>() >= FFrameTime(0) && Context.GetStatus() == EMovieScenePlayerStatus::Playing;
if (!bPlaying)
{
ExecutionTokens.Add(FFMODEventControlExecutionToken(EFMODEventControlKey::Stop, FFrameTime(0)));
}
else
{
TRange<FFrameNumber> PlaybackRange = Context.GetFrameNumberRange();
TMovieSceneChannelData<const uint8> ChannelData = ControlKeys.GetData();
// Find the index of the key handle that exists before this time
TArrayView<const FFrameNumber> Times = ChannelData.GetTimes();
TArrayView<const uint8> Values = ChannelData.GetValues();
const int32 LastKeyIndex = Algo::UpperBound(Times, PlaybackRange.GetUpperBoundValue()) - 1;
if (LastKeyIndex >= 0 && PlaybackRange.Contains(Times[LastKeyIndex]))
{
FFMODEventControlExecutionToken NewToken((EFMODEventControlKey)Values[LastKeyIndex], Times[LastKeyIndex]);
ExecutionTokens.Add(MoveTemp(NewToken));
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Evaluation/MovieSceneEvalTemplate.h"
#include "FMODEventControlSection.h"
#include "FMODEventControlSectionTemplate.generated.h"
USTRUCT()
struct FFMODEventControlSectionTemplate : public FMovieSceneEvalTemplate
{
GENERATED_BODY()
FFMODEventControlSectionTemplate() {}
FFMODEventControlSectionTemplate(const UFMODEventControlSection &Section);
UPROPERTY()
FFMODEventControlChannel ControlKeys;
private:
virtual UScriptStruct &GetScriptStructImpl() const override { return *StaticStruct(); }
virtual void Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,
const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const override;
};

View File

@ -0,0 +1,75 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEventControlTrack.h"
#include "FMODEventControlSection.h"
#include "IMovieScenePlayer.h"
#include "FMODEventControlSectionTemplate.h"
#include "MovieSceneCommonHelpers.h"
#define LOCTEXT_NAMESPACE "FMODEventControlTrack"
UFMODEventControlTrack::UFMODEventControlTrack(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
#if WITH_EDITORONLY_DATA
TrackTint = FColor(255, 255, 255, 160);
#endif
}
const TArray<UMovieSceneSection *> &UFMODEventControlTrack::GetAllSections() const
{
return ControlSections;
}
bool UFMODEventControlTrack::HasSection(const UMovieSceneSection &Section) const
{
return ControlSections.Contains(&Section);
}
void UFMODEventControlTrack::AddSection(UMovieSceneSection &Section)
{
ControlSections.Add(&Section);
}
void UFMODEventControlTrack::RemoveSection(UMovieSceneSection &Section)
{
ControlSections.Remove(&Section);
}
bool UFMODEventControlTrack::IsEmpty() const
{
return ControlSections.Num() == 0;
}
void UFMODEventControlTrack::AddNewSection(FFrameNumber SectionTime)
{
if (MovieSceneHelpers::FindSectionAtTime(ControlSections, SectionTime) == nullptr)
{
UFMODEventControlSection *NewSection = Cast<UFMODEventControlSection>(CreateNewSection());
ControlSections.Add(NewSection);
}
}
bool UFMODEventControlTrack::SupportsType(TSubclassOf<UMovieSceneSection> SectionClass) const
{
return SectionClass == UFMODEventControlSection::StaticClass();
}
UMovieSceneSection *UFMODEventControlTrack::CreateNewSection()
{
return NewObject<UFMODEventControlSection>(this);
}
FMovieSceneEvalTemplatePtr UFMODEventControlTrack::CreateTemplateForSection(const UMovieSceneSection& InSection) const
{
return FFMODEventControlSectionTemplate(*CastChecked<const UFMODEventControlSection>(&InSection));
}
#if WITH_EDITORONLY_DATA
FText UFMODEventControlTrack::GetDefaultDisplayName() const
{
return LOCTEXT("DisplayName", "FMOD Event");
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,43 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "MovieSceneNameableTrack.h"
#include "Compilation/IMovieSceneTrackTemplateProducer.h"
#include "FMODEventControlTrack.generated.h"
/** Handles control of an FMOD Event */
UCLASS(MinimalAPI)
class UFMODEventControlTrack : public UMovieSceneNameableTrack, public IMovieSceneTrackTemplateProducer
{
GENERATED_UCLASS_BODY()
public:
virtual TArray<UMovieSceneSection *> GetAllControlSections() const { return ControlSections; }
public:
// Begin UMovieSceneTrack interface
virtual bool HasSection(const UMovieSceneSection &Section) const override;
virtual void AddSection(UMovieSceneSection &Section) override;
virtual void RemoveSection(UMovieSceneSection &Section) override;
virtual bool IsEmpty() const override;
virtual const TArray<UMovieSceneSection *> &GetAllSections() const override;
virtual void AddNewSection(FFrameNumber SectionTime);
virtual bool SupportsType(TSubclassOf<UMovieSceneSection> SectionClass) const override;
virtual UMovieSceneSection *CreateNewSection() override;
// End UMovieSceneTrack interface
// IMovieSceneTrackTemplateProducer interface
virtual FMovieSceneEvalTemplatePtr CreateTemplateForSection(const UMovieSceneSection& InSection) const override;
#if WITH_EDITORONLY_DATA
virtual FText GetDefaultDisplayName() const override;
#endif
private:
/** List of all event control sections. */
UPROPERTY()
TArray<UMovieSceneSection *> ControlSections;
};

View File

@ -0,0 +1,109 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2017.
#include "FMODEventParameterSectionTemplate.h"
#include "FMODAmbientSound.h"
#include "FMODEvent.h"
#include "FMODEventParameterTrack.h"
#include "IMovieScenePlayer.h"
#include "fmod_studio.hpp"
struct FFMODEventParameterPreAnimatedToken : IMovieScenePreAnimatedToken
{
FFMODEventParameterPreAnimatedToken() {}
FFMODEventParameterPreAnimatedToken(FFMODEventParameterPreAnimatedToken &&) = default;
FFMODEventParameterPreAnimatedToken &operator=(FFMODEventParameterPreAnimatedToken &&) = default;
virtual void RestoreState(UObject &Object, const UE::MovieScene::FRestoreStateParams& Params) override
{
UFMODAudioComponent *AudioComponent = CastChecked<UFMODAudioComponent>(&Object);
if (IsValid(AudioComponent))
{
for (FScalarParameterNameAndValue &Value : Values)
{
AudioComponent->SetParameter(Value.ParameterName, Value.Value);
}
}
}
TArray<FScalarParameterNameAndValue> Values;
};
struct FFMODEventParameterPreAnimatedTokenProducer : IMovieScenePreAnimatedTokenProducer
{
virtual IMovieScenePreAnimatedTokenPtr CacheExistingState(UObject &Object) const override
{
UFMODAudioComponent *AudioComponent = CastChecked<UFMODAudioComponent>(&Object);
FFMODEventParameterPreAnimatedToken Token;
if (IsValid(AudioComponent) && AudioComponent->Event)
{
TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> ParameterDescriptions;
AudioComponent->Event->GetParameterDescriptions(ParameterDescriptions);
for (const FMOD_STUDIO_PARAMETER_DESCRIPTION &ParameterDescription : ParameterDescriptions)
{
float Value = AudioComponent->GetParameter(ParameterDescription.name);
Token.Values.Add(FScalarParameterNameAndValue(ParameterDescription.name, Value));
}
}
return MoveTemp(Token);
}
};
struct FFMODEventParameterExecutionToken : IMovieSceneExecutionToken
{
FFMODEventParameterExecutionToken() = default;
FFMODEventParameterExecutionToken(FFMODEventParameterExecutionToken &&) = default;
FFMODEventParameterExecutionToken &operator=(FFMODEventParameterExecutionToken &&) = default;
// Non-copyable
FFMODEventParameterExecutionToken(const FFMODEventParameterExecutionToken &) = delete;
FFMODEventParameterExecutionToken &operator=(const FFMODEventParameterExecutionToken &) = delete;
virtual void Execute(const FMovieSceneContext &Context, const FMovieSceneEvaluationOperand &Operand, FPersistentEvaluationData &PersistentData,
IMovieScenePlayer &Player)
{
for (TWeakObjectPtr<> &WeakObject : Player.FindBoundObjects(Operand))
{
UFMODAudioComponent *AudioComponent = Cast<UFMODAudioComponent>(WeakObject.Get());
if (!AudioComponent)
{
AFMODAmbientSound *AmbientSound = Cast<AFMODAmbientSound>(WeakObject.Get());
AudioComponent = AmbientSound ? AmbientSound->AudioComponent : nullptr;
}
if (IsValid(AudioComponent))
{
Player.SavePreAnimatedState(
*AudioComponent, TMovieSceneAnimTypeID<FFMODEventParameterExecutionToken>(), FFMODEventParameterPreAnimatedTokenProducer());
for (const FScalarParameterNameAndValue &NameAndValue : Values.ScalarValues)
{
AudioComponent->SetParameter(NameAndValue.ParameterName, NameAndValue.Value);
}
}
}
}
FEvaluatedParameterSectionValues Values;
};
FFMODEventParameterSectionTemplate::FFMODEventParameterSectionTemplate(
const UMovieSceneParameterSection &Section, const UFMODEventParameterTrack &Track)
: FMovieSceneParameterSectionTemplate(Section)
{
}
void FFMODEventParameterSectionTemplate::Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,
const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const
{
FFMODEventParameterExecutionToken ExecutionToken;
EvaluateCurves(Context, ExecutionToken.Values);
ExecutionTokens.Add(MoveTemp(ExecutionToken));
}

View File

@ -0,0 +1,24 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Evaluation/MovieSceneParameterTemplate.h"
#include "FMODEventParameterSectionTemplate.generated.h"
class UFMODEventParameterTrack;
USTRUCT()
struct FFMODEventParameterSectionTemplate : public FMovieSceneParameterSectionTemplate
{
GENERATED_BODY()
FFMODEventParameterSectionTemplate() {}
FFMODEventParameterSectionTemplate(const UMovieSceneParameterSection &Section, const UFMODEventParameterTrack &Track);
private:
virtual UScriptStruct &GetScriptStructImpl() const override { return *StaticStruct(); }
virtual void Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,
const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const override;
};

View File

@ -0,0 +1,77 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEventParameterTrack.h"
#include "FMODEventParameterSectionTemplate.h"
#include "IMovieScenePlayer.h"
#include "MovieSceneCommonHelpers.h"
#define LOCTEXT_NAMESPACE "FMODEventParameterTrack"
UFMODEventParameterTrack::UFMODEventParameterTrack(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
#if WITH_EDITORONLY_DATA
TrackTint = FColor(0, 170, 255, 65);
#endif
}
FMovieSceneEvalTemplatePtr UFMODEventParameterTrack::CreateTemplateForSection(const UMovieSceneSection &InSection) const
{
return FFMODEventParameterSectionTemplate(*CastChecked<UMovieSceneParameterSection>(&InSection), *this);
}
UMovieSceneSection *UFMODEventParameterTrack::CreateNewSection()
{
return NewObject<UMovieSceneParameterSection>(this, UMovieSceneParameterSection::StaticClass(), NAME_None, RF_Transactional);
}
void UFMODEventParameterTrack::RemoveAllAnimationData()
{
Sections.Empty();
}
bool UFMODEventParameterTrack::HasSection(const UMovieSceneSection &Section) const
{
return Sections.Contains(&Section);
}
void UFMODEventParameterTrack::AddSection(UMovieSceneSection &Section)
{
Sections.Add(&Section);
}
void UFMODEventParameterTrack::RemoveSection(UMovieSceneSection &Section)
{
Sections.Remove(&Section);
}
bool UFMODEventParameterTrack::IsEmpty() const
{
return Sections.Num() == 0;
}
const TArray<UMovieSceneSection *> &UFMODEventParameterTrack::GetAllSections() const
{
return Sections;
}
#if WITH_EDITORONLY_DATA
FText UFMODEventParameterTrack::GetDefaultDisplayName() const
{
return LOCTEXT("DisplayName", "FMOD Event Parameter");
}
#endif
void UFMODEventParameterTrack::AddParameterKey(FName ParameterName, FFrameNumber Time, float Value)
{
UMovieSceneParameterSection *NearestSection = Cast<UMovieSceneParameterSection>(MovieSceneHelpers::FindNearestSectionAtTime(Sections, Time));
if (NearestSection == nullptr)
{
NearestSection = Cast<UMovieSceneParameterSection>(CreateNewSection());
NearestSection->SetRange(TRange<FFrameNumber>::Inclusive(Time, Time));
Sections.Add(NearestSection);
}
NearestSection->AddScalarParameterKey(ParameterName, Time, Value);
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,45 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Sections/MovieSceneParameterSection.h"
#include "MovieSceneNameableTrack.h"
#include "Compilation/IMovieSceneTrackTemplateProducer.h"
#include "FMODEventParameterTrack.generated.h"
/** Handles manipulation of event parameters in a movie scene. */
UCLASS(MinimalAPI)
class UFMODEventParameterTrack : public UMovieSceneNameableTrack, public IMovieSceneTrackTemplateProducer
{
GENERATED_UCLASS_BODY()
public:
// UMovieSceneTrack interface
virtual UMovieSceneSection *CreateNewSection() override;
virtual void RemoveAllAnimationData() override;
virtual bool HasSection(const UMovieSceneSection &Section) const override;
virtual void AddSection(UMovieSceneSection &Section) override;
virtual void RemoveSection(UMovieSceneSection &Section) override;
virtual bool IsEmpty() const override;
virtual const TArray<UMovieSceneSection *> &GetAllSections() const override;
// ~IMovieSceneTrackTemplateProducer interface
virtual FMovieSceneEvalTemplatePtr CreateTemplateForSection(const UMovieSceneSection &InSection) const override;
// End UMovieSceneTrack interface
#if WITH_EDITORONLY_DATA
virtual FText GetDefaultDisplayName() const override;
#endif
public:
/** Adds a (scalar) event parameter key to the track. */
void FMODSTUDIO_API AddParameterKey(FName ParameterName, FFrameNumber Time, float Value);
private:
/** The sections owned by this track. */
UPROPERTY()
TArray<UMovieSceneSection *> Sections;
};

View File

@ -0,0 +1,668 @@
/* ======================================================================================== */
/* FMOD Core API - C header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_common.h (which contains all the constants / */
/* callbacks) to develop using the C interface */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api.html */
/* ======================================================================================== */
#ifndef _FMOD_H
#define _FMOD_H
#include "fmod_common.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*
FMOD global system functions (optional).
*/
FMOD_RESULT F_API FMOD_Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags);
FMOD_RESULT F_API FMOD_Memory_GetStats (int *currentalloced, int *maxalloced, FMOD_BOOL blocking);
FMOD_RESULT F_API FMOD_Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode, FMOD_DEBUG_CALLBACK callback, const char *filename);
FMOD_RESULT F_API FMOD_File_SetDiskBusy (int busy);
FMOD_RESULT F_API FMOD_File_GetDiskBusy (int *busy);
FMOD_RESULT F_API FMOD_Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity, FMOD_THREAD_PRIORITY priority, FMOD_THREAD_STACK_SIZE stacksize);
/*
FMOD System factory functions. Use this to create an FMOD System Instance. below you will see FMOD_System_Init/Close to get started.
*/
FMOD_RESULT F_API FMOD_System_Create (FMOD_SYSTEM **system, unsigned int headerversion);
FMOD_RESULT F_API FMOD_System_Release (FMOD_SYSTEM *system);
/*
'System' API
*/
/* Setup functions. */
FMOD_RESULT F_API FMOD_System_SetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE output);
FMOD_RESULT F_API FMOD_System_GetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE *output);
FMOD_RESULT F_API FMOD_System_GetNumDrivers (FMOD_SYSTEM *system, int *numdrivers);
FMOD_RESULT F_API FMOD_System_GetDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);
FMOD_RESULT F_API FMOD_System_SetDriver (FMOD_SYSTEM *system, int driver);
FMOD_RESULT F_API FMOD_System_GetDriver (FMOD_SYSTEM *system, int *driver);
FMOD_RESULT F_API FMOD_System_SetSoftwareChannels (FMOD_SYSTEM *system, int numsoftwarechannels);
FMOD_RESULT F_API FMOD_System_GetSoftwareChannels (FMOD_SYSTEM *system, int *numsoftwarechannels);
FMOD_RESULT F_API FMOD_System_SetSoftwareFormat (FMOD_SYSTEM *system, int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers);
FMOD_RESULT F_API FMOD_System_GetSoftwareFormat (FMOD_SYSTEM *system, int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers);
FMOD_RESULT F_API FMOD_System_SetDSPBufferSize (FMOD_SYSTEM *system, unsigned int bufferlength, int numbuffers);
FMOD_RESULT F_API FMOD_System_GetDSPBufferSize (FMOD_SYSTEM *system, unsigned int *bufferlength, int *numbuffers);
FMOD_RESULT F_API FMOD_System_SetFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign);
FMOD_RESULT F_API FMOD_System_AttachFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek);
FMOD_RESULT F_API FMOD_System_SetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_System_GetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_System_SetCallback (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask);
/* Plug-in support. */
FMOD_RESULT F_API FMOD_System_SetPluginPath (FMOD_SYSTEM *system, const char *path);
FMOD_RESULT F_API FMOD_System_LoadPlugin (FMOD_SYSTEM *system, const char *filename, unsigned int *handle, unsigned int priority);
FMOD_RESULT F_API FMOD_System_UnloadPlugin (FMOD_SYSTEM *system, unsigned int handle);
FMOD_RESULT F_API FMOD_System_GetNumNestedPlugins (FMOD_SYSTEM *system, unsigned int handle, int *count);
FMOD_RESULT F_API FMOD_System_GetNestedPlugin (FMOD_SYSTEM *system, unsigned int handle, int index, unsigned int *nestedhandle);
FMOD_RESULT F_API FMOD_System_GetNumPlugins (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int *numplugins);
FMOD_RESULT F_API FMOD_System_GetPluginHandle (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle);
FMOD_RESULT F_API FMOD_System_GetPluginInfo (FMOD_SYSTEM *system, unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version);
FMOD_RESULT F_API FMOD_System_SetOutputByPlugin (FMOD_SYSTEM *system, unsigned int handle);
FMOD_RESULT F_API FMOD_System_GetOutputByPlugin (FMOD_SYSTEM *system, unsigned int *handle);
FMOD_RESULT F_API FMOD_System_CreateDSPByPlugin (FMOD_SYSTEM *system, unsigned int handle, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_System_GetDSPInfoByPlugin (FMOD_SYSTEM *system, unsigned int handle, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API FMOD_System_RegisterCodec (FMOD_SYSTEM *system, FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority);
FMOD_RESULT F_API FMOD_System_RegisterDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, unsigned int *handle);
FMOD_RESULT F_API FMOD_System_RegisterOutput (FMOD_SYSTEM *system, const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle);
/* Init/Close. */
FMOD_RESULT F_API FMOD_System_Init (FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API FMOD_System_Close (FMOD_SYSTEM *system);
/* General post-init system functions. */
FMOD_RESULT F_API FMOD_System_Update (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_SetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float x, float y, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_System_GetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float *x, float *y, FMOD_BOOL *active);
FMOD_RESULT F_API FMOD_System_SetStreamBufferSize (FMOD_SYSTEM *system, unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype);
FMOD_RESULT F_API FMOD_System_GetStreamBufferSize (FMOD_SYSTEM *system, unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype);
FMOD_RESULT F_API FMOD_System_Set3DSettings (FMOD_SYSTEM *system, float dopplerscale, float distancefactor, float rolloffscale);
FMOD_RESULT F_API FMOD_System_Get3DSettings (FMOD_SYSTEM *system, float *dopplerscale, float *distancefactor, float *rolloffscale);
FMOD_RESULT F_API FMOD_System_Set3DNumListeners (FMOD_SYSTEM *system, int numlisteners);
FMOD_RESULT F_API FMOD_System_Get3DNumListeners (FMOD_SYSTEM *system, int *numlisteners);
FMOD_RESULT F_API FMOD_System_Set3DListenerAttributes (FMOD_SYSTEM *system, int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_System_Get3DListenerAttributes (FMOD_SYSTEM *system, int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_System_Set3DRolloffCallback (FMOD_SYSTEM *system, FMOD_3D_ROLLOFF_CALLBACK callback);
FMOD_RESULT F_API FMOD_System_MixerSuspend (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_MixerResume (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_GetDefaultMixMatrix (FMOD_SYSTEM *system, FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop);
FMOD_RESULT F_API FMOD_System_GetSpeakerModeChannels (FMOD_SYSTEM *system, FMOD_SPEAKERMODE mode, int *channels);
/* System information functions. */
FMOD_RESULT F_API FMOD_System_GetVersion (FMOD_SYSTEM *system, unsigned int *version);
FMOD_RESULT F_API FMOD_System_GetOutputHandle (FMOD_SYSTEM *system, void **handle);
FMOD_RESULT F_API FMOD_System_GetChannelsPlaying (FMOD_SYSTEM *system, int *channels, int *realchannels);
FMOD_RESULT F_API FMOD_System_GetCPUUsage (FMOD_SYSTEM *system, FMOD_CPU_USAGE *usage);
FMOD_RESULT F_API FMOD_System_GetFileUsage (FMOD_SYSTEM *system, long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead);
/* Sound/DSP/Channel/FX creation and retrieval. */
FMOD_RESULT F_API FMOD_System_CreateSound (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_System_CreateStream (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_System_CreateDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_System_CreateDSPByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_System_CreateChannelGroup (FMOD_SYSTEM *system, const char *name, FMOD_CHANNELGROUP **channelgroup);
FMOD_RESULT F_API FMOD_System_CreateSoundGroup (FMOD_SYSTEM *system, const char *name, FMOD_SOUNDGROUP **soundgroup);
FMOD_RESULT F_API FMOD_System_CreateReverb3D (FMOD_SYSTEM *system, FMOD_REVERB3D **reverb);
FMOD_RESULT F_API FMOD_System_PlaySound (FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel);
FMOD_RESULT F_API FMOD_System_PlayDSP (FMOD_SYSTEM *system, FMOD_DSP *dsp, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel);
FMOD_RESULT F_API FMOD_System_GetChannel (FMOD_SYSTEM *system, int channelid, FMOD_CHANNEL **channel);
FMOD_RESULT F_API FMOD_System_GetDSPInfoByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API FMOD_System_GetMasterChannelGroup (FMOD_SYSTEM *system, FMOD_CHANNELGROUP **channelgroup);
FMOD_RESULT F_API FMOD_System_GetMasterSoundGroup (FMOD_SYSTEM *system, FMOD_SOUNDGROUP **soundgroup);
/* Routing to ports. */
FMOD_RESULT F_API FMOD_System_AttachChannelGroupToPort (FMOD_SYSTEM *system, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL passThru);
FMOD_RESULT F_API FMOD_System_DetachChannelGroupFromPort(FMOD_SYSTEM *system, FMOD_CHANNELGROUP *channelgroup);
/* Reverb API. */
FMOD_RESULT F_API FMOD_System_SetReverbProperties (FMOD_SYSTEM *system, int instance, const FMOD_REVERB_PROPERTIES *prop);
FMOD_RESULT F_API FMOD_System_GetReverbProperties (FMOD_SYSTEM *system, int instance, FMOD_REVERB_PROPERTIES *prop);
/* System level DSP functionality. */
FMOD_RESULT F_API FMOD_System_LockDSP (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_UnlockDSP (FMOD_SYSTEM *system);
/* Recording API. */
FMOD_RESULT F_API FMOD_System_GetRecordNumDrivers (FMOD_SYSTEM *system, int *numdrivers, int *numconnected);
FMOD_RESULT F_API FMOD_System_GetRecordDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state);
FMOD_RESULT F_API FMOD_System_GetRecordPosition (FMOD_SYSTEM *system, int id, unsigned int *position);
FMOD_RESULT F_API FMOD_System_RecordStart (FMOD_SYSTEM *system, int id, FMOD_SOUND *sound, FMOD_BOOL loop);
FMOD_RESULT F_API FMOD_System_RecordStop (FMOD_SYSTEM *system, int id);
FMOD_RESULT F_API FMOD_System_IsRecording (FMOD_SYSTEM *system, int id, FMOD_BOOL *recording);
/* Geometry API. */
FMOD_RESULT F_API FMOD_System_CreateGeometry (FMOD_SYSTEM *system, int maxpolygons, int maxvertices, FMOD_GEOMETRY **geometry);
FMOD_RESULT F_API FMOD_System_SetGeometrySettings (FMOD_SYSTEM *system, float maxworldsize);
FMOD_RESULT F_API FMOD_System_GetGeometrySettings (FMOD_SYSTEM *system, float *maxworldsize);
FMOD_RESULT F_API FMOD_System_LoadGeometry (FMOD_SYSTEM *system, const void *data, int datasize, FMOD_GEOMETRY **geometry);
FMOD_RESULT F_API FMOD_System_GetGeometryOcclusion (FMOD_SYSTEM *system, const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb);
/* Network functions. */
FMOD_RESULT F_API FMOD_System_SetNetworkProxy (FMOD_SYSTEM *system, const char *proxy);
FMOD_RESULT F_API FMOD_System_GetNetworkProxy (FMOD_SYSTEM *system, char *proxy, int proxylen);
FMOD_RESULT F_API FMOD_System_SetNetworkTimeout (FMOD_SYSTEM *system, int timeout);
FMOD_RESULT F_API FMOD_System_GetNetworkTimeout (FMOD_SYSTEM *system, int *timeout);
/* Userdata set/get. */
FMOD_RESULT F_API FMOD_System_SetUserData (FMOD_SYSTEM *system, void *userdata);
FMOD_RESULT F_API FMOD_System_GetUserData (FMOD_SYSTEM *system, void **userdata);
/* Sound API
*/
FMOD_RESULT F_API FMOD_Sound_Release (FMOD_SOUND *sound);
FMOD_RESULT F_API FMOD_Sound_GetSystemObject (FMOD_SOUND *sound, FMOD_SYSTEM **system);
/*
Standard sound manipulation functions.
*/
FMOD_RESULT F_API FMOD_Sound_Lock (FMOD_SOUND *sound, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);
FMOD_RESULT F_API FMOD_Sound_Unlock (FMOD_SOUND *sound, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);
FMOD_RESULT F_API FMOD_Sound_SetDefaults (FMOD_SOUND *sound, float frequency, int priority);
FMOD_RESULT F_API FMOD_Sound_GetDefaults (FMOD_SOUND *sound, float *frequency, int *priority);
FMOD_RESULT F_API FMOD_Sound_Set3DMinMaxDistance (FMOD_SOUND *sound, float min, float max);
FMOD_RESULT F_API FMOD_Sound_Get3DMinMaxDistance (FMOD_SOUND *sound, float *min, float *max);
FMOD_RESULT F_API FMOD_Sound_Set3DConeSettings (FMOD_SOUND *sound, float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API FMOD_Sound_Get3DConeSettings (FMOD_SOUND *sound, float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API FMOD_Sound_Set3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API FMOD_Sound_Get3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API FMOD_Sound_GetSubSound (FMOD_SOUND *sound, int index, FMOD_SOUND **subsound);
FMOD_RESULT F_API FMOD_Sound_GetSubSoundParent (FMOD_SOUND *sound, FMOD_SOUND **parentsound);
FMOD_RESULT F_API FMOD_Sound_GetName (FMOD_SOUND *sound, char *name, int namelen);
FMOD_RESULT F_API FMOD_Sound_GetLength (FMOD_SOUND *sound, unsigned int *length, FMOD_TIMEUNIT lengthtype);
FMOD_RESULT F_API FMOD_Sound_GetFormat (FMOD_SOUND *sound, FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits);
FMOD_RESULT F_API FMOD_Sound_GetNumSubSounds (FMOD_SOUND *sound, int *numsubsounds);
FMOD_RESULT F_API FMOD_Sound_GetNumTags (FMOD_SOUND *sound, int *numtags, int *numtagsupdated);
FMOD_RESULT F_API FMOD_Sound_GetTag (FMOD_SOUND *sound, const char *name, int index, FMOD_TAG *tag);
FMOD_RESULT F_API FMOD_Sound_GetOpenState (FMOD_SOUND *sound, FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, FMOD_BOOL *starving, FMOD_BOOL *diskbusy);
FMOD_RESULT F_API FMOD_Sound_ReadData (FMOD_SOUND *sound, void *buffer, unsigned int length, unsigned int *read);
FMOD_RESULT F_API FMOD_Sound_SeekData (FMOD_SOUND *sound, unsigned int pcm);
FMOD_RESULT F_API FMOD_Sound_SetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP *soundgroup);
FMOD_RESULT F_API FMOD_Sound_GetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP **soundgroup);
/*
Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks.
*/
FMOD_RESULT F_API FMOD_Sound_GetNumSyncPoints (FMOD_SOUND *sound, int *numsyncpoints);
FMOD_RESULT F_API FMOD_Sound_GetSyncPoint (FMOD_SOUND *sound, int index, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API FMOD_Sound_GetSyncPointInfo (FMOD_SOUND *sound, FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype);
FMOD_RESULT F_API FMOD_Sound_AddSyncPoint (FMOD_SOUND *sound, unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API FMOD_Sound_DeleteSyncPoint (FMOD_SOUND *sound, FMOD_SYNCPOINT *point);
/*
Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time.
*/
FMOD_RESULT F_API FMOD_Sound_SetMode (FMOD_SOUND *sound, FMOD_MODE mode);
FMOD_RESULT F_API FMOD_Sound_GetMode (FMOD_SOUND *sound, FMOD_MODE *mode);
FMOD_RESULT F_API FMOD_Sound_SetLoopCount (FMOD_SOUND *sound, int loopcount);
FMOD_RESULT F_API FMOD_Sound_GetLoopCount (FMOD_SOUND *sound, int *loopcount);
FMOD_RESULT F_API FMOD_Sound_SetLoopPoints (FMOD_SOUND *sound, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API FMOD_Sound_GetLoopPoints (FMOD_SOUND *sound, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
/*
For MOD/S3M/XM/IT/MID sequenced formats only.
*/
FMOD_RESULT F_API FMOD_Sound_GetMusicNumChannels (FMOD_SOUND *sound, int *numchannels);
FMOD_RESULT F_API FMOD_Sound_SetMusicChannelVolume (FMOD_SOUND *sound, int channel, float volume);
FMOD_RESULT F_API FMOD_Sound_GetMusicChannelVolume (FMOD_SOUND *sound, int channel, float *volume);
FMOD_RESULT F_API FMOD_Sound_SetMusicSpeed (FMOD_SOUND *sound, float speed);
FMOD_RESULT F_API FMOD_Sound_GetMusicSpeed (FMOD_SOUND *sound, float *speed);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Sound_SetUserData (FMOD_SOUND *sound, void *userdata);
FMOD_RESULT F_API FMOD_Sound_GetUserData (FMOD_SOUND *sound, void **userdata);
/*
'Channel' API
*/
FMOD_RESULT F_API FMOD_Channel_GetSystemObject (FMOD_CHANNEL *channel, FMOD_SYSTEM **system);
/*
General control functionality for Channels and ChannelGroups.
*/
FMOD_RESULT F_API FMOD_Channel_Stop (FMOD_CHANNEL *channel);
FMOD_RESULT F_API FMOD_Channel_SetPaused (FMOD_CHANNEL *channel, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Channel_GetPaused (FMOD_CHANNEL *channel, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Channel_SetVolume (FMOD_CHANNEL *channel, float volume);
FMOD_RESULT F_API FMOD_Channel_GetVolume (FMOD_CHANNEL *channel, float *volume);
FMOD_RESULT F_API FMOD_Channel_SetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL ramp);
FMOD_RESULT F_API FMOD_Channel_GetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL *ramp);
FMOD_RESULT F_API FMOD_Channel_GetAudibility (FMOD_CHANNEL *channel, float *audibility);
FMOD_RESULT F_API FMOD_Channel_SetPitch (FMOD_CHANNEL *channel, float pitch);
FMOD_RESULT F_API FMOD_Channel_GetPitch (FMOD_CHANNEL *channel, float *pitch);
FMOD_RESULT F_API FMOD_Channel_SetMute (FMOD_CHANNEL *channel, FMOD_BOOL mute);
FMOD_RESULT F_API FMOD_Channel_GetMute (FMOD_CHANNEL *channel, FMOD_BOOL *mute);
FMOD_RESULT F_API FMOD_Channel_SetReverbProperties (FMOD_CHANNEL *channel, int instance, float wet);
FMOD_RESULT F_API FMOD_Channel_GetReverbProperties (FMOD_CHANNEL *channel, int instance, float *wet);
FMOD_RESULT F_API FMOD_Channel_SetLowPassGain (FMOD_CHANNEL *channel, float gain);
FMOD_RESULT F_API FMOD_Channel_GetLowPassGain (FMOD_CHANNEL *channel, float *gain);
FMOD_RESULT F_API FMOD_Channel_SetMode (FMOD_CHANNEL *channel, FMOD_MODE mode);
FMOD_RESULT F_API FMOD_Channel_GetMode (FMOD_CHANNEL *channel, FMOD_MODE *mode);
FMOD_RESULT F_API FMOD_Channel_SetCallback (FMOD_CHANNEL *channel, FMOD_CHANNELCONTROL_CALLBACK callback);
FMOD_RESULT F_API FMOD_Channel_IsPlaying (FMOD_CHANNEL *channel, FMOD_BOOL *isplaying);
/*
Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.
*/
FMOD_RESULT F_API FMOD_Channel_SetPan (FMOD_CHANNEL *channel, float pan);
FMOD_RESULT F_API FMOD_Channel_SetMixLevelsOutput (FMOD_CHANNEL *channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);
FMOD_RESULT F_API FMOD_Channel_SetMixLevelsInput (FMOD_CHANNEL *channel, float *levels, int numlevels);
FMOD_RESULT F_API FMOD_Channel_SetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int outchannels, int inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_Channel_GetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);
/*
Clock based functionality.
*/
FMOD_RESULT F_API FMOD_Channel_GetDSPClock (FMOD_CHANNEL *channel, unsigned long long *dspclock, unsigned long long *parentclock);
FMOD_RESULT F_API FMOD_Channel_SetDelay (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels);
FMOD_RESULT F_API FMOD_Channel_GetDelay (FMOD_CHANNEL *channel, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels);
FMOD_RESULT F_API FMOD_Channel_AddFadePoint (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_Channel_SetFadePointRamp (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_Channel_RemoveFadePoints (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end);
FMOD_RESULT F_API FMOD_Channel_GetFadePoints (FMOD_CHANNEL *channel, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);
/*
DSP effects.
*/
FMOD_RESULT F_API FMOD_Channel_GetDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_Channel_AddDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_Channel_RemoveDSP (FMOD_CHANNEL *channel, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_Channel_GetNumDSPs (FMOD_CHANNEL *channel, int *numdsps);
FMOD_RESULT F_API FMOD_Channel_SetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int index);
FMOD_RESULT F_API FMOD_Channel_GetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int *index);
/*
3D functionality.
*/
FMOD_RESULT F_API FMOD_Channel_Set3DAttributes (FMOD_CHANNEL *channel, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_Channel_Get3DAttributes (FMOD_CHANNEL *channel, FMOD_VECTOR *pos, FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_Channel_Set3DMinMaxDistance (FMOD_CHANNEL *channel, float mindistance, float maxdistance);
FMOD_RESULT F_API FMOD_Channel_Get3DMinMaxDistance (FMOD_CHANNEL *channel, float *mindistance, float *maxdistance);
FMOD_RESULT F_API FMOD_Channel_Set3DConeSettings (FMOD_CHANNEL *channel, float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API FMOD_Channel_Get3DConeSettings (FMOD_CHANNEL *channel, float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API FMOD_Channel_Set3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_Channel_Get3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_Channel_Set3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API FMOD_Channel_Get3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API FMOD_Channel_Set3DOcclusion (FMOD_CHANNEL *channel, float directocclusion, float reverbocclusion);
FMOD_RESULT F_API FMOD_Channel_Get3DOcclusion (FMOD_CHANNEL *channel, float *directocclusion, float *reverbocclusion);
FMOD_RESULT F_API FMOD_Channel_Set3DSpread (FMOD_CHANNEL *channel, float angle);
FMOD_RESULT F_API FMOD_Channel_Get3DSpread (FMOD_CHANNEL *channel, float *angle);
FMOD_RESULT F_API FMOD_Channel_Set3DLevel (FMOD_CHANNEL *channel, float level);
FMOD_RESULT F_API FMOD_Channel_Get3DLevel (FMOD_CHANNEL *channel, float *level);
FMOD_RESULT F_API FMOD_Channel_Set3DDopplerLevel (FMOD_CHANNEL *channel, float level);
FMOD_RESULT F_API FMOD_Channel_Get3DDopplerLevel (FMOD_CHANNEL *channel, float *level);
FMOD_RESULT F_API FMOD_Channel_Set3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL custom, float customLevel, float centerFreq);
FMOD_RESULT F_API FMOD_Channel_Get3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL *custom, float *customLevel, float *centerFreq);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Channel_SetUserData (FMOD_CHANNEL *channel, void *userdata);
FMOD_RESULT F_API FMOD_Channel_GetUserData (FMOD_CHANNEL *channel, void **userdata);
/*
Channel specific control functionality.
*/
FMOD_RESULT F_API FMOD_Channel_SetFrequency (FMOD_CHANNEL *channel, float frequency);
FMOD_RESULT F_API FMOD_Channel_GetFrequency (FMOD_CHANNEL *channel, float *frequency);
FMOD_RESULT F_API FMOD_Channel_SetPriority (FMOD_CHANNEL *channel, int priority);
FMOD_RESULT F_API FMOD_Channel_GetPriority (FMOD_CHANNEL *channel, int *priority);
FMOD_RESULT F_API FMOD_Channel_SetPosition (FMOD_CHANNEL *channel, unsigned int position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API FMOD_Channel_GetPosition (FMOD_CHANNEL *channel, unsigned int *position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API FMOD_Channel_SetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP *channelgroup);
FMOD_RESULT F_API FMOD_Channel_GetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP **channelgroup);
FMOD_RESULT F_API FMOD_Channel_SetLoopCount (FMOD_CHANNEL *channel, int loopcount);
FMOD_RESULT F_API FMOD_Channel_GetLoopCount (FMOD_CHANNEL *channel, int *loopcount);
FMOD_RESULT F_API FMOD_Channel_SetLoopPoints (FMOD_CHANNEL *channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API FMOD_Channel_GetLoopPoints (FMOD_CHANNEL *channel, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
/*
Information only functions.
*/
FMOD_RESULT F_API FMOD_Channel_IsVirtual (FMOD_CHANNEL *channel, FMOD_BOOL *isvirtual);
FMOD_RESULT F_API FMOD_Channel_GetCurrentSound (FMOD_CHANNEL *channel, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_Channel_GetIndex (FMOD_CHANNEL *channel, int *index);
/*
'ChannelGroup' API
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetSystemObject (FMOD_CHANNELGROUP *channelgroup, FMOD_SYSTEM **system);
/*
General control functionality for Channels and ChannelGroups.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_Stop (FMOD_CHANNELGROUP *channelgroup);
FMOD_RESULT F_API FMOD_ChannelGroup_SetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_ChannelGroup_GetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_ChannelGroup_SetVolume (FMOD_CHANNELGROUP *channelgroup, float volume);
FMOD_RESULT F_API FMOD_ChannelGroup_GetVolume (FMOD_CHANNELGROUP *channelgroup, float *volume);
FMOD_RESULT F_API FMOD_ChannelGroup_SetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL ramp);
FMOD_RESULT F_API FMOD_ChannelGroup_GetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *ramp);
FMOD_RESULT F_API FMOD_ChannelGroup_GetAudibility (FMOD_CHANNELGROUP *channelgroup, float *audibility);
FMOD_RESULT F_API FMOD_ChannelGroup_SetPitch (FMOD_CHANNELGROUP *channelgroup, float pitch);
FMOD_RESULT F_API FMOD_ChannelGroup_GetPitch (FMOD_CHANNELGROUP *channelgroup, float *pitch);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL mute);
FMOD_RESULT F_API FMOD_ChannelGroup_GetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *mute);
FMOD_RESULT F_API FMOD_ChannelGroup_SetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float wet);
FMOD_RESULT F_API FMOD_ChannelGroup_GetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float *wet);
FMOD_RESULT F_API FMOD_ChannelGroup_SetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float gain);
FMOD_RESULT F_API FMOD_ChannelGroup_GetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float *gain);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE mode);
FMOD_RESULT F_API FMOD_ChannelGroup_GetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE *mode);
FMOD_RESULT F_API FMOD_ChannelGroup_SetCallback (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELCONTROL_CALLBACK callback);
FMOD_RESULT F_API FMOD_ChannelGroup_IsPlaying (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *isplaying);
/*
Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_SetPan (FMOD_CHANNELGROUP *channelgroup, float pan);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsOutput (FMOD_CHANNELGROUP *channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsInput (FMOD_CHANNELGROUP *channelgroup, float *levels, int numlevels);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int outchannels, int inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_ChannelGroup_GetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);
/*
Clock based functionality.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPClock (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock, unsigned long long *parentclock);
FMOD_RESULT F_API FMOD_ChannelGroup_SetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels);
FMOD_RESULT F_API FMOD_ChannelGroup_GetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels);
FMOD_RESULT F_API FMOD_ChannelGroup_AddFadePoint (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_ChannelGroup_SetFadePointRamp (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_ChannelGroup_RemoveFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end);
FMOD_RESULT F_API FMOD_ChannelGroup_GetFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);
/*
DSP effects.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_ChannelGroup_AddDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_ChannelGroup_RemoveDSP (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_ChannelGroup_GetNumDSPs (FMOD_CHANNELGROUP *channelgroup, int *numdsps);
FMOD_RESULT F_API FMOD_ChannelGroup_SetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int index);
FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int *index);
/*
3D functionality.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DAttributes (FMOD_CHANNELGROUP *channelgroup, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DAttributes (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *pos, FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float mindistance, float maxdistance);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float *mindistance, float *maxdistance);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float directocclusion, float reverbocclusion);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float *directocclusion, float *reverbocclusion);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DSpread (FMOD_CHANNELGROUP *channelgroup, float angle);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DSpread (FMOD_CHANNELGROUP *channelgroup, float *angle);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DLevel (FMOD_CHANNELGROUP *channelgroup, float level);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DLevel (FMOD_CHANNELGROUP *channelgroup, float *level);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float level);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float *level);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL custom, float customLevel, float centerFreq);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *custom, float *customLevel, float *centerFreq);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_SetUserData (FMOD_CHANNELGROUP *channelgroup, void *userdata);
FMOD_RESULT F_API FMOD_ChannelGroup_GetUserData (FMOD_CHANNELGROUP *channelgroup, void **userdata);
FMOD_RESULT F_API FMOD_ChannelGroup_Release (FMOD_CHANNELGROUP *channelgroup);
/*
Nested channel groups.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_AddGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP *group, FMOD_BOOL propagatedspclock, FMOD_DSPCONNECTION **connection);
FMOD_RESULT F_API FMOD_ChannelGroup_GetNumGroups (FMOD_CHANNELGROUP *channelgroup, int *numgroups);
FMOD_RESULT F_API FMOD_ChannelGroup_GetGroup (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNELGROUP **group);
FMOD_RESULT F_API FMOD_ChannelGroup_GetParentGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP **group);
/*
Information only functions.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetName (FMOD_CHANNELGROUP *channelgroup, char *name, int namelen);
FMOD_RESULT F_API FMOD_ChannelGroup_GetNumChannels (FMOD_CHANNELGROUP *channelgroup, int *numchannels);
FMOD_RESULT F_API FMOD_ChannelGroup_GetChannel (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNEL **channel);
/*
'SoundGroup' API
*/
FMOD_RESULT F_API FMOD_SoundGroup_Release (FMOD_SOUNDGROUP *soundgroup);
FMOD_RESULT F_API FMOD_SoundGroup_GetSystemObject (FMOD_SOUNDGROUP *soundgroup, FMOD_SYSTEM **system);
/*
SoundGroup control functions.
*/
FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int maxaudible);
FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int *maxaudible);
FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR behavior);
FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR *behavior);
FMOD_RESULT F_API FMOD_SoundGroup_SetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float speed);
FMOD_RESULT F_API FMOD_SoundGroup_GetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float *speed);
FMOD_RESULT F_API FMOD_SoundGroup_SetVolume (FMOD_SOUNDGROUP *soundgroup, float volume);
FMOD_RESULT F_API FMOD_SoundGroup_GetVolume (FMOD_SOUNDGROUP *soundgroup, float *volume);
FMOD_RESULT F_API FMOD_SoundGroup_Stop (FMOD_SOUNDGROUP *soundgroup);
/*
Information only functions.
*/
FMOD_RESULT F_API FMOD_SoundGroup_GetName (FMOD_SOUNDGROUP *soundgroup, char *name, int namelen);
FMOD_RESULT F_API FMOD_SoundGroup_GetNumSounds (FMOD_SOUNDGROUP *soundgroup, int *numsounds);
FMOD_RESULT F_API FMOD_SoundGroup_GetSound (FMOD_SOUNDGROUP *soundgroup, int index, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_SoundGroup_GetNumPlaying (FMOD_SOUNDGROUP *soundgroup, int *numplaying);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_SoundGroup_SetUserData (FMOD_SOUNDGROUP *soundgroup, void *userdata);
FMOD_RESULT F_API FMOD_SoundGroup_GetUserData (FMOD_SOUNDGROUP *soundgroup, void **userdata);
/*
'DSP' API
*/
FMOD_RESULT F_API FMOD_DSP_Release (FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_DSP_GetSystemObject (FMOD_DSP *dsp, FMOD_SYSTEM **system);
/*
Connection / disconnection / input and output enumeration.
*/
FMOD_RESULT F_API FMOD_DSP_AddInput (FMOD_DSP *dsp, FMOD_DSP *input, FMOD_DSPCONNECTION **connection, FMOD_DSPCONNECTION_TYPE type);
FMOD_RESULT F_API FMOD_DSP_DisconnectFrom (FMOD_DSP *dsp, FMOD_DSP *target, FMOD_DSPCONNECTION *connection);
FMOD_RESULT F_API FMOD_DSP_DisconnectAll (FMOD_DSP *dsp, FMOD_BOOL inputs, FMOD_BOOL outputs);
FMOD_RESULT F_API FMOD_DSP_GetNumInputs (FMOD_DSP *dsp, int *numinputs);
FMOD_RESULT F_API FMOD_DSP_GetNumOutputs (FMOD_DSP *dsp, int *numoutputs);
FMOD_RESULT F_API FMOD_DSP_GetInput (FMOD_DSP *dsp, int index, FMOD_DSP **input, FMOD_DSPCONNECTION **inputconnection);
FMOD_RESULT F_API FMOD_DSP_GetOutput (FMOD_DSP *dsp, int index, FMOD_DSP **output, FMOD_DSPCONNECTION **outputconnection);
/*
DSP unit control.
*/
FMOD_RESULT F_API FMOD_DSP_SetActive (FMOD_DSP *dsp, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_DSP_GetActive (FMOD_DSP *dsp, FMOD_BOOL *active);
FMOD_RESULT F_API FMOD_DSP_SetBypass (FMOD_DSP *dsp, FMOD_BOOL bypass);
FMOD_RESULT F_API FMOD_DSP_GetBypass (FMOD_DSP *dsp, FMOD_BOOL *bypass);
FMOD_RESULT F_API FMOD_DSP_SetWetDryMix (FMOD_DSP *dsp, float prewet, float postwet, float dry);
FMOD_RESULT F_API FMOD_DSP_GetWetDryMix (FMOD_DSP *dsp, float *prewet, float *postwet, float *dry);
FMOD_RESULT F_API FMOD_DSP_SetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode);
FMOD_RESULT F_API FMOD_DSP_GetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode);
FMOD_RESULT F_API FMOD_DSP_GetOutputChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode);
FMOD_RESULT F_API FMOD_DSP_Reset (FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_DSP_SetCallback (FMOD_DSP *dsp, FMOD_DSP_CALLBACK callback);
/*
DSP parameter control.
*/
FMOD_RESULT F_API FMOD_DSP_SetParameterFloat (FMOD_DSP *dsp, int index, float value);
FMOD_RESULT F_API FMOD_DSP_SetParameterInt (FMOD_DSP *dsp, int index, int value);
FMOD_RESULT F_API FMOD_DSP_SetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL value);
FMOD_RESULT F_API FMOD_DSP_SetParameterData (FMOD_DSP *dsp, int index, void *data, unsigned int length);
FMOD_RESULT F_API FMOD_DSP_GetParameterFloat (FMOD_DSP *dsp, int index, float *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetParameterInt (FMOD_DSP *dsp, int index, int *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetParameterData (FMOD_DSP *dsp, int index, void **data, unsigned int *length, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetNumParameters (FMOD_DSP *dsp, int *numparams);
FMOD_RESULT F_API FMOD_DSP_GetParameterInfo (FMOD_DSP *dsp, int index, FMOD_DSP_PARAMETER_DESC **desc);
FMOD_RESULT F_API FMOD_DSP_GetDataParameterIndex (FMOD_DSP *dsp, int datatype, int *index);
FMOD_RESULT F_API FMOD_DSP_ShowConfigDialog (FMOD_DSP *dsp, void *hwnd, FMOD_BOOL show);
/*
DSP attributes.
*/
FMOD_RESULT F_API FMOD_DSP_GetInfo (FMOD_DSP *dsp, char *name, unsigned int *version, int *channels, int *configwidth, int *configheight);
FMOD_RESULT F_API FMOD_DSP_GetType (FMOD_DSP *dsp, FMOD_DSP_TYPE *type);
FMOD_RESULT F_API FMOD_DSP_GetIdle (FMOD_DSP *dsp, FMOD_BOOL *idle);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_DSP_SetUserData (FMOD_DSP *dsp, void *userdata);
FMOD_RESULT F_API FMOD_DSP_GetUserData (FMOD_DSP *dsp, void **userdata);
/*
Metering.
*/
FMOD_RESULT F_API FMOD_DSP_SetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL inputEnabled, FMOD_BOOL outputEnabled);
FMOD_RESULT F_API FMOD_DSP_GetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL *inputEnabled, FMOD_BOOL *outputEnabled);
FMOD_RESULT F_API FMOD_DSP_GetMeteringInfo (FMOD_DSP *dsp, FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo);
FMOD_RESULT F_API FMOD_DSP_GetCPUUsage (FMOD_DSP *dsp, unsigned int *exclusive, unsigned int *inclusive);
/*
'DSPConnection' API
*/
FMOD_RESULT F_API FMOD_DSPConnection_GetInput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **input);
FMOD_RESULT F_API FMOD_DSPConnection_GetOutput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **output);
FMOD_RESULT F_API FMOD_DSPConnection_SetMix (FMOD_DSPCONNECTION *dspconnection, float volume);
FMOD_RESULT F_API FMOD_DSPConnection_GetMix (FMOD_DSPCONNECTION *dspconnection, float *volume);
FMOD_RESULT F_API FMOD_DSPConnection_SetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int outchannels, int inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_DSPConnection_GetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_DSPConnection_GetType (FMOD_DSPCONNECTION *dspconnection, FMOD_DSPCONNECTION_TYPE *type);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_DSPConnection_SetUserData (FMOD_DSPCONNECTION *dspconnection, void *userdata);
FMOD_RESULT F_API FMOD_DSPConnection_GetUserData (FMOD_DSPCONNECTION *dspconnection, void **userdata);
/*
'Geometry' API
*/
FMOD_RESULT F_API FMOD_Geometry_Release (FMOD_GEOMETRY *geometry);
/*
Polygon manipulation.
*/
FMOD_RESULT F_API FMOD_Geometry_AddPolygon (FMOD_GEOMETRY *geometry, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex);
FMOD_RESULT F_API FMOD_Geometry_GetNumPolygons (FMOD_GEOMETRY *geometry, int *numpolygons);
FMOD_RESULT F_API FMOD_Geometry_GetMaxPolygons (FMOD_GEOMETRY *geometry, int *maxpolygons, int *maxvertices);
FMOD_RESULT F_API FMOD_Geometry_GetPolygonNumVertices (FMOD_GEOMETRY *geometry, int index, int *numvertices);
FMOD_RESULT F_API FMOD_Geometry_SetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, const FMOD_VECTOR *vertex);
FMOD_RESULT F_API FMOD_Geometry_GetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, FMOD_VECTOR *vertex);
FMOD_RESULT F_API FMOD_Geometry_SetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided);
FMOD_RESULT F_API FMOD_Geometry_GetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float *directocclusion, float *reverbocclusion, FMOD_BOOL *doublesided);
/*
Object manipulation.
*/
FMOD_RESULT F_API FMOD_Geometry_SetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_Geometry_GetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL *active);
FMOD_RESULT F_API FMOD_Geometry_SetRotation (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_Geometry_GetRotation (FMOD_GEOMETRY *geometry, FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_Geometry_SetPosition (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *position);
FMOD_RESULT F_API FMOD_Geometry_GetPosition (FMOD_GEOMETRY *geometry, FMOD_VECTOR *position);
FMOD_RESULT F_API FMOD_Geometry_SetScale (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *scale);
FMOD_RESULT F_API FMOD_Geometry_GetScale (FMOD_GEOMETRY *geometry, FMOD_VECTOR *scale);
FMOD_RESULT F_API FMOD_Geometry_Save (FMOD_GEOMETRY *geometry, void *data, int *datasize);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Geometry_SetUserData (FMOD_GEOMETRY *geometry, void *userdata);
FMOD_RESULT F_API FMOD_Geometry_GetUserData (FMOD_GEOMETRY *geometry, void **userdata);
/*
'Reverb3D' API
*/
FMOD_RESULT F_API FMOD_Reverb3D_Release (FMOD_REVERB3D *reverb3d);
/*
Reverb manipulation.
*/
FMOD_RESULT F_API FMOD_Reverb3D_Set3DAttributes (FMOD_REVERB3D *reverb3d, const FMOD_VECTOR *position, float mindistance, float maxdistance);
FMOD_RESULT F_API FMOD_Reverb3D_Get3DAttributes (FMOD_REVERB3D *reverb3d, FMOD_VECTOR *position, float *mindistance, float *maxdistance);
FMOD_RESULT F_API FMOD_Reverb3D_SetProperties (FMOD_REVERB3D *reverb3d, const FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API FMOD_Reverb3D_GetProperties (FMOD_REVERB3D *reverb3d, FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API FMOD_Reverb3D_SetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_Reverb3D_GetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL *active);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Reverb3D_SetUserData (FMOD_REVERB3D *reverb3d, void *userdata);
FMOD_RESULT F_API FMOD_Reverb3D_GetUserData (FMOD_REVERB3D *reverb3d, void **userdata);
#ifdef __cplusplus
}
#endif
#endif /* _FMOD_H */

View File

@ -0,0 +1,607 @@
/* ======================================================================================== */
/* FMOD Core API - C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_common.h (which contains all the constants / */
/* callbacks) to develop using the C++ language. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api.html */
/* ======================================================================================== */
#ifndef _FMOD_HPP
#define _FMOD_HPP
#include "fmod_common.h"
#include "fmod.h"
/*
FMOD Namespace
*/
namespace FMOD
{
class System;
class Sound;
class ChannelControl;
class Channel;
class ChannelGroup;
class SoundGroup;
class DSP;
class DSPConnection;
class Geometry;
class Reverb3D;
/*
FMOD global system functions (optional).
*/
inline FMOD_RESULT Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags = FMOD_MEMORY_ALL) { return FMOD_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); }
inline FMOD_RESULT Memory_GetStats (int *currentalloced, int *maxalloced, bool blocking = true) { return FMOD_Memory_GetStats(currentalloced, maxalloced, blocking); }
inline FMOD_RESULT Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode = FMOD_DEBUG_MODE_TTY, FMOD_DEBUG_CALLBACK callback = 0, const char *filename = 0) { return FMOD_Debug_Initialize(flags, mode, callback, filename); }
inline FMOD_RESULT File_SetDiskBusy (int busy) { return FMOD_File_SetDiskBusy(busy); }
inline FMOD_RESULT File_GetDiskBusy (int *busy) { return FMOD_File_GetDiskBusy(busy); }
inline FMOD_RESULT Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity = FMOD_THREAD_AFFINITY_GROUP_DEFAULT, FMOD_THREAD_PRIORITY priority = FMOD_THREAD_PRIORITY_DEFAULT, FMOD_THREAD_STACK_SIZE stacksize = FMOD_THREAD_STACK_SIZE_DEFAULT) { return FMOD_Thread_SetAttributes(type, affinity, priority, stacksize); }
/*
FMOD System factory functions.
*/
inline FMOD_RESULT System_Create (System **system, unsigned int headerversion = FMOD_VERSION) { return FMOD_System_Create((FMOD_SYSTEM **)system, headerversion); }
/*
'System' API
*/
class System
{
private:
// Constructor made private so user cannot statically instance a System class. System_Create must be used.
System();
System(const System &);
public:
FMOD_RESULT F_API release ();
// Setup functions.
FMOD_RESULT F_API setOutput (FMOD_OUTPUTTYPE output);
FMOD_RESULT F_API getOutput (FMOD_OUTPUTTYPE *output);
FMOD_RESULT F_API getNumDrivers (int *numdrivers);
FMOD_RESULT F_API getDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);
FMOD_RESULT F_API setDriver (int driver);
FMOD_RESULT F_API getDriver (int *driver);
FMOD_RESULT F_API setSoftwareChannels (int numsoftwarechannels);
FMOD_RESULT F_API getSoftwareChannels (int *numsoftwarechannels);
FMOD_RESULT F_API setSoftwareFormat (int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers);
FMOD_RESULT F_API getSoftwareFormat (int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers);
FMOD_RESULT F_API setDSPBufferSize (unsigned int bufferlength, int numbuffers);
FMOD_RESULT F_API getDSPBufferSize (unsigned int *bufferlength, int *numbuffers);
FMOD_RESULT F_API setFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign);
FMOD_RESULT F_API attachFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek);
FMOD_RESULT F_API setAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API getAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API setCallback (FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_SYSTEM_CALLBACK_ALL);
// Plug-in support.
FMOD_RESULT F_API setPluginPath (const char *path);
FMOD_RESULT F_API loadPlugin (const char *filename, unsigned int *handle, unsigned int priority = 0);
FMOD_RESULT F_API unloadPlugin (unsigned int handle);
FMOD_RESULT F_API getNumNestedPlugins (unsigned int handle, int *count);
FMOD_RESULT F_API getNestedPlugin (unsigned int handle, int index, unsigned int *nestedhandle);
FMOD_RESULT F_API getNumPlugins (FMOD_PLUGINTYPE plugintype, int *numplugins);
FMOD_RESULT F_API getPluginHandle (FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle);
FMOD_RESULT F_API getPluginInfo (unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version);
FMOD_RESULT F_API setOutputByPlugin (unsigned int handle);
FMOD_RESULT F_API getOutputByPlugin (unsigned int *handle);
FMOD_RESULT F_API createDSPByPlugin (unsigned int handle, DSP **dsp);
FMOD_RESULT F_API getDSPInfoByPlugin (unsigned int handle, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API registerCodec (FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority = 0);
FMOD_RESULT F_API registerDSP (const FMOD_DSP_DESCRIPTION *description, unsigned int *handle);
FMOD_RESULT F_API registerOutput (const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle);
// Init/Close.
FMOD_RESULT F_API init (int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API close ();
// General post-init system functions.
FMOD_RESULT F_API update (); /* IMPORTANT! CALL THIS ONCE PER FRAME! */
FMOD_RESULT F_API setSpeakerPosition (FMOD_SPEAKER speaker, float x, float y, bool active);
FMOD_RESULT F_API getSpeakerPosition (FMOD_SPEAKER speaker, float *x, float *y, bool *active);
FMOD_RESULT F_API setStreamBufferSize (unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype);
FMOD_RESULT F_API getStreamBufferSize (unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype);
FMOD_RESULT F_API set3DSettings (float dopplerscale, float distancefactor, float rolloffscale);
FMOD_RESULT F_API get3DSettings (float *dopplerscale, float *distancefactor, float *rolloffscale);
FMOD_RESULT F_API set3DNumListeners (int numlisteners);
FMOD_RESULT F_API get3DNumListeners (int *numlisteners);
FMOD_RESULT F_API set3DListenerAttributes (int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API get3DListenerAttributes (int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API set3DRolloffCallback (FMOD_3D_ROLLOFF_CALLBACK callback);
FMOD_RESULT F_API mixerSuspend ();
FMOD_RESULT F_API mixerResume ();
FMOD_RESULT F_API getDefaultMixMatrix (FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop);
FMOD_RESULT F_API getSpeakerModeChannels (FMOD_SPEAKERMODE mode, int *channels);
// System information functions.
FMOD_RESULT F_API getVersion (unsigned int *version);
FMOD_RESULT F_API getOutputHandle (void **handle);
FMOD_RESULT F_API getChannelsPlaying (int *channels, int *realchannels = 0);
FMOD_RESULT F_API getCPUUsage (FMOD_CPU_USAGE *usage);
FMOD_RESULT F_API getFileUsage (long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead);
// Sound/DSP/Channel/FX creation and retrieval.
FMOD_RESULT F_API createSound (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound);
FMOD_RESULT F_API createStream (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound);
FMOD_RESULT F_API createDSP (const FMOD_DSP_DESCRIPTION *description, DSP **dsp);
FMOD_RESULT F_API createDSPByType (FMOD_DSP_TYPE type, DSP **dsp);
FMOD_RESULT F_API createChannelGroup (const char *name, ChannelGroup **channelgroup);
FMOD_RESULT F_API createSoundGroup (const char *name, SoundGroup **soundgroup);
FMOD_RESULT F_API createReverb3D (Reverb3D **reverb);
FMOD_RESULT F_API playSound (Sound *sound, ChannelGroup *channelgroup, bool paused, Channel **channel);
FMOD_RESULT F_API playDSP (DSP *dsp, ChannelGroup *channelgroup, bool paused, Channel **channel);
FMOD_RESULT F_API getChannel (int channelid, Channel **channel);
FMOD_RESULT F_API getDSPInfoByType (FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API getMasterChannelGroup (ChannelGroup **channelgroup);
FMOD_RESULT F_API getMasterSoundGroup (SoundGroup **soundgroup);
// Routing to ports.
FMOD_RESULT F_API attachChannelGroupToPort (FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, ChannelGroup *channelgroup, bool passThru = false);
FMOD_RESULT F_API detachChannelGroupFromPort (ChannelGroup *channelgroup);
// Reverb API.
FMOD_RESULT F_API setReverbProperties (int instance, const FMOD_REVERB_PROPERTIES *prop);
FMOD_RESULT F_API getReverbProperties (int instance, FMOD_REVERB_PROPERTIES *prop);
// System level DSP functionality.
FMOD_RESULT F_API lockDSP ();
FMOD_RESULT F_API unlockDSP ();
// Recording API.
FMOD_RESULT F_API getRecordNumDrivers (int *numdrivers, int *numconnected);
FMOD_RESULT F_API getRecordDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state);
FMOD_RESULT F_API getRecordPosition (int id, unsigned int *position);
FMOD_RESULT F_API recordStart (int id, Sound *sound, bool loop);
FMOD_RESULT F_API recordStop (int id);
FMOD_RESULT F_API isRecording (int id, bool *recording);
// Geometry API.
FMOD_RESULT F_API createGeometry (int maxpolygons, int maxvertices, Geometry **geometry);
FMOD_RESULT F_API setGeometrySettings (float maxworldsize);
FMOD_RESULT F_API getGeometrySettings (float *maxworldsize);
FMOD_RESULT F_API loadGeometry (const void *data, int datasize, Geometry **geometry);
FMOD_RESULT F_API getGeometryOcclusion (const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb);
// Network functions.
FMOD_RESULT F_API setNetworkProxy (const char *proxy);
FMOD_RESULT F_API getNetworkProxy (char *proxy, int proxylen);
FMOD_RESULT F_API setNetworkTimeout (int timeout);
FMOD_RESULT F_API getNetworkTimeout (int *timeout);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Sound' API
*/
class Sound
{
private:
// Constructor made private so user cannot statically instance a Sound class. Appropriate Sound creation or retrieval function must be used.
Sound();
Sound(const Sound &);
public:
FMOD_RESULT F_API release ();
FMOD_RESULT F_API getSystemObject (System **system);
// Standard sound manipulation functions.
FMOD_RESULT F_API lock (unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);
FMOD_RESULT F_API unlock (void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);
FMOD_RESULT F_API setDefaults (float frequency, int priority);
FMOD_RESULT F_API getDefaults (float *frequency, int *priority);
FMOD_RESULT F_API set3DMinMaxDistance (float min, float max);
FMOD_RESULT F_API get3DMinMaxDistance (float *min, float *max);
FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API getSubSound (int index, Sound **subsound);
FMOD_RESULT F_API getSubSoundParent (Sound **parentsound);
FMOD_RESULT F_API getName (char *name, int namelen);
FMOD_RESULT F_API getLength (unsigned int *length, FMOD_TIMEUNIT lengthtype);
FMOD_RESULT F_API getFormat (FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits);
FMOD_RESULT F_API getNumSubSounds (int *numsubsounds);
FMOD_RESULT F_API getNumTags (int *numtags, int *numtagsupdated);
FMOD_RESULT F_API getTag (const char *name, int index, FMOD_TAG *tag);
FMOD_RESULT F_API getOpenState (FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, bool *starving, bool *diskbusy);
FMOD_RESULT F_API readData (void *buffer, unsigned int length, unsigned int *read);
FMOD_RESULT F_API seekData (unsigned int pcm);
FMOD_RESULT F_API setSoundGroup (SoundGroup *soundgroup);
FMOD_RESULT F_API getSoundGroup (SoundGroup **soundgroup);
// Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks.
FMOD_RESULT F_API getNumSyncPoints (int *numsyncpoints);
FMOD_RESULT F_API getSyncPoint (int index, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API getSyncPointInfo (FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype);
FMOD_RESULT F_API addSyncPoint (unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API deleteSyncPoint (FMOD_SYNCPOINT *point);
// Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time.
FMOD_RESULT F_API setMode (FMOD_MODE mode);
FMOD_RESULT F_API getMode (FMOD_MODE *mode);
FMOD_RESULT F_API setLoopCount (int loopcount);
FMOD_RESULT F_API getLoopCount (int *loopcount);
FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
// For MOD/S3M/XM/IT/MID sequenced formats only.
FMOD_RESULT F_API getMusicNumChannels (int *numchannels);
FMOD_RESULT F_API setMusicChannelVolume (int channel, float volume);
FMOD_RESULT F_API getMusicChannelVolume (int channel, float *volume);
FMOD_RESULT F_API setMusicSpeed (float speed);
FMOD_RESULT F_API getMusicSpeed (float *speed);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'ChannelControl API'. This is a base class for Channel and ChannelGroup so they can share the same functionality. This cannot be used or instansiated explicitly.
*/
class ChannelControl
{
private:
// Constructor made private so user cannot statically instance a Control class.
ChannelControl();
ChannelControl(const ChannelControl &);
public:
FMOD_RESULT F_API getSystemObject (System **system);
// General control functionality for Channels and ChannelGroups.
FMOD_RESULT F_API stop ();
FMOD_RESULT F_API setPaused (bool paused);
FMOD_RESULT F_API getPaused (bool *paused);
FMOD_RESULT F_API setVolume (float volume);
FMOD_RESULT F_API getVolume (float *volume);
FMOD_RESULT F_API setVolumeRamp (bool ramp);
FMOD_RESULT F_API getVolumeRamp (bool *ramp);
FMOD_RESULT F_API getAudibility (float *audibility);
FMOD_RESULT F_API setPitch (float pitch);
FMOD_RESULT F_API getPitch (float *pitch);
FMOD_RESULT F_API setMute (bool mute);
FMOD_RESULT F_API getMute (bool *mute);
FMOD_RESULT F_API setReverbProperties (int instance, float wet);
FMOD_RESULT F_API getReverbProperties (int instance, float *wet);
FMOD_RESULT F_API setLowPassGain (float gain);
FMOD_RESULT F_API getLowPassGain (float *gain);
FMOD_RESULT F_API setMode (FMOD_MODE mode);
FMOD_RESULT F_API getMode (FMOD_MODE *mode);
FMOD_RESULT F_API setCallback (FMOD_CHANNELCONTROL_CALLBACK callback);
FMOD_RESULT F_API isPlaying (bool *isplaying);
// Panning and level adjustment.
// Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.
FMOD_RESULT F_API setPan (float pan);
FMOD_RESULT F_API setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);
FMOD_RESULT F_API setMixLevelsInput (float *levels, int numlevels);
FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0);
FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0);
// Clock based functionality.
FMOD_RESULT F_API getDSPClock (unsigned long long *dspclock, unsigned long long *parentclock);
FMOD_RESULT F_API setDelay (unsigned long long dspclock_start, unsigned long long dspclock_end, bool stopchannels = true);
FMOD_RESULT F_API getDelay (unsigned long long *dspclock_start, unsigned long long *dspclock_end, bool *stopchannels = 0);
FMOD_RESULT F_API addFadePoint (unsigned long long dspclock, float volume);
FMOD_RESULT F_API setFadePointRamp (unsigned long long dspclock, float volume);
FMOD_RESULT F_API removeFadePoints (unsigned long long dspclock_start, unsigned long long dspclock_end);
FMOD_RESULT F_API getFadePoints (unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);
// DSP effects.
FMOD_RESULT F_API getDSP (int index, DSP **dsp);
FMOD_RESULT F_API addDSP (int index, DSP *dsp);
FMOD_RESULT F_API removeDSP (DSP *dsp);
FMOD_RESULT F_API getNumDSPs (int *numdsps);
FMOD_RESULT F_API setDSPIndex (DSP *dsp, int index);
FMOD_RESULT F_API getDSPIndex (DSP *dsp, int *index);
// 3D functionality.
FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *pos, const FMOD_VECTOR *vel);
FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *pos, FMOD_VECTOR *vel);
FMOD_RESULT F_API set3DMinMaxDistance (float mindistance, float maxdistance);
FMOD_RESULT F_API get3DMinMaxDistance (float *mindistance, float *maxdistance);
FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API set3DConeOrientation (FMOD_VECTOR *orientation);
FMOD_RESULT F_API get3DConeOrientation (FMOD_VECTOR *orientation);
FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API set3DOcclusion (float directocclusion, float reverbocclusion);
FMOD_RESULT F_API get3DOcclusion (float *directocclusion, float *reverbocclusion);
FMOD_RESULT F_API set3DSpread (float angle);
FMOD_RESULT F_API get3DSpread (float *angle);
FMOD_RESULT F_API set3DLevel (float level);
FMOD_RESULT F_API get3DLevel (float *level);
FMOD_RESULT F_API set3DDopplerLevel (float level);
FMOD_RESULT F_API get3DDopplerLevel (float *level);
FMOD_RESULT F_API set3DDistanceFilter (bool custom, float customLevel, float centerFreq);
FMOD_RESULT F_API get3DDistanceFilter (bool *custom, float *customLevel, float *centerFreq);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Channel' API.
*/
class Channel : public ChannelControl
{
private:
// Constructor made private so user cannot statically instance a Channel class. Appropriate Channel creation or retrieval function must be used.
Channel();
Channel(const Channel &);
public:
// Channel specific control functionality.
FMOD_RESULT F_API setFrequency (float frequency);
FMOD_RESULT F_API getFrequency (float *frequency);
FMOD_RESULT F_API setPriority (int priority);
FMOD_RESULT F_API getPriority (int *priority);
FMOD_RESULT F_API setPosition (unsigned int position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API getPosition (unsigned int *position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API setChannelGroup (ChannelGroup *channelgroup);
FMOD_RESULT F_API getChannelGroup (ChannelGroup **channelgroup);
FMOD_RESULT F_API setLoopCount (int loopcount);
FMOD_RESULT F_API getLoopCount (int *loopcount);
FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
// Information only functions.
FMOD_RESULT F_API isVirtual (bool *isvirtual);
FMOD_RESULT F_API getCurrentSound (Sound **sound);
FMOD_RESULT F_API getIndex (int *index);
};
/*
'ChannelGroup' API
*/
class ChannelGroup : public ChannelControl
{
private:
// Constructor made private so user cannot statically instance a ChannelGroup class. Appropriate ChannelGroup creation or retrieval function must be used.
ChannelGroup();
ChannelGroup(const ChannelGroup &);
public:
FMOD_RESULT F_API release ();
// Nested channel groups.
FMOD_RESULT F_API addGroup (ChannelGroup *group, bool propagatedspclock = true, DSPConnection **connection = 0);
FMOD_RESULT F_API getNumGroups (int *numgroups);
FMOD_RESULT F_API getGroup (int index, ChannelGroup **group);
FMOD_RESULT F_API getParentGroup (ChannelGroup **group);
// Information only functions.
FMOD_RESULT F_API getName (char *name, int namelen);
FMOD_RESULT F_API getNumChannels (int *numchannels);
FMOD_RESULT F_API getChannel (int index, Channel **channel);
};
/*
'SoundGroup' API
*/
class SoundGroup
{
private:
// Constructor made private so user cannot statically instance a SoundGroup class. Appropriate SoundGroup creation or retrieval function must be used.
SoundGroup();
SoundGroup(const SoundGroup &);
public:
FMOD_RESULT F_API release ();
FMOD_RESULT F_API getSystemObject (System **system);
// SoundGroup control functions.
FMOD_RESULT F_API setMaxAudible (int maxaudible);
FMOD_RESULT F_API getMaxAudible (int *maxaudible);
FMOD_RESULT F_API setMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR behavior);
FMOD_RESULT F_API getMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR *behavior);
FMOD_RESULT F_API setMuteFadeSpeed (float speed);
FMOD_RESULT F_API getMuteFadeSpeed (float *speed);
FMOD_RESULT F_API setVolume (float volume);
FMOD_RESULT F_API getVolume (float *volume);
FMOD_RESULT F_API stop ();
// Information only functions.
FMOD_RESULT F_API getName (char *name, int namelen);
FMOD_RESULT F_API getNumSounds (int *numsounds);
FMOD_RESULT F_API getSound (int index, Sound **sound);
FMOD_RESULT F_API getNumPlaying (int *numplaying);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'DSP' API
*/
class DSP
{
private:
// Constructor made private so user cannot statically instance a DSP class. Appropriate DSP creation or retrieval function must be used.
DSP();
DSP(const DSP &);
public:
FMOD_RESULT F_API release ();
FMOD_RESULT F_API getSystemObject (System **system);
// Connection / disconnection / input and output enumeration.
FMOD_RESULT F_API addInput (DSP *input, DSPConnection **connection = 0, FMOD_DSPCONNECTION_TYPE type = FMOD_DSPCONNECTION_TYPE_STANDARD);
FMOD_RESULT F_API disconnectFrom (DSP *target, DSPConnection *connection = 0);
FMOD_RESULT F_API disconnectAll (bool inputs, bool outputs);
FMOD_RESULT F_API getNumInputs (int *numinputs);
FMOD_RESULT F_API getNumOutputs (int *numoutputs);
FMOD_RESULT F_API getInput (int index, DSP **input, DSPConnection **inputconnection);
FMOD_RESULT F_API getOutput (int index, DSP **output, DSPConnection **outputconnection);
// DSP unit control.
FMOD_RESULT F_API setActive (bool active);
FMOD_RESULT F_API getActive (bool *active);
FMOD_RESULT F_API setBypass (bool bypass);
FMOD_RESULT F_API getBypass (bool *bypass);
FMOD_RESULT F_API setWetDryMix (float prewet, float postwet, float dry);
FMOD_RESULT F_API getWetDryMix (float *prewet, float *postwet, float *dry);
FMOD_RESULT F_API setChannelFormat (FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode);
FMOD_RESULT F_API getChannelFormat (FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode);
FMOD_RESULT F_API getOutputChannelFormat (FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode);
FMOD_RESULT F_API reset ();
FMOD_RESULT F_API setCallback (FMOD_DSP_CALLBACK callback);
// DSP parameter control.
FMOD_RESULT F_API setParameterFloat (int index, float value);
FMOD_RESULT F_API setParameterInt (int index, int value);
FMOD_RESULT F_API setParameterBool (int index, bool value);
FMOD_RESULT F_API setParameterData (int index, void *data, unsigned int length);
FMOD_RESULT F_API getParameterFloat (int index, float *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getParameterInt (int index, int *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getParameterBool (int index, bool *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getParameterData (int index, void **data, unsigned int *length, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getNumParameters (int *numparams);
FMOD_RESULT F_API getParameterInfo (int index, FMOD_DSP_PARAMETER_DESC **desc);
FMOD_RESULT F_API getDataParameterIndex (int datatype, int *index);
FMOD_RESULT F_API showConfigDialog (void *hwnd, bool show);
// DSP attributes.
FMOD_RESULT F_API getInfo (char *name, unsigned int *version, int *channels, int *configwidth, int *configheight);
FMOD_RESULT F_API getType (FMOD_DSP_TYPE *type);
FMOD_RESULT F_API getIdle (bool *idle);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
// Metering.
FMOD_RESULT F_API setMeteringEnabled (bool inputEnabled, bool outputEnabled);
FMOD_RESULT F_API getMeteringEnabled (bool *inputEnabled, bool *outputEnabled);
FMOD_RESULT F_API getMeteringInfo (FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo);
FMOD_RESULT F_API getCPUUsage (unsigned int *exclusive, unsigned int *inclusive);
};
/*
'DSPConnection' API
*/
class DSPConnection
{
private:
// Constructor made private so user cannot statically instance a DSPConnection class. Appropriate DSPConnection creation or retrieval function must be used.
DSPConnection();
DSPConnection(const DSPConnection &);
public:
FMOD_RESULT F_API getInput (DSP **input);
FMOD_RESULT F_API getOutput (DSP **output);
FMOD_RESULT F_API setMix (float volume);
FMOD_RESULT F_API getMix (float *volume);
FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0);
FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0);
FMOD_RESULT F_API getType (FMOD_DSPCONNECTION_TYPE *type);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Geometry' API
*/
class Geometry
{
private:
// Constructor made private so user cannot statically instance a Geometry class. Appropriate Geometry creation or retrieval function must be used.
Geometry();
Geometry(const Geometry &);
public:
FMOD_RESULT F_API release ();
// Polygon manipulation.
FMOD_RESULT F_API addPolygon (float directocclusion, float reverbocclusion, bool doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex);
FMOD_RESULT F_API getNumPolygons (int *numpolygons);
FMOD_RESULT F_API getMaxPolygons (int *maxpolygons, int *maxvertices);
FMOD_RESULT F_API getPolygonNumVertices (int index, int *numvertices);
FMOD_RESULT F_API setPolygonVertex (int index, int vertexindex, const FMOD_VECTOR *vertex);
FMOD_RESULT F_API getPolygonVertex (int index, int vertexindex, FMOD_VECTOR *vertex);
FMOD_RESULT F_API setPolygonAttributes (int index, float directocclusion, float reverbocclusion, bool doublesided);
FMOD_RESULT F_API getPolygonAttributes (int index, float *directocclusion, float *reverbocclusion, bool *doublesided);
// Object manipulation.
FMOD_RESULT F_API setActive (bool active);
FMOD_RESULT F_API getActive (bool *active);
FMOD_RESULT F_API setRotation (const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API getRotation (FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API setPosition (const FMOD_VECTOR *position);
FMOD_RESULT F_API getPosition (FMOD_VECTOR *position);
FMOD_RESULT F_API setScale (const FMOD_VECTOR *scale);
FMOD_RESULT F_API getScale (FMOD_VECTOR *scale);
FMOD_RESULT F_API save (void *data, int *datasize);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Reverb' API
*/
class Reverb3D
{
private:
// Constructor made private so user cannot statically instance a Reverb3D class. Appropriate Reverb creation or retrieval function must be used.
Reverb3D();
Reverb3D(const Reverb3D &);
public:
FMOD_RESULT F_API release ();
// Reverb manipulation.
FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *position, float mindistance, float maxdistance);
FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *position, float *mindistance,float *maxdistance);
FMOD_RESULT F_API setProperties (const FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API getProperties (FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API setActive (bool active);
FMOD_RESULT F_API getActive (bool *active);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
}
#endif

View File

@ -0,0 +1 @@
/* Placeholder */

View File

@ -0,0 +1,136 @@
/* ======================================================================================== */
/* FMOD Core API - Codec development header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you are wanting to develop your own file format plugin to use with */
/* FMOD's codec system. With this header you can make your own fileformat plugin that FMOD */
/* can register and use. See the documentation and examples on how to make a working */
/* plugin. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api.html */
/* ======================================================================================== */
#ifndef _FMOD_CODEC_H
#define _FMOD_CODEC_H
/*
Codec types
*/
typedef struct FMOD_CODEC_STATE FMOD_CODEC_STATE;
typedef struct FMOD_CODEC_WAVEFORMAT FMOD_CODEC_WAVEFORMAT;
/*
Codec constants
*/
#define FMOD_CODEC_PLUGIN_VERSION 1
typedef int FMOD_CODEC_SEEK_METHOD;
#define FMOD_CODEC_SEEK_METHOD_SET 0
#define FMOD_CODEC_SEEK_METHOD_CURRENT 1
#define FMOD_CODEC_SEEK_METHOD_END 2
/*
Codec callbacks
*/
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_OPEN_CALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_CLOSE_CALLBACK) (FMOD_CODEC_STATE *codec_state);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_READ_CALLBACK) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int samples_in, unsigned int *samples_out);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETLENGTH_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *length, FMOD_TIMEUNIT lengthtype);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, unsigned int position, FMOD_TIMEUNIT postype);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *position, FMOD_TIMEUNIT postype);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SOUNDCREATE_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, FMOD_SOUND *sound);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETWAVEFORMAT_CALLBACK)(FMOD_CODEC_STATE *codec_state, int index, FMOD_CODEC_WAVEFORMAT *waveformat);
/*
Codec functions
*/
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_METADATA_FUNC) (FMOD_CODEC_STATE *codec_state, FMOD_TAGTYPE tagtype, char *name, void *data, unsigned int datalen, FMOD_TAGDATATYPE datatype, int unique);
typedef void * (F_CALLBACK *FMOD_CODEC_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line);
typedef void (F_CALLBACK *FMOD_CODEC_FREE_FUNC) (void *ptr, const char *file, int line);
typedef void (F_CALLBACK *FMOD_CODEC_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_READ_FUNC) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int sizebytes, unsigned int *bytesread);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_SEEK_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int pos, FMOD_CODEC_SEEK_METHOD method);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_TELL_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *pos);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_SIZE_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *size);
/*
Codec structures
*/
typedef struct FMOD_CODEC_DESCRIPTION
{
unsigned int apiversion;
const char *name;
unsigned int version;
int defaultasstream;
FMOD_TIMEUNIT timeunits;
FMOD_CODEC_OPEN_CALLBACK open;
FMOD_CODEC_CLOSE_CALLBACK close;
FMOD_CODEC_READ_CALLBACK read;
FMOD_CODEC_GETLENGTH_CALLBACK getlength;
FMOD_CODEC_SETPOSITION_CALLBACK setposition;
FMOD_CODEC_GETPOSITION_CALLBACK getposition;
FMOD_CODEC_SOUNDCREATE_CALLBACK soundcreate;
FMOD_CODEC_GETWAVEFORMAT_CALLBACK getwaveformat;
} FMOD_CODEC_DESCRIPTION;
struct FMOD_CODEC_WAVEFORMAT
{
const char* name;
FMOD_SOUND_FORMAT format;
int channels;
int frequency;
unsigned int lengthbytes;
unsigned int lengthpcm;
unsigned int pcmblocksize;
int loopstart;
int loopend;
FMOD_MODE mode;
FMOD_CHANNELMASK channelmask;
FMOD_CHANNELORDER channelorder;
float peakvolume;
};
typedef struct FMOD_CODEC_STATE_FUNCTIONS
{
FMOD_CODEC_METADATA_FUNC metadata;
FMOD_CODEC_ALLOC_FUNC alloc;
FMOD_CODEC_FREE_FUNC free;
FMOD_CODEC_LOG_FUNC log;
FMOD_CODEC_FILE_READ_FUNC read;
FMOD_CODEC_FILE_SEEK_FUNC seek;
FMOD_CODEC_FILE_TELL_FUNC tell;
FMOD_CODEC_FILE_SIZE_FUNC size;
} FMOD_CODEC_STATE_FUNCTIONS;
struct FMOD_CODEC_STATE
{
void *plugindata;
FMOD_CODEC_WAVEFORMAT *waveformat;
FMOD_CODEC_STATE_FUNCTIONS *functions;
int numsubsounds;
};
/*
Codec macros
*/
#define FMOD_CODEC_METADATA(_state, _tagtype, _name, _data, _datalen, _datatype, _unique) \
(_state)->functions->metadata(_state, _tagtype, _name, _data, _datalen, _datatype, _unique)
#define FMOD_CODEC_ALLOC(_state, _size, _align) \
(_state)->functions->alloc(_size, _align, __FILE__, __LINE__)
#define FMOD_CODEC_FREE(_state, _ptr) \
(_state)->functions->free(_ptr, __FILE__, __LINE__)
#define FMOD_CODEC_LOG(_state, _level, _location, _format, ...) \
(_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__)
#define FMOD_CODEC_FILE_READ(_state, _buffer, _sizebytes, _bytesread) \
(_state)->functions->read(_state, _buffer, _sizebytes, _bytesread)
#define FMOD_CODEC_FILE_SEEK(_state, _pos, _method) \
(_state)->functions->seek(_state, _pos, _method)
#define FMOD_CODEC_FILE_TELL(_state, _pos) \
(_state)->functions->tell(_state, _pos)
#define FMOD_CODEC_FILE_SIZE(_state, _size) \
(_state)->functions->size(_state, _size)
#endif

View File

@ -0,0 +1,899 @@
/* ======================================================================================== */
/* FMOD Core API - Common C/C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* This header is included by fmod.hpp (C++ interface) and fmod.h (C interface) */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api-common.html */
/* ======================================================================================== */
#ifndef _FMOD_COMMON_H
#define _FMOD_COMMON_H
/*
Library import helpers
*/
#if defined(_WIN32) || defined(__CYGWIN__)
#define F_CALL __stdcall
#else
#define F_CALL
#endif
#if defined(_WIN32) || defined(__CYGWIN__) || defined(__ORBIS__) || defined(F_USE_DECLSPEC)
#define F_EXPORT __declspec(dllexport)
#elif defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__) || defined(F_USE_ATTRIBUTE)
#define F_EXPORT __attribute__((visibility("default")))
#else
#define F_EXPORT
#endif
#ifdef DLL_EXPORTS
#define F_API F_EXPORT F_CALL
#else
#define F_API F_CALL
#endif
#define F_CALLBACK F_CALL
/*
FMOD core types
*/
typedef int FMOD_BOOL;
typedef struct FMOD_SYSTEM FMOD_SYSTEM;
typedef struct FMOD_SOUND FMOD_SOUND;
typedef struct FMOD_CHANNELCONTROL FMOD_CHANNELCONTROL;
typedef struct FMOD_CHANNEL FMOD_CHANNEL;
typedef struct FMOD_CHANNELGROUP FMOD_CHANNELGROUP;
typedef struct FMOD_SOUNDGROUP FMOD_SOUNDGROUP;
typedef struct FMOD_REVERB3D FMOD_REVERB3D;
typedef struct FMOD_DSP FMOD_DSP;
typedef struct FMOD_DSPCONNECTION FMOD_DSPCONNECTION;
typedef struct FMOD_POLYGON FMOD_POLYGON;
typedef struct FMOD_GEOMETRY FMOD_GEOMETRY;
typedef struct FMOD_SYNCPOINT FMOD_SYNCPOINT;
typedef struct FMOD_ASYNCREADINFO FMOD_ASYNCREADINFO;
/*
FMOD constants
*/
#define FMOD_VERSION 0x00020214 /* 0xaaaabbcc -> aaaa = product version, bb = major version, cc = minor version.*/
typedef unsigned int FMOD_DEBUG_FLAGS;
#define FMOD_DEBUG_LEVEL_NONE 0x00000000
#define FMOD_DEBUG_LEVEL_ERROR 0x00000001
#define FMOD_DEBUG_LEVEL_WARNING 0x00000002
#define FMOD_DEBUG_LEVEL_LOG 0x00000004
#define FMOD_DEBUG_TYPE_MEMORY 0x00000100
#define FMOD_DEBUG_TYPE_FILE 0x00000200
#define FMOD_DEBUG_TYPE_CODEC 0x00000400
#define FMOD_DEBUG_TYPE_TRACE 0x00000800
#define FMOD_DEBUG_DISPLAY_TIMESTAMPS 0x00010000
#define FMOD_DEBUG_DISPLAY_LINENUMBERS 0x00020000
#define FMOD_DEBUG_DISPLAY_THREAD 0x00040000
typedef unsigned int FMOD_MEMORY_TYPE;
#define FMOD_MEMORY_NORMAL 0x00000000
#define FMOD_MEMORY_STREAM_FILE 0x00000001
#define FMOD_MEMORY_STREAM_DECODE 0x00000002
#define FMOD_MEMORY_SAMPLEDATA 0x00000004
#define FMOD_MEMORY_DSP_BUFFER 0x00000008
#define FMOD_MEMORY_PLUGIN 0x00000010
#define FMOD_MEMORY_PERSISTENT 0x00200000
#define FMOD_MEMORY_ALL 0xFFFFFFFF
typedef unsigned int FMOD_INITFLAGS;
#define FMOD_INIT_NORMAL 0x00000000
#define FMOD_INIT_STREAM_FROM_UPDATE 0x00000001
#define FMOD_INIT_MIX_FROM_UPDATE 0x00000002
#define FMOD_INIT_3D_RIGHTHANDED 0x00000004
#define FMOD_INIT_CLIP_OUTPUT 0x00000008
#define FMOD_INIT_CHANNEL_LOWPASS 0x00000100
#define FMOD_INIT_CHANNEL_DISTANCEFILTER 0x00000200
#define FMOD_INIT_PROFILE_ENABLE 0x00010000
#define FMOD_INIT_VOL0_BECOMES_VIRTUAL 0x00020000
#define FMOD_INIT_GEOMETRY_USECLOSEST 0x00040000
#define FMOD_INIT_PREFER_DOLBY_DOWNMIX 0x00080000
#define FMOD_INIT_THREAD_UNSAFE 0x00100000
#define FMOD_INIT_PROFILE_METER_ALL 0x00200000
#define FMOD_INIT_MEMORY_TRACKING 0x00400000
typedef unsigned int FMOD_DRIVER_STATE;
#define FMOD_DRIVER_STATE_CONNECTED 0x00000001
#define FMOD_DRIVER_STATE_DEFAULT 0x00000002
typedef unsigned int FMOD_TIMEUNIT;
#define FMOD_TIMEUNIT_MS 0x00000001
#define FMOD_TIMEUNIT_PCM 0x00000002
#define FMOD_TIMEUNIT_PCMBYTES 0x00000004
#define FMOD_TIMEUNIT_RAWBYTES 0x00000008
#define FMOD_TIMEUNIT_PCMFRACTION 0x00000010
#define FMOD_TIMEUNIT_MODORDER 0x00000100
#define FMOD_TIMEUNIT_MODROW 0x00000200
#define FMOD_TIMEUNIT_MODPATTERN 0x00000400
typedef unsigned int FMOD_SYSTEM_CALLBACK_TYPE;
#define FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED 0x00000001
#define FMOD_SYSTEM_CALLBACK_DEVICELOST 0x00000002
#define FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED 0x00000004
#define FMOD_SYSTEM_CALLBACK_THREADCREATED 0x00000008
#define FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION 0x00000010
#define FMOD_SYSTEM_CALLBACK_PREMIX 0x00000020
#define FMOD_SYSTEM_CALLBACK_POSTMIX 0x00000040
#define FMOD_SYSTEM_CALLBACK_ERROR 0x00000080
#define FMOD_SYSTEM_CALLBACK_MIDMIX 0x00000100
#define FMOD_SYSTEM_CALLBACK_THREADDESTROYED 0x00000200
#define FMOD_SYSTEM_CALLBACK_PREUPDATE 0x00000400
#define FMOD_SYSTEM_CALLBACK_POSTUPDATE 0x00000800
#define FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED 0x00001000
#define FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX 0x00002000
#define FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE 0x00004000
#define FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN 0x00008000
#define FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED 0x00010000
#define FMOD_SYSTEM_CALLBACK_ALL 0xFFFFFFFF
typedef unsigned int FMOD_MODE;
#define FMOD_DEFAULT 0x00000000
#define FMOD_LOOP_OFF 0x00000001
#define FMOD_LOOP_NORMAL 0x00000002
#define FMOD_LOOP_BIDI 0x00000004
#define FMOD_2D 0x00000008
#define FMOD_3D 0x00000010
#define FMOD_CREATESTREAM 0x00000080
#define FMOD_CREATESAMPLE 0x00000100
#define FMOD_CREATECOMPRESSEDSAMPLE 0x00000200
#define FMOD_OPENUSER 0x00000400
#define FMOD_OPENMEMORY 0x00000800
#define FMOD_OPENMEMORY_POINT 0x10000000
#define FMOD_OPENRAW 0x00001000
#define FMOD_OPENONLY 0x00002000
#define FMOD_ACCURATETIME 0x00004000
#define FMOD_MPEGSEARCH 0x00008000
#define FMOD_NONBLOCKING 0x00010000
#define FMOD_UNIQUE 0x00020000
#define FMOD_3D_HEADRELATIVE 0x00040000
#define FMOD_3D_WORLDRELATIVE 0x00080000
#define FMOD_3D_INVERSEROLLOFF 0x00100000
#define FMOD_3D_LINEARROLLOFF 0x00200000
#define FMOD_3D_LINEARSQUAREROLLOFF 0x00400000
#define FMOD_3D_INVERSETAPEREDROLLOFF 0x00800000
#define FMOD_3D_CUSTOMROLLOFF 0x04000000
#define FMOD_3D_IGNOREGEOMETRY 0x40000000
#define FMOD_IGNORETAGS 0x02000000
#define FMOD_LOWMEM 0x08000000
#define FMOD_VIRTUAL_PLAYFROMSTART 0x80000000
typedef unsigned int FMOD_CHANNELMASK;
#define FMOD_CHANNELMASK_FRONT_LEFT 0x00000001
#define FMOD_CHANNELMASK_FRONT_RIGHT 0x00000002
#define FMOD_CHANNELMASK_FRONT_CENTER 0x00000004
#define FMOD_CHANNELMASK_LOW_FREQUENCY 0x00000008
#define FMOD_CHANNELMASK_SURROUND_LEFT 0x00000010
#define FMOD_CHANNELMASK_SURROUND_RIGHT 0x00000020
#define FMOD_CHANNELMASK_BACK_LEFT 0x00000040
#define FMOD_CHANNELMASK_BACK_RIGHT 0x00000080
#define FMOD_CHANNELMASK_BACK_CENTER 0x00000100
#define FMOD_CHANNELMASK_MONO (FMOD_CHANNELMASK_FRONT_LEFT)
#define FMOD_CHANNELMASK_STEREO (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT)
#define FMOD_CHANNELMASK_LRC (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER)
#define FMOD_CHANNELMASK_QUAD (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
#define FMOD_CHANNELMASK_SURROUND (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
#define FMOD_CHANNELMASK_5POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
#define FMOD_CHANNELMASK_5POINT1_REARS (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
#define FMOD_CHANNELMASK_7POINT0 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
#define FMOD_CHANNELMASK_7POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
typedef unsigned long long FMOD_PORT_INDEX;
#define FMOD_PORT_INDEX_NONE 0xFFFFFFFFFFFFFFFF
#define FMOD_PORT_INDEX_FLAG_VR_CONTROLLER 0x1000000000000000
typedef int FMOD_THREAD_PRIORITY;
/* Platform specific priority range */
#define FMOD_THREAD_PRIORITY_PLATFORM_MIN (-32 * 1024)
#define FMOD_THREAD_PRIORITY_PLATFORM_MAX ( 32 * 1024)
/* Platform agnostic priorities, maps internally to platform specific value */
#define FMOD_THREAD_PRIORITY_DEFAULT (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 1)
#define FMOD_THREAD_PRIORITY_LOW (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 2)
#define FMOD_THREAD_PRIORITY_MEDIUM (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 3)
#define FMOD_THREAD_PRIORITY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 4)
#define FMOD_THREAD_PRIORITY_VERY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 5)
#define FMOD_THREAD_PRIORITY_EXTREME (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 6)
#define FMOD_THREAD_PRIORITY_CRITICAL (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 7)
/* Thread defaults */
#define FMOD_THREAD_PRIORITY_MIXER FMOD_THREAD_PRIORITY_EXTREME
#define FMOD_THREAD_PRIORITY_FEEDER FMOD_THREAD_PRIORITY_CRITICAL
#define FMOD_THREAD_PRIORITY_STREAM FMOD_THREAD_PRIORITY_VERY_HIGH
#define FMOD_THREAD_PRIORITY_FILE FMOD_THREAD_PRIORITY_HIGH
#define FMOD_THREAD_PRIORITY_NONBLOCKING FMOD_THREAD_PRIORITY_HIGH
#define FMOD_THREAD_PRIORITY_RECORD FMOD_THREAD_PRIORITY_HIGH
#define FMOD_THREAD_PRIORITY_GEOMETRY FMOD_THREAD_PRIORITY_LOW
#define FMOD_THREAD_PRIORITY_PROFILER FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_STUDIO_UPDATE FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_BANK FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_CONVOLUTION1 FMOD_THREAD_PRIORITY_VERY_HIGH
#define FMOD_THREAD_PRIORITY_CONVOLUTION2 FMOD_THREAD_PRIORITY_VERY_HIGH
typedef unsigned int FMOD_THREAD_STACK_SIZE;
#define FMOD_THREAD_STACK_SIZE_DEFAULT 0
#define FMOD_THREAD_STACK_SIZE_MIXER (80 * 1024)
#define FMOD_THREAD_STACK_SIZE_FEEDER (16 * 1024)
#define FMOD_THREAD_STACK_SIZE_STREAM (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_FILE (64 * 1024)
#define FMOD_THREAD_STACK_SIZE_NONBLOCKING (112 * 1024)
#define FMOD_THREAD_STACK_SIZE_RECORD (16 * 1024)
#define FMOD_THREAD_STACK_SIZE_GEOMETRY (48 * 1024)
#define FMOD_THREAD_STACK_SIZE_PROFILER (128 * 1024)
#define FMOD_THREAD_STACK_SIZE_STUDIO_UPDATE (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_BANK (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_SAMPLE (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_CONVOLUTION1 (16 * 1024)
#define FMOD_THREAD_STACK_SIZE_CONVOLUTION2 (16 * 1024)
typedef long long FMOD_THREAD_AFFINITY;
/* Platform agnostic thread groupings */
#define FMOD_THREAD_AFFINITY_GROUP_DEFAULT 0x4000000000000000
#define FMOD_THREAD_AFFINITY_GROUP_A 0x4000000000000001
#define FMOD_THREAD_AFFINITY_GROUP_B 0x4000000000000002
#define FMOD_THREAD_AFFINITY_GROUP_C 0x4000000000000003
/* Thread defaults */
#define FMOD_THREAD_AFFINITY_MIXER FMOD_THREAD_AFFINITY_GROUP_A
#define FMOD_THREAD_AFFINITY_FEEDER FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_STREAM FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_FILE FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_NONBLOCKING FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_RECORD FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_GEOMETRY FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_PROFILER FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_STUDIO_UPDATE FMOD_THREAD_AFFINITY_GROUP_B
#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_BANK FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_CONVOLUTION1 FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_CONVOLUTION2 FMOD_THREAD_AFFINITY_GROUP_C
/* Core mask, valid up to 1 << 62 */
#define FMOD_THREAD_AFFINITY_CORE_ALL 0
#define FMOD_THREAD_AFFINITY_CORE_0 (1 << 0)
#define FMOD_THREAD_AFFINITY_CORE_1 (1 << 1)
#define FMOD_THREAD_AFFINITY_CORE_2 (1 << 2)
#define FMOD_THREAD_AFFINITY_CORE_3 (1 << 3)
#define FMOD_THREAD_AFFINITY_CORE_4 (1 << 4)
#define FMOD_THREAD_AFFINITY_CORE_5 (1 << 5)
#define FMOD_THREAD_AFFINITY_CORE_6 (1 << 6)
#define FMOD_THREAD_AFFINITY_CORE_7 (1 << 7)
#define FMOD_THREAD_AFFINITY_CORE_8 (1 << 8)
#define FMOD_THREAD_AFFINITY_CORE_9 (1 << 9)
#define FMOD_THREAD_AFFINITY_CORE_10 (1 << 10)
#define FMOD_THREAD_AFFINITY_CORE_11 (1 << 11)
#define FMOD_THREAD_AFFINITY_CORE_12 (1 << 12)
#define FMOD_THREAD_AFFINITY_CORE_13 (1 << 13)
#define FMOD_THREAD_AFFINITY_CORE_14 (1 << 14)
#define FMOD_THREAD_AFFINITY_CORE_15 (1 << 15)
/* Preset for FMOD_REVERB_PROPERTIES */
#define FMOD_PRESET_OFF { 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f }
#define FMOD_PRESET_GENERIC { 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f }
#define FMOD_PRESET_PADDEDCELL { 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f }
#define FMOD_PRESET_ROOM { 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f }
#define FMOD_PRESET_BATHROOM { 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f }
#define FMOD_PRESET_LIVINGROOM { 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f }
#define FMOD_PRESET_STONEROOM { 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f }
#define FMOD_PRESET_AUDITORIUM { 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f }
#define FMOD_PRESET_CONCERTHALL { 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f }
#define FMOD_PRESET_CAVE { 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f }
#define FMOD_PRESET_ARENA { 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f }
#define FMOD_PRESET_HANGAR { 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f }
#define FMOD_PRESET_CARPETTEDHALLWAY { 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f }
#define FMOD_PRESET_HALLWAY { 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f }
#define FMOD_PRESET_STONECORRIDOR { 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f }
#define FMOD_PRESET_ALLEY { 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f }
#define FMOD_PRESET_FOREST { 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f }
#define FMOD_PRESET_CITY { 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f }
#define FMOD_PRESET_MOUNTAINS { 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f }
#define FMOD_PRESET_QUARRY { 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f }
#define FMOD_PRESET_PLAIN { 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f }
#define FMOD_PRESET_PARKINGLOT { 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f }
#define FMOD_PRESET_SEWERPIPE { 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f }
#define FMOD_PRESET_UNDERWATER { 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f }
#define FMOD_MAX_CHANNEL_WIDTH 32
#define FMOD_MAX_SYSTEMS 8
#define FMOD_MAX_LISTENERS 8
#define FMOD_REVERB_MAXINSTANCES 4
typedef enum FMOD_THREAD_TYPE
{
FMOD_THREAD_TYPE_MIXER,
FMOD_THREAD_TYPE_FEEDER,
FMOD_THREAD_TYPE_STREAM,
FMOD_THREAD_TYPE_FILE,
FMOD_THREAD_TYPE_NONBLOCKING,
FMOD_THREAD_TYPE_RECORD,
FMOD_THREAD_TYPE_GEOMETRY,
FMOD_THREAD_TYPE_PROFILER,
FMOD_THREAD_TYPE_STUDIO_UPDATE,
FMOD_THREAD_TYPE_STUDIO_LOAD_BANK,
FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE,
FMOD_THREAD_TYPE_CONVOLUTION1,
FMOD_THREAD_TYPE_CONVOLUTION2,
FMOD_THREAD_TYPE_MAX,
FMOD_THREAD_TYPE_FORCEINT = 65536
} FMOD_THREAD_TYPE;
typedef enum FMOD_RESULT
{
FMOD_OK,
FMOD_ERR_BADCOMMAND,
FMOD_ERR_CHANNEL_ALLOC,
FMOD_ERR_CHANNEL_STOLEN,
FMOD_ERR_DMA,
FMOD_ERR_DSP_CONNECTION,
FMOD_ERR_DSP_DONTPROCESS,
FMOD_ERR_DSP_FORMAT,
FMOD_ERR_DSP_INUSE,
FMOD_ERR_DSP_NOTFOUND,
FMOD_ERR_DSP_RESERVED,
FMOD_ERR_DSP_SILENCE,
FMOD_ERR_DSP_TYPE,
FMOD_ERR_FILE_BAD,
FMOD_ERR_FILE_COULDNOTSEEK,
FMOD_ERR_FILE_DISKEJECTED,
FMOD_ERR_FILE_EOF,
FMOD_ERR_FILE_ENDOFDATA,
FMOD_ERR_FILE_NOTFOUND,
FMOD_ERR_FORMAT,
FMOD_ERR_HEADER_MISMATCH,
FMOD_ERR_HTTP,
FMOD_ERR_HTTP_ACCESS,
FMOD_ERR_HTTP_PROXY_AUTH,
FMOD_ERR_HTTP_SERVER_ERROR,
FMOD_ERR_HTTP_TIMEOUT,
FMOD_ERR_INITIALIZATION,
FMOD_ERR_INITIALIZED,
FMOD_ERR_INTERNAL,
FMOD_ERR_INVALID_FLOAT,
FMOD_ERR_INVALID_HANDLE,
FMOD_ERR_INVALID_PARAM,
FMOD_ERR_INVALID_POSITION,
FMOD_ERR_INVALID_SPEAKER,
FMOD_ERR_INVALID_SYNCPOINT,
FMOD_ERR_INVALID_THREAD,
FMOD_ERR_INVALID_VECTOR,
FMOD_ERR_MAXAUDIBLE,
FMOD_ERR_MEMORY,
FMOD_ERR_MEMORY_CANTPOINT,
FMOD_ERR_NEEDS3D,
FMOD_ERR_NEEDSHARDWARE,
FMOD_ERR_NET_CONNECT,
FMOD_ERR_NET_SOCKET_ERROR,
FMOD_ERR_NET_URL,
FMOD_ERR_NET_WOULD_BLOCK,
FMOD_ERR_NOTREADY,
FMOD_ERR_OUTPUT_ALLOCATED,
FMOD_ERR_OUTPUT_CREATEBUFFER,
FMOD_ERR_OUTPUT_DRIVERCALL,
FMOD_ERR_OUTPUT_FORMAT,
FMOD_ERR_OUTPUT_INIT,
FMOD_ERR_OUTPUT_NODRIVERS,
FMOD_ERR_PLUGIN,
FMOD_ERR_PLUGIN_MISSING,
FMOD_ERR_PLUGIN_RESOURCE,
FMOD_ERR_PLUGIN_VERSION,
FMOD_ERR_RECORD,
FMOD_ERR_REVERB_CHANNELGROUP,
FMOD_ERR_REVERB_INSTANCE,
FMOD_ERR_SUBSOUNDS,
FMOD_ERR_SUBSOUND_ALLOCATED,
FMOD_ERR_SUBSOUND_CANTMOVE,
FMOD_ERR_TAGNOTFOUND,
FMOD_ERR_TOOMANYCHANNELS,
FMOD_ERR_TRUNCATED,
FMOD_ERR_UNIMPLEMENTED,
FMOD_ERR_UNINITIALIZED,
FMOD_ERR_UNSUPPORTED,
FMOD_ERR_VERSION,
FMOD_ERR_EVENT_ALREADY_LOADED,
FMOD_ERR_EVENT_LIVEUPDATE_BUSY,
FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH,
FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT,
FMOD_ERR_EVENT_NOTFOUND,
FMOD_ERR_STUDIO_UNINITIALIZED,
FMOD_ERR_STUDIO_NOT_LOADED,
FMOD_ERR_INVALID_STRING,
FMOD_ERR_ALREADY_LOCKED,
FMOD_ERR_NOT_LOCKED,
FMOD_ERR_RECORD_DISCONNECTED,
FMOD_ERR_TOOMANYSAMPLES,
FMOD_RESULT_FORCEINT = 65536
} FMOD_RESULT;
typedef enum FMOD_CHANNELCONTROL_TYPE
{
FMOD_CHANNELCONTROL_CHANNEL,
FMOD_CHANNELCONTROL_CHANNELGROUP,
FMOD_CHANNELCONTROL_MAX,
FMOD_CHANNELCONTROL_FORCEINT = 65536
} FMOD_CHANNELCONTROL_TYPE;
typedef enum FMOD_OUTPUTTYPE
{
FMOD_OUTPUTTYPE_AUTODETECT,
FMOD_OUTPUTTYPE_UNKNOWN,
FMOD_OUTPUTTYPE_NOSOUND,
FMOD_OUTPUTTYPE_WAVWRITER,
FMOD_OUTPUTTYPE_NOSOUND_NRT,
FMOD_OUTPUTTYPE_WAVWRITER_NRT,
FMOD_OUTPUTTYPE_WASAPI,
FMOD_OUTPUTTYPE_ASIO,
FMOD_OUTPUTTYPE_PULSEAUDIO,
FMOD_OUTPUTTYPE_ALSA,
FMOD_OUTPUTTYPE_COREAUDIO,
FMOD_OUTPUTTYPE_AUDIOTRACK,
FMOD_OUTPUTTYPE_OPENSL,
FMOD_OUTPUTTYPE_AUDIOOUT,
FMOD_OUTPUTTYPE_AUDIO3D,
FMOD_OUTPUTTYPE_WEBAUDIO,
FMOD_OUTPUTTYPE_NNAUDIO,
FMOD_OUTPUTTYPE_WINSONIC,
FMOD_OUTPUTTYPE_AAUDIO,
FMOD_OUTPUTTYPE_AUDIOWORKLET,
FMOD_OUTPUTTYPE_PHASE,
FMOD_OUTPUTTYPE_MAX,
FMOD_OUTPUTTYPE_FORCEINT = 65536
} FMOD_OUTPUTTYPE;
typedef enum FMOD_DEBUG_MODE
{
FMOD_DEBUG_MODE_TTY,
FMOD_DEBUG_MODE_FILE,
FMOD_DEBUG_MODE_CALLBACK,
FMOD_DEBUG_MODE_FORCEINT = 65536
} FMOD_DEBUG_MODE;
typedef enum FMOD_SPEAKERMODE
{
FMOD_SPEAKERMODE_DEFAULT,
FMOD_SPEAKERMODE_RAW,
FMOD_SPEAKERMODE_MONO,
FMOD_SPEAKERMODE_STEREO,
FMOD_SPEAKERMODE_QUAD,
FMOD_SPEAKERMODE_SURROUND,
FMOD_SPEAKERMODE_5POINT1,
FMOD_SPEAKERMODE_7POINT1,
FMOD_SPEAKERMODE_7POINT1POINT4,
FMOD_SPEAKERMODE_MAX,
FMOD_SPEAKERMODE_FORCEINT = 65536
} FMOD_SPEAKERMODE;
typedef enum FMOD_SPEAKER
{
FMOD_SPEAKER_NONE = -1,
FMOD_SPEAKER_FRONT_LEFT = 0,
FMOD_SPEAKER_FRONT_RIGHT,
FMOD_SPEAKER_FRONT_CENTER,
FMOD_SPEAKER_LOW_FREQUENCY,
FMOD_SPEAKER_SURROUND_LEFT,
FMOD_SPEAKER_SURROUND_RIGHT,
FMOD_SPEAKER_BACK_LEFT,
FMOD_SPEAKER_BACK_RIGHT,
FMOD_SPEAKER_TOP_FRONT_LEFT,
FMOD_SPEAKER_TOP_FRONT_RIGHT,
FMOD_SPEAKER_TOP_BACK_LEFT,
FMOD_SPEAKER_TOP_BACK_RIGHT,
FMOD_SPEAKER_MAX,
FMOD_SPEAKER_FORCEINT = 65536
} FMOD_SPEAKER;
typedef enum FMOD_CHANNELORDER
{
FMOD_CHANNELORDER_DEFAULT,
FMOD_CHANNELORDER_WAVEFORMAT,
FMOD_CHANNELORDER_PROTOOLS,
FMOD_CHANNELORDER_ALLMONO,
FMOD_CHANNELORDER_ALLSTEREO,
FMOD_CHANNELORDER_ALSA,
FMOD_CHANNELORDER_MAX,
FMOD_CHANNELORDER_FORCEINT = 65536
} FMOD_CHANNELORDER;
typedef enum FMOD_PLUGINTYPE
{
FMOD_PLUGINTYPE_OUTPUT,
FMOD_PLUGINTYPE_CODEC,
FMOD_PLUGINTYPE_DSP,
FMOD_PLUGINTYPE_MAX,
FMOD_PLUGINTYPE_FORCEINT = 65536
} FMOD_PLUGINTYPE;
typedef enum FMOD_SOUND_TYPE
{
FMOD_SOUND_TYPE_UNKNOWN,
FMOD_SOUND_TYPE_AIFF,
FMOD_SOUND_TYPE_ASF,
FMOD_SOUND_TYPE_DLS,
FMOD_SOUND_TYPE_FLAC,
FMOD_SOUND_TYPE_FSB,
FMOD_SOUND_TYPE_IT,
FMOD_SOUND_TYPE_MIDI,
FMOD_SOUND_TYPE_MOD,
FMOD_SOUND_TYPE_MPEG,
FMOD_SOUND_TYPE_OGGVORBIS,
FMOD_SOUND_TYPE_PLAYLIST,
FMOD_SOUND_TYPE_RAW,
FMOD_SOUND_TYPE_S3M,
FMOD_SOUND_TYPE_USER,
FMOD_SOUND_TYPE_WAV,
FMOD_SOUND_TYPE_XM,
FMOD_SOUND_TYPE_XMA,
FMOD_SOUND_TYPE_AUDIOQUEUE,
FMOD_SOUND_TYPE_AT9,
FMOD_SOUND_TYPE_VORBIS,
FMOD_SOUND_TYPE_MEDIA_FOUNDATION,
FMOD_SOUND_TYPE_MEDIACODEC,
FMOD_SOUND_TYPE_FADPCM,
FMOD_SOUND_TYPE_OPUS,
FMOD_SOUND_TYPE_MAX,
FMOD_SOUND_TYPE_FORCEINT = 65536
} FMOD_SOUND_TYPE;
typedef enum FMOD_SOUND_FORMAT
{
FMOD_SOUND_FORMAT_NONE,
FMOD_SOUND_FORMAT_PCM8,
FMOD_SOUND_FORMAT_PCM16,
FMOD_SOUND_FORMAT_PCM24,
FMOD_SOUND_FORMAT_PCM32,
FMOD_SOUND_FORMAT_PCMFLOAT,
FMOD_SOUND_FORMAT_BITSTREAM,
FMOD_SOUND_FORMAT_MAX,
FMOD_SOUND_FORMAT_FORCEINT = 65536
} FMOD_SOUND_FORMAT;
typedef enum FMOD_OPENSTATE
{
FMOD_OPENSTATE_READY,
FMOD_OPENSTATE_LOADING,
FMOD_OPENSTATE_ERROR,
FMOD_OPENSTATE_CONNECTING,
FMOD_OPENSTATE_BUFFERING,
FMOD_OPENSTATE_SEEKING,
FMOD_OPENSTATE_PLAYING,
FMOD_OPENSTATE_SETPOSITION,
FMOD_OPENSTATE_MAX,
FMOD_OPENSTATE_FORCEINT = 65536
} FMOD_OPENSTATE;
typedef enum FMOD_SOUNDGROUP_BEHAVIOR
{
FMOD_SOUNDGROUP_BEHAVIOR_FAIL,
FMOD_SOUNDGROUP_BEHAVIOR_MUTE,
FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST,
FMOD_SOUNDGROUP_BEHAVIOR_MAX,
FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT = 65536
} FMOD_SOUNDGROUP_BEHAVIOR;
typedef enum FMOD_CHANNELCONTROL_CALLBACK_TYPE
{
FMOD_CHANNELCONTROL_CALLBACK_END,
FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE,
FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT,
FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION,
FMOD_CHANNELCONTROL_CALLBACK_MAX,
FMOD_CHANNELCONTROL_CALLBACK_FORCEINT = 65536
} FMOD_CHANNELCONTROL_CALLBACK_TYPE;
typedef enum FMOD_CHANNELCONTROL_DSP_INDEX
{
FMOD_CHANNELCONTROL_DSP_HEAD = -1,
FMOD_CHANNELCONTROL_DSP_FADER = -2,
FMOD_CHANNELCONTROL_DSP_TAIL = -3,
FMOD_CHANNELCONTROL_DSP_FORCEINT = 65536
} FMOD_CHANNELCONTROL_DSP_INDEX;
typedef enum FMOD_ERRORCALLBACK_INSTANCETYPE
{
FMOD_ERRORCALLBACK_INSTANCETYPE_NONE,
FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM,
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL,
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP,
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL,
FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND,
FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP,
FMOD_ERRORCALLBACK_INSTANCETYPE_DSP,
FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION,
FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY,
FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY,
FMOD_ERRORCALLBACK_INSTANCETYPE_FORCEINT = 65536
} FMOD_ERRORCALLBACK_INSTANCETYPE;
typedef enum FMOD_DSP_RESAMPLER
{
FMOD_DSP_RESAMPLER_DEFAULT,
FMOD_DSP_RESAMPLER_NOINTERP,
FMOD_DSP_RESAMPLER_LINEAR,
FMOD_DSP_RESAMPLER_CUBIC,
FMOD_DSP_RESAMPLER_SPLINE,
FMOD_DSP_RESAMPLER_MAX,
FMOD_DSP_RESAMPLER_FORCEINT = 65536
} FMOD_DSP_RESAMPLER;
typedef enum FMOD_DSP_CALLBACK_TYPE
{
FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE,
FMOD_DSP_CALLBACK_MAX,
FMOD_DSP_CALLBACK_FORCEINT = 65536
} FMOD_DSP_CALLBACK_TYPE;
typedef enum FMOD_DSPCONNECTION_TYPE
{
FMOD_DSPCONNECTION_TYPE_STANDARD,
FMOD_DSPCONNECTION_TYPE_SIDECHAIN,
FMOD_DSPCONNECTION_TYPE_SEND,
FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN,
FMOD_DSPCONNECTION_TYPE_MAX,
FMOD_DSPCONNECTION_TYPE_FORCEINT = 65536
} FMOD_DSPCONNECTION_TYPE;
typedef enum FMOD_TAGTYPE
{
FMOD_TAGTYPE_UNKNOWN,
FMOD_TAGTYPE_ID3V1,
FMOD_TAGTYPE_ID3V2,
FMOD_TAGTYPE_VORBISCOMMENT,
FMOD_TAGTYPE_SHOUTCAST,
FMOD_TAGTYPE_ICECAST,
FMOD_TAGTYPE_ASF,
FMOD_TAGTYPE_MIDI,
FMOD_TAGTYPE_PLAYLIST,
FMOD_TAGTYPE_FMOD,
FMOD_TAGTYPE_USER,
FMOD_TAGTYPE_MAX,
FMOD_TAGTYPE_FORCEINT = 65536
} FMOD_TAGTYPE;
typedef enum FMOD_TAGDATATYPE
{
FMOD_TAGDATATYPE_BINARY,
FMOD_TAGDATATYPE_INT,
FMOD_TAGDATATYPE_FLOAT,
FMOD_TAGDATATYPE_STRING,
FMOD_TAGDATATYPE_STRING_UTF16,
FMOD_TAGDATATYPE_STRING_UTF16BE,
FMOD_TAGDATATYPE_STRING_UTF8,
FMOD_TAGDATATYPE_MAX,
FMOD_TAGDATATYPE_FORCEINT = 65536
} FMOD_TAGDATATYPE;
typedef enum FMOD_PORT_TYPE
{
FMOD_PORT_TYPE_MUSIC,
FMOD_PORT_TYPE_COPYRIGHT_MUSIC,
FMOD_PORT_TYPE_VOICE,
FMOD_PORT_TYPE_CONTROLLER,
FMOD_PORT_TYPE_PERSONAL,
FMOD_PORT_TYPE_VIBRATION,
FMOD_PORT_TYPE_AUX,
FMOD_PORT_TYPE_MAX,
FMOD_PORT_TYPE_FORCEINT = 65536
} FMOD_PORT_TYPE;
/*
FMOD callbacks
*/
typedef FMOD_RESULT (F_CALL *FMOD_DEBUG_CALLBACK) (FMOD_DEBUG_FLAGS flags, const char *file, int line, const char* func, const char* message);
typedef FMOD_RESULT (F_CALL *FMOD_SYSTEM_CALLBACK) (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void* commanddata2, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_CHANNELCONTROL_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commanddata1, void *commanddata2);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_CALLBACK) (FMOD_DSP *dsp, FMOD_DSP_CALLBACK_TYPE type, void *data);
typedef FMOD_RESULT (F_CALL *FMOD_SOUND_NONBLOCK_CALLBACK) (FMOD_SOUND *sound, FMOD_RESULT result);
typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMREAD_CALLBACK) (FMOD_SOUND *sound, void *data, unsigned int datalen);
typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMSETPOS_CALLBACK) (FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_OPEN_CALLBACK) (const char *name, unsigned int *filesize, void **handle, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_CLOSE_CALLBACK) (void *handle, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_READ_CALLBACK) (void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_SEEK_CALLBACK) (void *handle, unsigned int pos, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCREAD_CALLBACK) (FMOD_ASYNCREADINFO *info, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCCANCEL_CALLBACK)(FMOD_ASYNCREADINFO *info, void *userdata);
typedef void (F_CALL *FMOD_FILE_ASYNCDONE_FUNC) (FMOD_ASYNCREADINFO *info, FMOD_RESULT result);
typedef void* (F_CALL *FMOD_MEMORY_ALLOC_CALLBACK) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void* (F_CALL *FMOD_MEMORY_REALLOC_CALLBACK) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void (F_CALL *FMOD_MEMORY_FREE_CALLBACK) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef float (F_CALL *FMOD_3D_ROLLOFF_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, float distance);
/*
FMOD structs
*/
struct FMOD_ASYNCREADINFO
{
void *handle;
unsigned int offset;
unsigned int sizebytes;
int priority;
void *userdata;
void *buffer;
unsigned int bytesread;
FMOD_FILE_ASYNCDONE_FUNC done;
};
typedef struct FMOD_VECTOR
{
float x;
float y;
float z;
} FMOD_VECTOR;
typedef struct FMOD_3D_ATTRIBUTES
{
FMOD_VECTOR position;
FMOD_VECTOR velocity;
FMOD_VECTOR forward;
FMOD_VECTOR up;
} FMOD_3D_ATTRIBUTES;
typedef struct FMOD_GUID
{
unsigned int Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} FMOD_GUID;
typedef struct FMOD_PLUGINLIST
{
FMOD_PLUGINTYPE type;
void *description;
} FMOD_PLUGINLIST;
typedef struct FMOD_ADVANCEDSETTINGS
{
int cbSize;
int maxMPEGCodecs;
int maxADPCMCodecs;
int maxXMACodecs;
int maxVorbisCodecs;
int maxAT9Codecs;
int maxFADPCMCodecs;
int maxPCMCodecs;
int ASIONumChannels;
char **ASIOChannelList;
FMOD_SPEAKER *ASIOSpeakerList;
float vol0virtualvol;
unsigned int defaultDecodeBufferSize;
unsigned short profilePort;
unsigned int geometryMaxFadeTime;
float distanceFilterCenterFreq;
int reverb3Dinstance;
int DSPBufferPoolSize;
FMOD_DSP_RESAMPLER resamplerMethod;
unsigned int randomSeed;
int maxConvolutionThreads;
int maxOpusCodecs;
} FMOD_ADVANCEDSETTINGS;
typedef struct FMOD_TAG
{
FMOD_TAGTYPE type;
FMOD_TAGDATATYPE datatype;
char *name;
void *data;
unsigned int datalen;
FMOD_BOOL updated;
} FMOD_TAG;
typedef struct FMOD_CREATESOUNDEXINFO
{
int cbsize;
unsigned int length;
unsigned int fileoffset;
int numchannels;
int defaultfrequency;
FMOD_SOUND_FORMAT format;
unsigned int decodebuffersize;
int initialsubsound;
int numsubsounds;
int *inclusionlist;
int inclusionlistnum;
FMOD_SOUND_PCMREAD_CALLBACK pcmreadcallback;
FMOD_SOUND_PCMSETPOS_CALLBACK pcmsetposcallback;
FMOD_SOUND_NONBLOCK_CALLBACK nonblockcallback;
const char *dlsname;
const char *encryptionkey;
int maxpolyphony;
void *userdata;
FMOD_SOUND_TYPE suggestedsoundtype;
FMOD_FILE_OPEN_CALLBACK fileuseropen;
FMOD_FILE_CLOSE_CALLBACK fileuserclose;
FMOD_FILE_READ_CALLBACK fileuserread;
FMOD_FILE_SEEK_CALLBACK fileuserseek;
FMOD_FILE_ASYNCREAD_CALLBACK fileuserasyncread;
FMOD_FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel;
void *fileuserdata;
int filebuffersize;
FMOD_CHANNELORDER channelorder;
FMOD_SOUNDGROUP *initialsoundgroup;
unsigned int initialseekposition;
FMOD_TIMEUNIT initialseekpostype;
int ignoresetfilesystem;
unsigned int audioqueuepolicy;
unsigned int minmidigranularity;
int nonblockthreadid;
FMOD_GUID *fsbguid;
} FMOD_CREATESOUNDEXINFO;
typedef struct FMOD_REVERB_PROPERTIES
{
float DecayTime;
float EarlyDelay;
float LateDelay;
float HFReference;
float HFDecayRatio;
float Diffusion;
float Density;
float LowShelfFrequency;
float LowShelfGain;
float HighCut;
float EarlyLateMix;
float WetLevel;
} FMOD_REVERB_PROPERTIES;
typedef struct FMOD_ERRORCALLBACK_INFO
{
FMOD_RESULT result;
FMOD_ERRORCALLBACK_INSTANCETYPE instancetype;
void *instance;
const char *functionname;
const char *functionparams;
} FMOD_ERRORCALLBACK_INFO;
typedef struct FMOD_CPU_USAGE
{
float dsp;
float stream;
float geometry;
float update;
float convolution1;
float convolution2;
} FMOD_CPU_USAGE;
typedef struct FMOD_DSP_DATA_PARAMETER_INFO
{
void *data;
unsigned int length;
int index;
} FMOD_DSP_DATA_PARAMETER_INFO;
/*
FMOD optional headers for plugin development
*/
#include "fmod_codec.h"
#include "fmod_dsp.h"
#include "fmod_output.h"
#endif

View File

@ -0,0 +1,421 @@
/* ======================================================================================== */
/* FMOD Core API - DSP header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you are wanting to develop your own DSP plugin to use with FMODs */
/* dsp system. With this header you can make your own DSP plugin that FMOD can */
/* register and use. See the documentation and examples on how to make a working plugin. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/plugin-api-dsp.html */
/* =========================================================================================*/
#ifndef _FMOD_DSP_H
#define _FMOD_DSP_H
#include "fmod_dsp_effects.h"
typedef struct FMOD_DSP_STATE FMOD_DSP_STATE;
typedef struct FMOD_DSP_BUFFER_ARRAY FMOD_DSP_BUFFER_ARRAY;
typedef struct FMOD_COMPLEX FMOD_COMPLEX;
/*
DSP Constants
*/
#define FMOD_PLUGIN_SDK_VERSION 110
#define FMOD_DSP_GETPARAM_VALUESTR_LENGTH 32
typedef enum
{
FMOD_DSP_PROCESS_PERFORM,
FMOD_DSP_PROCESS_QUERY
} FMOD_DSP_PROCESS_OPERATION;
typedef enum FMOD_DSP_PAN_SURROUND_FLAGS
{
FMOD_DSP_PAN_SURROUND_DEFAULT = 0,
FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED = 1,
FMOD_DSP_PAN_SURROUND_FLAGS_FORCEINT = 65536
} FMOD_DSP_PAN_SURROUND_FLAGS;
typedef enum
{
FMOD_DSP_PARAMETER_TYPE_FLOAT,
FMOD_DSP_PARAMETER_TYPE_INT,
FMOD_DSP_PARAMETER_TYPE_BOOL,
FMOD_DSP_PARAMETER_TYPE_DATA,
FMOD_DSP_PARAMETER_TYPE_MAX,
FMOD_DSP_PARAMETER_TYPE_FORCEINT = 65536
} FMOD_DSP_PARAMETER_TYPE;
typedef enum
{
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR,
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO,
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR,
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_FORCEINT = 65536
} FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE;
typedef enum
{
FMOD_DSP_PARAMETER_DATA_TYPE_USER = 0,
FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1,
FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2,
FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3,
FMOD_DSP_PARAMETER_DATA_TYPE_FFT = -4,
FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5,
FMOD_DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6,
} FMOD_DSP_PARAMETER_DATA_TYPE;
/*
DSP Callbacks
*/
typedef FMOD_RESULT (F_CALL *FMOD_DSP_CREATE_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_RELEASE_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_RESET_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_READ_CALLBACK) (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPOSITION_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int pos);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SHOULDIPROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float value);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int value);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void **data, unsigned int *length, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_REGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_MIX_CALLBACK) (FMOD_DSP_STATE *dsp_state, int stage);
/*
DSP Functions
*/
typedef void * (F_CALL *FMOD_DSP_ALLOC_FUNC) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void * (F_CALL *FMOD_DSP_REALLOC_FUNC) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void (F_CALL *FMOD_DSP_FREE_FUNC) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void (F_CALL *FMOD_DSP_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *str, ...);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSAMPLERATE_FUNC) (FMOD_DSP_STATE *dsp_state, int *rate);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETBLOCKSIZE_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned int *blocksize);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSPEAKERMODE_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE *speakermode_mixer, FMOD_SPEAKERMODE *speakermode_output);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETCLOCK_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned long long *clock, unsigned int *offset, unsigned int *length);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETLISTENERATTRIBUTES_FUNC) (FMOD_DSP_STATE *dsp_state, int *numlisteners, FMOD_3D_ATTRIBUTES *attributes);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETUSERDATA_FUNC) (FMOD_DSP_STATE *dsp_state, void **userdata);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_FFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const float *signal, FMOD_COMPLEX* dft, const float *window, int signalhop);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_IFFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const FMOD_COMPLEX *dft, float* signal, const float *window, int signalhop);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float lowFrequencyGain, float overallGain, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix, FMOD_DSP_PAN_SURROUND_FLAGS flags);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, float *gain);
/*
DSP Structures
*/
struct FMOD_DSP_BUFFER_ARRAY
{
int numbuffers;
int *buffernumchannels;
FMOD_CHANNELMASK *bufferchannelmask;
float **buffers;
FMOD_SPEAKERMODE speakermode;
};
struct FMOD_COMPLEX
{
float real;
float imag;
};
typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR
{
int numpoints;
float *pointparamvalues;
float *pointpositions;
} FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR;
typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING
{
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE type;
FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping;
} FMOD_DSP_PARAMETER_FLOAT_MAPPING;
typedef struct FMOD_DSP_PARAMETER_DESC_FLOAT
{
float min;
float max;
float defaultval;
FMOD_DSP_PARAMETER_FLOAT_MAPPING mapping;
} FMOD_DSP_PARAMETER_DESC_FLOAT;
typedef struct FMOD_DSP_PARAMETER_DESC_INT
{
int min;
int max;
int defaultval;
FMOD_BOOL goestoinf;
const char* const* valuenames;
} FMOD_DSP_PARAMETER_DESC_INT;
typedef struct FMOD_DSP_PARAMETER_DESC_BOOL
{
FMOD_BOOL defaultval;
const char* const* valuenames;
} FMOD_DSP_PARAMETER_DESC_BOOL;
typedef struct FMOD_DSP_PARAMETER_DESC_DATA
{
int datatype;
} FMOD_DSP_PARAMETER_DESC_DATA;
typedef struct FMOD_DSP_PARAMETER_DESC
{
FMOD_DSP_PARAMETER_TYPE type;
char name[16];
char label[16];
const char *description;
union
{
FMOD_DSP_PARAMETER_DESC_FLOAT floatdesc;
FMOD_DSP_PARAMETER_DESC_INT intdesc;
FMOD_DSP_PARAMETER_DESC_BOOL booldesc;
FMOD_DSP_PARAMETER_DESC_DATA datadesc;
};
} FMOD_DSP_PARAMETER_DESC;
typedef struct FMOD_DSP_PARAMETER_OVERALLGAIN
{
float linear_gain;
float linear_gain_additive;
} FMOD_DSP_PARAMETER_OVERALLGAIN;
typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES
{
FMOD_3D_ATTRIBUTES relative;
FMOD_3D_ATTRIBUTES absolute;
} FMOD_DSP_PARAMETER_3DATTRIBUTES;
typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI
{
int numlisteners;
FMOD_3D_ATTRIBUTES relative[FMOD_MAX_LISTENERS];
float weight[FMOD_MAX_LISTENERS];
FMOD_3D_ATTRIBUTES absolute;
} FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI;
typedef struct FMOD_DSP_PARAMETER_ATTENUATION_RANGE
{
float min;
float max;
} FMOD_DSP_PARAMETER_ATTENUATION_RANGE;
typedef struct FMOD_DSP_PARAMETER_SIDECHAIN
{
FMOD_BOOL sidechainenable;
} FMOD_DSP_PARAMETER_SIDECHAIN;
typedef struct FMOD_DSP_PARAMETER_FFT
{
int length;
int numchannels;
float *spectrum[32];
} FMOD_DSP_PARAMETER_FFT;
typedef struct FMOD_DSP_DESCRIPTION
{
unsigned int pluginsdkversion;
char name[32];
unsigned int version;
int numinputbuffers;
int numoutputbuffers;
FMOD_DSP_CREATE_CALLBACK create;
FMOD_DSP_RELEASE_CALLBACK release;
FMOD_DSP_RESET_CALLBACK reset;
FMOD_DSP_READ_CALLBACK read;
FMOD_DSP_PROCESS_CALLBACK process;
FMOD_DSP_SETPOSITION_CALLBACK setposition;
int numparameters;
FMOD_DSP_PARAMETER_DESC **paramdesc;
FMOD_DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat;
FMOD_DSP_SETPARAM_INT_CALLBACK setparameterint;
FMOD_DSP_SETPARAM_BOOL_CALLBACK setparameterbool;
FMOD_DSP_SETPARAM_DATA_CALLBACK setparameterdata;
FMOD_DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat;
FMOD_DSP_GETPARAM_INT_CALLBACK getparameterint;
FMOD_DSP_GETPARAM_BOOL_CALLBACK getparameterbool;
FMOD_DSP_GETPARAM_DATA_CALLBACK getparameterdata;
FMOD_DSP_SHOULDIPROCESS_CALLBACK shouldiprocess;
void *userdata;
FMOD_DSP_SYSTEM_REGISTER_CALLBACK sys_register;
FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister;
FMOD_DSP_SYSTEM_MIX_CALLBACK sys_mix;
} FMOD_DSP_DESCRIPTION;
typedef struct FMOD_DSP_STATE_DFT_FUNCTIONS
{
FMOD_DSP_DFT_FFTREAL_FUNC fftreal;
FMOD_DSP_DFT_IFFTREAL_FUNC inversefftreal;
} FMOD_DSP_STATE_DFT_FUNCTIONS;
typedef struct FMOD_DSP_STATE_PAN_FUNCTIONS
{
FMOD_DSP_PAN_SUMMONOMATRIX_FUNC summonomatrix;
FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC sumstereomatrix;
FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC sumsurroundmatrix;
FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC summonotosurroundmatrix;
FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix;
FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC getrolloffgain;
} FMOD_DSP_STATE_PAN_FUNCTIONS;
typedef struct FMOD_DSP_STATE_FUNCTIONS
{
FMOD_DSP_ALLOC_FUNC alloc;
FMOD_DSP_REALLOC_FUNC realloc;
FMOD_DSP_FREE_FUNC free;
FMOD_DSP_GETSAMPLERATE_FUNC getsamplerate;
FMOD_DSP_GETBLOCKSIZE_FUNC getblocksize;
FMOD_DSP_STATE_DFT_FUNCTIONS *dft;
FMOD_DSP_STATE_PAN_FUNCTIONS *pan;
FMOD_DSP_GETSPEAKERMODE_FUNC getspeakermode;
FMOD_DSP_GETCLOCK_FUNC getclock;
FMOD_DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes;
FMOD_DSP_LOG_FUNC log;
FMOD_DSP_GETUSERDATA_FUNC getuserdata;
} FMOD_DSP_STATE_FUNCTIONS;
struct FMOD_DSP_STATE
{
void *instance;
void *plugindata;
FMOD_CHANNELMASK channelmask;
FMOD_SPEAKERMODE source_speakermode;
float *sidechaindata;
int sidechainchannels;
FMOD_DSP_STATE_FUNCTIONS *functions;
int systemobject;
};
typedef struct FMOD_DSP_METERING_INFO
{
int numsamples;
float peaklevel[32];
float rmslevel[32];
short numchannels;
} FMOD_DSP_METERING_INFO;
/*
DSP Macros
*/
#define FMOD_DSP_INIT_PARAMDESC_FLOAT(_paramstruct, _name, _label, _description, _min, _max, _defaultval) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \
strncpy((_paramstruct).name, _name, 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).floatdesc.min = _min; \
(_paramstruct).floatdesc.max = _max; \
(_paramstruct).floatdesc.defaultval = _defaultval; \
(_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO;
#define FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(_paramstruct, _name, _label, _description, _defaultval, _values, _positions); \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).floatdesc.min = _values[0]; \
(_paramstruct).floatdesc.max = _values[sizeof(_values) / sizeof(float) - 1]; \
(_paramstruct).floatdesc.defaultval = _defaultval; \
(_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR; \
(_paramstruct).floatdesc.mapping.piecewiselinearmapping.numpoints = sizeof(_values) / sizeof(float); \
(_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointparamvalues = _values; \
(_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointpositions = _positions;
#define FMOD_DSP_INIT_PARAMDESC_INT(_paramstruct, _name, _label, _description, _min, _max, _defaultval, _goestoinf, _valuenames) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).intdesc.min = _min; \
(_paramstruct).intdesc.max = _max; \
(_paramstruct).intdesc.defaultval = _defaultval; \
(_paramstruct).intdesc.goestoinf = _goestoinf; \
(_paramstruct).intdesc.valuenames = _valuenames;
#define FMOD_DSP_INIT_PARAMDESC_INT_ENUMERATED(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).intdesc.min = 0; \
(_paramstruct).intdesc.max = sizeof(_valuenames) / sizeof(char*) - 1; \
(_paramstruct).intdesc.defaultval = _defaultval; \
(_paramstruct).intdesc.goestoinf = false; \
(_paramstruct).intdesc.valuenames = _valuenames;
#define FMOD_DSP_INIT_PARAMDESC_BOOL(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_BOOL; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).booldesc.defaultval = _defaultval; \
(_paramstruct).booldesc.valuenames = _valuenames;
#define FMOD_DSP_INIT_PARAMDESC_DATA(_paramstruct, _name, _label, _description, _datatype) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_DATA; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).datadesc.datatype = _datatype;
#define FMOD_DSP_ALLOC(_state, _size) \
(_state)->functions->alloc(_size, FMOD_MEMORY_NORMAL, __FILE__)
#define FMOD_DSP_REALLOC(_state, _ptr, _size) \
(_state)->functions->realloc(_ptr, _size, FMOD_MEMORY_NORMAL, __FILE__)
#define FMOD_DSP_FREE(_state, _ptr) \
(_state)->functions->free(_ptr, FMOD_MEMORY_NORMAL, __FILE__)
#define FMOD_DSP_LOG(_state, _level, _location, _format, ...) \
(_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__)
#define FMOD_DSP_GETSAMPLERATE(_state, _rate) \
(_state)->functions->getsamplerate(_state, _rate)
#define FMOD_DSP_GETBLOCKSIZE(_state, _blocksize) \
(_state)->functions->getblocksize(_state, _blocksize)
#define FMOD_DSP_GETSPEAKERMODE(_state, _speakermodemix, _speakermodeout) \
(_state)->functions->getspeakermode(_state, _speakermodemix, _speakermodeout)
#define FMOD_DSP_GETCLOCK(_state, _clock, _offset, _length) \
(_state)->functions->getclock(_state, _clock, _offset, _length)
#define FMOD_DSP_GETLISTENERATTRIBUTES(_state, _numlisteners, _attributes) \
(_state)->functions->getlistenerattributes(_state, _numlisteners, _attributes)
#define FMOD_DSP_GETUSERDATA(_state, _userdata) \
(_state)->functions->getuserdata(_state, _userdata)
#define FMOD_DSP_DFT_FFTREAL(_state, _size, _signal, _dft, _window, _signalhop) \
(_state)->functions->dft->fftreal(_state, _size, _signal, _dft, _window, _signalhop)
#define FMOD_DSP_DFT_IFFTREAL(_state, _size, _dft, _signal, _window, _signalhop) \
(_state)->functions->dft->inversefftreal(_state, _size, _dft, _signal, _window, _signalhop)
#define FMOD_DSP_PAN_SUMMONOMATRIX(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix) \
(_state)->functions->pan->summonomatrix(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix)
#define FMOD_DSP_PAN_SUMSTEREOMATRIX(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \
(_state)->functions->pan->sumstereomatrix(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix)
#define FMOD_DSP_PAN_SUMSURROUNDMATRIX(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags) \
(_state)->functions->pan->sumsurroundmatrix(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags)
#define FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \
(_state)->functions->pan->summonotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix)
#define FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix) \
(_state)->functions->pan->sumstereotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix)
#define FMOD_DSP_PAN_GETROLLOFFGAIN(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain) \
(_state)->functions->pan->getrolloffgain(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain)
#endif

View File

@ -0,0 +1,577 @@
/* ============================================================================================================= */
/* FMOD Core API - Built-in effects header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* In this header you can find parameter structures for FMOD system registered DSP effects */
/* and generators. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api-common-dsp-effects.html#fmod_dsp_type */
/* ============================================================================================================= */
#ifndef _FMOD_DSP_EFFECTS_H
#define _FMOD_DSP_EFFECTS_H
typedef enum
{
FMOD_DSP_TYPE_UNKNOWN,
FMOD_DSP_TYPE_MIXER,
FMOD_DSP_TYPE_OSCILLATOR,
FMOD_DSP_TYPE_LOWPASS,
FMOD_DSP_TYPE_ITLOWPASS,
FMOD_DSP_TYPE_HIGHPASS,
FMOD_DSP_TYPE_ECHO,
FMOD_DSP_TYPE_FADER,
FMOD_DSP_TYPE_FLANGE,
FMOD_DSP_TYPE_DISTORTION,
FMOD_DSP_TYPE_NORMALIZE,
FMOD_DSP_TYPE_LIMITER,
FMOD_DSP_TYPE_PARAMEQ,
FMOD_DSP_TYPE_PITCHSHIFT,
FMOD_DSP_TYPE_CHORUS,
FMOD_DSP_TYPE_VSTPLUGIN,
FMOD_DSP_TYPE_WINAMPPLUGIN,
FMOD_DSP_TYPE_ITECHO,
FMOD_DSP_TYPE_COMPRESSOR,
FMOD_DSP_TYPE_SFXREVERB,
FMOD_DSP_TYPE_LOWPASS_SIMPLE,
FMOD_DSP_TYPE_DELAY,
FMOD_DSP_TYPE_TREMOLO,
FMOD_DSP_TYPE_LADSPAPLUGIN,
FMOD_DSP_TYPE_SEND,
FMOD_DSP_TYPE_RETURN,
FMOD_DSP_TYPE_HIGHPASS_SIMPLE,
FMOD_DSP_TYPE_PAN,
FMOD_DSP_TYPE_THREE_EQ,
FMOD_DSP_TYPE_FFT,
FMOD_DSP_TYPE_LOUDNESS_METER,
FMOD_DSP_TYPE_ENVELOPEFOLLOWER,
FMOD_DSP_TYPE_CONVOLUTIONREVERB,
FMOD_DSP_TYPE_CHANNELMIX,
FMOD_DSP_TYPE_TRANSCEIVER,
FMOD_DSP_TYPE_OBJECTPAN,
FMOD_DSP_TYPE_MULTIBAND_EQ,
FMOD_DSP_TYPE_MAX,
FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_DSP_TYPE;
/*
===================================================================================================
FMOD built in effect parameters.
Use DSP::setParameter with these enums for the 'index' parameter.
===================================================================================================
*/
typedef enum
{
FMOD_DSP_OSCILLATOR_TYPE,
FMOD_DSP_OSCILLATOR_RATE
} FMOD_DSP_OSCILLATOR;
typedef enum
{
FMOD_DSP_LOWPASS_CUTOFF,
FMOD_DSP_LOWPASS_RESONANCE
} FMOD_DSP_LOWPASS;
typedef enum
{
FMOD_DSP_ITLOWPASS_CUTOFF,
FMOD_DSP_ITLOWPASS_RESONANCE
} FMOD_DSP_ITLOWPASS;
typedef enum
{
FMOD_DSP_HIGHPASS_CUTOFF,
FMOD_DSP_HIGHPASS_RESONANCE
} FMOD_DSP_HIGHPASS;
typedef enum
{
FMOD_DSP_ECHO_DELAY,
FMOD_DSP_ECHO_FEEDBACK,
FMOD_DSP_ECHO_DRYLEVEL,
FMOD_DSP_ECHO_WETLEVEL
} FMOD_DSP_ECHO;
typedef enum FMOD_DSP_FADER
{
FMOD_DSP_FADER_GAIN,
FMOD_DSP_FADER_OVERALL_GAIN,
} FMOD_DSP_FADER;
typedef enum
{
FMOD_DSP_FLANGE_MIX,
FMOD_DSP_FLANGE_DEPTH,
FMOD_DSP_FLANGE_RATE
} FMOD_DSP_FLANGE;
typedef enum
{
FMOD_DSP_DISTORTION_LEVEL
} FMOD_DSP_DISTORTION;
typedef enum
{
FMOD_DSP_NORMALIZE_FADETIME,
FMOD_DSP_NORMALIZE_THRESHOLD,
FMOD_DSP_NORMALIZE_MAXAMP
} FMOD_DSP_NORMALIZE;
typedef enum
{
FMOD_DSP_LIMITER_RELEASETIME,
FMOD_DSP_LIMITER_CEILING,
FMOD_DSP_LIMITER_MAXIMIZERGAIN,
FMOD_DSP_LIMITER_MODE,
} FMOD_DSP_LIMITER;
typedef enum
{
FMOD_DSP_PARAMEQ_CENTER,
FMOD_DSP_PARAMEQ_BANDWIDTH,
FMOD_DSP_PARAMEQ_GAIN
} FMOD_DSP_PARAMEQ;
typedef enum FMOD_DSP_MULTIBAND_EQ
{
FMOD_DSP_MULTIBAND_EQ_A_FILTER,
FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_A_Q,
FMOD_DSP_MULTIBAND_EQ_A_GAIN,
FMOD_DSP_MULTIBAND_EQ_B_FILTER,
FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_B_Q,
FMOD_DSP_MULTIBAND_EQ_B_GAIN,
FMOD_DSP_MULTIBAND_EQ_C_FILTER,
FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_C_Q,
FMOD_DSP_MULTIBAND_EQ_C_GAIN,
FMOD_DSP_MULTIBAND_EQ_D_FILTER,
FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_D_Q,
FMOD_DSP_MULTIBAND_EQ_D_GAIN,
FMOD_DSP_MULTIBAND_EQ_E_FILTER,
FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_E_Q,
FMOD_DSP_MULTIBAND_EQ_E_GAIN,
} FMOD_DSP_MULTIBAND_EQ;
typedef enum FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE
{
FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF,
FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING,
FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS,
FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH,
FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS,
} FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE;
typedef enum
{
FMOD_DSP_PITCHSHIFT_PITCH,
FMOD_DSP_PITCHSHIFT_FFTSIZE,
FMOD_DSP_PITCHSHIFT_OVERLAP,
FMOD_DSP_PITCHSHIFT_MAXCHANNELS
} FMOD_DSP_PITCHSHIFT;
typedef enum
{
FMOD_DSP_CHORUS_MIX,
FMOD_DSP_CHORUS_RATE,
FMOD_DSP_CHORUS_DEPTH,
} FMOD_DSP_CHORUS;
typedef enum
{
FMOD_DSP_ITECHO_WETDRYMIX,
FMOD_DSP_ITECHO_FEEDBACK,
FMOD_DSP_ITECHO_LEFTDELAY,
FMOD_DSP_ITECHO_RIGHTDELAY,
FMOD_DSP_ITECHO_PANDELAY
} FMOD_DSP_ITECHO;
typedef enum
{
FMOD_DSP_COMPRESSOR_THRESHOLD,
FMOD_DSP_COMPRESSOR_RATIO,
FMOD_DSP_COMPRESSOR_ATTACK,
FMOD_DSP_COMPRESSOR_RELEASE,
FMOD_DSP_COMPRESSOR_GAINMAKEUP,
FMOD_DSP_COMPRESSOR_USESIDECHAIN,
FMOD_DSP_COMPRESSOR_LINKED
} FMOD_DSP_COMPRESSOR;
typedef enum
{
FMOD_DSP_SFXREVERB_DECAYTIME,
FMOD_DSP_SFXREVERB_EARLYDELAY,
FMOD_DSP_SFXREVERB_LATEDELAY,
FMOD_DSP_SFXREVERB_HFREFERENCE,
FMOD_DSP_SFXREVERB_HFDECAYRATIO,
FMOD_DSP_SFXREVERB_DIFFUSION,
FMOD_DSP_SFXREVERB_DENSITY,
FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY,
FMOD_DSP_SFXREVERB_LOWSHELFGAIN,
FMOD_DSP_SFXREVERB_HIGHCUT,
FMOD_DSP_SFXREVERB_EARLYLATEMIX,
FMOD_DSP_SFXREVERB_WETLEVEL,
FMOD_DSP_SFXREVERB_DRYLEVEL
} FMOD_DSP_SFXREVERB;
typedef enum
{
FMOD_DSP_LOWPASS_SIMPLE_CUTOFF
} FMOD_DSP_LOWPASS_SIMPLE;
typedef enum
{
FMOD_DSP_DELAY_CH0,
FMOD_DSP_DELAY_CH1,
FMOD_DSP_DELAY_CH2,
FMOD_DSP_DELAY_CH3,
FMOD_DSP_DELAY_CH4,
FMOD_DSP_DELAY_CH5,
FMOD_DSP_DELAY_CH6,
FMOD_DSP_DELAY_CH7,
FMOD_DSP_DELAY_CH8,
FMOD_DSP_DELAY_CH9,
FMOD_DSP_DELAY_CH10,
FMOD_DSP_DELAY_CH11,
FMOD_DSP_DELAY_CH12,
FMOD_DSP_DELAY_CH13,
FMOD_DSP_DELAY_CH14,
FMOD_DSP_DELAY_CH15,
FMOD_DSP_DELAY_MAXDELAY
} FMOD_DSP_DELAY;
typedef enum
{
FMOD_DSP_TREMOLO_FREQUENCY,
FMOD_DSP_TREMOLO_DEPTH,
FMOD_DSP_TREMOLO_SHAPE,
FMOD_DSP_TREMOLO_SKEW,
FMOD_DSP_TREMOLO_DUTY,
FMOD_DSP_TREMOLO_SQUARE,
FMOD_DSP_TREMOLO_PHASE,
FMOD_DSP_TREMOLO_SPREAD
} FMOD_DSP_TREMOLO;
typedef enum
{
FMOD_DSP_SEND_RETURNID,
FMOD_DSP_SEND_LEVEL,
} FMOD_DSP_SEND;
typedef enum
{
FMOD_DSP_RETURN_ID,
FMOD_DSP_RETURN_INPUT_SPEAKER_MODE
} FMOD_DSP_RETURN;
typedef enum
{
FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF
} FMOD_DSP_HIGHPASS_SIMPLE;
typedef enum
{
FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED,
FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE
} FMOD_DSP_PAN_2D_STEREO_MODE_TYPE;
typedef enum
{
FMOD_DSP_PAN_MODE_MONO,
FMOD_DSP_PAN_MODE_STEREO,
FMOD_DSP_PAN_MODE_SURROUND
} FMOD_DSP_PAN_MODE_TYPE;
typedef enum
{
FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED,
FMOD_DSP_PAN_3D_ROLLOFF_LINEAR,
FMOD_DSP_PAN_3D_ROLLOFF_INVERSE,
FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED,
FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM
} FMOD_DSP_PAN_3D_ROLLOFF_TYPE;
typedef enum
{
FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO,
FMOD_DSP_PAN_3D_EXTENT_MODE_USER,
FMOD_DSP_PAN_3D_EXTENT_MODE_OFF
} FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE;
typedef enum
{
FMOD_DSP_PAN_MODE,
FMOD_DSP_PAN_2D_STEREO_POSITION,
FMOD_DSP_PAN_2D_DIRECTION,
FMOD_DSP_PAN_2D_EXTENT,
FMOD_DSP_PAN_2D_ROTATION,
FMOD_DSP_PAN_2D_LFE_LEVEL,
FMOD_DSP_PAN_2D_STEREO_MODE,
FMOD_DSP_PAN_2D_STEREO_SEPARATION,
FMOD_DSP_PAN_2D_STEREO_AXIS,
FMOD_DSP_PAN_ENABLED_SPEAKERS,
FMOD_DSP_PAN_3D_POSITION,
FMOD_DSP_PAN_3D_ROLLOFF,
FMOD_DSP_PAN_3D_MIN_DISTANCE,
FMOD_DSP_PAN_3D_MAX_DISTANCE,
FMOD_DSP_PAN_3D_EXTENT_MODE,
FMOD_DSP_PAN_3D_SOUND_SIZE,
FMOD_DSP_PAN_3D_MIN_EXTENT,
FMOD_DSP_PAN_3D_PAN_BLEND,
FMOD_DSP_PAN_LFE_UPMIX_ENABLED,
FMOD_DSP_PAN_OVERALL_GAIN,
FMOD_DSP_PAN_SURROUND_SPEAKER_MODE,
FMOD_DSP_PAN_2D_HEIGHT_BLEND,
FMOD_DSP_PAN_ATTENUATION_RANGE,
FMOD_DSP_PAN_OVERRIDE_RANGE
} FMOD_DSP_PAN;
typedef enum
{
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB,
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB,
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB
} FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE;
typedef enum
{
FMOD_DSP_THREE_EQ_LOWGAIN,
FMOD_DSP_THREE_EQ_MIDGAIN,
FMOD_DSP_THREE_EQ_HIGHGAIN,
FMOD_DSP_THREE_EQ_LOWCROSSOVER,
FMOD_DSP_THREE_EQ_HIGHCROSSOVER,
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE
} FMOD_DSP_THREE_EQ;
typedef enum
{
FMOD_DSP_FFT_WINDOW_RECT,
FMOD_DSP_FFT_WINDOW_TRIANGLE,
FMOD_DSP_FFT_WINDOW_HAMMING,
FMOD_DSP_FFT_WINDOW_HANNING,
FMOD_DSP_FFT_WINDOW_BLACKMAN,
FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS
} FMOD_DSP_FFT_WINDOW;
typedef enum
{
FMOD_DSP_FFT_WINDOWSIZE,
FMOD_DSP_FFT_WINDOWTYPE,
FMOD_DSP_FFT_SPECTRUMDATA,
FMOD_DSP_FFT_DOMINANT_FREQ
} FMOD_DSP_FFT;
#define FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES 66
typedef enum
{
FMOD_DSP_LOUDNESS_METER_STATE,
FMOD_DSP_LOUDNESS_METER_WEIGHTING,
FMOD_DSP_LOUDNESS_METER_INFO
} FMOD_DSP_LOUDNESS_METER;
typedef enum
{
FMOD_DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED = -3,
FMOD_DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK = -2,
FMOD_DSP_LOUDNESS_METER_STATE_RESET_ALL = -1,
FMOD_DSP_LOUDNESS_METER_STATE_PAUSED = 0,
FMOD_DSP_LOUDNESS_METER_STATE_ANALYZING = 1
} FMOD_DSP_LOUDNESS_METER_STATE_TYPE;
typedef struct FMOD_DSP_LOUDNESS_METER_INFO_TYPE
{
float momentaryloudness;
float shorttermloudness;
float integratedloudness;
float loudness10thpercentile;
float loudness95thpercentile;
float loudnesshistogram[FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES];
float maxtruepeak;
float maxmomentaryloudness;
} FMOD_DSP_LOUDNESS_METER_INFO_TYPE;
typedef struct FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE
{
float channelweight[32];
} FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE;
typedef enum
{
FMOD_DSP_ENVELOPEFOLLOWER_ATTACK,
FMOD_DSP_ENVELOPEFOLLOWER_RELEASE,
FMOD_DSP_ENVELOPEFOLLOWER_ENVELOPE,
FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN
} FMOD_DSP_ENVELOPEFOLLOWER;
typedef enum
{
FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR,
FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET,
FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY,
FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED
} FMOD_DSP_CONVOLUTION_REVERB;
typedef enum
{
FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD,
FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1,
FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE,
FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4
} FMOD_DSP_CHANNELMIX_OUTPUT;
typedef enum
{
FMOD_DSP_CHANNELMIX_OUTPUTGROUPING,
FMOD_DSP_CHANNELMIX_GAIN_CH0,
FMOD_DSP_CHANNELMIX_GAIN_CH1,
FMOD_DSP_CHANNELMIX_GAIN_CH2,
FMOD_DSP_CHANNELMIX_GAIN_CH3,
FMOD_DSP_CHANNELMIX_GAIN_CH4,
FMOD_DSP_CHANNELMIX_GAIN_CH5,
FMOD_DSP_CHANNELMIX_GAIN_CH6,
FMOD_DSP_CHANNELMIX_GAIN_CH7,
FMOD_DSP_CHANNELMIX_GAIN_CH8,
FMOD_DSP_CHANNELMIX_GAIN_CH9,
FMOD_DSP_CHANNELMIX_GAIN_CH10,
FMOD_DSP_CHANNELMIX_GAIN_CH11,
FMOD_DSP_CHANNELMIX_GAIN_CH12,
FMOD_DSP_CHANNELMIX_GAIN_CH13,
FMOD_DSP_CHANNELMIX_GAIN_CH14,
FMOD_DSP_CHANNELMIX_GAIN_CH15,
FMOD_DSP_CHANNELMIX_GAIN_CH16,
FMOD_DSP_CHANNELMIX_GAIN_CH17,
FMOD_DSP_CHANNELMIX_GAIN_CH18,
FMOD_DSP_CHANNELMIX_GAIN_CH19,
FMOD_DSP_CHANNELMIX_GAIN_CH20,
FMOD_DSP_CHANNELMIX_GAIN_CH21,
FMOD_DSP_CHANNELMIX_GAIN_CH22,
FMOD_DSP_CHANNELMIX_GAIN_CH23,
FMOD_DSP_CHANNELMIX_GAIN_CH24,
FMOD_DSP_CHANNELMIX_GAIN_CH25,
FMOD_DSP_CHANNELMIX_GAIN_CH26,
FMOD_DSP_CHANNELMIX_GAIN_CH27,
FMOD_DSP_CHANNELMIX_GAIN_CH28,
FMOD_DSP_CHANNELMIX_GAIN_CH29,
FMOD_DSP_CHANNELMIX_GAIN_CH30,
FMOD_DSP_CHANNELMIX_GAIN_CH31,
FMOD_DSP_CHANNELMIX_OUTPUT_CH0,
FMOD_DSP_CHANNELMIX_OUTPUT_CH1,
FMOD_DSP_CHANNELMIX_OUTPUT_CH2,
FMOD_DSP_CHANNELMIX_OUTPUT_CH3,
FMOD_DSP_CHANNELMIX_OUTPUT_CH4,
FMOD_DSP_CHANNELMIX_OUTPUT_CH5,
FMOD_DSP_CHANNELMIX_OUTPUT_CH6,
FMOD_DSP_CHANNELMIX_OUTPUT_CH7,
FMOD_DSP_CHANNELMIX_OUTPUT_CH8,
FMOD_DSP_CHANNELMIX_OUTPUT_CH9,
FMOD_DSP_CHANNELMIX_OUTPUT_CH10,
FMOD_DSP_CHANNELMIX_OUTPUT_CH11,
FMOD_DSP_CHANNELMIX_OUTPUT_CH12,
FMOD_DSP_CHANNELMIX_OUTPUT_CH13,
FMOD_DSP_CHANNELMIX_OUTPUT_CH14,
FMOD_DSP_CHANNELMIX_OUTPUT_CH15,
FMOD_DSP_CHANNELMIX_OUTPUT_CH16,
FMOD_DSP_CHANNELMIX_OUTPUT_CH17,
FMOD_DSP_CHANNELMIX_OUTPUT_CH18,
FMOD_DSP_CHANNELMIX_OUTPUT_CH19,
FMOD_DSP_CHANNELMIX_OUTPUT_CH20,
FMOD_DSP_CHANNELMIX_OUTPUT_CH21,
FMOD_DSP_CHANNELMIX_OUTPUT_CH22,
FMOD_DSP_CHANNELMIX_OUTPUT_CH23,
FMOD_DSP_CHANNELMIX_OUTPUT_CH24,
FMOD_DSP_CHANNELMIX_OUTPUT_CH25,
FMOD_DSP_CHANNELMIX_OUTPUT_CH26,
FMOD_DSP_CHANNELMIX_OUTPUT_CH27,
FMOD_DSP_CHANNELMIX_OUTPUT_CH28,
FMOD_DSP_CHANNELMIX_OUTPUT_CH29,
FMOD_DSP_CHANNELMIX_OUTPUT_CH30,
FMOD_DSP_CHANNELMIX_OUTPUT_CH31
} FMOD_DSP_CHANNELMIX;
typedef enum
{
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1,
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0,
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO,
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND,
} FMOD_DSP_TRANSCEIVER_SPEAKERMODE;
typedef enum
{
FMOD_DSP_TRANSCEIVER_TRANSMIT,
FMOD_DSP_TRANSCEIVER_GAIN,
FMOD_DSP_TRANSCEIVER_CHANNEL,
FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE
} FMOD_DSP_TRANSCEIVER;
typedef enum
{
FMOD_DSP_OBJECTPAN_3D_POSITION,
FMOD_DSP_OBJECTPAN_3D_ROLLOFF,
FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE,
FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE,
FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE,
FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE,
FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT,
FMOD_DSP_OBJECTPAN_OVERALL_GAIN,
FMOD_DSP_OBJECTPAN_OUTPUTGAIN,
FMOD_DSP_OBJECTPAN_ATTENUATION_RANGE,
FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE
} FMOD_DSP_OBJECTPAN;
#endif

View File

@ -0,0 +1,110 @@
/* ============================================================================================== */
/* FMOD Core / Studio API - Error string header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you want to store or display a string version / english explanation */
/* of the FMOD error codes. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api-common.html#fmod_result */
/* =============================================================================================== */
#ifndef _FMOD_ERRORS_H
#define _FMOD_ERRORS_H
#include "fmod.h"
#ifdef __GNUC__
static const char *FMOD_ErrorString(FMOD_RESULT errcode) __attribute__((unused));
#endif
static const char *FMOD_ErrorString(FMOD_RESULT errcode)
{
switch (errcode)
{
case FMOD_OK: return "No errors.";
case FMOD_ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound).";
case FMOD_ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel.";
case FMOD_ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound.";
case FMOD_ERR_DMA: return "DMA Failure. See debug output for more information.";
case FMOD_ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts.";
case FMOD_ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph.";
case FMOD_ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map.";
case FMOD_ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released.";
case FMOD_ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified.";
case FMOD_ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system.";
case FMOD_ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph.";
case FMOD_ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type.";
case FMOD_ERR_FILE_BAD: return "Error loading file.";
case FMOD_ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format.";
case FMOD_ERR_FILE_DISKEJECTED: return "Media was ejected while reading.";
case FMOD_ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?).";
case FMOD_ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data.";
case FMOD_ERR_FILE_NOTFOUND: return "File not found.";
case FMOD_ERR_FORMAT: return "Unsupported file or audio format.";
case FMOD_ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library.";
case FMOD_ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere.";
case FMOD_ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden.";
case FMOD_ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource.";
case FMOD_ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred.";
case FMOD_ERR_HTTP_TIMEOUT: return "The HTTP request timed out.";
case FMOD_ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function.";
case FMOD_ERR_INITIALIZED: return "Cannot call this command after System::init.";
case FMOD_ERR_INTERNAL: return "An error occurred that wasn't supposed to. Contact support.";
case FMOD_ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float.";
case FMOD_ERR_INVALID_HANDLE: return "An invalid object handle was used.";
case FMOD_ERR_INVALID_PARAM: return "An invalid parameter was passed to this function.";
case FMOD_ERR_INVALID_POSITION: return "An invalid seek position was passed to this function.";
case FMOD_ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode.";
case FMOD_ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle.";
case FMOD_ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported.";
case FMOD_ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular.";
case FMOD_ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup.";
case FMOD_ERR_MEMORY: return "Not enough memory or resources.";
case FMOD_ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used.";
case FMOD_ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound.";
case FMOD_ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support.";
case FMOD_ERR_NET_CONNECT: return "Couldn't connect to the specified host.";
case FMOD_ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere.";
case FMOD_ERR_NET_URL: return "The specified URL couldn't be resolved.";
case FMOD_ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately.";
case FMOD_ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready.";
case FMOD_ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused.";
case FMOD_ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer.";
case FMOD_ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted.";
case FMOD_ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format.";
case FMOD_ERR_OUTPUT_INIT: return "Error initializing output device.";
case FMOD_ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails.";
case FMOD_ERR_PLUGIN: return "An unspecified error has been returned from a plugin.";
case FMOD_ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available.";
case FMOD_ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be allocated or found. (ie the DLS file for MIDI playback)";
case FMOD_ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version.";
case FMOD_ERR_RECORD: return "An error occurred trying to initialize the recording device.";
case FMOD_ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection.";
case FMOD_ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist.";
case FMOD_ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound.";
case FMOD_ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first.";
case FMOD_ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file.";
case FMOD_ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags.";
case FMOD_ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat.";
case FMOD_ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated.";
case FMOD_ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support!";
case FMOD_ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called.";
case FMOD_ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified.";
case FMOD_ERR_VERSION: return "The version number of this file format is not supported.";
case FMOD_ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded.";
case FMOD_ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected.";
case FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool.";
case FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out.";
case FMOD_ERR_EVENT_NOTFOUND: return "The requested event, parameter, bus or vca could not be found.";
case FMOD_ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized.";
case FMOD_ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded.";
case FMOD_ERR_INVALID_STRING: return "An invalid string was passed to this function.";
case FMOD_ERR_ALREADY_LOCKED: return "The specified resource is already locked.";
case FMOD_ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked.";
case FMOD_ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected.";
case FMOD_ERR_TOOMANYSAMPLES: return "The length provided exceeds the allowable limit.";
default : return "Unknown error.";
};
}
#endif

View File

@ -0,0 +1,122 @@
/* ======================================================================================== */
/* FMOD Core API - output development header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you are wanting to develop your own output plugin to use with */
/* FMOD's output system. With this header you can make your own output plugin that FMOD */
/* can register and use. See the documentation and examples on how to make a working */
/* plugin. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/plugin-api-output.html */
/* ======================================================================================== */
#ifndef _FMOD_OUTPUT_H
#define _FMOD_OUTPUT_H
typedef struct FMOD_OUTPUT_STATE FMOD_OUTPUT_STATE;
typedef struct FMOD_OUTPUT_OBJECT3DINFO FMOD_OUTPUT_OBJECT3DINFO;
/*
Output constants
*/
#define FMOD_OUTPUT_PLUGIN_VERSION 5
typedef unsigned int FMOD_OUTPUT_METHOD;
#define FMOD_OUTPUT_METHOD_MIX_DIRECT 0
#define FMOD_OUTPUT_METHOD_MIX_BUFFERED 1
/*
Output callbacks
*/
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *numdrivers);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETDRIVERINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_INIT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int selecteddriver, FMOD_INITFLAGS flags, int *outputrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_SOUND_FORMAT *outputformat, int dspbufferlength, int *dspnumbuffers, int *dspnumadditionalbuffers, void *extradriverdata);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_START_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_STOP_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSE_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_UPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETHANDLE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **handle);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_MIXER_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *maxhardwareobjects);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **object3d);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DFREE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d, const FMOD_OUTPUT_OBJECT3DINFO *info);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OPENPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, int *portId, int *portRate, int *portChannels, FMOD_SOUND_FORMAT *portFormat);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSEPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int portId);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK)(FMOD_OUTPUT_STATE *output_state);
/*
Output functions
*/
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_READFROMMIXER_FUNC) (FMOD_OUTPUT_STATE *output_state, void *buffer, unsigned int length);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_COPYPORT_FUNC) (FMOD_OUTPUT_STATE *output_state, int portId, void *buffer, unsigned int length);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_REQUESTRESET_FUNC) (FMOD_OUTPUT_STATE *output_state);
typedef void * (F_CALL *FMOD_OUTPUT_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line);
typedef void (F_CALL *FMOD_OUTPUT_FREE_FUNC) (void *ptr, const char *file, int line);
typedef void (F_CALL *FMOD_OUTPUT_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...);
/*
Output structures
*/
typedef struct FMOD_OUTPUT_DESCRIPTION
{
unsigned int apiversion;
const char *name;
unsigned int version;
FMOD_OUTPUT_METHOD method;
FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK getnumdrivers;
FMOD_OUTPUT_GETDRIVERINFO_CALLBACK getdriverinfo;
FMOD_OUTPUT_INIT_CALLBACK init;
FMOD_OUTPUT_START_CALLBACK start;
FMOD_OUTPUT_STOP_CALLBACK stop;
FMOD_OUTPUT_CLOSE_CALLBACK close;
FMOD_OUTPUT_UPDATE_CALLBACK update;
FMOD_OUTPUT_GETHANDLE_CALLBACK gethandle;
FMOD_OUTPUT_MIXER_CALLBACK mixer;
FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK object3dgetinfo;
FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK object3dalloc;
FMOD_OUTPUT_OBJECT3DFREE_CALLBACK object3dfree;
FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK object3dupdate;
FMOD_OUTPUT_OPENPORT_CALLBACK openport;
FMOD_OUTPUT_CLOSEPORT_CALLBACK closeport;
FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK devicelistchanged;
} FMOD_OUTPUT_DESCRIPTION;
struct FMOD_OUTPUT_STATE
{
void *plugindata;
FMOD_OUTPUT_READFROMMIXER_FUNC readfrommixer;
FMOD_OUTPUT_ALLOC_FUNC alloc;
FMOD_OUTPUT_FREE_FUNC free;
FMOD_OUTPUT_LOG_FUNC log;
FMOD_OUTPUT_COPYPORT_FUNC copyport;
FMOD_OUTPUT_REQUESTRESET_FUNC requestreset;
};
struct FMOD_OUTPUT_OBJECT3DINFO
{
float *buffer;
unsigned int bufferlength;
FMOD_VECTOR position;
float gain;
float spread;
float priority;
};
/*
Output macros
*/
#define FMOD_OUTPUT_READFROMMIXER(_state, _buffer, _length) \
(_state)->readfrommixer(_state, _buffer, _length)
#define FMOD_OUTPUT_ALLOC(_state, _size, _align) \
(_state)->alloc(_size, _align, __FILE__, __LINE__)
#define FMOD_OUTPUT_FREE(_state, _ptr) \
(_state)->free(_ptr, __FILE__, __LINE__)
#define FMOD_OUTPUT_LOG(_state, _level, _location, _format, ...) \
(_state)->log(_level, __FILE__, __LINE__, _location, _format, ##__VA_ARGS__)
#define FMOD_OUTPUT_COPYPORT(_state, _id, _buffer, _length) \
(_state)->copyport(_state, _id, _buffer, _length)
#define FMOD_OUTPUT_REQUESTRESET(_state) \
(_state)->requestreset(_state)
#endif /* _FMOD_OUTPUT_H */

View File

@ -0,0 +1,248 @@
/* ======================================================================================== */
/* FMOD Studio API - C header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_studio_common.h (which contains all the */
/* constants / callbacks) to develop using the C language. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/studio-api.html */
/* ======================================================================================== */
#ifndef FMOD_STUDIO_H
#define FMOD_STUDIO_H
#include "fmod_studio_common.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*
Global
*/
FMOD_RESULT F_API FMOD_Studio_ParseID(const char *idstring, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_System_Create(FMOD_STUDIO_SYSTEM **system, unsigned int headerversion);
/*
System
*/
FMOD_BOOL F_API FMOD_Studio_System_IsValid(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_SetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_Studio_System_GetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_Studio_System_Initialize(FMOD_STUDIO_SYSTEM *system, int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API FMOD_Studio_System_Release(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_Update(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_GetCoreSystem(FMOD_STUDIO_SYSTEM *system, FMOD_SYSTEM **coresystem);
FMOD_RESULT F_API FMOD_Studio_System_GetEvent(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_EVENTDESCRIPTION **event);
FMOD_RESULT F_API FMOD_Studio_System_GetBus(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BUS **bus);
FMOD_RESULT F_API FMOD_Studio_System_GetVCA(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_VCA **vca);
FMOD_RESULT F_API FMOD_Studio_System_GetBank(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_GetEventByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_EVENTDESCRIPTION **event);
FMOD_RESULT F_API FMOD_Studio_System_GetBusByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BUS **bus);
FMOD_RESULT F_API FMOD_Studio_System_GetVCAByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_VCA **vca);
FMOD_RESULT F_API FMOD_Studio_System_GetBankByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_GetSoundInfo(FMOD_STUDIO_SYSTEM *system, const char *key, FMOD_STUDIO_SOUND_INFO *info);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByName(FMOD_STUDIO_SYSTEM *system, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByName(FMOD_STUDIO_SYSTEM *system, const char *name, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByIDWithLabel(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_SetParametersByIDs(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByNameWithLabel(FMOD_STUDIO_SYSTEM *system, const char *name, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_LookupID(FMOD_STUDIO_SYSTEM *system, const char *path, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_System_LookupPath(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_System_GetNumListeners(FMOD_STUDIO_SYSTEM *system, int *numlisteners);
FMOD_RESULT F_API FMOD_Studio_System_SetNumListeners(FMOD_STUDIO_SYSTEM *system, int numlisteners);
FMOD_RESULT F_API FMOD_Studio_System_GetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition);
FMOD_RESULT F_API FMOD_Studio_System_SetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition);
FMOD_RESULT F_API FMOD_Studio_System_GetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float *weight);
FMOD_RESULT F_API FMOD_Studio_System_SetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float weight);
FMOD_RESULT F_API FMOD_Studio_System_LoadBankFile(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_LoadBankMemory(FMOD_STUDIO_SYSTEM *system, const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_LoadBankCustom(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_RegisterPlugin(FMOD_STUDIO_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description);
FMOD_RESULT F_API FMOD_Studio_System_UnregisterPlugin(FMOD_STUDIO_SYSTEM *system, const char *name);
FMOD_RESULT F_API FMOD_Studio_System_UnloadAll(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_FlushCommands(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_FlushSampleLoading(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_StartCommandCapture(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags);
FMOD_RESULT F_API FMOD_Studio_System_StopCommandCapture(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_LoadCommandReplay(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, FMOD_STUDIO_COMMANDREPLAY **replay);
FMOD_RESULT F_API FMOD_Studio_System_GetBankCount(FMOD_STUDIO_SYSTEM *system, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetBankList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BANK **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionCount(FMOD_STUDIO_SYSTEM *system, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetCPUUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core);
FMOD_RESULT F_API FMOD_Studio_System_GetBufferUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BUFFER_USAGE *usage);
FMOD_RESULT F_API FMOD_Studio_System_ResetBufferUsage(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_SetCallback(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask);
FMOD_RESULT F_API FMOD_Studio_System_SetUserData(FMOD_STUDIO_SYSTEM *system, void *userdata);
FMOD_RESULT F_API FMOD_Studio_System_GetUserData(FMOD_STUDIO_SYSTEM *system, void **userdata);
FMOD_RESULT F_API FMOD_Studio_System_GetMemoryUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_MEMORY_USAGE *memoryusage);
/*
EventDescription
*/
FMOD_BOOL F_API FMOD_Studio_EventDescription_IsValid(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetPath(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_USER_PROPERTY *property);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserProperty(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_USER_PROPERTY *property);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetLength(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *length);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetMinMaxDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *min, float *max);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSoundSize(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *size);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsSnapshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *snapshot);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsOneshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *oneshot);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsStream(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *isStream);
FMOD_RESULT F_API FMOD_Studio_EventDescription_Is3D(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *is3D);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsDopplerEnabled(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *doppler);
FMOD_RESULT F_API FMOD_Studio_EventDescription_HasSustainPoint(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *sustainPoint);
FMOD_RESULT F_API FMOD_Studio_EventDescription_CreateInstance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceList(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_LoadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_UnloadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSampleLoadingState(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_LOADING_STATE *state);
FMOD_RESULT F_API FMOD_Studio_EventDescription_ReleaseAllInstances(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_SetCallback(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void **userdata);
FMOD_RESULT F_API FMOD_Studio_EventDescription_SetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void *userdata);
/*
EventInstance
*/
FMOD_BOOL F_API FMOD_Studio_EventInstance_IsValid(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetDescription(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENTDESCRIPTION **description);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *volume, float *finalvolume);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float volume);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *pitch, float *finalpitch);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float pitch);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Get3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Set3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *mask);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int mask);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float *value);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float value);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float *level);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float level);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Start(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Stop(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_STOP_MODE mode);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *position);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int position);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPlaybackState(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PLAYBACK_STATE *state);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetChannelGroup(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_CHANNELGROUP **group);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMinMaxDistance(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *min, float *max);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Release(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_IsVirtual(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *virtualstate);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByNameWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByIDWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParametersByIDs(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_KeyOff(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetCallback(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void **userdata);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void *userdata);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetCPUUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *exclusive, unsigned int *inclusive);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMemoryUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_MEMORY_USAGE *memoryusage);
/*
Bus
*/
FMOD_BOOL F_API FMOD_Studio_Bus_IsValid(FMOD_STUDIO_BUS *bus);
FMOD_RESULT F_API FMOD_Studio_Bus_GetID(FMOD_STUDIO_BUS *bus, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_Bus_GetPath(FMOD_STUDIO_BUS *bus, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_Bus_GetVolume(FMOD_STUDIO_BUS *bus, float *volume, float *finalvolume);
FMOD_RESULT F_API FMOD_Studio_Bus_SetVolume(FMOD_STUDIO_BUS *bus, float volume);
FMOD_RESULT F_API FMOD_Studio_Bus_GetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Studio_Bus_SetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Studio_Bus_GetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL *mute);
FMOD_RESULT F_API FMOD_Studio_Bus_SetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL mute);
FMOD_RESULT F_API FMOD_Studio_Bus_StopAllEvents(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_STOP_MODE mode);
FMOD_RESULT F_API FMOD_Studio_Bus_GetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX *index);
FMOD_RESULT F_API FMOD_Studio_Bus_SetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX index);
FMOD_RESULT F_API FMOD_Studio_Bus_LockChannelGroup(FMOD_STUDIO_BUS *bus);
FMOD_RESULT F_API FMOD_Studio_Bus_UnlockChannelGroup(FMOD_STUDIO_BUS *bus);
FMOD_RESULT F_API FMOD_Studio_Bus_GetChannelGroup(FMOD_STUDIO_BUS *bus, FMOD_CHANNELGROUP **group);
FMOD_RESULT F_API FMOD_Studio_Bus_GetCPUUsage(FMOD_STUDIO_BUS *bus, unsigned int *exclusive, unsigned int *inclusive);
FMOD_RESULT F_API FMOD_Studio_Bus_GetMemoryUsage(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_MEMORY_USAGE *memoryusage);
/*
VCA
*/
FMOD_BOOL F_API FMOD_Studio_VCA_IsValid(FMOD_STUDIO_VCA *vca);
FMOD_RESULT F_API FMOD_Studio_VCA_GetID(FMOD_STUDIO_VCA *vca, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_VCA_GetPath(FMOD_STUDIO_VCA *vca, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_VCA_GetVolume(FMOD_STUDIO_VCA *vca, float *volume, float *finalvolume);
FMOD_RESULT F_API FMOD_Studio_VCA_SetVolume(FMOD_STUDIO_VCA *vca, float volume);
/*
Bank
*/
FMOD_BOOL F_API FMOD_Studio_Bank_IsValid(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_GetID(FMOD_STUDIO_BANK *bank, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_Bank_GetPath(FMOD_STUDIO_BANK *bank, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_Bank_Unload(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_LoadSampleData(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_UnloadSampleData(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_GetLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state);
FMOD_RESULT F_API FMOD_Studio_Bank_GetSampleLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state);
FMOD_RESULT F_API FMOD_Studio_Bank_GetStringCount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetStringInfo(FMOD_STUDIO_BANK *bank, int index, FMOD_GUID *id, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_Bank_GetEventCount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetEventList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_EVENTDESCRIPTION **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetBusCount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetBusList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_BUS **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetVCACount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetVCAList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_VCA **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetUserData(FMOD_STUDIO_BANK *bank, void **userdata);
FMOD_RESULT F_API FMOD_Studio_Bank_SetUserData(FMOD_STUDIO_BANK *bank, void *userdata);
/*
Command playback information
*/
FMOD_BOOL F_API FMOD_Studio_CommandReplay_IsValid(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetSystem(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_SYSTEM **system);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetLength(FMOD_STUDIO_COMMANDREPLAY *replay, float *length);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandCount(FMOD_STUDIO_COMMANDREPLAY *replay, int *count);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandInfo(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_COMMAND_INFO *info);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandString(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, char *buffer, int length);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandAtTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time, int *commandindex);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetBankPath(FMOD_STUDIO_COMMANDREPLAY *replay, const char *bankPath);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_Start(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_Stop(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPlaybackState(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_PLAYBACK_STATE *state);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCurrentCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int *commandindex, float *currenttime);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_Release(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetFrameCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void **userdata);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void *userdata);
#ifdef __cplusplus
}
#endif
#endif /* FMOD_STUDIO_H */

View File

@ -0,0 +1,402 @@
/* ======================================================================================== */
/* FMOD Studio API - C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_studio_common.h (which contains all the */
/* constants / callbacks) to develop using the C++ language. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/studio-api.html */
/* ======================================================================================== */
#ifndef FMOD_STUDIO_HPP
#define FMOD_STUDIO_HPP
#include "fmod_studio_common.h"
#include "fmod_studio.h"
#include "fmod.hpp"
namespace FMOD
{
namespace Studio
{
typedef FMOD_GUID ID; // Deprecated. Please use FMOD_GUID type.
class System;
class EventDescription;
class EventInstance;
class Bus;
class VCA;
class Bank;
class CommandReplay;
inline FMOD_RESULT parseID(const char *idstring, FMOD_GUID *id) { return FMOD_Studio_ParseID(idstring, id); }
class System
{
private:
// Constructor made private so user cannot statically instance a System class. System::create must be used.
System();
System(const System &);
public:
static FMOD_RESULT F_API create(System **system, unsigned int headerversion = FMOD_VERSION);
FMOD_RESULT F_API setAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API getAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API initialize(int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API release();
// Handle validity
bool F_API isValid() const;
// Update processing
FMOD_RESULT F_API update();
FMOD_RESULT F_API flushCommands();
FMOD_RESULT F_API flushSampleLoading();
// Low-level API access
FMOD_RESULT F_API getCoreSystem(FMOD::System **system) const;
// Asset retrieval
FMOD_RESULT F_API getEvent(const char *path, EventDescription **event) const;
FMOD_RESULT F_API getBus(const char *path, Bus **bus) const;
FMOD_RESULT F_API getVCA(const char *path, VCA **vca) const;
FMOD_RESULT F_API getBank(const char *path, Bank **bank) const;
FMOD_RESULT F_API getEventByID(const FMOD_GUID *id, EventDescription **event) const;
FMOD_RESULT F_API getBusByID(const FMOD_GUID *id, Bus **bus) const;
FMOD_RESULT F_API getVCAByID(const FMOD_GUID *id, VCA **vca) const;
FMOD_RESULT F_API getBankByID(const FMOD_GUID *id, Bank **bank) const;
FMOD_RESULT F_API getSoundInfo(const char *key, FMOD_STUDIO_SOUND_INFO *info) const;
FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const;
// Global parameter control
FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char *label, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false);
FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char *label, bool ignoreseekspeed = false);
// Path lookup
FMOD_RESULT F_API lookupID(const char *path, FMOD_GUID *id) const;
FMOD_RESULT F_API lookupPath(const FMOD_GUID *id, char *path, int size, int *retrieved) const;
// Listener control
FMOD_RESULT F_API getNumListeners(int *numlisteners);
FMOD_RESULT F_API setNumListeners(int numlisteners);
FMOD_RESULT F_API getListenerAttributes(int listener, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition = 0) const;
FMOD_RESULT F_API setListenerAttributes(int listener, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition = 0);
FMOD_RESULT F_API getListenerWeight(int listener, float *weight);
FMOD_RESULT F_API setListenerWeight(int listener, float weight);
// Bank control
FMOD_RESULT F_API loadBankFile(const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);
FMOD_RESULT F_API loadBankMemory(const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);
FMOD_RESULT F_API loadBankCustom(const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);
FMOD_RESULT F_API unloadAll();
// General functionality
FMOD_RESULT F_API getBufferUsage(FMOD_STUDIO_BUFFER_USAGE *usage) const;
FMOD_RESULT F_API resetBufferUsage();
FMOD_RESULT F_API registerPlugin(const FMOD_DSP_DESCRIPTION *description);
FMOD_RESULT F_API unregisterPlugin(const char *name);
// Enumeration
FMOD_RESULT F_API getBankCount(int *count) const;
FMOD_RESULT F_API getBankList(Bank **array, int capacity, int *count) const;
FMOD_RESULT F_API getParameterDescriptionCount(int *count) const;
FMOD_RESULT F_API getParameterDescriptionList(FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count) const;
// Command capture and replay
FMOD_RESULT F_API startCommandCapture(const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags);
FMOD_RESULT F_API stopCommandCapture();
FMOD_RESULT F_API loadCommandReplay(const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, CommandReplay **replay);
// Callbacks
FMOD_RESULT F_API setCallback(FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_STUDIO_SYSTEM_CALLBACK_ALL);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
// Monitoring
FMOD_RESULT F_API getCPUUsage(FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core) const;
FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const;
};
class EventDescription
{
private:
// Constructor made private so user cannot statically instance the class.
EventDescription();
EventDescription(const EventDescription &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterDescriptionCount(int *count) const;
FMOD_RESULT F_API getParameterDescriptionByIndex(int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterLabelByIndex(int index, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getUserPropertyCount(int *count) const;
FMOD_RESULT F_API getUserPropertyByIndex(int index, FMOD_STUDIO_USER_PROPERTY *property) const;
FMOD_RESULT F_API getUserProperty(const char *name, FMOD_STUDIO_USER_PROPERTY *property) const;
FMOD_RESULT F_API getLength(int *length) const;
FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const;
FMOD_RESULT F_API getSoundSize(float *size) const;
FMOD_RESULT F_API isSnapshot(bool *snapshot) const;
FMOD_RESULT F_API isOneshot(bool *oneshot) const;
FMOD_RESULT F_API isStream(bool *isStream) const;
FMOD_RESULT F_API is3D(bool *is3d) const;
FMOD_RESULT F_API isDopplerEnabled(bool *doppler) const;
FMOD_RESULT F_API hasSustainPoint(bool *sustainPoint) const;
// Playback control
FMOD_RESULT F_API createInstance(EventInstance **instance) const;
FMOD_RESULT F_API getInstanceCount(int *count) const;
FMOD_RESULT F_API getInstanceList(EventInstance **array, int capacity, int *count) const;
// Sample data loading control
FMOD_RESULT F_API loadSampleData();
FMOD_RESULT F_API unloadSampleData();
FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;
// Convenience functions
FMOD_RESULT F_API releaseAllInstances();
// Callbacks
FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
class EventInstance
{
private:
// Constructor made private so user cannot statically instance the class.
EventInstance();
EventInstance(const EventInstance &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getDescription(EventDescription **description) const;
// Playback control
FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;
FMOD_RESULT F_API setVolume(float volume);
FMOD_RESULT F_API getPitch(float *pitch, float *finalpitch = 0) const;
FMOD_RESULT F_API setPitch(float pitch);
FMOD_RESULT F_API get3DAttributes(FMOD_3D_ATTRIBUTES *attributes) const;
FMOD_RESULT F_API set3DAttributes(const FMOD_3D_ATTRIBUTES *attributes);
FMOD_RESULT F_API getListenerMask(unsigned int *mask) const;
FMOD_RESULT F_API setListenerMask(unsigned int mask);
FMOD_RESULT F_API getProperty(FMOD_STUDIO_EVENT_PROPERTY index, float *value) const;
FMOD_RESULT F_API setProperty(FMOD_STUDIO_EVENT_PROPERTY index, float value);
FMOD_RESULT F_API getReverbLevel(int index, float *level) const;
FMOD_RESULT F_API setReverbLevel(int index, float level);
FMOD_RESULT F_API getPaused(bool *paused) const;
FMOD_RESULT F_API setPaused(bool paused);
FMOD_RESULT F_API start();
FMOD_RESULT F_API stop(FMOD_STUDIO_STOP_MODE mode);
FMOD_RESULT F_API getTimelinePosition(int *position) const;
FMOD_RESULT F_API setTimelinePosition(int position);
FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const;
FMOD_RESULT F_API getChannelGroup(ChannelGroup **group) const;
FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const;
FMOD_RESULT F_API release();
FMOD_RESULT F_API isVirtual(bool *virtualstate) const;
FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char* label, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false);
FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char* label, bool ignoreseekspeed = false);
FMOD_RESULT F_API keyOff();
// Monitoring
FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const;
FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const;
// Callbacks
FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
class Bus
{
private:
// Constructor made private so user cannot statically instance the class.
Bus();
Bus(const Bus &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
// Playback control
FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;
FMOD_RESULT F_API setVolume(float volume);
FMOD_RESULT F_API getPaused(bool *paused) const;
FMOD_RESULT F_API setPaused(bool paused);
FMOD_RESULT F_API getMute(bool *mute) const;
FMOD_RESULT F_API setMute(bool mute);
FMOD_RESULT F_API stopAllEvents(FMOD_STUDIO_STOP_MODE mode);
// Output port
FMOD_RESULT F_API getPortIndex(FMOD_PORT_INDEX *index) const;
FMOD_RESULT F_API setPortIndex(FMOD_PORT_INDEX index);
// Low-level API access
FMOD_RESULT F_API lockChannelGroup();
FMOD_RESULT F_API unlockChannelGroup();
FMOD_RESULT F_API getChannelGroup(FMOD::ChannelGroup **group) const;
// Monitoring
FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const;
FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const;
};
class VCA
{
private:
// Constructor made private so user cannot statically instance the class.
VCA();
VCA(const VCA &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
// Playback control
FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;
FMOD_RESULT F_API setVolume(float volume);
};
class Bank
{
private:
// Constructor made private so user cannot statically instance the class.
Bank();
Bank(const Bank &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
// Loading control
FMOD_RESULT F_API unload();
FMOD_RESULT F_API loadSampleData();
FMOD_RESULT F_API unloadSampleData();
FMOD_RESULT F_API getLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;
FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;
// Enumeration
FMOD_RESULT F_API getStringCount(int *count) const;
FMOD_RESULT F_API getStringInfo(int index, FMOD_GUID *id, char *path, int size, int *retrieved) const;
FMOD_RESULT F_API getEventCount(int *count) const;
FMOD_RESULT F_API getEventList(EventDescription **array, int capacity, int *count) const;
FMOD_RESULT F_API getBusCount(int *count) const;
FMOD_RESULT F_API getBusList(Bus **array, int capacity, int *count) const;
FMOD_RESULT F_API getVCACount(int *count) const;
FMOD_RESULT F_API getVCAList(VCA **array, int capacity, int *count) const;
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
class CommandReplay
{
private:
// Constructor made private so user cannot statically instance the class.
CommandReplay();
CommandReplay(const CommandReplay &);
public:
// Handle validity
bool F_API isValid() const;
// Information query
FMOD_RESULT F_API getSystem(System **system) const;
FMOD_RESULT F_API getLength(float *length) const;
FMOD_RESULT F_API getCommandCount(int *count) const;
FMOD_RESULT F_API getCommandInfo(int commandindex, FMOD_STUDIO_COMMAND_INFO *info) const;
FMOD_RESULT F_API getCommandString(int commandindex, char *buffer, int length) const;
FMOD_RESULT F_API getCommandAtTime(float time, int *commandindex) const;
// Playback
FMOD_RESULT F_API setBankPath(const char *bankPath);
FMOD_RESULT F_API start();
FMOD_RESULT F_API stop();
FMOD_RESULT F_API seekToTime(float time);
FMOD_RESULT F_API seekToCommand(int commandindex);
FMOD_RESULT F_API getPaused(bool *paused) const;
FMOD_RESULT F_API setPaused(bool paused);
FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const;
FMOD_RESULT F_API getCurrentCommand(int *commandindex, float *currenttime) const;
// Release
FMOD_RESULT F_API release();
// Callbacks
FMOD_RESULT F_API setFrameCallback(FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback);
FMOD_RESULT F_API setLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback);
FMOD_RESULT F_API setCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
} // namespace Studio
} // namespace FMOD
#endif //FMOD_STUDIO_HPP

View File

@ -0,0 +1,336 @@
/* ======================================================================================== */
/* FMOD Studio API - Common C/C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* This header defines common enumerations, structs and callbacks that are shared between */
/* the C and C++ interfaces. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/studio-api.html */
/* ======================================================================================== */
#ifndef FMOD_STUDIO_COMMON_H
#define FMOD_STUDIO_COMMON_H
#include "fmod.h"
/*
FMOD Studio types.
*/
typedef struct FMOD_STUDIO_SYSTEM FMOD_STUDIO_SYSTEM;
typedef struct FMOD_STUDIO_EVENTDESCRIPTION FMOD_STUDIO_EVENTDESCRIPTION;
typedef struct FMOD_STUDIO_EVENTINSTANCE FMOD_STUDIO_EVENTINSTANCE;
typedef struct FMOD_STUDIO_BUS FMOD_STUDIO_BUS;
typedef struct FMOD_STUDIO_VCA FMOD_STUDIO_VCA;
typedef struct FMOD_STUDIO_BANK FMOD_STUDIO_BANK;
typedef struct FMOD_STUDIO_COMMANDREPLAY FMOD_STUDIO_COMMANDREPLAY;
/*
FMOD Studio constants
*/
#define FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT 32
typedef unsigned int FMOD_STUDIO_INITFLAGS;
#define FMOD_STUDIO_INIT_NORMAL 0x00000000
#define FMOD_STUDIO_INIT_LIVEUPDATE 0x00000001
#define FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS 0x00000002
#define FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE 0x00000004
#define FMOD_STUDIO_INIT_DEFERRED_CALLBACKS 0x00000008
#define FMOD_STUDIO_INIT_LOAD_FROM_UPDATE 0x00000010
#define FMOD_STUDIO_INIT_MEMORY_TRACKING 0x00000020
typedef unsigned int FMOD_STUDIO_PARAMETER_FLAGS;
#define FMOD_STUDIO_PARAMETER_READONLY 0x00000001
#define FMOD_STUDIO_PARAMETER_AUTOMATIC 0x00000002
#define FMOD_STUDIO_PARAMETER_GLOBAL 0x00000004
#define FMOD_STUDIO_PARAMETER_DISCRETE 0x00000008
#define FMOD_STUDIO_PARAMETER_LABELED 0x00000010
typedef unsigned int FMOD_STUDIO_SYSTEM_CALLBACK_TYPE;
#define FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE 0x00000001
#define FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE 0x00000002
#define FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD 0x00000004
#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED 0x00000008
#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED 0x00000010
#define FMOD_STUDIO_SYSTEM_CALLBACK_ALL 0xFFFFFFFF
typedef unsigned int FMOD_STUDIO_EVENT_CALLBACK_TYPE;
#define FMOD_STUDIO_EVENT_CALLBACK_CREATED 0x00000001
#define FMOD_STUDIO_EVENT_CALLBACK_DESTROYED 0x00000002
#define FMOD_STUDIO_EVENT_CALLBACK_STARTING 0x00000004
#define FMOD_STUDIO_EVENT_CALLBACK_STARTED 0x00000008
#define FMOD_STUDIO_EVENT_CALLBACK_RESTARTED 0x00000010
#define FMOD_STUDIO_EVENT_CALLBACK_STOPPED 0x00000020
#define FMOD_STUDIO_EVENT_CALLBACK_START_FAILED 0x00000040
#define FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND 0x00000080
#define FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000100
#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED 0x00000200
#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED 0x00000400
#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER 0x00000800
#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT 0x00001000
#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED 0x00002000
#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED 0x00004000
#define FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL 0x00008000
#define FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL 0x00010000
#define FMOD_STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND 0x00020000
#define FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT 0x00040000
#define FMOD_STUDIO_EVENT_CALLBACK_ALL 0xFFFFFFFF
typedef unsigned int FMOD_STUDIO_LOAD_BANK_FLAGS;
#define FMOD_STUDIO_LOAD_BANK_NORMAL 0x00000000
#define FMOD_STUDIO_LOAD_BANK_NONBLOCKING 0x00000001
#define FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES 0x00000002
#define FMOD_STUDIO_LOAD_BANK_UNENCRYPTED 0x00000004
typedef unsigned int FMOD_STUDIO_COMMANDCAPTURE_FLAGS;
#define FMOD_STUDIO_COMMANDCAPTURE_NORMAL 0x00000000
#define FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH 0x00000001
#define FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE 0x00000002
typedef unsigned int FMOD_STUDIO_COMMANDREPLAY_FLAGS;
#define FMOD_STUDIO_COMMANDREPLAY_NORMAL 0x00000000
#define FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP 0x00000001
#define FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD 0x00000002
#define FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD 0x00000004
typedef enum FMOD_STUDIO_LOADING_STATE
{
FMOD_STUDIO_LOADING_STATE_UNLOADING,
FMOD_STUDIO_LOADING_STATE_UNLOADED,
FMOD_STUDIO_LOADING_STATE_LOADING,
FMOD_STUDIO_LOADING_STATE_LOADED,
FMOD_STUDIO_LOADING_STATE_ERROR,
FMOD_STUDIO_LOADING_STATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_LOADING_STATE;
typedef enum FMOD_STUDIO_LOAD_MEMORY_MODE
{
FMOD_STUDIO_LOAD_MEMORY,
FMOD_STUDIO_LOAD_MEMORY_POINT,
FMOD_STUDIO_LOAD_MEMORY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_LOAD_MEMORY_MODE;
typedef enum FMOD_STUDIO_PARAMETER_TYPE
{
FMOD_STUDIO_PARAMETER_GAME_CONTROLLED,
FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE,
FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE,
FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED,
FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE,
FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED,
FMOD_STUDIO_PARAMETER_MAX,
FMOD_STUDIO_PARAMETER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_PARAMETER_TYPE;
typedef enum FMOD_STUDIO_USER_PROPERTY_TYPE
{
FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER,
FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN,
FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT,
FMOD_STUDIO_USER_PROPERTY_TYPE_STRING,
FMOD_STUDIO_USER_PROPERTY_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_USER_PROPERTY_TYPE;
typedef enum FMOD_STUDIO_EVENT_PROPERTY
{
FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY,
FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY,
FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD,
FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE,
FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE,
FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN,
FMOD_STUDIO_EVENT_PROPERTY_MAX,
FMOD_STUDIO_EVENT_PROPERTY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_EVENT_PROPERTY;
typedef enum FMOD_STUDIO_PLAYBACK_STATE
{
FMOD_STUDIO_PLAYBACK_PLAYING,
FMOD_STUDIO_PLAYBACK_SUSTAINING,
FMOD_STUDIO_PLAYBACK_STOPPED,
FMOD_STUDIO_PLAYBACK_STARTING,
FMOD_STUDIO_PLAYBACK_STOPPING,
FMOD_STUDIO_PLAYBACK_FORCEINT = 65536
} FMOD_STUDIO_PLAYBACK_STATE;
typedef enum FMOD_STUDIO_STOP_MODE
{
FMOD_STUDIO_STOP_ALLOWFADEOUT,
FMOD_STUDIO_STOP_IMMEDIATE,
FMOD_STUDIO_STOP_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_STOP_MODE;
typedef enum FMOD_STUDIO_INSTANCETYPE
{
FMOD_STUDIO_INSTANCETYPE_NONE,
FMOD_STUDIO_INSTANCETYPE_SYSTEM,
FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION,
FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE,
FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE,
FMOD_STUDIO_INSTANCETYPE_BUS,
FMOD_STUDIO_INSTANCETYPE_VCA,
FMOD_STUDIO_INSTANCETYPE_BANK,
FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY,
FMOD_STUDIO_INSTANCETYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_INSTANCETYPE;
/*
FMOD Studio structures
*/
typedef struct FMOD_STUDIO_BANK_INFO
{
int size;
void *userdata;
int userdatalength;
FMOD_FILE_OPEN_CALLBACK opencallback;
FMOD_FILE_CLOSE_CALLBACK closecallback;
FMOD_FILE_READ_CALLBACK readcallback;
FMOD_FILE_SEEK_CALLBACK seekcallback;
} FMOD_STUDIO_BANK_INFO;
typedef struct FMOD_STUDIO_PARAMETER_ID
{
unsigned int data1;
unsigned int data2;
} FMOD_STUDIO_PARAMETER_ID;
typedef struct FMOD_STUDIO_PARAMETER_DESCRIPTION
{
const char *name;
FMOD_STUDIO_PARAMETER_ID id;
float minimum;
float maximum;
float defaultvalue;
FMOD_STUDIO_PARAMETER_TYPE type;
FMOD_STUDIO_PARAMETER_FLAGS flags;
FMOD_GUID guid;
} FMOD_STUDIO_PARAMETER_DESCRIPTION;
typedef struct FMOD_STUDIO_USER_PROPERTY
{
const char *name;
FMOD_STUDIO_USER_PROPERTY_TYPE type;
union
{
int intvalue;
FMOD_BOOL boolvalue;
float floatvalue;
const char *stringvalue;
};
} FMOD_STUDIO_USER_PROPERTY;
typedef struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES
{
const char *name;
FMOD_SOUND *sound;
int subsoundIndex;
} FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES;
typedef struct FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES
{
const char *name;
FMOD_DSP *dsp;
} FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES;
typedef struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES
{
const char *name;
int position;
} FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES;
typedef struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES
{
int bar;
int beat;
int position;
float tempo;
int timesignatureupper;
int timesignaturelower;
} FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES;
typedef struct FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES
{
FMOD_GUID eventid;
FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES properties;
} FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES;
typedef struct FMOD_STUDIO_ADVANCEDSETTINGS
{
int cbsize;
unsigned int commandqueuesize;
unsigned int handleinitialsize;
int studioupdateperiod;
int idlesampledatapoolsize;
unsigned int streamingscheduledelay;
const char* encryptionkey;
} FMOD_STUDIO_ADVANCEDSETTINGS;
typedef struct FMOD_STUDIO_CPU_USAGE
{
float update;
} FMOD_STUDIO_CPU_USAGE;
typedef struct FMOD_STUDIO_BUFFER_INFO
{
int currentusage;
int peakusage;
int capacity;
int stallcount;
float stalltime;
} FMOD_STUDIO_BUFFER_INFO;
typedef struct FMOD_STUDIO_BUFFER_USAGE
{
FMOD_STUDIO_BUFFER_INFO studiocommandqueue;
FMOD_STUDIO_BUFFER_INFO studiohandle;
} FMOD_STUDIO_BUFFER_USAGE;
typedef struct FMOD_STUDIO_SOUND_INFO
{
const char *name_or_data;
FMOD_MODE mode;
FMOD_CREATESOUNDEXINFO exinfo;
int subsoundindex;
} FMOD_STUDIO_SOUND_INFO;
typedef struct FMOD_STUDIO_COMMAND_INFO
{
const char *commandname;
int parentcommandindex;
int framenumber;
float frametime;
FMOD_STUDIO_INSTANCETYPE instancetype;
FMOD_STUDIO_INSTANCETYPE outputtype;
unsigned int instancehandle;
unsigned int outputhandle;
} FMOD_STUDIO_COMMAND_INFO;
typedef struct FMOD_STUDIO_MEMORY_USAGE
{
int exclusive;
int inclusive;
int sampledata;
} FMOD_STUDIO_MEMORY_USAGE;
/*
FMOD Studio callbacks.
*/
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_SYSTEM_CALLBACK) (FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void *commanddata, void *userdata);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_EVENT_CALLBACK) (FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, float currenttime, void *userdata);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, const FMOD_GUID *bankguid, const char *bankfilename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank, void *userdata);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance, void *userdata);
#endif // FMOD_STUDIO_COMMON_H

View File

@ -0,0 +1,174 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "Modules/ModuleManager.h"
namespace FMOD
{
namespace Studio
{
class System;
class EventDescription;
class EventInstance;
}
}
class UFMODAsset;
class UFMODBank;
class UFMODEvent;
class UWorld;
class AAudioVolume;
struct FInteriorSettings;
struct FFMODListener; // Currently only for private use, we don't export this type
// Which FMOD Studio system to use
namespace EFMODSystemContext
{
enum Type
{
// For use auditioning sounds within the editor
Auditioning,
// For use in PIE and in-game
Runtime,
// For use when playing events in an editor world (e.g. previewing a level sequence)
Editor,
// Max number of types
Max
};
}
/**
* The public interface to this module
*/
class IFMODStudioModule : public IModuleInterface
{
public:
/**
* Singleton-like access to this module's interface. This is just for convenience!
* Beware of calling this during the shutdown phase, though. Your module might have been unloaded already.
*
* @return Returns singleton instance, loading the module on demand if needed
*/
static inline IFMODStudioModule &Get() { return FModuleManager::LoadModuleChecked<IFMODStudioModule>("FMODStudio"); }
/**
* Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true.
*
* @return True if the module is loaded and ready to use
*/
static inline bool IsAvailable() { return FModuleManager::Get().IsModuleLoaded("FMODStudio"); }
/**
* Get a pointer to the runtime studio system (only valid in-game or in PIE)
*/
virtual FMOD::Studio::System *GetStudioSystem(EFMODSystemContext::Type Context) = 0;
/**
* Set system paused (for PIE pause)
*/
virtual void SetSystemPaused(bool paused) = 0;
/**
* Called when user changes any studio settings
*/
virtual void RefreshSettings() = 0;
/**
* Called when we enter of leave PIE mode
*/
virtual void SetInPIE(bool bInPIE, bool bSimulating) = 0;
/**
* Look up an asset given its name
*/
virtual UFMODAsset *FindAssetByName(const FString &Name) = 0;
/**
* Look up an event given its name
*/
virtual UFMODEvent *FindEventByName(const FString &Name) = 0;
/**
* Get the disk path for a Bank asset
*/
virtual FString GetBankPath(const UFMODBank &Bank) = 0;
/**
* Get the disk paths for all Banks
*/
virtual void GetAllBankPaths(TArray<FString> &Paths, bool IncludeMasterBank) const = 0;
/**
* Get an event description.
* The system type can control which Studio system to use, or leave it as System_Max for it to choose automatically.
*/
virtual FMOD::Studio::EventDescription *GetEventDescription(
const UFMODEvent *Event, EFMODSystemContext::Type Context = EFMODSystemContext::Max) = 0;
/**
* Create a single auditioning instance using the auditioning system
*/
virtual FMOD::Studio::EventInstance *CreateAuditioningInstance(const UFMODEvent *Event) = 0;
/**
* Stop any auditioning instance
*/
virtual void StopAuditioningInstance() = 0;
/**
* Return whether the listener(s) have moved
*/
virtual bool HasListenerMoved() = 0;
/**
* Called to change the listener position for editor mode
*/
virtual void SetListenerPosition(int ListenerIndex, UWorld *World, const FTransform &ListenerTransform, float DeltaSeconds) = 0;
/**
* Called to change the listener position for editor mode
*/
virtual void FinishSetListenerPosition(int NumListeners) = 0;
/**
* Return the audio settings for the listener nearest the given location
*/
virtual const FFMODListener &GetNearestListener(const FVector &Location) = 0;
/** Return a list of banks that failed to load due to an error */
virtual TArray<FString> GetFailedBankLoads(EFMODSystemContext::Type Context) = 0;
/** Return a list of plugins that appear to be needed */
virtual TArray<FString> GetRequiredPlugins() = 0;
/** Register a plugin that is required */
virtual void AddRequiredPlugin(const FString &Plugin) = 0;
/** Returns whether sound is enabled for the game */
virtual bool UseSound() = 0;
/** Attempts to load a plugin by name */
virtual bool LoadPlugin(EFMODSystemContext::Type Context, const TCHAR *ShortName) = 0;
/** Log a FMOD error */
virtual void LogError(int result, const char *function) = 0;
/** Returns if the banks have been loaded */
virtual bool AreBanksLoaded() = 0;
/** Set active locale. Locale must be the locale name of one of the configured project locales */
virtual bool SetLocale(const FString& Locale) = 0;
/** Get ative locale. */
virtual FString GetLocale() = 0;
#if WITH_EDITOR
/** Called by the editor module when banks have been modified on disk */
virtual void ReloadBanks() = 0;
#endif
};

View File

@ -0,0 +1,202 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "fmod_studio.hpp"
#include "fmod.hpp"
#include "Runtime/Launch/Resources/Version.h"
#include "Engine/Engine.h"
#include "FMODStudioModule.h"
#define verifyfmod(fn) \
{ \
FMOD_RESULT _result = (fn); \
if (_result != FMOD_OK) \
{ \
FMODUtils::LogError(_result, #fn); \
} \
}
namespace FMODUtils
{
// Unreal defines 1 unit == 1cm, so convert to metres for Studio automatically
#define FMOD_VECTOR_SCALE_DEFAULT 0.01f
// Just call into module
inline void LogError(FMOD_RESULT result, const char *function)
{
IFMODStudioModule::Get().LogError(result, function);
}
inline void Assign(FMOD_VECTOR &Dest, const FVector &Src)
{
Dest.x = Src.X;
Dest.y = Src.Y;
Dest.z = Src.Z;
}
inline FMOD_VECTOR ConvertWorldVector(const FVector &Src)
{
static FMatrix UE4toFMOD(FVector(0.0f, 0.0f, FMOD_VECTOR_SCALE_DEFAULT), FVector(FMOD_VECTOR_SCALE_DEFAULT, 0.0f, 0.0f),
FVector(0.0f, FMOD_VECTOR_SCALE_DEFAULT, 0.0f), FVector::ZeroVector);
FMOD_VECTOR Dest;
Assign(Dest, UE4toFMOD.TransformPosition(Src));
return Dest;
}
inline FMOD_VECTOR ConvertUnitVector(const FVector &Src)
{
static FMatrix UE4toFMOD(FVector(0.0f, 0.0f, 1.0f), FVector(1.0f, 0.0f, 0.0f), FVector(0.0f, 1.0f, 0.0f), FVector::ZeroVector);
FMOD_VECTOR Dest;
Assign(Dest, UE4toFMOD.TransformVector(Src));
return Dest;
}
inline void Assign(FMOD_3D_ATTRIBUTES &Dest, const FTransform &Src)
{
Dest.position = ConvertWorldVector(Src.GetTranslation());
Dest.forward = ConvertUnitVector(Src.GetUnitAxis(EAxis::X));
Dest.up = ConvertUnitVector(Src.GetUnitAxis(EAxis::Z));
}
inline float DistanceToUEScale(float FMODDistance)
{
return FMODDistance / FMOD_VECTOR_SCALE_DEFAULT;
}
inline bool IsWorldAudible(UWorld *World, bool AllowInEditor)
{
if (GEngine && IFMODStudioModule::Get().UseSound())
{
if (!IsValid(World))
{
return true;
}
if (World->bAllowAudioPlayback && World->GetNetMode() != NM_DedicatedServer)
{
EWorldType::Type previewEnum;
previewEnum = EWorldType::EditorPreview;
if (World->IsGameWorld() || World->WorldType == previewEnum || (AllowInEditor && World->WorldType == EWorldType::Editor))
{
return true;
}
}
}
return false;
}
inline FMOD::Studio::ID ConvertGuid(const FGuid &UnrealGuid)
{
// Unreal doesn't follow the usual windows GUID format, instead it parses
// them as 4 integers
FMOD::Studio::ID StudioGuid;
FMemory::Memcpy(&StudioGuid, &UnrealGuid, sizeof(StudioGuid));
Swap(StudioGuid.Data2, StudioGuid.Data3);
Swap(StudioGuid.Data4[0], StudioGuid.Data4[3]);
Swap(StudioGuid.Data4[1], StudioGuid.Data4[2]);
Swap(StudioGuid.Data4[4], StudioGuid.Data4[7]);
Swap(StudioGuid.Data4[5], StudioGuid.Data4[6]);
return StudioGuid;
}
inline FGuid ConvertGuid(const FMOD::Studio::ID &StudioGuid)
{
// Unreal doesn't follow the usual windows GUID format, instead it parses
// them as 4 integers
FMOD::Studio::ID CopiedGuid;
FMemory::Memcpy(&CopiedGuid, &StudioGuid, sizeof(StudioGuid));
Swap(CopiedGuid.Data2, CopiedGuid.Data3);
Swap(CopiedGuid.Data4[0], CopiedGuid.Data4[3]);
Swap(CopiedGuid.Data4[1], CopiedGuid.Data4[2]);
Swap(CopiedGuid.Data4[4], CopiedGuid.Data4[7]);
Swap(CopiedGuid.Data4[5], CopiedGuid.Data4[6]);
FGuid UnrealGuid;
FMemory::Memcpy(&UnrealGuid, &CopiedGuid, sizeof(CopiedGuid));
return UnrealGuid;
}
template <class StudioType>
inline FGuid GetID(StudioType *Instance)
{
FMOD::Studio::ID StudioID = { 0 };
verifyfmod(Instance->getID(&StudioID));
return FMODUtils::ConvertGuid(StudioID);
}
template <class StudioType>
inline FString GetPath(StudioType *Instance)
{
int ActualSize = 128; // Start with expected enough space
TArray<char> RawBuffer;
FMOD_RESULT Result;
do
{
RawBuffer.SetNum(ActualSize);
Result = Instance->getPath(RawBuffer.GetData(), ActualSize, &ActualSize);
} while (Result == FMOD_ERR_TRUNCATED);
if (Result == FMOD_OK)
{
return FString(UTF8_TO_TCHAR(RawBuffer.GetData()));
}
else
{
return FString();
}
}
inline FString LookupNameFromGuid(FMOD::Studio::System *StudioSystem, const FMOD::Studio::ID &Guid)
{
int ActualSize = 128; // Start with expected enough space
TArray<char> RawBuffer;
FMOD_RESULT Result;
do
{
RawBuffer.SetNum(ActualSize);
Result = StudioSystem->lookupPath(&Guid, RawBuffer.GetData(), ActualSize, &ActualSize);
} while (Result == FMOD_ERR_TRUNCATED);
if (Result == FMOD_OK)
{
return FString(UTF8_TO_TCHAR(RawBuffer.GetData()));
}
else
{
return FString();
}
}
inline FString LookupNameFromGuid(FMOD::Studio::System *StudioSystem, const FGuid &Guid)
{
return LookupNameFromGuid(StudioSystem, ConvertGuid(Guid));
}
inline FString ParameterTypeToString(FMOD_STUDIO_PARAMETER_TYPE Type)
{
switch (Type)
{
case FMOD_STUDIO_PARAMETER_GAME_CONTROLLED:
return FString("Game Controlled");
case FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE:
return FString("Distance (Auto)");
case FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE:
return FString("Event Cone Angle (Auto)");
case FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION:
return FString("Event Orientation (Auto)");
case FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION:
return FString("Direction (Auto)");
case FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION:
return FString("Elevation (Auto)");
case FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION:
return FString("Listener Orientation (Auto)");
}
return FString();
}
}

View File

@ -0,0 +1,21 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "ActorFactories/ActorFactory.h"
#include "FMODAmbientSoundActorFactory.generated.h"
/** FMOD Ambient Sound Actor Factory.
*/
UCLASS(MinimalAPI, config = Editor, collapsecategories, hidecategories = Object)
class UFMODAmbientSoundActorFactory : public UActorFactory
{
GENERATED_UCLASS_BODY()
// Begin UActorFactory Interface
virtual void PostSpawnActor(UObject *Asset, AActor *NewActor) override;
virtual void PostCreateBlueprint(UObject *Asset, AActor *CDO) override;
virtual bool CanCreateActorFrom(const FAssetData &AssetData, FText &OutErrorMsg) override;
virtual UObject *GetAssetFromActorInstance(AActor *ActorInstance) override;
// End UActorFactory Interface
};

View File

@ -0,0 +1,56 @@
// Copyright (c), Firelight Technologies Pty, Ltd.
#pragma once
#include "CoreMinimal.h"
namespace FMOD
{
namespace Studio
{
class System;
}
} // namespace FMOD
class UFMODAsset;
class UFMODBankLookup;
class UFMODSettings;
class FFMODAssetBuilder
{
public:
~FFMODAssetBuilder();
/** Create studio system for asset building */
void Create();
/** Process FMOD banks into UE4 assets */
void ProcessBanks();
/** Path of strings bank */
FString GetMasterStringsBankPath();
private:
struct AssetCreateInfo
{
UClass *Class;
FGuid Guid;
FString StudioPath;
FString AssetName;
FString PackagePath;
FString Path;
};
void BuildBankLookup(const FString &AssetName, const FString &PackagePath, const UFMODSettings &InSettings, TArray<UObject*>& AssetsToSave);
void BuildAssets(const UFMODSettings &InSettings, const FString &AssetLookupName, const FString &AssetLookupPath, TArray<UObject*>& AssetsToSave,
TArray<UObject*>& AssetsToDelete);
FString GetAssetClassName(UClass *AssetClass);
bool MakeAssetCreateInfo(const FGuid &AssetGuid, const FString &StudioPath, AssetCreateInfo *CreateInfo);
UFMODAsset *CreateAsset(const AssetCreateInfo& CreateInfo, TArray<UObject*>& AssetsToSave);
void SaveAssets(TArray<UObject*>& AssetsToSave);
void DeleteAssets(TArray<UObject*>& AssetsToDelete);
FMOD::Studio::System *StudioSystem{};
UFMODBankLookup *BankLookup{};
};

View File

@ -0,0 +1,20 @@
// Copyright (c), Firelight Technologies Pty, Ltd.
#pragma once
#include "CoreMinimal.h"
#include "Commandlets/Commandlet.h"
#include "FMODGenerateAssetsCommandlet.generated.h"
/**
*
*/
UCLASS()
class UFMODGenerateAssetsCommandlet : public UCommandlet
{
GENERATED_UCLASS_BODY()
//~ Begin UCommandlet Interface
virtual int32 Main(const FString &Params) override;
//~ End UCommandlet Interface
};

View File

@ -0,0 +1,65 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
using System.IO;
namespace UnrealBuildTool.Rules
{
public class FMODStudioEditor : ModuleRules
{
#if WITH_FORWARDED_MODULE_RULES_CTOR
public FMODStudioEditor(ReadOnlyTargetRules Target) : base(Target)
#else
public FMODStudioEditor(TargetInfo Target)
#endif
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PrivatePCHHeaderFile = "Private/FMODStudioEditorPrivatePCH.h";
bUseUnity = false;
PrivateIncludePaths.AddRange(
new string[] {
"FMODStudio/Private",
"FMODStudio/Public/FMOD",
Path.Combine(ModuleDirectory, "Classes")
}
);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"CoreUObject",
"DeveloperToolSettings",
"Engine",
"FMODStudio",
"InputCore",
"UnrealEd",
"Sequencer"
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"AssetRegistry",
"AssetTools",
"EditorStyle",
"LevelEditor",
"LevelSequence",
"MainFrame",
"MovieScene",
"MovieSceneTracks",
"MovieSceneTools",
"PropertyEditor",
"Settings",
"Slate",
"SlateCore",
"Sockets",
"SourceControl",
"ToolMenus",
"WorkspaceMenuStructure",
}
);
}
}
}

View File

@ -0,0 +1,146 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "AssetTypeActions_FMODEvent.h"
#include "AssetTypeActions_Base.h"
#include "FMODEventEditor.h"
#include "FMODEvent.h"
#include "FMODUtils.h"
#include "FMODStudioModule.h"
#include "FMODStudioEditorModule.h"
#include "UnrealEd/Public/Editor.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "EditorStyle/Public/EditorStyleSet.h"
#define LOCTEXT_NAMESPACE "AssetTypeActions"
FAssetTypeActions_FMODEvent::FAssetTypeActions_FMODEvent()
: CurrentPreviewEventInstance(nullptr)
{
BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FAssetTypeActions_FMODEvent::HandleBeginPIE);
IFMODStudioEditorModule::Get().BanksReloadedEvent().AddRaw(this, &FAssetTypeActions_FMODEvent::HandleBanksReloaded);
}
FAssetTypeActions_FMODEvent::~FAssetTypeActions_FMODEvent()
{
if (GIsRunning)
{
FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle);
IFMODStudioEditorModule::Get().BanksReloadedEvent().RemoveAll(this);
IFMODStudioModule::Get().StopAuditioningInstance();
}
}
UClass *FAssetTypeActions_FMODEvent::GetSupportedClass() const
{
return UFMODEvent::StaticClass();
}
void FAssetTypeActions_FMODEvent::GetActions(const TArray<UObject *> &InObjects, FMenuBuilder &MenuBuilder)
{
auto Events = GetTypedWeakObjectPtrs<UFMODEvent>(InObjects);
MenuBuilder.AddMenuEntry(LOCTEXT("FMODEvent_Play", "Play"), LOCTEXT("FMODEvent_PlayTooltip", "Plays the selected FMOD event."),
FSlateIcon(FAppStyle::GetAppStyleSetName(), "MediaAsset.AssetActions.Play"),
FUIAction(FExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::ExecutePlay, Events),
FCanExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::CanExecutePlayCommand, Events)));
MenuBuilder.AddMenuEntry(LOCTEXT("FMODEvent_Stop", "Stop"), LOCTEXT("FMODEvent_StopTooltip", "Stops the currently playing FMOD event."),
FSlateIcon(FAppStyle::GetAppStyleSetName(), "MediaAsset.AssetActions.Stop"),
FUIAction(FExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::ExecuteStop, Events), FCanExecuteAction()));
}
void FAssetTypeActions_FMODEvent::OpenAssetEditor(const TArray<UObject *> &InObjects, TSharedPtr<IToolkitHost> EditWithinLevelEditor)
{
EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;
for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt)
{
auto Event = Cast<UFMODEvent>(*ObjIt);
if (IsValid(Event))
{
TSharedRef<FFMODEventEditor> NewFMODEventEditor(new FFMODEventEditor());
NewFMODEventEditor->InitFMODEventEditor(Mode, EditWithinLevelEditor, Event);
}
}
}
bool FAssetTypeActions_FMODEvent::CanExecutePlayCommand(TArray<TWeakObjectPtr<UFMODEvent>> Objects) const
{
return Objects.Num() == 1;
}
bool FAssetTypeActions_FMODEvent::AssetsActivatedOverride(const TArray<UObject *> &InObjects, EAssetTypeActivationMethod::Type ActivationType)
{
if (ActivationType == EAssetTypeActivationMethod::Previewed)
{
for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt)
{
UFMODEvent *Event = Cast<UFMODEvent>(*ObjIt);
if (IsValid(Event))
{
// Only play the first valid event
PlayEvent(Event);
break;
}
}
return true;
}
return false;
}
void FAssetTypeActions_FMODEvent::ExecuteEdit(TArray<TWeakObjectPtr<UFMODEvent>> Objects)
{
for (auto ObjIt = Objects.CreateConstIterator(); ObjIt; ++ObjIt)
{
auto Object = (*ObjIt).Get();
if (IsValid(Object))
{
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAsset(Object);
}
}
}
void FAssetTypeActions_FMODEvent::ExecutePlay(TArray<TWeakObjectPtr<UFMODEvent>> Objects)
{
for (auto ObjIt = Objects.CreateConstIterator(); ObjIt; ++ObjIt)
{
UFMODEvent *Event = (*ObjIt).Get();
if (IsValid(Event))
{
// Only play the first valid event
PlayEvent(Event);
break;
}
}
}
void FAssetTypeActions_FMODEvent::ExecuteStop(TArray<TWeakObjectPtr<UFMODEvent>> Objects)
{
IFMODStudioModule::Get().StopAuditioningInstance();
}
void FAssetTypeActions_FMODEvent::PlayEvent(UFMODEvent *Event)
{
if (IsValid(Event))
{
CurrentPreviewEventInstance = IFMODStudioModule::Get().CreateAuditioningInstance(Event);
if (CurrentPreviewEventInstance != nullptr)
{
CurrentPreviewEventInstance->start();
}
}
}
void FAssetTypeActions_FMODEvent::HandleBeginPIE(bool bSimulating)
{
// Studio module will handle its own auditioning, just clear the handle
CurrentPreviewEventInstance = nullptr;
}
void FAssetTypeActions_FMODEvent::HandleBanksReloaded()
{
// Studio module will handle its own auditioning, just clear the handle
CurrentPreviewEventInstance = nullptr;
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,56 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "AssetTypeActions_Base.h"
namespace FMOD
{
namespace Studio
{
class EventInstance;
}
}
class UFMODEvent;
class FAssetTypeActions_FMODEvent : public FAssetTypeActions_Base
{
public:
FAssetTypeActions_FMODEvent();
~FAssetTypeActions_FMODEvent();
// IAssetTypeActions Implementation
virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_FMODEvent", "FMOD Event"); }
virtual FColor GetTypeColor() const override { return FColor(0, 175, 255); }
virtual UClass *GetSupportedClass() const override;
virtual bool HasActions(const TArray<UObject *> &InObjects) const override { return true; }
virtual void GetActions(const TArray<UObject *> &InObjects, FMenuBuilder &MenuBuilder) override;
virtual bool AssetsActivatedOverride(const TArray<UObject *> &InObjects, EAssetTypeActivationMethod::Type ActivationType) override;
virtual void OpenAssetEditor(
const TArray<UObject *> &InObjects, TSharedPtr<class IToolkitHost> EditWithinLevelEditor = TSharedPtr<IToolkitHost>()) override;
virtual bool CanFilter() override { return false; }
virtual uint32 GetCategories() override { return EAssetTypeCategories::Sounds; }
private:
/** Returns true if only one event is selected to play */
bool CanExecutePlayCommand(TArray<TWeakObjectPtr<UFMODEvent>> Objects) const;
/** Handler for when Edit is selected */
void ExecuteEdit(TArray<TWeakObjectPtr<UFMODEvent>> Objects);
/** Handler for when Play is selected */
void ExecutePlay(TArray<TWeakObjectPtr<UFMODEvent>> Objects);
/** Handler for when Stop is selected */
void ExecuteStop(TArray<TWeakObjectPtr<UFMODEvent>> Objects);
/** Plays the event */
void PlayEvent(UFMODEvent *Event);
void HandleBeginPIE(bool bSimulating);
void HandleBanksReloaded();
FMOD::Studio::EventInstance *CurrentPreviewEventInstance;
FDelegateHandle BeginPIEDelegateHandle;
};

View File

@ -0,0 +1,67 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODAmbientSoundActorFactory.h"
#include "FMODStudioEditorPrivatePCH.h"
#include "FMODAmbientSound.h"
#include "FMODEvent.h"
#include "AssetRegistry/Public/AssetData.h"
#include "Editor/EditorEngine.h"
UFMODAmbientSoundActorFactory::UFMODAmbientSoundActorFactory(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
DisplayName = NSLOCTEXT("FMOD", "FMODAmbientSoundDisplayName", "FMOD Ambient Sound");
NewActorClass = AFMODAmbientSound::StaticClass();
}
bool UFMODAmbientSoundActorFactory::CanCreateActorFrom(const FAssetData &AssetData, FText &OutErrorMsg)
{
//We allow creating AAmbientSounds without an existing sound asset
if (UActorFactory::CanCreateActorFrom(AssetData, OutErrorMsg))
{
return true;
}
if (AssetData.IsValid() && !AssetData.GetClass()->IsChildOf(UFMODEvent::StaticClass()))
{
OutErrorMsg = NSLOCTEXT("FMOD", "CanCreateActorFrom_NoFMODEventAsset", "A valid FMOD Event asset must be specified.");
return false;
}
return true;
}
void UFMODAmbientSoundActorFactory::PostSpawnActor(UObject *Asset, AActor *NewActor)
{
UFMODEvent *Event = Cast<UFMODEvent>(Asset);
if (Event != NULL)
{
AFMODAmbientSound *NewSound = CastChecked<AFMODAmbientSound>(NewActor);
FActorLabelUtilities::SetActorLabelUnique(NewSound, Event->GetName());
NewSound->AudioComponent->Event = Event;
}
}
UObject *UFMODAmbientSoundActorFactory::GetAssetFromActorInstance(AActor *Instance)
{
check(Instance->IsA(NewActorClass));
AFMODAmbientSound *SoundActor = CastChecked<AFMODAmbientSound>(Instance);
check(SoundActor->AudioComponent);
return SoundActor->AudioComponent->Event;
}
void UFMODAmbientSoundActorFactory::PostCreateBlueprint(UObject *Asset, AActor *CDO)
{
if (Asset != NULL && CDO != NULL)
{
UFMODEvent *Event = Cast<UFMODEvent>(Asset);
if (Event != NULL)
{
AFMODAmbientSound *NewSound = CastChecked<AFMODAmbientSound>(CDO);
NewSound->AudioComponent->Event = Event;
}
}
}

View File

@ -0,0 +1,39 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "ComponentAssetBroker.h"
#include "FMODEvent.h"
//////////////////////////////////////////////////////////////////////////
// FFMODAssetBroker
class FFMODAssetBroker : public IComponentAssetBroker
{
public:
UClass *GetSupportedAssetClass() override { return UFMODEvent::StaticClass(); }
virtual bool AssignAssetToComponent(UActorComponent *InComponent, UObject *InAsset) override
{
if (UFMODAudioComponent *AudioComp = Cast<UFMODAudioComponent>(InComponent))
{
UFMODEvent *Event = Cast<UFMODEvent>(InAsset);
if ((Event != NULL) || (InAsset == NULL))
{
AudioComp->Event = Event;
return true;
}
}
return false;
}
virtual UObject *GetAssetFromComponent(UActorComponent *InComponent) override
{
if (UFMODAudioComponent *AudioComp = Cast<UFMODAudioComponent>(InComponent))
{
return AudioComp->Event;
}
return NULL;
}
};

View File

@ -0,0 +1,655 @@
#include "FMODAssetBuilder.h"
#include "AssetRegistry/AssetRegistryModule.h"
#include "FMODAssetLookup.h"
#include "FMODAssetTable.h"
#include "FMODBank.h"
#include "FMODBankLookup.h"
#include "FMODBus.h"
#include "FMODEvent.h"
#include "FMODSettings.h"
#include "FMODSnapshot.h"
#include "FMODSnapshotReverb.h"
#include "FMODPort.h"
#include "FMODUtils.h"
#include "FMODVCA.h"
#include "FileHelpers.h"
#include "ObjectTools.h"
#include "SourceControlHelpers.h"
#include "HAL/FileManager.h"
#include "Misc/MessageDialog.h"
#include "fmod_studio.hpp"
#define LOCTEXT_NAMESPACE "FMODAssetBuilder"
FFMODAssetBuilder::~FFMODAssetBuilder()
{
if (StudioSystem)
{
StudioSystem->release();
}
}
void FFMODAssetBuilder::Create()
{
verifyfmod(FMOD::Studio::System::create(&StudioSystem));
FMOD::System *lowLevelSystem = nullptr;
verifyfmod(StudioSystem->getCoreSystem(&lowLevelSystem));
verifyfmod(lowLevelSystem->setOutput(FMOD_OUTPUTTYPE_NOSOUND_NRT));
verifyfmod(StudioSystem->initialize(1, FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS | FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE, FMOD_INIT_MIX_FROM_UPDATE,
nullptr));
}
void FFMODAssetBuilder::ProcessBanks()
{
TArray<UObject*> AssetsToSave;
TArray<UObject*> AssetsToDelete;
const UFMODSettings& Settings = *GetDefault<UFMODSettings>();
FString PackagePath = Settings.GetFullContentPath() / FFMODAssetTable::PrivateDataPath();
BuildBankLookup(FFMODAssetTable::BankLookupName(), PackagePath, Settings, AssetsToSave);
BuildAssets(Settings, FFMODAssetTable::AssetLookupName(), PackagePath, AssetsToSave, AssetsToDelete);
SaveAssets(AssetsToSave);
DeleteAssets(AssetsToDelete);
}
FString FFMODAssetBuilder::GetMasterStringsBankPath()
{
return BankLookup ? BankLookup->MasterStringsBankPath : FString();
}
void FFMODAssetBuilder::BuildAssets(const UFMODSettings& InSettings, const FString &AssetLookupName, const FString &AssetLookupPath,
TArray<UObject*>& AssetsToSave, TArray<UObject*>& AssetsToDelete)
{
if (!BankLookup->MasterStringsBankPath.IsEmpty())
{
FString StringPath = InSettings.GetFullBankPath() / BankLookup->MasterStringsBankPath;
UE_LOG(LogFMOD, Log, TEXT("Loading strings bank: %s"), *StringPath);
FMOD::Studio::Bank *StudioStringBank;
FMOD_RESULT StringResult = StudioSystem->loadBankFile(TCHAR_TO_UTF8(*StringPath), FMOD_STUDIO_LOAD_BANK_NORMAL, &StudioStringBank);
if (StringResult == FMOD_OK)
{
TArray<char> RawBuffer;
RawBuffer.SetNum(256); // Initial capacity
int Count = 0;
verifyfmod(StudioStringBank->getStringCount(&Count));
// Enumerate all of the names in the strings bank and gather the information required to create the UE4 assets for each object
TArray<AssetCreateInfo> AssetCreateInfos;
AssetCreateInfos.Reserve(Count);
for (int StringIdx = 0; StringIdx < Count; ++StringIdx)
{
FMOD::Studio::ID Guid = { 0 };
while (true)
{
int ActualSize = 0;
FMOD_RESULT Result = StudioStringBank->getStringInfo(StringIdx, &Guid, RawBuffer.GetData(), RawBuffer.Num(), &ActualSize);
if (Result == FMOD_ERR_TRUNCATED)
{
RawBuffer.SetNum(ActualSize);
}
else
{
verifyfmod(Result);
break;
}
}
FString AssetName(UTF8_TO_TCHAR(RawBuffer.GetData()));
FGuid AssetGuid = FMODUtils::ConvertGuid(Guid);
if (!AssetName.IsEmpty())
{
AssetCreateInfo CreateInfo = {};
if (MakeAssetCreateInfo(AssetGuid, AssetName, &CreateInfo))
{
AssetCreateInfos.Add(CreateInfo);
}
}
}
verifyfmod(StudioStringBank->unload());
verifyfmod(StudioSystem->update());
// Load or create asset lookup
FString AssetLookupPackageName = AssetLookupPath + AssetLookupName;
UPackage *AssetLookupPackage = CreatePackage(*AssetLookupPackageName);
AssetLookupPackage->FullyLoad();
bool bAssetLookupCreated = false;
bool bAssetLookupModified = false;
UDataTable *AssetLookup = FindObject<UDataTable>(AssetLookupPackage, *AssetLookupName, true);
if (!AssetLookup)
{
AssetLookup = NewObject<UDataTable>(AssetLookupPackage, *AssetLookupName, RF_Public | RF_Standalone | RF_MarkAsRootSet);
AssetLookup->RowStruct = FFMODAssetLookupRow::StaticStruct();
bAssetLookupCreated = true;
}
// Create a list of existing assets in the lookup - we'll use this to delete stale assets
TMap<FName, FFMODAssetLookupRow> StaleAssets{};
AssetLookup->ForeachRow<FFMODAssetLookupRow>(FString(), [&StaleAssets](const FName& Key, const FFMODAssetLookupRow& Value) {
StaleAssets.Add(Key, Value);
});
for (const AssetCreateInfo &CreateInfo : AssetCreateInfos)
{
UFMODAsset *Asset = CreateAsset(CreateInfo, AssetsToSave);
if (Asset)
{
UPackage *AssetPackage = Asset->GetPackage();
FString AssetPackageName = AssetPackage->GetPathName();
FString AssetName = Asset->GetPathName(AssetPackage);
FName LookupRowName = FName(*CreateInfo.StudioPath);
FFMODAssetLookupRow* LookupRow = AssetLookup->FindRow<FFMODAssetLookupRow>(LookupRowName, FString(), false);
if (LookupRow)
{
if (LookupRow->PackageName != AssetPackageName || LookupRow->AssetName != AssetName)
{
LookupRow->PackageName = AssetPackageName;
LookupRow->AssetName = AssetName;
bAssetLookupModified = true;
}
}
else
{
FFMODAssetLookupRow NewRow{};
NewRow.PackageName = AssetPackageName;
NewRow.AssetName = AssetName;
AssetLookup->AddRow(LookupRowName, NewRow);
bAssetLookupModified = true;
}
StaleAssets.Remove(LookupRowName);
}
}
// Delete stale assets
if (StaleAssets.Num() > 0)
{
for (auto& Entry : StaleAssets)
{
UPackage *Package = CreatePackage(*Entry.Value.PackageName);
Package->FullyLoad();
UFMODAsset *Asset = Package ? FindObject<UFMODAsset>(Package, *Entry.Value.AssetName) : nullptr;
if (Asset)
{
UE_LOG(LogFMOD, Log, TEXT("Deleting stale asset %s/%s."), *Entry.Value.PackageName, *Entry.Value.AssetName);
AssetsToDelete.Add(Asset);
}
AssetLookup->RemoveRow(Entry.Key);
}
bAssetLookupModified = true;
}
if (bAssetLookupCreated || bAssetLookupModified)
{
AssetsToSave.Add(AssetLookup);
}
}
else
{
UE_LOG(LogFMOD, Warning, TEXT("Failed to load strings bank: %s"), *StringPath);
}
}
}
const FString BankExtensions[] = { TEXT(".assets"), TEXT(".streams"), TEXT(".bank")};
void FFMODAssetBuilder::BuildBankLookup(const FString &AssetName, const FString &PackagePath, const UFMODSettings &InSettings,
TArray<UObject*>& AssetsToSave)
{
FString PackageName = PackagePath + AssetName;
UPackage *Package = CreatePackage(*PackageName);
Package->FullyLoad();
bool bCreated = false;
bool bModified = false;
BankLookup = FindObject<UFMODBankLookup>(Package, *AssetName, true);
if (!BankLookup)
{
BankLookup = NewObject<UFMODBankLookup>(Package, *AssetName, RF_Public | RF_Standalone | RF_MarkAsRootSet);
BankLookup->DataTable = NewObject<UDataTable>(BankLookup, "DataTable", RF_NoFlags);
BankLookup->DataTable->RowStruct = FFMODLocalizedBankTable::StaticStruct();
bCreated = true;
}
// Get a list of all bank GUIDs already in the lookup - this will be used to remove stale GUIDs after processing
// the current banks on disk.
TArray<FName> StaleBanks(BankLookup->DataTable->GetRowNames());
// Process all banks on disk
TArray<FString> BankPaths;
FString SearchDir = InSettings.GetFullBankPath();
IFileManager::Get().FindFilesRecursive(BankPaths, *SearchDir, TEXT("*.bank"), true, false, false);
if (BankPaths.Num() <= 0)
{
return;
}
TMap<FString, FString> BankGuids;
for (FString BankPath : BankPaths)
{
FMOD::Studio::Bank* Bank;
FMOD_RESULT result = StudioSystem->loadBankFile(TCHAR_TO_UTF8(*BankPath), FMOD_STUDIO_LOAD_BANK_NORMAL, &Bank);
FMOD_GUID BankID;
if (result == FMOD_OK)
{
result = Bank->getID(&BankID);
Bank->unload();
}
if (result == FMOD_OK)
{
FString GUID = FMODUtils::ConvertGuid(BankID).ToString(EGuidFormats::DigitsWithHyphensInBraces);
FString* otherBankPath = BankGuids.Find(GUID);
if (otherBankPath != nullptr)
{
bool foundLocale = false;
for (const FFMODProjectLocale& Locale : InSettings.Locales)
{
if (Locale.bDefault && BankPath.EndsWith(FString("_") + Locale.LocaleCode + FString(".bank")))
{
foundLocale = true;
break;
}
}
if (!foundLocale)
{
UE_LOG(LogFMOD, Warning, TEXT("Ignoring bank %s as another bank with the same GUID is already being used.\n"
"Bank %s does not match any locales in the FMOD Studio plugin settings."), *BankPath, *BankPath);
continue;
}
}
BankGuids.Add(GUID, BankPath);
}
else
{
UE_LOG(LogFMOD, Error, TEXT("Failed to add bank %s to lookup."), *BankPath);
}
}
for (TPair<FString,FString> GUIDPath : BankGuids)
{
FName OuterRowName(*GUIDPath.Key);
FFMODLocalizedBankTable* Row = BankLookup->DataTable->FindRow<FFMODLocalizedBankTable>(OuterRowName, nullptr, false);
if (Row)
{
StaleBanks.RemoveSingle(OuterRowName);
}
else
{
FFMODLocalizedBankTable NewRow{};
NewRow.Banks = NewObject<UDataTable>(BankLookup->DataTable, *GUIDPath.Key, RF_NoFlags);
NewRow.Banks->RowStruct = FFMODLocalizedBankRow::StaticStruct();
BankLookup->DataTable->AddRow(OuterRowName, NewRow);
Row = BankLookup->DataTable->FindRow<FFMODLocalizedBankTable>(OuterRowName, nullptr, false);
bModified = true;
}
FString CurFilename = FPaths::GetCleanFilename(GUIDPath.Value);
FString FilenamePart = CurFilename;
for (const FString& extension : BankExtensions)
{
FilenamePart.ReplaceInline(*extension, TEXT(""));
}
FString InnerRowName("<NON-LOCALIZED>");
for (const FFMODProjectLocale& Locale : InSettings.Locales)
{
if (FilenamePart.EndsWith(FString("_") + Locale.LocaleCode))
{
InnerRowName = Locale.LocaleCode;
break;
}
}
FFMODLocalizedBankRow* InnerRow = Row->Banks->FindRow<FFMODLocalizedBankRow>(FName(*InnerRowName), nullptr, false);
FString RelativeBankPath = GUIDPath.Value.RightChop(InSettings.GetFullBankPath().Len() + 1);
if (InnerRow)
{
if (InnerRow->Path != RelativeBankPath)
{
InnerRow->Path = RelativeBankPath;
bModified = true;
}
}
else
{
FFMODLocalizedBankRow NewRow{};
NewRow.Path = RelativeBankPath;
Row->Banks->AddRow(FName(*InnerRowName), NewRow);
bModified = true;
}
if (CurFilename == InSettings.GetMasterBankFilename() && BankLookup->MasterBankPath != RelativeBankPath)
{
BankLookup->MasterBankPath = RelativeBankPath;
bModified = true;
}
else if (CurFilename == InSettings.GetMasterStringsBankFilename() && BankLookup->MasterStringsBankPath != RelativeBankPath)
{
BankLookup->MasterStringsBankPath = RelativeBankPath;
bModified = true;
}
else if (CurFilename == InSettings.GetMasterAssetsBankFilename() && BankLookup->MasterAssetsBankPath != RelativeBankPath)
{
BankLookup->MasterAssetsBankPath = RelativeBankPath;
bModified = true;
}
}
StudioSystem->flushCommands();
// Remove stale banks from lookup
if (StaleBanks.Num() > 0)
{
for (const auto& RowName : StaleBanks)
{
BankLookup->DataTable->RemoveRow(RowName);
}
bModified = true;
}
if (bCreated)
{
FAssetRegistryModule::AssetCreated(BankLookup);
}
if (bCreated || bModified)
{
AssetsToSave.Add(BankLookup);
}
}
FString FFMODAssetBuilder::GetAssetClassName(UClass* AssetClass)
{
FString ClassName("");
if (AssetClass == UFMODEvent::StaticClass())
{
ClassName = TEXT("Events");
}
else if (AssetClass == UFMODSnapshot::StaticClass())
{
ClassName = TEXT("Snapshots");
}
else if (AssetClass == UFMODBank::StaticClass())
{
ClassName = TEXT("Banks");
}
else if (AssetClass == UFMODBus::StaticClass())
{
ClassName = TEXT("Buses");
}
else if (AssetClass == UFMODVCA::StaticClass())
{
ClassName = TEXT("VCAs");
}
else if (AssetClass == UFMODSnapshotReverb::StaticClass())
{
ClassName = TEXT("Reverbs");
}
else if (AssetClass == UFMODPort::StaticClass())
{
ClassName = TEXT("Ports");
}
return ClassName;
}
bool FFMODAssetBuilder::MakeAssetCreateInfo(const FGuid &AssetGuid, const FString &StudioPath, AssetCreateInfo *CreateInfo)
{
CreateInfo->StudioPath = StudioPath;
CreateInfo->Guid = AssetGuid;
FString AssetType;
FString AssetPath;
StudioPath.Split(TEXT(":"), &AssetType, &AssetPath, ESearchCase::CaseSensitive, ESearchDir::FromStart);
if (AssetType.Equals(TEXT("event")))
{
CreateInfo->Class = UFMODEvent::StaticClass();
}
else if (AssetType.Equals(TEXT("snapshot")))
{
CreateInfo->Class = UFMODSnapshot::StaticClass();
}
else if (AssetType.Equals(TEXT("bank")))
{
CreateInfo->Class = UFMODBank::StaticClass();
}
else if (AssetType.Equals(TEXT("bus")))
{
CreateInfo->Class = UFMODBus::StaticClass();
}
else if (AssetType.Equals(TEXT("vca")))
{
CreateInfo->Class = UFMODVCA::StaticClass();
}
else if (AssetType.Equals(TEXT("port")))
{
CreateInfo->Class = UFMODPort::StaticClass();
}
else if (AssetType.Equals(TEXT("parameter")))
{
return false;
}
else
{
UE_LOG(LogFMOD, Warning, TEXT("Unknown asset type: %s"), *AssetType);
CreateInfo->Class = UFMODAsset::StaticClass();
}
AssetPath.Split(TEXT("/"), &(CreateInfo->Path), &(CreateInfo->AssetName), ESearchCase::CaseSensitive, ESearchDir::FromEnd);
if (CreateInfo->AssetName.IsEmpty() || CreateInfo->AssetName.Contains(TEXT(".strings")))
{
return false;
}
return true;
}
UFMODAsset *FFMODAssetBuilder::CreateAsset(const AssetCreateInfo& CreateInfo, TArray<UObject*>& AssetsToSave)
{
FString SanitizedAssetName;
FText OutReason;
if (FName::IsValidXName(CreateInfo.AssetName, INVALID_OBJECTNAME_CHARACTERS, &OutReason))
{
SanitizedAssetName = CreateInfo.AssetName;
}
else
{
SanitizedAssetName = ObjectTools::SanitizeObjectName(CreateInfo.AssetName);
UE_LOG(LogFMOD, Log, TEXT("'%s' cannot be used as a UE4 asset name. %s. Using '%s' instead."), *CreateInfo.AssetName,
*OutReason.ToString(), *SanitizedAssetName);
}
const UFMODSettings &Settings = *GetDefault<UFMODSettings>();
FString Folder = Settings.GetFullContentPath() / GetAssetClassName(CreateInfo.Class) + CreateInfo.Path;
FString PackagePath = FString::Printf(TEXT("%s/%s"), *Folder, *SanitizedAssetName);
FString SanitizedPackagePath;
if (FName::IsValidXName(PackagePath, INVALID_LONGPACKAGE_CHARACTERS, &OutReason))
{
SanitizedPackagePath = PackagePath;
}
else
{
SanitizedPackagePath = ObjectTools::SanitizeInvalidChars(PackagePath, INVALID_OBJECTPATH_CHARACTERS);
UE_LOG(LogFMOD, Log, TEXT("'%s' cannot be used as a UE4 asset path. %s. Using '%s' instead."), *PackagePath, *OutReason.ToString(),
*SanitizedPackagePath);
}
UPackage *Package = CreatePackage(*SanitizedPackagePath);
Package->FullyLoad();
UFMODAsset *Asset = FindObject<UFMODAsset>(Package, *SanitizedAssetName);
bool bCreated = false;
bool bModified = false;
if (Asset && Asset->GetClass() == CreateInfo.Class)
{
if (Asset->AssetGuid != CreateInfo.Guid)
{
UE_LOG(LogFMOD, Log, TEXT("Updating asset: %s"), *SanitizedPackagePath);
Asset->AssetGuid = CreateInfo.Guid;
bModified = true;
}
}
else
{
UE_LOG(LogFMOD, Log, TEXT("Adding asset: %s"), *SanitizedPackagePath);
Asset = NewObject<UFMODAsset>(Package, CreateInfo.Class, FName(*SanitizedAssetName), RF_Standalone | RF_Public | RF_MarkAsRootSet);
Asset->AssetGuid = CreateInfo.Guid;
bCreated = true;
}
if (bCreated)
{
FAssetRegistryModule::AssetCreated(Asset);
}
if (bCreated || bModified)
{
AssetsToSave.Add(Asset);
}
if (!IsValid(Asset))
{
UE_LOG(LogFMOD, Error, TEXT("Failed to construct asset: %s"), *SanitizedPackagePath);
}
if (CreateInfo.Class == UFMODSnapshot::StaticClass())
{
FString OldPrefix = Settings.ContentBrowserPrefix + GetAssetClassName(Asset->GetClass());
FString NewPrefix = Settings.ContentBrowserPrefix + GetAssetClassName(UFMODSnapshotReverb::StaticClass());
UObject *Outer = Asset->GetOuter() ? Asset->GetOuter() : Asset;
FString ReverbPackagePath = Outer->GetPathName().Replace(*OldPrefix, *NewPrefix);
UPackage *ReverbPackage = CreatePackage(*ReverbPackagePath);
ReverbPackage->FullyLoad();
UFMODSnapshotReverb *AssetReverb = FindObject<UFMODSnapshotReverb>(ReverbPackage, *SanitizedAssetName, true);
bCreated = false;
bModified = false;
if (AssetReverb)
{
if (AssetReverb->AssetGuid != CreateInfo.Guid)
{
UE_LOG(LogFMOD, Log, TEXT("Updating snapshot reverb asset: %s"), *ReverbPackagePath);
AssetReverb->AssetGuid = CreateInfo.Guid;
bModified = true;
}
}
else
{
UE_LOG(LogFMOD, Log, TEXT("Constructing snapshot reverb asset: %s"), *ReverbPackagePath);
AssetReverb = NewObject<UFMODSnapshotReverb>(ReverbPackage, UFMODSnapshotReverb::StaticClass(), FName(*SanitizedAssetName),
RF_Standalone | RF_Public | RF_MarkAsRootSet);
AssetReverb->AssetGuid = CreateInfo.Guid;
bCreated = true;
}
if (bCreated)
{
FAssetRegistryModule::AssetCreated(AssetReverb);
}
if (bCreated || bModified)
{
AssetsToSave.Add(AssetReverb);
}
if (!IsValid(AssetReverb))
{
UE_LOG(LogFMOD, Error, TEXT("Failed to construct snapshot reverb asset: %s"), *ReverbPackagePath);
}
}
return Asset;
}
void FFMODAssetBuilder::SaveAssets(TArray<UObject*>& AssetsToSave)
{
if (AssetsToSave.Num() == 0)
{
return;
}
TArray<UPackage *> PackagesToSave;
for (auto& Asset : AssetsToSave)
{
UPackage* Package = Asset->GetPackage();
if (Package)
{
Package->MarkPackageDirty();
PackagesToSave.Add(Package);
}
}
UEditorLoadingAndSavingUtils::SavePackages(PackagesToSave, true);
}
void FFMODAssetBuilder::DeleteAssets(TArray<UObject*>& AssetsToDelete)
{
if (AssetsToDelete.Num() == 0)
{
return;
}
TArray<UObject*> ObjectsToDelete;
for (auto& Asset : AssetsToDelete)
{
ObjectsToDelete.Add(Asset);
if (Asset->GetClass() == UFMODSnapshot::StaticClass())
{
// Also delete the reverb asset
const UFMODSettings &Settings = *GetDefault<UFMODSettings>();
FString OldPrefix = Settings.ContentBrowserPrefix + GetAssetClassName(Asset->GetClass());
FString NewPrefix = Settings.ContentBrowserPrefix + GetAssetClassName(UFMODSnapshotReverb::StaticClass());
FString ReverbName = Asset->GetPathName().Replace(*OldPrefix, *NewPrefix);
UObject *Reverb = StaticFindObject(UFMODSnapshotReverb::StaticClass(), nullptr, *ReverbName);
if (Reverb)
{
ObjectsToDelete.Add(Reverb);
}
}
}
// Use ObjectTools to delete assets - ObjectTools::DeleteObjects handles confirmation, source control, and making read only files writables
ObjectTools::DeleteObjects(ObjectsToDelete, !IsRunningCommandlet());
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,115 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODAudioComponentDetails.h"
#include "Subsystems/AssetEditorSubsystem.h"
#include "FMODAmbientSound.h"
#include "FMODStudioModule.h"
#include "FMODEvent.h"
#include "fmod_studio.hpp"
#include "UnrealEd/Public/Editor.h"
#include "Widgets/Input/SButton.h"
#include "PropertyEditor/Public/DetailLayoutBuilder.h"
#include "PropertyEditor/Public/DetailCategoryBuilder.h"
#define LOCTEXT_NAMESPACE "FMODStudio"
TSharedRef<IDetailCustomization> FFMODAudioComponentDetails::MakeInstance()
{
return MakeShareable(new FFMODAudioComponentDetails);
}
void FFMODAudioComponentDetails::CustomizeDetails(IDetailLayoutBuilder &DetailBuilder)
{
const TArray<TWeakObjectPtr<UObject>> &SelectedObjects = DetailBuilder.GetSelectedObjects();
for (int32 ObjectIndex = 0; !AudioComponent.IsValid() && ObjectIndex < SelectedObjects.Num(); ++ObjectIndex)
{
const TWeakObjectPtr<UObject> &CurrentObject = SelectedObjects[ObjectIndex];
if (CurrentObject.Get()->GetClass()->IsChildOf(UFMODAudioComponent::StaticClass()))
{
AudioComponent = Cast<UFMODAudioComponent>(CurrentObject.Get());
}
else
{
AudioComponent = Cast<AActor>(CurrentObject.Get())->FindComponentByClass<UFMODAudioComponent>();
}
}
DetailBuilder.EditCategory(TEXT("FMODAudio"))
.AddCustomRow(
FText::GetEmpty())[SNew(SVerticalBox) +
SVerticalBox::Slot()
.Padding(0, 2.0f, 0, 0)
.FillHeight(1.0f)
.VAlign(
VAlign_Center)[SNew(SHorizontalBox) +
SHorizontalBox::Slot()
.AutoWidth()
.Padding(2.0f, 0.0f)
.VAlign(VAlign_Center)
.HAlign(HAlign_Left)[SNew(SButton)
.VAlign(VAlign_Center)
.OnClicked(this, &FFMODAudioComponentDetails::OnEditSoundClicked)
.Text(LOCTEXT("View Details", "Details"))] +
SHorizontalBox::Slot()
.AutoWidth()
.Padding(2.0f, 0.0f)
.VAlign(VAlign_Center)
.HAlign(HAlign_Left)[SNew(SButton)
.VAlign(VAlign_Center)
.OnClicked(this, &FFMODAudioComponentDetails::OnPlaySoundClicked)
.Text(LOCTEXT("Play FMOD Event", "Play"))] +
SHorizontalBox::Slot()
.AutoWidth()
.Padding(2.0f, 0.0f)
.VAlign(VAlign_Center)
.HAlign(HAlign_Left)[SNew(SButton)
.VAlign(VAlign_Center)
.OnClicked(this, &FFMODAudioComponentDetails::OnStopSoundClicked)
.Text(LOCTEXT("Stop FMOD Event", "Stop"))]]];
}
FReply FFMODAudioComponentDetails::OnEditSoundClicked()
{
if (AudioComponent.IsValid())
{
UFMODEvent *Event = AudioComponent.Get()->Event;
if (Event)
{
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAsset(Event);
}
}
return FReply::Handled();
}
FReply FFMODAudioComponentDetails::OnPlaySoundClicked()
{
if (AudioComponent.IsValid())
{
UFMODEvent *Event = AudioComponent.Get()->Event;
if (IsValid(Event))
{
FMOD::Studio::EventInstance *Instance = IFMODStudioModule::Get().CreateAuditioningInstance(Event);
if (Instance)
{
for (auto param : AudioComponent->ParameterCache)
{
Instance->setParameterByName(TCHAR_TO_UTF8(*param.Key.ToString()), param.Value);
}
Instance->start();
}
}
}
return FReply::Handled();
}
FReply FFMODAudioComponentDetails::OnStopSoundClicked()
{
IFMODStudioModule::Get().StopAuditioningInstance();
return FReply::Handled();
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,24 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
//#include "PropertyEditing.h"
#include "PropertyCustomizationHelpers.h"
#include "PropertyEditor/Public/IDetailCustomization.h"
class FFMODAudioComponentDetails : public IDetailCustomization
{
public:
/** Makes a new instance of this detail layout class for a specific detail view requesting it */
static TSharedRef<IDetailCustomization> MakeInstance();
private:
/** IDetailCustomization interface */
virtual void CustomizeDetails(IDetailLayoutBuilder &DetailBuilder) override;
FReply OnEditSoundClicked();
FReply OnPlaySoundClicked();
FReply OnStopSoundClicked();
TWeakObjectPtr<class UFMODAudioComponent> AudioComponent;
};

View File

@ -0,0 +1,54 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODAudioComponentVisualizer.h"
#include "FMODAudioComponent.h"
#include "FMODUtils.h"
#include "FMODEvent.h"
#include "fmod_studio.hpp"
#include "Engine/Public/SceneView.h"
#include "Engine/Public/SceneManagement.h"
void FFMODAudioComponentVisualizer::DrawVisualization(const UActorComponent *Component, const FSceneView *View, FPrimitiveDrawInterface *PDI)
{
if (View->Family->EngineShowFlags.AudioRadius)
{
const UFMODAudioComponent *AudioComp = Cast<const UFMODAudioComponent>(Component);
if (IsValid(AudioComp) && AudioComp->Event)
{
FMOD::Studio::EventDescription *EventDesc =
IFMODStudioModule::Get().GetEventDescription(AudioComp->Event, EFMODSystemContext::Auditioning);
if (EventDesc != nullptr)
{
bool bIs3D = false;
EventDesc->is3D(&bIs3D);
if (bIs3D)
{
const FColor AudioOuterRadiusColor(255, 153, 0);
const FColor AudioInnerRadiusColor(216, 130, 0);
const FTransform &Transform = AudioComp->GetComponentTransform();
float MinDistance = 0.0f;
float MaxDistance = 0.0f;
if (AudioComp->AttenuationDetails.bOverrideAttenuation)
{
MinDistance = AudioComp->AttenuationDetails.MinimumDistance;
MaxDistance = AudioComp->AttenuationDetails.MaximumDistance;
}
else
{
EventDesc->getMinMaxDistance(&MinDistance, &MaxDistance);
}
MinDistance = FMODUtils::DistanceToUEScale(MinDistance);
MaxDistance = FMODUtils::DistanceToUEScale(MaxDistance);
DrawWireSphereAutoSides(PDI, Transform.GetTranslation(), AudioOuterRadiusColor, MinDistance, SDPG_World);
if (MaxDistance != MinDistance)
{
DrawWireSphereAutoSides(PDI, Transform.GetTranslation(), AudioInnerRadiusColor, MaxDistance, SDPG_World);
}
}
}
}
}
}

View File

@ -0,0 +1,13 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "ComponentVisualizer.h"
class FFMODAudioComponentVisualizer : public FComponentVisualizer
{
public:
// Begin FComponentVisualizer interface
virtual void DrawVisualization(const UActorComponent *Component, const FSceneView *View, FPrimitiveDrawInterface *PDI) override;
// End FComponentVisualizer interface
};

View File

@ -0,0 +1,96 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODBankUpdateNotifier.h"
#include "FMODSettings.h"
#include "HAL/FileManager.h"
#include "FMODStudioEditorPrivatePCH.h"
FFMODBankUpdateNotifier::FFMODBankUpdateNotifier()
: bUpdateEnabled(true)
, NextRefreshTime(FDateTime::MinValue())
, FileTime(FDateTime::MinValue())
, Countdown(0.0f)
{
}
void FFMODBankUpdateNotifier::SetFilePath(const FString &InPath)
{
FilePath = InPath;
NextRefreshTime = FDateTime::MinValue();
FileTime = MostRecentFileTime();
}
void FFMODBankUpdateNotifier::Update(float DeltaTime)
{
if (bUpdateEnabled)
{
FDateTime CurTime = FDateTime::UtcNow();
if (CurTime >= NextRefreshTime)
{
Refresh();
NextRefreshTime = CurTime + FTimespan(0, 0, 1);
}
if (Countdown > 0.0f)
{
Countdown -= DeltaTime;
if (Countdown <= 0.0f)
{
BanksUpdatedEvent.Broadcast();
}
}
}
}
void FFMODBankUpdateNotifier::EnableUpdate(bool bEnable)
{
bUpdateEnabled = bEnable;
if (bEnable)
{
// Refreshing right after update is enabled is not desirable
NextRefreshTime = FDateTime::UtcNow() + FTimespan(0, 0, 1);
// Cancel any pending countdown
Countdown = 0.0f;
}
}
void FFMODBankUpdateNotifier::Refresh()
{
if (!FilePath.IsEmpty())
{
FDateTime NewFileTime = MostRecentFileTime();
if (NewFileTime != FileTime)
{
const UFMODSettings &Settings = *GetDefault<UFMODSettings>();
Countdown = (float)Settings.ReloadBanksDelay;
FileTime = NewFileTime;
}
}
}
FDateTime FFMODBankUpdateNotifier::MostRecentFileTime()
{
// Get the most recent modified timestamp of all the bank files in the directory we are watching.
FDateTime MostRecent = FDateTime::MinValue();
TArray<FString> BankPaths;
IFileManager::Get().FindFilesRecursive(BankPaths, *FilePath, TEXT("*.bank"), true, false, false);
for (const auto& Path : BankPaths)
{
FDateTime ModifiedTime = IFileManager::Get().GetTimeStamp(*Path);
if (ModifiedTime > MostRecent)
{
MostRecent = ModifiedTime;
}
}
return MostRecent;
}

View File

@ -0,0 +1,30 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "Containers/UnrealString.h"
#include "Misc/DateTime.h"
#include "Delegates/Delegate.h"
class FFMODBankUpdateNotifier
{
public:
FFMODBankUpdateNotifier();
void SetFilePath(const FString &InPath);
void Update(float DeltaTime);
void EnableUpdate(bool bEnable);
FSimpleMulticastDelegate BanksUpdatedEvent;
private:
void Refresh();
FDateTime MostRecentFileTime();
bool bUpdateEnabled;
FString FilePath;
FDateTime NextRefreshTime;
FDateTime FileTime;
float Countdown;
};

View File

@ -0,0 +1,189 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEventEditor.h"
#include "FMODEvent.h"
#include "FMODStudioEditorModule.h"
#include "FMODStudioModule.h"
#include "FMODUtils.h"
#include "SFMODEventEditorPanel.h"
#include "Widgets/Docking/SDockTab.h"
#include "fmod_studio.hpp"
#include "UnrealEd/Public/Editor.h"
#define LOCTEXT_NAMESPACE "FMODEventEditor"
DEFINE_LOG_CATEGORY_STATIC(LogFMODEventEditor, Log, All);
const FName FFMODEventEditor::EventEditorTabId(TEXT("FFMODEventEditor_EventView"));
const FName FFMODEventEditor::FMODEventEditorAppIdentifier(TEXT("FMODEventEditorApp"));
void FFMODEventEditor::RegisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager)
{
WorkspaceMenuCategory = NewTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_FMODEventEditor", "FMOD Event Editor"));
auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();
FAssetEditorToolkit::RegisterTabSpawners(NewTabManager);
NewTabManager->RegisterTabSpawner(EventEditorTabId, FOnSpawnTab::CreateSP(this, &FFMODEventEditor::SpawnTab_EventEditor))
.SetDisplayName(LOCTEXT("EventTab", "FMOD Event"))
.SetGroup(WorkspaceMenuCategoryRef);
}
void FFMODEventEditor::UnregisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager)
{
FAssetEditorToolkit::UnregisterTabSpawners(NewTabManager);
NewTabManager->UnregisterTabSpawner(EventEditorTabId);
}
FFMODEventEditor::FFMODEventEditor()
: CurrentPreviewEventInstance(nullptr)
, EditedEvent(nullptr)
{
IFMODStudioEditorModule::Get().BanksReloadedEvent().AddRaw(this, &FFMODEventEditor::HandleBanksReloaded);
BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FFMODEventEditor::HandleBeginPIE);
}
FFMODEventEditor::~FFMODEventEditor()
{
IFMODStudioEditorModule::Get().BanksReloadedEvent().RemoveAll(this);
FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle);
CurrentPreviewEventInstance = nullptr;
}
UFMODEvent *FFMODEventEditor::GetEditedEvent() const
{
return EditedEvent;
}
FMOD::Studio::EventDescription *FFMODEventEditor::GetEventDescription() const
{
return IFMODStudioModule::Get().GetEventDescription(EditedEvent, EFMODSystemContext::Auditioning);
}
void FFMODEventEditor::PlayEvent()
{
CurrentPreviewEventInstance = IFMODStudioModule::Get().CreateAuditioningInstance(EditedEvent);
if (CurrentPreviewEventInstance != nullptr)
{
TArray<float> values;
TArray<FMOD_STUDIO_PARAMETER_ID> ids;
ParameterValues.GenerateKeyArray(ids);
ParameterValues.GenerateValueArray(values);
CurrentPreviewEventInstance->setParametersByIDs(ids.GetData(), values.GetData(), ParameterValues.Num());
CurrentPreviewEventInstance->start();
}
}
void FFMODEventEditor::PauseEvent()
{
if (CurrentPreviewEventInstance != nullptr)
{
bool bIsPaused = false;
CurrentPreviewEventInstance->getPaused(&bIsPaused);
CurrentPreviewEventInstance->setPaused(!bIsPaused);
}
}
void FFMODEventEditor::StopEvent()
{
IFMODStudioModule::Get().StopAuditioningInstance();
}
void FFMODEventEditor::SetParameterValue(FMOD_STUDIO_PARAMETER_ID ParameterId, float Value)
{
ParameterValues[ParameterId] = Value;
if (CurrentPreviewEventInstance != nullptr)
{
CurrentPreviewEventInstance->setParameterByID(ParameterId, Value);
}
}
void FFMODEventEditor::AddParameter(FMOD_STUDIO_PARAMETER_ID ParameterId, float Value)
{
ParameterValues.Add(ParameterId, Value);
}
float FFMODEventEditor::GetParameterValue(FMOD_STUDIO_PARAMETER_ID Id)
{
return ParameterValues[Id];
}
void FFMODEventEditor::InitFMODEventEditor(const EToolkitMode::Type Mode, const TSharedPtr<class IToolkitHost> &InitToolkitHost, UFMODEvent *Event)
{
if (IsValid(Event))
{
EditedEvent = Event;
TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout =
FTabManager::NewLayout("Standalone_FMODEventEditor_Layout")
->AddArea(FTabManager::NewPrimaryArea()
->SetOrientation(Orient_Vertical)
->Split(FTabManager::NewStack()->AddTab(EventEditorTabId, ETabState::OpenedTab)->SetHideTabWell(true)));
const bool bCreateDefaultStandaloneMenu = true;
const bool bCreateDefaultToolbar = false;
FAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, FFMODEventEditor::FMODEventEditorAppIdentifier, StandaloneDefaultLayout,
bCreateDefaultStandaloneMenu, bCreateDefaultToolbar, Event);
}
}
FName FFMODEventEditor::GetToolkitFName() const
{
return FName("FMODEventEditor");
}
FText FFMODEventEditor::GetBaseToolkitName() const
{
return LOCTEXT("ToolkitName", "FMOD Event Editor");
}
FString FFMODEventEditor::GetWorldCentricTabPrefix() const
{
return LOCTEXT("WorldCentricTabPrefix", "FMOD Event ").ToString();
}
FLinearColor FFMODEventEditor::GetWorldCentricTabColorScale() const
{
return FLinearColor(0.0f, 0.0f, 0.5f, 0.5f);
}
void FFMODEventEditor::CreateInternalWidgets()
{
FMODEventEditorPanel = SNew(SFMODEventEditorPanel).FMODEventEditor(SharedThis(this));
}
TSharedRef<SDockTab> FFMODEventEditor::SpawnTab_EventEditor(const FSpawnTabArgs &Args)
{
check(Args.GetTabId().TabType == EventEditorTabId);
CreateInternalWidgets();
return SAssignNew(OwnerTab, SDockTab)
.Label(LOCTEXT("EventEditorTitle", "FMOD Event"))
.TabColorScale(GetTabColorScale())[FMODEventEditorPanel.ToSharedRef()];
}
void FFMODEventEditor::HandleBanksReloaded()
{
CurrentPreviewEventInstance = nullptr;
CreateInternalWidgets();
if (OwnerTab.IsValid())
{
OwnerTab->SetContent(FMODEventEditorPanel.ToSharedRef());
}
}
void FFMODEventEditor::HandleBeginPIE(bool bSimulating)
{
CurrentPreviewEventInstance = nullptr;
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,88 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "Toolkits/AssetEditorToolkit.h"
#include "fmod_studio_common.h"
namespace FMOD
{
namespace Studio
{
class EventDescription;
class EventInstance;
}
}
static bool operator==(const FMOD_STUDIO_PARAMETER_ID &a, const FMOD_STUDIO_PARAMETER_ID &b)
{
return (a.data1 == b.data1 && a.data2 == b.data2);
}
FORCEINLINE uint32 GetTypeHash(const FMOD_STUDIO_PARAMETER_ID& id)
{
return FCrc::MemCrc_DEPRECATED(&id, sizeof(FMOD_STUDIO_PARAMETER_ID));
}
class FFMODEventEditor : public FAssetEditorToolkit
{
public:
virtual void RegisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager) override;
virtual void UnregisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager) override;
/**
* Edits the specified event
*
* @param Mode Asset editing mode for this editor (standalone or world-centric)
* @param InitToolkitHost When Mode is WorldCentric, this is the level editor instance to spawn this editor within
* @param Event The event to edit
*/
void InitFMODEventEditor(const EToolkitMode::Type Mode, const TSharedPtr<class IToolkitHost> &InitToolkitHost, class UFMODEvent *Event);
/** Constructor */
FFMODEventEditor();
/** Destructor */
virtual ~FFMODEventEditor();
UFMODEvent *GetEditedEvent() const;
FMOD::Studio::EventDescription *GetEventDescription() const;
void PlayEvent();
void PauseEvent();
void StopEvent();
float GetParameterValue(FMOD_STUDIO_PARAMETER_ID Id);
void SetParameterValue(FMOD_STUDIO_PARAMETER_ID ParameterId, float Value);
void AddParameter(FMOD_STUDIO_PARAMETER_ID ParameterId, float Value);
/** IToolkit interface */
virtual FName GetToolkitFName() const override;
virtual FText GetBaseToolkitName() const override;
virtual FString GetWorldCentricTabPrefix() const override;
virtual FLinearColor GetWorldCentricTabColorScale() const override;
private:
TMap<FMOD_STUDIO_PARAMETER_ID, float> ParameterValues;
FMOD::Studio::EventInstance *CurrentPreviewEventInstance;
void HandlePreBanksReloaded();
void HandleBanksReloaded();
void HandleBeginPIE(bool bSimulating);
/** Creates all internal widgets for the tabs to point at */
void CreateInternalWidgets();
/** Spawns the tab with the FMOD event inside */
TSharedRef<SDockTab> SpawnTab_EventEditor(const FSpawnTabArgs &Args);
TSharedPtr<class SFMODEventEditorPanel> FMODEventEditorPanel;
TSharedPtr<SDockTab> OwnerTab;
/** The tab id for the event editor tab */
static const FName EventEditorTabId;
/** FMOD event editor app identifier string */
static const FName FMODEventEditorAppIdentifier;
class UFMODEvent *EditedEvent;
FDelegateHandle BeginPIEDelegateHandle;
};

View File

@ -0,0 +1,70 @@
// Copyright (c), Firelight Technologies Pty, Ltd.
#include "FMODGenerateAssetsCommandlet.h"
#include "FMODSettings.h"
#include "AssetRegistry/AssetRegistryModule.h"
#include "Editor.h"
#include "Editor/UnrealEd/Public/FileHelpers.h"
#include "HAL/PlatformFileManager.h"
#include "../Classes/FMODAssetBuilder.h"
DEFINE_LOG_CATEGORY_STATIC(LogFMODCommandlet, Log, All);
static constexpr auto RebuildSwitch = TEXT("rebuild");
UFMODGenerateAssetsCommandlet::UFMODGenerateAssetsCommandlet(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
int32 UFMODGenerateAssetsCommandlet::Main(const FString& CommandLine)
{
int32 returnCode = 0;
#if WITH_EDITOR
FAssetRegistryModule& assetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(AssetRegistryConstants::ModuleName);
IAssetRegistry& AssetRegistry = assetRegistryModule.Get();
const UFMODSettings& Settings = *GetDefault<UFMODSettings>();
TArray<FString> Tokens, Switches;
TMap<FString, FString> Params;
ParseCommandLine(*CommandLine, Tokens, Switches, Params);
// Rebuild switch
if (Switches.Contains(RebuildSwitch))
{
FString FolderToDelete;
IPlatformFile& FileManager = FPlatformFileManager::Get().GetPlatformFile();
for (FString folder : Settings.GeneratedFolders)
{
FolderToDelete = FPaths::ProjectContentDir() + Settings.ContentBrowserPrefix + folder;
bool removed = FileManager.DeleteDirectoryRecursively(*FolderToDelete);
if (!removed)
{
UE_LOG(LogFMODCommandlet, Warning, TEXT("Unable to delete '%s'."), *FolderToDelete);
}
}
}
// Ensure AssetRegistry is up to date
TArray<FString> InPaths;
InPaths.Add(Settings.GetFullContentPath());
AssetRegistry.ScanPathsSynchronous(InPaths);
while (AssetRegistry.IsLoadingAssets())
{
AssetRegistry.Tick(1.0f);
}
FFMODAssetBuilder assetBuilder;
if (!IsEngineExitRequested())
{
assetBuilder.Create();
assetBuilder.ProcessBanks();
}
#endif
return returnCode;
}

View File

@ -0,0 +1,237 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2023.
#include "FMODSettingsCustomization.h"
#include "DetailCategoryBuilder.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "FMODSettings.h"
#include "IDetailPropertyRow.h"
#include "Settings/ProjectPackagingSettings.h"
#include "Styling/SlateColor.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SWidget.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/Layout/SBorder.h"
#include "Widgets/Layout/SWidgetSwitcher.h"
#include "Widgets/Images/SImage.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Input/SButton.h"
#define LOCTEXT_NAMESPACE "FMODSettings"
class SSettingsMessage : public SCompoundWidget
{
SLATE_BEGIN_ARGS(SSettingsMessage)
{}
// Called when the Setup button is clicked
SLATE_EVENT(FSimpleDelegate, OnSetupClicked)
SLATE_END_ARGS()
public:
void Construct(const FArguments& InArgs)
{
TSharedRef<SWidget> SettingsOkayWidget = MakeRow(
"SettingsEditor.GoodIcon",
LOCTEXT("SettingsOkayText", "FMOD Settings are valid, run the Validate FMOD command to perform additional checking."),
FText()
);
TSharedRef<SWidget> NoContentDirWidget = MakeRow(
"SettingsEditor.WarningIcon",
LOCTEXT("NoContentDirText", "Bank Output Directory directory has not been set."),
FText()
);
TSharedRef<SWidget> PackagingSettingsBadWidget = MakeRow(
"SettingsEditor.WarningIcon",
LOCTEXT("PackagingSettingsBadText",
"The packaging settings for copying the FMOD bank files to staging are not correct. It is recommended that:\n"
" - The bank output directory for the Desktop platform (or the forced platform if set) is added to the \"Additional Non-Asset Directories To Copy\" list.\n"
" - That no other directory containing FMOD banks or assets is added to either the \"Additional Non-Asset Directories To Copy\" list "
"or the \"Additional Non-Asset Directories to Package\" list.\n"
" - The Generated Assets are added to the \"Additional Asset Directories to Cook\" list."
),
LOCTEXT("FixPackagingSettings", "Fix")
);
ChildSlot
[
SNew(SBorder)
.BorderBackgroundColor(this, &SSettingsMessage::GetBorderColor)
.BorderImage(FAppStyle::GetBrush("ToolPanel.LightGroupBorder"))
.Padding(8.0f)
[
SNew(SWidgetSwitcher)
.WidgetIndex(this, &SSettingsMessage::GetSetupStateAsInt)
+ SWidgetSwitcher::Slot()
[
SettingsOkayWidget
]
+ SWidgetSwitcher::Slot()
[
NoContentDirWidget
]
+ SWidgetSwitcher::Slot()
[
PackagingSettingsBadWidget
]
]
];
UpdateState();
}
void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)
{
UpdateState();
}
private:
FSlateColor GetBorderColor() const
{
if (SettingsState == UFMODSettings::Okay)
{
return FLinearColor::Green;
}
else
{
return FLinearColor(0.8f, 0, 0);
}
}
TSharedRef<SWidget> MakeRow(FName IconName, FText Message, FText ButtonMessage)
{
TSharedRef<SHorizontalBox> Result = SNew(SHorizontalBox)
// Status icon
+ SHorizontalBox::Slot().AutoWidth().VAlign(VAlign_Center)[SNew(SImage).Image(FAppStyle::GetBrush(IconName))]
// Notice
+ SHorizontalBox::Slot()
.FillWidth(1.0f)
.Padding(16.0f, 0.0f)
.VAlign(VAlign_Center)[
SNew(STextBlock)
.ColorAndOpacity(FLinearColor::White)
.ShadowColorAndOpacity(FLinearColor::Black)
.ShadowOffset(FVector2D::UnitVector)
.AutoWrapText(true)
.Text(Message)
];
if (!ButtonMessage.IsEmpty())
{
Result->AddSlot()
.AutoWidth()
.VAlign(VAlign_Center)
[
SNew(SButton)
.OnClicked(this, &SSettingsMessage::OnButtonPressed)
.Text(ButtonMessage)
];
}
return Result;
}
FReply OnButtonPressed()
{
const UFMODSettings& Settings = *GetDefault<UFMODSettings>();
UProjectPackagingSettings* PackagingSettings = Cast<UProjectPackagingSettings>(UProjectPackagingSettings::StaticClass()->GetDefaultObject());
if (SettingsState == UFMODSettings::PackagingSettingsBad)
{
// Remove any bad entries
for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Num();)
{
if (PackagingSettings->DirectoriesToAlwaysStageAsNonUFS[i].Path.StartsWith(Settings.BankOutputDirectory.Path))
{
PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.RemoveAt(i);
}
else
{
++i;
}
}
for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsUFS.Num();)
{
if (PackagingSettings->DirectoriesToAlwaysStageAsUFS[i].Path.StartsWith(Settings.BankOutputDirectory.Path))
{
PackagingSettings->DirectoriesToAlwaysStageAsUFS.RemoveAt(i);
}
else
{
++i;
}
}
for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysCook.Num();)
{
if (PackagingSettings->DirectoriesToAlwaysCook[i].Path.StartsWith(Settings.GetFullContentPath()))
{
PackagingSettings->DirectoriesToAlwaysCook.RemoveAt(i);
}
else
{
++i;
}
}
// Add correct entry
FDirectoryPath BankPath;
BankPath.Path = Settings.GetDesktopBankPath();
PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Add(BankPath);
FDirectoryPath generatedFolder;
for (FString folder : Settings.GeneratedFolders)
{
generatedFolder.Path = Settings.GetFullContentPath() / folder;
PackagingSettings->DirectoriesToAlwaysCook.Add(generatedFolder);
}
PackagingSettings->TryUpdateDefaultConfigFile();
}
UpdateState();
return FReply::Handled();
}
int32 GetSetupStateAsInt() const
{
return (int32)SettingsState;
}
void UpdateState()
{
const UFMODSettings& Settings = *GetDefault<UFMODSettings>();
SettingsState = Settings.Check();
}
private:
UFMODSettings::EProblem SettingsState;
};
TSharedRef<IDetailCustomization> FFMODSettingsCustomization::MakeInstance()
{
return MakeShareable(new FFMODSettingsCustomization);
}
FFMODSettingsCustomization::FFMODSettingsCustomization()
{
}
void FFMODSettingsCustomization::CustomizeDetails(IDetailLayoutBuilder &DetailLayout)
{
IDetailCategoryBuilder &PackagingCategory = DetailLayout.EditCategory(TEXT("Notice"), FText::GetEmpty(), ECategoryPriority::Important);
TSharedRef<SSettingsMessage> PlatformSetupMessage = SNew(SSettingsMessage);
PackagingCategory.AddCustomRow(LOCTEXT("Warning", "Warning"), false).WholeRowWidget[PlatformSetupMessage];
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,25 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2023.
#pragma once
#include "CoreMinimal.h"
#include "Misc/Attribute.h"
#include "Input/Reply.h"
#include "IDetailCustomization.h"
#include "PropertyHandle.h"
class IDetailLayoutBuilder;
class FFMODSettingsCustomization : public IDetailCustomization
{
public:
// Makes a new instance of this detail layout class for a specific detail view requesting it
static TSharedRef<IDetailCustomization> MakeInstance();
// IDetailCustomization interface
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailLayout) override;
// End of IDetailCustomization interface
private:
FFMODSettingsCustomization();
};

View File

@ -0,0 +1,19 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "Runtime/Engine/Classes/Components/SceneComponent.h"
#include "Runtime/Engine/Classes/Camera/CameraComponent.h"
#include "Runtime/Engine/Classes/Curves/IntegralCurve.h"
#include "Runtime/Engine/Classes/Curves/NameCurve.h"
#include "Runtime/Engine/Classes/Curves/RichCurve.h"
#include "Runtime/MovieScene/Public/MovieScene.h"
#include "Runtime/MovieScene/Public/KeyParams.h"
#include "Editor/Sequencer/Public/ISectionLayoutBuilder.h"
#include "Editor/Sequencer/Public/ISequencerSection.h"
#include "Editor/Sequencer/Public/MovieSceneTrackEditor.h"
#include "Runtime/MovieScene/Public/MovieSceneCommonHelpers.h"
#include "Runtime/MovieScene/Public/MovieSceneSection.h"
#include "Editor/UnrealEd/Public/ScopedTransaction.h"
DECLARE_LOG_CATEGORY_EXTERN(LogFMOD, Log, All);

View File

@ -0,0 +1,53 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODStudioStyle.h"
#include "Styling/SlateStyleRegistry.h"
#include "EditorStyle/Public/Interfaces/IEditorStyleModule.h"
#include "Modules/ModuleManager.h"
//////////////////////////////////////////////////////////////////////////
// FFMODStudioStyle
TSharedPtr<FSlateStyleSet> FFMODStudioStyle::StyleInstance = NULL;
void FFMODStudioStyle::Initialize()
{
if (!StyleInstance.IsValid())
{
StyleInstance = Create();
FSlateStyleRegistry::RegisterSlateStyle(*StyleInstance);
}
}
#define IMAGE_BRUSH(RelativePath, ...) FSlateImageBrush(Style->RootToContentDir(RelativePath, TEXT(".png")), __VA_ARGS__)
TSharedRef<FSlateStyleSet> FFMODStudioStyle::Create()
{
TSharedRef<FSlateStyleSet> Style = MakeShared<FSlateStyleSet>(TEXT("FMODStudioStyle"));
Style->SetContentRoot(FPaths::EngineContentDir() / TEXT("Editor/Slate"));
const FVector2D Icon16x16(16.0f, 16.0f);
const FVector2D Icon64x64(64.0f, 64.0f);
Style->Set("ClassIcon.FMODAmbientSound", new IMAGE_BRUSH(TEXT("Icons/AssetIcons/AmbientSound_16x"), Icon16x16));
Style->Set("ClassThumbnail.FMODAmbientSound", new IMAGE_BRUSH(TEXT("Icons/AssetIcons/AmbientSound_64x"), Icon64x64));
Style->Set("ClassIcon.FMODAudioComponent", new IMAGE_BRUSH(TEXT("Icons/ActorIcons/SoundActor_16x"), Icon16x16));
Style->Set("ClassIcon.FMODAsset", new IMAGE_BRUSH(TEXT("Icons/ActorIcons/SoundActor_16x"), Icon16x16));
return Style;
}
#undef IMAGE_BRUSH
void FFMODStudioStyle::Shutdown()
{
ensureMsgf(StyleInstance.IsValid(), TEXT("%S called, but StyleInstance wasn't initialized"), __FUNCTION__);
FSlateStyleRegistry::UnRegisterSlateStyle(*StyleInstance);
ensure(StyleInstance.IsUnique());
StyleInstance.Reset();
}
//////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,24 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "SlateCore/Public/Styling/SlateStyle.h"
#include "EditorStyle/Public/EditorStyleSet.h"
class FFMODStudioStyle
{
public:
static void Initialize();
static FName GetStyleSetName();
static void Shutdown();
private:
static TSharedRef<class FSlateStyleSet> Create();
private:
static TSharedPtr<class FSlateStyleSet> StyleInstance;
private:
FFMODStudioStyle() {}
};

View File

@ -0,0 +1,285 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "SFMODEventEditorPanel.h"
#include "FMODStudioModule.h"
#include "FMODUtils.h"
#include "Input/Reply.h"
#include "Widgets/Input/SNumericEntryBox.h"
#include "Widgets/Layout/SExpandableArea.h"
#include "EditorStyle/Public/EditorStyleSet.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/Layout/SScrollBox.h"
#include "fmod_studio.hpp"
#define LOCTEXT_NAMESPACE "FMODEventEditor"
SFMODEventEditorPanel::~SFMODEventEditorPanel()
{
}
void SFMODEventEditorPanel::Construct(const FArguments &InArgs)
{
FMODEventEditorPtr = InArgs._FMODEventEditor;
FMOD::Studio::EventDescription *EventDescription = FMODEventEditorPtr.Pin()->GetEventDescription();
TSharedRef<SBorder> ToolbarBorder = ConstructToolbar(EventDescription);
TSharedRef<SExpandableArea> InfoArea = ConstructInfo(EventDescription);
TSharedRef<SExpandableArea> ParametersArea = ConstructParameters(EventDescription);
TSharedRef<SExpandableArea> UserPropertiesArea = ConstructUserProperties(EventDescription);
TSharedRef<SVerticalBox> ChildWidget = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[InfoArea] +
SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[ParametersArea] +
SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[UserPropertiesArea];
ChildSlot[SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[ToolbarBorder] +
SVerticalBox::Slot().FillHeight(
1.0f)[SNew(SScrollBox) +
SScrollBox::Slot().Padding(0.0f)[SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.0f)[ChildWidget]]]];
}
TSharedRef<SBorder> SFMODEventEditorPanel::ConstructToolbar(FMOD::Studio::EventDescription *EventDescription)
{
float MinDistance = 0.0f;
float MaxDistance = 0.0f;
int32 EventLengthMS = 0;
bool bIsOneshot = false, bIsStream = false, bIs3D = false;
if (EventDescription != nullptr)
{
EventDescription->getMinMaxDistance(&MinDistance, &MaxDistance);
EventDescription->getLength(&EventLengthMS);
EventDescription->isOneshot(&bIsOneshot);
EventDescription->isStream(&bIsStream);
EventDescription->is3D(&bIs3D);
}
const FTimespan EventLength = FTimespan::FromMilliseconds((double)EventLengthMS);
const FString EventLengthString =
EventLength.GetHours() <= 0 ? EventLength.ToString(TEXT("%m:%s.%f")) : EventLength.ToString(TEXT("%h:%m:%s.%f"));
const FText RadiusText =
FText::Format(LOCTEXT("RadiusFormat", "Distance Attenuation: {0}m to {1}m"), FText::AsNumber(MinDistance), FText::AsNumber(MaxDistance));
const FText LengthText = FText::Format(LOCTEXT("LengthFormat", "Length: {0}"), FText::FromString(EventLengthString));
FText EventInfoText;
if (bIs3D && bIsOneshot)
{
EventInfoText = FText::Format(LOCTEXT("RadiusLengthFormat", "{0} - {1}"), RadiusText, LengthText);
}
else if (!bIs3D && bIsOneshot)
{
EventInfoText = LengthText;
}
else if (bIs3D && !bIsOneshot)
{
EventInfoText = RadiusText;
}
return SNew(SBorder)
.BorderImage(FAppStyle::Get().GetBrush("ToolPanel.GroupBorder"))
.Padding(6.0f)
.Content()[SNew(SHorizontalBox) +
SHorizontalBox::Slot()
.AutoWidth()
.Padding(0.0f, 0.0f, 2.0f, 0.0f)
.VAlign(VAlign_Center)
.HAlign(HAlign_Left)[SNew(SButton)
.VAlign(VAlign_Center)
.Text(LOCTEXT("Play", "Play"))
.ContentPadding(4)
.OnClicked(this, &SFMODEventEditorPanel::OnClickedPlay)] +
SHorizontalBox::Slot()
.AutoWidth()
.Padding(2.0f, 0.0f)
.VAlign(VAlign_Center)
.HAlign(HAlign_Left)
[SNew(SButton).Text(LOCTEXT("Pause", "Pause")).ContentPadding(4).OnClicked(this, &SFMODEventEditorPanel::OnClickedPause)] +
SHorizontalBox::Slot()
.AutoWidth()
.Padding(2.0f, 0.0f)
.VAlign(VAlign_Center)
.HAlign(HAlign_Left)[SNew(SButton)
.VAlign(VAlign_Center)
.Text(LOCTEXT("Stop", "Stop"))
.ContentPadding(4)
.OnClicked(this, &SFMODEventEditorPanel::OnClickedStop)] +
SHorizontalBox::Slot()
.FillWidth(1.0f)
.Padding(2.0f, 0.0f)
.VAlign(VAlign_Center)
.HAlign(HAlign_Right)[SNew(STextBlock).Text(EventInfoText)]];
}
void AddTextField(TSharedRef<SVerticalBox> &InfoBox, const TCHAR *Name, const FText &Value)
{
InfoBox->AddSlot().Padding(
4.0f, 3.0f)[SNew(SHorizontalBox) + SHorizontalBox::Slot().FillWidth(0.3f)[SNew(STextBlock).Text(FText::FromString(Name))] +
SHorizontalBox::Slot()[SNew(SEditableText).Text(Value).IsReadOnly(true)]];
}
void AddBoolField(TSharedRef<SVerticalBox> &InfoBox, const TCHAR *Name, bool bValue)
{
AddTextField(InfoBox, Name, bValue ? LOCTEXT("True", "True") : LOCTEXT("False", "False"));
}
void AddFloatField(TSharedRef<SVerticalBox> &InfoBox, const TCHAR *Name, float Value)
{
AddTextField(InfoBox, Name, FText::AsNumber(Value));
}
TSharedRef<SExpandableArea> MakeBox(TSharedRef<SVerticalBox> &InfoBox, const FText &Value)
{
return SNew(SExpandableArea)
.AreaTitle(Value)
.InitiallyCollapsed(false)
.BodyContent()[SNew(SBorder).BorderImage(FCoreStyle::Get().GetBrush("NoBorder")).Padding(4.0f).Content()[InfoBox]];
}
TSharedRef<SExpandableArea> SFMODEventEditorPanel::ConstructInfo(FMOD::Studio::EventDescription *EventDescription)
{
TSharedRef<SVerticalBox> InfoBox = SNew(SVerticalBox);
if (EventDescription != nullptr)
{
FString EventPath = FMODUtils::GetPath(EventDescription);
FGuid Guid = FMODUtils::GetID(EventDescription);
int Length = 0.0f;
float MinDist = 0.0f;
float MaxDist = 0.0f;
EventDescription->getLength(&Length);
EventDescription->getMinMaxDistance(&MinDist, &MaxDist);
bool bOneShot = false;
bool bStream = false;
bool b3D = false;
EventDescription->isOneshot(&bOneShot);
EventDescription->isStream(&bStream);
EventDescription->is3D(&b3D);
AddTextField(InfoBox, TEXT("Path"), FText::FromString(EventPath));
AddTextField(InfoBox, TEXT("Guid"), FText::FromString(Guid.ToString(EGuidFormats::DigitsWithHyphensInBraces)));
AddBoolField(InfoBox, TEXT("OneShot"), bOneShot);
AddBoolField(InfoBox, TEXT("Streaming"), bStream);
AddBoolField(InfoBox, TEXT("3D"), b3D);
AddFloatField(InfoBox, TEXT("Length"), static_cast<float>(Length));
if (b3D)
{
AddFloatField(InfoBox, TEXT("Min Dist"), MinDist);
AddFloatField(InfoBox, TEXT("Max Dist"), MaxDist);
}
}
return MakeBox(InfoBox, LOCTEXT("EventInfo", "Event Info"));
}
TSharedRef<SExpandableArea> SFMODEventEditorPanel::ConstructParameters(FMOD::Studio::EventDescription *EventDescription)
{
auto EventEditor = FMODEventEditorPtr.Pin();
TSharedRef<SVerticalBox> ParametersBox = SNew(SVerticalBox);
FNumberFormattingOptions Options;
Options.MinimumFractionalDigits = 1;
if (EventDescription != nullptr)
{
int32 ParameterCount;
EventDescription->getParameterDescriptionCount(&ParameterCount);
for (int32 ParamIdx = 0; ParamIdx < ParameterCount; ParamIdx++)
{
FMOD_STUDIO_PARAMETER_DESCRIPTION Parameter;
EventDescription->getParameterDescriptionByIndex(ParamIdx, &Parameter);
EventEditor->AddParameter(Parameter.id, Parameter.minimum);
const FString ParameterName = Parameter.type == FMOD_STUDIO_PARAMETER_GAME_CONTROLLED ? FString(UTF8_TO_TCHAR(Parameter.name)) :
FMODUtils::ParameterTypeToString(Parameter.type);
const FText ToolTipText = FText::Format(LOCTEXT("ParameterTooltipFormat", "{0} (Min Value: {1} - Max Value: {2})"),
FText::FromString(ParameterName), FText::AsNumber(Parameter.minimum, &Options), FText::AsNumber(Parameter.maximum, &Options));
ParametersBox->AddSlot().Padding(4.0f,
2.0f)[SNew(SHorizontalBox).ToolTipText(ToolTipText) +
SHorizontalBox::Slot().FillWidth(0.3f)[SNew(STextBlock).Text(FText::FromString(ParameterName))] +
SHorizontalBox::Slot().MaxWidth(200.0f)[SNew(SNumericEntryBox<float>)
.Value(this, &SFMODEventEditorPanel::GetParameterValue, Parameter.id)
.OnValueChanged(this, &SFMODEventEditorPanel::OnParameterValueChanged, Parameter.id)
.AllowSpin(true)
.MinValue(Parameter.minimum)
.MaxValue(Parameter.maximum)
.MinSliderValue(Parameter.minimum)
.MaxSliderValue(Parameter.maximum)
.Delta(0.01f)]];
}
}
return MakeBox(ParametersBox, LOCTEXT("EventParameters", "Event Parameters"));
}
TSharedRef<SExpandableArea> SFMODEventEditorPanel::ConstructUserProperties(FMOD::Studio::EventDescription *EventDescription)
{
TSharedRef<SVerticalBox> UserPropertiesBox = SNew(SVerticalBox);
if (EventDescription != nullptr)
{
int32 UserPropertyCount;
EventDescription->getUserPropertyCount(&UserPropertyCount);
for (int32 PropertyIdx = 0; PropertyIdx < UserPropertyCount; PropertyIdx++)
{
FMOD_STUDIO_USER_PROPERTY UserProperty;
EventDescription->getUserPropertyByIndex(PropertyIdx, &UserProperty);
FText PropertyText;
switch (UserProperty.type)
{
case FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER:
PropertyText = FText::AsNumber(UserProperty.intvalue);
break;
case FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN:
PropertyText = UserProperty.boolvalue ? LOCTEXT("True", "True") : LOCTEXT("False", "False");
break;
case FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT:
PropertyText = FText::AsNumber(UserProperty.floatvalue);
break;
case FMOD_STUDIO_USER_PROPERTY_TYPE_STRING:
PropertyText = FText::FromString(UTF8_TO_TCHAR(UserProperty.stringvalue));
break;
}
FString UserName(UTF8_TO_TCHAR(UserProperty.name));
AddTextField(UserPropertiesBox, *UserName, PropertyText);
}
}
return MakeBox(UserPropertiesBox, LOCTEXT("EventUserProperties", "Event User Properties"));
}
FReply SFMODEventEditorPanel::OnClickedPlay()
{
FMODEventEditorPtr.Pin()->PlayEvent();
return FReply::Handled();
}
FReply SFMODEventEditorPanel::OnClickedStop()
{
FMODEventEditorPtr.Pin()->StopEvent();
return FReply::Handled();
}
FReply SFMODEventEditorPanel::OnClickedPause()
{
FMODEventEditorPtr.Pin()->PauseEvent();
return FReply::Handled();
}
void SFMODEventEditorPanel::OnParameterValueChanged(float NewValue, FMOD_STUDIO_PARAMETER_ID ParameterId)
{
FMODEventEditorPtr.Pin()->SetParameterValue(ParameterId, NewValue);
}
TOptional<float> SFMODEventEditorPanel::GetParameterValue(FMOD_STUDIO_PARAMETER_ID ParameterId) const
{
return FMODEventEditorPtr.Pin()->GetParameterValue(ParameterId);
}
#undef LOC_NAMESPACE

View File

@ -0,0 +1,42 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "FMODEventEditor.h"
namespace FMOD
{
namespace Studio
{
class EventDescription;
}
}
class SFMODEventEditorPanel : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SFMODEventEditorPanel) {}
SLATE_ARGUMENT(TWeakPtr<FFMODEventEditor>, FMODEventEditor)
SLATE_END_ARGS()
~SFMODEventEditorPanel();
/** SCompoundWidget interface */
void Construct(const FArguments &InArgs);
private:
TSharedRef<SBorder> ConstructToolbar(FMOD::Studio::EventDescription *EventDescription);
TSharedRef<SExpandableArea> ConstructInfo(FMOD::Studio::EventDescription *EventDescription);
TSharedRef<SExpandableArea> ConstructParameters(FMOD::Studio::EventDescription *EventDescription);
TSharedRef<SExpandableArea> ConstructUserProperties(FMOD::Studio::EventDescription *EventDescription);
/** Editor that owns this panel */
TWeakPtr<FFMODEventEditor> FMODEventEditorPtr;
FReply OnClickedPlay();
FReply OnClickedStop();
FReply OnClickedPause();
TOptional<float> GetParameterValue(FMOD_STUDIO_PARAMETER_ID ParameterId) const;
void OnParameterValueChanged(float NewValue, FMOD_STUDIO_PARAMETER_ID ParameterId);
};

View File

@ -0,0 +1,185 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "Sequencer/FMODChannelEditors.h"
#include "ISequencerChannelInterface.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SCompoundWidget.h"
#include "MovieSceneTimeHelpers.h"
#include "MovieSceneToolHelpers.h"
#include "ScopedTransaction.h"
#include "EditorWidgets/Public/SEnumCombo.h"
#include "EditorStyleSet.h"
#include "Channels/MovieSceneChannelTraits.h"
class SFMODEventControlKeyEditor : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SFMODEventControlKeyEditor) {}
SLATE_END_ARGS();
void Construct(const FArguments &InArgs, TMovieSceneChannelHandle<FFMODEventControlChannel> InChannelHandle,
TWeakObjectPtr<UMovieSceneSection> InWeakSection, TWeakPtr<ISequencer> InWeakSequencer, UEnum *InEnum)
{
ChannelHandle = InChannelHandle;
WeakSection = InWeakSection;
WeakSequencer = InWeakSequencer;
ChildSlot[MovieSceneToolHelpers::MakeEnumComboBox(InEnum,
TAttribute<int32>::Create(TAttribute<int32>::FGetter::CreateSP(this, &SFMODEventControlKeyEditor::OnGetCurrentValueAsInt)),
SEnumComboBox::FOnEnumSelectionChanged::CreateSP(this, &SFMODEventControlKeyEditor::OnChangeKey))];
}
private:
int32 OnGetCurrentValueAsInt() const
{
using namespace UE::MovieScene;
FFMODEventControlChannel *Channel = ChannelHandle.Get();
ISequencer *Sequencer = WeakSequencer.Pin().Get();
UMovieSceneSection *OwningSection = WeakSection.Get();
uint8 Result = 0;
if (Channel && Sequencer && OwningSection)
{
const FFrameTime CurrentTime = UE::MovieScene::ClampToDiscreteRange(Sequencer->GetLocalTime().Time, OwningSection->GetRange());
EvaluateChannel(Channel, CurrentTime, Result);
}
return Result;
}
void SetValue(uint8 InValue)
{
using namespace UE::MovieScene;
UMovieSceneSection *OwningSection = WeakSection.Get();
if (!OwningSection)
{
return;
}
OwningSection->SetFlags(RF_Transactional);
FFMODEventControlChannel *Channel = ChannelHandle.Get();
ISequencer *Sequencer = WeakSequencer.Pin().Get();
if (!OwningSection->TryModify() || !Channel || !Sequencer)
{
return;
}
const FFrameNumber CurrentTime = Sequencer->GetLocalTime().Time.FloorToFrame();
const bool bAutoSetTrackDefaults = Sequencer->GetAutoSetTrackDefaults();
EMovieSceneKeyInterpolation Interpolation = Sequencer->GetKeyInterpolation();
TArray<FKeyHandle> KeysAtCurrentTime;
Channel->GetKeys(TRange<FFrameNumber>(CurrentTime), nullptr, &KeysAtCurrentTime);
if (KeysAtCurrentTime.Num() > 0)
{
AssignValue(Channel, KeysAtCurrentTime[0], InValue);
}
else
{
const bool bHasAnyKeys = Channel->GetNumKeys() != 0;
if (bHasAnyKeys || bAutoSetTrackDefaults == false)
{
// When auto setting track defaults are disabled, add a key even when it's empty so that the changed
// value is saved and is propagated to the property.
AddKeyToChannel(Channel, CurrentTime, InValue, Interpolation);
}
if (bHasAnyKeys)
{
TRange<FFrameNumber> KeyRange = TRange<FFrameNumber>(CurrentTime);
TRange<FFrameNumber> SectionRange = OwningSection->GetRange();
if (!SectionRange.Contains(KeyRange))
{
OwningSection->SetRange(TRange<FFrameNumber>::Hull(KeyRange, SectionRange));
}
}
}
// Always update the default value when auto-set default values is enabled so that the last changes
// are always saved to the track.
if (bAutoSetTrackDefaults)
{
SetChannelDefault(Channel, InValue);
}
}
void OnChangeKey(int32 Selection, ESelectInfo::Type SelectionType)
{
FScopedTransaction Transaction(FText::FromString("Set FMOD Event Control Key Value"));
SetValue(Selection);
if (ISequencer *Sequencer = WeakSequencer.Pin().Get())
{
Sequencer->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::TrackValueChangedRefreshImmediately);
}
}
TMovieSceneChannelHandle<FFMODEventControlChannel> ChannelHandle;
TWeakObjectPtr<UMovieSceneSection> WeakSection;
TWeakPtr<ISequencer> WeakSequencer;
};
bool CanCreateKeyEditor(const FFMODEventControlChannel *Channel)
{
return true;
}
TSharedRef<SWidget> CreateKeyEditor(const TMovieSceneChannelHandle<FFMODEventControlChannel> &Channel, UMovieSceneSection *Section,
const FGuid &InObjectBindingID, TWeakPtr<FTrackInstancePropertyBindings> PropertyBindings, TWeakPtr<ISequencer> InSequencer)
{
const FFMODEventControlChannel *RawChannel = Channel.Get();
if (!RawChannel)
{
return SNullWidget::NullWidget;
}
UEnum *Enum = RawChannel->GetEnum();
return SNew(SFMODEventControlKeyEditor, Channel, Section, InSequencer, Enum);
}
void DrawKeys(FFMODEventControlChannel *Channel, TArrayView<const FKeyHandle> InKeyHandles, const UMovieSceneSection* InOwner, TArrayView<FKeyDrawParams> OutKeyDrawParams)
{
static const FName KeyLeftBrushName("Sequencer.KeyLeft");
static const FName KeyRightBrushName("Sequencer.KeyRight");
static const FName KeyDiamondBrushName("Sequencer.KeyDiamond");
const FSlateBrush *LeftKeyBrush = FAppStyle::GetBrush(KeyLeftBrushName);
const FSlateBrush *RightKeyBrush = FAppStyle::GetBrush(KeyRightBrushName);
const FSlateBrush *DiamondBrush = FAppStyle::GetBrush(KeyDiamondBrushName);
TMovieSceneChannelData<uint8> ChannelData = Channel->GetData();
for (int32 Index = 0; Index < InKeyHandles.Num(); ++Index)
{
FKeyHandle Handle = InKeyHandles[Index];
FKeyDrawParams Params;
Params.BorderBrush = Params.FillBrush = DiamondBrush;
const int32 KeyIndex = ChannelData.GetIndex(Handle);
if (KeyIndex != INDEX_NONE)
{
const EFMODEventControlKey Value = (EFMODEventControlKey)ChannelData.GetValues()[KeyIndex];
if (Value == EFMODEventControlKey::Play)
{
Params.BorderBrush = Params.FillBrush = LeftKeyBrush;
Params.FillOffset = FVector2D(-1.0f, 1.0f);
}
else if (Value == EFMODEventControlKey::Stop)
{
Params.BorderBrush = Params.FillBrush = RightKeyBrush;
Params.FillOffset = FVector2D(1.0f, 1.0f);
}
}
OutKeyDrawParams[Index] = Params;
}
}

View File

@ -0,0 +1,14 @@
#pragma once
#include "MVVM/Views/KeyDrawParams.h"
#include "Channels/MovieSceneChannelHandle.h"
#include "Sequencer/FMODEventControlSection.h"
/** Key editor overrides */
bool CanCreateKeyEditor(const FFMODEventControlChannel* Channel);
TSharedRef<SWidget> CreateKeyEditor(const TMovieSceneChannelHandle<FFMODEventControlChannel>& Channel, UMovieSceneSection* Section,
const FGuid& InObjectBindingID, TWeakPtr<FTrackInstancePropertyBindings> PropertyBindings, TWeakPtr<ISequencer> InSequencer);
/** Key drawing overrides */
void DrawKeys(FFMODEventControlChannel *Channel, TArrayView<const FKeyHandle> InKeyHandles, const UMovieSceneSection* InOwner, TArrayView<FKeyDrawParams> OutKeyDrawParams);

View File

@ -0,0 +1,194 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEventControlTrackEditor.h"
#include "Rendering/DrawElements.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "Curves/IntegralCurve.h"
#include "SequencerSectionPainter.h"
#include "EditorStyleSet.h"
#include "Editor/UnrealEdEngine.h"
#include "Sequencer/FMODEventControlSection.h"
#include "Sequencer/FMODEventControlTrack.h"
#include "ISectionLayoutBuilder.h"
#include "FMODAmbientSound.h"
#include "CommonMovieSceneTools.h"
#include "Channels/MovieSceneChannelProxy.h"
#include "Channels/MovieSceneChannelEditorData.h"
#define LOCTEXT_NAMESPACE "FFMODEventControlTrackEditor"
FFMODEventControlSection::FFMODEventControlSection(UMovieSceneSection &InSection, TSharedRef<ISequencer> InOwningSequencer)
: Section(InSection)
, OwningSequencerPtr(InOwningSequencer)
{
}
UMovieSceneSection *FFMODEventControlSection::GetSectionObject()
{
return &Section;
}
float FFMODEventControlSection::GetSectionHeight() const
{
static const float SectionHeight = 20.f;
return SectionHeight;
}
int32 FFMODEventControlSection::OnPaintSection(FSequencerSectionPainter &InPainter) const
{
TSharedPtr<ISequencer> OwningSequencer = OwningSequencerPtr.Pin();
if (!OwningSequencer.IsValid())
{
return InPainter.LayerId + 1;
}
const ESlateDrawEffect DrawEffects = InPainter.bParentEnabled ? ESlateDrawEffect::None : ESlateDrawEffect::DisabledEffect;
const FTimeToPixel &TimeToPixelConverter = InPainter.GetTimeConverter();
FLinearColor TrackColor;
// TODO: Set / clip stop time based on event length
UFMODEventControlSection *ControlSection = Cast<UFMODEventControlSection>(&Section);
if (IsValid(ControlSection))
{
UFMODEventControlTrack *ParentTrack = Cast<UFMODEventControlTrack>(ControlSection->GetOuter());
if (IsValid(ParentTrack))
{
TrackColor = ParentTrack->GetColorTint();
}
}
// TODO: This should only draw the visible ranges.
TArray<TRange<float>> DrawRanges;
TOptional<float> CurrentRangeStart;
if (ControlSection != nullptr)
{
TMovieSceneChannelData<const uint8> ChannelData = ControlSection->ControlKeys.GetData();
TArrayView<const FFrameNumber> Times = ChannelData.GetTimes();
TArrayView<const uint8> Values = ChannelData.GetValues();
for (int32 Index = 0; Index < Times.Num(); ++Index)
{
const double Time = Times[Index] / TimeToPixelConverter.GetTickResolution();
const EFMODEventControlKey Value = (EFMODEventControlKey)Values[Index];
if (Value == EFMODEventControlKey::Play)
{
if (CurrentRangeStart.IsSet() == false)
{
CurrentRangeStart = Time;
}
}
if (Value == EFMODEventControlKey::Stop)
{
if (CurrentRangeStart.IsSet())
{
DrawRanges.Add(TRange<float>(CurrentRangeStart.GetValue(), Time));
CurrentRangeStart.Reset();
}
}
}
}
if (CurrentRangeStart.IsSet())
{
DrawRanges.Add(TRange<float>(CurrentRangeStart.GetValue(), OwningSequencer->GetViewRange().GetUpperBoundValue()));
}
for (const TRange<float> &DrawRange : DrawRanges)
{
float XOffset = TimeToPixelConverter.SecondsToPixel(DrawRange.GetLowerBoundValue());
float XSize = TimeToPixelConverter.SecondsToPixel(DrawRange.GetUpperBoundValue()) - XOffset;
FSlateDrawElement::MakeBox(InPainter.DrawElements, InPainter.LayerId,
InPainter.SectionGeometry.ToPaintGeometry(
FVector2D(XOffset, (InPainter.SectionGeometry.GetLocalSize().Y - SequencerSectionConstants::KeySize.Y) / 2),
FVector2D(XSize, SequencerSectionConstants::KeySize.Y)),
FAppStyle::GetBrush("Sequencer.Section.Background"), DrawEffects);
FSlateDrawElement::MakeBox(InPainter.DrawElements, InPainter.LayerId,
InPainter.SectionGeometry.ToPaintGeometry(
FVector2D(XOffset, (InPainter.SectionGeometry.GetLocalSize().Y - SequencerSectionConstants::KeySize.Y) / 2),
FVector2D(XSize, SequencerSectionConstants::KeySize.Y)),
FAppStyle::GetBrush("Sequencer.Section.BackgroundTint"), DrawEffects, TrackColor);
}
return InPainter.LayerId + 1;
}
FFMODEventControlTrackEditor::FFMODEventControlTrackEditor(TSharedRef<ISequencer> InSequencer)
: FMovieSceneTrackEditor(InSequencer)
{
}
TSharedRef<ISequencerTrackEditor> FFMODEventControlTrackEditor::CreateTrackEditor(TSharedRef<ISequencer> InSequencer)
{
return MakeShareable(new FFMODEventControlTrackEditor(InSequencer));
}
bool FFMODEventControlTrackEditor::SupportsType(TSubclassOf<UMovieSceneTrack> Type) const
{
return Type == UFMODEventControlTrack::StaticClass();
}
TSharedRef<ISequencerSection> FFMODEventControlTrackEditor::MakeSectionInterface(
UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding)
{
check(SupportsType(SectionObject.GetOuter()->GetClass()));
const TSharedPtr<ISequencer> OwningSequencer = GetSequencer();
return MakeShareable(new FFMODEventControlSection(SectionObject, OwningSequencer.ToSharedRef()));
}
void FFMODEventControlTrackEditor::BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const TArray<FGuid> &ObjectBindings, const UClass *ObjectClass)
{
if (ObjectClass->IsChildOf(AFMODAmbientSound::StaticClass()) || ObjectClass->IsChildOf(UFMODAudioComponent::StaticClass()))
{
const TSharedPtr<ISequencer> ParentSequencer = GetSequencer();
MenuBuilder.AddMenuEntry(LOCTEXT("AddFMODEventControlTrack", "FMOD Event Control Track"),
LOCTEXT("FMODEventControlTooltip", "Adds a track for controlling FMOD event."), FSlateIcon(),
FUIAction(FExecuteAction::CreateSP(this, &FFMODEventControlTrackEditor::AddControlKey, ObjectBindings)));
}
}
void FFMODEventControlTrackEditor::AddControlKey(TArray<FGuid> ObjectGuids)
{
TSharedPtr<ISequencer> SequencerPtr = GetSequencer();
for (FGuid ObjectGuid : ObjectGuids)
{
UObject *Object = SequencerPtr.IsValid() ? SequencerPtr->FindSpawnedObjectOrTemplate(ObjectGuid) : nullptr;
if (Object)
{
AnimatablePropertyChanged(FOnKeyProperty::CreateRaw(this, &FFMODEventControlTrackEditor::AddKeyInternal, Object));
}
}
}
FKeyPropertyResult FFMODEventControlTrackEditor::AddKeyInternal(FFrameNumber KeyTime, UObject *Object)
{
FKeyPropertyResult KeyPropertyResult;
FFindOrCreateHandleResult HandleResult = FindOrCreateHandleToObject(Object);
FGuid ObjectHandle = HandleResult.Handle;
KeyPropertyResult.bHandleCreated |= HandleResult.bWasCreated;
if (ObjectHandle.IsValid())
{
FFindOrCreateTrackResult TrackResult = FindOrCreateTrackForObject(ObjectHandle, UFMODEventControlTrack::StaticClass());
UMovieSceneTrack *Track = TrackResult.Track;
KeyPropertyResult.bTrackCreated |= TrackResult.bWasCreated;
if (KeyPropertyResult.bTrackCreated && ensure(Track))
{
UFMODEventControlTrack *EventTrack = Cast<UFMODEventControlTrack>(Track);
EventTrack->AddNewSection(KeyTime);
EventTrack->SetDisplayName(LOCTEXT("TrackName", "FMOD Event"));
KeyPropertyResult.bTrackModified = true;
}
}
return KeyPropertyResult;
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,59 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "CoreMinimal.h"
#include "Misc/Guid.h"
#include "Templates/SubclassOf.h"
#include "Curves/KeyHandle.h"
#include "ISequencer.h"
#include "MovieSceneTrack.h"
#include "ISequencerSection.h"
#include "ISequencerTrackEditor.h"
#include "MovieSceneTrackEditor.h"
class FMenuBuilder;
class FSequencerSectionPainter;
/** FMOD Event control track */
class FFMODEventControlTrackEditor : public FMovieSceneTrackEditor
{
public:
FFMODEventControlTrackEditor(TSharedRef<ISequencer> InSequencer);
static TSharedRef<ISequencerTrackEditor> CreateTrackEditor(TSharedRef<ISequencer> OwningSequencer);
void AddControlKey(TArray<FGuid> ObjectGuids);
// Begin ISequencerTrackEditor interface
virtual void BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const TArray<FGuid> &ObjectBindings, const UClass *ObjectClass) override;
virtual TSharedRef<ISequencerSection> MakeSectionInterface(
UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding) override;
virtual bool SupportsType(TSubclassOf<UMovieSceneTrack> Type) const override;
// End ISequencerTrackEditor interface
private:
/** Delegate for AnimatablePropertyChanged in AddKey. */
virtual FKeyPropertyResult AddKeyInternal(FFrameNumber KeyTime, UObject *Object);
};
/** Class for event control sections. */
class FFMODEventControlSection : public ISequencerSection, public TSharedFromThis<FFMODEventControlSection>
{
public:
FFMODEventControlSection(UMovieSceneSection &InSection, TSharedRef<ISequencer> InOwningSequencer);
// Begin ISequencerSection interface
virtual UMovieSceneSection *GetSectionObject() override;
virtual float GetSectionHeight() const override;
virtual int32 OnPaintSection(FSequencerSectionPainter &InPainter) const override;
virtual bool SectionIsResizable() const override { return false; }
// End ISequencerSection interface
private:
/** The section we are visualizing. */
UMovieSceneSection &Section;
/** The sequencer that owns this section */
TWeakPtr<ISequencer> OwningSequencerPtr;
};

View File

@ -0,0 +1,156 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODEventParameterTrackEditor.h"
#include "FMODAmbientSound.h"
#include "FMODEvent.h"
#include "FMODStudioModule.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "Sequencer/FMODEventParameterTrack.h"
#include "Sections/MovieSceneParameterSection.h"
#include "Sequencer/FMODParameterSection.h"
#include "SequencerUtilities.h"
#include "fmod_studio.hpp"
#define LOCTEXT_NAMESPACE "FMODEeventParameterTrackEditor"
FName FFMODEventParameterTrackEditor::TrackName("FMODEventParameter");
FFMODEventParameterTrackEditor::FFMODEventParameterTrackEditor(TSharedRef<ISequencer> InSequencer)
: FMovieSceneTrackEditor(InSequencer)
{
}
TSharedRef<ISequencerTrackEditor> FFMODEventParameterTrackEditor::CreateTrackEditor(TSharedRef<ISequencer> OwningSequencer)
{
return MakeShareable(new FFMODEventParameterTrackEditor(OwningSequencer));
}
TSharedRef<ISequencerSection> FFMODEventParameterTrackEditor::MakeSectionInterface(
UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding)
{
UMovieSceneParameterSection *ParameterSection = Cast<UMovieSceneParameterSection>(&SectionObject);
checkf(ParameterSection != nullptr, TEXT("Unsupported section type."));
return MakeShareable(new FFMODParameterSection(*ParameterSection));
}
TSharedPtr<SWidget> FFMODEventParameterTrackEditor::BuildOutlinerEditWidget(
const FGuid &ObjectBinding, UMovieSceneTrack *Track, const FBuildEditWidgetParams &Params)
{
UFMODEventParameterTrack *EventParameterTrack = Cast<UFMODEventParameterTrack>(Track);
// Create a container edit box
return FSequencerUtilities::MakeAddButton(LOCTEXT("ParameterText", "Parameter"),
FOnGetContent::CreateSP(this, &FFMODEventParameterTrackEditor::OnGetAddParameterMenuContent, ObjectBinding, EventParameterTrack),
Params.NodeIsHovered,
GetSequencer());
}
void FFMODEventParameterTrackEditor::BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const TArray<FGuid> &ObjectBindings, const UClass *ObjectClass)
{
if (ObjectClass->IsChildOf(AFMODAmbientSound::StaticClass()) || ObjectClass->IsChildOf(UFMODAudioComponent::StaticClass()))
{
const TSharedPtr<ISequencer> ParentSequencer = GetSequencer();
MenuBuilder.AddMenuEntry(LOCTEXT("AddFMODParameterTrack", "FMOD Event Parameter Track"),
LOCTEXT("AddFMODParameterTrackTooltip", "Adds a track for controlling FMOD event parameter values."), FSlateIcon(),
FUIAction(FExecuteAction::CreateSP(this, &FFMODEventParameterTrackEditor::AddEventParameterTrack, ObjectBindings[0]),
FCanExecuteAction::CreateSP(this, &FFMODEventParameterTrackEditor::CanAddEventParameterTrack, ObjectBindings[0])));
}
}
bool FFMODEventParameterTrackEditor::SupportsType(TSubclassOf<UMovieSceneTrack> Type) const
{
return Type == UFMODEventParameterTrack::StaticClass();
}
TSharedRef<SWidget> FFMODEventParameterTrackEditor::OnGetAddParameterMenuContent(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack)
{
TSharedPtr<ISequencer> SequencerPtr = GetSequencer();
AFMODAmbientSound *Sound = SequencerPtr.IsValid() ? Cast<AFMODAmbientSound>(SequencerPtr->FindSpawnedObjectOrTemplate(ObjectBinding)) : nullptr;
UFMODAudioComponent *AudioComponent;
if (IsValid(Sound))
{
AudioComponent = Sound->AudioComponent;
}
else
{
AudioComponent = SequencerPtr.IsValid() ? Cast<UFMODAudioComponent>(SequencerPtr->FindSpawnedObjectOrTemplate(ObjectBinding)) : nullptr;
}
return BuildParameterMenu(ObjectBinding, EventParameterTrack, AudioComponent);
}
TSharedRef<SWidget> FFMODEventParameterTrackEditor::BuildParameterMenu(
FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, UFMODAudioComponent *AudioComponent)
{
FMenuBuilder AddParameterMenuBuilder(true, nullptr);
if (IsValid(AudioComponent) && AudioComponent->Event)
{
TArray<FParameterNameAndAction> ParameterNamesAndActions;
TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> ParameterDescriptions;
AudioComponent->Event->GetParameterDescriptions(ParameterDescriptions);
for (FMOD_STUDIO_PARAMETER_DESCRIPTION &ParameterDescription : ParameterDescriptions)
{
FName ParameterName(ParameterDescription.name);
FExecuteAction InitAction =
FExecuteAction::CreateSP(this, &FFMODEventParameterTrackEditor::AddParameter, ObjectBinding, EventParameterTrack, ParameterName);
FUIAction AddParameterMenuAction(InitAction);
FParameterNameAndAction NameAndAction(ParameterName, AddParameterMenuAction);
ParameterNamesAndActions.Add(NameAndAction);
}
// Sort and generate menu.
ParameterNamesAndActions.Sort();
for (FParameterNameAndAction NameAndAction : ParameterNamesAndActions)
{
AddParameterMenuBuilder.AddMenuEntry(FText::FromName(NameAndAction.ParameterName), FText(), FSlateIcon(), NameAndAction.Action);
}
}
return AddParameterMenuBuilder.MakeWidget();
}
bool FFMODEventParameterTrackEditor::CanAddEventParameterTrack(FGuid ObjectBinding)
{
return GetSequencer()->GetFocusedMovieSceneSequence()->GetMovieScene()->FindTrack(
UFMODEventParameterTrack::StaticClass(), ObjectBinding, TrackName) == nullptr;
}
void FFMODEventParameterTrackEditor::AddEventParameterTrack(FGuid ObjectBinding)
{
FindOrCreateTrackForObject(ObjectBinding, UFMODEventParameterTrack::StaticClass(), TrackName, true);
GetSequencer()->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::MovieSceneStructureItemAdded);
}
void FFMODEventParameterTrackEditor::AddParameter(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, FName ParameterName)
{
UMovieSceneSequence *MovieSceneSequence = GetMovieSceneSequence();
FFrameNumber KeyTime = GetTimeForKey();
for (TWeakObjectPtr<> Object : GetSequencer()->FindObjectsInCurrentSequence(ObjectBinding))
{
AFMODAmbientSound *Sound = Cast<AFMODAmbientSound>(Object.Get());
UFMODAudioComponent *AudioComponent = nullptr;
if (IsValid(Sound))
{
AudioComponent = Sound->AudioComponent;
}
else
{
AudioComponent = Cast<UFMODAudioComponent>(Object.Get());
}
if (IsValid(AudioComponent))
{
float Value = AudioComponent->GetParameter(ParameterName);
const FScopedTransaction Transaction(LOCTEXT("AddEventParameter", "Add event parameter"));
EventParameterTrack->Modify();
EventParameterTrack->AddParameterKey(ParameterName, KeyTime, Value);
}
}
GetSequencer()->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::MovieSceneStructureItemAdded);
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,77 @@
// Taken from ParticleParameterTrackEditor
#pragma once
#include "CoreMinimal.h"
#include "Misc/Guid.h"
#include "Templates/SubclassOf.h"
#include "Widgets/SWidget.h"
#include "ISequencer.h"
#include "MovieSceneTrack.h"
#include "ISequencerSection.h"
#include "Framework/Commands/UIAction.h"
#include "ISequencerTrackEditor.h"
#include "MovieSceneTrackEditor.h"
class FMenuBuilder;
class UFMODEventParameterTrack;
class UFMODAudioComponent;
struct FMOD_STUDIO_PARAMETER_DESCRIPTION;
/**
* Track editor for material parameters.
*/
class FFMODEventParameterTrackEditor : public FMovieSceneTrackEditor
{
public:
/** Constructor. */
FFMODEventParameterTrackEditor(TSharedRef<ISequencer> InSequencer);
/** Virtual destructor. */
virtual ~FFMODEventParameterTrackEditor() {}
/**
* Creates an instance of this class. Called by a sequencer.
*
* @param OwningSequencer The sequencer instance to be used by this tool.
* @return The new instance of this class.
*/
static TSharedRef<ISequencerTrackEditor> CreateTrackEditor(TSharedRef<ISequencer> OwningSequencer);
// ISequencerTrackEditor interface
virtual TSharedPtr<SWidget> BuildOutlinerEditWidget(
const FGuid &ObjectBinding, UMovieSceneTrack *Track, const FBuildEditWidgetParams &Params) override;
virtual TSharedRef<ISequencerSection> MakeSectionInterface(
UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding) override;
virtual bool SupportsType(TSubclassOf<UMovieSceneTrack> Type) const override;
private:
static FName TrackName;
// Struct used for building the parameter menu.
struct FParameterNameAndAction
{
FName ParameterName;
FUIAction Action;
FParameterNameAndAction(FName InParameterName, FUIAction InAction)
{
ParameterName = InParameterName;
Action = InAction;
}
bool operator<(FParameterNameAndAction const &Other) const { return ParameterName.FastLess(Other.ParameterName); }
};
void BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const TArray<FGuid> &ObjectBindings, const UClass *ObjectClass);
/** Provides the contents of the add parameter menu. */
TSharedRef<SWidget> OnGetAddParameterMenuContent(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack);
TSharedRef<SWidget> BuildParameterMenu(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, UFMODAudioComponent *AudioComponent);
bool CanAddEventParameterTrack(FGuid ObjectBinding);
void AddEventParameterTrack(FGuid ObjectBinding);
/** Adds an event parameter and initial key to a track. */
void AddParameter(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, FName ParameterName);
};

View File

@ -0,0 +1,25 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#include "FMODParameterSection.h"
#include "ISectionLayoutBuilder.h"
#include "ScopedTransaction.h"
#include "Sections/MovieSceneParameterSection.h"
#define LOCTEXT_NAMESPACE "FMODParameterSection"
bool FFMODParameterSection::RequestDeleteKeyArea(const TArray<FName> &KeyAreaNamePath)
{
if (KeyAreaNamePath.Num() == 1)
{
const FScopedTransaction Transaction(LOCTEXT("DeleteEventParameter", "Delete event parameter"));
UMovieSceneParameterSection *ParameterSection = Cast<UMovieSceneParameterSection>(WeakSection.Get());
if (ParameterSection->TryModify())
{
return ParameterSection->RemoveScalarParameter(KeyAreaNamePath[0]);
}
}
return true;
}
#undef LOCTEXT_NAMESPACE

View File

@ -0,0 +1,21 @@
// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2023.
#pragma once
#include "ISequencerSection.h"
class UMovieSceneSection;
/** A movie scene section for Event parameters. */
class FFMODParameterSection : public FSequencerSection
{
public:
FFMODParameterSection(UMovieSceneSection &InSectionObject)
: FSequencerSection(InSectionObject)
{
}
// Begin ISequencerSection interface
virtual bool RequestDeleteKeyArea(const TArray<FName> &KeyAreaNamePath) override;
// End ISequencerSection interface
};

Some files were not shown because too many files have changed in this diff Show More