diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/audiolink.html b/hwanyoung2/Plugins/FMODStudio/Docs/audiolink.html new file mode 100644 index 00000000..0777baac --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/audiolink.html @@ -0,0 +1,136 @@ + + +AudioLink + + + + +
+
+

Unreal Integration 2.02

+ +
+
+

10. AudioLink

+

AudioLink is an API that connects Unreal Audio Engine to external software, allowing Audio to be passed from Unreal to FMOD. By using hardware abstraction, AudioLink bypasses the need for direct hardware access and provides the strengths of both Unreal Audio Engine and FMOD.

+

This section will assume a basic understanding of the Unreal AudioLink system and will focus on the FMOD specific information.

+

10.0.1 Linking with your Studio Project

+

The FMOD for Unreal AudioLink module assumes the Event linked contains a Programmer Instrument, this is what it uses to pass the sound data from Unreal to FMOD.

+

Programmer sound event
+Generally you will want an Event that has a looping async programmer sound, because we may not know the length of the sounds being played from Unreal (ie. submixes are generally alive from startup to shutdown).

+ +

In the FMOD for Unreal Settings, you can choose to enable/disable AudioLink support. This will load/unload the appropriate modules when the editor is reloaded.

+

FMOD Settings AudioLink

+

10.0.3 Settings

+

The default FMOD AudioLink Settings can be found in the project settings, under 'Plugins > FMOD AudioLink'. This is used in cases where the property has not been set, so it is unnecessary to pass it every time you create an AudioLink.
+You can create multiple FMOD AudioLink Settings assets for different FMOD Events, allowing you to easily route different sounds to different events allowing for greater customization.
+These settings are used to set up the FMOD Event:

+ +

FMOD Settings AudioLink

+ +

FMOD supports AudioLink through three link types:

+ +

Source

+

MetaSounds, Sound Cues, and Sound Waves are classed as 'Sources', to play them through AudioLink you can use the Attenuation Settings or the Submix.

+

Submix

+

You can set the Send to Audio Link flag and the Audio Link Settings property in the submix's Details panel, under 'Audio Link'.

+

Submix AudioLink

+ +

AudioLink Component support is included through the FMOD AudioLink Component, but is often unnecessary as sources are componentless by design, highly optimized for scale, and provide engine-level support.

+

FMOD AudioLink Component

+

The AudioLink Component is then controlled through the API:

+ +

Play Link

+
+

In UE5.2 and UE5.3, two events will spawn when using the FMODAudioLinkComponent: one for the component (intended) and one for the sound source (not intended). This appears to be an engine bug.

+

Workaround:
+Create a new FMODAudioLinkSettings asset and leave the Link Event empty, then assign this to the sound source (through the Attenuation Settings).

+
+

Attenuation Settings

+

In the source/component Details panel you will find the option to individually override or assign Attenuation settings:

+ + + + + + + + + + + + + + + + +
Meta SoundSound CueAudio Component
Meta SoundSound CueAudio Component
+

To send specific sounds to FMOD, use the settings under Attenuation (AudioLink):

+ +

Sound Attenuation

+

10.0.5 Troubleshooting

+
+ + + + + +
diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-enums.html b/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-enums.html new file mode 100644 index 00000000..12203b2b --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-enums.html @@ -0,0 +1,100 @@ + + +Blueprint Reference | Enums + + + + +
+
+

Unreal Integration 2.02

+ +
+
+

7. Blueprint Reference | Enums

+

Automatically generated methods for working with FMOD and Unreal Enums.

+

Methods:

+ +

Byte to Enum EFMOD_STUDIO_STOP_MODE

+

Converts a byte to an EFMOD_STUDIO_STOP_MODE.

+

Byte to Enum

+

+

+
C++
+
+

+
EFMOD_STUDIO_STOP_MODE ByteToEnum(
+    byte Byte
+);
+
+ +
+
Byte
+
Byte to convert to an EFMOD_STUDIO_STOP_MODE.
+
+

See Also: EFMOD_STUDIO_STOP_MODE.

+

ForEach EFMOD_STUDIO_STOP_MODE

+

Returns every value in the EFMOD_STUDIO_STOP_MODE enum.

+

ForEach EFMOD_STUDIO_STOP_MODE

+

+

+
C++
+
+

+
EFMOD_STUDIO_STOP_MODE ForEachEFMOD_STUDIO_STOP_MODE();
+
+ +

See Also: EFMOD_STUDIO_STOP_MODE.

+

Get Number of Entries in EFMOD_STUDIO_STOP_MODE

+

Returns the total number of entries in the EFMOD_STUDIO_STOP_MODE enum.

+

Get Number of Entries in EFMOD_STUDIO_STOP_MODE

+

+

+
C++
+
+

+
int GetNumberOfEntriesInEFMOD_STUDIO_STOP_MODE();
+
+ +

See Also: EFMOD_STUDIO_STOP_MODE.

+

Literal Enum EFMOD_STUDIO_STOP_MODE

+

Returns the value of an EFMOD_STUDIO_STOP_MODE member.

+

Literal Enum EFMOD_STUDIO_STOP_MODE

+

+

+
C++
+
+

+
EFMOD_STUDIO_STOP_MODE LiteralEnumEFMOD_STUDIO_STOP_MODE(
+    EFMOD_STUDIO_STOP_MODE Enum
+);
+
+ +
+
Enum
+
The EFMOD_STUDIO_STOP_MODE member value to retrieve.
+
+

See Also: EFMOD_STUDIO_STOP_MODE.

+ + + + + +
diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-structs.html b/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-structs.html new file mode 100644 index 00000000..cbe56753 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-structs.html @@ -0,0 +1,134 @@ + + +Blueprint Reference | Structs + + + + +
+
+

Unreal Integration 2.02

+ +
+
+

7. Blueprint Reference | Structs

+

Automatically generated methods for working with FMOD and Unreal Structs.

+

Methods

+ +

Break FMODAttenuationDetails

+

Adds a node that breaks an 'FMODAttenuationDetails` into its member fields.

+

FMOD Attenuation Details
+

+
C++
+
+

+
FMODAttenuationDetails BreakFMODAttenuationDetails(
+    FMODAttenuation Details
+);
+
+ +
+
FMODAttenuationDetails
+
FMODAttenuationDetails to break into its member fields.
+
+

Break FMODOcclusionDetails

+

Adds a node that breaks an 'FMODOcclusionDetails' into its member fields.

+

FMOD Occlusion Details

+

+

+
C++
+
+

+
FMODOcclusionDetails BreakFMODOcclusionDetails(
+    FMODOcclusion Details
+)
+
+ +
+
FMODOcclusionDetails
+
FMODOcclusionDetails to break into its member fields.
+
+

Make FMODAttenuationDetails

+

Adds a node that creates an 'FMODAttenuationDetails' from its members.

+

Make FMODAttenuationDetails

+

+

+
C++
+
+

+
FMODAttenuationDetails MakeFMODAttenuationDetails(
+    bool OverrideAttenuation,
+    float MinimumDistance,
+    float MaximumDistance
+);
+
+ +
+
OverrideAttenuation
+
True to use attenuation values set by editor, false to use values set in the Studio project.
+
MinimumDistance
+
Minimum 3D Distance. Value to use for the minimum attenuation distance if OverrideAttenuation is true.
+
MaximumDistance
+
Maximum 3D Distance. Value to use for the maximum attenuation distance if OverrideAttenuation is true.
+
+

See Also: FMODAttenuationDetails.

+

Make FMODEventInstance

+

Adds a node that creates an 'FMODEventInstance' from its members.

+

FMOD Event Instance

+

+

+
C++
+
+

+
FMODEventInstance MakeFMODEventInstance();
+
+ +

See Also: Event Instance.

+

Make FMODOcclusionDetails

+

Adds a node that creates an 'FMODOcclusionDetails' from its members.

+

FMODOcclusion Details

+

+

+
C++
+
+

+
FMODAttenuationDetails MakeFMODAttenuationDetails(
+    bool EnableOcclusion,
+    enum OcclusionTraceChannel,
+    bool UseComplexCollisionForOcclusion
+);
+
+ +
+
EnableOcclusion
+
True to enable occlusion settings, false to disable them.
+
OcclusionTraceChannel
+
Trace channel to use for audio occlusion checks.
+
UseComplexCollisionForOcclusion
+
True to enable complex geometry occlusion checks, false not to.
+
+

See Also: FMODOcclusionDetails.

+ + + + + +
diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-utilities.html b/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-utilities.html new file mode 100644 index 00000000..ed2b11f8 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/blueprint-reference-utilities.html @@ -0,0 +1,432 @@ + + +Blueprint Reference | Utilities + + + + +
+
+

Unreal Integration 2.02

+ +
+
+

7. Blueprint Reference | Utilities

+

Automatically generated methods for working with FMOD and Unreal Utilities.

+

Methods:

+ +

Cast To FMODAmbientSound

+

Access object as a class 'FMODAmbientSound' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODAmbientSound

+

+

+
C++
+
+

+
FMODAmbientSound CastToFMODAmbientSound(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODAmbientSound.
+
+

Cast To FMODAmbientSound class

+

Access class 'FMODAmbientSound' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODAmbientSound Class

+

+

+
C++
+
+

+
FMODAmbientSound CastToFMODAmbientSoundclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODAmbientSound.
+
+

Cast To FMODAnimNotifyPlay

+

Access object as a class 'FMODAnimNotifyPlay' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODAnimNotifyPlay

+

+

+
C++
+
+

+
FMODAnimNotifyPlay CastToFMODAnimNotifyPlay(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODAnimNotifyPlay.
+
+

Cast To FMODAnimNotifyPlay class

+

Access class 'FMODAnimNotifyPlay' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODAnimNotifyPlay Class

+

+

+
C++
+
+

+
FMODAnimNotifyPlay CastToFMODAnimNotifyPlayclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODAnimNotifyPlay.
+
+

Cast To FMODAsset

+

Access object as a class 'FMODAsset' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODAsset

+

+

+
C++
+
+

+
FMODAsset CastToFMODAsset(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODAsset.
+
+

Cast To FMODAsset class

+

Access class 'FMODAsset' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODAsset Class

+

+

+
C++
+
+

+
FMODAsset CastToFMODAssetclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODAsset.
+
+

Cast To FMODAudioComponent

+

Access object as a class 'FMODAudioComponent' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODAudioComponent

+

+

+
C++
+
+

+
FMODAudioComponent CastToFMODAudioComponent(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODAudioComponent.
+
+

Cast To FMODAudioComponent class

+

Access class 'FMODAudioComponent' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODAudioComponent Class

+

+

+
C++
+
+

+
FMODAudioComponent CastToFMODAudioComponentclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODAudioComponent.
+
+

Cast To FMODBank

+

Access object as a class 'FMODBank' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODBank

+

+

+
C++
+
+

+
FMODBank CastToFMODBank(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODBank.
+
+

Cast To FMODBank class

+

Access class 'FMODBank' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODBank Class

+

+

+
C++
+
+

+
FMODBank CastToFMODBankclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODBank.
+
+

Cast To FMODBus

+

Access object as a class 'FMODBus' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODBus

+

+

+
C++
+
+

+
FMODBus CastToFMODBus(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODBus.
+
+

Cast To FMODBus class

+

Access class 'FMODBus' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODBus Class

+

+

+
C++
+
+

+
FMODBus CastToFMODBusclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODBus.
+
+

Cast To FMODEvent

+

Access object as a class 'FMODEvent' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODEvent

+

+

+
C++
+
+

+
FMODEvent CastToFMODEvent(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODEvent.
+
+

Cast To FMODEvent class

+

Access class 'FMODEvent' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODEvent Class

+

+

+
C++
+
+

+
FMODEvent CastToFMODEventclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODEvent.
+
+

Cast To FMODPort

+

Access object as a class 'FMODPort' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODPort

+

+

+
C++
+
+

+
FMODPort CastToFMODPort(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODPort.
+
+

Cast To FMODPort class

+

Access class 'FMODPort' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODPort Class

+

+

+
C++
+
+

+
FMODPort CastToFMODPortclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODPort.
+
+

Cast To FMODSnapshot

+

Access object as a class 'FMODSnapshot' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODSnapshot

+

+

+
C++
+
+

+
FMODSnapshot CastToFMODSnapshot(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODSnapshot.
+
+

Cast To FMODSnapshot class

+

Access class 'FMODSnapshot' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODSnapshot Class

+

+

+
C++
+
+

+
FMODSnapshot CastToFMODSnapshotclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODSnapshot.
+
+

Cast To FMODSnapshotReverb

+

Access object as a class 'FMODSnapshotReverb' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODSnapshotReverb

+

+

+
C++
+
+

+
FMODSnapshotReverb CastToFMODSnapshotReverb(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODSnapshotReverb.
+
+

Cast To FMODSnapshotReverb class

+

Access class 'FMODSnapshotReverb' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODSnapshotReverb Class

+

+

+
C++
+
+

+
FMODSnapshotReverb CastToFMODSnapshotReverbclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODSnapshotReverb.
+
+

Cast To FMODVCA

+

Access object as a class 'FMODVCA' it may be an instance of. On failure the Cast Failed path will be taken.

+

Cast To FMODVCA

+

+

+
C++
+
+

+
FMODVCA CastToFMODVCA(
+    Object Object
+);
+
+ +
+
Object
+
Object to cast to an FMODVCA.
+
+

Cast To FMODVCA class

+

Access class 'FMODVCA' as one it may inherit from. On failure the Cast Failed path will be taken.

+

Cast To FMODVCA Class

+

+

+
C++
+
+

+
FMODVCA CastToFMODVCAclass(
+    ObjectClassReference Class
+);
+
+ +
+
Class
+
Class to cast to an FMODVCA.
+
+ + + + + +
diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-component.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-component.png new file mode 100644 index 00000000..5a502f3a --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-component.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17121421b0b598db6ab5b2910e09fc7a47c21c9a665c65e0b645da1e711adc36 +size 10752 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-cue.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-cue.png new file mode 100644 index 00000000..1bee11ef --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-cue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4240b82f2a70ccc1758aede3f90b01a762f9d96497ba0f92b61676d280a15bf0 +size 9328 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-meta.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-meta.png new file mode 100644 index 00000000..b50942df --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-meta.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f392124fed8e8bee6a68ab9ebf4f8c419bc1c9ba9982c833fe638f9027a8eed6 +size 5751 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-settings.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-settings.png new file mode 100644 index 00000000..b4d8ed9a --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-attenuation-settings.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81b41d3129ccbdb593f8d1c2e12293dff67edacca550a605ce083b1b2fc4dd4f +size 63250 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-component.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-component.png new file mode 100644 index 00000000..626094ea --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-component.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f35231ac73d99cb3d00de1510d9aa07debf995a398debfb691d5c16eb1d4052 +size 37770 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-playlink.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-playlink.png new file mode 100644 index 00000000..e5900fcd --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-playlink.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7adb1076071b18576cc289d08d95b741fb8478fc2b2419663f1f8c47ad410a6b +size 36184 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-programmer-sound.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-programmer-sound.png new file mode 100644 index 00000000..bc933c36 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-programmer-sound.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23fbf92f9c95544f8713b621f3f3253b6599b5e2afbe788f9160c1cf162bafc6 +size 106112 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-settings.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-settings.png new file mode 100644 index 00000000..a2ce1ea4 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-settings.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b8ddeeeb0ef918ac894a48eaca75bfb9c83119c1ea8c22ee85939a0a905861c +size 59482 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-settings2.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-settings2.png new file mode 100644 index 00000000..7bafbfef --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-settings2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e72affecb8db405ed792d6a9e6c4b47d4bb1dd76122dfd129392518e404605db +size 51119 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix-cue.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix-cue.png new file mode 100644 index 00000000..659f8282 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix-cue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f2b09a36aa41c8da1e1943bb7b51c58c87bd704d3061b12ea10a7c57d681943 +size 24143 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix.png new file mode 100644 index 00000000..a1668429 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2883be031ece0aa5056a814816485099195f5820f00c5f3f0b92ce0041ae78c1 +size 82745 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix2.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix2.png new file mode 100644 index 00000000..236256d6 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/audiolink-submix2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc2e37bb0169f7d158bcc26c090f56caa33d9113cee0ff6fca2ad89e1281ca32 +size 74577 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/break-fmod-attenuation-details.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/break-fmod-attenuation-details.png new file mode 100644 index 00000000..ed6d8a6d --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/break-fmod-attenuation-details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bfa8e64815bad48efbd2317ce856173121eb9a05e24273d0802c320a9f934ab +size 18888 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/break-fmod-occlusion-details.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/break-fmod-occlusion-details.png new file mode 100644 index 00000000..c0b30674 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/break-fmod-occlusion-details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9266da82b141c54b97fdb2b8adbcad20df7fed4133bba9ec3e22aa7843ca69f +size 20511 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/byte-to-enum.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/byte-to-enum.png new file mode 100644 index 00000000..77403b6e --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/byte-to-enum.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:534e11d40818d0ad3930c2efa2b1120bc6c0cc5c985563b2fa437afccf1c7ecb +size 2920 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmod-audio-component.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmod-audio-component.png new file mode 100644 index 00000000..9801c272 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmod-audio-component.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acd7f22957d6cc5b1c9790b9be5e07414925368cd4a5d726415cabbebad71d52 +size 17721 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodambientsound-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodambientsound-class.png new file mode 100644 index 00000000..dbb477f3 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodambientsound-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:758b50162293af20bb4a76fabd56bc09b19c45c8aea5aa527c72859017c01263 +size 19623 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodambientsound.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodambientsound.png new file mode 100644 index 00000000..aea74c4d --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodambientsound.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99711e33cc74d6fdaba632d0a5f80075e2d62d6db498b31373eccbc1f360bb65 +size 15385 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodanimnotifyplay-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodanimnotifyplay-class.png new file mode 100644 index 00000000..005eed7e --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodanimnotifyplay-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1ce1c50fa3b2e52301f79f6f6addf2bce8b965e4b358c08458e002b2863ce92 +size 19103 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodanimnotifyplay.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodanimnotifyplay.png new file mode 100644 index 00000000..5079ee28 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodanimnotifyplay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1f2a64e472e45c110529c54cbd98c624c69df5fb7a4f3da192aad12fb86be5c +size 14150 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodasset-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodasset-class.png new file mode 100644 index 00000000..d9d105fc --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodasset-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:983a38089f73a12911276e8ad71dd13405c17522d7b64edec14577333f516eea +size 17052 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodasset.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodasset.png new file mode 100644 index 00000000..3e3888bc --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodasset.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c3b505fbb33cc72c49f0aa9f2c3b55e98746f298dd013091e74437033b02505 +size 12108 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodaudiocomponent-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodaudiocomponent-class.png new file mode 100644 index 00000000..ba620aef --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodaudiocomponent-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:454bb5cb89d35cd8a6939863360f5ee2227717a6bca5eb02d8d5c7adc5155cea +size 19572 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodaudiocomponent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodaudiocomponent.png new file mode 100644 index 00000000..19b17b00 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodaudiocomponent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91b6a86223a9f00f03e0be85ae7a8ee6aefd0fa0f7b65fbb2236f57832640717 +size 15362 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbank-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbank-class.png new file mode 100644 index 00000000..94d6c443 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbank-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4ba6167ea03338ab358e6d9ba8932aa738d6855b3960f4e4839b0133962a1a2 +size 17480 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbank.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbank.png new file mode 100644 index 00000000..58fb5a06 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbank.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01eb6ba13c2bb9e27298ac404e0715341d039347e5a2941f88404c35ada353e9 +size 12669 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbus-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbus-class.png new file mode 100644 index 00000000..9fae51c7 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbus-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a94e7a872abd479390657e67af35ef9abc885ae1dc30dd04791bdac939ea92a +size 16555 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbus.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbus.png new file mode 100644 index 00000000..4c8a9272 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodbus.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86dcc61bc1b7b78e5641c1ab1b312b9dee6e9db6b38f8362897b2e1b9b51f435 +size 12090 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodevent-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodevent-class.png new file mode 100644 index 00000000..04b61fcd --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodevent-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1635057487ceb4a9c7cc783e1dba056e8db35841dded944aeb64ad7c3958e198 +size 16925 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodevent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodevent.png new file mode 100644 index 00000000..12fe9abb --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodevent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cda1c9ac58213b8a53dcdea5fcb000bb21047bf8e01f609345efa0b7c8d2de49 +size 12454 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontrolsection-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontrolsection-class.png new file mode 100644 index 00000000..52be0d12 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontrolsection-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf50e72fcf773ab55ce68daa3a59818dc311c0c621aa86aacff9d83f196de101 +size 20838 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontrolsection.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontrolsection.png new file mode 100644 index 00000000..864f056d --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontrolsection.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1751203b0d0e8a70d540a847488069e75e757b45c084d7d597214e188c1a65be +size 16515 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontroltrack-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontroltrack-class.png new file mode 100644 index 00000000..e3c33cd6 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontroltrack-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:902d7498186172554f358b5fee2298f8a7951dcaec37ff4740ccd4eaa6f0aae9 +size 20625 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontroltrack.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontroltrack.png new file mode 100644 index 00000000..32475cb3 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventcontroltrack.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9c21b70b124399807edeb3b2a8fa9d85dca37d9e071125bbd58c758ed15332d +size 15807 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventparametertrack-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventparametertrack-class.png new file mode 100644 index 00000000..db1f0234 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventparametertrack-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f295d1f75090ebc4aaf9a725ea594dfd3ebfac4e1b58e9fe31508904c30d413 +size 20912 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventparametertrack.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventparametertrack.png new file mode 100644 index 00000000..0915f88a --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodeventparametertrack.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ee59bed51169cfea16a71824d6f87b21d1b38b00734ed80985aec79028e279f +size 16263 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodport-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodport-class.png new file mode 100644 index 00000000..4d474dd1 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodport-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:951035ace21dd6c8305a35b7f213e37909c0d9c5aa44381c6e088627553be1f4 +size 17380 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodport.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodport.png new file mode 100644 index 00000000..4f242ab0 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodport.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:992e0021aad31a82f765e2a9f2fc18389ac69ed99d0efe2aacff453b44bb3d4f +size 12243 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshot-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshot-class.png new file mode 100644 index 00000000..e36a0e53 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshot-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20555287e86f9a882ebd965c23d6f24f530a36529f1316325e2faa468c816dde +size 18358 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshot.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshot.png new file mode 100644 index 00000000..9204e2bf --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshot.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ba6d13ddd5a89b8a2d0d088e0ccaf7cecc5ba7188864bcd440788fadd6d00f +size 13567 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshotreverb-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshotreverb-class.png new file mode 100644 index 00000000..6c5da0f8 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshotreverb-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ddd8a5e5dd7fc4d3c3aa366ecd3b69fbcdaa620b63cfeb3384c9aba28f074c4 +size 19834 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshotreverb.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshotreverb.png new file mode 100644 index 00000000..b8f585ff --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodsnapshotreverb.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38909ad498e420948125e7918d7978b1546eab87002ad59010ec8d5856394189 +size 15582 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodvca-class.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodvca-class.png new file mode 100644 index 00000000..d4c87899 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodvca-class.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c443af4f0357b9bdbb4bcbe02427b61f045d2f0936864a70d22e4f5917ce81d +size 16774 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodvca.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodvca.png new file mode 100644 index 00000000..87968378 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/cast-to-fmodvca.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20908d4853e4e6fdf859c93ffadf673943fc33491eecbe37d7b2e932b6c28395 +size 12456 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/for-each.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/for-each.png new file mode 100644 index 00000000..88e38d7f --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/for-each.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93e423304ccb6f401e5b5009f94db47ee6a56f6c275080d642d7dcec6fc6b279 +size 15163 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/get-number-of-entreis-in.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/get-number-of-entreis-in.png new file mode 100644 index 00000000..2aba7468 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/get-number-of-entreis-in.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:979c2754b97502b8c51329ad28ecd920170c502e9efdf24bbb797eb476abc707 +size 13552 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/get-paused.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/get-paused.png new file mode 100644 index 00000000..594d8d95 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/get-paused.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c40ae3702e817b2cb60a8d1776a3bca1656d260156907702f5e9b94f7dac888 +size 17592 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/literal-enum.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/literal-enum.png new file mode 100644 index 00000000..fa26c912 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/literal-enum.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ba36def188af4754d977247d23eba5109710129504b14dbaa21ed0c42a8a80c +size 14767 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-attenuation-details.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-attenuation-details.png new file mode 100644 index 00000000..7c127f3e --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-attenuation-details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dfa3499137c9999bfdad9b14cf8276adfe4d9e5e95ecb5b1dbaae86e94d001e +size 21559 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-event-instance.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-event-instance.png new file mode 100644 index 00000000..fb613192 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-event-instance.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a265cfa6793e2ae16d5183eb5b294e7ae4d310f939f44e507268095a8b5213b +size 10119 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-occlusion-details.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-occlusion-details.png new file mode 100644 index 00000000..afed38a9 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/make-fmod-occlusion-details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b63c269be613918798df53a2a9425827caf7b02127cedfd1995afb4dadac7b79 +size 25252 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/master-bank-name.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/master-bank-name.png index 9a730b39..4eb11710 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/master-bank-name.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/master-bank-name.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-resume.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-resume.png index 5c1a860b..675e7126 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-resume.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-resume.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-suspend.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-suspend.png index 3f6af19d..e2347003 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-suspend.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/mixer-suspend.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-add-fmodevent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-add-fmodevent.png new file mode 100644 index 00000000..2d23c43d --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-add-fmodevent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:860005c8578647f57ea7d2136d9e2f5d21c16ace31148063b2cca79a879d3820 +size 36214 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-create-fmod-event-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-create-fmod-event-player.png new file mode 100644 index 00000000..1d0b9005 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-create-fmod-event-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9479da4e806d75b1b0bfaf0f149376f368e23b280ddf0d18bdb73d28a4a1be6 +size 13200 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-fmod-event-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-fmod-event-player.png new file mode 100644 index 00000000..04d9ce34 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-fmod-event-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f362069c7fc9996b5960c00594914f50593f4097d921f1426c3b8ed48bcc10 +size 17453 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-modules.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-modules.png new file mode 100644 index 00000000..49c2eee2 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-modules.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e95f0c88868c21dead2a6ff3ba118dd54c5b337c5b38d500bd1a20aa931362ec +size 18272 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-play-assign-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-play-assign-player.png new file mode 100644 index 00000000..a9ff7fde --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-play-assign-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:751752bd4ec0f0212a77c127bee8a13665174a0bf244891382be8f3236d77cff +size 69326 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-play-fmod-event.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-play-fmod-event.png new file mode 100644 index 00000000..533e734d --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-play-fmod-event.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7692e9ee24e60f9fb8c9ff74632225519d4431bc547a1de3dac0d0b181e153ae +size 62012 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-playpersistentfmodevent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-playpersistentfmodevent.png new file mode 100644 index 00000000..9787f9a5 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-playpersistentfmodevent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5784f2dd00128c91dd27c5edcb0cd535222802ba9656433bd5e76b505cabd894 +size 57094 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-update-assign-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-update-assign-player.png new file mode 100644 index 00000000..a4308b74 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-update-assign-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:372b609b359502c201f2654a72258e5d4ed5c0d4502d6b61f6bc44c2753cf70d +size 63171 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatefloatparameter.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatefloatparameter.png new file mode 100644 index 00000000..4234c0af --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatefloatparameter.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5db3f64deac3497a1a131d763688dad32706d2f0b3f52cbe0ad9d18e9dbbc203 +size 45432 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatelocation.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatelocation.png new file mode 100644 index 00000000..6d640124 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatelocation.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d811aab9f3615a260263bcef1c65e421bac80d2bbf9c3f41d8cc98ed29b23ead +size 52480 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatepersistentfmodevent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatepersistentfmodevent.png new file mode 100644 index 00000000..cbf6b8a9 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatepersistentfmodevent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4204de9764e1ba4a75338c2dd3c09b4aaa34b6b3d4fcc14db698ebb1a9fa12f +size 59922 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatetype.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatetype.png new file mode 100644 index 00000000..10e63747 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue4-updatetype.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:520db4e3c8691ab5ab3b2d7967fb09fc2c1e78d483e7a9d46d3aebcf10c009a5 +size 12214 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-add-fmodevent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-add-fmodevent.png new file mode 100644 index 00000000..c35046d5 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-add-fmodevent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2731017b09f88d770ec7a4114a058ac153aea0beadf2fa9057fd1e20761d2506 +size 31462 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-create-fmod-event-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-create-fmod-event-player.png new file mode 100644 index 00000000..c5d1596a --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-create-fmod-event-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85591d94ddfc4c1d8354ce4cac8d3e1c346c5f0580b109646d060387f461044b +size 13015 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-fmod-event-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-fmod-event-player.png new file mode 100644 index 00000000..c6815e10 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-fmod-event-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d24587390fbd8c245a5f53acfeb9c2ca5dcf9d55a1cbbc5519fe86708c5ba8e7 +size 21973 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-modules.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-modules.png new file mode 100644 index 00000000..c5a303b3 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-modules.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8c5ad5b5059b5c142b6b11ebb51f88388c22710117b206c0569b17687fc5675 +size 18307 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-play-assign-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-play-assign-player.png new file mode 100644 index 00000000..3123f1da --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-play-assign-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a4064893e48421d77fd609db0c4b759147475cb5c0a9004ffbedc9e95000d2a +size 106768 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-play-fmod-event.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-play-fmod-event.png new file mode 100644 index 00000000..c5cba173 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-play-fmod-event.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9cc884b4d9d4ffa189047e46069becf7c2eef4fb6bc9ea692807062de4f1f79 +size 55777 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-playpersistentfmodevent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-playpersistentfmodevent.png new file mode 100644 index 00000000..5df3d974 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-playpersistentfmodevent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff9070ff6cb8f0a5ae438c1add56acd7f7ca5b29b59da2b4128206cc4981ad5e +size 52853 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-update-assign-player.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-update-assign-player.png new file mode 100644 index 00000000..e2834483 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-update-assign-player.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bd87f2d82255bd3f1d3dd3f0a1fa5145c3eeae1d9a6cb15ac313ac359d8df48 +size 100970 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatefloatparameter.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatefloatparameter.png new file mode 100644 index 00000000..ed938962 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatefloatparameter.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d90efe75113c0497c1081987f1a52cc97eb5c8aa2caed2fffa324723b56e0fb7 +size 45984 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatelocation.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatelocation.png new file mode 100644 index 00000000..b04c289e --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatelocation.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93a3e8feff0707244ca223c67dca9dadc1ae47e29f42a2b216fac49d5d8df530 +size 47166 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatepersistentfmodevent.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatepersistentfmodevent.png new file mode 100644 index 00000000..d64b9a4b --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatepersistentfmodevent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75f2250433a1202afc1a7285948fc406b99c11c8480060bb6b7ba89f3a19f737 +size 51952 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatetype.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatetype.png new file mode 100644 index 00000000..3b1ea998 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-ue5-updatetype.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4843edb083107d355e1d9e2cbc1cc8790821f8fa81385f9e44d9f2acc500fca3 +size 12589 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-updateassignplayer.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-updateassignplayer.png new file mode 100644 index 00000000..e2834483 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/niagara-updateassignplayer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bd87f2d82255bd3f1d3dd3f0a1fa5145c3eeae1d9a6cb15ac313ac359d8df48 +size 100970 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props.png index 2d88955b..e78d2c47 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props2.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props2.png index 0ea1d72a..f3ef247a 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props2.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-props2.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-setting.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-setting.png index 132f5b83..87ba6d88 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-setting.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion-setting.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion.png index 63fe60c5..d5482361 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/occlusion.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-keyframe-curve.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-keyframe-curve.png index 8683192c..b7fb9562 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-keyframe-curve.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-keyframe-curve.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-track.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-track.png index 33019164..e573ed3d 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-track.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/parameter-track.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/platform-specific-integrations.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/platform-specific-integrations.png index a0b1605d..176771ec 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/platform-specific-integrations.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/platform-specific-integrations.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-2d.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-2d.png index 95c1bcd6..9185e1d4 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-2d.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-2d.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-at-location.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-at-location.png index 326aad03..af49430d 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-at-location.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-at-location.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-attached.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-attached.png index 859d174b..e5677b9a 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-attached.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/play-event-attached.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/play.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/play.png index 5e7c7f14..bf9f7800 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/play.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/play.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/plugins.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/plugins.png index 3a2dd168..820f35f9 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/plugins.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/plugins.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/popup.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/popup.png index 47f02ba7..f016eeb4 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/popup.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/popup.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/possess-actor.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/possess-actor.png index 125cb787..71ed43c9 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/possess-actor.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/possess-actor.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-asset-name.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-asset-name.png index 9a493bc0..a17fd73b 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-asset-name.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-asset-name.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-bp.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-bp.png index dde44207..1ce35974 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-bp.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-bp.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-file-path.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-file-path.png index acc1061e..7111d6ed 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-file-path.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-file-path.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-actor.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-actor.png index 9b89b4a2..1b6eddc2 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-actor.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-actor.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-add.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-add.png index 5664dfc4..f5efcff8 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-add.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-add.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-blueprint.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-blueprint.png index dae36c00..4d57d4aa 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-blueprint.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-blueprint.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-create.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-create.png index a8f36f3b..5e12c9ad 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-create.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-create.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-event.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-event.png index 91497dba..95bab972 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-event.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/programmer-sound-event.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/project-deploy.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/project-deploy.png index 9c78a701..2bfbf0d9 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/project-deploy.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/project-deploy.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/project-settings.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/project-settings.png index 5327cf15..a0ddfa50 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/project-settings.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/project-settings.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/release.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/release.png index c7db4c59..672f1db3 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/release.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/release.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-ambient.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-ambient.png index e48f1d15..7189739a 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-ambient.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-ambient.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-assets.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-assets.png index 50b2e9bf..d08bc64b 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-assets.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-assets.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-settings.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-settings.png index 44b4b983..ebfe5aa7 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-settings.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-settings.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-snapshot-intensity.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-snapshot-intensity.png index ec8a6651..a5570004 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-snapshot-intensity.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-snapshot-intensity.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-user-property.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-user-property.png index 1d5c9810..bc4ddeef 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-user-property.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/reverb-user-property.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/save-as-studio.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/save-as-studio.png index c2b2b75a..5c088af9 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/save-as-studio.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/save-as-studio.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-audio-listener-override.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-audio-listener-override.png index d95480a0..9a9136f0 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-audio-listener-override.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-audio-listener-override.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-event.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-event.png index 20825f9d..ed3513b5 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-event.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-event.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-global-parameter-by-name.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-global-parameter-by-name.png index 94933f74..dec6f841 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-global-parameter-by-name.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-global-parameter-by-name.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-locale.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-locale.png index 71c4e5d3..a8c6f7c4 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-locale.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-locale.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-index.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-index.png index e192e29c..a3176f39 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-index.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-index.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-name.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-name.png index b8b9da55..1f420b0b 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-name.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-output-driver-by-name.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-parameter.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-parameter.png index 6371db9c..669c5d86 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-parameter.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-parameter.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-paused.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-paused.png index 9f45fa55..8d21e0a4 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-paused.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-paused.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-pitch.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-pitch.png index e1fef807..6a30092b 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-pitch.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-pitch.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-programmer-sound-name.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-programmer-sound-name.png index 2d0573d7..144c3315 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-programmer-sound-name.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-programmer-sound-name.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-property.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-property.png index 67d9d849..91365634 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-property.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-property.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-timeline-position.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-timeline-position.png index 64269ce0..3a086398 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-timeline-position.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-timeline-position.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-volume.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-volume.png index a492ee6d..022be60e 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/set-volume.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/set-volume.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/setglobalparameter.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/setglobalparameter.png index 659ef5cd..287d09a9 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/setglobalparameter.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/setglobalparameter.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-advanced.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-advanced.png index eae34611..40132b53 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-advanced.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-advanced.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-basic.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-basic.png index 4658e577..3841d74f 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-basic.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-basic.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-encryption.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-encryption.png index 186ce448..3c44719c 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-encryption.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-encryption.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-init.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-init.png index 25c66116..68d4c476 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-init.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-init.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-locale.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-locale.png index 8805ecf4..83f91373 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-locale.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/settings-locale.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-generated-assets.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-generated-assets.png index 433354a8..1f088128 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-generated-assets.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-generated-assets.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-linux.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-linux.png new file mode 100644 index 00000000..d58e1614 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59687c48010d04b11ff15cbebd13f7a1d4ffcc5f5a6fe28be3f5ecf27617dfd2 +size 393353 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-mac.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-mac.png new file mode 100644 index 00000000..177080ca --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-mac.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bf9b28355b66989eeecc23e42cf02b67160dc0dc75caca0affd0159b95fb599 +size 241447 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-win.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-win.png new file mode 100644 index 00000000..c6f63f84 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/images/source-control-win.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1f80855efe4f480fa703006fb199271a29df7b55cb808f003f4a170fcc31dd0 +size 120922 diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/spawned-event.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/spawned-event.png index ae649380..83f12172 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/spawned-event.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/spawned-event.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/stop.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/stop.png index ba8b1d85..ddfccef7 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/stop.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/stop.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-bank-layout.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-bank-layout.png index 609bed9a..7829e6f6 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-bank-layout.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-bank-layout.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-export-path.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-export-path.png index 726d6b69..ce89326e 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-export-path.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-export-path.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-programmer.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-programmer.png index d4728101..83bddbc4 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-programmer.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/studio-programmer.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank-sample-data.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank-sample-data.png index fff97745..6e88531c 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank-sample-data.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank-sample-data.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank.png index 774ba195..9162729b 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-bank.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-event-sample-data.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-event-sample-data.png index 4679b109..be692836 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-event-sample-data.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-event-sample-data.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-setlocale-load.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-setlocale-load.png index 244058f0..1a1d64df 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-setlocale-load.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/unload-setlocale-load.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/validating-fmod.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/validating-fmod.png index dbea60ba..cc2a981f 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/validating-fmod.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/validating-fmod.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/vca-set-volume.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/vca-set-volume.png index 2674f608..c1f45ce0 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/vca-set-volume.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/vca-set-volume.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/images/xboxone-enable-liveupdate.png b/hwanyoung2/Plugins/FMODStudio/Docs/images/xboxone-enable-liveupdate.png index a8370a17..986c8556 100644 Binary files a/hwanyoung2/Plugins/FMODStudio/Docs/images/xboxone-enable-liveupdate.png and b/hwanyoung2/Plugins/FMODStudio/Docs/images/xboxone-enable-liveupdate.png differ diff --git a/hwanyoung2/Plugins/FMODStudio/Docs/niagara.html b/hwanyoung2/Plugins/FMODStudio/Docs/niagara.html new file mode 100644 index 00000000..ee2ae746 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Docs/niagara.html @@ -0,0 +1,227 @@ + + +Niagara Integration + + + + +
+
+

Unreal Integration 2.02

+ +
+
+

5. Niagara Integration

+

Niagara is Unreal Engines VFX System and this section explains how to use the FMOD Integration with it.

+

In Niagara you are able to play one shot events, play persistent events and update parameters.

+

5.0.1 Adding FMOD Events to Niagara system

+

To view the available FMOD Niagara Modules, make sure to enable 'Plugins' in the Source Filtering options:

+ + + + + + + + + + + + + +
UE5UE4
UE5 FMOD Niagara ModulesUE4 FMOD Niagara Modules
+ +

5.0.2 Modules

+

An FMOD Niagara module can be added to one or multiple Unreal Niagara Modules depending on the desired behavior.

+

PlayFMODEvent

+

This can be added to the System, Emitter or Particle modules.

+

Plays a one shot event at the given location that cannot be controlled after being played.

+ + + + + + + + + + + + + + + + + +
UE5UE4
UE5 AddFMODEventUE4 AddFMODEvent
UE5 Play FMOD EventUE4 Play FMOD Event
+

FMODEventPlayer

+

This can be added to the System, Emitter or Particle modules.

+

An FMODEvent reference that can be used with the play and update modules.
+By assigning an Event to the FMOD Event Player, you can use it to play multiple one shots of the same event with the same settings or it can be used with persistance events that require updating over its lifetime.

+ + + + + + + + + + + + + + + + + +
UE5UE4
UE5 Create FMOD Event PlayerUE4 Create FMOD Event Player
UE5 FMODEventPlayerFound in UE editor window
UE4 FMODEventPlayer
+

PlayPersistentFMODEvent

+

This can be added to the System, Emitter or Particle modules.

+

Play an event from a reference that can later be used with UpdatePersistentFMODEvent.

+ + + + + + + + + + + + + +
UE5UE4
UE5 PlayPersistentFMODEventUE4 PlayPersistentFMODEvent
+

UpdatePersistentFMODEvent

+

This can be added to the System, Emitter or Particle modules.

+

Used to update information of an event referenced from FMODEventPlayer.
+You can have multiple of these if you need to control multiple parameters.

+

FMOD Parameters need to be referenced by index from the FMODEventPlayer.

+ + + + + + + + + + + + + +
UE5UE4
UE5 UpdatePersistentFMODEventUE4 UpdatePersistentFMODEvent
+

5.0.3 Playing a one shot

+

Basic example of how to add a one shot event to an emitter:
+- Add a PlayFMODEvent module to emitter.
+- Assign an FMOD Event.
+- Add your emitter to the scene and press play to hear it in action.

+

5.0.4 Playing a persistent event

+ + + + + + + + + + + + + + +
UE5UE4
Assign PlayerUE4 PlayPersistentFMODEvent
+ +

5.0.5 Updating a persistent event

+

Continuing on from Playing a persistent event as you will need both the event player and play modules.

+ + + + + + + + + + + + + + +
UE5UE4
UE5 Assign PlayerUE4 Assign Player
+ + + + + + + + + + + + + + + + + + + + + + +
UE5UE4
UE5 Update TypeUE4 Update Type
UE5 Update LocationUE4 Update Location
UE5 Update Float ParameterUE4 Update Float Parameter
+
+ + + + + +
diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/FMODAudioLink.Build.cs b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/FMODAudioLink.Build.cs new file mode 100644 index 00000000..991fc0e0 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/FMODAudioLink.Build.cs @@ -0,0 +1,20 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +using UnrealBuildTool; +using System.IO; + +public struct FMODAudioLink +{ + public static void Apply(UnrealBuildTool.Rules.FMODStudio FMODModule, ReadOnlyTargetRules Target) + { + FMODModule.AddModule("FMODAudioLink"); + FMODModule.PrivateDependencyModuleNames.AddRange( + new string[] + { + "AudioLinkCore", + "AudioLinkEngine", + "SignalProcessing" + } + ); + } +} \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLink.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLink.h new file mode 100644 index 00000000..53b64754 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLink.h @@ -0,0 +1,36 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "IAudioLink.h" +#include "AudioDevice.h" +#include "IBufferedAudioOutput.h" +#include "FMODAudioLinkInputClient.h" + +//* AudioLink Instance, a container holding shared pointers for lifetime management. */ +struct FFMODAudioLink : IAudioLink +{ + FSharedBufferedOutputPtr ProducerSP; + + FSharedFMODAudioLinkInputClientPtr ConsumerSP; + + FAudioDevice* AudioDevice; + + FFMODAudioLink(const FSharedBufferedOutputPtr& InProducerSP, const FSharedFMODAudioLinkInputClientPtr& InConsumerSP, FAudioDevice* InAudioDevice = nullptr) + : ProducerSP(InProducerSP) + , ConsumerSP(InConsumerSP) + , AudioDevice(InAudioDevice) + {} + + virtual ~FFMODAudioLink() override + { + if (ConsumerSP.IsValid()) + { + ConsumerSP->Stop(); + } + if (AudioDevice && ProducerSP.IsValid()) + { + ProducerSP->Stop(AudioDevice); + } + } +}; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkComponent.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkComponent.cpp new file mode 100644 index 00000000..0f006b80 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkComponent.cpp @@ -0,0 +1,130 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkComponent.h" +#include "FMODAudioLinkFactory.h" +#include "Components/AudioComponent.h" +#include "FMODAudioLinkLog.h" + +void UFMODAudioLinkComponent::CreateLink() +{ + if (!Settings) + { + Settings = GetMutableDefault(); + } + + IAudioLinkFactory* Factory = IAudioLinkFactory::FindFactory(FFMODAudioLinkFactory::GetFactoryNameStatic()); + if (Factory) + { + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("UFMODAudioLinkComponent::CreateLink.")); + IAudioLinkFactory::FAudioLinkSourceCreateArgs CreateArgs; + CreateArgs.OwningComponent = this; + CreateArgs.AudioComponent = AudioComponent; + CreateArgs.Settings = Settings; + LinkInstance = Factory->CreateSourceAudioLink(CreateArgs); + } +} + +void UFMODAudioLinkComponent::CreateAudioComponent() +{ + if (!AudioComponent) + { + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("UFMODAudioLinkComponent::CreateAudioComponent.")); + AudioComponent = NewObject(this); + + if (!AudioComponent->GetAttachParent() && !AudioComponent->IsAttachedTo(this)) + { + AActor* Owner = GetOwner(); + if (!Owner || !Owner->GetWorld()) + { + if (UWorld* World = GetWorld()) + { + AudioComponent->RegisterComponentWithWorld(World); + AudioComponent->AttachToComponent(this, FAttachmentTransformRules::KeepRelativeTransform); + } + else + { + AudioComponent->SetupAttachment(this); + } + } + else + { + AudioComponent->AttachToComponent(this, FAttachmentTransformRules::KeepRelativeTransform); + AudioComponent->RegisterComponent(); + } + } + } + + if (AudioComponent) + { + AudioComponent->bAutoActivate = false; + AudioComponent->bStopWhenOwnerDestroyed = true; + AudioComponent->bShouldRemainActiveIfDropped = true; + AudioComponent->Mobility = EComponentMobility::Movable; + +#if WITH_EDITORONLY_DATA + AudioComponent->bVisualizeComponent = false; +#endif + } +} + +void UFMODAudioLinkComponent::OnRegister() +{ + Super::OnRegister(); + + CreateAudioComponent(); + + if (ensure(AudioComponent)) + { + check(LinkInstance == nullptr); + CreateLink(); + } +} + +void UFMODAudioLinkComponent::OnUnregister() +{ + LinkInstance.Reset(); + AudioComponent = nullptr; + + Super::OnUnregister(); +} + +void UFMODAudioLinkComponent::SetLinkSound(USoundBase* InSound) +{ + Sound = InSound; + + if (AudioComponent) + { + AudioComponent->SetSound(InSound); + } +} + +void UFMODAudioLinkComponent::PlayLink(float StartTime) +{ + if (AudioComponent) + { + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("UFMODAudioLinkComponent::PlayLink.")); + AudioComponent->SetSound(Sound); + AudioComponent->Play(StartTime); + + SetActiveFlag(AudioComponent->IsActive()); + } +} + +void UFMODAudioLinkComponent::StopLink() +{ + if (IsActive()) + { + if (AudioComponent) + { + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("UFMODAudioLinkComponent::StopLink.")); + AudioComponent->Stop(); + } + + SetActiveFlag(false); + } +} + +bool UFMODAudioLinkComponent::IsLinkPlaying() const +{ + return AudioComponent && AudioComponent->IsPlaying(); +} \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkFactory.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkFactory.cpp new file mode 100644 index 00000000..559d38f9 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkFactory.cpp @@ -0,0 +1,239 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkFactory.h" +#include "FMODAudioLinkSynchronizer.h" +#include "FMODAudioLinkSourcePushed.h" +#include "FMODAudioLinkSettings.h" +#include "FMODAudioLinkLog.h" +#include "FMODAudioLinkComponent.h" +#include "FMODStudioModule.h" + +#include "Async/Async.h" +#include "Components/AudioComponent.h" +#include "Engine/World.h" +#include "Sound/SoundSubmix.h" +#include "Templates/SharedPointer.h" +#include "AudioDevice.h" + +bool FFMODAudioLinkFactory::bHasSubmix = false; + +FName FFMODAudioLinkFactory::GetFactoryNameStatic() +{ + static const FName FactoryName(TEXT("FMOD")); + return FactoryName; +} + +FName FFMODAudioLinkFactory::GetFactoryName() const +{ + return GetFactoryNameStatic(); +} + +TSubclassOf FFMODAudioLinkFactory::GetSettingsClass() const +{ + return UFMODAudioLinkSettings::StaticClass(); +} + +TUniquePtr FFMODAudioLinkFactory::CreateSubmixAudioLink(const FAudioLinkSubmixCreateArgs& InArgs) +{ + if (!IFMODStudioModule::IsAvailable()) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSubmixAudioLink: No FMODStudio module.")); + return {}; + } + + if (!InArgs.Settings.IsValid()) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSubmixAudioLink: Invalid FMODAudioLinkSettings.")); + return {}; + } + + if (!InArgs.Submix.IsValid()) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSubmixAudioLink: Invalid Submix.")); + return {}; + } + + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkFactory::CreateSubmixAudioLink: Creating AudioLink %s for Submix %s."), *InArgs.Settings->GetName(), *InArgs.Submix->GetName()); + bHasSubmix = true; + + // Downcast to settings proxy + const FSharedFMODAudioLinkSettingsProxyPtr FMODSettingsSP = InArgs.Settings->GetCastProxy(); + + // Make buffer listener first, which is our producer. + IAudioLinkFactory::FSubmixBufferListenerCreateParams SubmixListenerCreateArgs; + SubmixListenerCreateArgs.SizeOfBufferInFrames = FMODSettingsSP->GetReceivingBufferSizeInFrames(); + SubmixListenerCreateArgs.bShouldZeroBuffer = FMODSettingsSP->ShouldClearBufferOnReceipt(); + FSharedBufferedOutputPtr ProducerSP = CreateSubmixBufferListener(SubmixListenerCreateArgs); + TWeakPtr ProducerWeak(ProducerSP); + + // Create consumer. + FSharedFMODAudioLinkInputClientPtr ConsumerSP = MakeShared( + ProducerSP, InArgs.Settings->GetProxy(), InArgs.Submix->GetFName()); + TWeakPtr ConsumerWeak(ConsumerSP); + + // Setup a delegate to establish the link when we know the format. + ProducerSP->SetFormatKnownDelegate( + IBufferedAudioOutput::FOnFormatKnown::CreateLambda( + [ProducerWeak, ConsumerWeak, FMODSettingsSP](const IBufferedAudioOutput::FBufferFormat& InFormat) + { + // Unreal uses samples for 'Channels x samples' and frames for 'samples' + int32 BufferSizeInChannelSamples = FMODSettingsSP->GetReceivingBufferSizeInFrames() * InFormat.NumChannels; + int32 ReserveSizeInChannelSamples = (float)BufferSizeInChannelSamples * FMODSettingsSP->GetProducerConsumerBufferRatio(); + int32 SilenceToAddToFirstBuffer = FMath::Min((float)BufferSizeInChannelSamples * FMODSettingsSP->GetInitialSilenceFillRatio(), ReserveSizeInChannelSamples); + + // Set circular buffer ahead of first buffer. + if (auto ProducerSP = ProducerWeak.Pin()) + { + ProducerSP->Reserve(ReserveSizeInChannelSamples, SilenceToAddToFirstBuffer); + } + + + AsyncTask(ENamedThreads::GameThread, [ConsumerWeak]() + { + if (FSharedFMODAudioLinkInputClientPtr ConsumerSP = ConsumerWeak.Pin()) + { + // Stop ahead of starting to play. This might not be necessary for submixes, but in case we get a format change. + // As our link can remain open, stop anything playing on a format change. + // This won't do anything if we're already stopped. + ConsumerSP->Stop(); + + // Start the FMOD input object. + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkFactory::CreateSubmixAudioLink: Start consumer.")); + ConsumerSP->Start(); + } + }); + })); + + // Start producer. + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkFactory::CreateSubmixAudioLink: Start producer.")); + ProducerSP->Start(InArgs.Device); + + // Build a link, which owns both the consumer and producer. + return MakeUnique(ProducerSP, ConsumerSP, InArgs.Device); +} + +TUniquePtr FFMODAudioLinkFactory::CreateSourceAudioLink(const FAudioLinkSourceCreateArgs& InArgs) +{ + if (!IFMODStudioModule::IsAvailable()) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: No FMODStudio module.")); + return {}; + } + + if (!InArgs.Settings.IsValid()) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: Invalid FMODAudioLinkSettings.")); + return {}; + } + + if (!InArgs.OwningComponent.IsValid()) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: Invalid Owning Component.")); + return {}; + } + + if (!InArgs.AudioComponent.IsValid()) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: Invalid Audio Component.")); + return {}; + } + + const UWorld* World = InArgs.OwningComponent->GetWorld(); + if (UNLIKELY(!IsValid(World))) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: Invalid World in Owning Component.")); + return {}; + } + + const FAudioDeviceHandle Handle = World->GetAudioDevice(); + + // Downcast to settings proxy. + const FSharedFMODAudioLinkSettingsProxyPtr FMODSettingsSP = InArgs.Settings->GetCastProxy(); + + // Make buffer listener first, which is our producer. + FSourceBufferListenerCreateParams SourceBufferCreateArgs; + SourceBufferCreateArgs.SizeOfBufferInFrames = FMODSettingsSP->GetReceivingBufferSizeInFrames(); + SourceBufferCreateArgs.bShouldZeroBuffer = true; + SourceBufferCreateArgs.OwningComponent = InArgs.OwningComponent; + SourceBufferCreateArgs.AudioComponent = InArgs.AudioComponent; + FSharedBufferedOutputPtr ProducerSP = CreateSourceBufferListener(SourceBufferCreateArgs); + + static const FName UnknownOwner(TEXT("Unknown")); + FName OwnerName = InArgs.OwningComponent.IsValid() ? InArgs.OwningComponent->GetFName() : UnknownOwner; + TWeakPtr ProducerWeak(ProducerSP); + + // Create consumer. + FSharedFMODAudioLinkInputClientPtr ConsumerSP = MakeShared(ProducerSP, FMODSettingsSP, OwnerName); + TWeakPtr ConsumerWeak(ConsumerSP); + + ProducerSP->SetFormatKnownDelegate( + IBufferedAudioOutput::FOnFormatKnown::CreateLambda( + [ProducerWeak, ConsumerWeak, FMODSettingsSP, WeakThis = InArgs.OwningComponent](const IBufferedAudioOutput::FBufferFormat& InFormat) + { + // Unreal uses samples for 'Channels x samples' and frames for 'samples' + int32 BufferSizeInChannelSamples = FMODSettingsSP->GetReceivingBufferSizeInFrames() * InFormat.NumChannels; + int32 ReserveSizeInChannelSamples = (float)BufferSizeInChannelSamples * FMODSettingsSP->GetProducerConsumerBufferRatio(); + int32 SilenceToAddToFirstBuffer = FMath::Min((float)BufferSizeInChannelSamples * FMODSettingsSP->GetInitialSilenceFillRatio(), ReserveSizeInChannelSamples); + + + // Set circular buffer ahead of first buffer. + if (auto ProducerSP = ProducerWeak.Pin()) + { + ProducerSP->Reserve(ReserveSizeInChannelSamples, SilenceToAddToFirstBuffer); + } + + AsyncTask(ENamedThreads::GameThread, [ConsumerWeak, WeakThis]() + { + if (FSharedFMODAudioLinkInputClientPtr ConsumerSP = ConsumerWeak.Pin()) + { + if (WeakThis.IsValid()) + { + // Stop ahead of starting to play. This might not be necessary for submixes, but in case we get a format change. + // As our link can remain open, stop anything playing on a format change. + // This won't do anything if we're already stopped. + ConsumerSP->Stop(); + + // Start the FMOD input object. + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: Start consumer.")); + ConsumerSP->Start(Cast(WeakThis.Get())); + } + } + }); + })); + ProducerSP->SetBufferStreamEndDelegate( + IBufferedAudioOutput::FOnBufferStreamEnd::CreateLambda( + [ConsumerWeak](const IBufferedAudioOutput::FBufferStreamEnd&) + { + if (FSharedFMODAudioLinkInputClientPtr ConsumerSP = ConsumerWeak.Pin()) + { + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: Stop consumer.")); + ConsumerSP->Stop(); + } + })); + + // Tell the Producer to Start receiving buffers from Sources. + // Pass a Lambda to do the some work when we know the Format, which starts FMOD up. + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkFactory::CreateSourceAudioLink: Start producer.")); + ProducerSP->Start(Handle ? Handle.GetAudioDevice() : nullptr); + + // Make the link. + return MakeUnique(ProducerSP, ConsumerSP); +} + +IAudioLinkFactory::FAudioLinkSourcePushedSharedPtr FFMODAudioLinkFactory::CreateSourcePushedAudioLink(const FAudioLinkSourcePushedCreateArgs& InArgs) +{ + if (IFMODStudioModule::IsAvailable()) + { + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkFactory::CreateSourcePushedAudioLink: Create AudioLink SourcePushed.")); + return MakeShared(InArgs,this); + } + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkFactory::CreateSourcePushedAudioLink: IFMODStudioModule not available.")); + return nullptr; +} + +IAudioLinkFactory::FAudioLinkSynchronizerSharedPtr FFMODAudioLinkFactory::CreateSynchronizerAudioLink() +{ + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkFactory::CreateSynchronizerAudioLink: Create AudioLink Synchronizer.")); + auto SynchronizerSP = MakeShared(); + return SynchronizerSP; +} diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkFactory.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkFactory.h new file mode 100644 index 00000000..766d7002 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkFactory.h @@ -0,0 +1,26 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "FMODAudioLink.h" +#include "IAudioLinkFactory.h" + +class FFMODAudioLinkFactory : public IAudioLinkFactory +{ +public: + FFMODAudioLinkFactory() = default; + virtual ~FFMODAudioLinkFactory() override = default; + + static FName GetFactoryNameStatic(); + static bool bHasSubmix; + +protected: + /** Begin IAudioLinkFactory */ + FName GetFactoryName() const override; + TSubclassOf GetSettingsClass() const override; + TUniquePtr CreateSubmixAudioLink(const FAudioLinkSubmixCreateArgs&) override; + TUniquePtr CreateSourceAudioLink(const FAudioLinkSourceCreateArgs&) override; + FAudioLinkSourcePushedSharedPtr CreateSourcePushedAudioLink(const FAudioLinkSourcePushedCreateArgs&) override; + FAudioLinkSynchronizerSharedPtr CreateSynchronizerAudioLink() override; + /** End IAudioLinkFactory */ +}; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkInputClient.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkInputClient.cpp new file mode 100644 index 00000000..dcd1ab40 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkInputClient.cpp @@ -0,0 +1,314 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkInputClient.h" +#include "FMODAudioLinkLog.h" +#include "FMODAudioLinkSettings.h" +#include "FMODAudioLinkFactory.h" +#include "FMODAudioLinkComponent.h" +#include "FMODEvent.h" + +#include "FMODStudioModule.h" +#include "FMODBlueprintStatics.h" + +#include +#include "Async/Async.h" +#include "Templates/SharedPointer.h" + +class InputClientRef +{ +public: + TSharedRef InputClient; + + InputClientRef(TSharedRef InputSP) + : InputClient(InputSP) + { + } +}; + +FMOD::Studio::System* GetStudioSystem() +{ + if (IFMODStudioModule::IsAvailable()) + { + auto* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (!StudioSystem) + { + StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Auditioning); + } + return StudioSystem; + } + return nullptr; +} + +void FFMODAudioLinkInputClient::Register(const FName& NameOfProducingSource) +{ + const auto Name = NameOfProducingSource.GetPlainNameString(); + + if (UNLIKELY(!Settings.IsValid())) + { + UE_LOG(LogFMODAudioLink, Warning, TEXT("FFMODAudioLinkInputClient::Register: FMODAudioLinkSettings are not valid.")); + return; + } + + if (UNLIKELY(!GetStudioSystem())) + { + UE_LOG(LogFMODAudioLink, Warning, TEXT("FFMODAudioLinkInputClient::Register: Unable to get FMOD Studio System.")); + return; + } + + AsyncTask(ENamedThreads::GameThread, [] + { + const auto AudioDeviceManager = FAudioDeviceManager::Get(); + if (UNLIKELY(!AudioDeviceManager)) + { + UE_LOG(LogFMODAudioLink, Warning, TEXT("FFMODAudioLinkInputClient::Register: No AudioDeviceManager at registration.")); + return; + } + const auto AudioDevice = AudioDeviceManager->GetActiveAudioDevice(); + if (UNLIKELY(!AudioDevice)) + { + UE_LOG(LogFMODAudioLink, Warning, TEXT("FFMODAudioLinkInputClient::Register: No active AudioDevice at registration.")); + return; + } + UE_CLOG(UNLIKELY(AudioDevice->GetMaxChannels() == 0), LogFMODAudioLink, Warning, + TEXT("FMODAudioLink: The current AudioDevice %d has 0 MaxChannels. Consider setting AudioMaxChannels to a sensible value in the Engine config file's TargetSettings for your platform."), + AudioDevice->DeviceID); + + UE_CLOG(!FFMODAudioLinkFactory::bHasSubmix, + LogFMODAudioLink, Warning, TEXT("FMODAudioLink: No initial submix got routed to AudioLink. Consider creating custom versions of global submixes in Project Settings Audio, and Enable Audio Link in their advanced settings.")); + }); +} + +void FFMODAudioLinkInputClient::Unregister() +{ + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkInputClient::Unregister.")); +} + +FFMODAudioLinkInputClient::FFMODAudioLinkInputClient(const FSharedBufferedOutputPtr& ToConsumeFrom, const UAudioLinkSettingsAbstract::FSharedSettingsProxyPtr& Settings, FName NameOfProducingSource) + : WeakProducer(ToConsumeFrom) + , Settings(Settings) + , ProducerName(NameOfProducingSource) +{ + check(Settings.IsValid()); + Register(NameOfProducingSource); + UnrealFormat = {}; +} + +FFMODAudioLinkInputClient::~FFMODAudioLinkInputClient() +{ + Unregister(); +} + +FMOD_RESULT F_CALLBACK pcmreadcallback(FMOD_SOUND* inSound, void* data, unsigned int datalen) +{ + FMOD::Sound* sound = (FMOD::Sound*)inSound; + FFMODAudioLinkInputClient* ConsumerSP; + sound->getUserData((void**)&ConsumerSP); + + ConsumerSP->GetSamples(data, datalen); + + return FMOD_OK; +} + +FMOD_RESULT F_CALLBACK SoundCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void* parameters) +{ + FMOD_RESULT result = FMOD_OK; + FMOD::Studio::EventInstance* eventInstance = (FMOD::Studio::EventInstance*)event; + + if (type == FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND) + { + InputClientRef* ClientRef; + result = eventInstance->getUserData((void**)&ClientRef); + + FFMODAudioLinkInputClient* ConsumerPtr = &ClientRef->InputClient.Get(); + auto formatInfo = ConsumerPtr->GetFormat(); + + FMOD::System* CoreSystem = nullptr; + GetStudioSystem()->getCoreSystem(&CoreSystem); + + // Create sound info + FMOD_CREATESOUNDEXINFO exinfo; + memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); /* Required. */ + exinfo.numchannels = formatInfo->NumChannels; /* Number of channels in the sound. */ + exinfo.defaultfrequency = formatInfo->NumSamplesPerSec; /* Default playback rate of sound. */ + exinfo.decodebuffersize = formatInfo->NumSamplesPerBlock / exinfo.numchannels; /* Chunk size of stream update in samples. Should match the FMOD System. */ + exinfo.length = exinfo.defaultfrequency * exinfo.numchannels * sizeof(signed short) * 5; /* Length of PCM data in bytes of whole song (for Sound::getLength) */ + exinfo.format = FMOD_SOUND_FORMAT_PCMFLOAT; /* Data format of sound. */ + exinfo.pcmreadcallback = pcmreadcallback; /* User callback for reading. */ + exinfo.userdata = ConsumerPtr; + + FMOD::Sound* sound = NULL; + FString sourceName = ConsumerPtr->GetProducerName().ToString(); + result = CoreSystem->createSound(TCHAR_TO_ANSI(*sourceName), FMOD_OPENUSER | FMOD_CREATESTREAM, &exinfo, &sound); + + // Pass the sound to FMOD + FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters; + props->sound = (FMOD_SOUND*)sound; + UE_LOG(LogFMODAudioLink, Verbose, TEXT("Sound Created: %s , Consumer = %p."), *sourceName, ConsumerPtr); + } + else if (type == FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND) + { + // Obtain the sound + FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters; + FMOD::Sound* sound = (FMOD::Sound*)props->sound; + + // Release the sound + UE_LOG(LogFMODAudioLink, Verbose, TEXT("Sound Release: %p."), sound); + result = sound->release(); + } + else if (type == FMOD_STUDIO_EVENT_CALLBACK_DESTROYED) + { + InputClientRef* ClientRef = nullptr; + result = eventInstance->getUserData((void**)&ClientRef); + + UE_LOG(LogFMODAudioLink, Verbose, TEXT("Event Destroyed: ClientRef = %p."), ClientRef); + if (ClientRef) + { + delete ClientRef; + } + } + + return result; +} + +void FFMODAudioLinkInputClient::Start(USceneComponent* InComponent) +{ + Stop(); + check(!IsLoadedHandle.IsValid()); + + FFMODAudioLinkSettingsProxy* FMODSettings = static_cast(Settings.Get()); + const auto LinkEvent = FMODSettings->GetLinkEvent(); + + auto SelfSP = AsShared(); + auto PlayLambda = [SelfSP, LinkEvent, InComponent]() + { + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkInputClient::Start: SelSP = %p, LinkEvent = %s, InComponent = %p."), &SelfSP, LinkEvent.Get(), &InComponent); + + FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(LinkEvent.Get()); + if (EventDesc != nullptr) + { + FMOD::Studio::EventInstance* EventInst = NULL; + EventDesc->createInstance(&EventInst); + SelfSP->EventInstance = EventInst; + if (EventInst != nullptr) + { + FTransform EventTransform = InComponent ? InComponent->GetComponentTransform() : FTransform(); + FMOD_3D_ATTRIBUTES EventAttr = { { 0 } }; + FMODUtils::Assign(EventAttr, EventTransform); + EventInst->set3DAttributes(&EventAttr); + + EventInst->setCallback(SoundCallback, FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND | FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND | FMOD_STUDIO_EVENT_CALLBACK_DESTROYED); + + InputClientRef* callbackMemory = new InputClientRef(SelfSP); + + EventInst->setUserData(callbackMemory); + EventInst->start(); + } + } + }; + + FMODSettings->IsEventDataLoaded() ? PlayLambda() : FMODSettings->RegisterCallback(PlayLambda, IsLoadedHandle); +} + +void FFMODAudioLinkInputClient::Stop() +{ + if (EventInstance->isValid()) + { + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkInputClient::Stop: Stopping EventInstance.")); + EventInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT); + EventInstance->release(); + } + + if (IsLoadedHandle.IsValid()) + { + FFMODAudioLinkSettingsProxy* FMODSettings = static_cast(Settings.Get()); + check(FMODSettings); + + FMODSettings->UnRegisterCallback(IsLoadedHandle); + IsLoadedHandle.Reset(); + } +} + +void FFMODAudioLinkInputClient::UpdateWorldState(const FWorldState& InParams) +{ + if (EventInstance->isValid()) + { + const FTransform& T = InParams.WorldTransform; + FMOD_3D_ATTRIBUTES attr = { { 0 } }; + FMODUtils::Assign(attr, T); + + // TODO: velocity + + EventInstance->set3DAttributes(&attr); + } +} + +bool FFMODAudioLinkInputClient::GetSamples(void* data, unsigned int dataLenBytes) +{ + FSharedBufferedOutputPtr StrongBufferProducer{ WeakProducer.Pin() }; + if (!StrongBufferProducer.IsValid()) + { + // return false, to indicate no more data. + FMemory::Memzero(data, dataLenBytes); + return false; + } + + float* dataBuffer = (float*)data; + + int32 FramesWritten = 0; + + int32 dataLenFrames = dataLenBytes / (sizeof(float)); + + bool bMoreDataRemaining = StrongBufferProducer->PopBuffer(dataBuffer, dataLenFrames, FramesWritten); + + // Zero any buffer space that we didn't output to. + int32 FramesThatNeedZeroing = dataLenFrames - FramesWritten; + + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkInputClient::GetSamples: (post-pop), SamplesPopped=%d, SamplesNeeded=%d, ZeroFrames=%d, This=0x%p"), + FramesWritten, dataLenFrames, FramesThatNeedZeroing, this); + + if (FramesThatNeedZeroing > 0) + { + FMemory::Memset(&dataBuffer[FramesWritten], 0, FramesThatNeedZeroing); + NumStarvedBuffersInARow++; + + static const int32 NumStatedBuffersBeforeStop = 5; + if (NumStarvedBuffersInARow > NumStatedBuffersBeforeStop) + { + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FMODAudioLinkInputClient::GetSamples: Stopping Starving input object, Needed=%d, Red=%d, StarvedCount=%d, This=0x%p"), + dataLenFrames, FramesWritten, NumStarvedBuffersInARow, this); + + // Terminate. + bMoreDataRemaining = false; + } + } + else + { + NumStarvedBuffersInARow = 0; + } + + return bMoreDataRemaining; +} + +IBufferedAudioOutput::FBufferFormat* FFMODAudioLinkInputClient::GetFormat() +{ + // Ensure we're still listening to a sub mix that exists. + FSharedBufferedOutputPtr StrongPtr{ WeakProducer.Pin() }; + if (!StrongPtr.IsValid()) + { + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FMODAudioLinkInputClient::GetFormat: FSharedBufferedOutputPtr not valid.")); + } + else + { + ensure(StrongPtr->GetFormat(UnrealFormat)); + } + + return &UnrealFormat; +} + +void FFMODAudioLinkInputClient::SetFormat(const IBufferedAudioOutput::FBufferFormat *AudioFormat) +{ + UnrealFormat.NumChannels = AudioFormat->NumChannels; + UnrealFormat.NumSamplesPerBlock = AudioFormat->NumSamplesPerBlock; + UnrealFormat.NumSamplesPerSec = AudioFormat->NumSamplesPerSec; +} \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkInputClient.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkInputClient.h new file mode 100644 index 00000000..3a203926 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkInputClient.h @@ -0,0 +1,58 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "IAudioLink.h" +#include "IAudioLinkFactory.h" +#include "Templates/SharedPointer.h" +#include "IBufferedAudioOutput.h" +#include "DSP/BufferVectorOperations.h" + +#include "fmod_studio.hpp" + +class UFMODAudioLinkComponent; +class FFMODAudioLinkInputClient; + +class FFMODAudioLinkInputClient : public TSharedFromThis +{ +public: + FFMODAudioLinkInputClient(const FSharedBufferedOutputPtr& InToConsumeFrom, const UAudioLinkSettingsAbstract::FSharedSettingsProxyPtr& InSettings, FName InNameOfProducingSource={}); + virtual ~FFMODAudioLinkInputClient(); + + /// Used by all Audio Link sources. + /// Optional component parameter that is used with the FMODAudioLinkComponent. + void Start(USceneComponent* InComponent = nullptr); + void Stop(); + + struct FWorldState + { + FTransform WorldTransform; + }; + // Called from Consumer thread at game tick rate. + void UpdateWorldState(const FWorldState&); + // Called from FMOD thread. + bool GetSamples(void* data, unsigned int datalen); + + IBufferedAudioOutput::FBufferFormat* GetFormat(); + + /// Used Sound "Sources" instead of FormatKnownDelegate to store the format at the time of starting. + void SetFormat(const IBufferedAudioOutput::FBufferFormat *AudioFormat); + + FName GetProducerName() const { return ProducerName; } + FMOD::Studio::EventInstance* EventInstance; + +private: + void Register(const FName& NameOfProducingSource); + void Unregister(); + + FWeakBufferedOutputPtr WeakProducer; + UAudioLinkSettingsAbstract::FSharedSettingsProxyPtr Settings; + + IBufferedAudioOutput::FBufferFormat UnrealFormat; + + FName ProducerName; + int32 NumStarvedBuffersInARow = 0; + FDelegateHandle IsLoadedHandle; +}; + +using FSharedFMODAudioLinkInputClientPtr = TSharedPtr; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkLog.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkLog.cpp new file mode 100644 index 00000000..f340095d --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkLog.cpp @@ -0,0 +1,5 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkLog.h" + +DEFINE_LOG_CATEGORY(LogFMODAudioLink); \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSettings.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSettings.cpp new file mode 100644 index 00000000..22c34ee2 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSettings.cpp @@ -0,0 +1,150 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkSettings.h" +#include "FMODAudioLinkFactory.h" +#include "FMODAudioLinkLog.h" +#include "FMODStudioModule.h" +#include "FMODEvent.h" +#include "fmod_studio.hpp" +#include "FMODSettings.h" + +#include "Engine/StreamableManager.h" +#include "Engine/AssetManager.h" +#include "Async/Async.h" + + +FFMODAudioLinkSettingsProxy::FFMODAudioLinkSettingsProxy(const UFMODAudioLinkSettings& InSettings) +{ + Update(InSettings); +} + +void FFMODAudioLinkSettingsProxy::Update(const UFMODAudioLinkSettings& InSettings) +{ + InSettings.RequestLoadLinkEvent(); + ReceivingBufferSizeInFrames = InSettings.GetReceivingBufferSizeInFrames(); + ProducerToConsumerBufferRatio = InSettings.ProducerToConsumerBufferRatio; + InitialSilenceFillRatio = InSettings.InitialSilenceFillRatio; + FMODLinkEvent = InSettings.LinkEvent; +} + +bool FFMODAudioLinkSettingsProxy::IsEventDataLoaded() const +{ + return bIsEventDataLoaded; +} + +void FFMODAudioLinkSettingsProxy::RegisterCallback(const TFunction& InCallback, FDelegateHandle& OutHandle) +{ + FScopeLock Lock(&CS); + OutHandle = OnEventLoadedDelegate.Add(FSimpleMulticastDelegate::FDelegate::CreateLambda(InCallback)); +} + +bool FFMODAudioLinkSettingsProxy::UnRegisterCallback(const FDelegateHandle& InDelegate) +{ + FScopeLock Lock(&CS); + return OnEventLoadedDelegate.Remove(InDelegate); +} + +void FFMODAudioLinkSettingsProxy::NotifyEventDataLoaded() +{ + FScopeLock Lock(&CS); + bIsEventDataLoaded = true; + OnEventLoadedDelegate.Broadcast(); +} + +#if WITH_EDITOR +void FFMODAudioLinkSettingsProxy::RefreshFromSettings(UAudioLinkSettingsAbstract* InSettings, FPropertyChangedEvent& InPropertyChangedEvent) +{ + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkSettingsProxy::RefreshFromSettings.")); + Update(*CastChecked(InSettings)); +} +#endif //WITH_EDITOR + + +void UFMODAudioLinkSettings::PostLoad() +{ + RequestLoadLinkEvent(); + Super::PostLoad(); +} + +void UFMODAudioLinkSettings::RequestLoadLinkEvent() const +{ + if (bLoadRequested) + { + return; + } + bLoadRequested = true; + const UFMODSettings& Settings = *GetDefault(); + if (Settings.bFMODAudioLinkEnabled) + { + AsyncTask(ENamedThreads::GameThread, [WeakThis = MakeWeakObjectPtr(const_cast(this))]() + { + if (WeakThis.IsValid()) + { + FStreamableManager& StreamableManager = UAssetManager::GetStreamableManager(); + FStreamableDelegate Delegate = FStreamableDelegate::CreateUObject(WeakThis.Get(), &UFMODAudioLinkSettings::OnLoadCompleteCallback); + WeakThis->LoadingHandle = StreamableManager.RequestAsyncLoad(WeakThis->LinkEvent.ToSoftObjectPath(), Delegate, FStreamableManager::AsyncLoadHighPriority, + /* Managed active handle */ true); + UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkSettings::RequestLoadLinkEvent: Async Loading %s."), *WeakThis->LinkEvent.ToSoftObjectPath().ToString()); + } + }); + } +} + +void UFMODAudioLinkSettings::OnLoadCompleteCallback() +{ + TArray LoadedAssets; + LoadingHandle->GetLoadedAssets(LoadedAssets); + if (LoadedAssets.Num() > 0 && IsValid(LoadedAssets[0])) + { + LinkEventResolved = CastChecked(LoadedAssets[0]); + if (IsValid(LinkEventResolved)) + { + LinkEventResolved->AddToRoot(); + } + else + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkSettings::OnLoadCompleteCallback: Unable to resolve Link Event.")); + } + } + + GetCastProxy()->NotifyEventDataLoaded(); + LoadingHandle.Reset(); +} + +void UFMODAudioLinkSettings::FinishDestroy() +{ + if (IsValid(LinkEventResolved)) + { + LinkEventResolved->RemoveFromRoot(); + } + Super::FinishDestroy(); +} + +int32 UFMODAudioLinkSettings::GetReceivingBufferSizeInFrames() const +{ + if (IFMODStudioModule::IsAvailable()) + { + FMOD::System* CoreSystem; + FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Max); + if (StudioSystem) + { + StudioSystem->getCoreSystem(&CoreSystem); + if (CoreSystem) + { + unsigned int bufferLength = 0; + CoreSystem->getDSPBufferSize(&bufferLength, 0); + + return bufferLength; + } + } + } + + static const int32 SensibleDefaultSize = 512; + UE_LOG(LogFMODAudioLink, Warning, TEXT("FMODAudioLinkSettings: Failed to get FMOD settings for buffer size, defaulting to '%d'"), SensibleDefaultSize); + return SensibleDefaultSize; +} + +FName UFMODAudioLinkSettings::GetFactoryName() const +{ + return FFMODAudioLinkFactory::GetFactoryNameStatic(); +} \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSourcePushed.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSourcePushed.cpp new file mode 100644 index 00000000..9e86be78 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSourcePushed.cpp @@ -0,0 +1,116 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkSourcePushed.h" +#include "FMODAudioLinkSettings.h" +#include "FMODAudioLinkInputClient.h" +#include "FMODAudioLinkLog.h" + +#include "FMODEvent.h" + +FFMODAudioLinkSourcePushed::FFMODAudioLinkSourcePushed(const IAudioLinkFactory::FAudioLinkSourcePushedCreateArgs& InArgs, IAudioLinkFactory* InFactory) + : CreateArgs(InArgs) +{ + const FFMODAudioLinkSettingsProxy* FMODSettingsSP = static_cast(InArgs.Settings.Get()); + + IAudioLinkFactory::FPushedBufferListenerCreateParams Params; + Params.SizeOfBufferInFrames = InArgs.NumFramesPerBuffer; + Params.bShouldZeroBuffer = FMODSettingsSP->ShouldClearBufferOnReceipt(); + + ProducerSP = InFactory->CreatePushableBufferListener(Params); + ConsumerSP = MakeShared(ProducerSP, InArgs.Settings, InArgs.OwnerName); + + // Unreal uses samples for 'Channels x samples' and frames for 'samples' + int32 BufferSizeInChannelSamples = FMODSettingsSP->GetReceivingBufferSizeInFrames() * InArgs.NumChannels; + int32 ReserveSizeInChannelSamples = (float)BufferSizeInChannelSamples * FMODSettingsSP->GetProducerConsumerBufferRatio(); + int32 SilenceToAddToFirstBuffer = FMath::Min((float)BufferSizeInChannelSamples * FMODSettingsSP->GetInitialSilenceFillRatio(), ReserveSizeInChannelSamples); + + // Set circular buffer ahead of first buffer. + ProducerSP->Reserve(ReserveSizeInChannelSamples, SilenceToAddToFirstBuffer); + + UE_LOG(LogFMODAudioLink, Verbose, + TEXT("FFMODAudioLinkSourcePushed::Ctor() Name=%s, Producer=0x%p, Consumer=0x%p, p2c%%=%2.2f, PlayEvent=%s, TotalFramesForSource=%d, This=0x%p"), + *InArgs.OwnerName.GetPlainNameString(), ProducerSP.Get(), + ConsumerSP.Get(), FMODSettingsSP->GetProducerConsumerBufferRatio(), *FMODSettingsSP->GetLinkEvent()->GetName(), + CreateArgs.TotalNumFramesInSource, this); +} + +FFMODAudioLinkSourcePushed::~FFMODAudioLinkSourcePushed() +{ + UE_LOG(LogFMODAudioLink, Verbose, + TEXT("FFMODAudioLinkSourcePushed::Dtor() Name=%s, Producer=0x%p, Consumer=0x%p, RecievedFrames=%d/%d, This=0x%p"), + *CreateArgs.OwnerName.GetPlainNameString(), ProducerSP.Get(), ConsumerSP.Get(), NumFramesReceivedSoFar, + CreateArgs.TotalNumFramesInSource,this); + + if (ConsumerSP.IsValid()) + { + ConsumerSP->Stop(); + } +} + +void FFMODAudioLinkSourcePushed::OnNewBuffer(const FOnNewBufferParams& InArgs) +{ + UE_LOG(LogFMODAudioLink, VeryVerbose, + TEXT("FFMODAudioLinkSourcePushed::OnNewBuffer() Name=%s, Producer=0x%p, Consumer=0x%p, SourceID=%d, RecievedFrames=%d/%d, This=0x%p"), + *CreateArgs.OwnerName.GetPlainNameString(), ProducerSP.Get(), ConsumerSP.Get(), SourceId, NumFramesReceivedSoFar, + CreateArgs.TotalNumFramesInSource, this); + + NumFramesReceivedSoFar += CreateArgs.NumFramesPerBuffer; + + if (SourceId == INDEX_NONE) + { + IBufferedAudioOutput::FBufferFormat AudioFormat = {}; + AudioFormat.NumChannels = CreateArgs.NumChannels; + AudioFormat.NumSamplesPerBlock = CreateArgs.NumFramesPerBuffer; + AudioFormat.NumSamplesPerSec = CreateArgs.SampleRate; + ConsumerSP->SetFormat(&AudioFormat); + + SourceId = InArgs.SourceId; + ProducerSP->Start(nullptr); + ConsumerSP->Start(); + } + check(SourceId == InArgs.SourceId); + + IPushableAudioOutput* Pushable = ProducerSP->GetPushableInterface(); + if (ensure(Pushable)) + { + IPushableAudioOutput::FOnNewBufferParams Params; + Params.AudioData = InArgs.Buffer.GetData(); + Params.NumSamples = InArgs.Buffer.Num(); + Params.Id = InArgs.SourceId; + Params.NumChannels = CreateArgs.NumChannels; + Params.SampleRate = CreateArgs.SampleRate; + Pushable->PushNewBuffer(Params); + } +} + +void FFMODAudioLinkSourcePushed::OnSourceDone(const int32 InSourceId) +{ + UE_LOG(LogFMODAudioLink, Verbose, + TEXT("FFMODAudioLinkSourcePushed::OnSourceDone() Name=%s, Producer=0x%p, Consumer=0x%p, RecievedFrames=%d/%d, This=0x%p"), + *CreateArgs.OwnerName.GetPlainNameString(), ProducerSP.Get(), ConsumerSP.Get(), NumFramesReceivedSoFar, + CreateArgs.TotalNumFramesInSource, this); + + check(SourceId == InSourceId); + IPushableAudioOutput* Pushable = ProducerSP->GetPushableInterface(); + if (ensure(Pushable)) + { + Pushable->LastBuffer(SourceId); + } + SourceId = INDEX_NONE; +} + +void FFMODAudioLinkSourcePushed::OnSourceReleased(const int32 InSourceId) +{ + UE_LOG(LogFMODAudioLink, Verbose, + TEXT("FFMODAudioLinkSourcePushed::OnSourceReleased() Name=%s, Producer=0x%p, Consumer=0x%p, RecievedFrames=%d/%d, This=0x%p"), + *CreateArgs.OwnerName.GetPlainNameString(), ProducerSP.Get(), ConsumerSP.Get(), NumFramesReceivedSoFar, + CreateArgs.TotalNumFramesInSource,this); +} + +// Called by the AudioThread, not the AudioRenderThread +void FFMODAudioLinkSourcePushed::OnUpdateWorldState(const FOnUpdateWorldStateParams& InParams) +{ + FFMODAudioLinkInputClient::FWorldState UpdateParams; + UpdateParams.WorldTransform = InParams.WorldTransform; + ConsumerSP->UpdateWorldState(UpdateParams); +} \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSourcePushed.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSourcePushed.h new file mode 100644 index 00000000..7eae52a6 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSourcePushed.h @@ -0,0 +1,23 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once +#include "FMODAudioLinkInputClient.h" + +#include "IAudioLink.h" +#include "IBufferedAudioOutput.h" + +struct FFMODAudioLinkSourcePushed : IAudioLinkSourcePushed +{ + int32 SourceId = INDEX_NONE; + int32 NumFramesReceivedSoFar = INDEX_NONE; + FSharedBufferedOutputPtr ProducerSP; + FSharedFMODAudioLinkInputClientPtr ConsumerSP; + IAudioLinkFactory::FAudioLinkSourcePushedCreateArgs CreateArgs; + + FFMODAudioLinkSourcePushed(const IAudioLinkFactory::FAudioLinkSourcePushedCreateArgs& InArgs, IAudioLinkFactory* InFactory); + virtual ~FFMODAudioLinkSourcePushed() override; + void OnNewBuffer(const FOnNewBufferParams& InArgs) override; + void OnSourceDone(const int32 InSourceId) override; + void OnSourceReleased(const int32 InSourceId) override; + void OnUpdateWorldState(const FOnUpdateWorldStateParams& InParams) override; +}; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSynchronizer.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSynchronizer.cpp new file mode 100644 index 00000000..dac735a3 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSynchronizer.cpp @@ -0,0 +1,141 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkSynchronizer.h" +#include "fmod_studio.hpp" +#include "FMODStudioModule.h" +#include "FMODAudioLinkLog.h" + +#include "AudioDeviceManager.h" + +FMOD_RESULT F_CALLBACK MixCallback(FMOD_SYSTEM* system, FMOD_SYSTEM_CALLBACK_TYPE type, void* commanddata1, void* commanddata2, void* userdata) +{ + FFMODAudioLinkSynchronizer *Synchro = static_cast(userdata); + if (Synchro) + { + FMOD::System *CoreSystem = (FMOD::System*)system; + + FMOD::ChannelGroup *MasterGroup = NULL; + CoreSystem->getMasterChannelGroup(&MasterGroup); + uint64 dspClock = 0; + MasterGroup->getDSPClock(&dspClock, 0); + + switch (type) + { + case FMOD_SYSTEM_CALLBACK_POSTMIX: + Synchro->ExecuteEndRender(dspClock); + break; + default: + break; + } + } + return FMOD_OK; +} + +FFMODAudioLinkSynchronizer::FFMODAudioLinkSynchronizer() +{ + Bind(); +} + +FFMODAudioLinkSynchronizer::~FFMODAudioLinkSynchronizer() +{ + Unbind(); +} + +void FFMODAudioLinkSynchronizer::ExecuteEndRender(uint64 dspClock) +{ + FScopeLock Lock(&CallbackLock); + FOnRenderParams Params; + Params.BufferTickID = dspClock; + Params.NumFrames = dspBufferSize; + OnEndRender.Broadcast(Params); +} + +void FFMODAudioLinkSynchronizer::ExecuteOpenStream() +{ + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkSynchronizer::ExecuteOpenStream: Opening stream between Unreal and FMOD.")); + + int samplerate = 0, numchannels = 0; + FMOD_SPEAKERMODE speakerMode; + CoreSystem->getDSPBufferSize(&dspBufferSize, 0); + CoreSystem->getSoftwareFormat(&samplerate, &speakerMode, 0); + CoreSystem->getSpeakerModeChannels(speakerMode, &numchannels); + + FOnOpenStreamParams Params; + Params.NumChannels = numchannels; + Params.SampleRate = samplerate; + Params.NumFrames = dspBufferSize; + Params.Name = TEXT("AudioLink for FMOD"); + OnOpenStream.Broadcast(Params); +} + +void FFMODAudioLinkSynchronizer::ExecuteCloseStream() +{ + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkSynchronizer::ExecuteCloseStream: Closing stream between Unreal and FMOD.")); + + OnCloseStream.Broadcast(); +} + +void FFMODAudioLinkSynchronizer::ExecuteSuspend() +{ + OnSuspend.Broadcast(); +} + +void FFMODAudioLinkSynchronizer::ExecuteResume() +{ + OnResume.Broadcast(); +} + +void FFMODAudioLinkSynchronizer::Bind() +{ + if (UNLIKELY(bIsBound)) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkSynchronizer::Bind: Already bound.")); + return; + } + + if (UNLIKELY(!IFMODStudioModule::Get().IsAvailable())) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAduioLinkSynchronizer::Bind: FMODStudioModule not available.")); + return; + } + + auto* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime); + if (!StudioSystem) + { + StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Auditioning); + } + if (UNLIKELY(!StudioSystem)) + { + UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkSynchronizer::ExecuteOpenStream: No Studio System.")); + return; + } + + StudioSystem->getCoreSystem(&CoreSystem); + + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkSynchronizer::Bind: Binding System Callbacks.")); + + CoreSystem->setUserData(this); + CoreSystem->setCallback(MixCallback, FMOD_SYSTEM_CALLBACK_POSTMIX); + + ExecuteOpenStream(); + + bIsBound = true; +} + +void FFMODAudioLinkSynchronizer::Unbind() +{ + if (UNLIKELY(!bIsBound)) + { + return; + } + if (UNLIKELY(!CoreSystem)) + { + return; + } + + UE_LOG(LogFMODAudioLink, Verbose, TEXT("FFMODAudioLinkSynchronizer::Bind: Unbinding.")); + CoreSystem->setCallback(NULL, 0); + bIsBound = false; + + ExecuteCloseStream(); +} diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSynchronizer.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSynchronizer.h new file mode 100644 index 00000000..29f12578 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSynchronizer.h @@ -0,0 +1,58 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "IAudioLink.h" +#include "Misc/ScopeRWLock.h" +#include "fmod.hpp" + +struct FFMODAudioLinkSynchronizer : IAudioLinkSynchronizer, TSharedFromThis +{ + IAudioLinkSynchronizer::FOnSuspend OnSuspend; + IAudioLinkSynchronizer::FOnResume OnResume; + IAudioLinkSynchronizer::FOnOpenStream OnOpenStream; + IAudioLinkSynchronizer::FOnCloseStream OnCloseStream; + IAudioLinkSynchronizer::FOnBeginRender OnBeginRender; + IAudioLinkSynchronizer::FOnEndRender OnEndRender; + + FRWLock RwLock; + FCriticalSection CallbackLock; + FMOD::System* CoreSystem; + + bool bIsBound{ false }; + unsigned int dspBufferSize; + + FFMODAudioLinkSynchronizer(); + ~FFMODAudioLinkSynchronizer() override; + + void ExecuteEndRender(uint64 dspClock); + void ExecuteOpenStream(); + void ExecuteCloseStream(); + void ExecuteSuspend(); + void ExecuteResume(); + void Bind(); + void Unbind(); + + #define MAKE_DELEGATE_FUNC(X)\ + FDelegateHandle Register##X##Delegate(const FOn##X::FDelegate& InDelegate) override\ + {\ + FWriteScopeLock WriteLock(RwLock);\ + return On##X.Add(InDelegate);\ + }\ + bool Remove##X##Delegate(const FDelegateHandle& InHandle) override\ + {\ + FWriteScopeLock WriteLock(RwLock);\ + return On##X.Remove(InHandle);\ + } + + MAKE_DELEGATE_FUNC(Suspend) + MAKE_DELEGATE_FUNC(Resume) + MAKE_DELEGATE_FUNC(OpenStream) + MAKE_DELEGATE_FUNC(CloseStream) + MAKE_DELEGATE_FUNC(BeginRender) //Use to sync UE and FMOD + MAKE_DELEGATE_FUNC(EndRender) //Use to sync UE and FMOD + + #undef MAKE_DELEGATE_FUNC + + friend FMOD_RESULT F_CALLBACK MixCallback(FMOD_SYSTEM* system, FMOD_SYSTEM_CALLBACK_TYPE type, void* commanddata1, void* commanddata2, void* userdata); +}; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkComponent.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkComponent.h new file mode 100644 index 00000000..79f8ebaa --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkComponent.h @@ -0,0 +1,47 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "FMODAudioLinkSettings.h" +#include "IAudioLink.h" +#include "IAudioLinkBlueprintInterface.h" + +class UAudioComponent; + +#include "FMODAudioLinkComponent.generated.h" + +UCLASS(ClassGroup = (Audio, Common), HideCategories = (Object, ActorComponent, Physics, Rendering, Mobility, LOD), + ShowCategories = Trigger, meta = (BlueprintSpawnableComponent)) +class UFMODAudioLinkComponent : public USceneComponent, public IAudioLinkBlueprintInterface +{ + GENERATED_BODY() + +public: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AudioLink") + TObjectPtr Settings; + + /** The sound to be played */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sound) + TObjectPtr Sound; + +protected: + //~ Begin IAudioLinkInterface + virtual void SetLinkSound(USoundBase* NewSound) override; + virtual void PlayLink(float StartTime = 0.0f) override; + virtual void StopLink() override; + virtual bool IsLinkPlaying() const override; + //~ End IAudioLinkInterface + + //~ Begin ActorComponent Interface. + virtual void OnRegister() override; + virtual void OnUnregister() override; + //~ End ActorComponent Interface. + + void CreateAudioComponent(); + + UPROPERTY(Transient) + TObjectPtr AudioComponent; + + void CreateLink(); + TUniquePtr LinkInstance; +}; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkLog.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkLog.h new file mode 100644 index 00000000..e524c292 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkLog.h @@ -0,0 +1,8 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "Stats/Stats.h" +#include "Logging/LogMacros.h" + +FMODSTUDIO_API DECLARE_LOG_CATEGORY_EXTERN(LogFMODAudioLink, Log, All); diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkModule.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkModule.h new file mode 100644 index 00000000..92f28d22 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkModule.h @@ -0,0 +1,21 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "Modules/ModuleInterface.h" +#include "Modules/ModuleManager.h" + +#include "FMODAudioLinkFactory.h" + +class FFMODAudioLinkModule +{ +public: + FFMODAudioLinkModule() + { + Factory = MakeUnique(); + } + ~FFMODAudioLinkModule() + { + Factory.Reset(); + } +private: + TUniquePtr Factory; +}; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkSettings.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkSettings.h new file mode 100644 index 00000000..365fb4fa --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLink/Public/FMODAudioLinkSettings.h @@ -0,0 +1,98 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "AudioLinkSettingsAbstract.h" +#include "Engine/StreamableManager.h" + +#include "FMODAudioLinkSettings.generated.h" + +class UFMODAudioLinkSettings; +class UFMODEvent; + +class FFMODAudioLinkSettingsProxy : public IAudioLinkSettingsProxy +{ +public: + FFMODAudioLinkSettingsProxy(const UFMODAudioLinkSettings&); + virtual ~FFMODAudioLinkSettingsProxy() = default; + + const TSoftObjectPtr& GetLinkEvent() const { return FMODLinkEvent; } + int32 GetReceivingBufferSizeInFrames() const { return ReceivingBufferSizeInFrames; } + bool ShouldClearBufferOnReceipt() const { return bShouldZeroBuffer; } + float GetProducerConsumerBufferRatio() const { return ProducerToConsumerBufferRatio; } + float GetInitialSilenceFillRatio() const { return InitialSilenceFillRatio; } + + void Update(const UFMODAudioLinkSettings&); + + bool IsEventDataLoaded() const; + void RegisterCallback(const TFunction& InCallback, FDelegateHandle& OutHandle); + bool UnRegisterCallback(const FDelegateHandle& InDelegate); + +protected: + void NotifyEventDataLoaded(); + +private: +#if WITH_EDITOR + void RefreshFromSettings(UAudioLinkSettingsAbstract* InSettings, FPropertyChangedEvent& InPropertyChangedEvent) override; +#endif //WITH_EDITOR + + FSimpleMulticastDelegate OnEventLoadedDelegate; + FCriticalSection CS; + friend class UFMODAudioLinkSettings; + + TSoftObjectPtr FMODLinkEvent; + int32 ReceivingBufferSizeInFrames; + bool bShouldZeroBuffer = true; + bool bIsEventDataLoaded = false; + float ProducerToConsumerBufferRatio = 2.0f; + float InitialSilenceFillRatio = 1.0f; +}; + +using FSharedFMODAudioLinkSettingsProxyPtr = TSharedPtr; + +UCLASS(config = Engine, defaultconfig) +class FMODSTUDIO_API UFMODAudioLinkSettings : public UAudioLinkSettingsAbstract +{ + GENERATED_BODY() + + UPROPERTY(Config, EditAnywhere, Category = default) + TSoftObjectPtr LinkEvent; + + /** If this is set, the receiving code will clear the buffer after it's read, so it's not rendered by Unreal. Only applies if running both renderers at once. */ + UPROPERTY(Config, EditAnywhere, Category = default) + bool bShouldClearBufferOnReceipt = true; + + /** This is the ratio of producer to consumer buffer size, 2.0 means its twice as big as the consumer buffer. */ + UPROPERTY(Config, EditAnywhere, Category = default) + float ProducerToConsumerBufferRatio = 2.0f; + + /** Ratio of initial buffer to fill with silence ahead of consumption. Adjusting this can resolve starvation at the cost of added latency. */ + UPROPERTY(Config, EditAnywhere, Category = default) + float InitialSilenceFillRatio = 1.0f; + + void RequestLoadLinkEvent() const; + +protected: + TSharedPtr LoadingHandle; + + /** Once the SoftObjectReference has been resolved, attach the reference here so it's owned. */ + UPROPERTY(Transient) + TObjectPtr LinkEventResolved; + + void PostLoad() override; // Only occurs at editor startup and game startup, not PIE + void OnLoadCompleteCallback(); + void FinishDestroy() override; + mutable bool bLoadRequested = false; + + friend class FFMODAudioLinkSettingsProxy; + + int32 GetReceivingBufferSizeInFrames() const; + + UAudioLinkSettingsAbstract::FSharedSettingsProxyPtr MakeProxy() const override + { + return UAudioLinkSettingsAbstract::FSharedSettingsProxyPtr(new FFMODAudioLinkSettingsProxy{ *this }); + } + + FName GetFactoryName() const override; +}; + diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/FMODAudioLinkEditor.Build.cs b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/FMODAudioLinkEditor.Build.cs new file mode 100644 index 00000000..aaf23bd3 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/FMODAudioLinkEditor.Build.cs @@ -0,0 +1,15 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +using UnrealBuildTool; +using System; + +public struct FMODAudioLinkEditor +{ + public static void Apply(UnrealBuildTool.Rules.FMODStudio FMODModule, ReadOnlyTargetRules Target) + { + if (Target.bBuildEditor) + { + FMODModule.AddModule("FMODAudioLinkEditor", false); + } + } +} \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Private/FMODAudioLinkSettingsFactory.cpp b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Private/FMODAudioLinkSettingsFactory.cpp new file mode 100644 index 00000000..e1aaec11 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Private/FMODAudioLinkSettingsFactory.cpp @@ -0,0 +1,60 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "FMODAudioLinkSettingsFactory.h" +#include "FMODAudioLinkSettings.h" +#include "AssetTypeCategories.h" +#include "UObject/ObjectMacros.h" +#include "UObject/Object.h" + +#define LOCTEXT_NAMESPACE "AssetTypeActions" + +FText FAssetTypeActions_FMODAudioLinkSettings::GetName() const +{ + return LOCTEXT("AssetTypeActions_FMODAudioLinkSettings", "FMOD AudioLink Settings"); +} + +FColor FAssetTypeActions_FMODAudioLinkSettings::GetTypeColor() const +{ + return FColor(100, 100, 100); +} + +const TArray& FAssetTypeActions_FMODAudioLinkSettings::GetSubMenus() const +{ + static const TArray SubMenus + { + LOCTEXT("AssetAudioLinkSubMenu", "AudioLink") + }; + + return SubMenus; +} + +UClass* FAssetTypeActions_FMODAudioLinkSettings::GetSupportedClass() const +{ + return UFMODAudioLinkSettings::StaticClass(); +} + +uint32 FAssetTypeActions_FMODAudioLinkSettings::GetCategories() +{ + return EAssetTypeCategories::Sounds; +} + +UFMODAudioLinkSettingsFactory::UFMODAudioLinkSettingsFactory(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + SupportedClass = UFMODAudioLinkSettings::StaticClass(); + + bCreateNew = true; + bEditorImport = true; + bEditAfterNew = true; +} + +UObject* UFMODAudioLinkSettingsFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) +{ + return NewObject(InParent, Name, Flags); +} + +uint32 UFMODAudioLinkSettingsFactory::GetMenuCategories() const +{ + return EAssetTypeCategories::Sounds; +} +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Private/FMODAudioLinkSettingsFactory.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Private/FMODAudioLinkSettingsFactory.h new file mode 100644 index 00000000..2ff5d6c7 --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Private/FMODAudioLinkSettingsFactory.h @@ -0,0 +1,30 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#pragma once + +#include "Factories/Factory.h" +#include "AssetTypeActions_Base.h" +#include "AssetToolsModule.h" + +#include "FMODAudioLinkSettingsFactory.generated.h" + +UCLASS(hidecategories = Object, MinimalAPI) +class UFMODAudioLinkSettingsFactory : public UFactory +{ + GENERATED_UCLASS_BODY() + + virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, + FFeedbackContext* Warn) override; + + virtual uint32 GetMenuCategories() const override; +}; + +class FAssetTypeActions_FMODAudioLinkSettings : public FAssetTypeActions_Base +{ +public: + virtual FText GetName() const override; + virtual FColor GetTypeColor() const override; + virtual const TArray& GetSubMenus() const override; + virtual UClass* GetSupportedClass() const override; + virtual uint32 GetCategories() override; +}; \ No newline at end of file diff --git a/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Public/FMODAudioLinkEditorModule.h b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Public/FMODAudioLinkEditorModule.h new file mode 100644 index 00000000..1b98c05d --- /dev/null +++ b/hwanyoung2/Plugins/FMODStudio/Source/FMODAudioLinkEditor/Public/FMODAudioLinkEditorModule.h @@ -0,0 +1,39 @@ +// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024. + +#include "Modules/ModuleInterface.h" +#include "FMODAudioLinkSettingsFactory.h" +#include "FMODAudioLinkSettings.h" +#include "ISettingsModule.h" + +class FAssetTypeActions_FMODAudioLinkSettings; + +class FFMODAudioLinkEditorModule +{ +public: + FFMODAudioLinkEditorModule() + { + // Register asset types + IAssetTools& AssetTools = FAssetToolsModule::GetModule().Get(); + { + AssetActions = MakeShared(); + AssetTools.RegisterAssetTypeActions(AssetActions.ToSharedRef()); + + if (ISettingsModule* SettingsModule = FModuleManager::Get().GetModulePtr("Settings")) + { + SettingsModule->RegisterSettings("Project", "Plugins", "FMOD AudioLink", NSLOCTEXT("FMODAudioLink", "FMOD AudioLink", "FMOD AudioLink"), + NSLOCTEXT("FMODAudioLink", "Configure AudioLink for FMOD Settings", "Configure AudioLink for FMOD Settings"), GetMutableDefault()); + } + } + } + ~FFMODAudioLinkEditorModule() + { + if (FAssetToolsModule::IsModuleLoaded()) + { + IAssetTools& AssetTools = FAssetToolsModule::GetModule().Get(); + AssetTools.UnregisterAssetTypeActions(AssetActions.ToSharedRef()); + } + AssetActions.Reset(); + } +private: + TSharedPtr AssetActions; +}; \ No newline at end of file