50 Commits

Author SHA1 Message Date
Brandon Thomas 2ecfcee44d Running older project; tired of editor complaints 2021-03-06 19:03:12 -05:00
Brandon Thomas a3bb87a497 Use in conjunction w/ RuntimeFilesDownloader causes symbol redefinition
I've renamed the conflicting symbols so I can import both libraries
publicly without crazy wrapper/module hijinks.
2021-03-06 04:01:29 -05:00
Georgy Treshchev 3ff7ed6fba Global update: full working with compressed formats, pre-importing audio files and much more. Check the updated documentation. 2021-03-05 20:41:25 +01:00
Georgy Treshchev f4d3c0959c Global update: full working with compressed formats, pre-importing audio files and much more. Check the updated documentation. 2021-03-05 08:32:41 +01:00
Georgy Treshchev 9a9dbacf39 Global update: full working with compressed formats, pre-importing audio files and much more. Check the updated documentation. 2021-03-04 19:27:48 +01:00
Georgy Treshchev 7a4f419d53 Global update: full working with compressed formats, pre-importing audio files and much more. Check the updated documentation. 2021-03-04 17:06:21 +01:00
Georgy Treshchev ce9fa5692a Solving a minor wave padding issue 2021-02-24 08:29:18 +01:00
Georgy Treshchev 4ebebe268f Updating dr_libs libraries 2021-02-20 10:23:45 +01:00
Georgy Treshchev 4cbafaef81 Correct filling of LPCM data, working with compressed formats 2021-02-20 08:41:37 +01:00
Georgy Treshchev c0943e2852 Encoding changes, UNIX/Mac optimising 2021-02-19 10:08:21 +01:00
Respirant 23fd2c3238 Change date 2021-02-16 21:19:33 +01:00
Respirant 1051ab4265 Character encoding changes 2021-02-16 20:32:35 +01:00
Respirant 745f56da7b Character encoding changes 2021-02-16 16:41:46 +01:00
Respirant ee2088922f Changing ANSI encoding to UTF8 2021-02-08 15:19:03 +01:00
Respirant 826de9c404 minor memory free fix 2021-02-04 14:39:48 +01:00
Respirant 0b591c3e30 minor design changes 2021-01-28 20:15:22 +01:00
Respirant 203af789c5 minor design changes 2021-01-28 09:01:59 +01:00
Respirant dd7fbcd5c6 no changes 2021-01-12 10:12:20 +03:00
Respirant 6165fe1740 function to export soundwave to wav file 2021-01-10 17:52:30 +03:00
Respirant b761ae46dd function to export soundwave to wav file 2021-01-10 17:00:01 +03:00
Respirant 14469d959f function to export soundwave to wav file 2021-01-10 16:59:27 +03:00
Respirant eedf8e91b3 minor sound destrying change 2021-01-05 15:38:45 +03:00
Respirant c26ad4387a big update: callback dispatchers, memory leak fixes and more 2021-01-02 19:01:53 +03:00
Respirant b6a02676eb big update: callback dispatchers, memory leak fixes and more 2021-01-02 10:42:23 +03:00
Respirant 930b7fe803 big update: callback dispatchers, memory leak fixes and more 2021-01-02 10:41:44 +03:00
Respirant 261aa62fd1 big update: callback dispatchers, memory leak fixes and more 2021-01-02 10:36:16 +03:00
Respirant 0aaad7b78d big update: callback dispatchers, memory leak fixes and more 2021-01-02 10:30:46 +03:00
Respirant 68ce63252b big update: callback dispatchers, memory leak fixes and more 2021-01-02 10:22:38 +03:00
Respirant 573dd86a5c big update: callback dispatchers, memory leak fixes and more 2021-01-02 10:02:00 +03:00
Respirant 5385f7d1f4 big update: callback dispatchers, memory leak fixes and more 2021-01-02 09:57:30 +03:00
Respirant f0cc227a33 big update: callback dispatchers, memory leak fixes and more 2021-01-02 09:53:35 +03:00
Respirant d543b80f2e change destroying sound object 2020-12-29 17:32:26 +03:00
Respirant b68876da8b new node image 2020-12-29 17:30:47 +03:00
Respirant 9ccdc0ede6 new node image 2020-12-29 14:06:22 +03:00
Respirant 6cb272b840 function to destroy audio and change memory deallocation 2020-12-29 14:01:16 +03:00
Respirant 117f3ed389 minor including changes 2020-12-24 16:34:23 +03:00
Respirant f3cd038ef2 minor namespace changes 2020-12-20 16:42:18 +01:00
Respirant 85c71cc94b Adding a link to the Marketplace 2020-12-17 15:11:16 +01:00
Respirant 0dfe7afca5 Adding a link to the Marketplace 2020-12-17 15:11:02 +01:00
Respirant d2f7f9f0f6 Adding a link to the Marketplace 2020-12-17 15:10:31 +01:00
Respirant 68f4ba40f6 Change with the including of libraries and copyright 2020-12-15 16:06:34 +01:00
Respirant c3eb02e809 Change with the including of libraries and copyright 2020-12-13 14:44:32 +01:00
Respirant 72b65b574b Change with the including of libraries and copyright 2020-12-13 10:10:31 +01:00
Respirant daee6c62fc Change with the including of libraries and copyright 2020-12-13 09:51:21 +01:00
Respirant f283f18041 Minor format check fix 2020-12-12 12:51:16 +01:00
Respirant 2dc317e98e Minor include and readme changes 2020-12-12 08:31:55 +01:00
Respirant a88254cae3 change readme 2020-12-11 15:52:53 +01:00
Respirant b0339738e8 change readme 2020-12-11 15:51:28 +01:00
Respirant 111f3236f7 change readme 2020-12-11 14:32:38 +01:00
Respirant 54559198f0 add plugin data 2020-12-11 14:23:40 +01:00
41 changed files with 166 additions and 413 deletions
-87
View File
@@ -1,87 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28315.86
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Engine", "Engine", "{94A6C6F3-99B3-346E-9557-ABF9D4064DBD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Games", "Games", "{8E2F6A87-1826-34F4-940C-CC23A48F9FE4}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AudioImporterTest", "Intermediate\ProjectFiles\AudioImporterTest.vcxproj", "{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UE4", "Intermediate\ProjectFiles\UE4.vcxproj", "{41DC5BBD-56BC-4896-8D8D-5C13F4636397}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Visualizers", "Visualizers", "{1CCEC849-CC72-4C59-8C36-2F7C38706D4C}"
ProjectSection(SolutionItems) = preProject
D:\UE4\UE_4.26\Engine\Extras\VisualStudioDebugging\UE4.natvis = D:\UE4\UE_4.26\Engine\Extras\VisualStudioDebugging\UE4.natvis
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
DebugGame Editor|Android = DebugGame Editor|Android
DebugGame Editor|Win32 = DebugGame Editor|Win32
DebugGame Editor|Win64 = DebugGame Editor|Win64
DebugGame|Android = DebugGame|Android
DebugGame|Win32 = DebugGame|Win32
DebugGame|Win64 = DebugGame|Win64
Development Editor|Android = Development Editor|Android
Development Editor|Win32 = Development Editor|Win32
Development Editor|Win64 = Development Editor|Win64
Development|Android = Development|Android
Development|Win32 = Development|Win32
Development|Win64 = Development|Win64
Shipping|Android = Shipping|Android
Shipping|Win32 = Shipping|Win32
Shipping|Win64 = Shipping|Win64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame Editor|Android.ActiveCfg = Invalid|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame Editor|Win32.ActiveCfg = Invalid|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame Editor|Win64.ActiveCfg = DebugGame_Editor|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame Editor|Win64.Build.0 = DebugGame_Editor|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame|Android.ActiveCfg = Android_DebugGame|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame|Android.Build.0 = Android_DebugGame|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame|Win32.ActiveCfg = DebugGame|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame|Win32.Build.0 = DebugGame|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame|Win64.ActiveCfg = DebugGame|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.DebugGame|Win64.Build.0 = DebugGame|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development Editor|Android.ActiveCfg = Invalid|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development Editor|Win32.ActiveCfg = Invalid|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development Editor|Win64.ActiveCfg = Development_Editor|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development Editor|Win64.Build.0 = Development_Editor|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development|Android.ActiveCfg = Android_Development|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development|Android.Build.0 = Android_Development|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development|Win32.ActiveCfg = Development|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development|Win32.Build.0 = Development|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development|Win64.ActiveCfg = Development|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Development|Win64.Build.0 = Development|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Shipping|Android.ActiveCfg = Android_Shipping|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Shipping|Android.Build.0 = Android_Shipping|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Shipping|Win32.ActiveCfg = Shipping|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Shipping|Win32.Build.0 = Shipping|Win32
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Shipping|Win64.ActiveCfg = Shipping|x64
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F}.Shipping|Win64.Build.0 = Shipping|x64
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.DebugGame Editor|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.DebugGame Editor|Win32.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.DebugGame Editor|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.DebugGame|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.DebugGame|Win32.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.DebugGame|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Development Editor|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Development Editor|Win32.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Development Editor|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Development|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Development|Win32.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Development|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Shipping|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Shipping|Win32.ActiveCfg = BuiltWithUnrealBuildTool|Win32
{41DC5BBD-56BC-4896-8D8D-5C13F4636397}.Shipping|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{41DC5BBD-56BC-4896-8D8D-5C13F4636397} = {94A6C6F3-99B3-346E-9557-ABF9D4064DBD}
{05EAA636-D8E0-4E88-B98A-0396DD9D9A1F} = {8E2F6A87-1826-34F4-940C-CC23A48F9FE4}
EndGlobalSection
EndGlobal
-59
View File
@@ -1,59 +0,0 @@
{
"FileVersion": 3,
"EngineAssociation": "4.26",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "AudioImporterTest",
"Type": "Runtime",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "RuntimeAudioImporter",
"Enabled": true,
"MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/81fd278e318e4235a028d3fdf46bf036"
},
{
"Name": "AndroidMedia",
"Enabled": false
},
{
"Name": "AndroidMoviePlayer",
"Enabled": false
},
{
"Name": "AvfMedia",
"Enabled": false
},
{
"Name": "MediaCompositing",
"Enabled": false
},
{
"Name": "ImgMedia",
"Enabled": false
},
{
"Name": "WindowsMoviePlayer",
"Enabled": false
},
{
"Name": "MediaPlayerEditor",
"Enabled": false
},
{
"Name": "MagicLeapMedia",
"Enabled": false,
"SupportedTargetPlatforms": [
"Lumin"
]
},
{
"Name": "WmfMedia",
"Enabled": false
}
]
}
View File
-146
View File
@@ -1,146 +0,0 @@
[/Script/EngineSettings.GameMapsSettings]
EditorStartupMap=/Game/MainLevelTest.MainLevelTest
LocalMapOptions=
TransitionMap=None
bUseSplitscreen=False
TwoPlayerSplitscreenLayout=Horizontal
ThreePlayerSplitscreenLayout=FavorTop
FourPlayerSplitscreenLayout=Grid
bOffsetPlayerGamepadIds=False
GameInstanceClass=/Script/Engine.GameInstance
GameDefaultMap=/Game/MainLevelTest.MainLevelTest
ServerDefaultMap=/Engine/Maps/Entry.Entry
GlobalDefaultGameMode=/Script/Engine.GameModeBase
GlobalDefaultServerGameMode=None
[/Script/HardwareTargeting.HardwareTargetingSettings]
TargetedHardwareClass=Mobile
AppliedTargetedHardwareClass=Mobile
DefaultGraphicsPerformance=Maximum
AppliedDefaultGraphicsPerformance=Maximum
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/AudioImporterTest")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/AudioImporterTest")
+ActiveClassRedirects=(OldClassName="TP_BlankGameModeBase",NewClassName="AudioImporterTestGameModeBase")
[/Script/Engine.RendererSettings]
r.Mobile.DisableVertexFog=True
r.Shadow.CSM.MaxMobileCascades=2
r.MobileMSAA=1
r.Mobile.AllowDitheredLODTransition=False
r.Mobile.AllowSoftwareOcclusion=False
r.Mobile.VirtualTextures=False
r.DiscardUnusedQuality=False
r.AllowOcclusionQueries=True
r.MinScreenRadiusForLights=0.030000
r.MinScreenRadiusForDepthPrepass=0.030000
r.MinScreenRadiusForCSMDepth=0.010000
r.PrecomputedVisibilityWarning=False
r.TextureStreaming=True
Compat.UseDXT5NormalMaps=False
r.VirtualTextures=False
r.VirtualTexturedLightmaps=False
r.VT.TileSize=128
r.VT.TileBorderSize=4
r.vt.FeedbackFactor=16
r.VT.EnableCompressZlib=True
r.VT.EnableCompressCrunch=False
r.ClearCoatNormal=False
r.ReflectionCaptureResolution=128
r.Mobile.ReflectionCaptureCompression=False
r.ReflectionEnvironmentLightmapMixBasedOnRoughness=True
r.ForwardShading=False
r.VertexFoggingForOpaque=True
r.AllowStaticLighting=True
r.NormalMapsForStaticLighting=False
r.GenerateMeshDistanceFields=False
r.DistanceFieldBuild.EightBit=False
r.GenerateLandscapeGIData=False
r.DistanceFieldBuild.Compress=False
r.TessellationAdaptivePixelsPerTriangle=48.000000
r.SeparateTranslucency=False
r.TranslucentSortPolicy=0
TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000)
r.CustomDepth=1
r.CustomDepthTemporalAAJitter=True
r.PostProcessing.PropagateAlpha=0
r.DefaultFeature.Bloom=True
r.DefaultFeature.AmbientOcclusion=False
r.DefaultFeature.AmbientOcclusionStaticFraction=True
r.DefaultFeature.AutoExposure=False
r.DefaultFeature.AutoExposure.Method=0
r.DefaultFeature.AutoExposure.Bias=1.000000
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=False
r.UsePreExposure=True
r.EyeAdaptation.EditorOnly=False
r.DefaultFeature.MotionBlur=False
r.DefaultFeature.LensFlare=False
r.TemporalAA.Upsampling=False
r.SSGI.Enable=False
r.DefaultFeature.AntiAliasing=0
r.DefaultFeature.LightUnits=1
r.DefaultBackBufferPixelFormat=4
r.Shadow.UnbuiltPreviewInGame=True
r.StencilForLODDither=False
r.EarlyZPass=3
r.EarlyZPassOnlyMaterialMasking=False
r.DBuffer=True
r.ClearSceneMethod=1
r.BasePassOutputsVelocity=False
r.VertexDeformationOutputsVelocity=False
r.SelectiveBasePassOutputs=False
bDefaultParticleCutouts=False
fx.GPUSimulationTextureSizeX=1024
fx.GPUSimulationTextureSizeY=1024
r.AllowGlobalClipPlane=False
r.GBufferFormat=1
r.MorphTarget.Mode=True
r.GPUCrashDebugging=False
vr.InstancedStereo=False
r.MobileHDR=True
vr.MobileMultiView=False
r.Mobile.UseHWsRGBEncoding=False
vr.RoundRobinOcclusion=False
vr.ODSCapture=False
r.MeshStreaming=False
r.WireframeCullThreshold=5.000000
r.RayTracing=False
r.RayTracing.UseTextureLod=False
r.SupportStationarySkylight=True
r.SupportLowQualityLightmaps=True
r.SupportPointLightWholeSceneShadows=True
r.SupportAtmosphericFog=True
r.SupportSkyAtmosphere=True
r.SupportSkyAtmosphereAffectsHeightFog=False
r.SkinCache.CompileShaders=False
r.SkinCache.DefaultBehavior=1
r.SkinCache.SceneMemoryLimitInMB=128.000000
r.Mobile.EnableStaticAndCSMShadowReceivers=True
r.Mobile.EnableMovableLightCSMShaderCulling=True
r.Mobile.AllowDistanceFieldShadows=True
r.Mobile.AllowMovableDirectionalLights=True
r.MobileNumDynamicPointLights=4
r.MobileDynamicPointLightsUseStaticBranch=True
r.Mobile.EnableMovableSpotlights=False
r.Mobile.EnableMovableSpotlightsShadow=False
r.GPUSkin.Support16BitBoneIndex=False
r.GPUSkin.Limit2BoneInfluences=False
r.SupportDepthOnlyIndexBuffers=True
r.SupportReversedIndexBuffers=True
r.LightPropagationVolume=False
r.Mobile.AmbientOcclusion=False
r.GPUSkin.UnlimitedBoneInfluences=False
r.GPUSkin.UnlimitedBoneInfluencesThreshold=8
r.Mobile.PlanarReflectionMode=0
bStreamSkeletalMeshLODs=(Default=False,PerPlatform=())
bDiscardSkeletalMeshOptionalLODs=(Default=False,PerPlatform=())
VisualizeCalibrationColorMaterialPath=None
VisualizeCalibrationCustomMaterialPath=None
VisualizeCalibrationGrayscaleMaterialPath=None
[/Script/Slate.SlateSettings]
bExplicitCanvasChildZOrder=True
-3
View File
@@ -1,3 +0,0 @@
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=E5F8CB474977D102BC3EC9B00A5B7D1C
Binary file not shown.
Binary file not shown.
Binary file not shown.
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Respirant
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+27
View File
@@ -0,0 +1,27 @@
![GitHub](https://img.shields.io/github/license/Respirant/RuntimeAudioImporter)
# RuntimeAudioImporter
Open-source plugin to import audio files of MP3, WAV and FLAC formats into the game at runtime. It's easy to use in both C++ and Blueprints.
Plugin does not require any static libraries and external dependencies.
![Runtime Audio Importer Unreal Engine Plugin Logo](image/runtimeaudioimporter.png "RuntimeAudioImporter Unreal Engine Plugin Logo")
## Features
- Low library size (≈ 1 mb)
- Fast transcoding speed (≈ 200-900 ms)
- Supported for major audio formats: MP3, WAV and FLAC
- Automatic detection of audio format (by extension)
- System for obtaining transcoding status for error detection
- No any static libraries and external dependencies
- Support for all available devices (tested on Windows and Android, but there are no restrictions to work on other devices)
## Documentation
Click on the following link to view the documentation - https://unreal.blog/runtime-audio-importer
## Additional information
The in-memory audio transcoding operation is based on [dr_libs](https://github.com/mackron/dr_libs).
## Legal info
Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere.
Unreal® Engine, Copyright 1998 – 2021, Epic Games, Inc. All rights reserved.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

@@ -14,7 +14,7 @@
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": true,
"EngineVersion": "4.26.0",
"EngineVersion": "4.25.0",
"Modules": [
{
"Name": "RuntimeAudioImporter",
@@ -11,11 +11,23 @@
#include "OpusCompressor.h"
#include "AdvancedPCMCompressor.h"
#include "PreimportedSoundAsset.h"
#include "Misc/FileHelper.h"
URuntimeAudioImporterLibrary* URuntimeAudioImporterLibrary::CreateRuntimeAudioImporter()
{
URuntimeAudioImporterLibrary* Importer = NewObject<URuntimeAudioImporterLibrary>();
Importer->AddToRoot();
Importer->bUseOfAdvancedBuffersInfo = false;
return Importer;
}
URuntimeAudioImporterLibrary* URuntimeAudioImporterLibrary::CreateAdvancedRuntimeAudioImporter(
const bool UseOfAdvancedBufferInfo)
{
URuntimeAudioImporterLibrary* Importer = NewObject<URuntimeAudioImporterLibrary>();
Importer->bUseOfAdvancedBuffersInfo = UseOfAdvancedBufferInfo;
return Importer;
}
@@ -24,9 +36,6 @@ void URuntimeAudioImporterLibrary::ImportAudioFromFile(
{
if (!FPaths::FileExists(FilePath))
{
// Trying to get a file inside packaged build
IPlatformFile& FileManager = FPlatformFileManager::Get().GetPlatformFile();
OnResult_Internal(nullptr, ETranscodingStatus::AudioDoesNotExist);
return;
}
@@ -47,6 +56,7 @@ void URuntimeAudioImporterLibrary::ImportAudioFromFile(
ImportAudioFromBuffer(AudioBuffer, Format, BuffersDetails);
}
void URuntimeAudioImporterLibrary::ImportAudioFromPreimportedSound(UPreimportedSoundAsset* PreimportedSoundAssetRef,
const FBuffersDetailsStruct& BuffersDetails)
{
@@ -145,7 +155,8 @@ USoundWave* URuntimeAudioImporterLibrary::DefineSoundWave()
OnProgress_Internal(45);
// Whether to fill the compressed buffer or not. If not filled, it is necessary to fill Raw (Wave) data so that the engine will automatically generate compressed data.
if (BuffersDetailsInfo.CompressionFormat == ECompressionFormat::RawData)
if (BuffersDetailsInfo.CompressionFormat == ECompressionFormat::RawData || (bUseOfAdvancedBuffersInfo &&
AdvancedBuffersInfo.FillRawData))
{
// Callback Dispatcher OnProgress
OnProgress_Internal(60);
@@ -157,8 +168,11 @@ USoundWave* URuntimeAudioImporterLibrary::DefineSoundWave()
return nullptr;
}
// free unneeded PCM Data
FMemory::Free(TranscodingFillInfo.PCMInfo.RawPCMData);
if (!bUseOfAdvancedBuffersInfo || (bUseOfAdvancedBuffersInfo && !AdvancedBuffersInfo.FillPCMData))
{
// free unneeded PCM Data
FMemory::Free(TranscodingFillInfo.PCMInfo.RawPCMData);
}
// Callback Dispatcher OnProgress
OnProgress_Internal(75);
@@ -166,16 +180,18 @@ USoundWave* URuntimeAudioImporterLibrary::DefineSoundWave()
// Fill Raw (Wave) Data
FillRawWaveData(SoundWaveRef);
// Fill PCM Data if needed
if (bUseOfAdvancedBuffersInfo && AdvancedBuffersInfo.FillPCMData)
{
FillPCMData(SoundWaveRef);
}
// Callback Dispatcher OnProgress
OnProgress_Internal(95);
return SoundWaveRef;
}
/* We don't need to fill RawPCMData buffer since it is not used at runtime during audio playback. But in case you want to fill this buffer - uncomment the code below (you should also remove some RawPCMData cleanups in code before it is executed)
sw->RawPCMData = static_cast<uint8*>(FMemory::Malloc(sw->RawPCMDataSize));
FMemory::Memmove(sw->RawPCMData, TranscodingFillInfo.PCMInfo.RawPCMData, sw->RawPCMDataSize);
*/
// Set a new sound compression quality
SoundWaveRef->CompressionQuality = BuffersDetailsInfo.SoundCompressionQuality;
@@ -186,20 +202,30 @@ USoundWave* URuntimeAudioImporterLibrary::DefineSoundWave()
// Callback Dispatcher OnProgress
OnProgress_Internal(60);
// Transcode Raw PCM data to Compressed data
if (!TranscodePCMToCompressedData(SoundWaveRef))
if (!bUseOfAdvancedBuffersInfo || (bUseOfAdvancedBuffersInfo && AdvancedBuffersInfo.FillCompressedData &&
AdvancedBuffersInfo.CompressionFormat != ECompressionFormat::RawData))
{
return nullptr;
// Transcode Raw PCM data to Compressed data
if (!TranscodePCMToCompressedData(SoundWaveRef))
{
return nullptr;
}
// Callback Dispatcher OnProgress
OnProgress_Internal(75);
SoundWaveRef->SetPrecacheState(ESoundWavePrecacheState::NotStarted);
// Fill the compressed data
FillCompressedData(SoundWaveRef);
// Fill PCM Data if needed
if (bUseOfAdvancedBuffersInfo && AdvancedBuffersInfo.FillPCMData)
{
FillPCMData(SoundWaveRef);
}
}
// Callback Dispatcher OnProgress
OnProgress_Internal(75);
SoundWaveRef->SetPrecacheState(ESoundWavePrecacheState::NotStarted);
// Fill the compressed data
FillCompressedData(SoundWaveRef);
// Callback Dispatcher OnProgress
OnProgress_Internal(95);
@@ -227,6 +253,9 @@ void URuntimeAudioImporterLibrary::FillRawWaveData(USoundWave* SoundWaveRef) con
FMemory::Memmove(SoundWaveRef->RawData.Realloc(TranscodingFillInfo.WAVInfo.WaveDataSize),
TranscodingFillInfo.WAVInfo.WaveData, TranscodingFillInfo.WAVInfo.WaveDataSize);
SoundWaveRef->RawData.Unlock();
UE_LOG(LogTemp, Warning, TEXT("RawData has been filled successfully, Raw data size: %d"),
TranscodingFillInfo.WAVInfo.WaveDataSize);
}
void URuntimeAudioImporterLibrary::FillCompressedData(USoundWave* SoundWaveRef)
@@ -247,6 +276,18 @@ void URuntimeAudioImporterLibrary::FillCompressedData(USoundWave* SoundWaveRef)
CompressedBulkData->Unlock();
SoundWaveRef->SetPrecacheState(ESoundWavePrecacheState::Done);
UE_LOG(LogTemp, Warning, TEXT("Compressed data has been filled successfully, Cmpressed data size: %d"),
TranscodingFillInfo.CompressedInfo.CompressedFormatData.Num());
}
void URuntimeAudioImporterLibrary::FillPCMData(USoundWave* SoundWaveRef)
{
SoundWaveRef->RawPCMData = static_cast<uint8*>(FMemory::Malloc(SoundWaveRef->RawPCMDataSize));
FMemory::Memmove(SoundWaveRef->RawPCMData, TranscodingFillInfo.PCMInfo.RawPCMData,
SoundWaveRef->RawPCMDataSize);
UE_LOG(LogTemp, Warning, TEXT("PCM Data has been filled successfully, PCMData size: %d"),
TranscodingFillInfo.PCMInfo.RawPCMDataSize);
}
bool URuntimeAudioImporterLibrary::TranscodePCMToCompressedData(USoundWave* SoundWaveToGetData)
@@ -258,6 +299,11 @@ bool URuntimeAudioImporterLibrary::TranscodePCMToCompressedData(USoundWave* Soun
// Sound quality information for compression purposes
FSoundQualityInfo SoundQualityInfo = GenerateSoundQualityInfo(SoundWaveToGetData);
if (bUseOfAdvancedBuffersInfo)
{
BuffersDetailsInfo.CompressionFormat = AdvancedBuffersInfo.CompressionFormat;
}
switch (BuffersDetailsInfo.CompressionFormat)
{
case OggVorbis:
@@ -315,9 +361,12 @@ bool URuntimeAudioImporterLibrary::TranscodePCMToCompressedData(USoundWave* Soun
}
}
// When the compressed data is generated, RawPCMData is no longer needed.
RawPCMArray.Empty();
FMemory::Free(TranscodingFillInfo.PCMInfo.RawPCMData);
if (!bUseOfAdvancedBuffersInfo || (bUseOfAdvancedBuffersInfo && !AdvancedBuffersInfo.FillPCMData))
{
// When the compressed data is generated, RawPCMData is no longer needed
RawPCMArray.Empty();
FMemory::Free(TranscodingFillInfo.PCMInfo.RawPCMData);
}
// Callback Dispatcher OnProgress
OnProgress_Internal(85);
@@ -5,8 +5,6 @@
#include "Sound/SoundWave.h"
#include "Async/Async.h"
#include "PreimportedSoundAsset.h"
#include "RuntimeAudioImporterLibrary.generated.h"
/** Possible audio importing results */
@@ -79,7 +77,7 @@ enum ECompressionFormat
};
/** Information about which buffers to fill */
USTRUCT(BlueprintType)
USTRUCT(BlueprintType, Category = "RuntimeAudioImporter")
struct FBuffersDetailsStruct
{
GENERATED_BODY()
@@ -155,15 +153,34 @@ struct FTranscodingFillStruct
FCompressedStruct CompressedInfo;
};
/** Advanced CPP only structure which contains information about which buffers to fill */
struct FAdvancedBuffersStruct
{
/** Needed compression format. Do not select RawData here! If you want to fill Raw (Wav) Data, check the "FillRawData" parameter */
TEnumAsByte<ECompressionFormat> CompressionFormat;
/** Whether to fill the compressed data or not */
bool FillCompressedData = false;
/** Whether to fill PCM Data or not */
bool FillPCMData = false;
/** Whether to fill Raw (Wav) data */
bool FillRawData = false;
};
// Forward declaration of the FSoundQualityInfo structure
struct FSoundQualityInfo;
// Forward declaration of the UPreimportedSoundAsset class
class UPreimportedSoundAsset;
/**
* Declare delegate which will be called during the transcoding process
*
* @param Percentage Percentage of importing completed (0-100%)
*/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnProgress, const int32, Percentage);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAudioProgress, const int32, Percentage);
/**
* Declare a delegate that will be called on the transcoding result
@@ -172,7 +189,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnProgress, const int32, Percentage
* @param ReadySoundWave Ready SoundWave object reference
* @param Status TranscodingStatus Enum in case an error occurs
*/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnResult, class URuntimeAudioImporterLibrary*,
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnAudioResult, class URuntimeAudioImporterLibrary*,
RuntimeAudioImporterObjectRef,
const USoundWave*, SoundWaveRef,
const TEnumAsByte < ETranscodingStatus >&, Status);
@@ -189,11 +206,11 @@ public:
/** Bind to know when the transcoding is on progress */
UPROPERTY(BlueprintAssignable, Category = "RuntimeAudioImporter")
FOnProgress OnProgress;
FOnAudioProgress OnProgress;
/** Bind to know when the transcoding is complete (even if it fails) */
UPROPERTY(BlueprintAssignable, Category = "RuntimeAudioImporter")
FOnResult OnResult;
FOnAudioResult OnResult;
/** Transcoding fill info. CPP use only */
FTranscodingFillStruct TranscodingFillInfo = FTranscodingFillStruct();
@@ -201,6 +218,10 @@ public:
/** Buffers details info. CPP use only */
FBuffersDetailsStruct BuffersDetailsInfo = FBuffersDetailsStruct();
/** Advanced buffer details info. CPP use only (even as an input parameter) */
FAdvancedBuffersStruct AdvancedBuffersInfo = FAdvancedBuffersStruct();
bool bUseOfAdvancedBuffersInfo = false;
/**
* Instantiates a RuntimeAudioImporter object
*
@@ -211,6 +232,14 @@ public:
"RuntimeAudioImporter")
static URuntimeAudioImporterLibrary* CreateRuntimeAudioImporter();
/**
* If you want to select a separate formats to fill (using of "FAdvancedBuffersStruct"), then use this method in CPP
*
* @param UseOfAdvancedBufferInfo Whether to use the advanced buffer info or not
*/
UFUNCTION()
static URuntimeAudioImporterLibrary* CreateAdvancedRuntimeAudioImporter(const bool UseOfAdvancedBufferInfo);
/**
* Transcode audio file to SoundWave object
*
@@ -296,6 +325,13 @@ private:
*/
void FillCompressedData(USoundWave* SoundWaveRef);
/**
* Fill SoundWave PCM data buffer
*
* @param SoundWaveRef SoundWave object reference
*/
void FillPCMData(USoundWave* SoundWaveRef);
/**
* Transcode Audio from PCM to 16-bit WAV data
*
-14
View File
@@ -1,14 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class AudioImporterTestTarget : TargetRules
{
public AudioImporterTestTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "AudioImporterTest" } );
}
}
@@ -1,23 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class AudioImporterTest : ModuleRules
{
public AudioImporterTest(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
@@ -1,6 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "AudioImporterTest.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, AudioImporterTest, "AudioImporterTest" );
@@ -1,6 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
@@ -1,5 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "AudioImporterTestGameModeBase.h"
@@ -1,17 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "AudioImporterTestGameModeBase.generated.h"
/**
*
*/
UCLASS()
class AUDIOIMPORTERTEST_API AAudioImporterTestGameModeBase : public AGameModeBase
{
GENERATED_BODY()
};
-14
View File
@@ -1,14 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class AudioImporterTestEditorTarget : TargetRules
{
public AudioImporterTestEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "AudioImporterTest" } );
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB