commit f698a38c7ef9fbd7d6e95c7184ce7494b797717f Author: Crizomb Date: Tue Jun 10 17:40:16 2025 +0200 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0f164b --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# visual studio things +.vs + +# out +SimpleGame/out/** diff --git a/SimpleGame/CMakeLists.txt b/SimpleGame/CMakeLists.txt new file mode 100644 index 0000000..64f8408 --- /dev/null +++ b/SimpleGame/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.26) + +include(FetchContent) +project(SimpleGame VERSION 1.0.0 LANGUAGES CXX) + +set (CMAKE_EXPORT_COMPILE_COMMANDS ON) + + +set (BUILD_SHARED_LIBS FALSE) + +FetchContent_Declare(sfml + GIT_REPOSITORY https://github.com/SFML/SFML.git + GIT_TAG 3.0.0 + GIT_SHALLOW ON + EXCLUDE_FROM_ALL + SYSTEM) +FetchContent_MakeAvailable(sfml) + +set(CMAKE_CXX_STANDARD 23) + +add_subdirectory(src_original) +add_subdirectory(src) + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d.cpp new file mode 100644 index 0000000..eb5e780 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d.cpp @@ -0,0 +1,215 @@ +/*============================================================================== +3D Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to basic 3D positioning of sounds. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +const int INTERFACE_UPDATETIME = 50; // 50ms update for interface +const float DISTANCEFACTOR = 1.0f; // Units per meter. I.e feet would = 3.28. centimeters would = 100. + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound1, *sound2, *sound3; + FMOD::Channel *channel1 = 0, *channel2 = 0, *channel3 = 0; + FMOD_RESULT result; + bool listenerflag = true; + FMOD_VECTOR listenerpos = { 0.0f, 0.0f, -1.0f * DISTANCEFACTOR }; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(100, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + /* + Set the distance units. (meters/feet etc). + */ + result = system->set3DSettings(1.0, DISTANCEFACTOR, 1.0f); + ERRCHECK(result); + + /* + Load some sounds + */ + result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_3D, 0, &sound1); + ERRCHECK(result); + result = sound1->set3DMinMaxDistance(0.5f * DISTANCEFACTOR, 5000.0f * DISTANCEFACTOR); + ERRCHECK(result); + result = sound1->setMode(FMOD_LOOP_NORMAL); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("jaguar.wav"), FMOD_3D, 0, &sound2); + ERRCHECK(result); + result = sound2->set3DMinMaxDistance(0.5f * DISTANCEFACTOR, 5000.0f * DISTANCEFACTOR); + ERRCHECK(result); + result = sound2->setMode(FMOD_LOOP_NORMAL); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("swish.wav"), FMOD_2D, 0, &sound3); + ERRCHECK(result); + + /* + Play sounds at certain positions + */ + { + FMOD_VECTOR pos = { -10.0f * DISTANCEFACTOR, 0.0f, 0.0f }; + FMOD_VECTOR vel = { 0.0f, 0.0f, 0.0f }; + + result = system->playSound(sound1, 0, true, &channel1); + ERRCHECK(result); + result = channel1->set3DAttributes(&pos, &vel); + ERRCHECK(result); + result = channel1->setPaused(false); + ERRCHECK(result); + } + + { + FMOD_VECTOR pos = { 15.0f * DISTANCEFACTOR, 0.0f, 0.0f }; + FMOD_VECTOR vel = { 0.0f, 0.0f, 0.0f }; + + result = system->playSound(sound2, 0, true, &channel2); + ERRCHECK(result); + result = channel2->set3DAttributes(&pos, &vel); + ERRCHECK(result); + result = channel2->setPaused(false); + ERRCHECK(result); + } + + /* + Main loop + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + bool paused; + channel1->getPaused(&paused); + channel1->setPaused(!paused); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + bool paused; + channel2->getPaused(&paused); + channel2->setPaused(!paused); + } + + if (Common_BtnPress(BTN_ACTION3)) + { + result = system->playSound(sound3, 0, false, &channel3); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_MORE)) + { + listenerflag = !listenerflag; + } + + if (!listenerflag) + { + if (Common_BtnDown(BTN_LEFT)) + { + listenerpos.x -= 1.0f * DISTANCEFACTOR; + if (listenerpos.x < -24 * DISTANCEFACTOR) + { + listenerpos.x = -24 * DISTANCEFACTOR; + } + } + + if (Common_BtnDown(BTN_RIGHT)) + { + listenerpos.x += 1.0f * DISTANCEFACTOR; + if (listenerpos.x > 23 * DISTANCEFACTOR) + { + listenerpos.x = 23 * DISTANCEFACTOR; + } + } + } + + // ========================================================================================== + // UPDATE THE LISTENER + // ========================================================================================== + { + static float t = 0; + static FMOD_VECTOR lastpos = { 0.0f, 0.0f, 0.0f }; + FMOD_VECTOR forward = { 0.0f, 0.0f, 1.0f }; + FMOD_VECTOR up = { 0.0f, 1.0f, 0.0f }; + FMOD_VECTOR vel; + + if (listenerflag) + { + listenerpos.x = (float)sin(t * 0.05f) * 24.0f * DISTANCEFACTOR; // left right pingpong + } + + // ********* NOTE ******* READ NEXT COMMENT!!!!! + // vel = how far we moved last FRAME (m/f), then time compensate it to SECONDS (m/s). + vel.x = (listenerpos.x - lastpos.x) * (1000 / INTERFACE_UPDATETIME); + vel.y = (listenerpos.y - lastpos.y) * (1000 / INTERFACE_UPDATETIME); + vel.z = (listenerpos.z - lastpos.z) * (1000 / INTERFACE_UPDATETIME); + + // store pos for next time + lastpos = listenerpos; + + result = system->set3DListenerAttributes(0, &listenerpos, &vel, &forward, &up); + ERRCHECK(result); + + t += (30 * (1.0f / (float)INTERFACE_UPDATETIME)); // t is just a time value .. it increments in 30m/s steps in this example + } + + result = system->update(); + ERRCHECK(result); + + // Create small visual display. + char s[80] = "|.............<1>......................<2>.......|"; + s[(int)(listenerpos.x / DISTANCEFACTOR) + 25] = 'L'; + + Common_Draw("=================================================="); + Common_Draw("3D Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to toggle sound 1 (16bit Mono 3D)", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to toggle sound 2 (8bit Mono 3D)", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to play a sound (16bit Stereo 2D)", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s or %s to move listener in still mode", Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT)); + Common_Draw("Press %s to toggle listener auto movement", Common_BtnStr(BTN_MORE)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw(s); + + Common_Sleep(INTERFACE_UPDATETIME - 1); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound1->release(); + ERRCHECK(result); + result = sound2->release(); + ERRCHECK(result); + result = sound3->release(); + ERRCHECK(result); + + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.creator.shared new file mode 100644 index 0000000..090da91 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/3d + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.files new file mode 100644 index 0000000..de683b8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/3d.makefile +../3d.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/3d/3d.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio.cpp new file mode 100644 index 0000000..9126dcd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio.cpp @@ -0,0 +1,348 @@ +/*=============================================================================================== + Async IO Example + Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + + This example shows how to play a stream and use a custom file handler that defers reads for the + streaming part. FMOD will allow the user to return straight away from a file read request and + supply the data at a later time. +===============================================================================================*/ +#include "fmod.hpp" +#include "common.h" +#include + +struct AsyncData +{ + FMOD_ASYNCREADINFO *info; +}; + +struct ScopedMutex +{ + Common_Mutex *mMutex; + ScopedMutex(Common_Mutex *mutex) : mMutex(mutex) { Common_Mutex_Enter(mMutex); } + ~ScopedMutex() { Common_Mutex_Leave(mMutex); } +}; + +Common_Mutex gListCrit; +std::list gList; +bool gThreadQuit = false; +bool gThreadFinished = false; +bool gSleepBreak = false; + + +/* + A little text buffer to allow a scrolling window +*/ +const int DRAW_ROWS = NUM_ROWS - 8; +const int DRAW_COLS = NUM_COLUMNS; + +char gLineData[DRAW_ROWS][DRAW_COLS]; +Common_Mutex gLineCrit; + +void AddLine(const char *formatString...) +{ + ScopedMutex mutex(&gLineCrit); + + char s[DRAW_COLS]; + va_list args; + va_start(args, formatString); + Common_vsnprintf(s, DRAW_COLS, formatString, args); + va_end(args); + + for (int i = 1; i < DRAW_ROWS; i++) + { + memcpy(gLineData[i-1], gLineData[i], DRAW_COLS); + } + strncpy(gLineData[DRAW_ROWS-1], s, DRAW_COLS); +} + +void DrawLines() +{ + ScopedMutex mutex(&gLineCrit); + + for (int i = 0; i < DRAW_ROWS; i++) + { + Common_Draw(gLineData[i]); + } +} + + +/* + File callbacks +*/ +FMOD_RESULT F_CALL myopen(const char *name, unsigned int *filesize, void **handle, void * /*userdata*/) +{ + assert(name); + assert(filesize); + assert(handle); + + Common_File_Open(name, 0, filesize, handle); // mode 0 = 'read'. + + if (!handle) + { + return FMOD_ERR_FILE_NOTFOUND; + } + + return FMOD_OK; +} + +FMOD_RESULT F_CALL myclose(void *handle, void * /*userdata*/) +{ + assert(handle); + + Common_File_Close(handle); + + return FMOD_OK; +} + +FMOD_RESULT F_CALL myread(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void * /*userdata*/) +{ + assert(handle); + assert(buffer); + assert(bytesread); + + Common_File_Read(handle, buffer, sizebytes, bytesread); + + if (*bytesread < sizebytes) + { + return FMOD_ERR_FILE_EOF; + } + + return FMOD_OK; +} + +FMOD_RESULT F_CALL myseek(void *handle, unsigned int pos, void * /*userdata*/) +{ + assert(handle); + + Common_File_Seek(handle, pos); + + return FMOD_OK; +} + +FMOD_RESULT F_CALL myasyncread(FMOD_ASYNCREADINFO *info, void * /*userdata*/) +{ + assert(info); + + ScopedMutex mutex(&gListCrit); + + AsyncData *data = (AsyncData *)malloc(sizeof(AsyncData)); + if (!data) + { + /* Signal FMOD to wake up, this operation has has failed */ + info->done(info, FMOD_ERR_MEMORY); + return FMOD_ERR_MEMORY; + } + + AddLine("REQUEST %5d bytes, offset %5d PRIORITY = %d.", info->sizebytes, info->offset, info->priority); + data->info = info; + gList.push_back(data); + + /* Example only: Use your native filesystem scheduler / priority here */ + if (info->priority > 50) + { + gSleepBreak = true; + } + + return FMOD_OK; +} + +FMOD_RESULT F_CALL myasynccancel(FMOD_ASYNCREADINFO *info, void * /*userdata*/) +{ + assert(info); + + ScopedMutex mutex(&gListCrit); + + /* Find the pending IO request and remove it */ + for (std::list::iterator itr = gList.begin(); itr != gList.end(); itr++) + { + AsyncData *data = *itr; + if (data->info == info) + { + gList.remove(data); + free(data); + + /* Signal FMOD to wake up, this operation has been cancelled */ + info->done(info, FMOD_ERR_FILE_DISKEJECTED); + return FMOD_ERR_FILE_DISKEJECTED; + } + } + + /* IO request not found, it must have completed already */ + return FMOD_OK; +} + + +/* + Async file IO processing thread +*/ +void ProcessQueue(void * /*param*/) +{ + while (!gThreadQuit) + { + /* Grab the next IO task off the list */ + FMOD_ASYNCREADINFO *info = NULL; + Common_Mutex_Enter(&gListCrit); + if (!gList.empty()) + { + info = gList.front()->info; + gList.pop_front(); + } + Common_Mutex_Leave(&gListCrit); + + if (info) + { + /* Example only: Let's deprive the read of the whole block, only give 16kb at a time to make it re-ask for more later */ + unsigned int toread = info->sizebytes; + if (toread > 16384) + { + toread = 16384; + } + + /* Example only: Demonstration of priority influencing turnaround time */ + for (int i = 0; i < 50; i++) + { + Common_Sleep(10); + if (gSleepBreak) + { + AddLine("URGENT REQUEST - reading now!"); + gSleepBreak = false; + break; + } + } + + /* Process the seek and read request with EOF handling */ + Common_File_Seek(info->handle, info->offset); + + Common_File_Read(info->handle, info->buffer, toread, &info->bytesread); + + if (info->bytesread < toread) + { + AddLine("FED %5d bytes, offset %5d (* EOF)", info->bytesread, info->offset); + info->done(info, FMOD_ERR_FILE_EOF); + } + else + { + AddLine("FED %5d bytes, offset %5d", info->bytesread, info->offset); + info->done(info, FMOD_OK); + } + } + else + { + Common_Sleep(10); /* Example only: Use your native filesystem synchronisation to wait for more requests */ + } + } + + gThreadFinished = true; +} + + +int FMOD_Main() +{ + void *extradriverdata = NULL; + void *threadhandle = NULL; + + Common_Init(&extradriverdata); + + Common_Mutex_Create(&gLineCrit); + Common_Mutex_Create(&gListCrit); + + Common_Thread_Create(ProcessQueue, NULL, &threadhandle); + + /* + Create a System object and initialize. + */ + FMOD::System *system = NULL; + FMOD_RESULT result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(1, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->setStreamBufferSize(32768, FMOD_TIMEUNIT_RAWBYTES); + ERRCHECK(result); + + result = system->setFileSystem(myopen, myclose, myread, myseek, myasyncread, myasynccancel, 2048); + ERRCHECK(result); + + FMOD::Sound *sound = NULL; + result = system->createStream(Common_MediaPath("wave.mp3"), FMOD_LOOP_NORMAL | FMOD_2D | FMOD_IGNORETAGS, NULL, &sound); + ERRCHECK(result); + + FMOD::Channel *channel = NULL; + result = system->playSound(sound, 0, false, &channel); + ERRCHECK(result); + + /* + Main loop. + */ + do + { + Common_Update(); + + if (sound) + { + bool starving = false; + FMOD_OPENSTATE openstate = FMOD_OPENSTATE_READY; + result = sound->getOpenState(&openstate, NULL, &starving, NULL); + ERRCHECK(result); + + if (starving) + { + AddLine("Starving"); + } + + result = channel->setMute(starving); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION1)) + { + result = sound->release(); + if (result == FMOD_OK) + { + sound = NULL; + AddLine("Released sound"); + } + } + + result = system->update(); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("Async IO Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to release playing stream", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + DrawLines(); + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + if (sound) + { + result = sound->release(); + ERRCHECK(result); + } + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + gThreadQuit = true; + while (!gThreadFinished) + { + Common_Sleep(10); + } + + Common_Mutex_Destroy(&gListCrit); + Common_Mutex_Destroy(&gLineCrit); + Common_Thread_Destroy(threadhandle); + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.creator.shared new file mode 100644 index 0000000..0bfae66 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f asyncio.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/asyncio + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.files new file mode 100644 index 0000000..123b3d4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/asyncio.makefile +../asyncio.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/asyncio/asyncio.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups.cpp new file mode 100644 index 0000000..d7e870b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups.cpp @@ -0,0 +1,189 @@ +/*============================================================================== +Channel Groups Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to put channels into channel groups, so that you can +affect a group of channels at a time instead of just one. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound[6]; + FMOD::Channel *channel[6]; + FMOD::ChannelGroup *groupA, *groupB, *masterGroup; + FMOD_RESULT result; + int count; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_LOOP_NORMAL, 0, &sound[0]); + ERRCHECK(result); + result = system->createSound(Common_MediaPath("jaguar.wav"), FMOD_LOOP_NORMAL, 0, &sound[1]); + ERRCHECK(result); + result = system->createSound(Common_MediaPath("swish.wav"), FMOD_LOOP_NORMAL, 0, &sound[2]); + ERRCHECK(result); + result = system->createSound(Common_MediaPath("c.ogg"), FMOD_LOOP_NORMAL, 0, &sound[3]); + ERRCHECK(result); + result = system->createSound(Common_MediaPath("d.ogg"), FMOD_LOOP_NORMAL, 0, &sound[4]); + ERRCHECK(result); + result = system->createSound(Common_MediaPath("e.ogg"), FMOD_LOOP_NORMAL, 0, &sound[5]); + ERRCHECK(result); + + result = system->createChannelGroup("Group A", &groupA); + ERRCHECK(result); + result = system->createChannelGroup("Group B", &groupB); + ERRCHECK(result); + + result = system->getMasterChannelGroup(&masterGroup); + ERRCHECK(result); + + /* + Instead of being independent, set the group A and B to be children of the master group. + */ + result = masterGroup->addGroup(groupA); + ERRCHECK(result); + + result = masterGroup->addGroup(groupB); + ERRCHECK(result); + + /* + Start all the sounds. + */ + for (count = 0; count < 6; count++) + { + result = system->playSound(sound[count], 0, true, &channel[count]); + ERRCHECK(result); + + result = channel[count]->setChannelGroup((count < 3) ? groupA : groupB); + ERRCHECK(result); + + result = channel[count]->setPaused(false); + ERRCHECK(result); + } + + /* + Change the volume of each group, just because we can! (reduce overall noise). + */ + result = groupA->setVolume(0.5f); + ERRCHECK(result); + result = groupB->setVolume(0.5f); + ERRCHECK(result); + + /* + Main loop. + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + bool mute = true; + groupA->getMute(&mute); + groupA->setMute(!mute); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + bool mute = true; + groupB->getMute(&mute); + groupB->setMute(!mute); + } + + if (Common_BtnPress(BTN_ACTION3)) + { + bool mute = true; + masterGroup->getMute(&mute); + masterGroup->setMute(!mute); + } + + result = system->update(); + ERRCHECK(result); + + { + int channelsplaying = 0; + + result = system->getChannelsPlaying(&channelsplaying, NULL); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("Channel Groups Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Group A : drumloop.wav, jaguar.wav, swish.wav"); + Common_Draw("Group B : c.ogg, d.ogg, e.ogg"); + Common_Draw(""); + Common_Draw("Press %s to mute/unmute group A", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to mute/unmute group B", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to mute/unmute master group", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Channels playing %d", channelsplaying); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + + /* + A little fade out over 2 seconds. + */ + { + float pitch = 1.0f; + float vol = 1.0f; + + for (count = 0; count < 200; count++) + { + masterGroup->setPitch(pitch); + masterGroup->setVolume(vol); + + vol -= (1.0f / 200.0f); + pitch -= (0.5f / 200.0f); + + result = system->update(); + ERRCHECK(result); + + Common_Sleep(10); + } + } + + /* + Shut down. + */ + for (count = 0; count < 6; count++) + { + result = sound[count]->release(); + ERRCHECK(result); + } + + result = groupA->release(); + ERRCHECK(result); + result = groupB->release(); + ERRCHECK(result); + + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.creator.shared new file mode 100644 index 0000000..bf890d6 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f channel_groups.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/channel_groups + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.files new file mode 100644 index 0000000..67b6388 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/channel_groups.makefile +../channel_groups.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/channel_groups/channel_groups.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/common.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common.cpp new file mode 100644 index 0000000..2dd1383 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common.cpp @@ -0,0 +1,234 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. +==============================================================================*/ +#include "common.h" +#include "fmod_errors.h" + +/* Cross platform OS Functions internal to the FMOD library, exposed for the example framework. */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct FMOD_OS_FILE FMOD_OS_FILE; +typedef struct FMOD_OS_CRITICALSECTION FMOD_OS_CRITICALSECTION; + +FMOD_RESULT F_API FMOD_OS_Time_GetUs(unsigned int *us); +FMOD_RESULT F_API FMOD_OS_Debug_Output(const char *format, ...); +FMOD_RESULT F_API FMOD_OS_File_Open(const char *name, int mode, unsigned int *filesize, FMOD_OS_FILE **handle); +FMOD_RESULT F_API FMOD_OS_File_Close(FMOD_OS_FILE *handle); +FMOD_RESULT F_API FMOD_OS_File_Read(FMOD_OS_FILE *handle, void *buf, unsigned int count, unsigned int *read); +FMOD_RESULT F_API FMOD_OS_File_Write(FMOD_OS_FILE *handle, const void *buffer, unsigned int bytesToWrite, bool flush); +FMOD_RESULT F_API FMOD_OS_File_Seek(FMOD_OS_FILE *handle, unsigned int offset); +FMOD_RESULT F_API FMOD_OS_Time_Sleep(unsigned int ms); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Create(FMOD_OS_CRITICALSECTION **crit, bool memorycrit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Free(FMOD_OS_CRITICALSECTION *crit, bool memorycrit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Enter(FMOD_OS_CRITICALSECTION *crit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Leave(FMOD_OS_CRITICALSECTION *crit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_TryEnter(FMOD_OS_CRITICALSECTION *crit, bool *entered); +FMOD_RESULT F_API FMOD_OS_CriticalSection_IsLocked(FMOD_OS_CRITICALSECTION *crit, bool *locked); +FMOD_RESULT F_API FMOD_OS_Thread_Create(const char *name, void (*callback)(void *param), void *param, FMOD_THREAD_AFFINITY affinity, FMOD_THREAD_PRIORITY priority, FMOD_THREAD_STACK_SIZE stacksize, void **handle); +FMOD_RESULT F_API FMOD_OS_Thread_Destroy(void *handle); + +#ifdef __cplusplus +} +#endif + +void (*Common_Private_Error)(FMOD_RESULT, const char *, int); + +void ERRCHECK_fn(FMOD_RESULT result, const char *file, int line) +{ + if (result != FMOD_OK) + { + if (Common_Private_Error) + { + Common_Private_Error(result, file, line); + } + Common_Fatal("%s(%d): FMOD error %d - %s", file, line, result, FMOD_ErrorString(result)); + } +} + +void Common_Format(char *buffer, int bufferSize, const char *formatString...) +{ + va_list args; + va_start(args, formatString); + Common_vsnprintf(buffer, bufferSize, formatString, args); + va_end(args); + buffer[bufferSize-1] = '\0'; +} + +void Common_Fatal(const char *format, ...) +{ + char error[1024]; + + va_list args; + va_start(args, format); + Common_vsnprintf(error, 1024, format, args); + va_end(args); + error[1023] = '\0'; + + do + { + Common_Draw("A fatal error has occurred..."); + Common_Draw(""); + Common_Draw("%s", error); + Common_Draw(""); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Update(); + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + Common_Exit(0); +} + +void Common_Draw(const char *format, ...) +{ + char string[1024]; + char *stringPtr = string; + + va_list args; + va_start(args, format); + Common_vsnprintf(string, 1024, format, args); + va_end(args); + string[1023] = '\0'; + + unsigned int length = (unsigned int)strlen(string); + + do + { + bool consumeNewLine = false; + unsigned int copyLength = length; + + // Search for new line characters + char *newLinePtr = strchr(stringPtr, '\n'); + if (newLinePtr) + { + consumeNewLine = true; + copyLength = (unsigned int)(newLinePtr - stringPtr); + } + + if (copyLength > NUM_COLUMNS) + { + // Hard wrap by default + copyLength = NUM_COLUMNS; + + // Loop for a soft wrap + for (int i = NUM_COLUMNS - 1; i >= 0; i--) + { + if (stringPtr[i] == ' ') + { + copyLength = i + 1; + break; + } + } + } + + // Null terminate the sub string temporarily by swapping out a char + char tempChar = stringPtr[copyLength]; + stringPtr[copyLength] = 0; + Common_DrawText(stringPtr); + stringPtr[copyLength] = tempChar; + + copyLength += (consumeNewLine ? 1 : 0); + length -= copyLength; + stringPtr += copyLength; + } while (length > 0); +} + +void Common_Time_GetUs(unsigned int *us) +{ + FMOD_OS_Time_GetUs(us); +} + +void Common_Log(const char *format, ...) +{ + char string[1024]; + + va_list args; + va_start(args, format); + Common_vsnprintf(string, 1024, format, args); + va_end(args); + string[1023] = '\0'; + + FMOD_OS_Debug_Output(string); +} + +void Common_LoadFileMemory(const char *name, void **buff, int *length) +{ + FMOD_OS_FILE *file = NULL; + unsigned int len, bytesread; + + FMOD_OS_File_Open(name, 0, &len, &file); + void *mem = malloc(len); + FMOD_OS_File_Read(file, mem, len, &bytesread); + FMOD_OS_File_Close(file); + + *buff = mem; + *length = bytesread; +} + +void Common_UnloadFileMemory(void *buff) +{ + free(buff); +} + +void Common_Sleep(unsigned int ms) +{ + FMOD_OS_Time_Sleep(ms); +} + +void Common_File_Open(const char *name, int mode, unsigned int *filesize, void **handle) +{ + FMOD_OS_File_Open(name, mode, filesize, (FMOD_OS_FILE **)handle); +} + +void Common_File_Close(void *handle) +{ + FMOD_OS_File_Close((FMOD_OS_FILE *)handle); +} + +void Common_File_Read(void *handle, void *buf, unsigned int length, unsigned int *read) +{ + FMOD_OS_File_Read((FMOD_OS_FILE *)handle, buf, length, read); +} + +void Common_File_Write(void *handle, void *buf, unsigned int length) +{ + FMOD_OS_File_Write((FMOD_OS_FILE *)handle, buf, length, true); +} + +void Common_File_Seek(void *handle, unsigned int offset) +{ + FMOD_OS_File_Seek((FMOD_OS_FILE *)handle, offset); +} + +void Common_Mutex_Create(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Create((FMOD_OS_CRITICALSECTION **)&mutex->crit, false); +} + +void Common_Mutex_Destroy(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Free((FMOD_OS_CRITICALSECTION *)mutex->crit, false); +} + +void Common_Mutex_Enter(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Enter((FMOD_OS_CRITICALSECTION *)mutex->crit); +} + +void Common_Mutex_Leave(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Leave((FMOD_OS_CRITICALSECTION *)mutex->crit); +} + +void Common_Thread_Create(void (*callback)(void *param), void *param, void **handle) +{ + FMOD_OS_Thread_Create("FMOD Example Thread", callback, param, FMOD_THREAD_AFFINITY_GROUP_A, FMOD_THREAD_PRIORITY_MEDIUM, (16 * 1024), handle); +} + +void Common_Thread_Destroy(void *handle) +{ + FMOD_OS_Thread_Destroy(handle); +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/common.h b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common.h new file mode 100644 index 0000000..3a6ceb0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common.h @@ -0,0 +1,93 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. +==============================================================================*/ +#ifndef FMOD_EXAMPLES_COMMON_H +#define FMOD_EXAMPLES_COMMON_H + +#include "common_platform.h" +#include "fmod.h" + +#include +#include +#include +#include +#include +#include +#include + +#define NUM_COLUMNS 50 +#define NUM_ROWS 25 + +#ifndef Common_Sin + #define Common_Sin sin +#endif + +#ifndef Common_snprintf + #define Common_snprintf snprintf +#endif + +#ifndef Common_vsnprintf + #define Common_vsnprintf vsnprintf +#endif + +enum Common_Button +{ + BTN_ACTION1, + BTN_ACTION2, + BTN_ACTION3, + BTN_ACTION4, + BTN_LEFT, + BTN_RIGHT, + BTN_UP, + BTN_DOWN, + BTN_MORE, + BTN_QUIT +}; + +typedef struct +{ + void *crit; +} Common_Mutex; + +/* Cross platform functions (common) */ +void Common_Format(char *buffer, int bufferSize, const char *formatString...); +void Common_Fatal(const char *format, ...); +void Common_Draw(const char *format, ...); +void Common_Time_GetUs(unsigned int *us); +void Common_Log(const char *format, ...); +void Common_LoadFileMemory(const char *name, void **buff, int *length); +void Common_UnloadFileMemory(void *buff); +void Common_Sleep(unsigned int ms); +void Common_File_Open(const char *name, int mode, unsigned int *filesize, void **handle); // mode : 0 = read, 1 = write. +void Common_File_Close(void *handle); +void Common_File_Read(void *handle, void *buf, unsigned int length, unsigned int *read); +void Common_File_Write(void *handle, void *buf, unsigned int length); +void Common_File_Seek(void *handle, unsigned int offset); +void Common_Mutex_Create(Common_Mutex *mutex); +void Common_Mutex_Destroy(Common_Mutex *mutex); +void Common_Mutex_Enter(Common_Mutex *mutex); +void Common_Mutex_Leave(Common_Mutex *mutex); +void Common_Thread_Create(void (*callback)(void *param), void *param, void **handle); +void Common_Thread_Destroy(void *handle); + +void ERRCHECK_fn(FMOD_RESULT result, const char *file, int line); +#define ERRCHECK(_result) ERRCHECK_fn(_result, __FILE__, __LINE__) +#define Common_Max(_a, _b) ((_a) > (_b) ? (_a) : (_b)) +#define Common_Min(_a, _b) ((_a) < (_b) ? (_a) : (_b)) +#define Common_Clamp(_min, _val, _max) ((_val) < (_min) ? (_min) : ((_val) > (_max) ? (_max) : (_val))) + +/* Functions with platform specific implementation (common_platform) */ +void Common_Init(void **extraDriverData); +void Common_Close(); +void Common_Update(); +void Common_Exit(int returnCode); +void Common_DrawText(const char *text); +bool Common_BtnPress(Common_Button btn); +bool Common_BtnDown(Common_Button btn); +const char *Common_BtnStr(Common_Button btn); +const char *Common_MediaPath(const char *fileName); +const char *Common_WritePath(const char *fileName); + + +#endif diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/common_platform.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common_platform.cpp new file mode 100644 index 0000000..06fe4e7 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common_platform.cpp @@ -0,0 +1,188 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2014-2025. +==============================================================================*/ +#include "common.h" +#include +#include +#include +#include + +static unsigned int gPressedButtons = 0; +static unsigned int gDownButtons = 0; +static std::string gConsoleText; +static std::vector gPathList; +static termios originalTerm = {0}; + +static void RevertTerminal() +{ + tcsetattr(STDIN_FILENO, TCSANOW, &originalTerm); + + printf("%c[?25h", 0x1B); // Show the cursor +} + +void Common_Init(void **extraDriverData) +{ + int err = tcgetattr(STDIN_FILENO, &originalTerm); + assert(err == 0); + + err = atexit(RevertTerminal); // Register for atexit in case we bail and don't call Common_Close + assert(err == 0); + + termios term = {0}; + err = tcgetattr(STDIN_FILENO, &term); + assert(err == 0); + + term.c_lflag &= ~(ICANON); // Disable special characters, i.e. EOF, EOL, etc + term.c_lflag &= ~(ECHO); // Prevent echo of characters + term.c_cc[VMIN] = 1; // Specify min number of bytes before a read() can return + + err = tcsetattr(STDIN_FILENO, TCSANOW, &term); + assert(err == 0); + + printf("%c[?25l", 0x1B); // Hide the cursor +} + +void Common_Close() +{ + for (std::vector::iterator item = gPathList.begin(); item != gPathList.end(); ++item) + { + free(*item); + } +} + +static bool IsKeyPressed() +{ + fd_set fileDescMask; + FD_ZERO(&fileDescMask); + FD_SET(STDIN_FILENO, &fileDescMask); + + timeval timeSpan = {0, 1000}; // 0s, 1000us + + // Check file descriptor provided for read, returns number of ready for read file descriptors + int err = select(1, &fileDescMask, NULL, NULL, &timeSpan); + assert(err >= 0); + + return (err > 0); +} + +void Common_Update() +{ + /* + Capture key input + */ + unsigned int newButtons = 0; + while (IsKeyPressed()) + { + unsigned int key = getchar(); + + if (key == '1') newButtons |= (1 << BTN_ACTION1); + else if (key == '2') newButtons |= (1 << BTN_ACTION2); + else if (key == '3') newButtons |= (1 << BTN_ACTION3); + else if (key == '4') newButtons |= (1 << BTN_ACTION4); + else if (key == 'w') newButtons |= (1 << BTN_UP); + else if (key == 'a') newButtons |= (1 << BTN_LEFT); + else if (key == 's') newButtons |= (1 << BTN_DOWN); + else if (key == 'd') newButtons |= (1 << BTN_RIGHT); + else if (key == 32) newButtons |= (1 << BTN_MORE); + else if (key == 'q') newButtons |= (1 << BTN_QUIT); + } + + gPressedButtons = (gDownButtons ^ newButtons) & newButtons; + gDownButtons = newButtons; + + /* + Update the screen + */ + printf("%c[H", 0x1B); // Move cursor to home position + printf("%s", gConsoleText.c_str()); // Terminal console is already double buffered, so just print + printf("%c[J", 0x1B); // Clear the rest of the screen + + gConsoleText.clear(); +} + +void Common_Exit(int returnCode) +{ + exit(returnCode); +} + +void Common_DrawText(const char *text) +{ + char s[256]; + snprintf(s, sizeof(s), "%s%c[K\n", text, 0x1B); // Print the text and clear the rest of the line + + gConsoleText.append(s); +} + +bool Common_BtnPress(Common_Button btn) +{ + return ((gPressedButtons & (1 << btn)) != 0); +} + +bool Common_BtnDown(Common_Button btn) +{ + return ((gDownButtons & (1 << btn)) != 0); +} + +const char *Common_BtnStr(Common_Button btn) +{ + switch (btn) + { + case BTN_ACTION1: return "1"; + case BTN_ACTION2: return "2"; + case BTN_ACTION3: return "3"; + case BTN_ACTION4: return "4"; + case BTN_UP: return "W"; + case BTN_LEFT: return "A"; + case BTN_DOWN: return "S"; + case BTN_RIGHT: return "D"; + case BTN_MORE: return "SPACE"; + case BTN_QUIT: return "Q"; + default: return "Unknown"; + } +} + +const char *Common_MediaPath(const char *fileName) +{ + static bool pathInitialized = false; + static char pathPrefix[256] = { }; + if (!pathInitialized) + { + pathInitialized = true; + FILE *file = fopen(fileName, "r"); + if (file) + { + fclose(file); + pathPrefix[0] = 0; + } + else + { + ssize_t len = readlink("/proc/self/exe", pathPrefix, 256); + assert(len != -1); + + char *filePathEnd = strrchr(pathPrefix, '/'); + assert (filePathEnd != NULL); + + filePathEnd++; // Move past the last slash + filePathEnd[0] = '\0'; + + strcat(pathPrefix, "../media/"); + } + } + if (pathPrefix[0] == 0) + { + return fileName; + } + + char *filePath = (char *)calloc(256, sizeof(char)); + strcpy(filePath, pathPrefix); + strcat(filePath, fileName); + gPathList.push_back(filePath); + + return filePath; +} + +const char *Common_WritePath(const char *fileName) +{ + return Common_MediaPath(fileName); +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/common_platform.h b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common_platform.h new file mode 100644 index 0000000..2febd31 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/common_platform.h @@ -0,0 +1,12 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2014-2025. +==============================================================================*/ +#include +#include +#include + +#define COMMON_PLATFORM_SUPPORTS_FOPEN + +#define FMOD_Main() main(int, char**) +#define Common_TTY(format, ...) fprintf(stderr, format, __VA_ARGS__) diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb.cpp new file mode 100644 index 0000000..fa008d3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb.cpp @@ -0,0 +1,239 @@ +/*============================================================================== +Convolution Reverb Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to set up a convolution reverb DSP as a global +DSP unit that can be routed into by multiple seperate channels. + +Convolution reverb uses data from a real world locations called an +"Impulse Response" to model the reflection of audio waves back +to a listener. + +Impulse Response is based on "St Andrew's Church" by + + www.openairlib.net + Audiolab, University of York + Damian T. Murphy + http://www.openairlib.net/auralizationdb/content/st-andrews-church + +licensed under Attribution Share Alike Creative Commons license +http://creativecommons.org/licenses/by-sa/3.0/ + + +Anechoic sample "Operatic Voice" by + + www.openairlib.net + http://www.openairlib.net/anechoicdb/content/operatic-voice + +licensed under Attribution Share Alike Creative Commons license +http://creativecommons.org/licenses/by-sa/3.0/ + + +### Features Demonstrated ### ++ FMOD_DSP_CONVOLUTION_REVERB ++ DSP::addInput + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal + +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + void *extradriverdata = 0; + Common_Init(&extradriverdata); + + /* + Create a System object and initialize + */ + FMOD_RESULT result; + FMOD::System* system; + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + + /* + Create a new channel group to hold the convolution DSP unit + */ + FMOD::ChannelGroup* reverbGroup; + result = system->createChannelGroup("reverb", &reverbGroup); + ERRCHECK(result); + + + /* + Create a new channel group to hold all the channels and process the dry path + */ + FMOD::ChannelGroup* mainGroup; + result = system->createChannelGroup("main", &mainGroup); + ERRCHECK(result); + + /* + Create the convultion DSP unit and set it as the tail of the channel group + */ + FMOD::DSP* reverbUnit; + result = system->createDSPByType(FMOD_DSP_TYPE_CONVOLUTIONREVERB, &reverbUnit); + ERRCHECK(result); + result = reverbGroup->addDSP(FMOD_CHANNELCONTROL_DSP_TAIL, reverbUnit); + ERRCHECK(result); + + /* + Open the impulse response wav file, but use FMOD_OPENONLY as we want + to read the data into a seperate buffer + */ + FMOD::Sound* irSound; + result = system->createSound(Common_MediaPath("standrews.wav"), FMOD_DEFAULT | FMOD_OPENONLY, NULL, &irSound); + ERRCHECK(result); + + /* + Retrieve the sound information for the Impulse Response input file + */ + FMOD_SOUND_FORMAT irSoundFormat; + FMOD_SOUND_TYPE irSoundType; + int irSoundBits, irSoundChannels; + result = irSound->getFormat(&irSoundType, &irSoundFormat, &irSoundChannels, &irSoundBits); + ERRCHECK(result); + unsigned int irSoundLength; + result = irSound->getLength(&irSoundLength, FMOD_TIMEUNIT_PCM); + ERRCHECK(result); + + + if (irSoundFormat != FMOD_SOUND_FORMAT_PCM16) + { + /* + For simplicity of the example, if the impulse response is the wrong format just display an error + */ + Common_Fatal("Impulse Response file is the wrong audio format"); + } + + /* + The reverb unit expects a block of data containing a single 16 bit int containing + the number of channels in the impulse response, followed by PCM 16 data + */ + unsigned int irDataLength = sizeof(short) * (irSoundLength * irSoundChannels + 1); + short* irData = (short*)malloc(irDataLength); + irData[0] = (short)irSoundChannels; + unsigned int irDataRead; + result = irSound->readData(&irData[1], irDataLength - sizeof(short), &irDataRead); + ERRCHECK(result); + result = reverbUnit->setParameterData(FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR, irData, irDataLength); + ERRCHECK(result); + + /* + Don't pass any dry signal from the reverb unit, instead take the dry part + of the mix from the main signal path + */ + result = reverbUnit->setParameterFloat(FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY, -80.0f); + ERRCHECK(result); + + /* + We can now free our copy of the IR data and release the sound object, the reverb unit + has created it's internal data + */ + free(irData); + result = irSound->release(); + ERRCHECK(result); + + /* + Load up and play a sample clip recorded in an anechoic chamber + */ + FMOD::Sound* sound; + system->createSound(Common_MediaPath("singing.wav"), FMOD_3D | FMOD_LOOP_NORMAL, NULL, &sound); + ERRCHECK(result); + + FMOD::Channel* channel; + system->playSound(sound, mainGroup, true, &channel); + ERRCHECK(result); + + /* + Create a send connection between the channel head and the reverb unit + */ + FMOD::DSP* channelHead; + channel->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &channelHead); + ERRCHECK(result); + FMOD::DSPConnection* reverbConnection; + result = reverbUnit->addInput(channelHead, &reverbConnection, FMOD_DSPCONNECTION_TYPE_SEND); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + + + float wetVolume = 1.0; + float dryVolume = 1.0; + + /* + Main loop + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_LEFT)) + { + wetVolume = (wetVolume <= 0.0f) ? wetVolume : wetVolume - 0.05f; + } + if (Common_BtnPress(BTN_RIGHT)) + { + wetVolume = (wetVolume >= 1.0f) ? wetVolume : wetVolume + 0.05f; + } + if (Common_BtnPress(BTN_DOWN)) + { + dryVolume = (dryVolume <= 0.0f) ? dryVolume : dryVolume - 0.05f; + } + if (Common_BtnPress(BTN_UP)) + { + dryVolume = (dryVolume >= 1.0f) ? dryVolume : dryVolume + 0.05f; + } + + + result = system->update(); + ERRCHECK(result); + + result = reverbConnection->setMix(wetVolume); + ERRCHECK(result); + result = mainGroup->setVolume(dryVolume); + ERRCHECK(result); + + + Common_Draw("=================================================="); + Common_Draw("Convolution Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw("Press %s and %s to change dry mix", Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s and %s to change wet mix", Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT)); + Common_Draw("wet mix [%.2f] dry mix [%.2f]", wetVolume, dryVolume); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound->release(); + ERRCHECK(result); + result = mainGroup->release(); + ERRCHECK(result); + result = reverbGroup->removeDSP(reverbUnit); + ERRCHECK(result); + result = reverbUnit->disconnectAll(true, true); + ERRCHECK(result); + result = reverbUnit->release(); + ERRCHECK(result); + result = reverbGroup->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.creator.shared new file mode 100644 index 0000000..244b73a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f convolution_reverb.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/convolution_reverb + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.files new file mode 100644 index 0000000..b6cdf7b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/convolution_reverb.makefile +../convolution_reverb.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/convolution_reverb/convolution_reverb.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom.cpp new file mode 100644 index 0000000..472239b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom.cpp @@ -0,0 +1,362 @@ +/*============================================================================== +Custom DSP Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to add a user created DSP callback to process audio +data. The read callback is executed at runtime, and can be added anywhere in +the DSP network. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +typedef struct +{ + float *buffer; + float volume_linear; + int length_samples; + int channels; +} mydsp_data_t; + +FMOD_RESULT F_CALL myDSPCallback(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels) +{ + mydsp_data_t *data = (mydsp_data_t *)dsp_state->plugindata; + + /* + This loop assumes inchannels = outchannels, which it will be if the DSP is created with '0' + as the number of channels in FMOD_DSP_DESCRIPTION. + Specifying an actual channel count will mean you have to take care of any number of channels coming in, + but outputting the number of channels specified. Generally it is best to keep the channel + count at 0 for maximum compatibility. + */ + for (unsigned int samp = 0; samp < length; samp++) + { + /* + Feel free to unroll this. + */ + for (int chan = 0; chan < *outchannels; chan++) + { + /* + This DSP filter just halves the volume! + Input is modified, and sent to output. + */ + data->buffer[(samp * *outchannels) + chan] = outbuffer[(samp * inchannels) + chan] = inbuffer[(samp * inchannels) + chan] * data->volume_linear; + } + } + + data->channels = inchannels; + + return FMOD_OK; +} + +/* + Callback called when DSP is created. This implementation creates a structure which is attached to the dsp state's 'plugindata' member. +*/ +FMOD_RESULT F_CALL myDSPCreateCallback(FMOD_DSP_STATE *dsp_state) +{ + unsigned int blocksize; + FMOD_RESULT result; + + result = dsp_state->functions->getblocksize(dsp_state, &blocksize); + ERRCHECK(result); + + mydsp_data_t *data = (mydsp_data_t *)calloc(sizeof(mydsp_data_t), 1); + if (!data) + { + return FMOD_ERR_MEMORY; + } + dsp_state->plugindata = data; + data->volume_linear = 1.0f; + data->length_samples = blocksize; + + data->buffer = (float *)malloc(blocksize * 8 * sizeof(float)); // *8 = maximum size allowing room for 7.1. Could ask dsp_state->functions->getspeakermode for the right speakermode to get real speaker count. + if (!data->buffer) + { + return FMOD_ERR_MEMORY; + } + + return FMOD_OK; +} + +/* + Callback called when DSP is destroyed. The memory allocated in the create callback can be freed here. +*/ +FMOD_RESULT F_CALL myDSPReleaseCallback(FMOD_DSP_STATE *dsp_state) +{ + if (dsp_state->plugindata) + { + mydsp_data_t *data = (mydsp_data_t *)dsp_state->plugindata; + + if (data->buffer) + { + free(data->buffer); + } + + free(data); + } + + return FMOD_OK; +} + +/* + Callback called when DSP::getParameterData is called. This returns a pointer to the raw floating point PCM data. + We have set up 'parameter 0' to be the data parameter, so it checks to make sure the passed in index is 0, and nothing else. +*/ +FMOD_RESULT F_CALL myDSPGetParameterDataCallback(FMOD_DSP_STATE *dsp_state, int index, void **data, unsigned int *length, char *) +{ + if (index == 0) + { + unsigned int blocksize; + FMOD_RESULT result; + mydsp_data_t *mydata = (mydsp_data_t *)dsp_state->plugindata; + + result = dsp_state->functions->getblocksize(dsp_state, &blocksize); + ERRCHECK(result); + + *data = (void *)mydata; + *length = blocksize * 2 * sizeof(float); + + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +/* + Callback called when DSP::setParameterFloat is called. This accepts a floating point 0 to 1 volume value, and stores it. + We have set up 'parameter 1' to be the volume parameter, so it checks to make sure the passed in index is 1, and nothing else. +*/ +FMOD_RESULT F_CALL myDSPSetParameterFloatCallback(FMOD_DSP_STATE *dsp_state, int index, float value) +{ + if (index == 1) + { + mydsp_data_t *mydata = (mydsp_data_t *)dsp_state->plugindata; + + mydata->volume_linear = value; + + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +/* + Callback called when DSP::getParameterFloat is called. This returns a floating point 0 to 1 volume value. + We have set up 'parameter 1' to be the volume parameter, so it checks to make sure the passed in index is 1, and nothing else. + An alternate way of displaying the data is provided, as a string, so the main app can use it. +*/ +FMOD_RESULT F_CALL myDSPGetParameterFloatCallback(FMOD_DSP_STATE *dsp_state, int index, float *value, char *valstr) +{ + if (index == 1) + { + mydsp_data_t *mydata = (mydsp_data_t *)dsp_state->plugindata; + + *value = mydata->volume_linear; + if (valstr) + { + snprintf(valstr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, "%d", (int)((*value * 100.0f)+0.5f)); + } + + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound; + FMOD::Channel *channel; + FMOD::DSP *mydsp; + FMOD::ChannelGroup *mastergroup; + FMOD_RESULT result; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("stereo.ogg"), FMOD_LOOP_NORMAL, 0, &sound); + ERRCHECK(result); + + result = system->playSound(sound, 0, false, &channel); + ERRCHECK(result); + + /* + Create the DSP effect. + */ + { + FMOD_DSP_DESCRIPTION dspdesc; + memset(&dspdesc, 0, sizeof(dspdesc)); + FMOD_DSP_PARAMETER_DESC wavedata_desc; + FMOD_DSP_PARAMETER_DESC volume_desc; + FMOD_DSP_PARAMETER_DESC *paramdesc[2] = + { + &wavedata_desc, + &volume_desc + }; + + FMOD_DSP_INIT_PARAMDESC_DATA(wavedata_desc, "wave data", "", "wave data", FMOD_DSP_PARAMETER_DATA_TYPE_USER); + FMOD_DSP_INIT_PARAMDESC_FLOAT(volume_desc, "volume", "%", "linear volume in percent", 0, 1, 1); + + strncpy(dspdesc.name, "My first DSP unit", sizeof(dspdesc.name)); + dspdesc.version = 0x00010000; + dspdesc.numinputbuffers = 1; + dspdesc.numoutputbuffers = 1; + dspdesc.read = myDSPCallback; + dspdesc.create = myDSPCreateCallback; + dspdesc.release = myDSPReleaseCallback; + dspdesc.getparameterdata = myDSPGetParameterDataCallback; + dspdesc.setparameterfloat = myDSPSetParameterFloatCallback; + dspdesc.getparameterfloat = myDSPGetParameterFloatCallback; + dspdesc.numparameters = 2; + dspdesc.paramdesc = paramdesc; + + result = system->createDSP(&dspdesc, &mydsp); + ERRCHECK(result); + } + + result = system->getMasterChannelGroup(&mastergroup); + ERRCHECK(result); + + result = mastergroup->addDSP(0, mydsp); + ERRCHECK(result); + + /* + Main loop. + */ + do + { + bool bypass; + + Common_Update(); + + result = mydsp->getBypass(&bypass); + ERRCHECK(result); + + if (Common_BtnPress(BTN_ACTION1)) + { + bypass = !bypass; + + result = mydsp->setBypass(bypass); + ERRCHECK(result); + } + if (Common_BtnPress(BTN_ACTION2)) + { + float vol; + + result = mydsp->getParameterFloat(1, &vol, 0, 0); + ERRCHECK(result); + + if (vol > 0.0f) + { + vol -= 0.1f; + } + + result = mydsp->setParameterFloat(1, vol); + ERRCHECK(result); + } + if (Common_BtnPress(BTN_ACTION3)) + { + float vol; + + result = mydsp->getParameterFloat(1, &vol, 0, 0); + ERRCHECK(result); + + if (vol < 1.0f) + { + vol += 0.1f; + } + + result = mydsp->setParameterFloat(1, vol); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + { + char volstr[32] = { 0 }; + FMOD_DSP_PARAMETER_DESC *desc; + mydsp_data_t *data; + + result = mydsp->getParameterInfo(1, &desc); + ERRCHECK(result); + result = mydsp->getParameterFloat(1, 0, volstr, 32); + ERRCHECK(result); + result = mydsp->getParameterData(0, (void **)&data, 0, 0, 0); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("Custom DSP Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to toggle filter bypass", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to decrease volume 10%%", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to increase volume 10%%", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Filter is %s", bypass ? "inactive" : "active"); + Common_Draw("Volume is %s%s", volstr, desc->label); + + if (data->channels) + { + char display[80] = { 0 }; + int channel; + + for (channel = 0; channel < data->channels; channel++) + { + int count,level; + float max = 0; + + for (count = 0; count < data->length_samples; count++) + { + if (fabsf(data->buffer[(count * data->channels) + channel]) > max) + { + max = fabsf(data->buffer[(count * data->channels) + channel]); + } + } + level = (int)(max * 40.0f); + + snprintf(display, sizeof(display), "%2d ", channel); + for (count = 0; count < level; count++) display[count + 3] = '='; + + Common_Draw(display); + } + } + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound->release(); + ERRCHECK(result); + + result = mastergroup->removeDSP(mydsp); + ERRCHECK(result); + result = mydsp->release(); + ERRCHECK(result); + + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.creator.shared new file mode 100644 index 0000000..1c480f0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_custom.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/dsp_custom + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.files new file mode 100644 index 0000000..c604d26 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/dsp_custom.makefile +../dsp_custom.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_custom/dsp_custom.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker.cpp new file mode 100644 index 0000000..e451536 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker.cpp @@ -0,0 +1,276 @@ +/*============================================================================== +DSP Effect Per Speaker Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to manipulate a DSP network and as an example, creates 2 +DSP effects, splitting a single sound into 2 audio paths, which it then filters +seperately. + +To only have each audio path come out of one speaker each, +DSPConnection::setMixMatrix is used just before the 2 branches merge back together +again. + +For more speakers: + + * Use System::setSoftwareFormat + * Create more effects, currently 2 for stereo (lowpass and highpass), create one + per speaker. + * Under the 'Now connect the 2 effects to channeldsp head.' section, connect + the extra effects by duplicating the code more times. + * Filter each effect to each speaker by calling DSPConnection::setMixMatrix. + Expand the existing code by extending the matrices from 2 in and 2 out, to the + number of speakers you require. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound; + FMOD::Channel *channel; + FMOD::ChannelGroup *mastergroup; + FMOD::DSP *dsplowpass, *dsphighpass, *dsphead, *dspchannelmixer; + FMOD::DSPConnection *dsplowpassconnection, *dsphighpassconnection; + FMOD_RESULT result; + float pan = 0.0f; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + /* + In this special case we want to use stereo output and not worry about varying matrix sizes depending on user speaker mode. + */ + system->setSoftwareFormat(48000, FMOD_SPEAKERMODE_STEREO, 0); + ERRCHECK(result); + + /* + Initialize FMOD + */ + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_LOOP_NORMAL, 0, &sound); + ERRCHECK(result); + + result = system->playSound(sound, 0, false, &channel); + ERRCHECK(result); + + /* + Create the DSP effects. + */ + result = system->createDSPByType(FMOD_DSP_TYPE_LOWPASS, &dsplowpass); + ERRCHECK(result); + + result = dsplowpass->setParameterFloat(FMOD_DSP_LOWPASS_CUTOFF, 1000.0f); + ERRCHECK(result); + result = dsplowpass->setParameterFloat(FMOD_DSP_LOWPASS_RESONANCE, 4.0f); + ERRCHECK(result); + + result = system->createDSPByType(FMOD_DSP_TYPE_HIGHPASS, &dsphighpass); + ERRCHECK(result); + + result = dsphighpass->setParameterFloat(FMOD_DSP_HIGHPASS_CUTOFF, 4000.0f); + ERRCHECK(result); + result = dsphighpass->setParameterFloat(FMOD_DSP_HIGHPASS_RESONANCE, 4.0f); + ERRCHECK(result); + + /* + Connect up the DSP network + */ + + /* + When a sound is played, a subnetwork is set up in the DSP network which looks like this. + Wavetable is the drumloop sound, and it feeds its data from right to left. + + [DSPHEAD]<------------[DSPCHANNELMIXER]<------------[CHANNEL HEAD]<------------[WAVETABLE - DRUMLOOP.WAV] + */ + result = system->getMasterChannelGroup(&mastergroup); + ERRCHECK(result); + + result = mastergroup->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &dsphead); + ERRCHECK(result); + + result = dsphead->getInput(0, &dspchannelmixer, 0); + ERRCHECK(result); + + /* + Now disconnect channeldsp head from wavetable to look like this. + + [DSPHEAD] [DSPCHANNELMIXER]<------------[CHANNEL HEAD]<------------[WAVETABLE - DRUMLOOP.WAV] + */ + result = dsphead->disconnectFrom(dspchannelmixer); + ERRCHECK(result); + + /* + Now connect the 2 effects to channeldsp head. + Store the 2 connections this makes so we can set their matrix later. + + [DSPLOWPASS] + /x + [DSPHEAD] [DSPCHANNELMIXER]<------------[CHANNEL HEAD]<------------[WAVETABLE - DRUMLOOP.WAV] + \y + [DSPHIGHPASS] + */ + result = dsphead->addInput(dsplowpass, &dsplowpassconnection); /* x = dsplowpassconnection */ + ERRCHECK(result); + result = dsphead->addInput(dsphighpass, &dsphighpassconnection); /* y = dsphighpassconnection */ + ERRCHECK(result); + + /* + Now connect the channelmixer to the 2 effects + + [DSPLOWPASS] + /x \ + [DSPHEAD] [DSPCHANNELMIXER]<------------[CHANNEL HEAD]<------------[WAVETABLE - DRUMLOOP.WAV] + \y / + [DSPHIGHPASS] + */ + result = dsplowpass->addInput(dspchannelmixer); /* Ignore connection - we dont care about it. */ + ERRCHECK(result); + + result = dsphighpass->addInput(dspchannelmixer); /* Ignore connection - we dont care about it. */ + ERRCHECK(result); + + /* + Now the drumloop will be twice as loud, because it is being split into 2, then recombined at the end. + What we really want is to only feed the dsphead<-dsplowpass through the left speaker for that effect, and + dsphead<-dsphighpass to the right speaker for that effect. + We can do that simply by setting the pan, or speaker matrix of the connections. + + [DSPLOWPASS] + /x=1,0 \ + [DSPHEAD] [DSPCHANNELMIXER]<------------[CHANNEL HEAD]<------------[WAVETABLE - DRUMLOOP.WAV] + \y=0,1 / + [DSPHIGHPASS] + */ + { + float lowpassmatrix[2][2] = { + { 1.0f, 0.0f }, // <- output to front left. Take front left input signal at 1.0. + { 0.0f, 0.0f } // <- output to front right. Silence + }; + float highpassmatrix[2][2] = { + { 0.0f, 0.0f }, // <- output to front left. Silence + { 0.0f, 1.0f } // <- output to front right. Take front right input signal at 1.0 + }; + + /* + Upgrade the signal coming from the channel mixer from mono to stereo. Otherwise the lowpass and highpass will get mono signals + */ + result = dspchannelmixer->setChannelFormat(0, 0, FMOD_SPEAKERMODE_STEREO); + ERRCHECK(result); + + /* + Now set the above matrices. + */ + result = dsplowpassconnection->setMixMatrix(&lowpassmatrix[0][0], 2, 2); + ERRCHECK(result); + result = dsphighpassconnection->setMixMatrix(&highpassmatrix[0][0], 2, 2); + ERRCHECK(result); + } + + result = dsplowpass->setBypass(true); + ERRCHECK(result); + result = dsphighpass->setBypass(true); + ERRCHECK(result); + + result = dsplowpass->setActive(true); + ERRCHECK(result); + result = dsphighpass->setActive(true); + ERRCHECK(result); + + /* + Main loop. + */ + do + { + bool lowpassbypass, highpassbypass; + + Common_Update(); + + result = dsplowpass->getBypass(&lowpassbypass); + ERRCHECK(result); + result = dsphighpass->getBypass(&highpassbypass); + ERRCHECK(result); + + if (Common_BtnPress(BTN_ACTION1)) + { + lowpassbypass = !lowpassbypass; + + result = dsplowpass->setBypass(lowpassbypass); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + highpassbypass = !highpassbypass; + + result = dsphighpass->setBypass(highpassbypass); + ERRCHECK(result); + } + + if (Common_BtnDown(BTN_LEFT)) + { + pan = (pan <= -0.9f) ? -1.0f : pan - 0.1f; + + result = channel->setPan(pan); + ERRCHECK(result); + } + + if (Common_BtnDown(BTN_RIGHT)) + { + pan = (pan >= 0.9f) ? 1.0f : pan + 0.1f; + + result = channel->setPan(pan); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("DSP Effect Per Speaker Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to toggle lowpass (left speaker)", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to toggle highpass (right speaker)", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s or %s to pan sound", Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Lowpass (left) is %s", lowpassbypass ? "inactive" : "active"); + Common_Draw("Highpass (right) is %s", highpassbypass ? "inactive" : "active"); + Common_Draw("Pan is %0.2f", pan); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound->release(); + ERRCHECK(result); + + result = dsplowpass->release(); + ERRCHECK(result); + result = dsphighpass->release(); + ERRCHECK(result); + + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.creator.shared new file mode 100644 index 0000000..879b777 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_effect_per_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/dsp_effect_per_speaker + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.files new file mode 100644 index 0000000..795dc18 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/dsp_effect_per_speaker.makefile +../dsp_effect_per_speaker.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_effect_per_speaker/dsp_effect_per_speaker.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector.cpp new file mode 100644 index 0000000..7cb821b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector.cpp @@ -0,0 +1,331 @@ +/*============================================================================== +Plug-in Inspector Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to enumerate loaded plug-ins and their parameters. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +const int INTERFACE_UPDATETIME = 50; // 50ms update for interface +const int MAX_PLUGINS_IN_VIEW = 5; +const int MAX_PARAMETERS_IN_VIEW = 14; + +enum InspectorState +{ + PLUGIN_SELECTOR, + PARAMETER_VIEWER +}; + +struct PluginSelectorState +{ + FMOD::System *system; + int numplugins; + int cursor; +}; + +struct ParameterViewerState +{ + FMOD::DSP *dsp; + int numparams; + int scroll; +}; + +void drawTitle() +{ + Common_Draw("=================================================="); + Common_Draw("Plug-in Inspector Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); +} + +bool hasDataParameter(const FMOD_DSP_DESCRIPTION *desc, FMOD_DSP_PARAMETER_DATA_TYPE type) +{ + for (int i = 0; i < desc->numparameters; i++) + { + if (desc->paramdesc[i]->type == FMOD_DSP_PARAMETER_TYPE_DATA && ((type >= 0 && desc->paramdesc[i]->datadesc.datatype >= 0) || desc->paramdesc[i]->datadesc.datatype == type)) + { + return true; + } + } + + return false; +} + +void drawDSPInfo(const FMOD_DSP_DESCRIPTION *desc) +{ + Common_Draw("Name (Version) : %s (%x)", desc->name, desc->version); + Common_Draw("SDK Version : %d", desc->pluginsdkversion); + Common_Draw("Type : %s", desc->numinputbuffers ? "Effect" : "Sound Generator"); + Common_Draw("Parameters : %d", desc->numparameters); + Common_Draw("Audio Callback : %s", desc->process ? "process()" : "read()"); + Common_Draw(""); + Common_Draw(" Reset | Side-Chain | 3D | Audibility | User Data"); + Common_Draw(" %s | %s | %s | %s | %s ", + desc->reset ? "Y " : "--", + hasDataParameter(desc, FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN) ? "Y " : "--", + hasDataParameter(desc, FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES) || hasDataParameter(desc, FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI) ? "Y " : "--", + hasDataParameter(desc, FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN) ? "Y " : "--", + hasDataParameter(desc, FMOD_DSP_PARAMETER_DATA_TYPE_USER) || desc->userdata ? "Y " : "--"); +} + +void drawDSPList(PluginSelectorState *state) +{ + unsigned int pluginhandle; + char pluginname[256]; + FMOD_RESULT result; + + Common_Draw("Press %s to select the next plug-in", Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s to select the previous plug-in", Common_BtnStr(BTN_UP)); + Common_Draw("Press %s to view the plug-in parameters", Common_BtnStr(BTN_RIGHT)); + Common_Draw(""); + + int start = Common_Clamp(0, state->cursor - (MAX_PLUGINS_IN_VIEW - 1) / 2, state->numplugins - MAX_PLUGINS_IN_VIEW); + for (int i = start; i < start + MAX_PLUGINS_IN_VIEW; i++) + { + result = state->system->getPluginHandle(FMOD_PLUGINTYPE_DSP, i, &pluginhandle); + ERRCHECK(result); + + result = state->system->getPluginInfo(pluginhandle, 0, pluginname, 256, 0); + ERRCHECK(result); + + Common_Draw("%s %s", i == state->cursor ? ">" : " ", pluginname); + } + + Common_Draw(""); + Common_Draw("=================================================="); + Common_Draw(""); + + result = state->system->getPluginHandle(FMOD_PLUGINTYPE_DSP, state->cursor, &pluginhandle); + ERRCHECK(result); + + const FMOD_DSP_DESCRIPTION *description; + result = state->system->getDSPInfoByPlugin(pluginhandle, &description); + ERRCHECK(result); + + drawDSPInfo(description); +} + +void drawDSPParameters(ParameterViewerState *state) +{ + FMOD_RESULT result; + FMOD_DSP_PARAMETER_DESC *paramdesc; + char pluginname[256]; + + Common_Draw("Press %s to scroll down", Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s to scroll up", Common_BtnStr(BTN_UP)); + Common_Draw("Press %s to return to the plug-in list", Common_BtnStr(BTN_LEFT)); + Common_Draw(""); + + result = state->dsp->getInfo(pluginname, 0, 0, 0, 0); + ERRCHECK(result); + + Common_Draw("%s Parameters:", pluginname); + Common_Draw("--------------------------------------------------"); + + for (int i = state->scroll; i < state->numparams; i++) + { + result = state->dsp->getParameterInfo(i, ¶mdesc); + ERRCHECK(result); + switch (paramdesc->type) + { + case FMOD_DSP_PARAMETER_TYPE_FLOAT: + { + char *units = paramdesc->label; + Common_Draw("%2d: %-15s [%g, %g] (%.2f%s)", i, paramdesc->name, paramdesc->floatdesc.min, paramdesc->floatdesc.max, paramdesc->floatdesc.defaultval, units); + break; + } + + case FMOD_DSP_PARAMETER_TYPE_INT: + { + if (paramdesc->intdesc.valuenames) + { + int lengthremaining = 1024; + char enums[1024]; + char *s = enums; + for (int j = 0; j < paramdesc->intdesc.max - paramdesc->intdesc.min; ++j) + { + int len = Common_snprintf(s, lengthremaining, "%s, ", paramdesc->intdesc.valuenames[j]); + if (!len) + { + break; + } + s += len; + lengthremaining -= len; + } + if (lengthremaining) + { + Common_snprintf(s, lengthremaining, "%s", paramdesc->intdesc.valuenames[paramdesc->intdesc.max - paramdesc->intdesc.min]); + } + Common_Draw("%2d: %-15s [%s] (%s)", i, paramdesc->name, enums, paramdesc->intdesc.valuenames[paramdesc->intdesc.defaultval - paramdesc->intdesc.min]); + } + else + { + char *units = paramdesc->label; + Common_Draw("%2d: %-15s [%d, %d] (%d%s)", i, paramdesc->name, paramdesc->intdesc.min, paramdesc->intdesc.max, paramdesc->intdesc.defaultval, units); + } + break; + } + + case FMOD_DSP_PARAMETER_TYPE_BOOL: + { + if (paramdesc->booldesc.valuenames) + { + Common_Draw("%2d: %-15s [%s, %s] (%s)", i, paramdesc->name, paramdesc->booldesc.valuenames[0], paramdesc->booldesc.valuenames[1], paramdesc->booldesc.valuenames[paramdesc->booldesc.defaultval ? 1 : 0]); + } + else + { + Common_Draw("%2d: %-15s [On, Off] (%s)", i, paramdesc->name, paramdesc->booldesc.defaultval ? "On" : "Off"); + } + break; + } + + case FMOD_DSP_PARAMETER_TYPE_DATA: + { + Common_Draw("%2d: %-15s (Data type: %d)", i, paramdesc->name, paramdesc->datadesc.datatype); + break; + } + + default: + break; + } + } +} + +InspectorState pluginSelectorDo(PluginSelectorState *state) +{ + if (Common_BtnPress(BTN_UP)) + { + state->cursor = (state->cursor - 1 + state->numplugins) % state->numplugins; + } + + if (Common_BtnPress(BTN_DOWN)) + { + state->cursor = (state->cursor + 1) % state->numplugins; + } + + if (Common_BtnPress(BTN_RIGHT)) + { + return PARAMETER_VIEWER; + } + + drawTitle(); + drawDSPList(state); + + return PLUGIN_SELECTOR; +} + +InspectorState parameterViewerDo(ParameterViewerState *state) +{ + if (state->numparams > MAX_PARAMETERS_IN_VIEW) + { + if (Common_BtnPress(BTN_UP)) + { + state->scroll--; + state->scroll = Common_Max(state->scroll, 0); + } + + if (Common_BtnPress(BTN_DOWN)) + { + state->scroll++; + state->scroll = Common_Min(state->scroll, state->numparams - MAX_PARAMETERS_IN_VIEW); + } + } + + if (Common_BtnPress(BTN_LEFT)) + { + return PLUGIN_SELECTOR; + } + + drawTitle(); + drawDSPParameters(state); + + return PARAMETER_VIEWER; +} + +int FMOD_Main() +{ + FMOD::System *system = 0; + FMOD_RESULT result; + void *extradriverdata = 0; + unsigned int pluginhandle; + InspectorState state = PLUGIN_SELECTOR; + PluginSelectorState pluginselector = { 0 }; + ParameterViewerState parameterviewer = { 0 }; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->getNumPlugins(FMOD_PLUGINTYPE_DSP, &pluginselector.numplugins); + ERRCHECK(result); + + pluginselector.system = system; + + do + { + Common_Update(); + + if (state == PLUGIN_SELECTOR) + { + state = pluginSelectorDo(&pluginselector); + + if (state == PARAMETER_VIEWER) + { + result = pluginselector.system->getPluginHandle(FMOD_PLUGINTYPE_DSP, pluginselector.cursor, &pluginhandle); + ERRCHECK(result); + + result = pluginselector.system->createDSPByPlugin(pluginhandle, ¶meterviewer.dsp); + ERRCHECK(result); + + FMOD_RESULT result = parameterviewer.dsp->getNumParameters(¶meterviewer.numparams); + ERRCHECK(result); + + parameterviewer.scroll = 0; + } + } + else if (state == PARAMETER_VIEWER) + { + state = parameterViewerDo(¶meterviewer); + + if (state == PLUGIN_SELECTOR) + { + result = parameterviewer.dsp->release(); + ERRCHECK(result); + + parameterviewer.dsp = 0; + } + } + + result = system->update(); + ERRCHECK(result); + + Common_Sleep(INTERFACE_UPDATETIME - 1); + } while (!Common_BtnPress(BTN_QUIT)); + + if (parameterviewer.dsp) + { + result = parameterviewer.dsp->release(); + ERRCHECK(result); + } + + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.creator.shared new file mode 100644 index 0000000..a971d37 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f dsp_inspector.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/dsp_inspector + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.files new file mode 100644 index 0000000..46db448 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/dsp_inspector.makefile +../dsp_inspector.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/dsp_inspector/dsp_inspector.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects.cpp new file mode 100644 index 0000000..1f30d69 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects.cpp @@ -0,0 +1,237 @@ +/*============================================================================== +Effects Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to apply some of the built in software effects to sounds +by applying them to the master channel group. All software sounds played here +would be filtered in the same way. To filter per channel, and not have other +channels affected, simply apply the same functions to the FMOD::Channel instead +of the FMOD::ChannelGroup. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system = 0; + FMOD::Sound *sound = 0; + FMOD::Channel *channel = 0; + FMOD::ChannelGroup *mastergroup = 0; + FMOD::DSP *dsplowpass = 0; + FMOD::DSP *dsphighpass = 0; + FMOD::DSP *dspecho = 0; + FMOD::DSP *dspflange = 0; + FMOD_RESULT result; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->getMasterChannelGroup(&mastergroup); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_DEFAULT, 0, &sound); + ERRCHECK(result); + + result = system->playSound(sound, 0, false, &channel); + ERRCHECK(result); + + /* + Create some effects to play with + */ + result = system->createDSPByType(FMOD_DSP_TYPE_LOWPASS, &dsplowpass); + ERRCHECK(result); + result = system->createDSPByType(FMOD_DSP_TYPE_HIGHPASS, &dsphighpass); + ERRCHECK(result); + result = system->createDSPByType(FMOD_DSP_TYPE_ECHO, &dspecho); + ERRCHECK(result); + result = system->createDSPByType(FMOD_DSP_TYPE_FLANGE, &dspflange); + ERRCHECK(result); + + /* + Add them to the master channel group. Each time an effect is added (to position 0) it pushes the others down the list. + */ + result = mastergroup->addDSP(0, dsplowpass); + ERRCHECK(result); + result = mastergroup->addDSP(0, dsphighpass); + ERRCHECK(result); + result = mastergroup->addDSP(0, dspecho); + ERRCHECK(result); + result = mastergroup->addDSP(0, dspflange); + ERRCHECK(result); + + /* + By default, bypass all effects. This means let the original signal go through without processing. + It will sound 'dry' until effects are enabled by the user. + */ + result = dsplowpass->setBypass(true); + ERRCHECK(result); + result = dsphighpass->setBypass(true); + ERRCHECK(result); + result = dspecho->setBypass(true); + ERRCHECK(result); + result = dspflange->setBypass(true); + ERRCHECK(result); + + /* + Main loop + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_MORE)) + { + bool paused; + + result = channel->getPaused(&paused); + ERRCHECK(result); + + paused = !paused; + + result = channel->setPaused(paused); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION1)) + { + bool bypass; + + result = dsplowpass->getBypass(&bypass); + ERRCHECK(result); + + bypass = !bypass; + + result = dsplowpass->setBypass(bypass); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + bool bypass; + + result = dsphighpass->getBypass(&bypass); + ERRCHECK(result); + + bypass = !bypass; + + result = dsphighpass->setBypass(bypass); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION3)) + { + bool bypass; + + result = dspecho->getBypass(&bypass); + ERRCHECK(result); + + bypass = !bypass; + + result = dspecho->setBypass(bypass); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION4)) + { + bool bypass; + + result = dspflange->getBypass(&bypass); + ERRCHECK(result); + + bypass = !bypass; + + result = dspflange->setBypass(bypass); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + { + bool paused = 0; + bool dsplowpass_bypass; + bool dsphighpass_bypass; + bool dspecho_bypass; + bool dspflange_bypass; + + dsplowpass ->getBypass(&dsplowpass_bypass); + dsphighpass ->getBypass(&dsphighpass_bypass); + dspecho ->getBypass(&dspecho_bypass); + dspflange ->getBypass(&dspflange_bypass); + + if (channel) + { + result = channel->getPaused(&paused); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + } + + Common_Draw("=================================================="); + Common_Draw("Effects Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to pause/unpause sound", Common_BtnStr(BTN_MORE)); + Common_Draw("Press %s to toggle dsplowpass effect", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to toggle dsphighpass effect", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to toggle dspecho effect", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to toggle dspflange effect", Common_BtnStr(BTN_ACTION4)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("%s : lowpass[%c] highpass[%c] echo[%c] flange[%c]", + paused ? "Paused " : "Playing", + dsplowpass_bypass ? ' ' : 'x', + dsphighpass_bypass ? ' ' : 'x', + dspecho_bypass ? ' ' : 'x', + dspflange_bypass ? ' ' : 'x'); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = mastergroup->removeDSP(dsplowpass); + ERRCHECK(result); + result = mastergroup->removeDSP(dsphighpass); + ERRCHECK(result); + result = mastergroup->removeDSP(dspecho); + ERRCHECK(result); + result = mastergroup->removeDSP(dspflange); + ERRCHECK(result); + + result = dsplowpass->release(); + ERRCHECK(result); + result = dsphighpass->release(); + ERRCHECK(result); + result = dspecho->release(); + ERRCHECK(result); + result = dspflange->release(); + ERRCHECK(result); + + result = sound->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.creator.shared new file mode 100644 index 0000000..e618071 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f effects.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/effects + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.files new file mode 100644 index 0000000..09c7194 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/effects.makefile +../effects.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/effects/effects.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback.cpp new file mode 100644 index 0000000..babd623 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback.cpp @@ -0,0 +1,269 @@ +/*============================================================================== +Gapless Playback Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to schedule channel playback into the future with sample +accuracy. Use several scheduled channels to synchronize 2 or more sounds. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +enum NOTE +{ + NOTE_C, + NOTE_D, + NOTE_E, +}; + +NOTE note[] = +{ + NOTE_E, /* Ma- */ + NOTE_D, /* ry */ + NOTE_C, /* had */ + NOTE_D, /* a */ + NOTE_E, /* lit- */ + NOTE_E, /* tle */ + NOTE_E, /* lamb, */ + NOTE_E, /* ..... */ + NOTE_D, /* lit- */ + NOTE_D, /* tle */ + NOTE_D, /* lamb, */ + NOTE_D, /* ..... */ + NOTE_E, /* lit- */ + NOTE_E, /* tle */ + NOTE_E, /* lamb, */ + NOTE_E, /* ..... */ + + NOTE_E, /* Ma- */ + NOTE_D, /* ry */ + NOTE_C, /* had */ + NOTE_D, /* a */ + NOTE_E, /* lit- */ + NOTE_E, /* tle */ + NOTE_E, /* lamb, */ + NOTE_E, /* its */ + NOTE_D, /* fleece */ + NOTE_D, /* was */ + NOTE_E, /* white */ + NOTE_D, /* as */ + NOTE_C, /* snow. */ + NOTE_C, /* ..... */ + NOTE_C, /* ..... */ + NOTE_C, /* ..... */ +}; + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound[3]; + FMOD::Channel *channel = 0; + FMOD::ChannelGroup *channelgroup = 0; + FMOD_RESULT result; + unsigned int dsp_block_len, count; + int outputrate = 0; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(100, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + /* + Get information needed later for scheduling. The mixer block size, and the output rate of the mixer. + */ + result = system->getDSPBufferSize(&dsp_block_len, 0); + ERRCHECK(result); + + result = system->getSoftwareFormat(&outputrate, 0, 0); + ERRCHECK(result); + + /* + Load 3 sounds - these are just sine wave tones at different frequencies. C, D and E on the musical scale. + */ + result = system->createSound(Common_MediaPath("c.ogg"), FMOD_DEFAULT, 0, &sound[NOTE_C]); + ERRCHECK(result); + result = system->createSound(Common_MediaPath("d.ogg"), FMOD_DEFAULT, 0, &sound[NOTE_D]); + ERRCHECK(result); + result = system->createSound(Common_MediaPath("e.ogg"), FMOD_DEFAULT, 0, &sound[NOTE_E]); + ERRCHECK(result); + + /* + Create a channelgroup that the channels will play on. We can use this channelgroup as our clock reference. + It also means we can pause and pitch bend the channelgroup, without affecting the offsets of the delays, because the channelgroup clock + which the channels feed off, will be pausing and speeding up/slowing down and still keeping the children in sync. + */ + result = system->createChannelGroup("Parent", &channelgroup); + ERRCHECK(result); + + unsigned int numsounds = sizeof(note) / sizeof(note[0]); + + /* + Play all the sounds at once! Space them apart with set delay though so that they sound like they play in order. + */ + for (count = 0; count < numsounds; count++) + { + static unsigned long long clock_start = 0; + unsigned int slen; + FMOD::Sound *s = sound[note[count]]; /* Pick a note from our tune. */ + + result = system->playSound(s, channelgroup, true, &channel); /* Play the sound on the channelgroup we want to use as the parent clock reference (for setDelay further down) */ + ERRCHECK(result); + + if (!clock_start) + { + result = channel->getDSPClock(0, &clock_start); + ERRCHECK(result); + + clock_start += (dsp_block_len * 2); /* Start the sound into the future, by 2 mixer blocks worth. */ + /* Should be enough to avoid the mixer catching up and hitting the clock value before we've finished setting up everything. */ + /* Alternatively the channelgroup we're basing the clock on could be paused to stop it ticking. */ + } + else + { + float freq; + + result = s->getLength(&slen, FMOD_TIMEUNIT_PCM); /* Get the length of the sound in samples. */ + ERRCHECK(result); + + result = s->getDefaults(&freq, 0); /* Get the default frequency that the sound was recorded at. */ + ERRCHECK(result); + + slen = (unsigned int)((float)slen / freq * outputrate); /* Convert the length of the sound to 'output samples' for the output timeline. */ + + clock_start += slen; /* Place the sound clock start time to this value after the last one. */ + } + + result = channel->setDelay(clock_start, 0, false); /* Schedule the channel to start in the future at the newly calculated channelgroup clock value. */ + ERRCHECK(result); + + result = channel->setPaused(false); /* Unpause the sound. Note that you won't hear the sounds, they are scheduled into the future. */ + ERRCHECK(result); + } + + /* + Main loop. + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) /* Pausing the channelgroup as the clock parent, will pause any scheduled sounds from continuing */ + { /* If you paused the channel, this would not stop the clock it is delayed against from ticking, */ + bool paused; /* and you'd have to recalculate the delay for the channel into the future again before it was unpaused. */ + result = channelgroup->getPaused(&paused); + ERRCHECK(result); + result = channelgroup->setPaused(!paused); + ERRCHECK(result); + } + if (Common_BtnPress(BTN_ACTION2)) + { + for (count = 0; count < 50; count++) + { + float pitch; + result = channelgroup->getPitch(&pitch); + ERRCHECK(result); + pitch += 0.01f; + result = channelgroup->setPitch(pitch); + ERRCHECK(result); + + result = system->update(); + ERRCHECK(result); + + Common_Sleep(10); + } + } + if (Common_BtnPress(BTN_ACTION3)) + { + for (count = 0; count < 50; count++) + { + float pitch; + result = channelgroup->getPitch(&pitch); + ERRCHECK(result); + + if (pitch > 0.1f) + { + pitch -= 0.01f; + } + result = channelgroup->setPitch(pitch); + ERRCHECK(result); + + result = system->update(); + ERRCHECK(result); + + Common_Sleep(10); + } + } + + result = system->update(); + ERRCHECK(result); + + /* + Print some information + */ + { + bool playing = false; + bool paused = false; + int chansplaying; + + if (channelgroup) + { + result = channelgroup->isPlaying(&playing); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + + result = channelgroup->getPaused(&paused); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + } + + result = system->getChannelsPlaying(&chansplaying, NULL); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("Gapless Playback example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to toggle pause", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to increase pitch", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to decrease pitch", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Channels Playing %d : %s", chansplaying, paused ? "Paused " : playing ? "Playing" : "Stopped"); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound[NOTE_C]->release(); + ERRCHECK(result); + result = sound[NOTE_D]->release(); + ERRCHECK(result); + result = sound[NOTE_E]->release(); + ERRCHECK(result); + + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.creator.shared new file mode 100644 index 0000000..e757c6d --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f gapless_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/gapless_playback + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.files new file mode 100644 index 0000000..adca17c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/gapless_playback.makefile +../gapless_playback.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/gapless_playback/gapless_playback.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone.cpp new file mode 100644 index 0000000..1198291 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone.cpp @@ -0,0 +1,213 @@ +/*============================================================================== +Generate Tone Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to play generated tones using System::playDSP +instead of manually connecting and disconnecting DSP units. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Channel *channel = 0; + FMOD::DSP *dsp; + FMOD_RESULT result; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + /* + Create an oscillator DSP units for the tone. + */ + result = system->createDSPByType(FMOD_DSP_TYPE_OSCILLATOR, &dsp); + ERRCHECK(result); + result = dsp->setParameterFloat(FMOD_DSP_OSCILLATOR_RATE, 440.0f); /* Musical note 'A' */ + ERRCHECK(result); + + /* + Main loop + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + if (channel) + { + result = channel->stop(); + ERRCHECK(result); + } + + result = system->playDSP(dsp, 0, true, &channel); + ERRCHECK(result); + result = channel->setVolume(0.5f); + ERRCHECK(result); + result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 0); + ERRCHECK(result); + result = channel->setPaused(false); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + if (channel) + { + result = channel->stop(); + ERRCHECK(result); + } + + result = system->playDSP(dsp, 0, true, &channel); + ERRCHECK(result); + result = channel->setVolume(0.125f); + ERRCHECK(result); + result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 1); + ERRCHECK(result); + result = channel->setPaused(false); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION3)) + { + if (channel) + { + result = channel->stop(); + ERRCHECK(result); + } + + result = system->playDSP(dsp, 0, true, &channel); + ERRCHECK(result); + result = channel->setVolume(0.125f); + ERRCHECK(result); + result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 2); + ERRCHECK(result); + result = channel->setPaused(false); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION4)) + { + if (channel) + { + result = channel->stop(); + ERRCHECK(result); + } + + result = system->playDSP(dsp, 0, true, &channel); + ERRCHECK(result); + result = channel->setVolume(0.5f); + ERRCHECK(result); + result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 4); + ERRCHECK(result); + result = channel->setPaused(false); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_MORE)) + { + if (channel) + { + result = channel->stop(); + ERRCHECK(result); + channel = 0; + } + } + + if (channel) + { + if (Common_BtnDown(BTN_UP) || Common_BtnDown(BTN_DOWN)) + { + float volume; + + result = channel->getVolume(&volume); + ERRCHECK(result); + + volume += (Common_BtnDown(BTN_UP) ? +0.1f : -0.1f); + volume = (volume > 1.0f) ? 1.0f : volume; + volume = (volume < 0.0f) ? 0.0f : volume; + + result = channel->setVolume(volume); + ERRCHECK(result); + } + + if (Common_BtnDown(BTN_LEFT) || Common_BtnDown(BTN_RIGHT)) + { + float frequency; + + result = channel->getFrequency(&frequency); + ERRCHECK(result); + + frequency += (Common_BtnDown(BTN_RIGHT) ? +500.0f : -500.0f); + + result = channel->setFrequency(frequency); + ERRCHECK(result); + } + } + + result = system->update(); + ERRCHECK(result); + + { + float frequency = 0.0f, volume = 0.0f; + bool playing = false; + + if (channel) + { + result = channel->getFrequency(&frequency); + ERRCHECK(result); + result = channel->getVolume(&volume); + ERRCHECK(result); + result = channel->isPlaying(&playing); + ERRCHECK(result); + } + + Common_Draw("=================================================="); + Common_Draw("Generate Tone Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to play a sine wave", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to play a square wave", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to play a saw wave", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to play a triangle wave", Common_BtnStr(BTN_ACTION4)); + Common_Draw("Press %s to stop the channel", Common_BtnStr(BTN_MORE)); + Common_Draw("Press %s and %s to change volume", Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s and %s to change frequency", Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Channel is %s", playing ? "playing" : "stopped"); + Common_Draw("Volume %0.2f", volume); + Common_Draw("Frequency %0.2f", frequency); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = dsp->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.creator.shared new file mode 100644 index 0000000..deded0d --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f generate_tone.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/generate_tone + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.files new file mode 100644 index 0000000..a774261 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/generate_tone.makefile +../generate_tone.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/generate_tone/generate_tone.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth.cpp new file mode 100644 index 0000000..6e2d921 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth.cpp @@ -0,0 +1,278 @@ +/*============================================================================== +Granular Synthesis Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how you can play a string of sounds together without gaps, +using the setDelay command, to produce a granular synthesis style truck engine +effect. + +The basic operation is: + + * Play 2 sounds initially at the same time, the first sound immediately, and + the 2nd sound with a delay calculated by the length of the first sound. + * Call setDelay to initiate the delayed playback. setDelay is sample accurate + and uses -output- samples as the time frame, not source samples. These + samples are a fixed amount per second regardless of the source sound format, + for example, 48000 samples per second if FMOD is initialized to 48khz output. + * Output samples are calculated from source samples with a simple + source->output sample rate conversion. i.e. + sound_length *= output_rate + sound_length /= sound_frequency + * When the first sound finishes, the second one should have automatically + started. This is a good oppurtunity to queue up the next sound. Repeat + step 2. + * Make sure the framerate is high enough to queue up a new sound before the + other one finishes otherwise you will get gaps. + +These sounds are not limited by format, channel count or bit depth like the +realtimestitching example is, and can also be modified to allow for overlap, +by reducing the delay from the first sound playing to the second by the overlap +amount. + + #define USE_STREAMS = Use 2 stream instances, created while they play. + #define USE_STREAMS = Use 6 static wavs, all loaded into memory. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +//#define USE_STREAMS + +FMOD::System *gSystem; + +#ifdef USE_STREAMS +#define NUMSOUNDS 3 /* Use some longer sounds, free and load them on the fly. */ +FMOD::Sound *sound[2] = { 0, 0 }; /* 2 streams active, double buffer them. */ +const char *soundname[NUMSOUNDS] = { Common_MediaPath("c.ogg"), + Common_MediaPath("d.ogg"), + Common_MediaPath("e.ogg") }; +#else +#define NUMSOUNDS 6 /* These sounds will be loaded into memory statically. */ +FMOD::Sound *sound[NUMSOUNDS] = { 0, 0, 0, 0, 0, 0 }; /* 6 sounds active, one for each wav. */ +const char *soundname[NUMSOUNDS] = { Common_MediaPath("granular/truck_idle_off_01.wav"), + Common_MediaPath("granular/truck_idle_off_02.wav"), + Common_MediaPath("granular/truck_idle_off_03.wav"), + Common_MediaPath("granular/truck_idle_off_04.wav"), + Common_MediaPath("granular/truck_idle_off_05.wav"), + Common_MediaPath("granular/truck_idle_off_06.wav") }; +#endif + +FMOD::Channel *queue_next_sound(int outputrate, FMOD::Channel *playingchannel, int newindex, int slot) +{ + FMOD_RESULT result; + FMOD::Channel *newchannel; + FMOD::Sound *newsound; + +#ifdef USE_STREAMS /* Create a new stream */ + FMOD_CREATESOUNDEXINFO info; + memset(&info, 0, sizeof(FMOD_CREATESOUNDEXINFO)); + info.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); + info.suggestedsoundtype = FMOD_SOUND_TYPE_OGGVORBIS; + result = gSystem->createStream(soundname[newindex], FMOD_IGNORETAGS | FMOD_LOWMEM, &info, &sound[slot]); + ERRCHECK(result); + newsound = sound[slot]; +#else /* Use an existing sound that was passed into us */ + (void)slot; + newsound = sound[newindex]; +#endif + + result = gSystem->playSound(newsound, 0, true, &newchannel); + ERRCHECK(result); + + if (playingchannel) + { + unsigned long long startdelay = 0; + unsigned int soundlength = 0; + float soundfrequency; + FMOD::Sound *playingsound; + + /* + Get the start time of the playing channel. + */ + result = playingchannel->getDelay(&startdelay, 0); + ERRCHECK(result); + + /* + Grab the length of the playing sound, and its frequency, so we can caluate where to place the new sound on the time line. + */ + result = playingchannel->getCurrentSound(&playingsound); + ERRCHECK(result); + result = playingsound->getLength(&soundlength, FMOD_TIMEUNIT_PCM); + ERRCHECK(result); + result = playingchannel->getFrequency(&soundfrequency); + ERRCHECK(result); + + /* + Now calculate the length of the sound in 'output samples'. + Ie if a 44khz sound is 22050 samples long, and the output rate is 48khz, then we want to delay by 24000 output samples. + */ + soundlength *= outputrate; + soundlength /= (int)soundfrequency; + + startdelay += soundlength; /* Add output rate adjusted sound length, to the clock value of the sound that is currently playing */ + + result = newchannel->setDelay(startdelay, 0); /* Set the delay of the new sound to the end of the old sound */ + ERRCHECK(result); + } + else + { + unsigned int bufferlength; + unsigned long long startdelay; + + result = gSystem->getDSPBufferSize(&bufferlength, 0); + ERRCHECK(result); + + result = newchannel->getDSPClock(0, &startdelay); + ERRCHECK(result); + + startdelay += (2 * bufferlength); + result = newchannel->setDelay(startdelay, 0); + ERRCHECK(result); + } + + { + float val, variation; + + /* + Randomize pitch/volume to make it sound more realistic / random. + */ + result = newchannel->getFrequency(&val); + ERRCHECK(result); + variation = (((float)(rand()%10000) / 5000.0f) - 1.0f); /* -1.0 to +1.0 */ + val *= (1.0f + (variation * 0.02f)); /* @22khz, range fluctuates from 21509 to 22491 */ + result = newchannel->setFrequency(val); + ERRCHECK(result); + + result = newchannel->getVolume(&val); + ERRCHECK(result); + variation = ((float)(rand()%10000) / 10000.0f); /* 0.0 to 1.0 */ + val *= (1.0f - (variation * 0.2f)); /* 0.8 to 1.0 */ + result = newchannel->setVolume(val); + ERRCHECK(result); + } + + result = newchannel->setPaused(false); + ERRCHECK(result); + + return newchannel; +} + +int FMOD_Main() +{ + FMOD::Channel *channel[2] = { 0,0 }; + FMOD_RESULT result; + int outputrate, slot = 0; + void *extradriverdata = 0; + bool paused = false; + + Common_Init(&extradriverdata); + + result = FMOD::System_Create(&gSystem); + ERRCHECK(result); + + result = gSystem->init(100, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = gSystem->getSoftwareFormat(&outputrate, 0, 0); + ERRCHECK(result); + +#if !defined(USE_STREAMS) + for (unsigned int count = 0; count < NUMSOUNDS; count++) + { + result = gSystem->createSound(soundname[count], FMOD_IGNORETAGS, 0, &sound[count]); + ERRCHECK(result); + } +#endif + + /* + Kick off the first 2 sounds. First one is immediate, second one will be triggered to start after the first one. + */ + channel[slot] = queue_next_sound(outputrate, channel[1-slot], rand()%NUMSOUNDS, slot); + slot = 1-slot; /* flip */ + channel[slot] = queue_next_sound(outputrate, channel[1-slot], rand()%NUMSOUNDS, slot); + slot = 1-slot; /* flip */ + + do + { + bool isplaying = false; + + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + FMOD::ChannelGroup *mastergroup; + + paused = !paused; + + result = gSystem->getMasterChannelGroup(&mastergroup); + ERRCHECK(result); + result = mastergroup->setPaused(paused); + ERRCHECK(result); + } + + result = gSystem->update(); + ERRCHECK(result); + + /* + Replace the sound that just finished with a new sound, to create endless seamless stitching! + */ + result = channel[slot]->isPlaying(&isplaying); + if (result != FMOD_ERR_INVALID_HANDLE) + { + ERRCHECK(result); + } + + if (!isplaying && !paused) + { +#ifdef USE_STREAMS + /* + Release the sound that isn't playing any more. + */ + result = sound[slot]->release(); + ERRCHECK(result); + sound[slot] = 0; +#endif + + /* + Replace sound that just ended with a new sound, queued up to trigger exactly after the other sound ends. + */ + channel[slot] = queue_next_sound(outputrate, channel[1-slot], rand()%NUMSOUNDS, slot); + slot = 1-slot; /* flip */ + } + + Common_Draw("=================================================="); + Common_Draw("Granular Synthesis SetDelay Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Toggle #define USE_STREAM on/off in code to switch between streams and static samples."); + Common_Draw(""); + Common_Draw("Press %s to pause", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Channels are %s", paused ? "paused" : "playing"); + + Common_Sleep(10); /* If you wait too long, ie longer than the length of the shortest sound, you will get gaps. */ + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + for (unsigned int count = 0; count < sizeof(sound) / sizeof(sound[0]); count++) + { + if (sound[count]) + { + result = sound[count]->release(); + ERRCHECK(result); + } + } + + result = gSystem->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.creator.shared new file mode 100644 index 0000000..419b98c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f granular_synth.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/granular_synth + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.files new file mode 100644 index 0000000..20e3108 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/granular_synth.makefile +../granular_synth.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/granular_synth/granular_synth.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory.cpp new file mode 100644 index 0000000..a52b9a3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory.cpp @@ -0,0 +1,168 @@ +/*============================================================================== +Load From Memory Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example is simply a variant of the [Play Sound Example](play_sound.html), +but it loads the data into memory then uses the 'load from memory' feature of +System::createSound. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound1, *sound2, *sound3; + FMOD::Channel *channel = 0; + FMOD_RESULT result; + void *extradriverdata = 0; + void *buff = 0; + int length = 0; + FMOD_CREATESOUNDEXINFO exinfo; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + Common_LoadFileMemory(Common_MediaPath("drumloop.wav"), &buff, &length); + memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); + exinfo.length = length; + + result = system->createSound((const char *)buff, FMOD_OPENMEMORY | FMOD_LOOP_OFF, &exinfo, &sound1); + ERRCHECK(result); + Common_UnloadFileMemory(buff); // don't need the original memory any more. Note! If loading as a stream, the memory must stay active so do not free it! + + Common_LoadFileMemory(Common_MediaPath("jaguar.wav"), &buff, &length); + memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); + exinfo.length = length; + + result = system->createSound((const char *)buff, FMOD_OPENMEMORY, &exinfo, &sound2); + ERRCHECK(result); + Common_UnloadFileMemory(buff); // don't need the original memory any more. Note! If loading as a stream, the memory must stay active so do not free it! + + Common_LoadFileMemory(Common_MediaPath("swish.wav"), &buff, &length); + memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); + exinfo.length = length; + + result = system->createSound((const char *)buff, FMOD_OPENMEMORY, &exinfo, &sound3); + ERRCHECK(result); + Common_UnloadFileMemory(buff); // don't need the original memory any more. Note! If loading as a stream, the memory must stay active so do not free it! + + /* + Main loop + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + result = system->playSound(sound1, 0, false, &channel); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + result = system->playSound(sound2, 0, false, &channel); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION3)) + { + result = system->playSound(sound3, 0, false, &channel); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + { + unsigned int ms = 0; + unsigned int lenms = 0; + bool playing = 0; + bool paused = 0; + int channelsplaying = 0; + + if (channel) + { + FMOD::Sound *currentsound = 0; + + result = channel->isPlaying(&playing); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + result = channel->getPaused(&paused); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + channel->getCurrentSound(¤tsound); + if (currentsound) + { + result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + } + } + + system->getChannelsPlaying(&channelsplaying, NULL); + + Common_Draw("=================================================="); + Common_Draw("Load From Memory Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to play a mono sound (drumloop)", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to play a mono sound (jaguar)", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to play a stereo sound (swish)", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); + Common_Draw("Channels Playing %2d", channelsplaying); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound1->release(); + ERRCHECK(result); + result = sound2->release(); + ERRCHECK(result); + result = sound3->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.creator.shared new file mode 100644 index 0000000..a719699 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_from_memory.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/load_from_memory + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.files new file mode 100644 index 0000000..d2fc0de --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/load_from_memory.makefile +../load_from_memory.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/load_from_memory/load_from_memory.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/3d.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/3d.makefile new file mode 100644 index 0000000..0f4b583 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/3d.makefile @@ -0,0 +1,41 @@ +NAME = 3d + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../3d.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/asyncio.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/asyncio.makefile new file mode 100644 index 0000000..ec223d4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/asyncio.makefile @@ -0,0 +1,41 @@ +NAME = asyncio + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../asyncio.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/channel_groups.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/channel_groups.makefile new file mode 100644 index 0000000..84c455c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/channel_groups.makefile @@ -0,0 +1,41 @@ +NAME = channel_groups + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../channel_groups.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/convolution_reverb.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/convolution_reverb.makefile new file mode 100644 index 0000000..f731010 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/convolution_reverb.makefile @@ -0,0 +1,41 @@ +NAME = convolution_reverb + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../convolution_reverb.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_custom.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_custom.makefile new file mode 100644 index 0000000..69230fd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_custom.makefile @@ -0,0 +1,41 @@ +NAME = dsp_custom + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../dsp_custom.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_effect_per_speaker.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_effect_per_speaker.makefile new file mode 100644 index 0000000..51dc681 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_effect_per_speaker.makefile @@ -0,0 +1,41 @@ +NAME = dsp_effect_per_speaker + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../dsp_effect_per_speaker.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_inspector.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_inspector.makefile new file mode 100644 index 0000000..8f41055 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/dsp_inspector.makefile @@ -0,0 +1,41 @@ +NAME = dsp_inspector + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../dsp_inspector.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/effects.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/effects.makefile new file mode 100644 index 0000000..1ab766e --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/effects.makefile @@ -0,0 +1,41 @@ +NAME = effects + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../effects.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/gapless_playback.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/gapless_playback.makefile new file mode 100644 index 0000000..59776bb --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/gapless_playback.makefile @@ -0,0 +1,41 @@ +NAME = gapless_playback + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../gapless_playback.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/generate_tone.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/generate_tone.makefile new file mode 100644 index 0000000..d60eb2a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/generate_tone.makefile @@ -0,0 +1,41 @@ +NAME = generate_tone + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../generate_tone.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/granular_synth.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/granular_synth.makefile new file mode 100644 index 0000000..8fd3614 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/granular_synth.makefile @@ -0,0 +1,41 @@ +NAME = granular_synth + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../granular_synth.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/load_from_memory.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/load_from_memory.makefile new file mode 100644 index 0000000..f1e6ed6 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/load_from_memory.makefile @@ -0,0 +1,41 @@ +NAME = load_from_memory + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../load_from_memory.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/multiple_speaker.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/multiple_speaker.makefile new file mode 100644 index 0000000..09ba278 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/multiple_speaker.makefile @@ -0,0 +1,41 @@ +NAME = multiple_speaker + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../multiple_speaker.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/multiple_system.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/multiple_system.makefile new file mode 100644 index 0000000..f3a7df9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/multiple_system.makefile @@ -0,0 +1,41 @@ +NAME = multiple_system + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../multiple_system.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/net_stream.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/net_stream.makefile new file mode 100644 index 0000000..e718ec5 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/net_stream.makefile @@ -0,0 +1,41 @@ +NAME = net_stream + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../net_stream.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/play_sound.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/play_sound.makefile new file mode 100644 index 0000000..15a5021 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/play_sound.makefile @@ -0,0 +1,41 @@ +NAME = play_sound + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../play_sound.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/play_stream.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/play_stream.makefile new file mode 100644 index 0000000..5ce5147 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/play_stream.makefile @@ -0,0 +1,41 @@ +NAME = play_stream + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../play_stream.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/record.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/record.makefile new file mode 100644 index 0000000..4eb853e --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/record.makefile @@ -0,0 +1,41 @@ +NAME = record + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../record.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/record_enumeration.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/record_enumeration.makefile new file mode 100644 index 0000000..816aff3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/record_enumeration.makefile @@ -0,0 +1,41 @@ +NAME = record_enumeration + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../record_enumeration.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/user_created_sound.makefile b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/user_created_sound.makefile new file mode 100644 index 0000000..a8669b4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/make/user_created_sound.makefile @@ -0,0 +1,41 @@ +NAME = user_created_sound + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../user_created_sound.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}) ${CORE_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/c.ogg b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/c.ogg new file mode 100644 index 0000000..4ce915d Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/c.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/d.ogg b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/d.ogg new file mode 100644 index 0000000..0c8d037 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/d.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/drumloop.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/drumloop.wav new file mode 100644 index 0000000..7188c33 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/drumloop.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/e.ogg b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/e.ogg new file mode 100644 index 0000000..12a66bc Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/e.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_01.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_01.wav new file mode 100644 index 0000000..7762654 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_01.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_02.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_02.wav new file mode 100644 index 0000000..43f4382 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_02.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_03.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_03.wav new file mode 100644 index 0000000..1d0985d Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_03.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_04.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_04.wav new file mode 100644 index 0000000..3c1eab0 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_04.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_05.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_05.wav new file mode 100644 index 0000000..a595c75 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_05.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_06.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_06.wav new file mode 100644 index 0000000..6ded223 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/granular/truck_idle_off_06.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/jaguar.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/jaguar.wav new file mode 100644 index 0000000..0347714 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/jaguar.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/singing.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/singing.wav new file mode 100644 index 0000000..c5f3e99 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/singing.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/standrews.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/standrews.wav new file mode 100644 index 0000000..25bf89e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/standrews.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/stereo.ogg b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/stereo.ogg new file mode 100644 index 0000000..1b26db5 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/stereo.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/swish.wav b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/swish.wav new file mode 100644 index 0000000..f84f6b5 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/swish.wav differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/wave.mp3 b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/wave.mp3 new file mode 100644 index 0000000..400b6a5 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/wave.mp3 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/wave_vorbis.fsb b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/wave_vorbis.fsb new file mode 100644 index 0000000..64d11ea Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/examples/media/wave_vorbis.fsb differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker.cpp new file mode 100644 index 0000000..bf6c997 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker.cpp @@ -0,0 +1,292 @@ +/*============================================================================== +Multiple Speaker Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to play sounds in multiple speakers, and also how to even +assign sound subchannels, such as those in a stereo sound to different +individual speakers. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +const char *SPEAKERMODE_STRING[] = { "default", "raw", "mono", "stereo", "quad", "surround", "5.1", "7.1" }; +const char *SELECTION_STRING[] = { "Mono from front left speaker", + "Mono from front right speaker", + "Mono from center speaker", + "Mono from surround left speaker", + "Mono from surround right speaker", + "Mono from rear left speaker", + "Mono from rear right speaker", + "Stereo from front speakers", + "Stereo from front speakers (channel swapped)", + "Stereo (right only) from center speaker" }; +const unsigned int SELECTION_COUNT = sizeof(SELECTION_STRING) / sizeof(char *); + +bool isSelectionAvailable(FMOD_SPEAKERMODE mode, unsigned int selection) +{ + if (mode == FMOD_SPEAKERMODE_MONO || mode == FMOD_SPEAKERMODE_STEREO) + { + if (selection == 2 || selection == 3 || selection == 4 || selection == 5 || selection == 6 || selection == 9) return false; + } + else if (mode == FMOD_SPEAKERMODE_QUAD) + { + if (selection == 2 || selection == 5 || selection == 6 || selection == 9) return false; + } + else if (mode == FMOD_SPEAKERMODE_SURROUND || mode == FMOD_SPEAKERMODE_5POINT1) + { + if (selection == 5 || selection == 6) return false; + } + + return true; +} + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound1, *sound2; + FMOD::Channel *channel = 0; + FMOD_RESULT result; + int selection = 0; + void *extradriverdata = 0; + FMOD_SPEAKERMODE speakermode = FMOD_SPEAKERMODE_STEREO; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->getSoftwareFormat(0, &speakermode, 0); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_2D | FMOD_LOOP_OFF, 0, &sound1); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("stereo.ogg"), FMOD_2D | FMOD_LOOP_OFF, 0, &sound2); + ERRCHECK(result); + + /* + Main loop. + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_UP) && (selection != 0)) + { + selection--; + } + + if (Common_BtnPress(BTN_DOWN) && (selection != (SELECTION_COUNT - 1))) + { + selection++; + } + + if (Common_BtnPress(BTN_ACTION1) && isSelectionAvailable(speakermode, selection)) + { + if (selection == 0) /* Mono front left */ + { + result = system->playSound(sound1, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixLevelsOutput(1.0f, 0, 0, 0, 0, 0, 0, 0); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 1) /* Mono front right */ + { + result = system->playSound(sound1, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixLevelsOutput(0, 1.0f, 0, 0, 0, 0, 0, 0); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 2) /* Mono center */ + { + result = system->playSound(sound1, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixLevelsOutput(0, 0, 1.0f, 0, 0, 0, 0, 0); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 3) /* Mono surround left */ + { + result = system->playSound(sound1, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixLevelsOutput(0, 0, 0, 0, 1.0f, 0, 0, 0); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 4) /* Mono surround right */ + { + result = system->playSound(sound1, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixLevelsOutput(0, 0, 0, 0, 0, 1.0f, 0, 0); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 5) /* Mono rear left */ + { + result = system->playSound(sound1, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixLevelsOutput(0, 0, 0, 0, 0, 0, 1.0f, 0); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 6) /* Mono rear right */ + { + result = system->playSound(sound1, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixLevelsOutput(0, 0, 0, 0, 0, 0, 0, 1.0f); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 7) /* Stereo front */ + { + result = system->playSound(sound2, 0, false, &channel); + ERRCHECK(result); + } + else if (selection == 8) /* Stereo front channel swapped */ + { + float matrix[] = { 0.0f, 1.0f, + 1.0f, 0.0f }; + + result = system->playSound(sound2, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixMatrix(matrix, 2, 2); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + else if (selection == 9) /* Stereo (right only) center */ + { + float matrix[] = { 0.0f, 0.0f, + 0.0f, 0.0f, + 0.0f, 1.0f }; + + result = system->playSound(sound2, 0, true, &channel); + ERRCHECK(result); + + result = channel->setMixMatrix(matrix, 3, 2); + ERRCHECK(result); + + result = channel->setPaused(false); + ERRCHECK(result); + } + } + + result = system->update(); + ERRCHECK(result); + + { + unsigned int ms = 0; + unsigned int lenms = 0; + bool playing = false; + bool paused = false; + int channelsplaying = 0; + + if (channel) + { + FMOD::Sound *currentsound = 0; + + result = channel->isPlaying(&playing); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + result = channel->getPaused(&paused); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + channel->getCurrentSound(¤tsound); + if (currentsound) + { + result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + } + } + + result = system->getChannelsPlaying(&channelsplaying, NULL); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("Multiple Speaker Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Speaker mode is set to %s%s", SPEAKERMODE_STRING[speakermode], speakermode < FMOD_SPEAKERMODE_7POINT1 ? " causing some speaker options to be unavailable" : ""); + Common_Draw(""); + Common_Draw("Press %s or %s to select mode", Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s to play the sound", Common_BtnStr(BTN_ACTION1)); + for (int i = 0; i < SELECTION_COUNT; i++) + { + bool disabled = !isSelectionAvailable(speakermode, i); + Common_Draw("[%c] %s%s", (selection == i) ? (disabled ? '-' : 'X') : ' ', disabled ? "[N/A] " : "", SELECTION_STRING[i]); + } + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); + Common_Draw("Channels playing: %d", channelsplaying); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound1->release(); + ERRCHECK(result); + result = sound2->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.creator.shared new file mode 100644 index 0000000..acfbac2 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_speaker.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/multiple_speaker + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.files new file mode 100644 index 0000000..8ded883 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/multiple_speaker.makefile +../multiple_speaker.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_speaker/multiple_speaker.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system.cpp new file mode 100644 index 0000000..bfa45e8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system.cpp @@ -0,0 +1,193 @@ +/*============================================================================== +Multiple System Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to play sounds on two different output devices from the +same application. It creates two FMOD::System objects, selects a different sound +device for each, then allows the user to play one sound on each device. + +Note that sounds created on device A cannot be played on device B and vice +versa. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +FMOD_RESULT fetchDriver(FMOD::System *system, int *driver) +{ + FMOD_RESULT result; + int numdrivers; + int selectedindex = 0; + + result = system->getNumDrivers(&numdrivers); + ERRCHECK(result); + + if (numdrivers == 0) + { + result = system->setOutput(FMOD_OUTPUTTYPE_NOSOUND); + ERRCHECK(result); + } + + do + { + Common_Update(); + + if (Common_BtnPress(BTN_UP) && (selectedindex != 0)) + { + selectedindex--; + } + if (Common_BtnPress(BTN_DOWN) && (selectedindex != (numdrivers - 1))) + { + selectedindex++; + } + + Common_Draw("=================================================="); + Common_Draw("Multiple System Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Choose a device for system: 0x%p", system); + Common_Draw(""); + Common_Draw("Use %s and %s to select.", Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s to confirm.", Common_BtnStr(BTN_ACTION1)); + Common_Draw(""); + for (int i = 0; i < numdrivers; i++) + { + char name[256]; + + result = system->getDriverInfo(i, name, sizeof(name), 0, 0, 0, 0); + ERRCHECK(result); + + Common_Draw("[%c] - %d. %s", selectedindex == i ? 'X' : ' ', i, name); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_ACTION1) && !Common_BtnPress(BTN_QUIT)); + + *driver = selectedindex; + + return FMOD_OK; +} + +int FMOD_Main() +{ + FMOD::System *systemA, *systemB; + FMOD::Sound *soundA, *soundB; + FMOD::Channel *channelA = 0, *channelB = 0; + FMOD_RESULT result; + int driver; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create Sound Card A + */ + result = FMOD::System_Create(&systemA); + ERRCHECK(result); + + result = fetchDriver(systemA, &driver); + ERRCHECK(result); + + result = systemA->setDriver(driver); + ERRCHECK(result); + + result = systemA->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + /* + Create Sound Card B + */ + result = FMOD::System_Create(&systemB); + ERRCHECK(result); + + result = fetchDriver(systemB, &driver); + ERRCHECK(result); + + result = systemB->setDriver(driver); + ERRCHECK(result); + + result = systemB->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + /* + Load 1 sample into each soundcard. + */ + result = systemA->createSound(Common_MediaPath("drumloop.wav"), FMOD_LOOP_OFF, 0, &soundA); + ERRCHECK(result); + + result = systemB->createSound(Common_MediaPath("jaguar.wav"), FMOD_DEFAULT, 0, &soundB); + ERRCHECK(result); + + /* + Main loop + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + result = systemA->playSound(soundA, 0, 0, &channelA); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + result = systemB->playSound(soundB, 0, 0, &channelB); + ERRCHECK(result); + } + + result = systemA->update(); + ERRCHECK(result); + result = systemB->update(); + ERRCHECK(result); + + { + int channelsplayingA = 0; + int channelsplayingB = 0; + + result = systemA->getChannelsPlaying(&channelsplayingA, NULL); + ERRCHECK(result); + result = systemB->getChannelsPlaying(&channelsplayingB, NULL); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("Multiple System Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to play a sound on device A", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to play a sound on device B", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Channels playing on A: %d", channelsplayingA); + Common_Draw("Channels playing on B: %d", channelsplayingB); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = soundA->release(); + ERRCHECK(result); + result = systemA->close(); + ERRCHECK(result); + result = systemA->release(); + ERRCHECK(result); + + result = soundB->release(); + ERRCHECK(result); + result = systemB->close(); + ERRCHECK(result); + result = systemB->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.creator.shared new file mode 100644 index 0000000..349e1cc --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f multiple_system.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/multiple_system + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.files new file mode 100644 index 0000000..165d2b1 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/multiple_system.makefile +../multiple_system.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/multiple_system/multiple_system.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream.cpp new file mode 100644 index 0000000..c3e5204 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream.cpp @@ -0,0 +1,218 @@ +/*============================================================================== +Net Stream Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to play streaming audio from an Internet source + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system = 0; + FMOD::Sound *sound = 0; + FMOD::Channel *channel = 0; + FMOD_RESULT result = FMOD_OK; + FMOD_OPENSTATE openstate = FMOD_OPENSTATE_READY; + void *extradriverdata = 0; + const int tagcount = 4; + int tagindex = 0; + char tagstring[tagcount][128] = { }; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(1, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + /* Increase the file buffer size a little bit to account for Internet lag. */ + result = system->setStreamBufferSize(64*1024, FMOD_TIMEUNIT_RAWBYTES); + ERRCHECK(result); + + FMOD_CREATESOUNDEXINFO exinfo; + memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); + exinfo.filebuffersize = 1024*16; /* Increase the default file chunk size to handle seeking inside large playlist files that may be over 2kb. */ + + result = system->createSound("http://live-radio01.mediahubaustralia.com/2TJW/mp3/", FMOD_CREATESTREAM | FMOD_NONBLOCKING, &exinfo, &sound); + ERRCHECK(result); + + /* + Main loop + */ + do + { + unsigned int pos = 0; + unsigned int percent = 0; + bool playing = false; + bool paused = false; + bool starving = false; + const char *state = "Stopped"; + + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + if (channel) + { + bool paused = false; + + result = channel->getPaused(&paused); + ERRCHECK(result); + result = channel->setPaused(!paused); + ERRCHECK(result); + } + } + + result = system->update(); + ERRCHECK(result); + + result = sound->getOpenState(&openstate, &percent, &starving, 0); + ERRCHECK(result); + + { + FMOD_TAG tag; + + /* + Read any tags that have arrived, this could happen if a radio station switches + to a new song. + */ + while (sound->getTag(0, -1, &tag) == FMOD_OK) + { + if (tag.datatype == FMOD_TAGDATATYPE_STRING) + { + snprintf(tagstring[tagindex], 128, "%s = '%s' (%d bytes)", tag.name, (char *)tag.data, tag.datalen); + tagindex = (tagindex + 1) % tagcount; + + if (tag.type == FMOD_TAGTYPE_PLAYLIST && !strcmp(tag.name, "FILE")) + { + char url[256] = {}; + + strncpy(url, (const char *)tag.data, 255); /* data point to sound owned memory, copy it before the sound is released. */ + + result = sound->release(); + ERRCHECK(result); + + result = system->createSound(url, FMOD_CREATESTREAM | FMOD_NONBLOCKING, &exinfo, &sound); + ERRCHECK(result); + } + + } + else if (tag.type == FMOD_TAGTYPE_FMOD) + { + /* When a song changes, the sample rate may also change, so compensate here. */ + if (!strcmp(tag.name, "Sample Rate Change") && channel) + { + float frequency = *((float *)tag.data); + + result = channel->setFrequency(frequency); + ERRCHECK(result); + } + } + } + } + + if (channel) + { + result = channel->getPaused(&paused); + ERRCHECK(result); + + result = channel->isPlaying(&playing); + ERRCHECK(result); + + result = channel->getPosition(&pos, FMOD_TIMEUNIT_MS); + ERRCHECK(result); + + /* Silence the stream until we have sufficient data for smooth playback. */ + result = channel->setMute(starving); + ERRCHECK(result); + } + else + { + /* This may fail if the stream isn't ready yet, so don't check the error code. */ + system->playSound(sound, 0, false, &channel); + } + + if (openstate == FMOD_OPENSTATE_BUFFERING) + { + state = "Buffering..."; + } + else if (openstate == FMOD_OPENSTATE_CONNECTING) + { + state = "Connecting..."; + } + else if (paused) + { + state = "Paused"; + } + else if (playing) + { + state = "Playing"; + } + + Common_Draw("=================================================="); + Common_Draw("Net Stream Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to toggle pause", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Time = %02d:%02d:%02d", pos / 1000 / 60, pos / 1000 % 60, pos / 10 % 100); + Common_Draw("State = %s %s", state, starving ? "(STARVING)" : ""); + Common_Draw("Buffer Percentage = %d", percent); + Common_Draw(""); + Common_Draw("Tags:"); + for (int i = tagindex; i < (tagindex + tagcount); i++) + { + Common_Draw("%s", tagstring[i % tagcount]); + Common_Draw(""); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Stop the channel, then wait for it to finish opening before we release it. + */ + if (channel) + { + result = channel->stop(); + ERRCHECK(result); + } + + do + { + Common_Update(); + Common_Draw("Waiting for sound to finish opening before trying to release it....", Common_BtnStr(BTN_ACTION1)); + Common_Sleep(50); + + result = system->update(); + ERRCHECK(result); + + result = sound->getOpenState(&openstate, 0, 0, 0); + ERRCHECK(result); + } while (openstate != FMOD_OPENSTATE_READY); + + /* + Shut down + */ + result = sound->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.creator.shared new file mode 100644 index 0000000..e6ddc20 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f net_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/net_stream + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.files new file mode 100644 index 0000000..583e587 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/net_stream.makefile +../net_stream.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/net_stream/net_stream.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound.cpp new file mode 100644 index 0000000..e5e10f6 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound.cpp @@ -0,0 +1,152 @@ +/*============================================================================== +Play Sound Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to simply load and play multiple sounds, the simplest +usage of FMOD. By default FMOD will decode the entire file into memory when it +loads. If the sounds are big and possibly take up a lot of RAM it would be +better to use the FMOD_CREATESTREAM flag, this will stream the file in realtime +as it plays. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound1, *sound2, *sound3; + FMOD::Channel *channel = 0; + FMOD_RESULT result; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_DEFAULT, 0, &sound1); + ERRCHECK(result); + + result = sound1->setMode(FMOD_LOOP_OFF); /* drumloop.wav has embedded loop points which automatically makes looping turn on, */ + ERRCHECK(result); /* so turn it off here. We could have also just put FMOD_LOOP_OFF in the above CreateSound call. */ + + result = system->createSound(Common_MediaPath("jaguar.wav"), FMOD_DEFAULT, 0, &sound2); + ERRCHECK(result); + + result = system->createSound(Common_MediaPath("swish.wav"), FMOD_DEFAULT, 0, &sound3); + ERRCHECK(result); + + /* + Main loop + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + result = system->playSound(sound1, 0, false, &channel); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + result = system->playSound(sound2, 0, false, &channel); + ERRCHECK(result); + } + + if (Common_BtnPress(BTN_ACTION3)) + { + result = system->playSound(sound3, 0, false, &channel); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + { + unsigned int ms = 0; + unsigned int lenms = 0; + bool playing = 0; + bool paused = 0; + int channelsplaying = 0; + + if (channel) + { + FMOD::Sound *currentsound = 0; + + result = channel->isPlaying(&playing); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + result = channel->getPaused(&paused); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + + channel->getCurrentSound(¤tsound); + if (currentsound) + { + result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) + { + ERRCHECK(result); + } + } + } + + system->getChannelsPlaying(&channelsplaying, NULL); + + Common_Draw("=================================================="); + Common_Draw("Play Sound Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to play a mono sound (drumloop)", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to play a mono sound (jaguar)", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to play a stereo sound (swish)", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); + Common_Draw("Channels Playing %d", channelsplaying); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound1->release(); + ERRCHECK(result); + result = sound2->release(); + ERRCHECK(result); + result = sound3->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.creator.shared new file mode 100644 index 0000000..d750e78 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/play_sound + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.files new file mode 100644 index 0000000..1dc00d0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/play_sound.makefile +../play_sound.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_sound/play_sound.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream.cpp new file mode 100644 index 0000000..0cd1ab3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream.cpp @@ -0,0 +1,143 @@ +/*============================================================================== +Play Stream Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to simply play a stream such as an MP3 or WAV. The stream +behaviour is achieved by specifying FMOD_CREATESTREAM in the call to +System::createSound. This makes FMOD decode the file in realtime as it plays, +instead of loading it all at once which uses far less memory in exchange for a +small runtime CPU hit. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound, *sound_to_play; + FMOD::Channel *channel = 0; + FMOD_RESULT result; + void *extradriverdata = 0; + int numsubsounds; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + /* + This example uses an FSB file, which is a preferred pack format for fmod containing multiple sounds. + This could just as easily be exchanged with a wav/mp3/ogg file for example, but in this case you wouldnt need to call getSubSound. + Because getNumSubSounds is called here the example would work with both types of sound file (packed vs single). + */ + result = system->createStream(Common_MediaPath("wave_vorbis.fsb"), FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound); + ERRCHECK(result); + + result = sound->getNumSubSounds(&numsubsounds); + ERRCHECK(result); + + if (numsubsounds) + { + sound->getSubSound(0, &sound_to_play); + ERRCHECK(result); + } + else + { + sound_to_play = sound; + } + + /* + Play the sound. + */ + result = system->playSound(sound_to_play, 0, false, &channel); + ERRCHECK(result); + + /* + Main loop. + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + bool paused; + result = channel->getPaused(&paused); + ERRCHECK(result); + result = channel->setPaused(!paused); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + { + unsigned int ms = 0; + unsigned int lenms = 0; + bool playing = false; + bool paused = false; + + if (channel) + { + result = channel->isPlaying(&playing); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + + result = channel->getPaused(&paused); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + + result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + + result = sound_to_play->getLength(&lenms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + } + + Common_Draw("=================================================="); + Common_Draw("Play Stream Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to toggle pause", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound->release(); /* Release the parent, not the sound that was retrieved with getSubSound. */ + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.creator.shared new file mode 100644 index 0000000..3298742 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f play_stream.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/play_stream + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.files new file mode 100644 index 0000000..0ba3a0d --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/play_stream.makefile +../play_stream.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/play_stream/play_stream.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_codec_raw.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_codec_raw.cpp new file mode 100644 index 0000000..6aeddfa --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_codec_raw.cpp @@ -0,0 +1,133 @@ +/*=============================================================================================== +Raw Codec Plugin Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to create a codec that reads raw PCM data. + +1. The codec can be compiled as a DLL, using the reserved function name 'FMODGetCodecDescription' + as the only export symbol, and at runtime, the dll can be loaded in with System::loadPlugin. + +2. Alternatively a codec of this type can be compiled directly into the program that uses it, and + you just register the codec into FMOD with System::registerCodec. This puts the codec into + the FMOD system, just the same way System::loadPlugin would if it was an external file. + +3. The 'open' callback is the first thing called, and FMOD already has a file handle open for it. + In the open callback you can use FMOD_CODEC_STATE::fileread / FMOD_CODEC_STATE::fileseek to parse + your own file format, and return FMOD_ERR_FORMAT if it is not the format you support. Return + FMOD_OK if it succeeds your format test. + +4. When an FMOD user calls System::createSound or System::createStream, the 'open' callback is called + once after FMOD tries to open it as many other types of file. If you want to override FMOD's + internal codecs then use the 'priority' parameter of System::loadPlugin or System::registerCodec. + +5. In the open callback, tell FMOD what sort of PCM format the sound will produce with the + FMOD_CODEC_STATE::waveformat member. + +6. The 'close' callback is called when Sound::release is called by the FMOD user. + +7. The 'read' callback is called when System::createSound or System::createStream wants to receive + PCM data, in the format that you specified with FMOD_CODEC_STATE::waveformat. Data is + interleaved as decribed in the terminology section of the FMOD API documentation. + When a stream is being used, the read callback will be called repeatedly, using a size value + determined by the decode buffer size of the stream. See FMOD_CREATESOUNDEXINFO or + FMOD_ADVANCEDSETTINGS. + +8. The 'seek' callback is called when Channel::setPosition is called, or when looping a sound + when it is a stream. + +===============================================================================================*/ + +#include + +#include "fmod.h" + +FMOD_RESULT F_CALL rawopen(FMOD_CODEC_STATE *codec, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo); +FMOD_RESULT F_CALL rawclose(FMOD_CODEC_STATE *codec); +FMOD_RESULT F_CALL rawread(FMOD_CODEC_STATE *codec, void *buffer, unsigned int size, unsigned int *read); +FMOD_RESULT F_CALL rawsetposition(FMOD_CODEC_STATE *codec, int subsound, unsigned int position, FMOD_TIMEUNIT postype); + +FMOD_CODEC_DESCRIPTION rawcodec = +{ + FMOD_CODEC_PLUGIN_VERSION, // Plugin version. + "FMOD Raw player plugin example", // Name. + 0x00010000, // Version 0xAAAABBBB A = major, B = minor. + 0, // Don't force everything using this codec to be a stream + FMOD_TIMEUNIT_PCMBYTES, // The time format we would like to accept into setposition/getposition. + &rawopen, // Open callback. + &rawclose, // Close callback. + &rawread, // Read callback. + 0, // Getlength callback. (If not specified FMOD return the length in FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_MS or FMOD_TIMEUNIT_PCMBYTES units based on the lengthpcm member of the FMOD_CODEC structure). + &rawsetposition, // Setposition callback. + 0, // Getposition callback. (only used for timeunit types that are not FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_MS and FMOD_TIMEUNIT_PCMBYTES). + 0 // Sound create callback (don't need it) +}; + + +/* + FMODGetCodecDescription is mandatory for every fmod plugin. This is the symbol the registerplugin function searches for. + Must be declared with F_CALL to make it export as stdcall. + MUST BE EXTERN'ED AS C! C++ functions will be mangled incorrectly and not load in fmod. +*/ +#ifdef __cplusplus +extern "C" { +#endif + +F_EXPORT FMOD_CODEC_DESCRIPTION * F_CALL FMODGetCodecDescription() +{ + return &rawcodec; +} + +#ifdef __cplusplus +} +#endif + + +static FMOD_CODEC_WAVEFORMAT rawwaveformat; + +/* + The actual codec code. + + Note that the callbacks uses FMOD's supplied file system callbacks. + + This is important as even though you might want to open the file yourself, you would lose the following benefits. + 1. Automatic support of memory files, CDDA based files, and HTTP/TCPIP based files. + 2. "fileoffset" / "length" support when user calls System::createSound with FMOD_CREATESOUNDEXINFO structure. + 3. Buffered file access. + FMOD files are high level abstracts that support all sorts of 'file', they are not just disk file handles. + If you want FMOD to use your own filesystem (and potentially lose the above benefits) use System::setFileSystem. +*/ + +FMOD_RESULT F_CALL rawopen(FMOD_CODEC_STATE *codec, FMOD_MODE /*usermode*/, FMOD_CREATESOUNDEXINFO * /*userexinfo*/) +{ + rawwaveformat.channels = 2; + rawwaveformat.format = FMOD_SOUND_FORMAT_PCM16; + rawwaveformat.frequency = 44100; + rawwaveformat.pcmblocksize = 0; + unsigned int size; + FMOD_CODEC_FILE_SIZE(codec, &size); + rawwaveformat.lengthpcm = size / (rawwaveformat.channels * sizeof(short)); /* bytes converted to PCM samples */; + + codec->numsubsounds = 0; /* number of 'subsounds' in this sound. For most codecs this is 0, only multi sound codecs such as FSB or CDDA have subsounds. */ + codec->waveformat = &rawwaveformat; + codec->plugindata = 0; /* user data value */ + + /* If your file format needs to read data to determine the format and load metadata, do so here with codec->fileread/fileseek function pointers. This will handle reading from disk/memory or internet. */ + + return FMOD_OK; +} + +FMOD_RESULT F_CALL rawclose(FMOD_CODEC_STATE * /*codec*/) +{ + return FMOD_OK; +} + +FMOD_RESULT F_CALL rawread(FMOD_CODEC_STATE *codec, void *buffer, unsigned int size, unsigned int *read) +{ + return FMOD_CODEC_FILE_READ(codec, buffer, size, read); +} + +FMOD_RESULT F_CALL rawsetposition(FMOD_CODEC_STATE *codec, int /*subsound*/, unsigned int position, FMOD_TIMEUNIT /*postype*/) +{ + return FMOD_CODEC_FILE_SEEK(codec, position, 0); +} + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_distance_filter.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_distance_filter.cpp new file mode 100644 index 0000000..a84a1ad --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_distance_filter.cpp @@ -0,0 +1,466 @@ +/*============================================================================== +Distance Filter DSP Plugin Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to create a distance filter DSP effect. +==============================================================================*/ + +#ifdef WIN32 + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include + +#include "fmod.hpp" + +extern "C" +{ + F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMODGetDSPDescription(); +} + +const float FMOD_DISTANCE_FILTER_PARAM_MAX_DISTANCE_MIN = 0.0f; +const float FMOD_DISTANCE_FILTER_PARAM_MAX_DISTANCE_MAX = 10000.0f; +const float FMOD_DISTANCE_FILTER_PARAM_MAX_DISTANCE_DEFAULT = 20.0f; +const float FMOD_DISTANCE_FILTER_PARAM_BANDPASS_FREQUENCY_MIN = 10.0f; +const float FMOD_DISTANCE_FILTER_PARAM_BANDPASS_FREQUENCY_MAX = 22000.0f; +const float FMOD_DISTANCE_FILTER_PARAM_BANDPASS_FREQUENCY_DEFAULT = 1500.0f; + +enum +{ + FMOD_DISTANCE_FILTER_MAX_DISTANCE, + FMOD_DISTANCE_FILTER_BANDPASS_FREQUENCY, + FMOD_DISTANCE_FILTER_3D_ATTRIBUTES, + FMOD_DISTANCE_FILTER_NUM_PARAMETERS +}; + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspcreate (FMOD_DSP_STATE *dsp_state); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dsprelease (FMOD_DSP_STATE *dsp_state); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspreset (FMOD_DSP_STATE *dsp_state); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspread (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspprocess (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspsetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float value); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspsetparamint (FMOD_DSP_STATE *dsp_state, int index, int value); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspsetparambool (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspsetparamdata (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspgetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspgetparamint (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspgetparambool (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspgetparamdata (FMOD_DSP_STATE *dsp_state, int index, void **value, unsigned int *length, char *valuestr); +FMOD_RESULT F_CALL FMOD_DistanceFilter_shouldiprocess (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode); + +static FMOD_DSP_PARAMETER_DESC p_max_distance; +static FMOD_DSP_PARAMETER_DESC p_bandpass_frequency; +static FMOD_DSP_PARAMETER_DESC p_3d_attributes; + +FMOD_DSP_PARAMETER_DESC *FMOD_DistanceFilter_dspparam[FMOD_DISTANCE_FILTER_NUM_PARAMETERS] = +{ + &p_max_distance, + &p_bandpass_frequency, + &p_3d_attributes +}; + +FMOD_DSP_DESCRIPTION FMOD_DistanceFilter_Desc = +{ + FMOD_PLUGIN_SDK_VERSION, + "FMOD Distance Filter", // name + 0x00010000, // plugin version + 1, // number of input buffers to process + 1, // number of output buffers to process + FMOD_DistanceFilter_dspcreate, + FMOD_DistanceFilter_dsprelease, + FMOD_DistanceFilter_dspreset, + FMOD_DistanceFilter_dspread, + 0, // FMOD_DistanceFilter_dspprocess, // *** declare this callback instead of FMOD_DistanceFilter_dspread if the plugin sets the output channel count *** + 0, + FMOD_DISTANCE_FILTER_NUM_PARAMETERS, + FMOD_DistanceFilter_dspparam, + FMOD_DistanceFilter_dspsetparamfloat, + 0, // FMOD_DistanceFilter_dspsetparamint, + 0, // FMOD_DistanceFilter_dspsetparambool, + FMOD_DistanceFilter_dspsetparamdata, + FMOD_DistanceFilter_dspgetparamfloat, + 0, // FMOD_DistanceFilter_dspgetparamint, + 0, // FMOD_DistanceFilter_dspgetparambool, + FMOD_DistanceFilter_dspgetparamdata, + FMOD_DistanceFilter_shouldiprocess, + 0, // userdata + 0, // sys_register + 0, // sys_deregister + 0 // sys_mix +}; + +extern "C" +{ + F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMODGetDSPDescription() + { + static float distance_mapping_values[] = { 0, 1, 5, 20, 100, 500, 10000 }; + static float distance_mapping_scale[] = { 0, 1, 2, 3, 4, 4.5, 5 }; + + FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(p_max_distance, "Max Dist", "", "Distance at which bandpass stops narrowing. 0 to 1000000000. Default = 100", FMOD_DISTANCE_FILTER_PARAM_MAX_DISTANCE_DEFAULT, distance_mapping_values, distance_mapping_scale); + FMOD_DSP_INIT_PARAMDESC_FLOAT(p_bandpass_frequency, "Frequency", "Hz", "Bandpass target frequency. 100 to 10,000Hz. Default = 2000Hz", FMOD_DISTANCE_FILTER_PARAM_BANDPASS_FREQUENCY_MIN, FMOD_DISTANCE_FILTER_PARAM_BANDPASS_FREQUENCY_MAX, FMOD_DISTANCE_FILTER_PARAM_BANDPASS_FREQUENCY_DEFAULT); + FMOD_DSP_INIT_PARAMDESC_DATA(p_3d_attributes, "3D Attributes", "", "", FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES); + + return &FMOD_DistanceFilter_Desc; + } +} + +class FMODDistanceFilterState +{ + public: + FMODDistanceFilterState() { } + + void init (FMOD_DSP_STATE *dsp_state); + void release (FMOD_DSP_STATE *dsp_state); + FMOD_RESULT process (float *inbuffer, float *outbuffer, unsigned int length, int channels); + FMOD_RESULT process (unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op); + void reset (); + void setMaxDistance (float); + void setBandpassFrequency(float); + void setDistance (float); + float maxDistance () const { return m_max_distance; } + float bandpassFrequency () const { return m_bandpass_frequency; } + + private: + void updateTimeConstants (); + + float m_max_distance; + float m_bandpass_frequency; + float m_distance; + float m_target_highpass_time_const; + float m_current_highpass_time_const; + float m_target_lowpass_time_const; + float m_current_lowpass_time_const; + int m_ramp_samples_left; + float *m_previous_lp1_out; + float *m_previous_lp2_out; + float *m_previous_hp_out; + int m_sample_rate; + int m_max_channels; +}; + +void FMODDistanceFilterState::init(FMOD_DSP_STATE *dsp_state) +{ + FMOD_DSP_GETSAMPLERATE(dsp_state, &m_sample_rate); + + m_max_channels = 8; + m_max_distance = FMOD_DISTANCE_FILTER_PARAM_MAX_DISTANCE_DEFAULT; + m_bandpass_frequency = FMOD_DISTANCE_FILTER_PARAM_BANDPASS_FREQUENCY_DEFAULT; + m_distance = 0; + + m_previous_lp1_out = (float*)FMOD_DSP_ALLOC(dsp_state, m_max_channels * sizeof(float)); + m_previous_lp2_out = (float*)FMOD_DSP_ALLOC(dsp_state, m_max_channels * sizeof(float)); + m_previous_hp_out = (float*)FMOD_DSP_ALLOC(dsp_state, m_max_channels * sizeof(float)); + + updateTimeConstants(); + reset(); +} + +void FMODDistanceFilterState::release(FMOD_DSP_STATE *dsp_state) +{ + FMOD_DSP_FREE(dsp_state, m_previous_lp1_out); + FMOD_DSP_FREE(dsp_state, m_previous_lp2_out); + FMOD_DSP_FREE(dsp_state, m_previous_hp_out); +} + +FMOD_RESULT FMODDistanceFilterState::process(float *inbuffer, float *outbuffer, unsigned int length, int channels) +{ + if(channels > m_max_channels) + { + return FMOD_ERR_INVALID_PARAM; + } + + // Note: buffers are interleaved + static float jitter = (float)1E-20; + float lp1_out, lp2_out; + int ch; + + float lp_tc = m_current_lowpass_time_const; + float hp_tc = m_current_highpass_time_const; + + if (m_ramp_samples_left) + { + float lp_delta = (m_target_lowpass_time_const - m_current_lowpass_time_const) / m_ramp_samples_left; + float hp_delta = (m_target_highpass_time_const - m_current_highpass_time_const) / m_ramp_samples_left; + while (length) + { + if (--m_ramp_samples_left) + { + lp_tc += lp_delta; + hp_tc += hp_delta; + for (ch = 0; ch < channels; ++ch) + { + lp1_out = m_previous_lp1_out[ch] + lp_tc * (*inbuffer++ + jitter - m_previous_lp1_out[ch]); + lp2_out = m_previous_lp2_out[ch] + lp_tc * (lp1_out - m_previous_lp2_out[ch]); + *outbuffer = hp_tc * (m_previous_hp_out[ch] + lp2_out - m_previous_lp2_out[ch]); + + m_previous_lp1_out[ch] = lp1_out; + m_previous_lp2_out[ch] = lp2_out; + m_previous_hp_out[ch] = *outbuffer++; + } + jitter = -jitter; + } + else + { + lp_tc = m_target_lowpass_time_const; + hp_tc = m_target_highpass_time_const; + break; + } + --length; + } + } + + while (length--) + { + for (ch = 0; ch < channels; ++ch) + { + lp1_out = m_previous_lp1_out[ch] + lp_tc * (*inbuffer++ + jitter - m_previous_lp1_out[ch]); + lp2_out = m_previous_lp2_out[ch] + lp_tc * (lp1_out - m_previous_lp2_out[ch]); + *outbuffer = hp_tc * (m_previous_hp_out[ch] + lp2_out - m_previous_lp2_out[ch]); + + m_previous_lp1_out[ch] = lp1_out; + m_previous_lp2_out[ch] = lp2_out; + m_previous_hp_out[ch] = *outbuffer++; + } + jitter = -jitter; + } + + m_current_lowpass_time_const = lp_tc; + m_current_highpass_time_const = hp_tc; + + return FMOD_OK; +} + +FMOD_RESULT FMODDistanceFilterState::process(unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op) +{ + if (op == FMOD_DSP_PROCESS_QUERY) + { + FMOD_SPEAKERMODE outmode; + int outchannels; + + #if 1 // For stereo output + { + outmode = FMOD_SPEAKERMODE_STEREO; + outchannels = 2; + } + #else // For 5.1 output + { + outmode = FMOD_SPEAKERMODE_5POINT1; + outchannels = 6; + } + #endif + + if (outbufferarray) + { + outbufferarray->speakermode = outmode; + outbufferarray->buffernumchannels[0] = outchannels; + } + + if (inputsidle) + { + return FMOD_ERR_DSP_DONTPROCESS; + } + + return FMOD_OK; + } + + // Do processing here + float *inbuffer = inbufferarray->buffers[0]; + float *outbuffer = outbufferarray->buffers[0]; + int inchannels = inbufferarray->buffernumchannels[0]; + int outchannels = outbufferarray->buffernumchannels[0]; + + while(length--) + { + // MAIN DSP LOOP... + } + + return FMOD_OK; +} + +void FMODDistanceFilterState::reset() +{ + m_current_lowpass_time_const = m_target_lowpass_time_const; + m_current_highpass_time_const = m_target_highpass_time_const; + m_ramp_samples_left = 0; + + memset(m_previous_lp1_out, 0, m_max_channels * sizeof(float)); + memset(m_previous_lp2_out, 0, m_max_channels * sizeof(float)); + memset(m_previous_hp_out, 0, m_max_channels * sizeof(float)); +} + +void FMODDistanceFilterState::setMaxDistance(float distance) +{ + m_max_distance = distance; + updateTimeConstants(); +} + +void FMODDistanceFilterState::setBandpassFrequency(float frequency) +{ + m_bandpass_frequency = frequency; + updateTimeConstants(); +} + +void FMODDistanceFilterState::setDistance(float distance) +{ + m_distance = distance; + updateTimeConstants(); +} + +void FMODDistanceFilterState::updateTimeConstants() +{ + #define PI (3.14159265358979323846f) + #define MIN_CUTOFF (10.0f) + #define MAX_CUTOFF (22000.0f) + + float dist_factor = m_distance >= m_max_distance ? 1.0f : m_distance / m_max_distance; + float lp_cutoff = m_bandpass_frequency + (1.0f - dist_factor) * (1.0f - dist_factor) * (MAX_CUTOFF - m_bandpass_frequency); + float hp_cutoff = MIN_CUTOFF + dist_factor * dist_factor * (m_bandpass_frequency - MIN_CUTOFF); + + float dt = 1.0f / m_sample_rate; + float threshold = m_sample_rate / PI; + + if (lp_cutoff >= MAX_CUTOFF) + { + m_target_lowpass_time_const = 1.0f; + } + else if (lp_cutoff <= threshold) + { + float RC = 1.0f / (2.0f * PI * lp_cutoff); + m_target_lowpass_time_const = dt / (RC + dt); + } + else + { + m_target_lowpass_time_const = 0.666666667f + (lp_cutoff - threshold) / (3.0f * (MAX_CUTOFF - threshold)); + } + + if (hp_cutoff >= MAX_CUTOFF) + { + m_target_highpass_time_const = 0.0f; + } + else if (hp_cutoff <= threshold) + { + float RC = 1.0f / (2.0f * PI * hp_cutoff); + m_target_highpass_time_const = RC / (RC + dt); + } + else + { + m_target_highpass_time_const = (MAX_CUTOFF - hp_cutoff) / (3.0f * (MAX_CUTOFF - threshold)); + } + + m_ramp_samples_left = 256; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspcreate(FMOD_DSP_STATE *dsp_state) +{ + FMODDistanceFilterState* state = (FMODDistanceFilterState *)FMOD_DSP_ALLOC(dsp_state, sizeof(FMODDistanceFilterState)); + state->init(dsp_state); + dsp_state->plugindata = state; + if (!state) + { + return FMOD_ERR_MEMORY; + } + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dsprelease(FMOD_DSP_STATE *dsp_state) +{ + FMODDistanceFilterState *state = (FMODDistanceFilterState *)dsp_state->plugindata; + state->release(dsp_state); + FMOD_DSP_FREE(dsp_state, state); + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspread(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int * /*outchannels*/) +{ + FMODDistanceFilterState *state = (FMODDistanceFilterState *)dsp_state->plugindata; + return state->process(inbuffer, outbuffer, length, inchannels); // input and output channels count match for this effect +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspprocess(FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op) +{ + FMODDistanceFilterState *state = (FMODDistanceFilterState *)dsp_state->plugindata; + return state->process(length, inbufferarray, outbufferarray, inputsidle, op); // as an example for plugins which set the output channel count +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspreset(FMOD_DSP_STATE *dsp_state) +{ + FMODDistanceFilterState *state = (FMODDistanceFilterState *)dsp_state->plugindata; + state->reset(); + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspsetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float value) +{ + FMODDistanceFilterState *state = (FMODDistanceFilterState *)dsp_state->plugindata; + + switch (index) + { + case FMOD_DISTANCE_FILTER_MAX_DISTANCE: + state->setMaxDistance(value); + return FMOD_OK; + + case FMOD_DISTANCE_FILTER_BANDPASS_FREQUENCY: + state->setBandpassFrequency(value); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspgetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr) +{ + FMODDistanceFilterState *state = (FMODDistanceFilterState *)dsp_state->plugindata; + + switch (index) + { + case FMOD_DISTANCE_FILTER_MAX_DISTANCE: + *value = state->maxDistance(); + if (valuestr) snprintf(valuestr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, "%.1f", state->maxDistance()); + return FMOD_OK; + + case FMOD_DISTANCE_FILTER_BANDPASS_FREQUENCY: + *value = state->bandpassFrequency(); + if (valuestr) snprintf(valuestr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, "%.1f Hz", state->bandpassFrequency()); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspsetparamdata(FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int /*length*/) +{ + FMODDistanceFilterState *state = (FMODDistanceFilterState *)dsp_state->plugindata; + + switch (index) + { + case FMOD_DISTANCE_FILTER_3D_ATTRIBUTES: + FMOD_DSP_PARAMETER_3DATTRIBUTES* param = (FMOD_DSP_PARAMETER_3DATTRIBUTES*)data; + state->setDistance(sqrtf(param->relative.position.x * param->relative.position.x + param->relative.position.y * param->relative.position.y + param->relative.position.z * param->relative.position.z)); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_dspgetparamdata(FMOD_DSP_STATE * /*dsp_state*/, int index, void ** /*value*/, unsigned int * /*length*/, char * /*valuestr*/) +{ + switch (index) + { + case FMOD_DISTANCE_FILTER_3D_ATTRIBUTES: + return FMOD_ERR_INVALID_PARAM; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_DistanceFilter_shouldiprocess(FMOD_DSP_STATE * /*dsp_state*/, FMOD_BOOL inputsidle, unsigned int /*length*/, FMOD_CHANNELMASK /*inmask*/, int /*inchannels*/, FMOD_SPEAKERMODE /*speakermode*/) +{ + if (inputsidle) + { + return FMOD_ERR_DSP_DONTPROCESS; + } + + return FMOD_OK; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_gain.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_gain.cpp new file mode 100644 index 0000000..7ab90d2 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_gain.cpp @@ -0,0 +1,360 @@ +/*============================================================================== +Gain DSP Plugin Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to create a simple gain DSP effect. +==============================================================================*/ + +#ifdef WIN32 + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include + +#include "fmod.hpp" + +#define FMOD_GAIN_USEPROCESSCALLBACK /* FMOD plugins have 2 methods of processing data. + 1. via a 'read' callback which is compatible with FMOD Ex but limited in functionality, or + 2. via a 'process' callback which exposes more functionality, like masks and query before process early out logic. */ + +extern "C" { + F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMODGetDSPDescription(); +} + +const float FMOD_GAIN_PARAM_GAIN_MIN = -80.0f; +const float FMOD_GAIN_PARAM_GAIN_MAX = 10.0f; +const float FMOD_GAIN_PARAM_GAIN_DEFAULT = 0.0f; +#define FMOD_GAIN_RAMPCOUNT 256 + +enum +{ + FMOD_GAIN_PARAM_GAIN = 0, + FMOD_GAIN_PARAM_INVERT, + FMOD_GAIN_NUM_PARAMETERS +}; + +#define DECIBELS_TO_LINEAR(__dbval__) ((__dbval__ <= FMOD_GAIN_PARAM_GAIN_MIN) ? 0.0f : powf(10.0f, __dbval__ / 20.0f)) +#define LINEAR_TO_DECIBELS(__linval__) ((__linval__ <= 0.0f) ? FMOD_GAIN_PARAM_GAIN_MIN : 20.0f * log10f((float)__linval__)) + +FMOD_RESULT F_CALL FMOD_Gain_dspcreate (FMOD_DSP_STATE *dsp_state); +FMOD_RESULT F_CALL FMOD_Gain_dsprelease (FMOD_DSP_STATE *dsp_state); +FMOD_RESULT F_CALL FMOD_Gain_dspreset (FMOD_DSP_STATE *dsp_state); +#ifdef FMOD_GAIN_USEPROCESSCALLBACK +FMOD_RESULT F_CALL FMOD_Gain_dspprocess (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op); +#else +FMOD_RESULT F_CALL FMOD_Gain_dspread (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels); +#endif +FMOD_RESULT F_CALL FMOD_Gain_dspsetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float value); +FMOD_RESULT F_CALL FMOD_Gain_dspsetparamint (FMOD_DSP_STATE *dsp_state, int index, int value); +FMOD_RESULT F_CALL FMOD_Gain_dspsetparambool (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value); +FMOD_RESULT F_CALL FMOD_Gain_dspsetparamdata (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length); +FMOD_RESULT F_CALL FMOD_Gain_dspgetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_Gain_dspgetparamint (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_Gain_dspgetparambool (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_Gain_dspgetparamdata (FMOD_DSP_STATE *dsp_state, int index, void **value, unsigned int *length, char *valuestr); +FMOD_RESULT F_CALL FMOD_Gain_shouldiprocess (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode); +FMOD_RESULT F_CALL FMOD_Gain_sys_register (FMOD_DSP_STATE *dsp_state); +FMOD_RESULT F_CALL FMOD_Gain_sys_deregister (FMOD_DSP_STATE *dsp_state); +FMOD_RESULT F_CALL FMOD_Gain_sys_mix (FMOD_DSP_STATE *dsp_state, int stage); + +static bool FMOD_Gain_Running = false; +static FMOD_DSP_PARAMETER_DESC p_gain; +static FMOD_DSP_PARAMETER_DESC p_invert; + +FMOD_DSP_PARAMETER_DESC *FMOD_Gain_dspparam[FMOD_GAIN_NUM_PARAMETERS] = +{ + &p_gain, + &p_invert +}; + +FMOD_DSP_DESCRIPTION FMOD_Gain_Desc = +{ + FMOD_PLUGIN_SDK_VERSION, + "FMOD Gain", // name + 0x00010000, // plug-in version + 1, // number of input buffers to process + 1, // number of output buffers to process + FMOD_Gain_dspcreate, + FMOD_Gain_dsprelease, + FMOD_Gain_dspreset, +#ifndef FMOD_GAIN_USEPROCESSCALLBACK + FMOD_Gain_dspread, +#else + 0, +#endif +#ifdef FMOD_GAIN_USEPROCESSCALLBACK + FMOD_Gain_dspprocess, +#else + 0, +#endif + 0, + FMOD_GAIN_NUM_PARAMETERS, + FMOD_Gain_dspparam, + FMOD_Gain_dspsetparamfloat, + 0, // FMOD_Gain_dspsetparamint, + FMOD_Gain_dspsetparambool, + 0, // FMOD_Gain_dspsetparamdata, + FMOD_Gain_dspgetparamfloat, + 0, // FMOD_Gain_dspgetparamint, + FMOD_Gain_dspgetparambool, + 0, // FMOD_Gain_dspgetparamdata, + FMOD_Gain_shouldiprocess, + 0, // userdata + FMOD_Gain_sys_register, + FMOD_Gain_sys_deregister, + FMOD_Gain_sys_mix +}; + +extern "C" +{ + +F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMODGetDSPDescription() +{ + static float gain_mapping_values[] = { -80, -50, -30, -10, 10 }; + static float gain_mapping_scale[] = { 0, 2, 4, 7, 11 }; + + FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(p_gain, "Gain", "dB", "Gain in dB. -80 to 10. Default = 0", FMOD_GAIN_PARAM_GAIN_DEFAULT, gain_mapping_values, gain_mapping_scale); + FMOD_DSP_INIT_PARAMDESC_BOOL(p_invert, "Invert", "", "Invert signal. Default = off", false, 0); + return &FMOD_Gain_Desc; +} + +} + +class FMODGainState +{ +public: + FMODGainState(); + + void read(float *inbuffer, float *outbuffer, unsigned int length, int channels); + void reset(); + void setGain(float); + void setInvert(bool); + float gain() const { return LINEAR_TO_DECIBELS(m_invert ? -m_target_gain : m_target_gain); } + FMOD_BOOL invert() const { return m_invert; } + +private: + float m_target_gain; + float m_current_gain; + int m_ramp_samples_left; + bool m_invert; +}; + +FMODGainState::FMODGainState() +{ + m_target_gain = DECIBELS_TO_LINEAR(FMOD_GAIN_PARAM_GAIN_DEFAULT); + m_invert = 0; + reset(); +} + +void FMODGainState::read(float *inbuffer, float *outbuffer, unsigned int length, int channels) +{ + // Note: buffers are interleaved + float gain = m_current_gain; + + if (m_ramp_samples_left) + { + float target = m_target_gain; + float delta = (target - gain) / m_ramp_samples_left; + while (length) + { + if (--m_ramp_samples_left) + { + gain += delta; + for (int i = 0; i < channels; ++i) + { + *outbuffer++ = *inbuffer++ * gain; + } + } + else + { + gain = target; + break; + } + --length; + } + } + + unsigned int samples = length * channels; + while (samples--) + { + *outbuffer++ = *inbuffer++ * gain; + } + + m_current_gain = gain; +} + +void FMODGainState::reset() +{ + m_current_gain = m_target_gain; + m_ramp_samples_left = 0; +} + +void FMODGainState::setGain(float gain) +{ + m_target_gain = m_invert ? -DECIBELS_TO_LINEAR(gain) : DECIBELS_TO_LINEAR(gain); + m_ramp_samples_left = FMOD_GAIN_RAMPCOUNT; +} + +void FMODGainState::setInvert(bool invert) +{ + if (invert != m_invert) + { + m_target_gain = -m_target_gain; + m_ramp_samples_left = FMOD_GAIN_RAMPCOUNT; + } + m_invert = invert; +} + +FMOD_RESULT F_CALL FMOD_Gain_dspcreate(FMOD_DSP_STATE *dsp_state) +{ + dsp_state->plugindata = (FMODGainState *)FMOD_DSP_ALLOC(dsp_state, sizeof(FMODGainState)); + if (!dsp_state->plugindata) + { + return FMOD_ERR_MEMORY; + } + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Gain_dsprelease(FMOD_DSP_STATE *dsp_state) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + FMOD_DSP_FREE(dsp_state, state); + return FMOD_OK; +} + +#ifdef FMOD_GAIN_USEPROCESSCALLBACK + +FMOD_RESULT F_CALL FMOD_Gain_dspprocess(FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + + if (op == FMOD_DSP_PROCESS_QUERY) + { + if (outbufferarray && inbufferarray) + { + outbufferarray[0].buffernumchannels[0] = inbufferarray[0].buffernumchannels[0]; + outbufferarray[0].speakermode = inbufferarray[0].speakermode; + } + + if (inputsidle) + { + return FMOD_ERR_DSP_DONTPROCESS; + } + } + else + { + state->read(inbufferarray[0].buffers[0], outbufferarray[0].buffers[0], length, inbufferarray[0].buffernumchannels[0]); // input and output channels count match for this effect + } + + return FMOD_OK; +} + +#else + +FMOD_RESULT F_CALL FMOD_Gain_dspread(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int * /*outchannels*/) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + state->read(inbuffer, outbuffer, length, inchannels); // input and output channels count match for this effect + return FMOD_OK; +} + +#endif + +FMOD_RESULT F_CALL FMOD_Gain_dspreset(FMOD_DSP_STATE *dsp_state) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + state->reset(); + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Gain_dspsetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float value) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + + switch (index) + { + case FMOD_GAIN_PARAM_GAIN: + state->setGain(value); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_Gain_dspgetparamfloat(FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + + switch (index) + { + case FMOD_GAIN_PARAM_GAIN: + *value = state->gain(); + if (valuestr) snprintf(valuestr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, "%.1f dB", state->gain()); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_Gain_dspsetparambool(FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + + switch (index) + { + case FMOD_GAIN_PARAM_INVERT: + state->setInvert(value ? true : false); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_Gain_dspgetparambool(FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr) +{ + FMODGainState *state = (FMODGainState *)dsp_state->plugindata; + + switch (index) + { + case FMOD_GAIN_PARAM_INVERT: + *value = state->invert(); + if (valuestr) snprintf(valuestr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, state->invert() ? "Inverted" : "Off" ); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_Gain_shouldiprocess(FMOD_DSP_STATE * /*dsp_state*/, FMOD_BOOL inputsidle, unsigned int /*length*/, FMOD_CHANNELMASK /*inmask*/, int /*inchannels*/, FMOD_SPEAKERMODE /*speakermode*/) +{ + if (inputsidle) + { + return FMOD_ERR_DSP_DONTPROCESS; + } + + return FMOD_OK; +} + + +FMOD_RESULT F_CALL FMOD_Gain_sys_register(FMOD_DSP_STATE * /*dsp_state*/) +{ + FMOD_Gain_Running = true; + // called once for this type of dsp being loaded or registered (it is not per instance) + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Gain_sys_deregister(FMOD_DSP_STATE * /*dsp_state*/) +{ + FMOD_Gain_Running = false; + // called once for this type of dsp being unloaded or de-registered (it is not per instance) + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Gain_sys_mix(FMOD_DSP_STATE * /*dsp_state*/, int /*stage*/) +{ + // stage == 0 , before all dsps are processed/mixed, this callback is called once for this type. + // stage == 1 , after all dsps are processed/mixed, this callback is called once for this type. + return FMOD_OK; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_noise.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_noise.cpp new file mode 100644 index 0000000..d96f65a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_noise.cpp @@ -0,0 +1,302 @@ +/*============================================================================== +Plugin Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to created a plugin effect. +==============================================================================*/ + +#include +#include +#include +#include + +#include "fmod.hpp" + +extern "C" { + F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMODGetDSPDescription(); +} + +const float FMOD_NOISE_PARAM_GAIN_MIN = -80.0f; +const float FMOD_NOISE_PARAM_GAIN_MAX = 10.0f; +const float FMOD_NOISE_PARAM_GAIN_DEFAULT = 0.0f; + +#define FMOD_NOISE_RAMPCOUNT 256 + +enum +{ + FMOD_NOISE_PARAM_LEVEL = 0, + FMOD_NOISE_PARAM_FORMAT, + FMOD_NOISE_NUM_PARAMETERS +}; + +enum FMOD_NOISE_FORMAT +{ + FMOD_NOISE_FORMAT_MONO = 0, + FMOD_NOISE_FORMAT_STEREO, + FMOD_NOISE_FORMAT_5POINT1 +}; + +#define DECIBELS_TO_LINEAR(__dbval__) ((__dbval__ <= FMOD_NOISE_PARAM_GAIN_MIN) ? 0.0f : powf(10.0f, __dbval__ / 20.0f)) +#define LINEAR_TO_DECIBELS(__linval__) ((__linval__ <= 0.0f) ? FMOD_NOISE_PARAM_GAIN_MIN : 20.0f * log10f((float)__linval__)) + +FMOD_RESULT F_CALL FMOD_Noise_dspcreate (FMOD_DSP_STATE *dsp); +FMOD_RESULT F_CALL FMOD_Noise_dsprelease (FMOD_DSP_STATE *dsp); +FMOD_RESULT F_CALL FMOD_Noise_dspreset (FMOD_DSP_STATE *dsp); +FMOD_RESULT F_CALL FMOD_Noise_dspprocess (FMOD_DSP_STATE *dsp, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op); +FMOD_RESULT F_CALL FMOD_Noise_dspsetparamfloat(FMOD_DSP_STATE *dsp, int index, float value); +FMOD_RESULT F_CALL FMOD_Noise_dspsetparamint (FMOD_DSP_STATE *dsp, int index, int value); +FMOD_RESULT F_CALL FMOD_Noise_dspsetparambool (FMOD_DSP_STATE *dsp, int index, bool value); +FMOD_RESULT F_CALL FMOD_Noise_dspsetparamdata (FMOD_DSP_STATE *dsp, int index, void *data, unsigned int length); +FMOD_RESULT F_CALL FMOD_Noise_dspgetparamfloat(FMOD_DSP_STATE *dsp, int index, float *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_Noise_dspgetparamint (FMOD_DSP_STATE *dsp, int index, int *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_Noise_dspgetparambool (FMOD_DSP_STATE *dsp, int index, bool *value, char *valuestr); +FMOD_RESULT F_CALL FMOD_Noise_dspgetparamdata (FMOD_DSP_STATE *dsp, int index, void **value, unsigned int *length, char *valuestr); + +static FMOD_DSP_PARAMETER_DESC p_level; +static FMOD_DSP_PARAMETER_DESC p_format; + +FMOD_DSP_PARAMETER_DESC *FMOD_Noise_dspparam[FMOD_NOISE_NUM_PARAMETERS] = +{ + &p_level, + &p_format +}; + +const char* FMOD_Noise_Format_Names[3] = {"Mono", "Stereo", "5.1"}; + +FMOD_DSP_DESCRIPTION FMOD_Noise_Desc = +{ + FMOD_PLUGIN_SDK_VERSION, + "FMOD Noise", // name + 0x00010000, // plug-in version + 0, // number of input buffers to process + 1, // number of output buffers to process + FMOD_Noise_dspcreate, + FMOD_Noise_dsprelease, + FMOD_Noise_dspreset, + 0, + FMOD_Noise_dspprocess, + 0, + FMOD_NOISE_NUM_PARAMETERS, + FMOD_Noise_dspparam, + FMOD_Noise_dspsetparamfloat, + FMOD_Noise_dspsetparamint, + 0, + 0, + FMOD_Noise_dspgetparamfloat, + FMOD_Noise_dspgetparamint, + 0, + 0, + 0, + 0, // userdata + 0, // Register + 0, // Deregister + 0 // Mix +}; + +extern "C" +{ + +F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMODGetDSPDescription() +{ + FMOD_DSP_INIT_PARAMDESC_FLOAT(p_level, "Level", "dB", "Gain in dB. -80 to 10. Default = 0", FMOD_NOISE_PARAM_GAIN_MIN, FMOD_NOISE_PARAM_GAIN_MAX, FMOD_NOISE_PARAM_GAIN_DEFAULT); + FMOD_DSP_INIT_PARAMDESC_INT(p_format, "Format", "", "Mono, stereo or 5.1. Default = 0 (mono)", FMOD_NOISE_FORMAT_MONO, FMOD_NOISE_FORMAT_5POINT1, FMOD_NOISE_FORMAT_MONO, false, FMOD_Noise_Format_Names); + return &FMOD_Noise_Desc; +} + +} + +class FMODNoiseState +{ +public: + FMODNoiseState(); + + void generate(float *outbuffer, unsigned int length, int channels); + void reset(); + void setLevel(float); + void setFormat(FMOD_NOISE_FORMAT format) { m_format = format; } + float level() const { return LINEAR_TO_DECIBELS(m_target_level); } + FMOD_NOISE_FORMAT format() const { return m_format; } + +private: + float m_target_level; + float m_current_level; + int m_ramp_samples_left; + FMOD_NOISE_FORMAT m_format; +}; + +FMODNoiseState::FMODNoiseState() +{ + m_target_level = DECIBELS_TO_LINEAR(FMOD_NOISE_PARAM_GAIN_DEFAULT); + m_format = FMOD_NOISE_FORMAT_MONO; + reset(); +} + +void FMODNoiseState::generate(float *outbuffer, unsigned int length, int channels) +{ + // Note: buffers are interleaved + float gain = m_current_level; + + if (m_ramp_samples_left) + { + float target = m_target_level; + float delta = (target - gain) / m_ramp_samples_left; + while (length) + { + if (--m_ramp_samples_left) + { + gain += delta; + for (int i = 0; i < channels; ++i) + { + *outbuffer++ = (((float)(rand()%32768) / 16384.0f) - 1.0f) * gain; + } + } + else + { + gain = target; + break; + } + --length; + } + } + + unsigned int samples = length * channels; + while (samples--) + { + *outbuffer++ = (((float)(rand()%32768) / 16384.0f) - 1.0f) * gain; + } + + m_current_level = gain; +} + +void FMODNoiseState::reset() +{ + m_current_level = m_target_level; + m_ramp_samples_left = 0; +} + +void FMODNoiseState::setLevel(float level) +{ + m_target_level = DECIBELS_TO_LINEAR(level); + m_ramp_samples_left = FMOD_NOISE_RAMPCOUNT; +} + +FMOD_RESULT F_CALL FMOD_Noise_dspcreate(FMOD_DSP_STATE *dsp) +{ + dsp->plugindata = (FMODNoiseState *)FMOD_DSP_ALLOC(dsp, sizeof(FMODNoiseState)); + if (!dsp->plugindata) + { + return FMOD_ERR_MEMORY; + } + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Noise_dsprelease(FMOD_DSP_STATE *dsp) +{ + FMODNoiseState *state = (FMODNoiseState *)dsp->plugindata; + FMOD_DSP_FREE(dsp, state); + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Noise_dspprocess(FMOD_DSP_STATE *dsp, unsigned int length, const FMOD_DSP_BUFFER_ARRAY * /*inbufferarray*/, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL /*inputsidle*/, FMOD_DSP_PROCESS_OPERATION op) +{ + FMODNoiseState *state = (FMODNoiseState *)dsp->plugindata; + + if (op == FMOD_DSP_PROCESS_QUERY) + { + FMOD_SPEAKERMODE outmode = FMOD_SPEAKERMODE_DEFAULT; + int outchannels = 0; + + switch(state->format()) + { + case FMOD_NOISE_FORMAT_MONO: + outmode = FMOD_SPEAKERMODE_MONO; + outchannels = 1; + break; + + case FMOD_NOISE_FORMAT_STEREO: + outmode = FMOD_SPEAKERMODE_STEREO; + outchannels = 2; + break; + + case FMOD_NOISE_FORMAT_5POINT1: + outmode = FMOD_SPEAKERMODE_5POINT1; + outchannels = 6; + } + + if (outbufferarray) + { + outbufferarray->speakermode = outmode; + outbufferarray->buffernumchannels[0] = outchannels; + } + + return FMOD_OK; + } + + state->generate(outbufferarray->buffers[0], length, outbufferarray->buffernumchannels[0]); + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Noise_dspreset(FMOD_DSP_STATE *dsp) +{ + FMODNoiseState *state = (FMODNoiseState *)dsp->plugindata; + state->reset(); + return FMOD_OK; +} + +FMOD_RESULT F_CALL FMOD_Noise_dspsetparamfloat(FMOD_DSP_STATE *dsp, int index, float value) +{ + FMODNoiseState *state = (FMODNoiseState *)dsp->plugindata; + + switch (index) + { + case FMOD_NOISE_PARAM_LEVEL: + state->setLevel(value); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_Noise_dspgetparamfloat(FMOD_DSP_STATE *dsp, int index, float *value, char *valuestr) +{ + FMODNoiseState *state = (FMODNoiseState *)dsp->plugindata; + + switch (index) + { + case FMOD_NOISE_PARAM_LEVEL: + *value = state->level(); + if (valuestr) snprintf(valuestr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, "%.1f dB", state->level()); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_Noise_dspsetparamint(FMOD_DSP_STATE *dsp, int index, int value) +{ + FMODNoiseState *state = (FMODNoiseState *)dsp->plugindata; + + switch (index) + { + case FMOD_NOISE_PARAM_FORMAT: + state->setFormat((FMOD_NOISE_FORMAT)value); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} + +FMOD_RESULT F_CALL FMOD_Noise_dspgetparamint(FMOD_DSP_STATE *dsp, int index, int *value, char *valuestr) +{ + FMODNoiseState *state = (FMODNoiseState *)dsp->plugindata; + + switch (index) + { + case FMOD_NOISE_PARAM_FORMAT: + *value = state->format(); + if (valuestr) snprintf(valuestr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, "%s", FMOD_Noise_Format_Names[state->format()]); + return FMOD_OK; + } + + return FMOD_ERR_INVALID_PARAM; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_rnbo.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_rnbo.cpp new file mode 100644 index 0000000..99c5dd6 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/plugins/fmod_rnbo.cpp @@ -0,0 +1,184 @@ +/*============================================================================== +RNBO DSP Plugin Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to integrate RNBO C++ source code into an FMOD effect. +1. Add the rnbo and rnbo/common directories to your include paths. +2. Add the generated RNBO source .cpp file and rnbo/RNBO.cpp files to your list + of source files. +3. Build and copy the generated library into your FMOD Studio script directory: + https://fmod.com/docs/2.02/studio/plugin-reference.html#loading-plug-ins +==============================================================================*/ +#if __has_include("RNBO.h") +#include "RNBO.h" + +#include +#include +#include +#include + +#include "fmod.hpp" + +static FMOD_DSP_PARAMETER_DESC** params = nullptr; +static int numParams; +static int numInputs; +static int numOutputs; +static std::atomic gSysCount = 0; + +static FMOD_RESULT F_CALL FMOD_RNBO_Create(FMOD_DSP_STATE *dsp_state) +{ + dsp_state->plugindata = FMOD_DSP_ALLOC(dsp_state, sizeof(RNBO::CoreObject)); + if (!dsp_state->plugindata) + { + return FMOD_ERR_MEMORY; + } + + RNBO::CoreObject *rnboObject = (RNBO::CoreObject *)dsp_state->plugindata; + + int sampleRate; + unsigned int blockSize; + + FMOD_DSP_GETSAMPLERATE(dsp_state, &sampleRate); + FMOD_DSP_GETBLOCKSIZE(dsp_state, &blockSize); + + new (rnboObject) RNBO::CoreObject(); + + rnboObject->prepareToProcess(sampleRate, blockSize); + + return FMOD_OK; +} + +static FMOD_RESULT F_CALL FMOD_RNBO_Release(FMOD_DSP_STATE *dsp_state) +{ + RNBO::CoreObject *rnboObject = (RNBO::CoreObject *)dsp_state->plugindata; + rnboObject->~CoreObject(); + + FMOD_DSP_FREE(dsp_state, rnboObject); + + return FMOD_OK; +} + +static FMOD_RESULT F_CALL FMOD_RNBO_Process(FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op) +{ + RNBO::CoreObject *rnboObject = (RNBO::CoreObject *)dsp_state->plugindata; + + if (op == FMOD_DSP_PROCESS_QUERY) + { + if (numInputs > 0) + { + if (inputsidle) + { + return FMOD_ERR_DSP_SILENCE; + } + } + else + { + if (outbufferarray && outbufferarray[0].buffernumchannels) + { + outbufferarray[0].buffernumchannels[0] = numOutputs; + } + } + } + else + { + rnboObject->process(inbufferarray[0].buffers[0], inbufferarray[0].buffernumchannels[0], + outbufferarray[0].buffers[0], outbufferarray[0].buffernumchannels[0], length); + } + + return FMOD_OK; +} + +static FMOD_RESULT F_CALL FMOD_RNBO_SetParamFloat(FMOD_DSP_STATE *dsp_state, int index, float value) +{ + RNBO::CoreObject *rnboObject = (RNBO::CoreObject *)dsp_state->plugindata; + + rnboObject->setParameterValue(index, value); + return FMOD_OK; +} + +static FMOD_RESULT F_CALL FMOD_RNBO_GetParamFloat(FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr) +{ + RNBO::CoreObject *rnboObject = (RNBO::CoreObject *)dsp_state->plugindata; + + *value = (float)rnboObject->getParameterValue(index); + if (valuestr) snprintf(valuestr, FMOD_DSP_GETPARAM_VALUESTR_LENGTH, "%s", rnboObject->getParameterName(index)); + + return FMOD_OK; +} + +static FMOD_RESULT F_CALL FMOD_RNBO_SysRegister(FMOD_DSP_STATE* dsp_state) +{ + RNBO::CoreObject* rnboObject = (RNBO::CoreObject*)dsp_state->plugindata; + + gSysCount++; + + return FMOD_OK; +} + +static FMOD_RESULT F_CALL FMOD_RNBO_SysDeregister(FMOD_DSP_STATE* dsp_state) +{ + RNBO::CoreObject* rnboObject = (RNBO::CoreObject*)dsp_state->plugindata; + + gSysCount--; + if (gSysCount == 0) + { + for (int i = 0; i < numParams; ++i) + { + free(params[i]); + } + free(params); + + params = nullptr; + } + + return FMOD_OK; +} + +extern "C" F_EXPORT FMOD_DSP_DESCRIPTION *F_CALL FMODGetDSPDescription() +{ + static FMOD_DSP_DESCRIPTION desc = { FMOD_PLUGIN_SDK_VERSION, "FMOD RNBO", 0x00010000 }; + desc.create = FMOD_RNBO_Create; + desc.release = FMOD_RNBO_Release; + desc.process = FMOD_RNBO_Process; + desc.setparameterfloat = FMOD_RNBO_SetParamFloat; + desc.getparameterfloat = FMOD_RNBO_GetParamFloat; + desc.sys_register = FMOD_RNBO_SysRegister; + desc.sys_deregister = FMOD_RNBO_SysDeregister; + + if (!params) + { + RNBO::CoreObject tmpRnboObject; + + numParams = tmpRnboObject.getNumParameters(); + numInputs = tmpRnboObject.getNumInputChannels(); + numOutputs = tmpRnboObject.getNumOutputChannels(); + + desc.numparameters = numParams; + desc.numinputbuffers = numInputs > 0; + desc.numoutputbuffers = numOutputs > 0; + + params = (FMOD_DSP_PARAMETER_DESC**)malloc(desc.numparameters * sizeof(FMOD_DSP_PARAMETER_DESC*)); + + for (int i = 0; i < numParams; ++i) + { + RNBO::ParameterInfo info = {}; + tmpRnboObject.getParameterInfo(i, &info); + + params[i] = (FMOD_DSP_PARAMETER_DESC *)malloc(sizeof(FMOD_DSP_PARAMETER_DESC)); + memset(params[i], 0, sizeof(FMOD_DSP_PARAMETER_DESC)); + + snprintf(params[i]->name, sizeof(params[i]->name), "%s", tmpRnboObject.getParameterId(i)); + snprintf(params[i]->label, sizeof(params[i]->label), "%s", info.unit); + + params[i]->type = FMOD_DSP_PARAMETER_TYPE_FLOAT; + params[i]->floatdesc.defaultval = info.initialValue; + params[i]->floatdesc.min = info.min; + params[i]->floatdesc.max = info.max; + } + + desc.paramdesc = params; + } + return &desc; +} + +#endif diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record.cpp new file mode 100644 index 0000000..d596bbc --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record.cpp @@ -0,0 +1,222 @@ +/*============================================================================== +Record example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to record continuously and play back the same data while +keeping a specified latency between the two. This is achieved by delaying the +start of playback until the specified number of milliseconds has been recorded. +At runtime the playback speed will be slightly altered to compensate for any +drift in either play or record drivers. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +#define LATENCY_MS (50) /* Some devices will require higher latency to avoid glitches */ +#define DRIFT_MS (1) +#define DEVICE_INDEX (0) + +int FMOD_Main() +{ + FMOD::Channel *channel = NULL; + unsigned int samplesRecorded = 0; + unsigned int samplesPlayed = 0; + bool dspEnabled = false; + + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + /* + Create a System object and initialize. + */ + FMOD::System *system = NULL; + FMOD_RESULT result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(100, FMOD_INIT_NORMAL, extraDriverData); + ERRCHECK(result); + + int numDrivers = 0; + result = system->getRecordNumDrivers(NULL, &numDrivers); + ERRCHECK(result); + + if (numDrivers == 0) + { + Common_Fatal("No recording devices found/plugged in! Aborting."); + } + + /* + Determine latency in samples. + */ + int nativeRate = 0; + int nativeChannels = 0; + result = system->getRecordDriverInfo(DEVICE_INDEX, NULL, 0, NULL, &nativeRate, NULL, &nativeChannels, NULL); + ERRCHECK(result); + + unsigned int driftThreshold = (nativeRate * DRIFT_MS) / 1000; /* The point where we start compensating for drift */ + unsigned int desiredLatency = (nativeRate * LATENCY_MS) / 1000; /* User specified latency */ + unsigned int adjustedLatency = desiredLatency; /* User specified latency adjusted for driver update granularity */ + int actualLatency = desiredLatency; /* Latency measured once playback begins (smoothened for jitter) */ + + /* + Create user sound to record into, then start recording. + */ + FMOD_CREATESOUNDEXINFO exinfo = {0}; + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); + exinfo.numchannels = nativeChannels; + exinfo.format = FMOD_SOUND_FORMAT_PCM16; + exinfo.defaultfrequency = nativeRate; + exinfo.length = nativeRate * sizeof(short) * nativeChannels; /* 1 second buffer, size here doesn't change latency */ + + FMOD::Sound *sound = NULL; + result = system->createSound(0, FMOD_LOOP_NORMAL | FMOD_OPENUSER, &exinfo, &sound); + ERRCHECK(result); + + result = system->recordStart(DEVICE_INDEX, sound, true); + ERRCHECK(result); + + unsigned int soundLength = 0; + result = sound->getLength(&soundLength, FMOD_TIMEUNIT_PCM); + ERRCHECK(result); + + /* + Main loop + */ + do + { + Common_Update(); + + /* + Add a DSP effect -- just for fun + */ + if (Common_BtnPress(BTN_ACTION1)) + { + FMOD_REVERB_PROPERTIES propOn = FMOD_PRESET_CONCERTHALL; + FMOD_REVERB_PROPERTIES propOff = FMOD_PRESET_OFF; + + dspEnabled = !dspEnabled; + + result = system->setReverbProperties(0, dspEnabled ? &propOn : &propOff); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + /* + Determine how much has been recorded since we last checked + */ + unsigned int recordPos = 0; + result = system->getRecordPosition(DEVICE_INDEX, &recordPos); + if (result != FMOD_ERR_RECORD_DISCONNECTED) + { + ERRCHECK(result); + } + + static unsigned int lastRecordPos = 0; + unsigned int recordDelta = (recordPos >= lastRecordPos) ? (recordPos - lastRecordPos) : (recordPos + soundLength - lastRecordPos); + lastRecordPos = recordPos; + samplesRecorded += recordDelta; + + static unsigned int minRecordDelta = (unsigned int)-1; + if (recordDelta && (recordDelta < minRecordDelta)) + { + minRecordDelta = recordDelta; /* Smallest driver granularity seen so far */ + adjustedLatency = (recordDelta <= desiredLatency) ? desiredLatency : recordDelta; /* Adjust our latency if driver granularity is high */ + } + + /* + Delay playback until our desired latency is reached. + */ + if (!channel && samplesRecorded >= adjustedLatency) + { + result = system->playSound(sound, 0, false, &channel); + ERRCHECK(result); + } + + if (channel) + { + /* + Stop playback if recording stops. + */ + bool isRecording = false; + result = system->isRecording(DEVICE_INDEX, &isRecording); + if (result != FMOD_ERR_RECORD_DISCONNECTED) + { + ERRCHECK(result); + } + + if (!isRecording) + { + result = channel->setPaused(true); + ERRCHECK(result); + } + + /* + Determine how much has been played since we last checked. + */ + unsigned int playPos = 0; + result = channel->getPosition(&playPos, FMOD_TIMEUNIT_PCM); + ERRCHECK(result); + + static unsigned int lastPlayPos = 0; + unsigned int playDelta = (playPos >= lastPlayPos) ? (playPos - lastPlayPos) : (playPos + soundLength - lastPlayPos); + lastPlayPos = playPos; + samplesPlayed += playDelta; + + /* + Compensate for any drift. + */ + int latency = samplesRecorded - samplesPlayed; + actualLatency = (int)((0.97f * actualLatency) + (0.03f * latency)); + + int playbackRate = nativeRate; + if (actualLatency < (int)(adjustedLatency - driftThreshold)) + { + /* Play position is catching up to the record position, slow playback down by 2% */ + playbackRate = nativeRate - (nativeRate / 50); + } + else if (actualLatency > (int)(adjustedLatency + driftThreshold)) + { + /* Play position is falling behind the record position, speed playback up by 2% */ + playbackRate = nativeRate + (nativeRate / 50); + } + + channel->setFrequency((float)playbackRate); + ERRCHECK(result); + } + + Common_Draw("=================================================="); + Common_Draw("Record Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Adjust LATENCY define to compensate for stuttering"); + Common_Draw("Current value is %dms", LATENCY_MS); + Common_Draw(""); + Common_Draw("Press %s to %s DSP effect", Common_BtnStr(BTN_ACTION1), dspEnabled ? "disable" : "enable"); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Adjusted latency: %4d (%dms)", adjustedLatency, adjustedLatency * 1000 / nativeRate); + Common_Draw("Actual latency: %4d (%dms)", actualLatency, actualLatency * 1000 / nativeRate); + Common_Draw(""); + Common_Draw("Recorded: %5d (%ds)", samplesRecorded, samplesRecorded / nativeRate); + Common_Draw("Played: %5d (%ds)", samplesPlayed, samplesPlayed / nativeRate); + + Common_Sleep(10); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound->release(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.creator.shared new file mode 100644 index 0000000..dcdd44f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/record + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.files new file mode 100644 index 0000000..8556c9d --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/record.makefile +../record.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record/record.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration.cpp new file mode 100644 index 0000000..5df0eda --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration.cpp @@ -0,0 +1,212 @@ +/*============================================================================== +Record enumeration example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how to enumerate the available recording drivers on this +device. It demonstrates how the enumerated list changes as microphones are +attached and detached. It also shows that you can record from multi mics at +the same time. + +Please note to minimize latency care should be taken to control the number +of samples between the record position and the play position. Check the record +example for details on this process. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" + +static const int MAX_DRIVERS = 16; +static const int MAX_DRIVERS_IN_VIEW = 3; + +struct RECORD_STATE +{ + FMOD::Sound *sound; + FMOD::Channel *channel; +}; + +FMOD_RESULT F_CALL SystemCallback(FMOD_SYSTEM* /*system*/, FMOD_SYSTEM_CALLBACK_TYPE /*type*/, void *, void *, void *userData) +{ + int *recordListChangedCount = (int *)userData; + *recordListChangedCount = *recordListChangedCount + 1; + + return FMOD_OK; +} + +int FMOD_Main() +{ + int scroll = 0; + int cursor = 0; + RECORD_STATE record[MAX_DRIVERS] = { }; + + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + /* + Create a System object and initialize. + */ + FMOD::System *system = NULL; + FMOD_RESULT result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(100, FMOD_INIT_NORMAL, extraDriverData); + ERRCHECK(result); + + /* + Setup a callback so we can be notified if the record list has changed. + */ + int recordListChangedCount = 0; + result = system->setUserData(&recordListChangedCount); + ERRCHECK(result); + + result = system->setCallback(&SystemCallback, FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED); + ERRCHECK(result); + + /* + Main loop + */ + do + { + Common_Update(); + + int numDrivers = 0; + int numConnected = 0; + result = system->getRecordNumDrivers(&numDrivers, &numConnected); + ERRCHECK(result); + + numDrivers = Common_Min(numDrivers, MAX_DRIVERS); /* Clamp the reported number of drivers to simplify this example */ + + if (Common_BtnPress(BTN_ACTION1)) + { + bool isRecording = false; + system->isRecording(cursor, &isRecording); + + if (isRecording) + { + system->recordStop(cursor); + } + else + { + /* Clean up previous record sound */ + if (record[cursor].sound) + { + result = record[cursor].sound->release(); + ERRCHECK(result); + } + + /* Query device native settings and start a recording */ + int nativeRate = 0; + int nativeChannels = 0; + result = system->getRecordDriverInfo(cursor, NULL, 0, NULL, &nativeRate, NULL, &nativeChannels, NULL); + ERRCHECK(result); + + FMOD_CREATESOUNDEXINFO exinfo = {0}; + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); + exinfo.numchannels = nativeChannels; + exinfo.format = FMOD_SOUND_FORMAT_PCM16; + exinfo.defaultfrequency = nativeRate; + exinfo.length = nativeRate * sizeof(short) * nativeChannels; /* 1 second buffer, size here doesn't change latency */ + + result = system->createSound(0, FMOD_LOOP_NORMAL | FMOD_OPENUSER, &exinfo, &record[cursor].sound); + ERRCHECK(result); + + result = system->recordStart(cursor, record[cursor].sound, true); + if (result != FMOD_ERR_RECORD_DISCONNECTED) + { + ERRCHECK(result); + } + } + } + else if (Common_BtnPress(BTN_ACTION2)) + { + bool isPlaying = false; + record[cursor].channel->isPlaying(&isPlaying); + + if (isPlaying) + { + record[cursor].channel->stop(); + } + else if (record[cursor].sound) + { + result = system->playSound(record[cursor].sound, NULL, false, &record[cursor].channel); + ERRCHECK(result); + } + } + else if (Common_BtnPress(BTN_UP)) + { + cursor = Common_Max(cursor - 1, 0); + scroll = Common_Max(scroll - 1, 0); + } + else if (Common_BtnPress(BTN_DOWN)) + { + if (numDrivers) + { + cursor = Common_Min(cursor + 1, numDrivers - 1); + } + + if (numDrivers > MAX_DRIVERS_IN_VIEW) + { + scroll = Common_Min(scroll + 1, numDrivers - MAX_DRIVERS_IN_VIEW); + } + } + + result = system->update(); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("Record Enumeration Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Record list has updated %d time(s).", recordListChangedCount); + Common_Draw("Currently %d device(s) plugged in.", numConnected); + Common_Draw(""); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw("Press %s and %s to scroll list", Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s start / stop recording", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s start / stop playback", Common_BtnStr(BTN_ACTION2)); + Common_Draw(""); + int numDisplay = Common_Min(numDrivers, MAX_DRIVERS_IN_VIEW); + for (int i = scroll; i < scroll + numDisplay; i++) + { + char name[256]; + int sampleRate; + int channels; + FMOD_GUID guid; + FMOD_DRIVER_STATE state; + + result = system->getRecordDriverInfo(i, name, sizeof(name), &guid, &sampleRate, NULL, &channels, &state); + ERRCHECK(result); + + bool isRecording = false; + system->isRecording(i, &isRecording); + + bool isPlaying = false; + record[i].channel->isPlaying(&isPlaying); + + Common_Draw("%c%2d. %s%.41s", (cursor == i) ? '>' : ' ', i, (state & FMOD_DRIVER_STATE_DEFAULT) ? "(*) " : "", name); + Common_Draw("%dKHz %dch {%08X-%04X-%04X-%04X-%02X%02X%02X%02X%02X%02X}", sampleRate / 1000, channels, guid.Data1, guid.Data2, guid.Data3, guid.Data4[0] << 8 | guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); + Common_Draw("(%s) (%s) (%s)", (state & FMOD_DRIVER_STATE_CONNECTED) ? "Connected" : "Unplugged", isRecording ? "Recording" : "Not recording", isPlaying ? "Playing" : "Not playing"); + Common_Draw(""); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + for (int i = 0; i < MAX_DRIVERS; i++) + { + if (record[i].sound) + { + result = record[i].sound->release(); + ERRCHECK(result); + } + } + + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.creator.shared new file mode 100644 index 0000000..ff952a8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f record_enumeration.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/record_enumeration + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.files new file mode 100644 index 0000000..e2fe666 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/record_enumeration.makefile +../record_enumeration.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/record_enumeration/record_enumeration.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound.cpp b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound.cpp new file mode 100644 index 0000000..9bf7ecf --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound.cpp @@ -0,0 +1,190 @@ +/*============================================================================== +User Created Sound Example +Copyright (c), Firelight Technologies Pty, Ltd 2004-2025. + +This example shows how create a sound with data filled by the user. It shows a +user created static sample, followed by a user created stream. The former +allocates all memory needed for the sound and is played back as a static sample, +while the latter streams the data in chunks as it plays, using far less memory. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod.hpp" +#include "common.h" +#include + +FMOD_RESULT F_CALL pcmreadcallback(FMOD_SOUND* /*sound*/, void *data, unsigned int datalen) +{ + static float t1 = 0, t2 = 0; // time + static float v1 = 0, v2 = 0; // velocity + signed short *stereo16bitbuffer = (signed short *)data; + + for (unsigned int count = 0; count < (datalen >> 2); count++) // >>2 = 16bit stereo (4 bytes per sample) + { + *stereo16bitbuffer++ = (signed short)(Common_Sin(t1) * 32767.0f); // left channel + *stereo16bitbuffer++ = (signed short)(Common_Sin(t2) * 32767.0f); // right channel + + t1 += 0.01f + v1; + t2 += 0.0142f + v2; + v1 += (float)(Common_Sin(t1) * 0.002f); + v2 += (float)(Common_Sin(t2) * 0.002f); + } + + return FMOD_OK; +} + +FMOD_RESULT F_CALL pcmsetposcallback(FMOD_SOUND* /*sound*/, int /*subsound*/, unsigned int /*position*/, FMOD_TIMEUNIT /*postype*/) +{ + /* + This is useful if the user calls Channel::setPosition and you want to seek your data accordingly. + */ + return FMOD_OK; +} + +int FMOD_Main() +{ + FMOD::System *system; + FMOD::Sound *sound; + FMOD::Channel *channel = 0; + FMOD_RESULT result; + FMOD_MODE mode = FMOD_OPENUSER | FMOD_LOOP_NORMAL; + FMOD_CREATESOUNDEXINFO exinfo; + void *extradriverdata = 0; + + Common_Init(&extradriverdata); + + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&system); + ERRCHECK(result); + + result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); + ERRCHECK(result); + + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + mode |= FMOD_CREATESTREAM; + } + + result = system->update(); + ERRCHECK(result); + + Common_Draw("=================================================="); + Common_Draw("User Created Sound Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Sound played here is generated in realtime. It will either play as a stream which means it is continually filled as it is playing, or it will play as a static sample, which means it is filled once as the sound is created, then when played it will just play that short loop of data."); + Common_Draw(""); + Common_Draw("Press %s to play an infinite generated stream", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to play a static looping sample", Common_BtnStr(BTN_ACTION2)); + Common_Draw(""); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_ACTION1) && !Common_BtnPress(BTN_ACTION2) && !Common_BtnPress(BTN_QUIT)); + + /* + Create and play the sound. + */ + memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); + exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); /* Required. */ + exinfo.numchannels = 2; /* Number of channels in the sound. */ + exinfo.defaultfrequency = 44100; /* Default playback rate of sound. */ + exinfo.decodebuffersize = 44100; /* Chunk size of stream update in samples. This will be the amount of data passed to the user callback. */ + 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_PCM16; /* Data format of sound. */ + exinfo.pcmreadcallback = pcmreadcallback; /* User callback for reading. */ + exinfo.pcmsetposcallback = pcmsetposcallback; /* User callback for seeking. */ + + result = system->createSound(0, mode, &exinfo, &sound); + ERRCHECK(result); + + result = system->playSound(sound, 0, 0, &channel); + ERRCHECK(result); + + /* + Main loop. + */ + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + bool paused; + result = channel->getPaused(&paused); + ERRCHECK(result); + result = channel->setPaused(!paused); + ERRCHECK(result); + } + + result = system->update(); + ERRCHECK(result); + + { + unsigned int ms = 0; + unsigned int lenms = 0; + bool playing = false; + bool paused = false; + + if (channel) + { + result = channel->isPlaying(&playing); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + + result = channel->getPaused(&paused); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + + result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + + result = sound->getLength(&lenms, FMOD_TIMEUNIT_MS); + if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) + { + ERRCHECK(result); + } + } + + Common_Draw("=================================================="); + Common_Draw("User Created Sound Example."); + Common_Draw("Copyright (c) Firelight Technologies 2004-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to toggle pause", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); + } + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + /* + Shut down + */ + result = sound->release(); + ERRCHECK(result); + result = system->close(); + ERRCHECK(result); + result = system->release(); + ERRCHECK(result); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.cflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.config b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.creator b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.creator.shared new file mode 100644 index 0000000..afdf648 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f user_created_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/user_created_sound + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.files b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.files new file mode 100644 index 0000000..55f3459 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.files @@ -0,0 +1,514 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h + +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/user_created_sound.makefile +../user_created_sound.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.includes b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.includes new file mode 100644 index 0000000..482bcc4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/examples/user_created_sound/user_created_sound.includes @@ -0,0 +1,6 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.cs b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.cs new file mode 100644 index 0000000..0ab3b03 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.cs @@ -0,0 +1,4064 @@ +/* ======================================================================================== */ +/* FMOD Core API - C# wrapper. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api.html */ +/* ======================================================================================== */ + +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Collections.Generic; + +namespace FMOD +{ + /* + FMOD version number. Check this against FMOD::System::getVersion / System_GetVersion + 0xaaaabbcc -> aaaa = major version number. bb = minor version number. cc = development version number. + */ + public partial class VERSION + { + public const int number = 0x00020307; +#if !UNITY_2021_3_OR_NEWER + public const string dll = "fmod"; +#endif + } + + public class CONSTANTS + { + public const int MAX_CHANNEL_WIDTH = 32; + public const int MAX_LISTENERS = 8; + public const int REVERB_MAXINSTANCES = 4; + public const int MAX_SYSTEMS = 8; + } + + /* + FMOD core types + */ + public enum RESULT : int + { + OK, + ERR_BADCOMMAND, + ERR_CHANNEL_ALLOC, + ERR_CHANNEL_STOLEN, + ERR_DMA, + ERR_DSP_CONNECTION, + ERR_DSP_DONTPROCESS, + ERR_DSP_FORMAT, + ERR_DSP_INUSE, + ERR_DSP_NOTFOUND, + ERR_DSP_RESERVED, + ERR_DSP_SILENCE, + ERR_DSP_TYPE, + ERR_FILE_BAD, + ERR_FILE_COULDNOTSEEK, + ERR_FILE_DISKEJECTED, + ERR_FILE_EOF, + ERR_FILE_ENDOFDATA, + ERR_FILE_NOTFOUND, + ERR_FORMAT, + ERR_HEADER_MISMATCH, + ERR_HTTP, + ERR_HTTP_ACCESS, + ERR_HTTP_PROXY_AUTH, + ERR_HTTP_SERVER_ERROR, + ERR_HTTP_TIMEOUT, + ERR_INITIALIZATION, + ERR_INITIALIZED, + ERR_INTERNAL, + ERR_INVALID_FLOAT, + ERR_INVALID_HANDLE, + ERR_INVALID_PARAM, + ERR_INVALID_POSITION, + ERR_INVALID_SPEAKER, + ERR_INVALID_SYNCPOINT, + ERR_INVALID_THREAD, + ERR_INVALID_VECTOR, + ERR_MAXAUDIBLE, + ERR_MEMORY, + ERR_MEMORY_CANTPOINT, + ERR_NEEDS3D, + ERR_NEEDSHARDWARE, + ERR_NET_CONNECT, + ERR_NET_SOCKET_ERROR, + ERR_NET_URL, + ERR_NET_WOULD_BLOCK, + ERR_NOTREADY, + ERR_OUTPUT_ALLOCATED, + ERR_OUTPUT_CREATEBUFFER, + ERR_OUTPUT_DRIVERCALL, + ERR_OUTPUT_FORMAT, + ERR_OUTPUT_INIT, + ERR_OUTPUT_NODRIVERS, + ERR_PLUGIN, + ERR_PLUGIN_MISSING, + ERR_PLUGIN_RESOURCE, + ERR_PLUGIN_VERSION, + ERR_RECORD, + ERR_REVERB_CHANNELGROUP, + ERR_REVERB_INSTANCE, + ERR_SUBSOUNDS, + ERR_SUBSOUND_ALLOCATED, + ERR_SUBSOUND_CANTMOVE, + ERR_TAGNOTFOUND, + ERR_TOOMANYCHANNELS, + ERR_TRUNCATED, + ERR_UNIMPLEMENTED, + ERR_UNINITIALIZED, + ERR_UNSUPPORTED, + ERR_VERSION, + ERR_EVENT_ALREADY_LOADED, + ERR_EVENT_LIVEUPDATE_BUSY, + ERR_EVENT_LIVEUPDATE_MISMATCH, + ERR_EVENT_LIVEUPDATE_TIMEOUT, + ERR_EVENT_NOTFOUND, + ERR_STUDIO_UNINITIALIZED, + ERR_STUDIO_NOT_LOADED, + ERR_INVALID_STRING, + ERR_ALREADY_LOCKED, + ERR_NOT_LOCKED, + ERR_RECORD_DISCONNECTED, + ERR_TOOMANYSAMPLES, + } + + public enum CHANNELCONTROL_TYPE : int + { + CHANNEL, + CHANNELGROUP, + MAX + } + + [StructLayout(LayoutKind.Sequential)] + public struct VECTOR + { + public float x; + public float y; + public float z; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ATTRIBUTES_3D + { + public VECTOR position; + public VECTOR velocity; + public VECTOR forward; + public VECTOR up; + } + + [StructLayout(LayoutKind.Sequential)] + public partial struct GUID + { + public int Data1; + public int Data2; + public int Data3; + public int Data4; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ASYNCREADINFO + { + public IntPtr handle; + public uint offset; + public uint sizebytes; + public int priority; + + public IntPtr userdata; + public IntPtr buffer; + public uint bytesread; + public FILE_ASYNCDONE_FUNC done; + } + + public enum OUTPUTTYPE : int + { + AUTODETECT, + + UNKNOWN, + NOSOUND, + WAVWRITER, + NOSOUND_NRT, + WAVWRITER_NRT, + + WASAPI, + ASIO, + PULSEAUDIO, + ALSA, + COREAUDIO, + AUDIOTRACK, + OPENSL, + AUDIOOUT, + AUDIO3D, + WEBAUDIO, + NNAUDIO, + WINSONIC, + AAUDIO, + AUDIOWORKLET, + PHASE, + OHAUDIO, + + MAX, + } + + public enum PORT_TYPE : int + { + MUSIC, + COPYRIGHT_MUSIC, + VOICE, + CONTROLLER, + PERSONAL, + VIBRATION, + AUX, + PASSTHROUGH, + VR_VIBRATION, + + MAX + } + + public enum DEBUG_MODE : int + { + TTY, + FILE, + CALLBACK, + } + + [Flags] + public enum DEBUG_FLAGS : uint + { + NONE = 0x00000000, + ERROR = 0x00000001, + WARNING = 0x00000002, + LOG = 0x00000004, + + TYPE_MEMORY = 0x00000100, + TYPE_FILE = 0x00000200, + TYPE_CODEC = 0x00000400, + TYPE_TRACE = 0x00000800, + + DISPLAY_TIMESTAMPS = 0x00010000, + DISPLAY_LINENUMBERS = 0x00020000, + DISPLAY_THREAD = 0x00040000, + } + + [Flags] + public enum MEMORY_TYPE : uint + { + NORMAL = 0x00000000, + STREAM_FILE = 0x00000001, + STREAM_DECODE = 0x00000002, + SAMPLEDATA = 0x00000004, + DSP_BUFFER = 0x00000008, + PLUGIN = 0x00000010, + PERSISTENT = 0x00200000, + ALL = 0xFFFFFFFF + } + + public enum SPEAKERMODE : int + { + DEFAULT, + RAW, + MONO, + STEREO, + QUAD, + SURROUND, + _5POINT1, + _7POINT1, + _7POINT1POINT4, + + MAX, + } + + public enum SPEAKER : int + { + NONE = -1, + FRONT_LEFT, + FRONT_RIGHT, + FRONT_CENTER, + LOW_FREQUENCY, + SURROUND_LEFT, + SURROUND_RIGHT, + BACK_LEFT, + BACK_RIGHT, + TOP_FRONT_LEFT, + TOP_FRONT_RIGHT, + TOP_BACK_LEFT, + TOP_BACK_RIGHT, + + MAX, + } + + [Flags] + public enum CHANNELMASK : uint + { + FRONT_LEFT = 0x00000001, + FRONT_RIGHT = 0x00000002, + FRONT_CENTER = 0x00000004, + LOW_FREQUENCY = 0x00000008, + SURROUND_LEFT = 0x00000010, + SURROUND_RIGHT = 0x00000020, + BACK_LEFT = 0x00000040, + BACK_RIGHT = 0x00000080, + BACK_CENTER = 0x00000100, + + MONO = (FRONT_LEFT), + STEREO = (FRONT_LEFT | FRONT_RIGHT), + LRC = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER), + QUAD = (FRONT_LEFT | FRONT_RIGHT | SURROUND_LEFT | SURROUND_RIGHT), + SURROUND = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT), + _5POINT1 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT), + _5POINT1_REARS = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | BACK_LEFT | BACK_RIGHT), + _7POINT0 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT), + _7POINT1 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT) + } + + public enum CHANNELORDER : int + { + DEFAULT, + WAVEFORMAT, + PROTOOLS, + ALLMONO, + ALLSTEREO, + ALSA, + + MAX, + } + + public enum PLUGINTYPE : int + { + OUTPUT, + CODEC, + DSP, + + MAX, + } + + [StructLayout(LayoutKind.Sequential)] + public struct PLUGINLIST + { + PLUGINTYPE type; + IntPtr description; + } + + [Flags] + public enum INITFLAGS : uint + { + NORMAL = 0x00000000, + STREAM_FROM_UPDATE = 0x00000001, + MIX_FROM_UPDATE = 0x00000002, + _3D_RIGHTHANDED = 0x00000004, + CLIP_OUTPUT = 0x00000008, + CHANNEL_LOWPASS = 0x00000100, + CHANNEL_DISTANCEFILTER = 0x00000200, + PROFILE_ENABLE = 0x00010000, + VOL0_BECOMES_VIRTUAL = 0x00020000, + GEOMETRY_USECLOSEST = 0x00040000, + PREFER_DOLBY_DOWNMIX = 0x00080000, + THREAD_UNSAFE = 0x00100000, + PROFILE_METER_ALL = 0x00200000, + MEMORY_TRACKING = 0x00400000, + } + + public enum SOUND_TYPE : int + { + UNKNOWN, + AIFF, + ASF, + DLS, + FLAC, + FSB, + IT, + MIDI, + MOD, + MPEG, + OGGVORBIS, + PLAYLIST, + RAW, + S3M, + USER, + WAV, + XM, + XMA, + AUDIOQUEUE, + AT9, + VORBIS, + MEDIA_FOUNDATION, + MEDIACODEC, + FADPCM, + OPUS, + + MAX, + } + + public enum SOUND_FORMAT : int + { + NONE, + PCM8, + PCM16, + PCM24, + PCM32, + PCMFLOAT, + BITSTREAM, + + MAX + } + + [Flags] + public enum MODE : uint + { + DEFAULT = 0x00000000, + LOOP_OFF = 0x00000001, + LOOP_NORMAL = 0x00000002, + LOOP_BIDI = 0x00000004, + _2D = 0x00000008, + _3D = 0x00000010, + CREATESTREAM = 0x00000080, + CREATESAMPLE = 0x00000100, + CREATECOMPRESSEDSAMPLE = 0x00000200, + OPENUSER = 0x00000400, + OPENMEMORY = 0x00000800, + OPENMEMORY_POINT = 0x10000000, + OPENRAW = 0x00001000, + OPENONLY = 0x00002000, + ACCURATETIME = 0x00004000, + MPEGSEARCH = 0x00008000, + NONBLOCKING = 0x00010000, + UNIQUE = 0x00020000, + _3D_HEADRELATIVE = 0x00040000, + _3D_WORLDRELATIVE = 0x00080000, + _3D_INVERSEROLLOFF = 0x00100000, + _3D_LINEARROLLOFF = 0x00200000, + _3D_LINEARSQUAREROLLOFF = 0x00400000, + _3D_INVERSETAPEREDROLLOFF = 0x00800000, + _3D_CUSTOMROLLOFF = 0x04000000, + _3D_IGNOREGEOMETRY = 0x40000000, + IGNORETAGS = 0x02000000, + LOWMEM = 0x08000000, + VIRTUAL_PLAYFROMSTART = 0x80000000 + } + + public enum OPENSTATE : int + { + READY = 0, + LOADING, + ERROR, + CONNECTING, + BUFFERING, + SEEKING, + PLAYING, + SETPOSITION, + + MAX, + } + + public enum SOUNDGROUP_BEHAVIOR : int + { + BEHAVIOR_FAIL, + BEHAVIOR_MUTE, + BEHAVIOR_STEALLOWEST, + + MAX, + } + + public enum CHANNELCONTROL_CALLBACK_TYPE : int + { + END, + VIRTUALVOICE, + SYNCPOINT, + OCCLUSION, + + MAX, + } + + public struct CHANNELCONTROL_DSP_INDEX + { + public const int HEAD = -1; + public const int FADER = -2; + public const int TAIL = -3; + } + + public enum ERRORCALLBACK_INSTANCETYPE : int + { + NONE, + SYSTEM, + CHANNEL, + CHANNELGROUP, + CHANNELCONTROL, + SOUND, + SOUNDGROUP, + DSP, + DSPCONNECTION, + GEOMETRY, + REVERB3D, + STUDIO_SYSTEM, + STUDIO_EVENTDESCRIPTION, + STUDIO_EVENTINSTANCE, + STUDIO_PARAMETERINSTANCE, + STUDIO_BUS, + STUDIO_VCA, + STUDIO_BANK, + STUDIO_COMMANDREPLAY + } + + [StructLayout(LayoutKind.Sequential)] + public struct ERRORCALLBACK_INFO + { + public RESULT result; + public ERRORCALLBACK_INSTANCETYPE instancetype; + public IntPtr instance; + public StringWrapper functionname; + public StringWrapper functionparams; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CPU_USAGE + { + public float dsp; /* DSP mixing CPU usage. */ + public float stream; /* Streaming engine CPU usage. */ + public float geometry; /* Geometry engine CPU usage. */ + public float update; /* System::update CPU usage. */ + public float convolution1; /* Convolution reverb processing thread #1 CPU usage */ + public float convolution2; /* Convolution reverb processing thread #2 CPU usage */ + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_DATA_PARAMETER_INFO + { + public IntPtr data; + public uint length; + public int index; + } + + [Flags] + public enum SYSTEM_CALLBACK_TYPE : uint + { + DEVICELISTCHANGED = 0x00000001, + DEVICELOST = 0x00000002, + MEMORYALLOCATIONFAILED = 0x00000004, + THREADCREATED = 0x00000008, + BADDSPCONNECTION = 0x00000010, + PREMIX = 0x00000020, + POSTMIX = 0x00000040, + ERROR = 0x00000080, + THREADDESTROYED = 0x00000100, + PREUPDATE = 0x00000200, + POSTUPDATE = 0x00000400, + RECORDLISTCHANGED = 0x00000800, + BUFFEREDNOMIX = 0x00001000, + DEVICEREINITIALIZE = 0x00002000, + OUTPUTUNDERRUN = 0x00004000, + RECORDPOSITIONCHANGED = 0x00008000, + ALL = 0xFFFFFFFF, + } + + /* + FMOD Callbacks + */ + public delegate RESULT DEBUG_CALLBACK (DEBUG_FLAGS flags, IntPtr file, int line, IntPtr func, IntPtr message); + public delegate RESULT SYSTEM_CALLBACK (IntPtr system, SYSTEM_CALLBACK_TYPE type, IntPtr commanddata1, IntPtr commanddata2, IntPtr userdata); + public delegate RESULT CHANNELCONTROL_CALLBACK (IntPtr channelcontrol, CHANNELCONTROL_TYPE controltype, CHANNELCONTROL_CALLBACK_TYPE callbacktype, IntPtr commanddata1, IntPtr commanddata2); + public delegate RESULT DSP_CALLBACK (IntPtr dsp, DSP_CALLBACK_TYPE type, IntPtr data); + public delegate RESULT SOUND_NONBLOCK_CALLBACK (IntPtr sound, RESULT result); + public delegate RESULT SOUND_PCMREAD_CALLBACK (IntPtr sound, IntPtr data, uint datalen); + public delegate RESULT SOUND_PCMSETPOS_CALLBACK (IntPtr sound, int subsound, uint position, TIMEUNIT postype); + public delegate RESULT FILE_OPEN_CALLBACK (IntPtr name, ref uint filesize, ref IntPtr handle, IntPtr userdata); + public delegate RESULT FILE_CLOSE_CALLBACK (IntPtr handle, IntPtr userdata); + public delegate RESULT FILE_READ_CALLBACK (IntPtr handle, IntPtr buffer, uint sizebytes, ref uint bytesread, IntPtr userdata); + public delegate RESULT FILE_SEEK_CALLBACK (IntPtr handle, uint pos, IntPtr userdata); + public delegate RESULT FILE_ASYNCREAD_CALLBACK (IntPtr info, IntPtr userdata); + public delegate RESULT FILE_ASYNCCANCEL_CALLBACK(IntPtr info, IntPtr userdata); + public delegate void FILE_ASYNCDONE_FUNC (IntPtr info, RESULT result); + public delegate IntPtr MEMORY_ALLOC_CALLBACK (uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate IntPtr MEMORY_REALLOC_CALLBACK (IntPtr ptr, uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate void MEMORY_FREE_CALLBACK (IntPtr ptr, MEMORY_TYPE type, IntPtr sourcestr); + public delegate float CB_3D_ROLLOFF_CALLBACK (IntPtr channelcontrol, float distance); + + public enum DSP_RESAMPLER : int + { + DEFAULT, + NOINTERP, + LINEAR, + CUBIC, + SPLINE, + + MAX, + } + + public enum DSP_CALLBACK_TYPE : int + { + DATAPARAMETERRELEASE, + + MAX, + } + + public enum DSPCONNECTION_TYPE : int + { + STANDARD, + SIDECHAIN, + SEND, + SEND_SIDECHAIN, + + MAX, + } + + public enum TAGTYPE : int + { + UNKNOWN = 0, + ID3V1, + ID3V2, + VORBISCOMMENT, + SHOUTCAST, + ICECAST, + ASF, + MIDI, + PLAYLIST, + FMOD, + USER, + + MAX + } + + public enum TAGDATATYPE : int + { + BINARY = 0, + INT, + FLOAT, + STRING, + STRING_UTF16, + STRING_UTF16BE, + STRING_UTF8, + + MAX + } + + [StructLayout(LayoutKind.Sequential)] + public struct TAG + { + public TAGTYPE type; + public TAGDATATYPE datatype; + public StringWrapper name; + public IntPtr data; + public uint datalen; + public bool updated; + } + + [Flags] + public enum TIMEUNIT : uint + { + MS = 0x00000001, + PCM = 0x00000002, + PCMBYTES = 0x00000004, + RAWBYTES = 0x00000008, + PCMFRACTION = 0x00000010, + MODORDER = 0x00000100, + MODROW = 0x00000200, + MODPATTERN = 0x00000400, + } + + public struct PORT_INDEX + { + public const ulong NONE = 0xFFFFFFFFFFFFFFFF; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CREATESOUNDEXINFO + { + public int cbsize; + public uint length; + public uint fileoffset; + public int numchannels; + public int defaultfrequency; + public SOUND_FORMAT format; + public uint decodebuffersize; + public int initialsubsound; + public int numsubsounds; + public IntPtr inclusionlist; + public int inclusionlistnum; + public IntPtr pcmreadcallback_internal; + public IntPtr pcmsetposcallback_internal; + public IntPtr nonblockcallback_internal; + public IntPtr dlsname; + public IntPtr encryptionkey; + public int maxpolyphony; + public IntPtr userdata; + public SOUND_TYPE suggestedsoundtype; + public IntPtr fileuseropen_internal; + public IntPtr fileuserclose_internal; + public IntPtr fileuserread_internal; + public IntPtr fileuserseek_internal; + public IntPtr fileuserasyncread_internal; + public IntPtr fileuserasynccancel_internal; + public IntPtr fileuserdata; + public int filebuffersize; + public CHANNELORDER channelorder; + public IntPtr initialsoundgroup; + public uint initialseekposition; + public TIMEUNIT initialseekpostype; + public int ignoresetfilesystem; + public uint audioqueuepolicy; + public uint minmidigranularity; + public int nonblockthreadid; + public IntPtr fsbguid; + + public SOUND_PCMREAD_CALLBACK pcmreadcallback + { + set { pcmreadcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return pcmreadcallback_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(pcmreadcallback_internal); } + } + public SOUND_PCMSETPOS_CALLBACK pcmsetposcallback + { + set { pcmsetposcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return pcmsetposcallback_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(pcmsetposcallback_internal); } + } + public SOUND_NONBLOCK_CALLBACK nonblockcallback + { + set { nonblockcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return nonblockcallback_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(nonblockcallback_internal); } + } + public FILE_OPEN_CALLBACK fileuseropen + { + set { fileuseropen_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuseropen_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(fileuseropen_internal); } + } + public FILE_CLOSE_CALLBACK fileuserclose + { + set { fileuserclose_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserclose_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(fileuserclose_internal); } + } + public FILE_READ_CALLBACK fileuserread + { + set { fileuserread_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserread_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(fileuserread_internal); } + } + public FILE_SEEK_CALLBACK fileuserseek + { + set { fileuserseek_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserseek_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(fileuserseek_internal); } + } + public FILE_ASYNCREAD_CALLBACK fileuserasyncread + { + set { fileuserasyncread_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserasyncread_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(fileuserasyncread_internal); } + } + public FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel + { + set { fileuserasynccancel_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserasynccancel_internal == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(fileuserasynccancel_internal); } + } + + } + +#pragma warning disable 414 + [StructLayout(LayoutKind.Sequential)] + public struct REVERB_PROPERTIES + { + public float DecayTime; + public float EarlyDelay; + public float LateDelay; + public float HFReference; + public float HFDecayRatio; + public float Diffusion; + public float Density; + public float LowShelfFrequency; + public float LowShelfGain; + public float HighCut; + public float EarlyLateMix; + public float WetLevel; + + #region wrapperinternal + public REVERB_PROPERTIES(float decayTime, float earlyDelay, float lateDelay, float hfReference, + float hfDecayRatio, float diffusion, float density, float lowShelfFrequency, float lowShelfGain, + float highCut, float earlyLateMix, float wetLevel) + { + DecayTime = decayTime; + EarlyDelay = earlyDelay; + LateDelay = lateDelay; + HFReference = hfReference; + HFDecayRatio = hfDecayRatio; + Diffusion = diffusion; + Density = density; + LowShelfFrequency = lowShelfFrequency; + LowShelfGain = lowShelfGain; + HighCut = highCut; + EarlyLateMix = earlyLateMix; + WetLevel = wetLevel; + } + #endregion + } +#pragma warning restore 414 + + public class PRESET + { + public static REVERB_PROPERTIES OFF() { return new REVERB_PROPERTIES( 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f );} + public static REVERB_PROPERTIES GENERIC() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f );} + public static REVERB_PROPERTIES PADDEDCELL() { return new REVERB_PROPERTIES( 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f );} + public static REVERB_PROPERTIES ROOM() { return new REVERB_PROPERTIES( 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f );} + public static REVERB_PROPERTIES BATHROOM() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f );} + public static REVERB_PROPERTIES LIVINGROOM() { return new REVERB_PROPERTIES( 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f );} + public static REVERB_PROPERTIES STONEROOM() { return new REVERB_PROPERTIES( 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f );} + public static REVERB_PROPERTIES AUDITORIUM() { return new REVERB_PROPERTIES( 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f );} + public static REVERB_PROPERTIES CONCERTHALL() { return new REVERB_PROPERTIES( 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f );} + public static REVERB_PROPERTIES CAVE() { return new REVERB_PROPERTIES( 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f );} + public static REVERB_PROPERTIES ARENA() { return new REVERB_PROPERTIES( 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f );} + public static REVERB_PROPERTIES HANGAR() { return new REVERB_PROPERTIES( 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f );} + public static REVERB_PROPERTIES CARPETTEDHALLWAY() { return new REVERB_PROPERTIES( 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f );} + public static REVERB_PROPERTIES HALLWAY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f );} + public static REVERB_PROPERTIES STONECORRIDOR() { return new REVERB_PROPERTIES( 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f );} + public static REVERB_PROPERTIES ALLEY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f );} + public static REVERB_PROPERTIES FOREST() { return new REVERB_PROPERTIES( 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f );} + public static REVERB_PROPERTIES CITY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f );} + public static REVERB_PROPERTIES MOUNTAINS() { return new REVERB_PROPERTIES( 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f );} + public static REVERB_PROPERTIES QUARRY() { return new REVERB_PROPERTIES( 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f );} + public static REVERB_PROPERTIES PLAIN() { return new REVERB_PROPERTIES( 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f );} + public static REVERB_PROPERTIES PARKINGLOT() { return new REVERB_PROPERTIES( 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f );} + public static REVERB_PROPERTIES SEWERPIPE() { return new REVERB_PROPERTIES( 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f );} + public static REVERB_PROPERTIES UNDERWATER() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f );} + } + + [StructLayout(LayoutKind.Sequential)] + public struct ADVANCEDSETTINGS + { + public int cbSize; + public int maxMPEGCodecs; + public int maxADPCMCodecs; + public int maxXMACodecs; + public int maxVorbisCodecs; + public int maxAT9Codecs; + public int maxFADPCMCodecs; + public int maxOpusCodecs; + public int ASIONumChannels; + public IntPtr ASIOChannelList; + public IntPtr ASIOSpeakerList; + public float vol0virtualvol; + public uint defaultDecodeBufferSize; + public ushort profilePort; + public uint geometryMaxFadeTime; + public float distanceFilterCenterFreq; + public int reverb3Dinstance; + public int DSPBufferPoolSize; + public DSP_RESAMPLER resamplerMethod; + public uint randomSeed; + public int maxConvolutionThreads; + public int maxSpatialObjects; + } + + [Flags] + public enum DRIVER_STATE : uint + { + CONNECTED = 0x00000001, + DEFAULT = 0x00000002, + } + + public enum THREAD_PRIORITY : int + { + /* Platform specific priority range */ + PLATFORM_MIN = -32 * 1024, + PLATFORM_MAX = 32 * 1024, + + /* Platform agnostic priorities, maps internally to platform specific value */ + DEFAULT = PLATFORM_MIN - 1, + LOW = PLATFORM_MIN - 2, + MEDIUM = PLATFORM_MIN - 3, + HIGH = PLATFORM_MIN - 4, + VERY_HIGH = PLATFORM_MIN - 5, + EXTREME = PLATFORM_MIN - 6, + CRITICAL = PLATFORM_MIN - 7, + + /* Thread defaults */ + MIXER = EXTREME, + FEEDER = CRITICAL, + STREAM = VERY_HIGH, + FILE = HIGH, + NONBLOCKING = HIGH, + RECORD = HIGH, + GEOMETRY = LOW, + PROFILER = MEDIUM, + STUDIO_UPDATE = MEDIUM, + STUDIO_LOAD_BANK = MEDIUM, + STUDIO_LOAD_SAMPLE = MEDIUM, + CONVOLUTION1 = VERY_HIGH, + CONVOLUTION2 = VERY_HIGH + + } + + public enum THREAD_STACK_SIZE : uint + { + DEFAULT = 0, + MIXER = 80 * 1024, + FEEDER = 16 * 1024, + STREAM = 96 * 1024, + FILE = 64 * 1024, + NONBLOCKING = 112 * 1024, + RECORD = 16 * 1024, + GEOMETRY = 48 * 1024, + PROFILER = 128 * 1024, + STUDIO_UPDATE = 96 * 1024, + STUDIO_LOAD_BANK = 96 * 1024, + STUDIO_LOAD_SAMPLE = 96 * 1024, + CONVOLUTION1 = 16 * 1024, + CONVOLUTION2 = 16 * 1024 + } + + [Flags] + public enum THREAD_AFFINITY : long + { + /* Platform agnostic thread groupings */ + GROUP_DEFAULT = 0x4000000000000000, + GROUP_A = 0x4000000000000001, + GROUP_B = 0x4000000000000002, + GROUP_C = 0x4000000000000003, + + /* Thread defaults */ + MIXER = GROUP_A, + FEEDER = GROUP_C, + STREAM = GROUP_C, + FILE = GROUP_C, + NONBLOCKING = GROUP_C, + RECORD = GROUP_C, + GEOMETRY = GROUP_C, + PROFILER = GROUP_C, + STUDIO_UPDATE = GROUP_B, + STUDIO_LOAD_BANK = GROUP_C, + STUDIO_LOAD_SAMPLE = GROUP_C, + CONVOLUTION1 = GROUP_C, + CONVOLUTION2 = GROUP_C, + + /* Core mask, valid up to 1 << 61 */ + CORE_ALL = 0, + CORE_0 = 1 << 0, + CORE_1 = 1 << 1, + CORE_2 = 1 << 2, + CORE_3 = 1 << 3, + CORE_4 = 1 << 4, + CORE_5 = 1 << 5, + CORE_6 = 1 << 6, + CORE_7 = 1 << 7, + CORE_8 = 1 << 8, + CORE_9 = 1 << 9, + CORE_10 = 1 << 10, + CORE_11 = 1 << 11, + CORE_12 = 1 << 12, + CORE_13 = 1 << 13, + CORE_14 = 1 << 14, + CORE_15 = 1 << 15 + } + + public enum THREAD_TYPE : int + { + MIXER, + FEEDER, + STREAM, + FILE, + NONBLOCKING, + RECORD, + GEOMETRY, + PROFILER, + STUDIO_UPDATE, + STUDIO_LOAD_BANK, + STUDIO_LOAD_SAMPLE, + CONVOLUTION1, + CONVOLUTION2, + + MAX + } + + /* + FMOD System factory functions. Use this to create an FMOD System Instance. below you will see System init/close to get started. + */ + public struct Factory + { + public static RESULT System_Create(out System system) + { + return FMOD5_System_Create(out system.handle, VERSION.number); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Create(out IntPtr system, uint headerversion); + + #endregion + } + + /* + FMOD global system functions (optional). + */ + public struct Memory + { + public static RESULT Initialize(IntPtr poolmem, int poollen, MEMORY_ALLOC_CALLBACK useralloc, MEMORY_REALLOC_CALLBACK userrealloc, MEMORY_FREE_CALLBACK userfree, MEMORY_TYPE memtypeflags = MEMORY_TYPE.ALL) + { + return FMOD5_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); + } + + public static RESULT GetStats(out int currentalloced, out int maxalloced, bool blocking = true) + { + return FMOD5_Memory_GetStats(out currentalloced, out maxalloced, blocking); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Memory_Initialize(IntPtr poolmem, int poollen, MEMORY_ALLOC_CALLBACK useralloc, MEMORY_REALLOC_CALLBACK userrealloc, MEMORY_FREE_CALLBACK userfree, MEMORY_TYPE memtypeflags); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Memory_GetStats (out int currentalloced, out int maxalloced, bool blocking); + + #endregion + } + + public struct Debug + { + public static RESULT Initialize(DEBUG_FLAGS flags, DEBUG_MODE mode = DEBUG_MODE.TTY, DEBUG_CALLBACK callback = null, string filename = null) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_Debug_Initialize(flags, mode, callback, encoder.byteFromStringUTF8(filename)); + } + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Debug_Initialize(DEBUG_FLAGS flags, DEBUG_MODE mode, DEBUG_CALLBACK callback, byte[] filename); + + #endregion + } + + public struct Thread + { + public static RESULT SetAttributes(THREAD_TYPE type, THREAD_AFFINITY affinity = THREAD_AFFINITY.GROUP_DEFAULT, THREAD_PRIORITY priority = THREAD_PRIORITY.DEFAULT, THREAD_STACK_SIZE stacksize = THREAD_STACK_SIZE.DEFAULT) + { + return FMOD5_Thread_SetAttributes(type, affinity, priority, stacksize); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Thread_SetAttributes(THREAD_TYPE type, THREAD_AFFINITY affinity, THREAD_PRIORITY priority, THREAD_STACK_SIZE stacksize); + #endregion + } + + /* + 'System' API. + */ + public struct System + { + public RESULT release() + { + return FMOD5_System_Release(this.handle); + } + + // Setup functions. + public RESULT setOutput(OUTPUTTYPE output) + { + return FMOD5_System_SetOutput(this.handle, output); + } + public RESULT getOutput(out OUTPUTTYPE output) + { + return FMOD5_System_GetOutput(this.handle, out output); + } + public RESULT getNumDrivers(out int numdrivers) + { + return FMOD5_System_GetNumDrivers(this.handle, out numdrivers); + } + public RESULT getDriverInfo(int id, out string name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_System_GetDriverInfo(this.handle, id, stringMem, namelen, out guid, out systemrate, out speakermode, out speakermodechannels); + using (StringHelper.ThreadSafeEncoding encoding = StringHelper.GetFreeHelper()) + { + name = encoding.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getDriverInfo(int id, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels) + { + return FMOD5_System_GetDriverInfo(this.handle, id, IntPtr.Zero, 0, out guid, out systemrate, out speakermode, out speakermodechannels); + } + public RESULT setDriver(int driver) + { + return FMOD5_System_SetDriver(this.handle, driver); + } + public RESULT getDriver(out int driver) + { + return FMOD5_System_GetDriver(this.handle, out driver); + } + public RESULT setSoftwareChannels(int numsoftwarechannels) + { + return FMOD5_System_SetSoftwareChannels(this.handle, numsoftwarechannels); + } + public RESULT getSoftwareChannels(out int numsoftwarechannels) + { + return FMOD5_System_GetSoftwareChannels(this.handle, out numsoftwarechannels); + } + public RESULT setSoftwareFormat(int samplerate, SPEAKERMODE speakermode, int numrawspeakers) + { + return FMOD5_System_SetSoftwareFormat(this.handle, samplerate, speakermode, numrawspeakers); + } + public RESULT getSoftwareFormat(out int samplerate, out SPEAKERMODE speakermode, out int numrawspeakers) + { + return FMOD5_System_GetSoftwareFormat(this.handle, out samplerate, out speakermode, out numrawspeakers); + } + public RESULT setDSPBufferSize(uint bufferlength, int numbuffers) + { + return FMOD5_System_SetDSPBufferSize(this.handle, bufferlength, numbuffers); + } + public RESULT getDSPBufferSize(out uint bufferlength, out int numbuffers) + { + return FMOD5_System_GetDSPBufferSize(this.handle, out bufferlength, out numbuffers); + } + public RESULT setFileSystem(FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek, FILE_ASYNCREAD_CALLBACK userasyncread, FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign) + { + return FMOD5_System_SetFileSystem(this.handle, useropen, userclose, userread, userseek, userasyncread, userasynccancel, blockalign); + } + public RESULT attachFileSystem(FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek) + { + return FMOD5_System_AttachFileSystem(this.handle, useropen, userclose, userread, userseek); + } + public RESULT setAdvancedSettings(ref ADVANCEDSETTINGS settings) + { + settings.cbSize = Marshal.SizeOf(); + return FMOD5_System_SetAdvancedSettings(this.handle, ref settings); + } + public RESULT getAdvancedSettings(ref ADVANCEDSETTINGS settings) + { + settings.cbSize = Marshal.SizeOf(); + return FMOD5_System_GetAdvancedSettings(this.handle, ref settings); + } + public RESULT setCallback(SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL) + { + return FMOD5_System_SetCallback(this.handle, callback, callbackmask); + } + + // Plug-in support. + public RESULT setPluginPath(string path) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_SetPluginPath(this.handle, encoder.byteFromStringUTF8(path)); + } + } + public RESULT loadPlugin(string filename, out uint handle, uint priority = 0) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_LoadPlugin(this.handle, encoder.byteFromStringUTF8(filename), out handle, priority); + } + } + public RESULT unloadPlugin(uint handle) + { + return FMOD5_System_UnloadPlugin(this.handle, handle); + } + public RESULT getNumNestedPlugins(uint handle, out int count) + { + return FMOD5_System_GetNumNestedPlugins(this.handle, handle, out count); + } + public RESULT getNestedPlugin(uint handle, int index, out uint nestedhandle) + { + return FMOD5_System_GetNestedPlugin(this.handle, handle, index, out nestedhandle); + } + public RESULT getNumPlugins(PLUGINTYPE plugintype, out int numplugins) + { + return FMOD5_System_GetNumPlugins(this.handle, plugintype, out numplugins); + } + public RESULT getPluginHandle(PLUGINTYPE plugintype, int index, out uint handle) + { + return FMOD5_System_GetPluginHandle(this.handle, plugintype, index, out handle); + } + public RESULT getPluginInfo(uint handle, out PLUGINTYPE plugintype, out string name, int namelen, out uint version) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_System_GetPluginInfo(this.handle, handle, out plugintype, stringMem, namelen, out version); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getPluginInfo(uint handle, out PLUGINTYPE plugintype, out uint version) + { + return FMOD5_System_GetPluginInfo(this.handle, handle, out plugintype, IntPtr.Zero, 0, out version); + } + public RESULT setOutputByPlugin(uint handle) + { + return FMOD5_System_SetOutputByPlugin(this.handle, handle); + } + public RESULT getOutputByPlugin(out uint handle) + { + return FMOD5_System_GetOutputByPlugin(this.handle, out handle); + } + public RESULT createDSPByPlugin(uint handle, out DSP dsp) + { + return FMOD5_System_CreateDSPByPlugin(this.handle, handle, out dsp.handle); + } + public RESULT getDSPInfoByPlugin(uint handle, out IntPtr description) + { + return FMOD5_System_GetDSPInfoByPlugin(this.handle, handle, out description); + } + public RESULT registerDSP(ref DSP_DESCRIPTION description, out uint handle) + { + return FMOD5_System_RegisterDSP(this.handle, ref description, out handle); + } + + // Init/Close. + public RESULT init(int maxchannels, INITFLAGS flags, IntPtr extradriverdata) + { + return FMOD5_System_Init(this.handle, maxchannels, flags, extradriverdata); + } + public RESULT close() + { + return FMOD5_System_Close(this.handle); + } + + // General post-init system functions. + public RESULT update() + { + return FMOD5_System_Update(this.handle); + } + public RESULT setSpeakerPosition(SPEAKER speaker, float x, float y, bool active) + { + return FMOD5_System_SetSpeakerPosition(this.handle, speaker, x, y, active); + } + public RESULT getSpeakerPosition(SPEAKER speaker, out float x, out float y, out bool active) + { + return FMOD5_System_GetSpeakerPosition(this.handle, speaker, out x, out y, out active); + } + public RESULT setStreamBufferSize(uint filebuffersize, TIMEUNIT filebuffersizetype) + { + return FMOD5_System_SetStreamBufferSize(this.handle, filebuffersize, filebuffersizetype); + } + public RESULT getStreamBufferSize(out uint filebuffersize, out TIMEUNIT filebuffersizetype) + { + return FMOD5_System_GetStreamBufferSize(this.handle, out filebuffersize, out filebuffersizetype); + } + public RESULT set3DSettings(float dopplerscale, float distancefactor, float rolloffscale) + { + return FMOD5_System_Set3DSettings(this.handle, dopplerscale, distancefactor, rolloffscale); + } + public RESULT get3DSettings(out float dopplerscale, out float distancefactor, out float rolloffscale) + { + return FMOD5_System_Get3DSettings(this.handle, out dopplerscale, out distancefactor, out rolloffscale); + } + public RESULT set3DNumListeners(int numlisteners) + { + return FMOD5_System_Set3DNumListeners(this.handle, numlisteners); + } + public RESULT get3DNumListeners(out int numlisteners) + { + return FMOD5_System_Get3DNumListeners(this.handle, out numlisteners); + } + public RESULT set3DListenerAttributes(int listener, ref VECTOR pos, ref VECTOR vel, ref VECTOR forward, ref VECTOR up) + { + return FMOD5_System_Set3DListenerAttributes(this.handle, listener, ref pos, ref vel, ref forward, ref up); + } + public RESULT get3DListenerAttributes(int listener, out VECTOR pos, out VECTOR vel, out VECTOR forward, out VECTOR up) + { + return FMOD5_System_Get3DListenerAttributes(this.handle, listener, out pos, out vel, out forward, out up); + } + public RESULT set3DRolloffCallback(CB_3D_ROLLOFF_CALLBACK callback) + { + return FMOD5_System_Set3DRolloffCallback(this.handle, callback); + } + public RESULT mixerSuspend() + { + return FMOD5_System_MixerSuspend(this.handle); + } + public RESULT mixerResume() + { + return FMOD5_System_MixerResume(this.handle); + } + public RESULT getDefaultMixMatrix(SPEAKERMODE sourcespeakermode, SPEAKERMODE targetspeakermode, float[] matrix, int matrixhop) + { + return FMOD5_System_GetDefaultMixMatrix(this.handle, sourcespeakermode, targetspeakermode, matrix, matrixhop); + } + public RESULT getSpeakerModeChannels(SPEAKERMODE mode, out int channels) + { + return FMOD5_System_GetSpeakerModeChannels(this.handle, mode, out channels); + } + + // System information functions. + public RESULT getVersion(out uint version) + { + uint buildnumber; + return getVersion(out version, out buildnumber); + } + public RESULT getVersion(out uint version, out uint buildnumber) + { + return FMOD5_System_GetVersion(this.handle, out version, out buildnumber); + } + public RESULT getOutputHandle(out IntPtr handle) + { + return FMOD5_System_GetOutputHandle(this.handle, out handle); + } + public RESULT getChannelsPlaying(out int channels) + { + return FMOD5_System_GetChannelsPlaying(this.handle, out channels, IntPtr.Zero); + } + public RESULT getChannelsPlaying(out int channels, out int realchannels) + { + return FMOD5_System_GetChannelsPlaying(this.handle, out channels, out realchannels); + } + public RESULT getCPUUsage(out CPU_USAGE usage) + { + return FMOD5_System_GetCPUUsage(this.handle, out usage); + } + public RESULT getFileUsage(out Int64 sampleBytesRead, out Int64 streamBytesRead, out Int64 otherBytesRead) + { + return FMOD5_System_GetFileUsage(this.handle, out sampleBytesRead, out streamBytesRead, out otherBytesRead); + } + + // Sound/DSP/Channel/FX creation and retrieval. + public RESULT createSound(string name, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateSound(this.handle, encoder.byteFromStringUTF8(name), mode, ref exinfo, out sound.handle); + } + } + public RESULT createSound(byte[] data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateSound(this.handle, data, mode, ref exinfo, out sound.handle); + } + public RESULT createSound(IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateSound(this.handle, name_or_data, mode, ref exinfo, out sound.handle); + } + public RESULT createSound(string name, MODE mode, out Sound sound) + { + CREATESOUNDEXINFO exinfo = new CREATESOUNDEXINFO(); + exinfo.cbsize = Marshal.SizeOf(); + + return createSound(name, mode, ref exinfo, out sound); + } + public RESULT createStream(string name, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateStream(this.handle, encoder.byteFromStringUTF8(name), mode, ref exinfo, out sound.handle); + } + } + public RESULT createStream(byte[] data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateStream(this.handle, data, mode, ref exinfo, out sound.handle); + } + public RESULT createStream(IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateStream(this.handle, name_or_data, mode, ref exinfo, out sound.handle); + } + public RESULT createStream(string name, MODE mode, out Sound sound) + { + CREATESOUNDEXINFO exinfo = new CREATESOUNDEXINFO(); + exinfo.cbsize = Marshal.SizeOf(); + + return createStream(name, mode, ref exinfo, out sound); + } + public RESULT createDSP(ref DSP_DESCRIPTION description, out DSP dsp) + { + return FMOD5_System_CreateDSP(this.handle, ref description, out dsp.handle); + } + public RESULT createDSPByType(DSP_TYPE type, out DSP dsp) + { + return FMOD5_System_CreateDSPByType(this.handle, type, out dsp.handle); + } + public RESULT createChannelGroup(string name, out ChannelGroup channelgroup) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateChannelGroup(this.handle, encoder.byteFromStringUTF8(name), out channelgroup.handle); + } + } + public RESULT createSoundGroup(string name, out SoundGroup soundgroup) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateSoundGroup(this.handle, encoder.byteFromStringUTF8(name), out soundgroup.handle); + } + } + public RESULT createReverb3D(out Reverb3D reverb) + { + return FMOD5_System_CreateReverb3D(this.handle, out reverb.handle); + } + public RESULT playSound(Sound sound, ChannelGroup channelgroup, bool paused, out Channel channel) + { + return FMOD5_System_PlaySound(this.handle, sound.handle, channelgroup.handle, paused, out channel.handle); + } + public RESULT playDSP(DSP dsp, ChannelGroup channelgroup, bool paused, out Channel channel) + { + return FMOD5_System_PlayDSP(this.handle, dsp.handle, channelgroup.handle, paused, out channel.handle); + } + public RESULT getChannel(int channelid, out Channel channel) + { + return FMOD5_System_GetChannel(this.handle, channelid, out channel.handle); + } + public RESULT getDSPInfoByType(DSP_TYPE type, out IntPtr description) + { + return FMOD5_System_GetDSPInfoByType(this.handle, type, out description); + } + public RESULT getMasterChannelGroup(out ChannelGroup channelgroup) + { + return FMOD5_System_GetMasterChannelGroup(this.handle, out channelgroup.handle); + } + public RESULT getMasterSoundGroup(out SoundGroup soundgroup) + { + return FMOD5_System_GetMasterSoundGroup(this.handle, out soundgroup.handle); + } + + // Routing to ports. + public RESULT attachChannelGroupToPort(PORT_TYPE portType, ulong portIndex, ChannelGroup channelgroup, bool passThru = false) + { + return FMOD5_System_AttachChannelGroupToPort(this.handle, portType, portIndex, channelgroup.handle, passThru); + } + public RESULT detachChannelGroupFromPort(ChannelGroup channelgroup) + { + return FMOD5_System_DetachChannelGroupFromPort(this.handle, channelgroup.handle); + } + + // Reverb api. + public RESULT setReverbProperties(int instance, ref REVERB_PROPERTIES prop) + { + return FMOD5_System_SetReverbProperties(this.handle, instance, ref prop); + } + public RESULT getReverbProperties(int instance, out REVERB_PROPERTIES prop) + { + return FMOD5_System_GetReverbProperties(this.handle, instance, out prop); + } + + // System level DSP functionality. + public RESULT lockDSP() + { + return FMOD5_System_LockDSP(this.handle); + } + public RESULT unlockDSP() + { + return FMOD5_System_UnlockDSP(this.handle); + } + + // Recording api + public RESULT getRecordNumDrivers(out int numdrivers, out int numconnected) + { + return FMOD5_System_GetRecordNumDrivers(this.handle, out numdrivers, out numconnected); + } + public RESULT getRecordDriverInfo(int id, out string name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_System_GetRecordDriverInfo(this.handle, id, stringMem, namelen, out guid, out systemrate, out speakermode, out speakermodechannels, out state); + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getRecordDriverInfo(int id, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state) + { + return FMOD5_System_GetRecordDriverInfo(this.handle, id, IntPtr.Zero, 0, out guid, out systemrate, out speakermode, out speakermodechannels, out state); + } + public RESULT getRecordPosition(int id, out uint position) + { + return FMOD5_System_GetRecordPosition(this.handle, id, out position); + } + public RESULT recordStart(int id, Sound sound, bool loop) + { + return FMOD5_System_RecordStart(this.handle, id, sound.handle, loop); + } + public RESULT recordStop(int id) + { + return FMOD5_System_RecordStop(this.handle, id); + } + public RESULT isRecording(int id, out bool recording) + { + return FMOD5_System_IsRecording(this.handle, id, out recording); + } + + // Geometry api + public RESULT createGeometry(int maxpolygons, int maxvertices, out Geometry geometry) + { + return FMOD5_System_CreateGeometry(this.handle, maxpolygons, maxvertices, out geometry.handle); + } + public RESULT setGeometrySettings(float maxworldsize) + { + return FMOD5_System_SetGeometrySettings(this.handle, maxworldsize); + } + public RESULT getGeometrySettings(out float maxworldsize) + { + return FMOD5_System_GetGeometrySettings(this.handle, out maxworldsize); + } + public RESULT loadGeometry(IntPtr data, int datasize, out Geometry geometry) + { + return FMOD5_System_LoadGeometry(this.handle, data, datasize, out geometry.handle); + } + public RESULT getGeometryOcclusion(ref VECTOR listener, ref VECTOR source, out float direct, out float reverb) + { + return FMOD5_System_GetGeometryOcclusion(this.handle, ref listener, ref source, out direct, out reverb); + } + + // Network functions + public RESULT setNetworkProxy(string proxy) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_SetNetworkProxy(this.handle, encoder.byteFromStringUTF8(proxy)); + } + } + public RESULT getNetworkProxy(out string proxy, int proxylen) + { + IntPtr stringMem = Marshal.AllocHGlobal(proxylen); + + RESULT result = FMOD5_System_GetNetworkProxy(this.handle, stringMem, proxylen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + proxy = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT setNetworkTimeout(int timeout) + { + return FMOD5_System_SetNetworkTimeout(this.handle, timeout); + } + public RESULT getNetworkTimeout(out int timeout) + { + return FMOD5_System_GetNetworkTimeout(this.handle, out timeout); + } + + // Userdata set/get + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_System_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_System_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Release (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetOutput (IntPtr system, OUTPUTTYPE output); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetOutput (IntPtr system, out OUTPUTTYPE output); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNumDrivers (IntPtr system, out int numdrivers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDriverInfo (IntPtr system, int id, IntPtr name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetDriver (IntPtr system, int driver); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDriver (IntPtr system, out int driver); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetSoftwareChannels (IntPtr system, int numsoftwarechannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSoftwareChannels (IntPtr system, out int numsoftwarechannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetSoftwareFormat (IntPtr system, int samplerate, SPEAKERMODE speakermode, int numrawspeakers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSoftwareFormat (IntPtr system, out int samplerate, out SPEAKERMODE speakermode, out int numrawspeakers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetDSPBufferSize (IntPtr system, uint bufferlength, int numbuffers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDSPBufferSize (IntPtr system, out uint bufferlength, out int numbuffers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetFileSystem (IntPtr system, FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek, FILE_ASYNCREAD_CALLBACK userasyncread, FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_AttachFileSystem (IntPtr system, FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetCallback (IntPtr system, SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetPluginPath (IntPtr system, byte[] path); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_LoadPlugin (IntPtr system, byte[] filename, out uint handle, uint priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_UnloadPlugin (IntPtr system, uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNumNestedPlugins (IntPtr system, uint handle, out int count); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNestedPlugin (IntPtr system, uint handle, int index, out uint nestedhandle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNumPlugins (IntPtr system, PLUGINTYPE plugintype, out int numplugins); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetPluginHandle (IntPtr system, PLUGINTYPE plugintype, int index, out uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetPluginInfo (IntPtr system, uint handle, out PLUGINTYPE plugintype, IntPtr name, int namelen, out uint version); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetOutputByPlugin (IntPtr system, uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetOutputByPlugin (IntPtr system, out uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateDSPByPlugin (IntPtr system, uint handle, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDSPInfoByPlugin (IntPtr system, uint handle, out IntPtr description); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_RegisterDSP (IntPtr system, ref DSP_DESCRIPTION description, out uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Init (IntPtr system, int maxchannels, INITFLAGS flags, IntPtr extradriverdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Close (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Update (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetSpeakerPosition (IntPtr system, SPEAKER speaker, float x, float y, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSpeakerPosition (IntPtr system, SPEAKER speaker, out float x, out float y, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetStreamBufferSize (IntPtr system, uint filebuffersize, TIMEUNIT filebuffersizetype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetStreamBufferSize (IntPtr system, out uint filebuffersize, out TIMEUNIT filebuffersizetype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DSettings (IntPtr system, float dopplerscale, float distancefactor, float rolloffscale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Get3DSettings (IntPtr system, out float dopplerscale, out float distancefactor, out float rolloffscale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DNumListeners (IntPtr system, int numlisteners); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Get3DNumListeners (IntPtr system, out int numlisteners); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DListenerAttributes (IntPtr system, int listener, ref VECTOR pos, ref VECTOR vel, ref VECTOR forward, ref VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Get3DListenerAttributes (IntPtr system, int listener, out VECTOR pos, out VECTOR vel, out VECTOR forward, out VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DRolloffCallback (IntPtr system, CB_3D_ROLLOFF_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_MixerSuspend (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_MixerResume (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDefaultMixMatrix (IntPtr system, SPEAKERMODE sourcespeakermode, SPEAKERMODE targetspeakermode, float[] matrix, int matrixhop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSpeakerModeChannels (IntPtr system, SPEAKERMODE mode, out int channels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetVersion (IntPtr system, out uint version, out uint buildnumber); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetOutputHandle (IntPtr system, out IntPtr handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetChannelsPlaying (IntPtr system, out int channels, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetChannelsPlaying (IntPtr system, out int channels, out int realchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetCPUUsage (IntPtr system, out CPU_USAGE usage); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetFileUsage (IntPtr system, out Int64 sampleBytesRead, out Int64 streamBytesRead, out Int64 otherBytesRead); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateSound (IntPtr system, byte[] name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateSound (IntPtr system, IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateStream (IntPtr system, byte[] name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateStream (IntPtr system, IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateDSP (IntPtr system, ref DSP_DESCRIPTION description, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateDSPByType (IntPtr system, DSP_TYPE type, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateChannelGroup (IntPtr system, byte[] name, out IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateSoundGroup (IntPtr system, byte[] name, out IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateReverb3D (IntPtr system, out IntPtr reverb); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_PlaySound (IntPtr system, IntPtr sound, IntPtr channelgroup, bool paused, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_PlayDSP (IntPtr system, IntPtr dsp, IntPtr channelgroup, bool paused, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetChannel (IntPtr system, int channelid, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDSPInfoByType (IntPtr system, DSP_TYPE type, out IntPtr description); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetMasterChannelGroup (IntPtr system, out IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetMasterSoundGroup (IntPtr system, out IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_AttachChannelGroupToPort (IntPtr system, PORT_TYPE portType, ulong portIndex, IntPtr channelgroup, bool passThru); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_DetachChannelGroupFromPort(IntPtr system, IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetReverbProperties (IntPtr system, int instance, ref REVERB_PROPERTIES prop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetReverbProperties (IntPtr system, int instance, out REVERB_PROPERTIES prop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_LockDSP (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_UnlockDSP (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetRecordNumDrivers (IntPtr system, out int numdrivers, out int numconnected); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetRecordDriverInfo (IntPtr system, int id, IntPtr name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetRecordPosition (IntPtr system, int id, out uint position); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_RecordStart (IntPtr system, int id, IntPtr sound, bool loop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_RecordStop (IntPtr system, int id); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_IsRecording (IntPtr system, int id, out bool recording); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateGeometry (IntPtr system, int maxpolygons, int maxvertices, out IntPtr geometry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetGeometrySettings (IntPtr system, float maxworldsize); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetGeometrySettings (IntPtr system, out float maxworldsize); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_LoadGeometry (IntPtr system, IntPtr data, int datasize, out IntPtr geometry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetGeometryOcclusion (IntPtr system, ref VECTOR listener, ref VECTOR source, out float direct, out float reverb); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetNetworkProxy (IntPtr system, byte[] proxy); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNetworkProxy (IntPtr system, IntPtr proxy, int proxylen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetNetworkTimeout (IntPtr system, int timeout); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNetworkTimeout (IntPtr system, out int timeout); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetUserData (IntPtr system, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetUserData (IntPtr system, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public System(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + + /* + 'Sound' API. + */ + public struct Sound + { + public RESULT release() + { + return FMOD5_Sound_Release(this.handle); + } + public RESULT getSystemObject(out System system) + { + return FMOD5_Sound_GetSystemObject(this.handle, out system.handle); + } + + // Standard sound manipulation functions. + public RESULT @lock(uint offset, uint length, out IntPtr ptr1, out IntPtr ptr2, out uint len1, out uint len2) + { + return FMOD5_Sound_Lock(this.handle, offset, length, out ptr1, out ptr2, out len1, out len2); + } + public RESULT unlock(IntPtr ptr1, IntPtr ptr2, uint len1, uint len2) + { + return FMOD5_Sound_Unlock(this.handle, ptr1, ptr2, len1, len2); + } + public RESULT setDefaults(float frequency, int priority) + { + return FMOD5_Sound_SetDefaults(this.handle, frequency, priority); + } + public RESULT getDefaults(out float frequency, out int priority) + { + return FMOD5_Sound_GetDefaults(this.handle, out frequency, out priority); + } + public RESULT set3DMinMaxDistance(float min, float max) + { + return FMOD5_Sound_Set3DMinMaxDistance(this.handle, min, max); + } + public RESULT get3DMinMaxDistance(out float min, out float max) + { + return FMOD5_Sound_Get3DMinMaxDistance(this.handle, out min, out max); + } + public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) + { + return FMOD5_Sound_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); + } + public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) + { + return FMOD5_Sound_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); + } + public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) + { + return FMOD5_Sound_Set3DCustomRolloff(this.handle, ref points, numpoints); + } + public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) + { + return FMOD5_Sound_Get3DCustomRolloff(this.handle, out points, out numpoints); + } + + public RESULT getSubSound(int index, out Sound subsound) + { + return FMOD5_Sound_GetSubSound(this.handle, index, out subsound.handle); + } + public RESULT getSubSoundParent(out Sound parentsound) + { + return FMOD5_Sound_GetSubSoundParent(this.handle, out parentsound.handle); + } + public RESULT getName(out string name, int namelen) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_Sound_GetName(this.handle, stringMem, namelen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getLength(out uint length, TIMEUNIT lengthtype) + { + return FMOD5_Sound_GetLength(this.handle, out length, lengthtype); + } + public RESULT getFormat(out SOUND_TYPE type, out SOUND_FORMAT format, out int channels, out int bits) + { + return FMOD5_Sound_GetFormat(this.handle, out type, out format, out channels, out bits); + } + public RESULT getNumSubSounds(out int numsubsounds) + { + return FMOD5_Sound_GetNumSubSounds(this.handle, out numsubsounds); + } + public RESULT getNumTags(out int numtags, out int numtagsupdated) + { + return FMOD5_Sound_GetNumTags(this.handle, out numtags, out numtagsupdated); + } + public RESULT getTag(string name, int index, out TAG tag) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_Sound_GetTag(this.handle, encoder.byteFromStringUTF8(name), index, out tag); + } + } + public RESULT getOpenState(out OPENSTATE openstate, out uint percentbuffered, out bool starving, out bool diskbusy) + { + return FMOD5_Sound_GetOpenState(this.handle, out openstate, out percentbuffered, out starving, out diskbusy); + } + public RESULT readData(byte[] buffer) + { + return FMOD5_Sound_ReadData(this.handle, buffer, (uint)buffer.Length, IntPtr.Zero); + } + public RESULT readData(byte[] buffer, out uint read) + { + return FMOD5_Sound_ReadData(this.handle, buffer, (uint)buffer.Length, out read); + } + public RESULT seekData(uint pcm) + { + return FMOD5_Sound_SeekData(this.handle, pcm); + } + public RESULT setSoundGroup(SoundGroup soundgroup) + { + return FMOD5_Sound_SetSoundGroup(this.handle, soundgroup.handle); + } + public RESULT getSoundGroup(out SoundGroup soundgroup) + { + return FMOD5_Sound_GetSoundGroup(this.handle, out soundgroup.handle); + } + + // Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. + public RESULT getNumSyncPoints(out int numsyncpoints) + { + return FMOD5_Sound_GetNumSyncPoints(this.handle, out numsyncpoints); + } + public RESULT getSyncPoint(int index, out IntPtr point) + { + return FMOD5_Sound_GetSyncPoint(this.handle, index, out point); + } + public RESULT getSyncPointInfo(IntPtr point, out string name, int namelen, out uint offset, TIMEUNIT offsettype) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_Sound_GetSyncPointInfo(this.handle, point, stringMem, namelen, out offset, offsettype); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getSyncPointInfo(IntPtr point, out uint offset, TIMEUNIT offsettype) + { + return FMOD5_Sound_GetSyncPointInfo(this.handle, point, IntPtr.Zero, 0, out offset, offsettype); + } + public RESULT addSyncPoint(uint offset, TIMEUNIT offsettype, string name, out IntPtr point) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_Sound_AddSyncPoint(this.handle, offset, offsettype, encoder.byteFromStringUTF8(name), out point); + } + } + public RESULT deleteSyncPoint(IntPtr point) + { + return FMOD5_Sound_DeleteSyncPoint(this.handle, point); + } + + // Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. + public RESULT setMode(MODE mode) + { + return FMOD5_Sound_SetMode(this.handle, mode); + } + public RESULT getMode(out MODE mode) + { + return FMOD5_Sound_GetMode(this.handle, out mode); + } + public RESULT setLoopCount(int loopcount) + { + return FMOD5_Sound_SetLoopCount(this.handle, loopcount); + } + public RESULT getLoopCount(out int loopcount) + { + return FMOD5_Sound_GetLoopCount(this.handle, out loopcount); + } + public RESULT setLoopPoints(uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Sound_SetLoopPoints(this.handle, loopstart, loopstarttype, loopend, loopendtype); + } + public RESULT getLoopPoints(out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Sound_GetLoopPoints(this.handle, out loopstart, loopstarttype, out loopend, loopendtype); + } + + // For MOD/S3M/XM/IT/MID sequenced formats only. + public RESULT getMusicNumChannels(out int numchannels) + { + return FMOD5_Sound_GetMusicNumChannels(this.handle, out numchannels); + } + public RESULT setMusicChannelVolume(int channel, float volume) + { + return FMOD5_Sound_SetMusicChannelVolume(this.handle, channel, volume); + } + public RESULT getMusicChannelVolume(int channel, out float volume) + { + return FMOD5_Sound_GetMusicChannelVolume(this.handle, channel, out volume); + } + public RESULT setMusicSpeed(float speed) + { + return FMOD5_Sound_SetMusicSpeed(this.handle, speed); + } + public RESULT getMusicSpeed(out float speed) + { + return FMOD5_Sound_GetMusicSpeed(this.handle, out speed); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Sound_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Sound_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Release (IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSystemObject (IntPtr sound, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Lock (IntPtr sound, uint offset, uint length, out IntPtr ptr1, out IntPtr ptr2, out uint len1, out uint len2); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Unlock (IntPtr sound, IntPtr ptr1, IntPtr ptr2, uint len1, uint len2); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetDefaults (IntPtr sound, float frequency, int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetDefaults (IntPtr sound, out float frequency, out int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Set3DMinMaxDistance (IntPtr sound, float min, float max); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Get3DMinMaxDistance (IntPtr sound, out float min, out float max); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Set3DConeSettings (IntPtr sound, float insideconeangle, float outsideconeangle, float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Get3DConeSettings (IntPtr sound, out float insideconeangle, out float outsideconeangle, out float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Set3DCustomRolloff (IntPtr sound, ref VECTOR points, int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Get3DCustomRolloff (IntPtr sound, out IntPtr points, out int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSubSound (IntPtr sound, int index, out IntPtr subsound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSubSoundParent (IntPtr sound, out IntPtr parentsound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetName (IntPtr sound, IntPtr name, int namelen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetLength (IntPtr sound, out uint length, TIMEUNIT lengthtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetFormat (IntPtr sound, out SOUND_TYPE type, out SOUND_FORMAT format, out int channels, out int bits); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetNumSubSounds (IntPtr sound, out int numsubsounds); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetNumTags (IntPtr sound, out int numtags, out int numtagsupdated); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetTag (IntPtr sound, byte[] name, int index, out TAG tag); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetOpenState (IntPtr sound, out OPENSTATE openstate, out uint percentbuffered, out bool starving, out bool diskbusy); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_ReadData (IntPtr sound, byte[] buffer, uint length, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_ReadData (IntPtr sound, byte[] buffer, uint length, out uint read); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SeekData (IntPtr sound, uint pcm); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetSoundGroup (IntPtr sound, IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSoundGroup (IntPtr sound, out IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetNumSyncPoints (IntPtr sound, out int numsyncpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSyncPoint (IntPtr sound, int index, out IntPtr point); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSyncPointInfo (IntPtr sound, IntPtr point, IntPtr name, int namelen, out uint offset, TIMEUNIT offsettype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_AddSyncPoint (IntPtr sound, uint offset, TIMEUNIT offsettype, byte[] name, out IntPtr point); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_DeleteSyncPoint (IntPtr sound, IntPtr point); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetMode (IntPtr sound, MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMode (IntPtr sound, out MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetLoopCount (IntPtr sound, int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetLoopCount (IntPtr sound, out int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetLoopPoints (IntPtr sound, uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetLoopPoints (IntPtr sound, out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMusicNumChannels (IntPtr sound, out int numchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetMusicChannelVolume (IntPtr sound, int channel, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMusicChannelVolume (IntPtr sound, int channel, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetMusicSpeed (IntPtr sound, float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMusicSpeed (IntPtr sound, out float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetUserData (IntPtr sound, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetUserData (IntPtr sound, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Sound(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'ChannelControl' API + */ + interface IChannelControl + { + RESULT getSystemObject (out System system); + + // General control functionality for Channels and ChannelGroups. + RESULT stop (); + RESULT setPaused (bool paused); + RESULT getPaused (out bool paused); + RESULT setVolume (float volume); + RESULT getVolume (out float volume); + RESULT setVolumeRamp (bool ramp); + RESULT getVolumeRamp (out bool ramp); + RESULT getAudibility (out float audibility); + RESULT setPitch (float pitch); + RESULT getPitch (out float pitch); + RESULT setMute (bool mute); + RESULT getMute (out bool mute); + RESULT setReverbProperties (int instance, float wet); + RESULT getReverbProperties (int instance, out float wet); + RESULT setLowPassGain (float gain); + RESULT getLowPassGain (out float gain); + RESULT setMode (MODE mode); + RESULT getMode (out MODE mode); + RESULT setCallback (CHANNELCONTROL_CALLBACK callback); + RESULT isPlaying (out bool isplaying); + + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + RESULT setPan (float pan); + RESULT setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + RESULT setMixLevelsInput (float[] levels, int numlevels); + RESULT setMixMatrix (float[] matrix, int outchannels, int inchannels, int inchannel_hop); + RESULT getMixMatrix (float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + + // Clock based functionality. + RESULT getDSPClock (out ulong dspclock, out ulong parentclock); + RESULT setDelay (ulong dspclock_start, ulong dspclock_end, bool stopchannels); + RESULT getDelay (out ulong dspclock_start, out ulong dspclock_end); + RESULT getDelay (out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); + RESULT addFadePoint (ulong dspclock, float volume); + RESULT setFadePointRamp (ulong dspclock, float volume); + RESULT removeFadePoints (ulong dspclock_start, ulong dspclock_end); + RESULT getFadePoints (ref uint numpoints, ulong[] point_dspclock, float[] point_volume); + + // DSP effects. + RESULT getDSP (int index, out DSP dsp); + RESULT addDSP (int index, DSP dsp); + RESULT removeDSP (DSP dsp); + RESULT getNumDSPs (out int numdsps); + RESULT setDSPIndex (DSP dsp, int index); + RESULT getDSPIndex (DSP dsp, out int index); + + // 3D functionality. + RESULT set3DAttributes (ref VECTOR pos, ref VECTOR vel); + RESULT get3DAttributes (out VECTOR pos, out VECTOR vel); + RESULT set3DMinMaxDistance (float mindistance, float maxdistance); + RESULT get3DMinMaxDistance (out float mindistance, out float maxdistance); + RESULT set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + RESULT get3DConeSettings (out float insideconeangle, out float outsideconeangle, out float outsidevolume); + RESULT set3DConeOrientation (ref VECTOR orientation); + RESULT get3DConeOrientation (out VECTOR orientation); + RESULT set3DCustomRolloff (ref VECTOR points, int numpoints); + RESULT get3DCustomRolloff (out IntPtr points, out int numpoints); + RESULT set3DOcclusion (float directocclusion, float reverbocclusion); + RESULT get3DOcclusion (out float directocclusion, out float reverbocclusion); + RESULT set3DSpread (float angle); + RESULT get3DSpread (out float angle); + RESULT set3DLevel (float level); + RESULT get3DLevel (out float level); + RESULT set3DDopplerLevel (float level); + RESULT get3DDopplerLevel (out float level); + RESULT set3DDistanceFilter (bool custom, float customLevel, float centerFreq); + RESULT get3DDistanceFilter (out bool custom, out float customLevel, out float centerFreq); + + // Userdata set/get. + RESULT setUserData (IntPtr userdata); + RESULT getUserData (out IntPtr userdata); + } + + /* + 'Channel' API + */ + public struct Channel : IChannelControl + { + // Channel specific control functionality. + public RESULT setFrequency(float frequency) + { + return FMOD5_Channel_SetFrequency(this.handle, frequency); + } + public RESULT getFrequency(out float frequency) + { + return FMOD5_Channel_GetFrequency(this.handle, out frequency); + } + public RESULT setPriority(int priority) + { + return FMOD5_Channel_SetPriority(this.handle, priority); + } + public RESULT getPriority(out int priority) + { + return FMOD5_Channel_GetPriority(this.handle, out priority); + } + public RESULT setPosition(uint position, TIMEUNIT postype) + { + return FMOD5_Channel_SetPosition(this.handle, position, postype); + } + public RESULT getPosition(out uint position, TIMEUNIT postype) + { + return FMOD5_Channel_GetPosition(this.handle, out position, postype); + } + public RESULT setChannelGroup(ChannelGroup channelgroup) + { + return FMOD5_Channel_SetChannelGroup(this.handle, channelgroup.handle); + } + public RESULT getChannelGroup(out ChannelGroup channelgroup) + { + return FMOD5_Channel_GetChannelGroup(this.handle, out channelgroup.handle); + } + public RESULT setLoopCount(int loopcount) + { + return FMOD5_Channel_SetLoopCount(this.handle, loopcount); + } + public RESULT getLoopCount(out int loopcount) + { + return FMOD5_Channel_GetLoopCount(this.handle, out loopcount); + } + public RESULT setLoopPoints(uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Channel_SetLoopPoints(this.handle, loopstart, loopstarttype, loopend, loopendtype); + } + public RESULT getLoopPoints(out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Channel_GetLoopPoints(this.handle, out loopstart, loopstarttype, out loopend, loopendtype); + } + + // Information only functions. + public RESULT isVirtual(out bool isvirtual) + { + return FMOD5_Channel_IsVirtual(this.handle, out isvirtual); + } + public RESULT getCurrentSound(out Sound sound) + { + return FMOD5_Channel_GetCurrentSound(this.handle, out sound.handle); + } + public RESULT getIndex(out int index) + { + return FMOD5_Channel_GetIndex(this.handle, out index); + } + + public RESULT getSystemObject(out System system) + { + return FMOD5_Channel_GetSystemObject(this.handle, out system.handle); + } + + // General control functionality for Channels and ChannelGroups. + public RESULT stop() + { + return FMOD5_Channel_Stop(this.handle); + } + public RESULT setPaused(bool paused) + { + return FMOD5_Channel_SetPaused(this.handle, paused); + } + public RESULT getPaused(out bool paused) + { + return FMOD5_Channel_GetPaused(this.handle, out paused); + } + public RESULT setVolume(float volume) + { + return FMOD5_Channel_SetVolume(this.handle, volume); + } + public RESULT getVolume(out float volume) + { + return FMOD5_Channel_GetVolume(this.handle, out volume); + } + public RESULT setVolumeRamp(bool ramp) + { + return FMOD5_Channel_SetVolumeRamp(this.handle, ramp); + } + public RESULT getVolumeRamp(out bool ramp) + { + return FMOD5_Channel_GetVolumeRamp(this.handle, out ramp); + } + public RESULT getAudibility(out float audibility) + { + return FMOD5_Channel_GetAudibility(this.handle, out audibility); + } + public RESULT setPitch(float pitch) + { + return FMOD5_Channel_SetPitch(this.handle, pitch); + } + public RESULT getPitch(out float pitch) + { + return FMOD5_Channel_GetPitch(this.handle, out pitch); + } + public RESULT setMute(bool mute) + { + return FMOD5_Channel_SetMute(this.handle, mute); + } + public RESULT getMute(out bool mute) + { + return FMOD5_Channel_GetMute(this.handle, out mute); + } + public RESULT setReverbProperties(int instance, float wet) + { + return FMOD5_Channel_SetReverbProperties(this.handle, instance, wet); + } + public RESULT getReverbProperties(int instance, out float wet) + { + return FMOD5_Channel_GetReverbProperties(this.handle, instance, out wet); + } + public RESULT setLowPassGain(float gain) + { + return FMOD5_Channel_SetLowPassGain(this.handle, gain); + } + public RESULT getLowPassGain(out float gain) + { + return FMOD5_Channel_GetLowPassGain(this.handle, out gain); + } + public RESULT setMode(MODE mode) + { + return FMOD5_Channel_SetMode(this.handle, mode); + } + public RESULT getMode(out MODE mode) + { + return FMOD5_Channel_GetMode(this.handle, out mode); + } + public RESULT setCallback(CHANNELCONTROL_CALLBACK callback) + { + return FMOD5_Channel_SetCallback(this.handle, callback); + } + public RESULT isPlaying(out bool isplaying) + { + return FMOD5_Channel_IsPlaying(this.handle, out isplaying); + } + + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + public RESULT setPan(float pan) + { + return FMOD5_Channel_SetPan(this.handle, pan); + } + public RESULT setMixLevelsOutput(float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright) + { + return FMOD5_Channel_SetMixLevelsOutput(this.handle, frontleft, frontright, center, lfe, surroundleft, surroundright, backleft, backright); + } + public RESULT setMixLevelsInput(float[] levels, int numlevels) + { + return FMOD5_Channel_SetMixLevelsInput(this.handle, levels, numlevels); + } + public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop = 0) + { + return FMOD5_Channel_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); + } + public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop = 0) + { + return FMOD5_Channel_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); + } + + // Clock based functionality. + public RESULT getDSPClock(out ulong dspclock, out ulong parentclock) + { + return FMOD5_Channel_GetDSPClock(this.handle, out dspclock, out parentclock); + } + public RESULT setDelay(ulong dspclock_start, ulong dspclock_end, bool stopchannels = true) + { + return FMOD5_Channel_SetDelay(this.handle, dspclock_start, dspclock_end, stopchannels); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end) + { + return FMOD5_Channel_GetDelay(this.handle, out dspclock_start, out dspclock_end, IntPtr.Zero); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels) + { + return FMOD5_Channel_GetDelay(this.handle, out dspclock_start, out dspclock_end, out stopchannels); + } + public RESULT addFadePoint(ulong dspclock, float volume) + { + return FMOD5_Channel_AddFadePoint(this.handle, dspclock, volume); + } + public RESULT setFadePointRamp(ulong dspclock, float volume) + { + return FMOD5_Channel_SetFadePointRamp(this.handle, dspclock, volume); + } + public RESULT removeFadePoints(ulong dspclock_start, ulong dspclock_end) + { + return FMOD5_Channel_RemoveFadePoints(this.handle, dspclock_start, dspclock_end); + } + public RESULT getFadePoints(ref uint numpoints, ulong[] point_dspclock, float[] point_volume) + { + return FMOD5_Channel_GetFadePoints(this.handle, ref numpoints, point_dspclock, point_volume); + } + + // DSP effects. + public RESULT getDSP(int index, out DSP dsp) + { + return FMOD5_Channel_GetDSP(this.handle, index, out dsp.handle); + } + public RESULT addDSP(int index, DSP dsp) + { + return FMOD5_Channel_AddDSP(this.handle, index, dsp.handle); + } + public RESULT removeDSP(DSP dsp) + { + return FMOD5_Channel_RemoveDSP(this.handle, dsp.handle); + } + public RESULT getNumDSPs(out int numdsps) + { + return FMOD5_Channel_GetNumDSPs(this.handle, out numdsps); + } + public RESULT setDSPIndex(DSP dsp, int index) + { + return FMOD5_Channel_SetDSPIndex(this.handle, dsp.handle, index); + } + public RESULT getDSPIndex(DSP dsp, out int index) + { + return FMOD5_Channel_GetDSPIndex(this.handle, dsp.handle, out index); + } + + // 3D functionality. + public RESULT set3DAttributes(ref VECTOR pos, ref VECTOR vel) + { + return FMOD5_Channel_Set3DAttributes(this.handle, ref pos, ref vel); + } + public RESULT get3DAttributes(out VECTOR pos, out VECTOR vel) + { + return FMOD5_Channel_Get3DAttributes(this.handle, out pos, out vel); + } + public RESULT set3DMinMaxDistance(float mindistance, float maxdistance) + { + return FMOD5_Channel_Set3DMinMaxDistance(this.handle, mindistance, maxdistance); + } + public RESULT get3DMinMaxDistance(out float mindistance, out float maxdistance) + { + return FMOD5_Channel_Get3DMinMaxDistance(this.handle, out mindistance, out maxdistance); + } + public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) + { + return FMOD5_Channel_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); + } + public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) + { + return FMOD5_Channel_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); + } + public RESULT set3DConeOrientation(ref VECTOR orientation) + { + return FMOD5_Channel_Set3DConeOrientation(this.handle, ref orientation); + } + public RESULT get3DConeOrientation(out VECTOR orientation) + { + return FMOD5_Channel_Get3DConeOrientation(this.handle, out orientation); + } + public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) + { + return FMOD5_Channel_Set3DCustomRolloff(this.handle, ref points, numpoints); + } + public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) + { + return FMOD5_Channel_Get3DCustomRolloff(this.handle, out points, out numpoints); + } + public RESULT set3DOcclusion(float directocclusion, float reverbocclusion) + { + return FMOD5_Channel_Set3DOcclusion(this.handle, directocclusion, reverbocclusion); + } + public RESULT get3DOcclusion(out float directocclusion, out float reverbocclusion) + { + return FMOD5_Channel_Get3DOcclusion(this.handle, out directocclusion, out reverbocclusion); + } + public RESULT set3DSpread(float angle) + { + return FMOD5_Channel_Set3DSpread(this.handle, angle); + } + public RESULT get3DSpread(out float angle) + { + return FMOD5_Channel_Get3DSpread(this.handle, out angle); + } + public RESULT set3DLevel(float level) + { + return FMOD5_Channel_Set3DLevel(this.handle, level); + } + public RESULT get3DLevel(out float level) + { + return FMOD5_Channel_Get3DLevel(this.handle, out level); + } + public RESULT set3DDopplerLevel(float level) + { + return FMOD5_Channel_Set3DDopplerLevel(this.handle, level); + } + public RESULT get3DDopplerLevel(out float level) + { + return FMOD5_Channel_Get3DDopplerLevel(this.handle, out level); + } + public RESULT set3DDistanceFilter(bool custom, float customLevel, float centerFreq) + { + return FMOD5_Channel_Set3DDistanceFilter(this.handle, custom, customLevel, centerFreq); + } + public RESULT get3DDistanceFilter(out bool custom, out float customLevel, out float centerFreq) + { + return FMOD5_Channel_Get3DDistanceFilter(this.handle, out custom, out customLevel, out centerFreq); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Channel_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Channel_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetFrequency (IntPtr channel, float frequency); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetFrequency (IntPtr channel, out float frequency); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPriority (IntPtr channel, int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPriority (IntPtr channel, out int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPosition (IntPtr channel, uint position, TIMEUNIT postype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPosition (IntPtr channel, out uint position, TIMEUNIT postype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetChannelGroup (IntPtr channel, IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetChannelGroup (IntPtr channel, out IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetLoopCount (IntPtr channel, int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetLoopCount (IntPtr channel, out int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetLoopPoints (IntPtr channel, uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetLoopPoints (IntPtr channel, out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_IsVirtual (IntPtr channel, out bool isvirtual); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetCurrentSound (IntPtr channel, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetIndex (IntPtr channel, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetSystemObject (IntPtr channel, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Stop (IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPaused (IntPtr channel, bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPaused (IntPtr channel, out bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetVolume (IntPtr channel, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetVolume (IntPtr channel, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetVolumeRamp (IntPtr channel, bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetVolumeRamp (IntPtr channel, out bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetAudibility (IntPtr channel, out float audibility); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPitch (IntPtr channel, float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPitch (IntPtr channel, out float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMute (IntPtr channel, bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetMute (IntPtr channel, out bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetReverbProperties (IntPtr channel, int instance, float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetReverbProperties (IntPtr channel, int instance, out float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetLowPassGain (IntPtr channel, float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetLowPassGain (IntPtr channel, out float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMode (IntPtr channel, MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetMode (IntPtr channel, out MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetCallback (IntPtr channel, CHANNELCONTROL_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_IsPlaying (IntPtr channel, out bool isplaying); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPan (IntPtr channel, float pan); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMixLevelsOutput (IntPtr channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMixLevelsInput (IntPtr channel, float[] levels, int numlevels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMixMatrix (IntPtr channel, float[] matrix, int outchannels, int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetMixMatrix (IntPtr channel, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDSPClock (IntPtr channel, out ulong dspclock, out ulong parentclock); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetDelay (IntPtr channel, ulong dspclock_start, ulong dspclock_end, bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDelay (IntPtr channel, out ulong dspclock_start, out ulong dspclock_end, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDelay (IntPtr channel, out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_AddFadePoint (IntPtr channel, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetFadePointRamp (IntPtr channel, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_RemoveFadePoints (IntPtr channel, ulong dspclock_start, ulong dspclock_end); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetFadePoints (IntPtr channel, ref uint numpoints, ulong[] point_dspclock, float[] point_volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDSP (IntPtr channel, int index, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_AddDSP (IntPtr channel, int index, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_RemoveDSP (IntPtr channel, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetNumDSPs (IntPtr channel, out int numdsps); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetDSPIndex (IntPtr channel, IntPtr dsp, int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDSPIndex (IntPtr channel, IntPtr dsp, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DAttributes (IntPtr channel, ref VECTOR pos, ref VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DAttributes (IntPtr channel, out VECTOR pos, out VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DMinMaxDistance (IntPtr channel, float mindistance, float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DMinMaxDistance (IntPtr channel, out float mindistance, out float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DConeSettings (IntPtr channel, float insideconeangle, float outsideconeangle, float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DConeSettings (IntPtr channel, out float insideconeangle, out float outsideconeangle, out float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DConeOrientation (IntPtr channel, ref VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DConeOrientation (IntPtr channel, out VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DCustomRolloff (IntPtr channel, ref VECTOR points, int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DCustomRolloff (IntPtr channel, out IntPtr points, out int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DOcclusion (IntPtr channel, float directocclusion, float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DOcclusion (IntPtr channel, out float directocclusion, out float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DSpread (IntPtr channel, float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DSpread (IntPtr channel, out float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DLevel (IntPtr channel, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DLevel (IntPtr channel, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DDopplerLevel (IntPtr channel, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DDopplerLevel (IntPtr channel, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DDistanceFilter (IntPtr channel, bool custom, float customLevel, float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DDistanceFilter (IntPtr channel, out bool custom, out float customLevel, out float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetUserData (IntPtr channel, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetUserData (IntPtr channel, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Channel(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'ChannelGroup' API + */ + public struct ChannelGroup : IChannelControl + { + public RESULT release() + { + return FMOD5_ChannelGroup_Release(this.handle); + } + + // Nested channel groups. + public RESULT addGroup(ChannelGroup group, bool propagatedspclock = true) + { + return FMOD5_ChannelGroup_AddGroup(this.handle, group.handle, propagatedspclock, IntPtr.Zero); + } + public RESULT addGroup(ChannelGroup group, bool propagatedspclock, out DSPConnection connection) + { + return FMOD5_ChannelGroup_AddGroup(this.handle, group.handle, propagatedspclock, out connection.handle); + } + public RESULT getNumGroups(out int numgroups) + { + return FMOD5_ChannelGroup_GetNumGroups(this.handle, out numgroups); + } + public RESULT getGroup(int index, out ChannelGroup group) + { + return FMOD5_ChannelGroup_GetGroup(this.handle, index, out group.handle); + } + public RESULT getParentGroup(out ChannelGroup group) + { + return FMOD5_ChannelGroup_GetParentGroup(this.handle, out group.handle); + } + + // Information only functions. + public RESULT getName(out string name, int namelen) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_ChannelGroup_GetName(this.handle, stringMem, namelen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getNumChannels(out int numchannels) + { + return FMOD5_ChannelGroup_GetNumChannels(this.handle, out numchannels); + } + public RESULT getChannel(int index, out Channel channel) + { + return FMOD5_ChannelGroup_GetChannel(this.handle, index, out channel.handle); + } + + public RESULT getSystemObject(out System system) + { + return FMOD5_ChannelGroup_GetSystemObject(this.handle, out system.handle); + } + + // General control functionality for Channels and ChannelGroups. + public RESULT stop() + { + return FMOD5_ChannelGroup_Stop(this.handle); + } + public RESULT setPaused(bool paused) + { + return FMOD5_ChannelGroup_SetPaused(this.handle, paused); + } + public RESULT getPaused(out bool paused) + { + return FMOD5_ChannelGroup_GetPaused(this.handle, out paused); + } + public RESULT setVolume(float volume) + { + return FMOD5_ChannelGroup_SetVolume(this.handle, volume); + } + public RESULT getVolume(out float volume) + { + return FMOD5_ChannelGroup_GetVolume(this.handle, out volume); + } + public RESULT setVolumeRamp(bool ramp) + { + return FMOD5_ChannelGroup_SetVolumeRamp(this.handle, ramp); + } + public RESULT getVolumeRamp(out bool ramp) + { + return FMOD5_ChannelGroup_GetVolumeRamp(this.handle, out ramp); + } + public RESULT getAudibility(out float audibility) + { + return FMOD5_ChannelGroup_GetAudibility(this.handle, out audibility); + } + public RESULT setPitch(float pitch) + { + return FMOD5_ChannelGroup_SetPitch(this.handle, pitch); + } + public RESULT getPitch(out float pitch) + { + return FMOD5_ChannelGroup_GetPitch(this.handle, out pitch); + } + public RESULT setMute(bool mute) + { + return FMOD5_ChannelGroup_SetMute(this.handle, mute); + } + public RESULT getMute(out bool mute) + { + return FMOD5_ChannelGroup_GetMute(this.handle, out mute); + } + public RESULT setReverbProperties(int instance, float wet) + { + return FMOD5_ChannelGroup_SetReverbProperties(this.handle, instance, wet); + } + public RESULT getReverbProperties(int instance, out float wet) + { + return FMOD5_ChannelGroup_GetReverbProperties(this.handle, instance, out wet); + } + public RESULT setLowPassGain(float gain) + { + return FMOD5_ChannelGroup_SetLowPassGain(this.handle, gain); + } + public RESULT getLowPassGain(out float gain) + { + return FMOD5_ChannelGroup_GetLowPassGain(this.handle, out gain); + } + public RESULT setMode(MODE mode) + { + return FMOD5_ChannelGroup_SetMode(this.handle, mode); + } + public RESULT getMode(out MODE mode) + { + return FMOD5_ChannelGroup_GetMode(this.handle, out mode); + } + public RESULT setCallback(CHANNELCONTROL_CALLBACK callback) + { + return FMOD5_ChannelGroup_SetCallback(this.handle, callback); + } + public RESULT isPlaying(out bool isplaying) + { + return FMOD5_ChannelGroup_IsPlaying(this.handle, out isplaying); + } + + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + public RESULT setPan(float pan) + { + return FMOD5_ChannelGroup_SetPan(this.handle, pan); + } + public RESULT setMixLevelsOutput(float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright) + { + return FMOD5_ChannelGroup_SetMixLevelsOutput(this.handle, frontleft, frontright, center, lfe, surroundleft, surroundright, backleft, backright); + } + public RESULT setMixLevelsInput(float[] levels, int numlevels) + { + return FMOD5_ChannelGroup_SetMixLevelsInput(this.handle, levels, numlevels); + } + public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop) + { + return FMOD5_ChannelGroup_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); + } + public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop) + { + return FMOD5_ChannelGroup_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); + } + + // Clock based functionality. + public RESULT getDSPClock(out ulong dspclock, out ulong parentclock) + { + return FMOD5_ChannelGroup_GetDSPClock(this.handle, out dspclock, out parentclock); + } + public RESULT setDelay(ulong dspclock_start, ulong dspclock_end, bool stopchannels) + { + return FMOD5_ChannelGroup_SetDelay(this.handle, dspclock_start, dspclock_end, stopchannels); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end) + { + return FMOD5_ChannelGroup_GetDelay(this.handle, out dspclock_start, out dspclock_end, IntPtr.Zero); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels) + { + return FMOD5_ChannelGroup_GetDelay(this.handle, out dspclock_start, out dspclock_end, out stopchannels); + } + public RESULT addFadePoint(ulong dspclock, float volume) + { + return FMOD5_ChannelGroup_AddFadePoint(this.handle, dspclock, volume); + } + public RESULT setFadePointRamp(ulong dspclock, float volume) + { + return FMOD5_ChannelGroup_SetFadePointRamp(this.handle, dspclock, volume); + } + public RESULT removeFadePoints(ulong dspclock_start, ulong dspclock_end) + { + return FMOD5_ChannelGroup_RemoveFadePoints(this.handle, dspclock_start, dspclock_end); + } + public RESULT getFadePoints(ref uint numpoints, ulong[] point_dspclock, float[] point_volume) + { + return FMOD5_ChannelGroup_GetFadePoints(this.handle, ref numpoints, point_dspclock, point_volume); + } + + // DSP effects. + public RESULT getDSP(int index, out DSP dsp) + { + return FMOD5_ChannelGroup_GetDSP(this.handle, index, out dsp.handle); + } + public RESULT addDSP(int index, DSP dsp) + { + return FMOD5_ChannelGroup_AddDSP(this.handle, index, dsp.handle); + } + public RESULT removeDSP(DSP dsp) + { + return FMOD5_ChannelGroup_RemoveDSP(this.handle, dsp.handle); + } + public RESULT getNumDSPs(out int numdsps) + { + return FMOD5_ChannelGroup_GetNumDSPs(this.handle, out numdsps); + } + public RESULT setDSPIndex(DSP dsp, int index) + { + return FMOD5_ChannelGroup_SetDSPIndex(this.handle, dsp.handle, index); + } + public RESULT getDSPIndex(DSP dsp, out int index) + { + return FMOD5_ChannelGroup_GetDSPIndex(this.handle, dsp.handle, out index); + } + + // 3D functionality. + public RESULT set3DAttributes(ref VECTOR pos, ref VECTOR vel) + { + return FMOD5_ChannelGroup_Set3DAttributes(this.handle, ref pos, ref vel); + } + public RESULT get3DAttributes(out VECTOR pos, out VECTOR vel) + { + return FMOD5_ChannelGroup_Get3DAttributes(this.handle, out pos, out vel); + } + public RESULT set3DMinMaxDistance(float mindistance, float maxdistance) + { + return FMOD5_ChannelGroup_Set3DMinMaxDistance(this.handle, mindistance, maxdistance); + } + public RESULT get3DMinMaxDistance(out float mindistance, out float maxdistance) + { + return FMOD5_ChannelGroup_Get3DMinMaxDistance(this.handle, out mindistance, out maxdistance); + } + public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) + { + return FMOD5_ChannelGroup_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); + } + public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) + { + return FMOD5_ChannelGroup_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); + } + public RESULT set3DConeOrientation(ref VECTOR orientation) + { + return FMOD5_ChannelGroup_Set3DConeOrientation(this.handle, ref orientation); + } + public RESULT get3DConeOrientation(out VECTOR orientation) + { + return FMOD5_ChannelGroup_Get3DConeOrientation(this.handle, out orientation); + } + public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) + { + return FMOD5_ChannelGroup_Set3DCustomRolloff(this.handle, ref points, numpoints); + } + public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) + { + return FMOD5_ChannelGroup_Get3DCustomRolloff(this.handle, out points, out numpoints); + } + public RESULT set3DOcclusion(float directocclusion, float reverbocclusion) + { + return FMOD5_ChannelGroup_Set3DOcclusion(this.handle, directocclusion, reverbocclusion); + } + public RESULT get3DOcclusion(out float directocclusion, out float reverbocclusion) + { + return FMOD5_ChannelGroup_Get3DOcclusion(this.handle, out directocclusion, out reverbocclusion); + } + public RESULT set3DSpread(float angle) + { + return FMOD5_ChannelGroup_Set3DSpread(this.handle, angle); + } + public RESULT get3DSpread(out float angle) + { + return FMOD5_ChannelGroup_Get3DSpread(this.handle, out angle); + } + public RESULT set3DLevel(float level) + { + return FMOD5_ChannelGroup_Set3DLevel(this.handle, level); + } + public RESULT get3DLevel(out float level) + { + return FMOD5_ChannelGroup_Get3DLevel(this.handle, out level); + } + public RESULT set3DDopplerLevel(float level) + { + return FMOD5_ChannelGroup_Set3DDopplerLevel(this.handle, level); + } + public RESULT get3DDopplerLevel(out float level) + { + return FMOD5_ChannelGroup_Get3DDopplerLevel(this.handle, out level); + } + public RESULT set3DDistanceFilter(bool custom, float customLevel, float centerFreq) + { + return FMOD5_ChannelGroup_Set3DDistanceFilter(this.handle, custom, customLevel, centerFreq); + } + public RESULT get3DDistanceFilter(out bool custom, out float customLevel, out float centerFreq) + { + return FMOD5_ChannelGroup_Get3DDistanceFilter(this.handle, out custom, out customLevel, out centerFreq); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_ChannelGroup_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_ChannelGroup_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Release (IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddGroup (IntPtr channelgroup, IntPtr group, bool propagatedspclock, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddGroup (IntPtr channelgroup, IntPtr group, bool propagatedspclock, out IntPtr connection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetNumGroups (IntPtr channelgroup, out int numgroups); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetGroup (IntPtr channelgroup, int index, out IntPtr group); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetParentGroup (IntPtr channelgroup, out IntPtr group); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetName (IntPtr channelgroup, IntPtr name, int namelen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetNumChannels (IntPtr channelgroup, out int numchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetChannel (IntPtr channelgroup, int index, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetSystemObject (IntPtr channelgroup, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Stop (IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetPaused (IntPtr channelgroup, bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetPaused (IntPtr channelgroup, out bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetVolume (IntPtr channelgroup, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetVolume (IntPtr channelgroup, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetVolumeRamp (IntPtr channelgroup, bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetVolumeRamp (IntPtr channelgroup, out bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetAudibility (IntPtr channelgroup, out float audibility); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetPitch (IntPtr channelgroup, float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetPitch (IntPtr channelgroup, out float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMute (IntPtr channelgroup, bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetMute (IntPtr channelgroup, out bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetReverbProperties (IntPtr channelgroup, int instance, float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetReverbProperties (IntPtr channelgroup, int instance, out float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetLowPassGain (IntPtr channelgroup, float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetLowPassGain (IntPtr channelgroup, out float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMode (IntPtr channelgroup, MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetMode (IntPtr channelgroup, out MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetCallback (IntPtr channelgroup, CHANNELCONTROL_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_IsPlaying (IntPtr channelgroup, out bool isplaying); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetPan (IntPtr channelgroup, float pan); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMixLevelsOutput (IntPtr channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMixLevelsInput (IntPtr channelgroup, float[] levels, int numlevels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMixMatrix (IntPtr channelgroup, float[] matrix, int outchannels, int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetMixMatrix (IntPtr channelgroup, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDSPClock (IntPtr channelgroup, out ulong dspclock, out ulong parentclock); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetDelay (IntPtr channelgroup, ulong dspclock_start, ulong dspclock_end, bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDelay (IntPtr channelgroup, out ulong dspclock_start, out ulong dspclock_end, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDelay (IntPtr channelgroup, out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddFadePoint (IntPtr channelgroup, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetFadePointRamp (IntPtr channelgroup, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_RemoveFadePoints (IntPtr channelgroup, ulong dspclock_start, ulong dspclock_end); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetFadePoints (IntPtr channelgroup, ref uint numpoints, ulong[] point_dspclock, float[] point_volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDSP (IntPtr channelgroup, int index, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddDSP (IntPtr channelgroup, int index, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_RemoveDSP (IntPtr channelgroup, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetNumDSPs (IntPtr channelgroup, out int numdsps); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetDSPIndex (IntPtr channelgroup, IntPtr dsp, int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDSPIndex (IntPtr channelgroup, IntPtr dsp, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DAttributes (IntPtr channelgroup, ref VECTOR pos, ref VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DAttributes (IntPtr channelgroup, out VECTOR pos, out VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DMinMaxDistance (IntPtr channelgroup, float mindistance, float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DMinMaxDistance (IntPtr channelgroup, out float mindistance, out float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DConeSettings (IntPtr channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DConeSettings (IntPtr channelgroup, out float insideconeangle, out float outsideconeangle, out float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DConeOrientation(IntPtr channelgroup, ref VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DConeOrientation(IntPtr channelgroup, out VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DCustomRolloff (IntPtr channelgroup, ref VECTOR points, int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DCustomRolloff (IntPtr channelgroup, out IntPtr points, out int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DOcclusion (IntPtr channelgroup, float directocclusion, float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DOcclusion (IntPtr channelgroup, out float directocclusion, out float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DSpread (IntPtr channelgroup, float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DSpread (IntPtr channelgroup, out float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DLevel (IntPtr channelgroup, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DLevel (IntPtr channelgroup, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DDopplerLevel (IntPtr channelgroup, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DDopplerLevel (IntPtr channelgroup, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DDistanceFilter (IntPtr channelgroup, bool custom, float customLevel, float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DDistanceFilter (IntPtr channelgroup, out bool custom, out float customLevel, out float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetUserData (IntPtr channelgroup, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetUserData (IntPtr channelgroup, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public ChannelGroup(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'SoundGroup' API + */ + public struct SoundGroup + { + public RESULT release() + { + return FMOD5_SoundGroup_Release(this.handle); + } + + public RESULT getSystemObject(out System system) + { + return FMOD5_SoundGroup_GetSystemObject(this.handle, out system.handle); + } + + // SoundGroup control functions. + public RESULT setMaxAudible(int maxaudible) + { + return FMOD5_SoundGroup_SetMaxAudible(this.handle, maxaudible); + } + public RESULT getMaxAudible(out int maxaudible) + { + return FMOD5_SoundGroup_GetMaxAudible(this.handle, out maxaudible); + } + public RESULT setMaxAudibleBehavior(SOUNDGROUP_BEHAVIOR behavior) + { + return FMOD5_SoundGroup_SetMaxAudibleBehavior(this.handle, behavior); + } + public RESULT getMaxAudibleBehavior(out SOUNDGROUP_BEHAVIOR behavior) + { + return FMOD5_SoundGroup_GetMaxAudibleBehavior(this.handle, out behavior); + } + public RESULT setMuteFadeSpeed(float speed) + { + return FMOD5_SoundGroup_SetMuteFadeSpeed(this.handle, speed); + } + public RESULT getMuteFadeSpeed(out float speed) + { + return FMOD5_SoundGroup_GetMuteFadeSpeed(this.handle, out speed); + } + public RESULT setVolume(float volume) + { + return FMOD5_SoundGroup_SetVolume(this.handle, volume); + } + public RESULT getVolume(out float volume) + { + return FMOD5_SoundGroup_GetVolume(this.handle, out volume); + } + public RESULT stop() + { + return FMOD5_SoundGroup_Stop(this.handle); + } + + // Information only functions. + public RESULT getName(out string name, int namelen) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_SoundGroup_GetName(this.handle, stringMem, namelen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getNumSounds(out int numsounds) + { + return FMOD5_SoundGroup_GetNumSounds(this.handle, out numsounds); + } + public RESULT getSound(int index, out Sound sound) + { + return FMOD5_SoundGroup_GetSound(this.handle, index, out sound.handle); + } + public RESULT getNumPlaying(out int numplaying) + { + return FMOD5_SoundGroup_GetNumPlaying(this.handle, out numplaying); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_SoundGroup_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_SoundGroup_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_Release (IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetSystemObject (IntPtr soundgroup, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetMaxAudible (IntPtr soundgroup, int maxaudible); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetMaxAudible (IntPtr soundgroup, out int maxaudible); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetMaxAudibleBehavior (IntPtr soundgroup, SOUNDGROUP_BEHAVIOR behavior); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetMaxAudibleBehavior (IntPtr soundgroup, out SOUNDGROUP_BEHAVIOR behavior); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetMuteFadeSpeed (IntPtr soundgroup, float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetMuteFadeSpeed (IntPtr soundgroup, out float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetVolume (IntPtr soundgroup, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetVolume (IntPtr soundgroup, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_Stop (IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetName (IntPtr soundgroup, IntPtr name, int namelen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetNumSounds (IntPtr soundgroup, out int numsounds); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetSound (IntPtr soundgroup, int index, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetNumPlaying (IntPtr soundgroup, out int numplaying); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetUserData (IntPtr soundgroup, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetUserData (IntPtr soundgroup, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public SoundGroup(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'DSP' API + */ + public struct DSP + { + public RESULT release() + { + return FMOD5_DSP_Release(this.handle); + } + public RESULT getSystemObject(out System system) + { + return FMOD5_DSP_GetSystemObject(this.handle, out system.handle); + } + + // Connection / disconnection / input and output enumeration. + public RESULT addInput(DSP input) + { + return FMOD5_DSP_AddInput(this.handle, input.handle, IntPtr.Zero, DSPCONNECTION_TYPE.STANDARD); + } + public RESULT addInput(DSP input, out DSPConnection connection, DSPCONNECTION_TYPE type = DSPCONNECTION_TYPE.STANDARD) + { + return FMOD5_DSP_AddInput(this.handle, input.handle, out connection.handle, type); + } + public RESULT disconnectFrom(DSP target, DSPConnection connection) + { + return FMOD5_DSP_DisconnectFrom(this.handle, target.handle, connection.handle); + } + public RESULT disconnectAll(bool inputs, bool outputs) + { + return FMOD5_DSP_DisconnectAll(this.handle, inputs, outputs); + } + public RESULT getNumInputs(out int numinputs) + { + return FMOD5_DSP_GetNumInputs(this.handle, out numinputs); + } + public RESULT getNumOutputs(out int numoutputs) + { + return FMOD5_DSP_GetNumOutputs(this.handle, out numoutputs); + } + public RESULT getInput(int index, out DSP input, out DSPConnection inputconnection) + { + return FMOD5_DSP_GetInput(this.handle, index, out input.handle, out inputconnection.handle); + } + public RESULT getOutput(int index, out DSP output, out DSPConnection outputconnection) + { + return FMOD5_DSP_GetOutput(this.handle, index, out output.handle, out outputconnection.handle); + } + + // DSP unit control. + public RESULT setActive(bool active) + { + return FMOD5_DSP_SetActive(this.handle, active); + } + public RESULT getActive(out bool active) + { + return FMOD5_DSP_GetActive(this.handle, out active); + } + public RESULT setBypass(bool bypass) + { + return FMOD5_DSP_SetBypass(this.handle, bypass); + } + public RESULT getBypass(out bool bypass) + { + return FMOD5_DSP_GetBypass(this.handle, out bypass); + } + public RESULT setWetDryMix(float prewet, float postwet, float dry) + { + return FMOD5_DSP_SetWetDryMix(this.handle, prewet, postwet, dry); + } + public RESULT getWetDryMix(out float prewet, out float postwet, out float dry) + { + return FMOD5_DSP_GetWetDryMix(this.handle, out prewet, out postwet, out dry); + } + public RESULT setChannelFormat(CHANNELMASK channelmask, int numchannels, SPEAKERMODE source_speakermode) + { + return FMOD5_DSP_SetChannelFormat(this.handle, channelmask, numchannels, source_speakermode); + } + public RESULT getChannelFormat(out CHANNELMASK channelmask, out int numchannels, out SPEAKERMODE source_speakermode) + { + return FMOD5_DSP_GetChannelFormat(this.handle, out channelmask, out numchannels, out source_speakermode); + } + public RESULT getOutputChannelFormat(CHANNELMASK inmask, int inchannels, SPEAKERMODE inspeakermode, out CHANNELMASK outmask, out int outchannels, out SPEAKERMODE outspeakermode) + { + return FMOD5_DSP_GetOutputChannelFormat(this.handle, inmask, inchannels, inspeakermode, out outmask, out outchannels, out outspeakermode); + } + public RESULT reset() + { + return FMOD5_DSP_Reset(this.handle); + } + public RESULT setCallback(DSP_CALLBACK callback) + { + return FMOD5_DSP_SetCallback(this.handle, callback); + } + + // DSP parameter control. + public RESULT setParameterFloat(int index, float value) + { + return FMOD5_DSP_SetParameterFloat(this.handle, index, value); + } + public RESULT setParameterInt(int index, int value) + { + return FMOD5_DSP_SetParameterInt(this.handle, index, value); + } + public RESULT setParameterBool(int index, bool value) + { + return FMOD5_DSP_SetParameterBool(this.handle, index, value); + } + public RESULT setParameterData(int index, byte[] data) + { + return FMOD5_DSP_SetParameterData(this.handle, index, Marshal.UnsafeAddrOfPinnedArrayElement(data, 0), (uint)data.Length); + } + public RESULT getParameterFloat(int index, out float value) + { + return FMOD5_DSP_GetParameterFloat(this.handle, index, out value, IntPtr.Zero, 0); + } + public RESULT getParameterInt(int index, out int value) + { + return FMOD5_DSP_GetParameterInt(this.handle, index, out value, IntPtr.Zero, 0); + } + public RESULT getParameterBool(int index, out bool value) + { + return FMOD5_DSP_GetParameterBool(this.handle, index, out value, IntPtr.Zero, 0); + } + public RESULT getParameterData(int index, out IntPtr data, out uint length) + { + return FMOD5_DSP_GetParameterData(this.handle, index, out data, out length, IntPtr.Zero, 0); + } + public RESULT getNumParameters(out int numparams) + { + return FMOD5_DSP_GetNumParameters(this.handle, out numparams); + } + public RESULT getParameterInfo(int index, out DSP_PARAMETER_DESC desc) + { + IntPtr descPtr; + RESULT result = FMOD5_DSP_GetParameterInfo(this.handle, index, out descPtr); + desc = (DSP_PARAMETER_DESC)Marshal.PtrToStructure(descPtr); + return result; + } + public RESULT getDataParameterIndex(int datatype, out int index) + { + return FMOD5_DSP_GetDataParameterIndex(this.handle, datatype, out index); + } + public RESULT showConfigDialog(IntPtr hwnd, bool show) + { + return FMOD5_DSP_ShowConfigDialog(this.handle, hwnd, show); + } + + // DSP attributes. + public RESULT getInfo(out string name, out uint version, out int channels, out int configwidth, out int configheight) + { + IntPtr nameMem = Marshal.AllocHGlobal(32); + + RESULT result = FMOD5_DSP_GetInfo(this.handle, nameMem, out version, out channels, out configwidth, out configheight); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(nameMem); + } + Marshal.FreeHGlobal(nameMem); + return result; + } + public RESULT getInfo(out uint version, out int channels, out int configwidth, out int configheight) + { + return FMOD5_DSP_GetInfo(this.handle, IntPtr.Zero, out version, out channels, out configwidth, out configheight); ; + } + public RESULT getType(out DSP_TYPE type) + { + return FMOD5_DSP_GetType(this.handle, out type); + } + public RESULT getIdle(out bool idle) + { + return FMOD5_DSP_GetIdle(this.handle, out idle); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_DSP_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_DSP_GetUserData(this.handle, out userdata); + } + + // Metering. + public RESULT setMeteringEnabled(bool inputEnabled, bool outputEnabled) + { + return FMOD5_DSP_SetMeteringEnabled(this.handle, inputEnabled, outputEnabled); + } + public RESULT getMeteringEnabled(out bool inputEnabled, out bool outputEnabled) + { + return FMOD5_DSP_GetMeteringEnabled(this.handle, out inputEnabled, out outputEnabled); + } + + public RESULT getMeteringInfo(IntPtr zero, out DSP_METERING_INFO outputInfo) + { + return FMOD5_DSP_GetMeteringInfo(this.handle, zero, out outputInfo); + } + public RESULT getMeteringInfo(out DSP_METERING_INFO inputInfo, IntPtr zero) + { + return FMOD5_DSP_GetMeteringInfo(this.handle, out inputInfo, zero); + } + public RESULT getMeteringInfo(out DSP_METERING_INFO inputInfo, out DSP_METERING_INFO outputInfo) + { + return FMOD5_DSP_GetMeteringInfo(this.handle, out inputInfo, out outputInfo); + } + + public RESULT getCPUUsage(out uint exclusive, out uint inclusive) + { + return FMOD5_DSP_GetCPUUsage(this.handle, out exclusive, out inclusive); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_Release (IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetSystemObject (IntPtr dsp, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_AddInput (IntPtr dsp, IntPtr input, IntPtr zero, DSPCONNECTION_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_AddInput (IntPtr dsp, IntPtr input, out IntPtr connection, DSPCONNECTION_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_DisconnectFrom (IntPtr dsp, IntPtr target, IntPtr connection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_DisconnectAll (IntPtr dsp, bool inputs, bool outputs); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetNumInputs (IntPtr dsp, out int numinputs); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetNumOutputs (IntPtr dsp, out int numoutputs); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetInput (IntPtr dsp, int index, out IntPtr input, out IntPtr inputconnection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetOutput (IntPtr dsp, int index, out IntPtr output, out IntPtr outputconnection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetActive (IntPtr dsp, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetActive (IntPtr dsp, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetBypass (IntPtr dsp, bool bypass); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetBypass (IntPtr dsp, out bool bypass); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetWetDryMix (IntPtr dsp, float prewet, float postwet, float dry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetWetDryMix (IntPtr dsp, out float prewet, out float postwet, out float dry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetChannelFormat (IntPtr dsp, CHANNELMASK channelmask, int numchannels, SPEAKERMODE source_speakermode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetChannelFormat (IntPtr dsp, out CHANNELMASK channelmask, out int numchannels, out SPEAKERMODE source_speakermode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetOutputChannelFormat (IntPtr dsp, CHANNELMASK inmask, int inchannels, SPEAKERMODE inspeakermode, out CHANNELMASK outmask, out int outchannels, out SPEAKERMODE outspeakermode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_Reset (IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetCallback (IntPtr dsp, DSP_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterFloat (IntPtr dsp, int index, float value); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterInt (IntPtr dsp, int index, int value); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterBool (IntPtr dsp, int index, bool value); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterData (IntPtr dsp, int index, IntPtr data, uint length); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterFloat (IntPtr dsp, int index, out float value, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterInt (IntPtr dsp, int index, out int value, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterBool (IntPtr dsp, int index, out bool value, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterData (IntPtr dsp, int index, out IntPtr data, out uint length, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetNumParameters (IntPtr dsp, out int numparams); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterInfo (IntPtr dsp, int index, out IntPtr desc); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetDataParameterIndex (IntPtr dsp, int datatype, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_ShowConfigDialog (IntPtr dsp, IntPtr hwnd, bool show); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetInfo (IntPtr dsp, IntPtr name, out uint version, out int channels, out int configwidth, out int configheight); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetType (IntPtr dsp, out DSP_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetIdle (IntPtr dsp, out bool idle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetUserData (IntPtr dsp, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetUserData (IntPtr dsp, out IntPtr userdata); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_SetMeteringEnabled (IntPtr dsp, bool inputEnabled, bool outputEnabled); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringEnabled (IntPtr dsp, out bool inputEnabled, out bool outputEnabled); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, IntPtr zero, out DSP_METERING_INFO outputInfo); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, out DSP_METERING_INFO inputInfo, IntPtr zero); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, out DSP_METERING_INFO inputInfo, out DSP_METERING_INFO outputInfo); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetCPUUsage (IntPtr dsp, out uint exclusive, out uint inclusive); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public DSP(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'DSPConnection' API + */ + public struct DSPConnection + { + public RESULT getInput(out DSP input) + { + return FMOD5_DSPConnection_GetInput(this.handle, out input.handle); + } + public RESULT getOutput(out DSP output) + { + return FMOD5_DSPConnection_GetOutput(this.handle, out output.handle); + } + public RESULT setMix(float volume) + { + return FMOD5_DSPConnection_SetMix(this.handle, volume); + } + public RESULT getMix(out float volume) + { + return FMOD5_DSPConnection_GetMix(this.handle, out volume); + } + public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop = 0) + { + return FMOD5_DSPConnection_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); + } + public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop = 0) + { + return FMOD5_DSPConnection_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); + } + public RESULT getType(out DSPCONNECTION_TYPE type) + { + return FMOD5_DSPConnection_GetType(this.handle, out type); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_DSPConnection_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_DSPConnection_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetInput (IntPtr dspconnection, out IntPtr input); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetOutput (IntPtr dspconnection, out IntPtr output); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_SetMix (IntPtr dspconnection, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetMix (IntPtr dspconnection, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_SetMixMatrix (IntPtr dspconnection, float[] matrix, int outchannels, int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetMixMatrix (IntPtr dspconnection, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetType (IntPtr dspconnection, out DSPCONNECTION_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_SetUserData (IntPtr dspconnection, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetUserData (IntPtr dspconnection, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public DSPConnection(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'Geometry' API + */ + public struct Geometry + { + public RESULT release() + { + return FMOD5_Geometry_Release(this.handle); + } + + // Polygon manipulation. + public RESULT addPolygon(float directocclusion, float reverbocclusion, bool doublesided, int numvertices, VECTOR[] vertices, out int polygonindex) + { + return FMOD5_Geometry_AddPolygon(this.handle, directocclusion, reverbocclusion, doublesided, numvertices, vertices, out polygonindex); + } + public RESULT getNumPolygons(out int numpolygons) + { + return FMOD5_Geometry_GetNumPolygons(this.handle, out numpolygons); + } + public RESULT getMaxPolygons(out int maxpolygons, out int maxvertices) + { + return FMOD5_Geometry_GetMaxPolygons(this.handle, out maxpolygons, out maxvertices); + } + public RESULT getPolygonNumVertices(int index, out int numvertices) + { + return FMOD5_Geometry_GetPolygonNumVertices(this.handle, index, out numvertices); + } + public RESULT setPolygonVertex(int index, int vertexindex, ref VECTOR vertex) + { + return FMOD5_Geometry_SetPolygonVertex(this.handle, index, vertexindex, ref vertex); + } + public RESULT getPolygonVertex(int index, int vertexindex, out VECTOR vertex) + { + return FMOD5_Geometry_GetPolygonVertex(this.handle, index, vertexindex, out vertex); + } + public RESULT setPolygonAttributes(int index, float directocclusion, float reverbocclusion, bool doublesided) + { + return FMOD5_Geometry_SetPolygonAttributes(this.handle, index, directocclusion, reverbocclusion, doublesided); + } + public RESULT getPolygonAttributes(int index, out float directocclusion, out float reverbocclusion, out bool doublesided) + { + return FMOD5_Geometry_GetPolygonAttributes(this.handle, index, out directocclusion, out reverbocclusion, out doublesided); + } + + // Object manipulation. + public RESULT setActive(bool active) + { + return FMOD5_Geometry_SetActive(this.handle, active); + } + public RESULT getActive(out bool active) + { + return FMOD5_Geometry_GetActive(this.handle, out active); + } + public RESULT setRotation(ref VECTOR forward, ref VECTOR up) + { + return FMOD5_Geometry_SetRotation(this.handle, ref forward, ref up); + } + public RESULT getRotation(out VECTOR forward, out VECTOR up) + { + return FMOD5_Geometry_GetRotation(this.handle, out forward, out up); + } + public RESULT setPosition(ref VECTOR position) + { + return FMOD5_Geometry_SetPosition(this.handle, ref position); + } + public RESULT getPosition(out VECTOR position) + { + return FMOD5_Geometry_GetPosition(this.handle, out position); + } + public RESULT setScale(ref VECTOR scale) + { + return FMOD5_Geometry_SetScale(this.handle, ref scale); + } + public RESULT getScale(out VECTOR scale) + { + return FMOD5_Geometry_GetScale(this.handle, out scale); + } + public RESULT save(IntPtr data, out int datasize) + { + return FMOD5_Geometry_Save(this.handle, data, out datasize); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Geometry_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Geometry_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_Release (IntPtr geometry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_AddPolygon (IntPtr geometry, float directocclusion, float reverbocclusion, bool doublesided, int numvertices, VECTOR[] vertices, out int polygonindex); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetNumPolygons (IntPtr geometry, out int numpolygons); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetMaxPolygons (IntPtr geometry, out int maxpolygons, out int maxvertices); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPolygonNumVertices(IntPtr geometry, int index, out int numvertices); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetPolygonVertex (IntPtr geometry, int index, int vertexindex, ref VECTOR vertex); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPolygonVertex (IntPtr geometry, int index, int vertexindex, out VECTOR vertex); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetPolygonAttributes (IntPtr geometry, int index, float directocclusion, float reverbocclusion, bool doublesided); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPolygonAttributes (IntPtr geometry, int index, out float directocclusion, out float reverbocclusion, out bool doublesided); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetActive (IntPtr geometry, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetActive (IntPtr geometry, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetRotation (IntPtr geometry, ref VECTOR forward, ref VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetRotation (IntPtr geometry, out VECTOR forward, out VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetPosition (IntPtr geometry, ref VECTOR position); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPosition (IntPtr geometry, out VECTOR position); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetScale (IntPtr geometry, ref VECTOR scale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetScale (IntPtr geometry, out VECTOR scale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_Save (IntPtr geometry, IntPtr data, out int datasize); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetUserData (IntPtr geometry, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetUserData (IntPtr geometry, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Geometry(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'Reverb3D' API + */ + public struct Reverb3D + { + public RESULT release() + { + return FMOD5_Reverb3D_Release(this.handle); + } + + // Reverb manipulation. + public RESULT set3DAttributes(ref VECTOR position, float mindistance, float maxdistance) + { + return FMOD5_Reverb3D_Set3DAttributes(this.handle, ref position, mindistance, maxdistance); + } + public RESULT get3DAttributes(ref VECTOR position, ref float mindistance, ref float maxdistance) + { + return FMOD5_Reverb3D_Get3DAttributes(this.handle, ref position, ref mindistance, ref maxdistance); + } + public RESULT setProperties(ref REVERB_PROPERTIES properties) + { + return FMOD5_Reverb3D_SetProperties(this.handle, ref properties); + } + public RESULT getProperties(ref REVERB_PROPERTIES properties) + { + return FMOD5_Reverb3D_GetProperties(this.handle, ref properties); + } + public RESULT setActive(bool active) + { + return FMOD5_Reverb3D_SetActive(this.handle, active); + } + public RESULT getActive(out bool active) + { + return FMOD5_Reverb3D_GetActive(this.handle, out active); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Reverb3D_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Reverb3D_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_Release (IntPtr reverb3d); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_Set3DAttributes (IntPtr reverb3d, ref VECTOR position, float mindistance, float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_Get3DAttributes (IntPtr reverb3d, ref VECTOR position, ref float mindistance, ref float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_SetProperties (IntPtr reverb3d, ref REVERB_PROPERTIES properties); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_GetProperties (IntPtr reverb3d, ref REVERB_PROPERTIES properties); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_SetActive (IntPtr reverb3d, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_GetActive (IntPtr reverb3d, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_SetUserData (IntPtr reverb3d, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_GetUserData (IntPtr reverb3d, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Reverb3D(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + #region Helper Functions + [StructLayout(LayoutKind.Sequential)] + public struct StringWrapper + { + IntPtr nativeUtf8Ptr; + + public StringWrapper(IntPtr ptr) + { + nativeUtf8Ptr = ptr; + } + + public static implicit operator string(StringWrapper fstring) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return encoder.stringFromNative(fstring.nativeUtf8Ptr); + } + } + + public bool StartsWith(byte[] prefix) + { + if (nativeUtf8Ptr == IntPtr.Zero) + { + return false; + } + + for (int i = 0; i < prefix.Length; i++) + { + if (Marshal.ReadByte(nativeUtf8Ptr, i) != prefix[i]) + { + return false; + } + } + + return true; + } + + public bool Equals(byte[] comparison) + { + if (nativeUtf8Ptr == IntPtr.Zero) + { + return false; + } + + for (int i = 0; i < comparison.Length; i++) + { + if (Marshal.ReadByte(nativeUtf8Ptr, i) != comparison[i]) + { + return false; + } + } + + if (Marshal.ReadByte(nativeUtf8Ptr, comparison.Length) != 0) + { + return false; + } + + return true; + } + } + + static class StringHelper + { + public class ThreadSafeEncoding : IDisposable + { + UTF8Encoding encoding = new UTF8Encoding(); + byte[] encodedBuffer = new byte[128]; + char[] decodedBuffer = new char[128]; + bool inUse; + GCHandle gcHandle; + + public bool InUse() { return inUse; } + public void SetInUse() { inUse = true; } + + private int roundUpPowerTwo(int number) + { + int newNumber = 1; + while (newNumber <= number) + { + newNumber *= 2; + } + + return newNumber; + } + + public byte[] byteFromStringUTF8(string s) + { + if (s == null) + { + return null; + } + + int maximumLength = encoding.GetMaxByteCount(s.Length) + 1; // +1 for null terminator + if (maximumLength > encodedBuffer.Length) + { + int encodedLength = encoding.GetByteCount(s) + 1; // +1 for null terminator + if (encodedLength > encodedBuffer.Length) + { + encodedBuffer = new byte[roundUpPowerTwo(encodedLength)]; + } + } + + int byteCount = encoding.GetBytes(s, 0, s.Length, encodedBuffer, 0); + encodedBuffer[byteCount] = 0; // Apply null terminator + + return encodedBuffer; + } + + public IntPtr intptrFromStringUTF8(string s) + { + if (s == null) + { + return IntPtr.Zero; + } + + gcHandle = GCHandle.Alloc(byteFromStringUTF8(s), GCHandleType.Pinned); + return gcHandle.AddrOfPinnedObject(); + } + + public string stringFromNative(IntPtr nativePtr) + { + if (nativePtr == IntPtr.Zero) + { + return ""; + } + + int nativeLen = 0; + while (Marshal.ReadByte(nativePtr, nativeLen) != 0) + { + nativeLen++; + } + + if (nativeLen == 0) + { + return ""; + } + + if (nativeLen > encodedBuffer.Length) + { + encodedBuffer = new byte[roundUpPowerTwo(nativeLen)]; + } + + Marshal.Copy(nativePtr, encodedBuffer, 0, nativeLen); + + int maximumLength = encoding.GetMaxCharCount(nativeLen); + if (maximumLength > decodedBuffer.Length) + { + int decodedLength = encoding.GetCharCount(encodedBuffer, 0, nativeLen); + if (decodedLength > decodedBuffer.Length) + { + decodedBuffer = new char[roundUpPowerTwo(decodedLength)]; + } + } + + int charCount = encoding.GetChars(encodedBuffer, 0, nativeLen, decodedBuffer, 0); + + return new String(decodedBuffer, 0, charCount); + } + + public void Dispose() + { + if (gcHandle.IsAllocated) + { + gcHandle.Free(); + } + lock (encoders) + { + inUse = false; + } + } + } + + static List encoders = new List(1); + + public static ThreadSafeEncoding GetFreeHelper() + { + lock (encoders) + { + ThreadSafeEncoding helper = null; + // Search for not in use helper + for (int i = 0; i < encoders.Count; i++) + { + if (!encoders[i].InUse()) + { + helper = encoders[i]; + break; + } + } + // Otherwise create another helper + if (helper == null) + { + helper = new ThreadSafeEncoding(); + encoders.Add(helper); + } + helper.SetInUse(); + return helper; + } + } + } + + #endregion +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.h b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.h new file mode 100644 index 0000000..a72e0b5 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.h @@ -0,0 +1,668 @@ +/* ======================================================================================== */ +/* FMOD Core API - C header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header in conjunction with fmod_common.h (which contains all the constants / */ +/* callbacks) to develop using the C interface */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api.html */ +/* ======================================================================================== */ + +#ifndef _FMOD_H +#define _FMOD_H + +#include "fmod_common.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + FMOD global system functions (optional). +*/ +FMOD_RESULT F_API FMOD_Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags); +FMOD_RESULT F_API FMOD_Memory_GetStats (int *currentalloced, int *maxalloced, FMOD_BOOL blocking); +FMOD_RESULT F_API FMOD_Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode, FMOD_DEBUG_CALLBACK callback, const char *filename); +FMOD_RESULT F_API FMOD_File_SetDiskBusy (int busy); +FMOD_RESULT F_API FMOD_File_GetDiskBusy (int *busy); +FMOD_RESULT F_API FMOD_Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity, FMOD_THREAD_PRIORITY priority, FMOD_THREAD_STACK_SIZE stacksize); + +/* + FMOD System factory functions. Use this to create an FMOD System Instance. below you will see FMOD_System_Init/Close to get started. +*/ +FMOD_RESULT F_API FMOD_System_Create (FMOD_SYSTEM **system, unsigned int headerversion); +FMOD_RESULT F_API FMOD_System_Release (FMOD_SYSTEM *system); + +/* + 'System' API +*/ + +/* Setup functions. */ +FMOD_RESULT F_API FMOD_System_SetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE output); +FMOD_RESULT F_API FMOD_System_GetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE *output); +FMOD_RESULT F_API FMOD_System_GetNumDrivers (FMOD_SYSTEM *system, int *numdrivers); +FMOD_RESULT F_API FMOD_System_GetDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); +FMOD_RESULT F_API FMOD_System_SetDriver (FMOD_SYSTEM *system, int driver); +FMOD_RESULT F_API FMOD_System_GetDriver (FMOD_SYSTEM *system, int *driver); +FMOD_RESULT F_API FMOD_System_SetSoftwareChannels (FMOD_SYSTEM *system, int numsoftwarechannels); +FMOD_RESULT F_API FMOD_System_GetSoftwareChannels (FMOD_SYSTEM *system, int *numsoftwarechannels); +FMOD_RESULT F_API FMOD_System_SetSoftwareFormat (FMOD_SYSTEM *system, int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers); +FMOD_RESULT F_API FMOD_System_GetSoftwareFormat (FMOD_SYSTEM *system, int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers); +FMOD_RESULT F_API FMOD_System_SetDSPBufferSize (FMOD_SYSTEM *system, unsigned int bufferlength, int numbuffers); +FMOD_RESULT F_API FMOD_System_GetDSPBufferSize (FMOD_SYSTEM *system, unsigned int *bufferlength, int *numbuffers); +FMOD_RESULT F_API FMOD_System_SetFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); +FMOD_RESULT F_API FMOD_System_AttachFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek); +FMOD_RESULT F_API FMOD_System_SetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_System_GetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_System_SetCallback (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask); + +/* Plug-in support. */ +FMOD_RESULT F_API FMOD_System_SetPluginPath (FMOD_SYSTEM *system, const char *path); +FMOD_RESULT F_API FMOD_System_LoadPlugin (FMOD_SYSTEM *system, const char *filename, unsigned int *handle, unsigned int priority); +FMOD_RESULT F_API FMOD_System_UnloadPlugin (FMOD_SYSTEM *system, unsigned int handle); +FMOD_RESULT F_API FMOD_System_GetNumNestedPlugins (FMOD_SYSTEM *system, unsigned int handle, int *count); +FMOD_RESULT F_API FMOD_System_GetNestedPlugin (FMOD_SYSTEM *system, unsigned int handle, int index, unsigned int *nestedhandle); +FMOD_RESULT F_API FMOD_System_GetNumPlugins (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int *numplugins); +FMOD_RESULT F_API FMOD_System_GetPluginHandle (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_GetPluginInfo (FMOD_SYSTEM *system, unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version); +FMOD_RESULT F_API FMOD_System_SetOutputByPlugin (FMOD_SYSTEM *system, unsigned int handle); +FMOD_RESULT F_API FMOD_System_GetOutputByPlugin (FMOD_SYSTEM *system, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_CreateDSPByPlugin (FMOD_SYSTEM *system, unsigned int handle, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_GetDSPInfoByPlugin (FMOD_SYSTEM *system, unsigned int handle, const FMOD_DSP_DESCRIPTION **description); +FMOD_RESULT F_API FMOD_System_RegisterCodec (FMOD_SYSTEM *system, FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority); +FMOD_RESULT F_API FMOD_System_RegisterDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_RegisterOutput (FMOD_SYSTEM *system, const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle); + +/* Init/Close. */ +FMOD_RESULT F_API FMOD_System_Init (FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata); +FMOD_RESULT F_API FMOD_System_Close (FMOD_SYSTEM *system); + +/* General post-init system functions. */ +FMOD_RESULT F_API FMOD_System_Update (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_SetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float x, float y, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_System_GetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float *x, float *y, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_System_SetStreamBufferSize (FMOD_SYSTEM *system, unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype); +FMOD_RESULT F_API FMOD_System_GetStreamBufferSize (FMOD_SYSTEM *system, unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype); +FMOD_RESULT F_API FMOD_System_Set3DSettings (FMOD_SYSTEM *system, float dopplerscale, float distancefactor, float rolloffscale); +FMOD_RESULT F_API FMOD_System_Get3DSettings (FMOD_SYSTEM *system, float *dopplerscale, float *distancefactor, float *rolloffscale); +FMOD_RESULT F_API FMOD_System_Set3DNumListeners (FMOD_SYSTEM *system, int numlisteners); +FMOD_RESULT F_API FMOD_System_Get3DNumListeners (FMOD_SYSTEM *system, int *numlisteners); +FMOD_RESULT F_API FMOD_System_Set3DListenerAttributes (FMOD_SYSTEM *system, int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_System_Get3DListenerAttributes (FMOD_SYSTEM *system, int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_System_Set3DRolloffCallback (FMOD_SYSTEM *system, FMOD_3D_ROLLOFF_CALLBACK callback); +FMOD_RESULT F_API FMOD_System_MixerSuspend (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_MixerResume (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_GetDefaultMixMatrix (FMOD_SYSTEM *system, FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop); +FMOD_RESULT F_API FMOD_System_GetSpeakerModeChannels (FMOD_SYSTEM *system, FMOD_SPEAKERMODE mode, int *channels); + +/* System information functions. */ +FMOD_RESULT F_API FMOD_System_GetVersion (FMOD_SYSTEM *system, unsigned int *version, unsigned int *buildnumber); +FMOD_RESULT F_API FMOD_System_GetOutputHandle (FMOD_SYSTEM *system, void **handle); +FMOD_RESULT F_API FMOD_System_GetChannelsPlaying (FMOD_SYSTEM *system, int *channels, int *realchannels); +FMOD_RESULT F_API FMOD_System_GetCPUUsage (FMOD_SYSTEM *system, FMOD_CPU_USAGE *usage); +FMOD_RESULT F_API FMOD_System_GetFileUsage (FMOD_SYSTEM *system, long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead); + +/* Sound/DSP/Channel/FX creation and retrieval. */ +FMOD_RESULT F_API FMOD_System_CreateSound (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_System_CreateStream (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_System_CreateDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_CreateDSPByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_CreateChannelGroup (FMOD_SYSTEM *system, const char *name, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_System_CreateSoundGroup (FMOD_SYSTEM *system, const char *name, FMOD_SOUNDGROUP **soundgroup); +FMOD_RESULT F_API FMOD_System_CreateReverb3D (FMOD_SYSTEM *system, FMOD_REVERB3D **reverb); +FMOD_RESULT F_API FMOD_System_PlaySound (FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_PlayDSP (FMOD_SYSTEM *system, FMOD_DSP *dsp, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_GetChannel (FMOD_SYSTEM *system, int channelid, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_GetDSPInfoByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description); +FMOD_RESULT F_API FMOD_System_GetMasterChannelGroup (FMOD_SYSTEM *system, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_System_GetMasterSoundGroup (FMOD_SYSTEM *system, FMOD_SOUNDGROUP **soundgroup); + +/* Routing to ports. */ +FMOD_RESULT F_API FMOD_System_AttachChannelGroupToPort (FMOD_SYSTEM *system, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL passThru); +FMOD_RESULT F_API FMOD_System_DetachChannelGroupFromPort(FMOD_SYSTEM *system, FMOD_CHANNELGROUP *channelgroup); + +/* Reverb API. */ +FMOD_RESULT F_API FMOD_System_SetReverbProperties (FMOD_SYSTEM *system, int instance, const FMOD_REVERB_PROPERTIES *prop); +FMOD_RESULT F_API FMOD_System_GetReverbProperties (FMOD_SYSTEM *system, int instance, FMOD_REVERB_PROPERTIES *prop); + +/* System level DSP functionality. */ +FMOD_RESULT F_API FMOD_System_LockDSP (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_UnlockDSP (FMOD_SYSTEM *system); + +/* Recording API. */ +FMOD_RESULT F_API FMOD_System_GetRecordNumDrivers (FMOD_SYSTEM *system, int *numdrivers, int *numconnected); +FMOD_RESULT F_API FMOD_System_GetRecordDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state); +FMOD_RESULT F_API FMOD_System_GetRecordPosition (FMOD_SYSTEM *system, int id, unsigned int *position); +FMOD_RESULT F_API FMOD_System_RecordStart (FMOD_SYSTEM *system, int id, FMOD_SOUND *sound, FMOD_BOOL loop); +FMOD_RESULT F_API FMOD_System_RecordStop (FMOD_SYSTEM *system, int id); +FMOD_RESULT F_API FMOD_System_IsRecording (FMOD_SYSTEM *system, int id, FMOD_BOOL *recording); + +/* Geometry API. */ +FMOD_RESULT F_API FMOD_System_CreateGeometry (FMOD_SYSTEM *system, int maxpolygons, int maxvertices, FMOD_GEOMETRY **geometry); +FMOD_RESULT F_API FMOD_System_SetGeometrySettings (FMOD_SYSTEM *system, float maxworldsize); +FMOD_RESULT F_API FMOD_System_GetGeometrySettings (FMOD_SYSTEM *system, float *maxworldsize); +FMOD_RESULT F_API FMOD_System_LoadGeometry (FMOD_SYSTEM *system, const void *data, int datasize, FMOD_GEOMETRY **geometry); +FMOD_RESULT F_API FMOD_System_GetGeometryOcclusion (FMOD_SYSTEM *system, const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb); + +/* Network functions. */ +FMOD_RESULT F_API FMOD_System_SetNetworkProxy (FMOD_SYSTEM *system, const char *proxy); +FMOD_RESULT F_API FMOD_System_GetNetworkProxy (FMOD_SYSTEM *system, char *proxy, int proxylen); +FMOD_RESULT F_API FMOD_System_SetNetworkTimeout (FMOD_SYSTEM *system, int timeout); +FMOD_RESULT F_API FMOD_System_GetNetworkTimeout (FMOD_SYSTEM *system, int *timeout); + +/* Userdata set/get. */ +FMOD_RESULT F_API FMOD_System_SetUserData (FMOD_SYSTEM *system, void *userdata); +FMOD_RESULT F_API FMOD_System_GetUserData (FMOD_SYSTEM *system, void **userdata); + +/* Sound API +*/ + +FMOD_RESULT F_API FMOD_Sound_Release (FMOD_SOUND *sound); +FMOD_RESULT F_API FMOD_Sound_GetSystemObject (FMOD_SOUND *sound, FMOD_SYSTEM **system); + +/* + Standard sound manipulation functions. +*/ + +FMOD_RESULT F_API FMOD_Sound_Lock (FMOD_SOUND *sound, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); +FMOD_RESULT F_API FMOD_Sound_Unlock (FMOD_SOUND *sound, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); +FMOD_RESULT F_API FMOD_Sound_SetDefaults (FMOD_SOUND *sound, float frequency, int priority); +FMOD_RESULT F_API FMOD_Sound_GetDefaults (FMOD_SOUND *sound, float *frequency, int *priority); +FMOD_RESULT F_API FMOD_Sound_Set3DMinMaxDistance (FMOD_SOUND *sound, float min, float max); +FMOD_RESULT F_API FMOD_Sound_Get3DMinMaxDistance (FMOD_SOUND *sound, float *min, float *max); +FMOD_RESULT F_API FMOD_Sound_Set3DConeSettings (FMOD_SOUND *sound, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_Sound_Get3DConeSettings (FMOD_SOUND *sound, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_Sound_Set3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_Sound_Get3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_Sound_GetSubSound (FMOD_SOUND *sound, int index, FMOD_SOUND **subsound); +FMOD_RESULT F_API FMOD_Sound_GetSubSoundParent (FMOD_SOUND *sound, FMOD_SOUND **parentsound); +FMOD_RESULT F_API FMOD_Sound_GetName (FMOD_SOUND *sound, char *name, int namelen); +FMOD_RESULT F_API FMOD_Sound_GetLength (FMOD_SOUND *sound, unsigned int *length, FMOD_TIMEUNIT lengthtype); +FMOD_RESULT F_API FMOD_Sound_GetFormat (FMOD_SOUND *sound, FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits); +FMOD_RESULT F_API FMOD_Sound_GetNumSubSounds (FMOD_SOUND *sound, int *numsubsounds); +FMOD_RESULT F_API FMOD_Sound_GetNumTags (FMOD_SOUND *sound, int *numtags, int *numtagsupdated); +FMOD_RESULT F_API FMOD_Sound_GetTag (FMOD_SOUND *sound, const char *name, int index, FMOD_TAG *tag); +FMOD_RESULT F_API FMOD_Sound_GetOpenState (FMOD_SOUND *sound, FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, FMOD_BOOL *starving, FMOD_BOOL *diskbusy); +FMOD_RESULT F_API FMOD_Sound_ReadData (FMOD_SOUND *sound, void *buffer, unsigned int length, unsigned int *read); +FMOD_RESULT F_API FMOD_Sound_SeekData (FMOD_SOUND *sound, unsigned int pcm); + +FMOD_RESULT F_API FMOD_Sound_SetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP *soundgroup); +FMOD_RESULT F_API FMOD_Sound_GetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP **soundgroup); + +/* + Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. +*/ + +FMOD_RESULT F_API FMOD_Sound_GetNumSyncPoints (FMOD_SOUND *sound, int *numsyncpoints); +FMOD_RESULT F_API FMOD_Sound_GetSyncPoint (FMOD_SOUND *sound, int index, FMOD_SYNCPOINT **point); +FMOD_RESULT F_API FMOD_Sound_GetSyncPointInfo (FMOD_SOUND *sound, FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype); +FMOD_RESULT F_API FMOD_Sound_AddSyncPoint (FMOD_SOUND *sound, unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point); +FMOD_RESULT F_API FMOD_Sound_DeleteSyncPoint (FMOD_SOUND *sound, FMOD_SYNCPOINT *point); + +/* + Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. +*/ + +FMOD_RESULT F_API FMOD_Sound_SetMode (FMOD_SOUND *sound, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_Sound_GetMode (FMOD_SOUND *sound, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_Sound_SetLoopCount (FMOD_SOUND *sound, int loopcount); +FMOD_RESULT F_API FMOD_Sound_GetLoopCount (FMOD_SOUND *sound, int *loopcount); +FMOD_RESULT F_API FMOD_Sound_SetLoopPoints (FMOD_SOUND *sound, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); +FMOD_RESULT F_API FMOD_Sound_GetLoopPoints (FMOD_SOUND *sound, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + +/* + For MOD/S3M/XM/IT/MID sequenced formats only. +*/ + +FMOD_RESULT F_API FMOD_Sound_GetMusicNumChannels (FMOD_SOUND *sound, int *numchannels); +FMOD_RESULT F_API FMOD_Sound_SetMusicChannelVolume (FMOD_SOUND *sound, int channel, float volume); +FMOD_RESULT F_API FMOD_Sound_GetMusicChannelVolume (FMOD_SOUND *sound, int channel, float *volume); +FMOD_RESULT F_API FMOD_Sound_SetMusicSpeed (FMOD_SOUND *sound, float speed); +FMOD_RESULT F_API FMOD_Sound_GetMusicSpeed (FMOD_SOUND *sound, float *speed); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Sound_SetUserData (FMOD_SOUND *sound, void *userdata); +FMOD_RESULT F_API FMOD_Sound_GetUserData (FMOD_SOUND *sound, void **userdata); + +/* + 'Channel' API +*/ + +FMOD_RESULT F_API FMOD_Channel_GetSystemObject (FMOD_CHANNEL *channel, FMOD_SYSTEM **system); + +/* + General control functionality for Channels and ChannelGroups. +*/ + +FMOD_RESULT F_API FMOD_Channel_Stop (FMOD_CHANNEL *channel); +FMOD_RESULT F_API FMOD_Channel_SetPaused (FMOD_CHANNEL *channel, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Channel_GetPaused (FMOD_CHANNEL *channel, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Channel_SetVolume (FMOD_CHANNEL *channel, float volume); +FMOD_RESULT F_API FMOD_Channel_GetVolume (FMOD_CHANNEL *channel, float *volume); +FMOD_RESULT F_API FMOD_Channel_SetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL ramp); +FMOD_RESULT F_API FMOD_Channel_GetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL *ramp); +FMOD_RESULT F_API FMOD_Channel_GetAudibility (FMOD_CHANNEL *channel, float *audibility); +FMOD_RESULT F_API FMOD_Channel_SetPitch (FMOD_CHANNEL *channel, float pitch); +FMOD_RESULT F_API FMOD_Channel_GetPitch (FMOD_CHANNEL *channel, float *pitch); +FMOD_RESULT F_API FMOD_Channel_SetMute (FMOD_CHANNEL *channel, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_Channel_GetMute (FMOD_CHANNEL *channel, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_Channel_SetReverbProperties (FMOD_CHANNEL *channel, int instance, float wet); +FMOD_RESULT F_API FMOD_Channel_GetReverbProperties (FMOD_CHANNEL *channel, int instance, float *wet); +FMOD_RESULT F_API FMOD_Channel_SetLowPassGain (FMOD_CHANNEL *channel, float gain); +FMOD_RESULT F_API FMOD_Channel_GetLowPassGain (FMOD_CHANNEL *channel, float *gain); +FMOD_RESULT F_API FMOD_Channel_SetMode (FMOD_CHANNEL *channel, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_Channel_GetMode (FMOD_CHANNEL *channel, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_Channel_SetCallback (FMOD_CHANNEL *channel, FMOD_CHANNELCONTROL_CALLBACK callback); +FMOD_RESULT F_API FMOD_Channel_IsPlaying (FMOD_CHANNEL *channel, FMOD_BOOL *isplaying); + +/* + Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetPan (FMOD_CHANNEL *channel, float pan); +FMOD_RESULT F_API FMOD_Channel_SetMixLevelsOutput (FMOD_CHANNEL *channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); +FMOD_RESULT F_API FMOD_Channel_SetMixLevelsInput (FMOD_CHANNEL *channel, float *levels, int numlevels); +FMOD_RESULT F_API FMOD_Channel_SetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_Channel_GetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); + +/* + Clock based functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_GetDSPClock (FMOD_CHANNEL *channel, unsigned long long *dspclock, unsigned long long *parentclock); +FMOD_RESULT F_API FMOD_Channel_SetDelay (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels); +FMOD_RESULT F_API FMOD_Channel_GetDelay (FMOD_CHANNEL *channel, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels); +FMOD_RESULT F_API FMOD_Channel_AddFadePoint (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_Channel_SetFadePointRamp (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_Channel_RemoveFadePoints (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end); +FMOD_RESULT F_API FMOD_Channel_GetFadePoints (FMOD_CHANNEL *channel, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + +/* + DSP effects. +*/ + +FMOD_RESULT F_API FMOD_Channel_GetDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_Channel_AddDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_Channel_RemoveDSP (FMOD_CHANNEL *channel, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_Channel_GetNumDSPs (FMOD_CHANNEL *channel, int *numdsps); +FMOD_RESULT F_API FMOD_Channel_SetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int index); +FMOD_RESULT F_API FMOD_Channel_GetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int *index); + +/* + 3D functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_Set3DAttributes (FMOD_CHANNEL *channel, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_Channel_Get3DAttributes (FMOD_CHANNEL *channel, FMOD_VECTOR *pos, FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_Channel_Set3DMinMaxDistance (FMOD_CHANNEL *channel, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_Channel_Get3DMinMaxDistance (FMOD_CHANNEL *channel, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_Channel_Set3DConeSettings (FMOD_CHANNEL *channel, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_Channel_Get3DConeSettings (FMOD_CHANNEL *channel, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_Channel_Set3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_Channel_Get3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_Channel_Set3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_Channel_Get3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_Channel_Set3DOcclusion (FMOD_CHANNEL *channel, float directocclusion, float reverbocclusion); +FMOD_RESULT F_API FMOD_Channel_Get3DOcclusion (FMOD_CHANNEL *channel, float *directocclusion, float *reverbocclusion); +FMOD_RESULT F_API FMOD_Channel_Set3DSpread (FMOD_CHANNEL *channel, float angle); +FMOD_RESULT F_API FMOD_Channel_Get3DSpread (FMOD_CHANNEL *channel, float *angle); +FMOD_RESULT F_API FMOD_Channel_Set3DLevel (FMOD_CHANNEL *channel, float level); +FMOD_RESULT F_API FMOD_Channel_Get3DLevel (FMOD_CHANNEL *channel, float *level); +FMOD_RESULT F_API FMOD_Channel_Set3DDopplerLevel (FMOD_CHANNEL *channel, float level); +FMOD_RESULT F_API FMOD_Channel_Get3DDopplerLevel (FMOD_CHANNEL *channel, float *level); +FMOD_RESULT F_API FMOD_Channel_Set3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL custom, float customLevel, float centerFreq); +FMOD_RESULT F_API FMOD_Channel_Get3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL *custom, float *customLevel, float *centerFreq); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetUserData (FMOD_CHANNEL *channel, void *userdata); +FMOD_RESULT F_API FMOD_Channel_GetUserData (FMOD_CHANNEL *channel, void **userdata); + +/* + Channel specific control functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetFrequency (FMOD_CHANNEL *channel, float frequency); +FMOD_RESULT F_API FMOD_Channel_GetFrequency (FMOD_CHANNEL *channel, float *frequency); +FMOD_RESULT F_API FMOD_Channel_SetPriority (FMOD_CHANNEL *channel, int priority); +FMOD_RESULT F_API FMOD_Channel_GetPriority (FMOD_CHANNEL *channel, int *priority); +FMOD_RESULT F_API FMOD_Channel_SetPosition (FMOD_CHANNEL *channel, unsigned int position, FMOD_TIMEUNIT postype); +FMOD_RESULT F_API FMOD_Channel_GetPosition (FMOD_CHANNEL *channel, unsigned int *position, FMOD_TIMEUNIT postype); +FMOD_RESULT F_API FMOD_Channel_SetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP *channelgroup); +FMOD_RESULT F_API FMOD_Channel_GetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_Channel_SetLoopCount (FMOD_CHANNEL *channel, int loopcount); +FMOD_RESULT F_API FMOD_Channel_GetLoopCount (FMOD_CHANNEL *channel, int *loopcount); +FMOD_RESULT F_API FMOD_Channel_SetLoopPoints (FMOD_CHANNEL *channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); +FMOD_RESULT F_API FMOD_Channel_GetLoopPoints (FMOD_CHANNEL *channel, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_Channel_IsVirtual (FMOD_CHANNEL *channel, FMOD_BOOL *isvirtual); +FMOD_RESULT F_API FMOD_Channel_GetCurrentSound (FMOD_CHANNEL *channel, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_Channel_GetIndex (FMOD_CHANNEL *channel, int *index); + +/* + 'ChannelGroup' API +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetSystemObject (FMOD_CHANNELGROUP *channelgroup, FMOD_SYSTEM **system); + +/* + General control functionality for Channels and ChannelGroups. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_Stop (FMOD_CHANNELGROUP *channelgroup); +FMOD_RESULT F_API FMOD_ChannelGroup_SetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_ChannelGroup_GetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_ChannelGroup_SetVolume (FMOD_CHANNELGROUP *channelgroup, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_GetVolume (FMOD_CHANNELGROUP *channelgroup, float *volume); +FMOD_RESULT F_API FMOD_ChannelGroup_SetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL ramp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *ramp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetAudibility (FMOD_CHANNELGROUP *channelgroup, float *audibility); +FMOD_RESULT F_API FMOD_ChannelGroup_SetPitch (FMOD_CHANNELGROUP *channelgroup, float pitch); +FMOD_RESULT F_API FMOD_ChannelGroup_GetPitch (FMOD_CHANNELGROUP *channelgroup, float *pitch); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_ChannelGroup_SetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float wet); +FMOD_RESULT F_API FMOD_ChannelGroup_GetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float *wet); +FMOD_RESULT F_API FMOD_ChannelGroup_SetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float gain); +FMOD_RESULT F_API FMOD_ChannelGroup_GetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float *gain); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_ChannelGroup_SetCallback (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELCONTROL_CALLBACK callback); +FMOD_RESULT F_API FMOD_ChannelGroup_IsPlaying (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *isplaying); + +/* + Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_SetPan (FMOD_CHANNELGROUP *channelgroup, float pan); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsOutput (FMOD_CHANNELGROUP *channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsInput (FMOD_CHANNELGROUP *channelgroup, float *levels, int numlevels); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); + +/* + Clock based functionality. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPClock (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock, unsigned long long *parentclock); +FMOD_RESULT F_API FMOD_ChannelGroup_SetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_GetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_AddFadePoint (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_SetFadePointRamp (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_RemoveFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end); +FMOD_RESULT F_API FMOD_ChannelGroup_GetFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + +/* + DSP effects. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_AddDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_RemoveDSP (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumDSPs (FMOD_CHANNELGROUP *channelgroup, int *numdsps); +FMOD_RESULT F_API FMOD_ChannelGroup_SetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int index); +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int *index); + +/* + 3D functionality. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DAttributes (FMOD_CHANNELGROUP *channelgroup, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DAttributes (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *pos, FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float directocclusion, float reverbocclusion); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float *directocclusion, float *reverbocclusion); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DSpread (FMOD_CHANNELGROUP *channelgroup, float angle); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DSpread (FMOD_CHANNELGROUP *channelgroup, float *angle); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DLevel (FMOD_CHANNELGROUP *channelgroup, float level); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DLevel (FMOD_CHANNELGROUP *channelgroup, float *level); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float level); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float *level); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL custom, float customLevel, float centerFreq); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *custom, float *customLevel, float *centerFreq); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_SetUserData (FMOD_CHANNELGROUP *channelgroup, void *userdata); +FMOD_RESULT F_API FMOD_ChannelGroup_GetUserData (FMOD_CHANNELGROUP *channelgroup, void **userdata); + +FMOD_RESULT F_API FMOD_ChannelGroup_Release (FMOD_CHANNELGROUP *channelgroup); + +/* + Nested channel groups. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_AddGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP *group, FMOD_BOOL propagatedspclock, FMOD_DSPCONNECTION **connection); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumGroups (FMOD_CHANNELGROUP *channelgroup, int *numgroups); +FMOD_RESULT F_API FMOD_ChannelGroup_GetGroup (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_ChannelGroup_GetParentGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP **group); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetName (FMOD_CHANNELGROUP *channelgroup, char *name, int namelen); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumChannels (FMOD_CHANNELGROUP *channelgroup, int *numchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_GetChannel (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNEL **channel); + +/* + 'SoundGroup' API +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_Release (FMOD_SOUNDGROUP *soundgroup); +FMOD_RESULT F_API FMOD_SoundGroup_GetSystemObject (FMOD_SOUNDGROUP *soundgroup, FMOD_SYSTEM **system); + +/* + SoundGroup control functions. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int maxaudible); +FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int *maxaudible); +FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR behavior); +FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR *behavior); +FMOD_RESULT F_API FMOD_SoundGroup_SetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float speed); +FMOD_RESULT F_API FMOD_SoundGroup_GetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float *speed); +FMOD_RESULT F_API FMOD_SoundGroup_SetVolume (FMOD_SOUNDGROUP *soundgroup, float volume); +FMOD_RESULT F_API FMOD_SoundGroup_GetVolume (FMOD_SOUNDGROUP *soundgroup, float *volume); +FMOD_RESULT F_API FMOD_SoundGroup_Stop (FMOD_SOUNDGROUP *soundgroup); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_GetName (FMOD_SOUNDGROUP *soundgroup, char *name, int namelen); +FMOD_RESULT F_API FMOD_SoundGroup_GetNumSounds (FMOD_SOUNDGROUP *soundgroup, int *numsounds); +FMOD_RESULT F_API FMOD_SoundGroup_GetSound (FMOD_SOUNDGROUP *soundgroup, int index, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_SoundGroup_GetNumPlaying (FMOD_SOUNDGROUP *soundgroup, int *numplaying); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_SetUserData (FMOD_SOUNDGROUP *soundgroup, void *userdata); +FMOD_RESULT F_API FMOD_SoundGroup_GetUserData (FMOD_SOUNDGROUP *soundgroup, void **userdata); + +/* + 'DSP' API +*/ + +FMOD_RESULT F_API FMOD_DSP_Release (FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_DSP_GetSystemObject (FMOD_DSP *dsp, FMOD_SYSTEM **system); + +/* + Connection / disconnection / input and output enumeration. +*/ + +FMOD_RESULT F_API FMOD_DSP_AddInput (FMOD_DSP *dsp, FMOD_DSP *input, FMOD_DSPCONNECTION **connection, FMOD_DSPCONNECTION_TYPE type); +FMOD_RESULT F_API FMOD_DSP_DisconnectFrom (FMOD_DSP *dsp, FMOD_DSP *target, FMOD_DSPCONNECTION *connection); +FMOD_RESULT F_API FMOD_DSP_DisconnectAll (FMOD_DSP *dsp, FMOD_BOOL inputs, FMOD_BOOL outputs); +FMOD_RESULT F_API FMOD_DSP_GetNumInputs (FMOD_DSP *dsp, int *numinputs); +FMOD_RESULT F_API FMOD_DSP_GetNumOutputs (FMOD_DSP *dsp, int *numoutputs); +FMOD_RESULT F_API FMOD_DSP_GetInput (FMOD_DSP *dsp, int index, FMOD_DSP **input, FMOD_DSPCONNECTION **inputconnection); +FMOD_RESULT F_API FMOD_DSP_GetOutput (FMOD_DSP *dsp, int index, FMOD_DSP **output, FMOD_DSPCONNECTION **outputconnection); + +/* + DSP unit control. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetActive (FMOD_DSP *dsp, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_DSP_GetActive (FMOD_DSP *dsp, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_DSP_SetBypass (FMOD_DSP *dsp, FMOD_BOOL bypass); +FMOD_RESULT F_API FMOD_DSP_GetBypass (FMOD_DSP *dsp, FMOD_BOOL *bypass); +FMOD_RESULT F_API FMOD_DSP_SetWetDryMix (FMOD_DSP *dsp, float prewet, float postwet, float dry); +FMOD_RESULT F_API FMOD_DSP_GetWetDryMix (FMOD_DSP *dsp, float *prewet, float *postwet, float *dry); +FMOD_RESULT F_API FMOD_DSP_SetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode); +FMOD_RESULT F_API FMOD_DSP_GetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode); +FMOD_RESULT F_API FMOD_DSP_GetOutputChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode); +FMOD_RESULT F_API FMOD_DSP_Reset (FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_DSP_SetCallback (FMOD_DSP *dsp, FMOD_DSP_CALLBACK callback); + +/* + DSP parameter control. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetParameterFloat (FMOD_DSP *dsp, int index, float value); +FMOD_RESULT F_API FMOD_DSP_SetParameterInt (FMOD_DSP *dsp, int index, int value); +FMOD_RESULT F_API FMOD_DSP_SetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL value); +FMOD_RESULT F_API FMOD_DSP_SetParameterData (FMOD_DSP *dsp, int index, void *data, unsigned int length); +FMOD_RESULT F_API FMOD_DSP_GetParameterFloat (FMOD_DSP *dsp, int index, float *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterInt (FMOD_DSP *dsp, int index, int *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterData (FMOD_DSP *dsp, int index, void **data, unsigned int *length, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetNumParameters (FMOD_DSP *dsp, int *numparams); +FMOD_RESULT F_API FMOD_DSP_GetParameterInfo (FMOD_DSP *dsp, int index, FMOD_DSP_PARAMETER_DESC **desc); +FMOD_RESULT F_API FMOD_DSP_GetDataParameterIndex (FMOD_DSP *dsp, int datatype, int *index); +FMOD_RESULT F_API FMOD_DSP_ShowConfigDialog (FMOD_DSP *dsp, void *hwnd, FMOD_BOOL show); + +/* + DSP attributes. +*/ + +FMOD_RESULT F_API FMOD_DSP_GetInfo (FMOD_DSP *dsp, char *name, unsigned int *version, int *channels, int *configwidth, int *configheight); +FMOD_RESULT F_API FMOD_DSP_GetType (FMOD_DSP *dsp, FMOD_DSP_TYPE *type); +FMOD_RESULT F_API FMOD_DSP_GetIdle (FMOD_DSP *dsp, FMOD_BOOL *idle); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetUserData (FMOD_DSP *dsp, void *userdata); +FMOD_RESULT F_API FMOD_DSP_GetUserData (FMOD_DSP *dsp, void **userdata); + +/* + Metering. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL inputEnabled, FMOD_BOOL outputEnabled); +FMOD_RESULT F_API FMOD_DSP_GetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL *inputEnabled, FMOD_BOOL *outputEnabled); +FMOD_RESULT F_API FMOD_DSP_GetMeteringInfo (FMOD_DSP *dsp, FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo); +FMOD_RESULT F_API FMOD_DSP_GetCPUUsage (FMOD_DSP *dsp, unsigned int *exclusive, unsigned int *inclusive); + +/* + 'DSPConnection' API +*/ + +FMOD_RESULT F_API FMOD_DSPConnection_GetInput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **input); +FMOD_RESULT F_API FMOD_DSPConnection_GetOutput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **output); +FMOD_RESULT F_API FMOD_DSPConnection_SetMix (FMOD_DSPCONNECTION *dspconnection, float volume); +FMOD_RESULT F_API FMOD_DSPConnection_GetMix (FMOD_DSPCONNECTION *dspconnection, float *volume); +FMOD_RESULT F_API FMOD_DSPConnection_SetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_DSPConnection_GetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_DSPConnection_GetType (FMOD_DSPCONNECTION *dspconnection, FMOD_DSPCONNECTION_TYPE *type); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_DSPConnection_SetUserData (FMOD_DSPCONNECTION *dspconnection, void *userdata); +FMOD_RESULT F_API FMOD_DSPConnection_GetUserData (FMOD_DSPCONNECTION *dspconnection, void **userdata); + +/* + 'Geometry' API +*/ + +FMOD_RESULT F_API FMOD_Geometry_Release (FMOD_GEOMETRY *geometry); + +/* + Polygon manipulation. +*/ + +FMOD_RESULT F_API FMOD_Geometry_AddPolygon (FMOD_GEOMETRY *geometry, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex); +FMOD_RESULT F_API FMOD_Geometry_GetNumPolygons (FMOD_GEOMETRY *geometry, int *numpolygons); +FMOD_RESULT F_API FMOD_Geometry_GetMaxPolygons (FMOD_GEOMETRY *geometry, int *maxpolygons, int *maxvertices); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonNumVertices (FMOD_GEOMETRY *geometry, int index, int *numvertices); +FMOD_RESULT F_API FMOD_Geometry_SetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, const FMOD_VECTOR *vertex); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, FMOD_VECTOR *vertex); +FMOD_RESULT F_API FMOD_Geometry_SetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float *directocclusion, float *reverbocclusion, FMOD_BOOL *doublesided); + +/* + Object manipulation. +*/ + +FMOD_RESULT F_API FMOD_Geometry_SetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_Geometry_GetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_Geometry_SetRotation (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_Geometry_GetRotation (FMOD_GEOMETRY *geometry, FMOD_VECTOR *forward, FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_Geometry_SetPosition (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *position); +FMOD_RESULT F_API FMOD_Geometry_GetPosition (FMOD_GEOMETRY *geometry, FMOD_VECTOR *position); +FMOD_RESULT F_API FMOD_Geometry_SetScale (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *scale); +FMOD_RESULT F_API FMOD_Geometry_GetScale (FMOD_GEOMETRY *geometry, FMOD_VECTOR *scale); +FMOD_RESULT F_API FMOD_Geometry_Save (FMOD_GEOMETRY *geometry, void *data, int *datasize); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Geometry_SetUserData (FMOD_GEOMETRY *geometry, void *userdata); +FMOD_RESULT F_API FMOD_Geometry_GetUserData (FMOD_GEOMETRY *geometry, void **userdata); + +/* + 'Reverb3D' API +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_Release (FMOD_REVERB3D *reverb3d); + +/* + Reverb manipulation. +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_Set3DAttributes (FMOD_REVERB3D *reverb3d, const FMOD_VECTOR *position, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_Reverb3D_Get3DAttributes (FMOD_REVERB3D *reverb3d, FMOD_VECTOR *position, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_Reverb3D_SetProperties (FMOD_REVERB3D *reverb3d, const FMOD_REVERB_PROPERTIES *properties); +FMOD_RESULT F_API FMOD_Reverb3D_GetProperties (FMOD_REVERB3D *reverb3d, FMOD_REVERB_PROPERTIES *properties); +FMOD_RESULT F_API FMOD_Reverb3D_SetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_Reverb3D_GetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL *active); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_SetUserData (FMOD_REVERB3D *reverb3d, void *userdata); +FMOD_RESULT F_API FMOD_Reverb3D_GetUserData (FMOD_REVERB3D *reverb3d, void **userdata); + +#ifdef __cplusplus +} +#endif + +#endif /* _FMOD_H */ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.hpp b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.hpp new file mode 100644 index 0000000..800129c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod.hpp @@ -0,0 +1,607 @@ +/* ======================================================================================== */ +/* FMOD Core API - C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header in conjunction with fmod_common.h (which contains all the constants / */ +/* callbacks) to develop using the C++ language. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api.html */ +/* ======================================================================================== */ +#ifndef _FMOD_HPP +#define _FMOD_HPP + +#include "fmod_common.h" +#include "fmod.h" + +/* + FMOD Namespace +*/ +namespace FMOD +{ + class System; + class Sound; + class ChannelControl; + class Channel; + class ChannelGroup; + class SoundGroup; + class DSP; + class DSPConnection; + class Geometry; + class Reverb3D; + + /* + FMOD global system functions (optional). + */ + inline FMOD_RESULT Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags = FMOD_MEMORY_ALL) { return FMOD_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); } + inline FMOD_RESULT Memory_GetStats (int *currentalloced, int *maxalloced, bool blocking = true) { return FMOD_Memory_GetStats(currentalloced, maxalloced, blocking); } + inline FMOD_RESULT Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode = FMOD_DEBUG_MODE_TTY, FMOD_DEBUG_CALLBACK callback = 0, const char *filename = 0) { return FMOD_Debug_Initialize(flags, mode, callback, filename); } + inline FMOD_RESULT File_SetDiskBusy (int busy) { return FMOD_File_SetDiskBusy(busy); } + inline FMOD_RESULT File_GetDiskBusy (int *busy) { return FMOD_File_GetDiskBusy(busy); } + inline FMOD_RESULT Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity = FMOD_THREAD_AFFINITY_GROUP_DEFAULT, FMOD_THREAD_PRIORITY priority = FMOD_THREAD_PRIORITY_DEFAULT, FMOD_THREAD_STACK_SIZE stacksize = FMOD_THREAD_STACK_SIZE_DEFAULT) { return FMOD_Thread_SetAttributes(type, affinity, priority, stacksize); } + + /* + FMOD System factory functions. + */ + inline FMOD_RESULT System_Create (System **system, unsigned int headerversion = FMOD_VERSION) { return FMOD_System_Create((FMOD_SYSTEM **)system, headerversion); } + + /* + 'System' API + */ + class System + { + private: + + // Constructor made private so user cannot statically instance a System class. System_Create must be used. + System(); + System(const System &); + + public: + + FMOD_RESULT F_API release (); + + // Setup functions. + FMOD_RESULT F_API setOutput (FMOD_OUTPUTTYPE output); + FMOD_RESULT F_API getOutput (FMOD_OUTPUTTYPE *output); + FMOD_RESULT F_API getNumDrivers (int *numdrivers); + FMOD_RESULT F_API getDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); + FMOD_RESULT F_API setDriver (int driver); + FMOD_RESULT F_API getDriver (int *driver); + FMOD_RESULT F_API setSoftwareChannels (int numsoftwarechannels); + FMOD_RESULT F_API getSoftwareChannels (int *numsoftwarechannels); + FMOD_RESULT F_API setSoftwareFormat (int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers); + FMOD_RESULT F_API getSoftwareFormat (int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers); + FMOD_RESULT F_API setDSPBufferSize (unsigned int bufferlength, int numbuffers); + FMOD_RESULT F_API getDSPBufferSize (unsigned int *bufferlength, int *numbuffers); + FMOD_RESULT F_API setFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); + FMOD_RESULT F_API attachFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek); + FMOD_RESULT F_API setAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API getAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API setCallback (FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_SYSTEM_CALLBACK_ALL); + + // Plug-in support. + FMOD_RESULT F_API setPluginPath (const char *path); + FMOD_RESULT F_API loadPlugin (const char *filename, unsigned int *handle, unsigned int priority = 0); + FMOD_RESULT F_API unloadPlugin (unsigned int handle); + FMOD_RESULT F_API getNumNestedPlugins (unsigned int handle, int *count); + FMOD_RESULT F_API getNestedPlugin (unsigned int handle, int index, unsigned int *nestedhandle); + FMOD_RESULT F_API getNumPlugins (FMOD_PLUGINTYPE plugintype, int *numplugins); + FMOD_RESULT F_API getPluginHandle (FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle); + FMOD_RESULT F_API getPluginInfo (unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version); + FMOD_RESULT F_API setOutputByPlugin (unsigned int handle); + FMOD_RESULT F_API getOutputByPlugin (unsigned int *handle); + FMOD_RESULT F_API createDSPByPlugin (unsigned int handle, DSP **dsp); + FMOD_RESULT F_API getDSPInfoByPlugin (unsigned int handle, const FMOD_DSP_DESCRIPTION **description); + FMOD_RESULT F_API registerCodec (FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority = 0); + FMOD_RESULT F_API registerDSP (const FMOD_DSP_DESCRIPTION *description, unsigned int *handle); + FMOD_RESULT F_API registerOutput (const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle); + + // Init/Close. + FMOD_RESULT F_API init (int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata); + FMOD_RESULT F_API close (); + + // General post-init system functions. + FMOD_RESULT F_API update (); /* IMPORTANT! CALL THIS ONCE PER FRAME! */ + + FMOD_RESULT F_API setSpeakerPosition (FMOD_SPEAKER speaker, float x, float y, bool active); + FMOD_RESULT F_API getSpeakerPosition (FMOD_SPEAKER speaker, float *x, float *y, bool *active); + FMOD_RESULT F_API setStreamBufferSize (unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype); + FMOD_RESULT F_API getStreamBufferSize (unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype); + FMOD_RESULT F_API set3DSettings (float dopplerscale, float distancefactor, float rolloffscale); + FMOD_RESULT F_API get3DSettings (float *dopplerscale, float *distancefactor, float *rolloffscale); + FMOD_RESULT F_API set3DNumListeners (int numlisteners); + FMOD_RESULT F_API get3DNumListeners (int *numlisteners); + FMOD_RESULT F_API set3DListenerAttributes (int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); + FMOD_RESULT F_API get3DListenerAttributes (int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up); + FMOD_RESULT F_API set3DRolloffCallback (FMOD_3D_ROLLOFF_CALLBACK callback); + FMOD_RESULT F_API mixerSuspend (); + FMOD_RESULT F_API mixerResume (); + FMOD_RESULT F_API getDefaultMixMatrix (FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop); + FMOD_RESULT F_API getSpeakerModeChannels (FMOD_SPEAKERMODE mode, int *channels); + + // System information functions. + FMOD_RESULT F_API getVersion (unsigned int *version, unsigned int *buildnumber = 0); + FMOD_RESULT F_API getOutputHandle (void **handle); + FMOD_RESULT F_API getChannelsPlaying (int *channels, int *realchannels = 0); + FMOD_RESULT F_API getCPUUsage (FMOD_CPU_USAGE *usage); + FMOD_RESULT F_API getFileUsage (long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead); + + // Sound/DSP/Channel/FX creation and retrieval. + FMOD_RESULT F_API createSound (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound); + FMOD_RESULT F_API createStream (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound); + FMOD_RESULT F_API createDSP (const FMOD_DSP_DESCRIPTION *description, DSP **dsp); + FMOD_RESULT F_API createDSPByType (FMOD_DSP_TYPE type, DSP **dsp); + FMOD_RESULT F_API createChannelGroup (const char *name, ChannelGroup **channelgroup); + FMOD_RESULT F_API createSoundGroup (const char *name, SoundGroup **soundgroup); + FMOD_RESULT F_API createReverb3D (Reverb3D **reverb); + + FMOD_RESULT F_API playSound (Sound *sound, ChannelGroup *channelgroup, bool paused, Channel **channel); + FMOD_RESULT F_API playDSP (DSP *dsp, ChannelGroup *channelgroup, bool paused, Channel **channel); + FMOD_RESULT F_API getChannel (int channelid, Channel **channel); + FMOD_RESULT F_API getDSPInfoByType (FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description); + FMOD_RESULT F_API getMasterChannelGroup (ChannelGroup **channelgroup); + FMOD_RESULT F_API getMasterSoundGroup (SoundGroup **soundgroup); + + // Routing to ports. + FMOD_RESULT F_API attachChannelGroupToPort (FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, ChannelGroup *channelgroup, bool passThru = false); + FMOD_RESULT F_API detachChannelGroupFromPort (ChannelGroup *channelgroup); + + // Reverb API. + FMOD_RESULT F_API setReverbProperties (int instance, const FMOD_REVERB_PROPERTIES *prop); + FMOD_RESULT F_API getReverbProperties (int instance, FMOD_REVERB_PROPERTIES *prop); + + // System level DSP functionality. + FMOD_RESULT F_API lockDSP (); + FMOD_RESULT F_API unlockDSP (); + + // Recording API. + FMOD_RESULT F_API getRecordNumDrivers (int *numdrivers, int *numconnected); + FMOD_RESULT F_API getRecordDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state); + FMOD_RESULT F_API getRecordPosition (int id, unsigned int *position); + FMOD_RESULT F_API recordStart (int id, Sound *sound, bool loop); + FMOD_RESULT F_API recordStop (int id); + FMOD_RESULT F_API isRecording (int id, bool *recording); + + // Geometry API. + FMOD_RESULT F_API createGeometry (int maxpolygons, int maxvertices, Geometry **geometry); + FMOD_RESULT F_API setGeometrySettings (float maxworldsize); + FMOD_RESULT F_API getGeometrySettings (float *maxworldsize); + FMOD_RESULT F_API loadGeometry (const void *data, int datasize, Geometry **geometry); + FMOD_RESULT F_API getGeometryOcclusion (const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb); + + // Network functions. + FMOD_RESULT F_API setNetworkProxy (const char *proxy); + FMOD_RESULT F_API getNetworkProxy (char *proxy, int proxylen); + FMOD_RESULT F_API setNetworkTimeout (int timeout); + FMOD_RESULT F_API getNetworkTimeout (int *timeout); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'Sound' API + */ + class Sound + { + private: + + // Constructor made private so user cannot statically instance a Sound class. Appropriate Sound creation or retrieval function must be used. + Sound(); + Sound(const Sound &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // Standard sound manipulation functions. + FMOD_RESULT F_API lock (unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); + FMOD_RESULT F_API unlock (void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); + FMOD_RESULT F_API setDefaults (float frequency, int priority); + FMOD_RESULT F_API getDefaults (float *frequency, int *priority); + FMOD_RESULT F_API set3DMinMaxDistance (float min, float max); + FMOD_RESULT F_API get3DMinMaxDistance (float *min, float *max); + FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume); + FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints); + FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints); + FMOD_RESULT F_API getSubSound (int index, Sound **subsound); + FMOD_RESULT F_API getSubSoundParent (Sound **parentsound); + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getLength (unsigned int *length, FMOD_TIMEUNIT lengthtype); + FMOD_RESULT F_API getFormat (FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits); + FMOD_RESULT F_API getNumSubSounds (int *numsubsounds); + FMOD_RESULT F_API getNumTags (int *numtags, int *numtagsupdated); + FMOD_RESULT F_API getTag (const char *name, int index, FMOD_TAG *tag); + FMOD_RESULT F_API getOpenState (FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, bool *starving, bool *diskbusy); + FMOD_RESULT F_API readData (void *buffer, unsigned int length, unsigned int *read); + FMOD_RESULT F_API seekData (unsigned int pcm); + + FMOD_RESULT F_API setSoundGroup (SoundGroup *soundgroup); + FMOD_RESULT F_API getSoundGroup (SoundGroup **soundgroup); + + // Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. + FMOD_RESULT F_API getNumSyncPoints (int *numsyncpoints); + FMOD_RESULT F_API getSyncPoint (int index, FMOD_SYNCPOINT **point); + FMOD_RESULT F_API getSyncPointInfo (FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype); + FMOD_RESULT F_API addSyncPoint (unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point); + FMOD_RESULT F_API deleteSyncPoint (FMOD_SYNCPOINT *point); + + // Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. + FMOD_RESULT F_API setMode (FMOD_MODE mode); + FMOD_RESULT F_API getMode (FMOD_MODE *mode); + FMOD_RESULT F_API setLoopCount (int loopcount); + FMOD_RESULT F_API getLoopCount (int *loopcount); + FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); + FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + + // For MOD/S3M/XM/IT/MID sequenced formats only. + FMOD_RESULT F_API getMusicNumChannels (int *numchannels); + FMOD_RESULT F_API setMusicChannelVolume (int channel, float volume); + FMOD_RESULT F_API getMusicChannelVolume (int channel, float *volume); + FMOD_RESULT F_API setMusicSpeed (float speed); + FMOD_RESULT F_API getMusicSpeed (float *speed); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'ChannelControl API'. This is a base class for Channel and ChannelGroup so they can share the same functionality. This cannot be used or instansiated explicitly. + */ + class ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a Control class. + ChannelControl(); + ChannelControl(const ChannelControl &); + + public: + + FMOD_RESULT F_API getSystemObject (System **system); + + // General control functionality for Channels and ChannelGroups. + FMOD_RESULT F_API stop (); + FMOD_RESULT F_API setPaused (bool paused); + FMOD_RESULT F_API getPaused (bool *paused); + FMOD_RESULT F_API setVolume (float volume); + FMOD_RESULT F_API getVolume (float *volume); + FMOD_RESULT F_API setVolumeRamp (bool ramp); + FMOD_RESULT F_API getVolumeRamp (bool *ramp); + FMOD_RESULT F_API getAudibility (float *audibility); + FMOD_RESULT F_API setPitch (float pitch); + FMOD_RESULT F_API getPitch (float *pitch); + FMOD_RESULT F_API setMute (bool mute); + FMOD_RESULT F_API getMute (bool *mute); + FMOD_RESULT F_API setReverbProperties (int instance, float wet); + FMOD_RESULT F_API getReverbProperties (int instance, float *wet); + FMOD_RESULT F_API setLowPassGain (float gain); + FMOD_RESULT F_API getLowPassGain (float *gain); + FMOD_RESULT F_API setMode (FMOD_MODE mode); + FMOD_RESULT F_API getMode (FMOD_MODE *mode); + FMOD_RESULT F_API setCallback (FMOD_CHANNELCONTROL_CALLBACK callback); + FMOD_RESULT F_API isPlaying (bool *isplaying); + + // Panning and level adjustment. + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + FMOD_RESULT F_API setPan (float pan); + FMOD_RESULT F_API setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + FMOD_RESULT F_API setMixLevelsInput (float *levels, int numlevels); + FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0); + + // Clock based functionality. + FMOD_RESULT F_API getDSPClock (unsigned long long *dspclock, unsigned long long *parentclock); + FMOD_RESULT F_API setDelay (unsigned long long dspclock_start, unsigned long long dspclock_end, bool stopchannels = true); + FMOD_RESULT F_API getDelay (unsigned long long *dspclock_start, unsigned long long *dspclock_end, bool *stopchannels = 0); + FMOD_RESULT F_API addFadePoint (unsigned long long dspclock, float volume); + FMOD_RESULT F_API setFadePointRamp (unsigned long long dspclock, float volume); + FMOD_RESULT F_API removeFadePoints (unsigned long long dspclock_start, unsigned long long dspclock_end); + FMOD_RESULT F_API getFadePoints (unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + + // DSP effects. + FMOD_RESULT F_API getDSP (int index, DSP **dsp); + FMOD_RESULT F_API addDSP (int index, DSP *dsp); + FMOD_RESULT F_API removeDSP (DSP *dsp); + FMOD_RESULT F_API getNumDSPs (int *numdsps); + FMOD_RESULT F_API setDSPIndex (DSP *dsp, int index); + FMOD_RESULT F_API getDSPIndex (DSP *dsp, int *index); + + // 3D functionality. + FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); + FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *pos, FMOD_VECTOR *vel); + FMOD_RESULT F_API set3DMinMaxDistance (float mindistance, float maxdistance); + FMOD_RESULT F_API get3DMinMaxDistance (float *mindistance, float *maxdistance); + FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume); + FMOD_RESULT F_API set3DConeOrientation (FMOD_VECTOR *orientation); + FMOD_RESULT F_API get3DConeOrientation (FMOD_VECTOR *orientation); + FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints); + FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints); + FMOD_RESULT F_API set3DOcclusion (float directocclusion, float reverbocclusion); + FMOD_RESULT F_API get3DOcclusion (float *directocclusion, float *reverbocclusion); + FMOD_RESULT F_API set3DSpread (float angle); + FMOD_RESULT F_API get3DSpread (float *angle); + FMOD_RESULT F_API set3DLevel (float level); + FMOD_RESULT F_API get3DLevel (float *level); + FMOD_RESULT F_API set3DDopplerLevel (float level); + FMOD_RESULT F_API get3DDopplerLevel (float *level); + FMOD_RESULT F_API set3DDistanceFilter (bool custom, float customLevel, float centerFreq); + FMOD_RESULT F_API get3DDistanceFilter (bool *custom, float *customLevel, float *centerFreq); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'Channel' API. + */ + class Channel : public ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a Channel class. Appropriate Channel creation or retrieval function must be used. + Channel(); + Channel(const Channel &); + + public: + + // Channel specific control functionality. + FMOD_RESULT F_API setFrequency (float frequency); + FMOD_RESULT F_API getFrequency (float *frequency); + FMOD_RESULT F_API setPriority (int priority); + FMOD_RESULT F_API getPriority (int *priority); + FMOD_RESULT F_API setPosition (unsigned int position, FMOD_TIMEUNIT postype); + FMOD_RESULT F_API getPosition (unsigned int *position, FMOD_TIMEUNIT postype); + FMOD_RESULT F_API setChannelGroup (ChannelGroup *channelgroup); + FMOD_RESULT F_API getChannelGroup (ChannelGroup **channelgroup); + FMOD_RESULT F_API setLoopCount (int loopcount); + FMOD_RESULT F_API getLoopCount (int *loopcount); + FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); + FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + + // Information only functions. + FMOD_RESULT F_API isVirtual (bool *isvirtual); + FMOD_RESULT F_API getCurrentSound (Sound **sound); + FMOD_RESULT F_API getIndex (int *index); + }; + + /* + 'ChannelGroup' API + */ + class ChannelGroup : public ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a ChannelGroup class. Appropriate ChannelGroup creation or retrieval function must be used. + ChannelGroup(); + ChannelGroup(const ChannelGroup &); + + public: + + FMOD_RESULT F_API release (); + + // Nested channel groups. + FMOD_RESULT F_API addGroup (ChannelGroup *group, bool propagatedspclock = true, DSPConnection **connection = 0); + FMOD_RESULT F_API getNumGroups (int *numgroups); + FMOD_RESULT F_API getGroup (int index, ChannelGroup **group); + FMOD_RESULT F_API getParentGroup (ChannelGroup **group); + + // Information only functions. + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getNumChannels (int *numchannels); + FMOD_RESULT F_API getChannel (int index, Channel **channel); + }; + + /* + 'SoundGroup' API + */ + class SoundGroup + { + private: + + // Constructor made private so user cannot statically instance a SoundGroup class. Appropriate SoundGroup creation or retrieval function must be used. + SoundGroup(); + SoundGroup(const SoundGroup &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // SoundGroup control functions. + FMOD_RESULT F_API setMaxAudible (int maxaudible); + FMOD_RESULT F_API getMaxAudible (int *maxaudible); + FMOD_RESULT F_API setMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR behavior); + FMOD_RESULT F_API getMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR *behavior); + FMOD_RESULT F_API setMuteFadeSpeed (float speed); + FMOD_RESULT F_API getMuteFadeSpeed (float *speed); + FMOD_RESULT F_API setVolume (float volume); + FMOD_RESULT F_API getVolume (float *volume); + FMOD_RESULT F_API stop (); + + // Information only functions. + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getNumSounds (int *numsounds); + FMOD_RESULT F_API getSound (int index, Sound **sound); + FMOD_RESULT F_API getNumPlaying (int *numplaying); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'DSP' API + */ + class DSP + { + private: + + // Constructor made private so user cannot statically instance a DSP class. Appropriate DSP creation or retrieval function must be used. + DSP(); + DSP(const DSP &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // Connection / disconnection / input and output enumeration. + FMOD_RESULT F_API addInput (DSP *input, DSPConnection **connection = 0, FMOD_DSPCONNECTION_TYPE type = FMOD_DSPCONNECTION_TYPE_STANDARD); + FMOD_RESULT F_API disconnectFrom (DSP *target, DSPConnection *connection = 0); + FMOD_RESULT F_API disconnectAll (bool inputs, bool outputs); + FMOD_RESULT F_API getNumInputs (int *numinputs); + FMOD_RESULT F_API getNumOutputs (int *numoutputs); + FMOD_RESULT F_API getInput (int index, DSP **input, DSPConnection **inputconnection); + FMOD_RESULT F_API getOutput (int index, DSP **output, DSPConnection **outputconnection); + + // DSP unit control. + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + FMOD_RESULT F_API setBypass (bool bypass); + FMOD_RESULT F_API getBypass (bool *bypass); + FMOD_RESULT F_API setWetDryMix (float prewet, float postwet, float dry); + FMOD_RESULT F_API getWetDryMix (float *prewet, float *postwet, float *dry); + FMOD_RESULT F_API setChannelFormat (FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode); + FMOD_RESULT F_API getChannelFormat (FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode); + FMOD_RESULT F_API getOutputChannelFormat (FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode); + FMOD_RESULT F_API reset (); + FMOD_RESULT F_API setCallback (FMOD_DSP_CALLBACK callback); + + // DSP parameter control. + FMOD_RESULT F_API setParameterFloat (int index, float value); + FMOD_RESULT F_API setParameterInt (int index, int value); + FMOD_RESULT F_API setParameterBool (int index, bool value); + FMOD_RESULT F_API setParameterData (int index, void *data, unsigned int length); + FMOD_RESULT F_API getParameterFloat (int index, float *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterInt (int index, int *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterBool (int index, bool *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterData (int index, void **data, unsigned int *length, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getNumParameters (int *numparams); + FMOD_RESULT F_API getParameterInfo (int index, FMOD_DSP_PARAMETER_DESC **desc); + FMOD_RESULT F_API getDataParameterIndex (int datatype, int *index); + FMOD_RESULT F_API showConfigDialog (void *hwnd, bool show); + + // DSP attributes. + FMOD_RESULT F_API getInfo (char *name, unsigned int *version, int *channels, int *configwidth, int *configheight); + FMOD_RESULT F_API getType (FMOD_DSP_TYPE *type); + FMOD_RESULT F_API getIdle (bool *idle); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + + // Metering. + FMOD_RESULT F_API setMeteringEnabled (bool inputEnabled, bool outputEnabled); + FMOD_RESULT F_API getMeteringEnabled (bool *inputEnabled, bool *outputEnabled); + FMOD_RESULT F_API getMeteringInfo (FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo); + FMOD_RESULT F_API getCPUUsage (unsigned int *exclusive, unsigned int *inclusive); + }; + + + /* + 'DSPConnection' API + */ + class DSPConnection + { + private: + + // Constructor made private so user cannot statically instance a DSPConnection class. Appropriate DSPConnection creation or retrieval function must be used. + DSPConnection(); + DSPConnection(const DSPConnection &); + + public: + + FMOD_RESULT F_API getInput (DSP **input); + FMOD_RESULT F_API getOutput (DSP **output); + FMOD_RESULT F_API setMix (float volume); + FMOD_RESULT F_API getMix (float *volume); + FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getType (FMOD_DSPCONNECTION_TYPE *type); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'Geometry' API + */ + class Geometry + { + private: + + // Constructor made private so user cannot statically instance a Geometry class. Appropriate Geometry creation or retrieval function must be used. + Geometry(); + Geometry(const Geometry &); + + public: + + FMOD_RESULT F_API release (); + + // Polygon manipulation. + FMOD_RESULT F_API addPolygon (float directocclusion, float reverbocclusion, bool doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex); + FMOD_RESULT F_API getNumPolygons (int *numpolygons); + FMOD_RESULT F_API getMaxPolygons (int *maxpolygons, int *maxvertices); + FMOD_RESULT F_API getPolygonNumVertices (int index, int *numvertices); + FMOD_RESULT F_API setPolygonVertex (int index, int vertexindex, const FMOD_VECTOR *vertex); + FMOD_RESULT F_API getPolygonVertex (int index, int vertexindex, FMOD_VECTOR *vertex); + FMOD_RESULT F_API setPolygonAttributes (int index, float directocclusion, float reverbocclusion, bool doublesided); + FMOD_RESULT F_API getPolygonAttributes (int index, float *directocclusion, float *reverbocclusion, bool *doublesided); + + // Object manipulation. + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + FMOD_RESULT F_API setRotation (const FMOD_VECTOR *forward, const FMOD_VECTOR *up); + FMOD_RESULT F_API getRotation (FMOD_VECTOR *forward, FMOD_VECTOR *up); + FMOD_RESULT F_API setPosition (const FMOD_VECTOR *position); + FMOD_RESULT F_API getPosition (FMOD_VECTOR *position); + FMOD_RESULT F_API setScale (const FMOD_VECTOR *scale); + FMOD_RESULT F_API getScale (FMOD_VECTOR *scale); + FMOD_RESULT F_API save (void *data, int *datasize); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'Reverb' API + */ + class Reverb3D + { + private: + + // Constructor made private so user cannot statically instance a Reverb3D class. Appropriate Reverb creation or retrieval function must be used. + Reverb3D(); + Reverb3D(const Reverb3D &); + + public: + + FMOD_RESULT F_API release (); + + // Reverb manipulation. + FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *position, float mindistance, float maxdistance); + FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *position, float *mindistance,float *maxdistance); + FMOD_RESULT F_API setProperties (const FMOD_REVERB_PROPERTIES *properties); + FMOD_RESULT F_API getProperties (FMOD_REVERB_PROPERTIES *properties); + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; +} + +#endif diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_codec.h b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_codec.h new file mode 100644 index 0000000..2a00f00 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_codec.h @@ -0,0 +1,136 @@ +/* ======================================================================================== */ +/* FMOD Core API - Codec development header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header if you are wanting to develop your own file format plugin to use with */ +/* FMOD's codec system. With this header you can make your own fileformat plugin that FMOD */ +/* can register and use. See the documentation and examples on how to make a working */ +/* plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api.html */ +/* ======================================================================================== */ +#ifndef _FMOD_CODEC_H +#define _FMOD_CODEC_H + +/* + Codec types +*/ +typedef struct FMOD_CODEC_STATE FMOD_CODEC_STATE; +typedef struct FMOD_CODEC_WAVEFORMAT FMOD_CODEC_WAVEFORMAT; + +/* + Codec constants +*/ +#define FMOD_CODEC_PLUGIN_VERSION 1 + +typedef int FMOD_CODEC_SEEK_METHOD; +#define FMOD_CODEC_SEEK_METHOD_SET 0 +#define FMOD_CODEC_SEEK_METHOD_CURRENT 1 +#define FMOD_CODEC_SEEK_METHOD_END 2 + +/* + Codec callbacks +*/ +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_OPEN_CALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_CLOSE_CALLBACK) (FMOD_CODEC_STATE *codec_state); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_READ_CALLBACK) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int samples_in, unsigned int *samples_out); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_GETLENGTH_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *length, FMOD_TIMEUNIT lengthtype); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_SETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, unsigned int position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_GETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_SOUNDCREATE_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, FMOD_SOUND *sound); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_GETWAVEFORMAT_CALLBACK)(FMOD_CODEC_STATE *codec_state, int index, FMOD_CODEC_WAVEFORMAT *waveformat); + +/* + Codec functions +*/ +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_METADATA_FUNC) (FMOD_CODEC_STATE *codec_state, FMOD_TAGTYPE tagtype, char *name, void *data, unsigned int datalen, FMOD_TAGDATATYPE datatype, int unique); +typedef void * (F_CALL *FMOD_CODEC_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line); +typedef void (F_CALL *FMOD_CODEC_FREE_FUNC) (void *ptr, const char *file, int line); +typedef void (F_CALL *FMOD_CODEC_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...); + +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_FILE_READ_FUNC) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int sizebytes, unsigned int *bytesread); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_FILE_SEEK_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int pos, FMOD_CODEC_SEEK_METHOD method); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_FILE_TELL_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *pos); +typedef FMOD_RESULT (F_CALL *FMOD_CODEC_FILE_SIZE_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *size); + +/* + Codec structures +*/ +typedef struct FMOD_CODEC_DESCRIPTION +{ + unsigned int apiversion; + const char *name; + unsigned int version; + int defaultasstream; + FMOD_TIMEUNIT timeunits; + FMOD_CODEC_OPEN_CALLBACK open; + FMOD_CODEC_CLOSE_CALLBACK close; + FMOD_CODEC_READ_CALLBACK read; + FMOD_CODEC_GETLENGTH_CALLBACK getlength; + FMOD_CODEC_SETPOSITION_CALLBACK setposition; + FMOD_CODEC_GETPOSITION_CALLBACK getposition; + FMOD_CODEC_SOUNDCREATE_CALLBACK soundcreate; + FMOD_CODEC_GETWAVEFORMAT_CALLBACK getwaveformat; +} FMOD_CODEC_DESCRIPTION; + +struct FMOD_CODEC_WAVEFORMAT +{ + const char* name; + FMOD_SOUND_FORMAT format; + int channels; + int frequency; + unsigned int lengthbytes; + unsigned int lengthpcm; + unsigned int pcmblocksize; + int loopstart; + int loopend; + FMOD_MODE mode; + FMOD_CHANNELMASK channelmask; + FMOD_CHANNELORDER channelorder; + float peakvolume; +}; + +typedef struct FMOD_CODEC_STATE_FUNCTIONS +{ + FMOD_CODEC_METADATA_FUNC metadata; + FMOD_CODEC_ALLOC_FUNC alloc; + FMOD_CODEC_FREE_FUNC free; + FMOD_CODEC_LOG_FUNC log; + FMOD_CODEC_FILE_READ_FUNC read; + FMOD_CODEC_FILE_SEEK_FUNC seek; + FMOD_CODEC_FILE_TELL_FUNC tell; + FMOD_CODEC_FILE_SIZE_FUNC size; +} FMOD_CODEC_STATE_FUNCTIONS; + +struct FMOD_CODEC_STATE +{ + void *plugindata; + FMOD_CODEC_WAVEFORMAT *waveformat; + FMOD_CODEC_STATE_FUNCTIONS *functions; + int numsubsounds; +}; + +/* + Codec macros +*/ +#define FMOD_CODEC_METADATA(_state, _tagtype, _name, _data, _datalen, _datatype, _unique) \ + (_state)->functions->metadata(_state, _tagtype, _name, _data, _datalen, _datatype, _unique) +#define FMOD_CODEC_ALLOC(_state, _size, _align) \ + (_state)->functions->alloc(_size, _align, __FILE__, __LINE__) +#define FMOD_CODEC_FREE(_state, _ptr) \ + (_state)->functions->free(_ptr, __FILE__, __LINE__) +#define FMOD_CODEC_LOG(_state, _level, _location, _format, ...) \ + (_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, ##__VA_ARGS__) +#define FMOD_CODEC_FILE_READ(_state, _buffer, _sizebytes, _bytesread) \ + (_state)->functions->read(_state, _buffer, _sizebytes, _bytesread) +#define FMOD_CODEC_FILE_SEEK(_state, _pos, _method) \ + (_state)->functions->seek(_state, _pos, _method) +#define FMOD_CODEC_FILE_TELL(_state, _pos) \ + (_state)->functions->tell(_state, _pos) +#define FMOD_CODEC_FILE_SIZE(_state, _size) \ + (_state)->functions->size(_state, _size) + +#endif + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_common.h b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_common.h new file mode 100644 index 0000000..d289558 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_common.h @@ -0,0 +1,899 @@ +/* ======================================================================================== */ +/* FMOD Core API - Common C/C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* This header is included by fmod.hpp (C++ interface) and fmod.h (C interface) */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api-common.html */ +/* ======================================================================================== */ +#ifndef _FMOD_COMMON_H +#define _FMOD_COMMON_H + +/* + Library import helpers +*/ +#if defined(_WIN32) || defined(__CYGWIN__) + #define F_CALL __stdcall +#else + #define F_CALL +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) || defined(__ORBIS__) || defined(F_USE_DECLSPEC) + #define F_EXPORT __declspec(dllexport) +#elif defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__) || defined(F_USE_ATTRIBUTE) + #define F_EXPORT __attribute__((visibility("default"))) +#else + #define F_EXPORT +#endif + +#ifdef DLL_EXPORTS + #define F_API F_EXPORT F_CALL +#else + #define F_API F_CALL +#endif + +/* + FMOD core types +*/ +typedef int FMOD_BOOL; +typedef struct FMOD_SYSTEM FMOD_SYSTEM; +typedef struct FMOD_SOUND FMOD_SOUND; +typedef struct FMOD_CHANNELCONTROL FMOD_CHANNELCONTROL; +typedef struct FMOD_CHANNEL FMOD_CHANNEL; +typedef struct FMOD_CHANNELGROUP FMOD_CHANNELGROUP; +typedef struct FMOD_SOUNDGROUP FMOD_SOUNDGROUP; +typedef struct FMOD_REVERB3D FMOD_REVERB3D; +typedef struct FMOD_DSP FMOD_DSP; +typedef struct FMOD_DSPCONNECTION FMOD_DSPCONNECTION; +typedef struct FMOD_POLYGON FMOD_POLYGON; +typedef struct FMOD_GEOMETRY FMOD_GEOMETRY; +typedef struct FMOD_SYNCPOINT FMOD_SYNCPOINT; +typedef struct FMOD_ASYNCREADINFO FMOD_ASYNCREADINFO; + +/* + FMOD constants +*/ +#define FMOD_VERSION 0x00020307 /* 0xaaaabbcc -> aaaa = product version, bb = major version, cc = minor version.*/ +#define FMOD_BUILDNUMBER 150747 + +typedef unsigned int FMOD_DEBUG_FLAGS; +#define FMOD_DEBUG_LEVEL_NONE 0x00000000 +#define FMOD_DEBUG_LEVEL_ERROR 0x00000001 +#define FMOD_DEBUG_LEVEL_WARNING 0x00000002 +#define FMOD_DEBUG_LEVEL_LOG 0x00000004 +#define FMOD_DEBUG_TYPE_MEMORY 0x00000100 +#define FMOD_DEBUG_TYPE_FILE 0x00000200 +#define FMOD_DEBUG_TYPE_CODEC 0x00000400 +#define FMOD_DEBUG_TYPE_TRACE 0x00000800 +#define FMOD_DEBUG_DISPLAY_TIMESTAMPS 0x00010000 +#define FMOD_DEBUG_DISPLAY_LINENUMBERS 0x00020000 +#define FMOD_DEBUG_DISPLAY_THREAD 0x00040000 + +typedef unsigned int FMOD_MEMORY_TYPE; +#define FMOD_MEMORY_NORMAL 0x00000000 +#define FMOD_MEMORY_STREAM_FILE 0x00000001 +#define FMOD_MEMORY_STREAM_DECODE 0x00000002 +#define FMOD_MEMORY_SAMPLEDATA 0x00000004 +#define FMOD_MEMORY_DSP_BUFFER 0x00000008 +#define FMOD_MEMORY_PLUGIN 0x00000010 +#define FMOD_MEMORY_PERSISTENT 0x00200000 +#define FMOD_MEMORY_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_INITFLAGS; +#define FMOD_INIT_NORMAL 0x00000000 +#define FMOD_INIT_STREAM_FROM_UPDATE 0x00000001 +#define FMOD_INIT_MIX_FROM_UPDATE 0x00000002 +#define FMOD_INIT_3D_RIGHTHANDED 0x00000004 +#define FMOD_INIT_CLIP_OUTPUT 0x00000008 +#define FMOD_INIT_CHANNEL_LOWPASS 0x00000100 +#define FMOD_INIT_CHANNEL_DISTANCEFILTER 0x00000200 +#define FMOD_INIT_PROFILE_ENABLE 0x00010000 +#define FMOD_INIT_VOL0_BECOMES_VIRTUAL 0x00020000 +#define FMOD_INIT_GEOMETRY_USECLOSEST 0x00040000 +#define FMOD_INIT_PREFER_DOLBY_DOWNMIX 0x00080000 +#define FMOD_INIT_THREAD_UNSAFE 0x00100000 +#define FMOD_INIT_PROFILE_METER_ALL 0x00200000 +#define FMOD_INIT_MEMORY_TRACKING 0x00400000 + +typedef unsigned int FMOD_DRIVER_STATE; +#define FMOD_DRIVER_STATE_CONNECTED 0x00000001 +#define FMOD_DRIVER_STATE_DEFAULT 0x00000002 + +typedef unsigned int FMOD_TIMEUNIT; +#define FMOD_TIMEUNIT_MS 0x00000001 +#define FMOD_TIMEUNIT_PCM 0x00000002 +#define FMOD_TIMEUNIT_PCMBYTES 0x00000004 +#define FMOD_TIMEUNIT_RAWBYTES 0x00000008 +#define FMOD_TIMEUNIT_PCMFRACTION 0x00000010 +#define FMOD_TIMEUNIT_MODORDER 0x00000100 +#define FMOD_TIMEUNIT_MODROW 0x00000200 +#define FMOD_TIMEUNIT_MODPATTERN 0x00000400 + +typedef unsigned int FMOD_SYSTEM_CALLBACK_TYPE; +#define FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED 0x00000001 +#define FMOD_SYSTEM_CALLBACK_DEVICELOST 0x00000002 +#define FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED 0x00000004 +#define FMOD_SYSTEM_CALLBACK_THREADCREATED 0x00000008 +#define FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION 0x00000010 +#define FMOD_SYSTEM_CALLBACK_PREMIX 0x00000020 +#define FMOD_SYSTEM_CALLBACK_POSTMIX 0x00000040 +#define FMOD_SYSTEM_CALLBACK_ERROR 0x00000080 +#define FMOD_SYSTEM_CALLBACK_THREADDESTROYED 0x00000100 +#define FMOD_SYSTEM_CALLBACK_PREUPDATE 0x00000200 +#define FMOD_SYSTEM_CALLBACK_POSTUPDATE 0x00000400 +#define FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED 0x00000800 +#define FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX 0x00001000 +#define FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE 0x00002000 +#define FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN 0x00004000 +#define FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED 0x00008000 +#define FMOD_SYSTEM_CALLBACK_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_MODE; +#define FMOD_DEFAULT 0x00000000 +#define FMOD_LOOP_OFF 0x00000001 +#define FMOD_LOOP_NORMAL 0x00000002 +#define FMOD_LOOP_BIDI 0x00000004 +#define FMOD_2D 0x00000008 +#define FMOD_3D 0x00000010 +#define FMOD_CREATESTREAM 0x00000080 +#define FMOD_CREATESAMPLE 0x00000100 +#define FMOD_CREATECOMPRESSEDSAMPLE 0x00000200 +#define FMOD_OPENUSER 0x00000400 +#define FMOD_OPENMEMORY 0x00000800 +#define FMOD_OPENMEMORY_POINT 0x10000000 +#define FMOD_OPENRAW 0x00001000 +#define FMOD_OPENONLY 0x00002000 +#define FMOD_ACCURATETIME 0x00004000 +#define FMOD_MPEGSEARCH 0x00008000 +#define FMOD_NONBLOCKING 0x00010000 +#define FMOD_UNIQUE 0x00020000 +#define FMOD_3D_HEADRELATIVE 0x00040000 +#define FMOD_3D_WORLDRELATIVE 0x00080000 +#define FMOD_3D_INVERSEROLLOFF 0x00100000 +#define FMOD_3D_LINEARROLLOFF 0x00200000 +#define FMOD_3D_LINEARSQUAREROLLOFF 0x00400000 +#define FMOD_3D_INVERSETAPEREDROLLOFF 0x00800000 +#define FMOD_3D_CUSTOMROLLOFF 0x04000000 +#define FMOD_3D_IGNOREGEOMETRY 0x40000000 +#define FMOD_IGNORETAGS 0x02000000 +#define FMOD_LOWMEM 0x08000000 +#define FMOD_VIRTUAL_PLAYFROMSTART 0x80000000 + +typedef unsigned int FMOD_CHANNELMASK; +#define FMOD_CHANNELMASK_FRONT_LEFT 0x00000001 +#define FMOD_CHANNELMASK_FRONT_RIGHT 0x00000002 +#define FMOD_CHANNELMASK_FRONT_CENTER 0x00000004 +#define FMOD_CHANNELMASK_LOW_FREQUENCY 0x00000008 +#define FMOD_CHANNELMASK_SURROUND_LEFT 0x00000010 +#define FMOD_CHANNELMASK_SURROUND_RIGHT 0x00000020 +#define FMOD_CHANNELMASK_BACK_LEFT 0x00000040 +#define FMOD_CHANNELMASK_BACK_RIGHT 0x00000080 +#define FMOD_CHANNELMASK_BACK_CENTER 0x00000100 +#define FMOD_CHANNELMASK_MONO (FMOD_CHANNELMASK_FRONT_LEFT) +#define FMOD_CHANNELMASK_STEREO (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT) +#define FMOD_CHANNELMASK_LRC (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER) +#define FMOD_CHANNELMASK_QUAD (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_SURROUND (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_5POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_5POINT1_REARS (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) +#define FMOD_CHANNELMASK_7POINT0 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) +#define FMOD_CHANNELMASK_7POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) + +typedef unsigned long long FMOD_PORT_INDEX; +#define FMOD_PORT_INDEX_NONE 0xFFFFFFFFFFFFFFFF + +typedef int FMOD_THREAD_PRIORITY; +/* Platform specific priority range */ +#define FMOD_THREAD_PRIORITY_PLATFORM_MIN (-32 * 1024) +#define FMOD_THREAD_PRIORITY_PLATFORM_MAX ( 32 * 1024) +/* Platform agnostic priorities, maps internally to platform specific value */ +#define FMOD_THREAD_PRIORITY_DEFAULT (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 1) +#define FMOD_THREAD_PRIORITY_LOW (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 2) +#define FMOD_THREAD_PRIORITY_MEDIUM (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 3) +#define FMOD_THREAD_PRIORITY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 4) +#define FMOD_THREAD_PRIORITY_VERY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 5) +#define FMOD_THREAD_PRIORITY_EXTREME (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 6) +#define FMOD_THREAD_PRIORITY_CRITICAL (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 7) +/* Thread defaults */ +#define FMOD_THREAD_PRIORITY_MIXER FMOD_THREAD_PRIORITY_EXTREME +#define FMOD_THREAD_PRIORITY_FEEDER FMOD_THREAD_PRIORITY_CRITICAL +#define FMOD_THREAD_PRIORITY_STREAM FMOD_THREAD_PRIORITY_VERY_HIGH +#define FMOD_THREAD_PRIORITY_FILE FMOD_THREAD_PRIORITY_HIGH +#define FMOD_THREAD_PRIORITY_NONBLOCKING FMOD_THREAD_PRIORITY_HIGH +#define FMOD_THREAD_PRIORITY_RECORD FMOD_THREAD_PRIORITY_HIGH +#define FMOD_THREAD_PRIORITY_GEOMETRY FMOD_THREAD_PRIORITY_LOW +#define FMOD_THREAD_PRIORITY_PROFILER FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_STUDIO_UPDATE FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_BANK FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_CONVOLUTION1 FMOD_THREAD_PRIORITY_VERY_HIGH +#define FMOD_THREAD_PRIORITY_CONVOLUTION2 FMOD_THREAD_PRIORITY_VERY_HIGH + +typedef unsigned int FMOD_THREAD_STACK_SIZE; +#define FMOD_THREAD_STACK_SIZE_DEFAULT 0 +#define FMOD_THREAD_STACK_SIZE_MIXER (80 * 1024) +#define FMOD_THREAD_STACK_SIZE_FEEDER (16 * 1024) +#define FMOD_THREAD_STACK_SIZE_STREAM (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_FILE (64 * 1024) +#define FMOD_THREAD_STACK_SIZE_NONBLOCKING (112 * 1024) +#define FMOD_THREAD_STACK_SIZE_RECORD (16 * 1024) +#define FMOD_THREAD_STACK_SIZE_GEOMETRY (48 * 1024) +#define FMOD_THREAD_STACK_SIZE_PROFILER (128 * 1024) +#define FMOD_THREAD_STACK_SIZE_STUDIO_UPDATE (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_BANK (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_SAMPLE (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_CONVOLUTION1 (16 * 1024) +#define FMOD_THREAD_STACK_SIZE_CONVOLUTION2 (16 * 1024) + +typedef long long FMOD_THREAD_AFFINITY; +/* Platform agnostic thread groupings */ +#define FMOD_THREAD_AFFINITY_GROUP_DEFAULT 0x4000000000000000 +#define FMOD_THREAD_AFFINITY_GROUP_A 0x4000000000000001 +#define FMOD_THREAD_AFFINITY_GROUP_B 0x4000000000000002 +#define FMOD_THREAD_AFFINITY_GROUP_C 0x4000000000000003 +/* Thread defaults */ +#define FMOD_THREAD_AFFINITY_MIXER FMOD_THREAD_AFFINITY_GROUP_A +#define FMOD_THREAD_AFFINITY_FEEDER FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_STREAM FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_FILE FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_NONBLOCKING FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_RECORD FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_GEOMETRY FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_PROFILER FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_STUDIO_UPDATE FMOD_THREAD_AFFINITY_GROUP_B +#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_BANK FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_CONVOLUTION1 FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_CONVOLUTION2 FMOD_THREAD_AFFINITY_GROUP_C +/* Core mask, valid up to 1 << 62 */ +#define FMOD_THREAD_AFFINITY_CORE_ALL 0 +#define FMOD_THREAD_AFFINITY_CORE_0 (1 << 0) +#define FMOD_THREAD_AFFINITY_CORE_1 (1 << 1) +#define FMOD_THREAD_AFFINITY_CORE_2 (1 << 2) +#define FMOD_THREAD_AFFINITY_CORE_3 (1 << 3) +#define FMOD_THREAD_AFFINITY_CORE_4 (1 << 4) +#define FMOD_THREAD_AFFINITY_CORE_5 (1 << 5) +#define FMOD_THREAD_AFFINITY_CORE_6 (1 << 6) +#define FMOD_THREAD_AFFINITY_CORE_7 (1 << 7) +#define FMOD_THREAD_AFFINITY_CORE_8 (1 << 8) +#define FMOD_THREAD_AFFINITY_CORE_9 (1 << 9) +#define FMOD_THREAD_AFFINITY_CORE_10 (1 << 10) +#define FMOD_THREAD_AFFINITY_CORE_11 (1 << 11) +#define FMOD_THREAD_AFFINITY_CORE_12 (1 << 12) +#define FMOD_THREAD_AFFINITY_CORE_13 (1 << 13) +#define FMOD_THREAD_AFFINITY_CORE_14 (1 << 14) +#define FMOD_THREAD_AFFINITY_CORE_15 (1 << 15) + +/* Preset for FMOD_REVERB_PROPERTIES */ +#define FMOD_PRESET_OFF { 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f } +#define FMOD_PRESET_GENERIC { 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f } +#define FMOD_PRESET_PADDEDCELL { 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f } +#define FMOD_PRESET_ROOM { 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f } +#define FMOD_PRESET_BATHROOM { 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f } +#define FMOD_PRESET_LIVINGROOM { 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f } +#define FMOD_PRESET_STONEROOM { 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f } +#define FMOD_PRESET_AUDITORIUM { 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f } +#define FMOD_PRESET_CONCERTHALL { 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f } +#define FMOD_PRESET_CAVE { 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f } +#define FMOD_PRESET_ARENA { 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f } +#define FMOD_PRESET_HANGAR { 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f } +#define FMOD_PRESET_CARPETTEDHALLWAY { 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f } +#define FMOD_PRESET_HALLWAY { 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f } +#define FMOD_PRESET_STONECORRIDOR { 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f } +#define FMOD_PRESET_ALLEY { 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f } +#define FMOD_PRESET_FOREST { 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f } +#define FMOD_PRESET_CITY { 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f } +#define FMOD_PRESET_MOUNTAINS { 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f } +#define FMOD_PRESET_QUARRY { 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f } +#define FMOD_PRESET_PLAIN { 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f } +#define FMOD_PRESET_PARKINGLOT { 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f } +#define FMOD_PRESET_SEWERPIPE { 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f } +#define FMOD_PRESET_UNDERWATER { 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f } + +#define FMOD_MAX_CHANNEL_WIDTH 32 +#define FMOD_MAX_SYSTEMS 8 +#define FMOD_MAX_LISTENERS 8 +#define FMOD_REVERB_MAXINSTANCES 4 + +typedef enum FMOD_THREAD_TYPE +{ + FMOD_THREAD_TYPE_MIXER, + FMOD_THREAD_TYPE_FEEDER, + FMOD_THREAD_TYPE_STREAM, + FMOD_THREAD_TYPE_FILE, + FMOD_THREAD_TYPE_NONBLOCKING, + FMOD_THREAD_TYPE_RECORD, + FMOD_THREAD_TYPE_GEOMETRY, + FMOD_THREAD_TYPE_PROFILER, + FMOD_THREAD_TYPE_STUDIO_UPDATE, + FMOD_THREAD_TYPE_STUDIO_LOAD_BANK, + FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE, + FMOD_THREAD_TYPE_CONVOLUTION1, + FMOD_THREAD_TYPE_CONVOLUTION2, + + FMOD_THREAD_TYPE_MAX, + FMOD_THREAD_TYPE_FORCEINT = 65536 +} FMOD_THREAD_TYPE; + +typedef enum FMOD_RESULT +{ + FMOD_OK, + FMOD_ERR_BADCOMMAND, + FMOD_ERR_CHANNEL_ALLOC, + FMOD_ERR_CHANNEL_STOLEN, + FMOD_ERR_DMA, + FMOD_ERR_DSP_CONNECTION, + FMOD_ERR_DSP_DONTPROCESS, + FMOD_ERR_DSP_FORMAT, + FMOD_ERR_DSP_INUSE, + FMOD_ERR_DSP_NOTFOUND, + FMOD_ERR_DSP_RESERVED, + FMOD_ERR_DSP_SILENCE, + FMOD_ERR_DSP_TYPE, + FMOD_ERR_FILE_BAD, + FMOD_ERR_FILE_COULDNOTSEEK, + FMOD_ERR_FILE_DISKEJECTED, + FMOD_ERR_FILE_EOF, + FMOD_ERR_FILE_ENDOFDATA, + FMOD_ERR_FILE_NOTFOUND, + FMOD_ERR_FORMAT, + FMOD_ERR_HEADER_MISMATCH, + FMOD_ERR_HTTP, + FMOD_ERR_HTTP_ACCESS, + FMOD_ERR_HTTP_PROXY_AUTH, + FMOD_ERR_HTTP_SERVER_ERROR, + FMOD_ERR_HTTP_TIMEOUT, + FMOD_ERR_INITIALIZATION, + FMOD_ERR_INITIALIZED, + FMOD_ERR_INTERNAL, + FMOD_ERR_INVALID_FLOAT, + FMOD_ERR_INVALID_HANDLE, + FMOD_ERR_INVALID_PARAM, + FMOD_ERR_INVALID_POSITION, + FMOD_ERR_INVALID_SPEAKER, + FMOD_ERR_INVALID_SYNCPOINT, + FMOD_ERR_INVALID_THREAD, + FMOD_ERR_INVALID_VECTOR, + FMOD_ERR_MAXAUDIBLE, + FMOD_ERR_MEMORY, + FMOD_ERR_MEMORY_CANTPOINT, + FMOD_ERR_NEEDS3D, + FMOD_ERR_NEEDSHARDWARE, + FMOD_ERR_NET_CONNECT, + FMOD_ERR_NET_SOCKET_ERROR, + FMOD_ERR_NET_URL, + FMOD_ERR_NET_WOULD_BLOCK, + FMOD_ERR_NOTREADY, + FMOD_ERR_OUTPUT_ALLOCATED, + FMOD_ERR_OUTPUT_CREATEBUFFER, + FMOD_ERR_OUTPUT_DRIVERCALL, + FMOD_ERR_OUTPUT_FORMAT, + FMOD_ERR_OUTPUT_INIT, + FMOD_ERR_OUTPUT_NODRIVERS, + FMOD_ERR_PLUGIN, + FMOD_ERR_PLUGIN_MISSING, + FMOD_ERR_PLUGIN_RESOURCE, + FMOD_ERR_PLUGIN_VERSION, + FMOD_ERR_RECORD, + FMOD_ERR_REVERB_CHANNELGROUP, + FMOD_ERR_REVERB_INSTANCE, + FMOD_ERR_SUBSOUNDS, + FMOD_ERR_SUBSOUND_ALLOCATED, + FMOD_ERR_SUBSOUND_CANTMOVE, + FMOD_ERR_TAGNOTFOUND, + FMOD_ERR_TOOMANYCHANNELS, + FMOD_ERR_TRUNCATED, + FMOD_ERR_UNIMPLEMENTED, + FMOD_ERR_UNINITIALIZED, + FMOD_ERR_UNSUPPORTED, + FMOD_ERR_VERSION, + FMOD_ERR_EVENT_ALREADY_LOADED, + FMOD_ERR_EVENT_LIVEUPDATE_BUSY, + FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH, + FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT, + FMOD_ERR_EVENT_NOTFOUND, + FMOD_ERR_STUDIO_UNINITIALIZED, + FMOD_ERR_STUDIO_NOT_LOADED, + FMOD_ERR_INVALID_STRING, + FMOD_ERR_ALREADY_LOCKED, + FMOD_ERR_NOT_LOCKED, + FMOD_ERR_RECORD_DISCONNECTED, + FMOD_ERR_TOOMANYSAMPLES, + + FMOD_RESULT_FORCEINT = 65536 +} FMOD_RESULT; + +typedef enum FMOD_CHANNELCONTROL_TYPE +{ + FMOD_CHANNELCONTROL_CHANNEL, + FMOD_CHANNELCONTROL_CHANNELGROUP, + + FMOD_CHANNELCONTROL_MAX, + FMOD_CHANNELCONTROL_FORCEINT = 65536 +} FMOD_CHANNELCONTROL_TYPE; + +typedef enum FMOD_OUTPUTTYPE +{ + FMOD_OUTPUTTYPE_AUTODETECT, + FMOD_OUTPUTTYPE_UNKNOWN, + FMOD_OUTPUTTYPE_NOSOUND, + FMOD_OUTPUTTYPE_WAVWRITER, + FMOD_OUTPUTTYPE_NOSOUND_NRT, + FMOD_OUTPUTTYPE_WAVWRITER_NRT, + FMOD_OUTPUTTYPE_WASAPI, + FMOD_OUTPUTTYPE_ASIO, + FMOD_OUTPUTTYPE_PULSEAUDIO, + FMOD_OUTPUTTYPE_ALSA, + FMOD_OUTPUTTYPE_COREAUDIO, + FMOD_OUTPUTTYPE_AUDIOTRACK, + FMOD_OUTPUTTYPE_OPENSL, + FMOD_OUTPUTTYPE_AUDIOOUT, + FMOD_OUTPUTTYPE_AUDIO3D, + FMOD_OUTPUTTYPE_WEBAUDIO, + FMOD_OUTPUTTYPE_NNAUDIO, + FMOD_OUTPUTTYPE_WINSONIC, + FMOD_OUTPUTTYPE_AAUDIO, + FMOD_OUTPUTTYPE_AUDIOWORKLET, + FMOD_OUTPUTTYPE_PHASE, + FMOD_OUTPUTTYPE_OHAUDIO, + + FMOD_OUTPUTTYPE_MAX, + FMOD_OUTPUTTYPE_FORCEINT = 65536 +} FMOD_OUTPUTTYPE; + +typedef enum FMOD_DEBUG_MODE +{ + FMOD_DEBUG_MODE_TTY, + FMOD_DEBUG_MODE_FILE, + FMOD_DEBUG_MODE_CALLBACK, + + FMOD_DEBUG_MODE_FORCEINT = 65536 +} FMOD_DEBUG_MODE; + +typedef enum FMOD_SPEAKERMODE +{ + FMOD_SPEAKERMODE_DEFAULT, + FMOD_SPEAKERMODE_RAW, + FMOD_SPEAKERMODE_MONO, + FMOD_SPEAKERMODE_STEREO, + FMOD_SPEAKERMODE_QUAD, + FMOD_SPEAKERMODE_SURROUND, + FMOD_SPEAKERMODE_5POINT1, + FMOD_SPEAKERMODE_7POINT1, + FMOD_SPEAKERMODE_7POINT1POINT4, + + FMOD_SPEAKERMODE_MAX, + FMOD_SPEAKERMODE_FORCEINT = 65536 +} FMOD_SPEAKERMODE; + +typedef enum FMOD_SPEAKER +{ + FMOD_SPEAKER_NONE = -1, + FMOD_SPEAKER_FRONT_LEFT = 0, + FMOD_SPEAKER_FRONT_RIGHT, + FMOD_SPEAKER_FRONT_CENTER, + FMOD_SPEAKER_LOW_FREQUENCY, + FMOD_SPEAKER_SURROUND_LEFT, + FMOD_SPEAKER_SURROUND_RIGHT, + FMOD_SPEAKER_BACK_LEFT, + FMOD_SPEAKER_BACK_RIGHT, + FMOD_SPEAKER_TOP_FRONT_LEFT, + FMOD_SPEAKER_TOP_FRONT_RIGHT, + FMOD_SPEAKER_TOP_BACK_LEFT, + FMOD_SPEAKER_TOP_BACK_RIGHT, + + FMOD_SPEAKER_MAX, + FMOD_SPEAKER_FORCEINT = 65536 +} FMOD_SPEAKER; + +typedef enum FMOD_CHANNELORDER +{ + FMOD_CHANNELORDER_DEFAULT, + FMOD_CHANNELORDER_WAVEFORMAT, + FMOD_CHANNELORDER_PROTOOLS, + FMOD_CHANNELORDER_ALLMONO, + FMOD_CHANNELORDER_ALLSTEREO, + FMOD_CHANNELORDER_ALSA, + + FMOD_CHANNELORDER_MAX, + FMOD_CHANNELORDER_FORCEINT = 65536 +} FMOD_CHANNELORDER; + +typedef enum FMOD_PLUGINTYPE +{ + FMOD_PLUGINTYPE_OUTPUT, + FMOD_PLUGINTYPE_CODEC, + FMOD_PLUGINTYPE_DSP, + + FMOD_PLUGINTYPE_MAX, + FMOD_PLUGINTYPE_FORCEINT = 65536 +} FMOD_PLUGINTYPE; + +typedef enum FMOD_SOUND_TYPE +{ + FMOD_SOUND_TYPE_UNKNOWN, + FMOD_SOUND_TYPE_AIFF, + FMOD_SOUND_TYPE_ASF, + FMOD_SOUND_TYPE_DLS, + FMOD_SOUND_TYPE_FLAC, + FMOD_SOUND_TYPE_FSB, + FMOD_SOUND_TYPE_IT, + FMOD_SOUND_TYPE_MIDI, + FMOD_SOUND_TYPE_MOD, + FMOD_SOUND_TYPE_MPEG, + FMOD_SOUND_TYPE_OGGVORBIS, + FMOD_SOUND_TYPE_PLAYLIST, + FMOD_SOUND_TYPE_RAW, + FMOD_SOUND_TYPE_S3M, + FMOD_SOUND_TYPE_USER, + FMOD_SOUND_TYPE_WAV, + FMOD_SOUND_TYPE_XM, + FMOD_SOUND_TYPE_XMA, + FMOD_SOUND_TYPE_AUDIOQUEUE, + FMOD_SOUND_TYPE_AT9, + FMOD_SOUND_TYPE_VORBIS, + FMOD_SOUND_TYPE_MEDIA_FOUNDATION, + FMOD_SOUND_TYPE_MEDIACODEC, + FMOD_SOUND_TYPE_FADPCM, + FMOD_SOUND_TYPE_OPUS, + + FMOD_SOUND_TYPE_MAX, + FMOD_SOUND_TYPE_FORCEINT = 65536 +} FMOD_SOUND_TYPE; + +typedef enum FMOD_SOUND_FORMAT +{ + FMOD_SOUND_FORMAT_NONE, + FMOD_SOUND_FORMAT_PCM8, + FMOD_SOUND_FORMAT_PCM16, + FMOD_SOUND_FORMAT_PCM24, + FMOD_SOUND_FORMAT_PCM32, + FMOD_SOUND_FORMAT_PCMFLOAT, + FMOD_SOUND_FORMAT_BITSTREAM, + + FMOD_SOUND_FORMAT_MAX, + FMOD_SOUND_FORMAT_FORCEINT = 65536 +} FMOD_SOUND_FORMAT; + +typedef enum FMOD_OPENSTATE +{ + FMOD_OPENSTATE_READY, + FMOD_OPENSTATE_LOADING, + FMOD_OPENSTATE_ERROR, + FMOD_OPENSTATE_CONNECTING, + FMOD_OPENSTATE_BUFFERING, + FMOD_OPENSTATE_SEEKING, + FMOD_OPENSTATE_PLAYING, + FMOD_OPENSTATE_SETPOSITION, + + FMOD_OPENSTATE_MAX, + FMOD_OPENSTATE_FORCEINT = 65536 +} FMOD_OPENSTATE; + +typedef enum FMOD_SOUNDGROUP_BEHAVIOR +{ + FMOD_SOUNDGROUP_BEHAVIOR_FAIL, + FMOD_SOUNDGROUP_BEHAVIOR_MUTE, + FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST, + + FMOD_SOUNDGROUP_BEHAVIOR_MAX, + FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT = 65536 +} FMOD_SOUNDGROUP_BEHAVIOR; + +typedef enum FMOD_CHANNELCONTROL_CALLBACK_TYPE +{ + FMOD_CHANNELCONTROL_CALLBACK_END, + FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE, + FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT, + FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION, + + FMOD_CHANNELCONTROL_CALLBACK_MAX, + FMOD_CHANNELCONTROL_CALLBACK_FORCEINT = 65536 +} FMOD_CHANNELCONTROL_CALLBACK_TYPE; + +typedef enum FMOD_CHANNELCONTROL_DSP_INDEX +{ + FMOD_CHANNELCONTROL_DSP_HEAD = -1, + FMOD_CHANNELCONTROL_DSP_FADER = -2, + FMOD_CHANNELCONTROL_DSP_TAIL = -3, + + FMOD_CHANNELCONTROL_DSP_FORCEINT = 65536 +} FMOD_CHANNELCONTROL_DSP_INDEX; + +typedef enum FMOD_ERRORCALLBACK_INSTANCETYPE +{ + FMOD_ERRORCALLBACK_INSTANCETYPE_NONE, + FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL, + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND, + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP, + FMOD_ERRORCALLBACK_INSTANCETYPE_DSP, + FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION, + FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY, + FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY, + + FMOD_ERRORCALLBACK_INSTANCETYPE_FORCEINT = 65536 +} FMOD_ERRORCALLBACK_INSTANCETYPE; + +typedef enum FMOD_DSP_RESAMPLER +{ + FMOD_DSP_RESAMPLER_DEFAULT, + FMOD_DSP_RESAMPLER_NOINTERP, + FMOD_DSP_RESAMPLER_LINEAR, + FMOD_DSP_RESAMPLER_CUBIC, + FMOD_DSP_RESAMPLER_SPLINE, + + FMOD_DSP_RESAMPLER_MAX, + FMOD_DSP_RESAMPLER_FORCEINT = 65536 +} FMOD_DSP_RESAMPLER; + +typedef enum FMOD_DSP_CALLBACK_TYPE +{ + FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE, + + FMOD_DSP_CALLBACK_MAX, + FMOD_DSP_CALLBACK_FORCEINT = 65536 +} FMOD_DSP_CALLBACK_TYPE; + +typedef enum FMOD_DSPCONNECTION_TYPE +{ + FMOD_DSPCONNECTION_TYPE_STANDARD, + FMOD_DSPCONNECTION_TYPE_SIDECHAIN, + FMOD_DSPCONNECTION_TYPE_SEND, + FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN, + + FMOD_DSPCONNECTION_TYPE_MAX, + FMOD_DSPCONNECTION_TYPE_FORCEINT = 65536 +} FMOD_DSPCONNECTION_TYPE; + +typedef enum FMOD_TAGTYPE +{ + FMOD_TAGTYPE_UNKNOWN, + FMOD_TAGTYPE_ID3V1, + FMOD_TAGTYPE_ID3V2, + FMOD_TAGTYPE_VORBISCOMMENT, + FMOD_TAGTYPE_SHOUTCAST, + FMOD_TAGTYPE_ICECAST, + FMOD_TAGTYPE_ASF, + FMOD_TAGTYPE_MIDI, + FMOD_TAGTYPE_PLAYLIST, + FMOD_TAGTYPE_FMOD, + FMOD_TAGTYPE_USER, + + FMOD_TAGTYPE_MAX, + FMOD_TAGTYPE_FORCEINT = 65536 +} FMOD_TAGTYPE; + +typedef enum FMOD_TAGDATATYPE +{ + FMOD_TAGDATATYPE_BINARY, + FMOD_TAGDATATYPE_INT, + FMOD_TAGDATATYPE_FLOAT, + FMOD_TAGDATATYPE_STRING, + FMOD_TAGDATATYPE_STRING_UTF16, + FMOD_TAGDATATYPE_STRING_UTF16BE, + FMOD_TAGDATATYPE_STRING_UTF8, + + FMOD_TAGDATATYPE_MAX, + FMOD_TAGDATATYPE_FORCEINT = 65536 +} FMOD_TAGDATATYPE; + +typedef enum FMOD_PORT_TYPE +{ + FMOD_PORT_TYPE_MUSIC, + FMOD_PORT_TYPE_COPYRIGHT_MUSIC, + FMOD_PORT_TYPE_VOICE, + FMOD_PORT_TYPE_CONTROLLER, + FMOD_PORT_TYPE_PERSONAL, + FMOD_PORT_TYPE_VIBRATION, + FMOD_PORT_TYPE_AUX, + FMOD_PORT_TYPE_PASSTHROUGH, + FMOD_PORT_TYPE_VR_VIBRATION, + + FMOD_PORT_TYPE_MAX, + FMOD_PORT_TYPE_FORCEINT = 65536 +} FMOD_PORT_TYPE; + +/* + FMOD callbacks +*/ +typedef FMOD_RESULT (F_CALL *FMOD_DEBUG_CALLBACK) (FMOD_DEBUG_FLAGS flags, const char *file, int line, const char* func, const char* message); +typedef FMOD_RESULT (F_CALL *FMOD_SYSTEM_CALLBACK) (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void* commanddata2, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_CHANNELCONTROL_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commanddata1, void *commanddata2); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_CALLBACK) (FMOD_DSP *dsp, FMOD_DSP_CALLBACK_TYPE type, void *data); +typedef FMOD_RESULT (F_CALL *FMOD_SOUND_NONBLOCK_CALLBACK) (FMOD_SOUND *sound, FMOD_RESULT result); +typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMREAD_CALLBACK) (FMOD_SOUND *sound, void *data, unsigned int datalen); +typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMSETPOS_CALLBACK) (FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_OPEN_CALLBACK) (const char *name, unsigned int *filesize, void **handle, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_CLOSE_CALLBACK) (void *handle, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_READ_CALLBACK) (void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_SEEK_CALLBACK) (void *handle, unsigned int pos, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCREAD_CALLBACK) (FMOD_ASYNCREADINFO *info, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCCANCEL_CALLBACK)(FMOD_ASYNCREADINFO *info, void *userdata); +typedef void (F_CALL *FMOD_FILE_ASYNCDONE_FUNC) (FMOD_ASYNCREADINFO *info, FMOD_RESULT result); +typedef void* (F_CALL *FMOD_MEMORY_ALLOC_CALLBACK) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void* (F_CALL *FMOD_MEMORY_REALLOC_CALLBACK) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void (F_CALL *FMOD_MEMORY_FREE_CALLBACK) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef float (F_CALL *FMOD_3D_ROLLOFF_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, float distance); + +/* + FMOD structs +*/ +struct FMOD_ASYNCREADINFO +{ + void *handle; + unsigned int offset; + unsigned int sizebytes; + int priority; + void *userdata; + void *buffer; + unsigned int bytesread; + FMOD_FILE_ASYNCDONE_FUNC done; +}; + +typedef struct FMOD_VECTOR +{ + float x; + float y; + float z; +} FMOD_VECTOR; + +typedef struct FMOD_3D_ATTRIBUTES +{ + FMOD_VECTOR position; + FMOD_VECTOR velocity; + FMOD_VECTOR forward; + FMOD_VECTOR up; +} FMOD_3D_ATTRIBUTES; + +typedef struct FMOD_GUID +{ + unsigned int Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[8]; +} FMOD_GUID; + +typedef struct FMOD_PLUGINLIST +{ + FMOD_PLUGINTYPE type; + void *description; +} FMOD_PLUGINLIST; + +typedef struct FMOD_ADVANCEDSETTINGS +{ + int cbSize; + int maxMPEGCodecs; + int maxADPCMCodecs; + int maxXMACodecs; + int maxVorbisCodecs; + int maxAT9Codecs; + int maxFADPCMCodecs; + int maxOpusCodecs; + int ASIONumChannels; + char **ASIOChannelList; + FMOD_SPEAKER *ASIOSpeakerList; + float vol0virtualvol; + unsigned int defaultDecodeBufferSize; + unsigned short profilePort; + unsigned int geometryMaxFadeTime; + float distanceFilterCenterFreq; + int reverb3Dinstance; + int DSPBufferPoolSize; + FMOD_DSP_RESAMPLER resamplerMethod; + unsigned int randomSeed; + int maxConvolutionThreads; + int maxSpatialObjects; +} FMOD_ADVANCEDSETTINGS; + +typedef struct FMOD_TAG +{ + FMOD_TAGTYPE type; + FMOD_TAGDATATYPE datatype; + char *name; + void *data; + unsigned int datalen; + FMOD_BOOL updated; +} FMOD_TAG; + +typedef struct FMOD_CREATESOUNDEXINFO +{ + int cbsize; + unsigned int length; + unsigned int fileoffset; + int numchannels; + int defaultfrequency; + FMOD_SOUND_FORMAT format; + unsigned int decodebuffersize; + int initialsubsound; + int numsubsounds; + int *inclusionlist; + int inclusionlistnum; + FMOD_SOUND_PCMREAD_CALLBACK pcmreadcallback; + FMOD_SOUND_PCMSETPOS_CALLBACK pcmsetposcallback; + FMOD_SOUND_NONBLOCK_CALLBACK nonblockcallback; + const char *dlsname; + const char *encryptionkey; + int maxpolyphony; + void *userdata; + FMOD_SOUND_TYPE suggestedsoundtype; + FMOD_FILE_OPEN_CALLBACK fileuseropen; + FMOD_FILE_CLOSE_CALLBACK fileuserclose; + FMOD_FILE_READ_CALLBACK fileuserread; + FMOD_FILE_SEEK_CALLBACK fileuserseek; + FMOD_FILE_ASYNCREAD_CALLBACK fileuserasyncread; + FMOD_FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel; + void *fileuserdata; + int filebuffersize; + FMOD_CHANNELORDER channelorder; + FMOD_SOUNDGROUP *initialsoundgroup; + unsigned int initialseekposition; + FMOD_TIMEUNIT initialseekpostype; + int ignoresetfilesystem; + unsigned int audioqueuepolicy; + unsigned int minmidigranularity; + int nonblockthreadid; + FMOD_GUID *fsbguid; +} FMOD_CREATESOUNDEXINFO; + +typedef struct FMOD_REVERB_PROPERTIES +{ + float DecayTime; + float EarlyDelay; + float LateDelay; + float HFReference; + float HFDecayRatio; + float Diffusion; + float Density; + float LowShelfFrequency; + float LowShelfGain; + float HighCut; + float EarlyLateMix; + float WetLevel; +} FMOD_REVERB_PROPERTIES; + +typedef struct FMOD_ERRORCALLBACK_INFO +{ + FMOD_RESULT result; + FMOD_ERRORCALLBACK_INSTANCETYPE instancetype; + void *instance; + const char *functionname; + const char *functionparams; +} FMOD_ERRORCALLBACK_INFO; + +typedef struct FMOD_CPU_USAGE +{ + float dsp; + float stream; + float geometry; + float update; + float convolution1; + float convolution2; +} FMOD_CPU_USAGE; + +typedef struct FMOD_DSP_DATA_PARAMETER_INFO +{ + void *data; + unsigned int length; + int index; +} FMOD_DSP_DATA_PARAMETER_INFO; + +/* + FMOD optional headers for plugin development +*/ +#include "fmod_codec.h" +#include "fmod_dsp.h" +#include "fmod_output.h" + +#endif diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp.cs b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp.cs new file mode 100644 index 0000000..02820ee --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp.cs @@ -0,0 +1,1007 @@ +/* ======================================================================================== */ +/* FMOD Core API - DSP header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header if you are wanting to develop your own DSP plugin to use with FMODs */ +/* dsp system. With this header you can make your own DSP plugin that FMOD can */ +/* register and use. See the documentation and examples on how to make a working plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/plugin-api-dsp.html */ +/* =========================================================================================*/ + +using System; +using System.Text; +using System.Runtime.InteropServices; + +namespace FMOD +{ + [StructLayout(LayoutKind.Sequential)] + public struct DSP_BUFFER_ARRAY + { + public int numbuffers; + public IntPtr buffernumchannels; + public IntPtr bufferchannelmask; + public IntPtr buffers; + public SPEAKERMODE speakermode; + + /* + These properties take advantage of the fact that numbuffers is always zero or one + */ + + public int numchannels + { + get + { + if (buffernumchannels != IntPtr.Zero && numbuffers != 0) + return Marshal.ReadInt32(buffernumchannels); + + return 0; + } + set + { + if (buffernumchannels != IntPtr.Zero && numbuffers != 0) + Marshal.WriteInt32(buffernumchannels, value); + } + } + + public IntPtr buffer + { + get + { + if (buffers != IntPtr.Zero && numbuffers != 0) + return Marshal.ReadIntPtr(buffers); + + return IntPtr.Zero; + } + set + { + if (buffers != IntPtr.Zero && numbuffers != 0) + Marshal.WriteIntPtr(buffers, value); + } + } + } + + public enum DSP_PROCESS_OPERATION + { + PROCESS_PERFORM = 0, + PROCESS_QUERY + } + + [StructLayout(LayoutKind.Sequential)] + public struct COMPLEX + { + public float real; + public float imag; + } + + public enum DSP_PAN_SURROUND_FLAGS + { + DEFAULT = 0, + ROTATION_NOT_BIASED = 1, + } + + + /* + DSP callbacks + */ + public delegate RESULT DSP_CREATE_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_RELEASE_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_RESET_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_SETPOSITION_CALLBACK (ref DSP_STATE dsp_state, uint pos); + public delegate RESULT DSP_READ_CALLBACK (ref DSP_STATE dsp_state, IntPtr inbuffer, IntPtr outbuffer, uint length, int inchannels, ref int outchannels); + public delegate RESULT DSP_SHOULDIPROCESS_CALLBACK (ref DSP_STATE dsp_state, bool inputsidle, uint length, CHANNELMASK inmask, int inchannels, SPEAKERMODE speakermode); + public delegate RESULT DSP_PROCESS_CALLBACK (ref DSP_STATE dsp_state, uint length, ref DSP_BUFFER_ARRAY inbufferarray, ref DSP_BUFFER_ARRAY outbufferarray, bool inputsidle, DSP_PROCESS_OPERATION op); + public delegate RESULT DSP_SETPARAM_FLOAT_CALLBACK (ref DSP_STATE dsp_state, int index, float value); + public delegate RESULT DSP_SETPARAM_INT_CALLBACK (ref DSP_STATE dsp_state, int index, int value); + public delegate RESULT DSP_SETPARAM_BOOL_CALLBACK (ref DSP_STATE dsp_state, int index, bool value); + public delegate RESULT DSP_SETPARAM_DATA_CALLBACK (ref DSP_STATE dsp_state, int index, IntPtr data, uint length); + public delegate RESULT DSP_GETPARAM_FLOAT_CALLBACK (ref DSP_STATE dsp_state, int index, ref float value, IntPtr valuestr); + public delegate RESULT DSP_GETPARAM_INT_CALLBACK (ref DSP_STATE dsp_state, int index, ref int value, IntPtr valuestr); + public delegate RESULT DSP_GETPARAM_BOOL_CALLBACK (ref DSP_STATE dsp_state, int index, ref bool value, IntPtr valuestr); + public delegate RESULT DSP_GETPARAM_DATA_CALLBACK (ref DSP_STATE dsp_state, int index, ref IntPtr data, ref uint length, IntPtr valuestr); + public delegate RESULT DSP_SYSTEM_REGISTER_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_SYSTEM_DEREGISTER_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_SYSTEM_MIX_CALLBACK (ref DSP_STATE dsp_state, int stage); + + + /* + DSP functions + */ + public delegate IntPtr DSP_ALLOC_FUNC (uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate IntPtr DSP_REALLOC_FUNC (IntPtr ptr, uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate void DSP_FREE_FUNC (IntPtr ptr, MEMORY_TYPE type, IntPtr sourcestr); + public delegate void DSP_LOG_FUNC (DEBUG_FLAGS level, IntPtr file, int line, IntPtr function, IntPtr str); + public delegate RESULT DSP_GETSAMPLERATE_FUNC (ref DSP_STATE dsp_state, ref int rate); + public delegate RESULT DSP_GETBLOCKSIZE_FUNC (ref DSP_STATE dsp_state, ref uint blocksize); + public delegate RESULT DSP_GETSPEAKERMODE_FUNC (ref DSP_STATE dsp_state, ref int speakermode_mixer, ref int speakermode_output); + public delegate RESULT DSP_GETCLOCK_FUNC (ref DSP_STATE dsp_state, out ulong clock, out uint offset, out uint length); + public delegate RESULT DSP_GETLISTENERATTRIBUTES_FUNC (ref DSP_STATE dsp_state, ref int numlisteners, IntPtr attributes); + public delegate RESULT DSP_GETUSERDATA_FUNC (ref DSP_STATE dsp_state, out IntPtr userdata); + public delegate RESULT DSP_DFT_FFTREAL_FUNC (ref DSP_STATE dsp_state, int size, IntPtr signal, IntPtr dft, IntPtr window, int signalhop); + public delegate RESULT DSP_DFT_IFFTREAL_FUNC (ref DSP_STATE dsp_state, int size, IntPtr dft, IntPtr signal, IntPtr window, int signalhop); + public delegate RESULT DSP_PAN_SUMMONOMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, float lowFrequencyGain, float overallGain, IntPtr matrix); + public delegate RESULT DSP_PAN_SUMSTEREOMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix); + public delegate RESULT DSP_PAN_SUMSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix, DSP_PAN_SURROUND_FLAGS flags); + public delegate RESULT DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix); + public delegate RESULT DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix); + public delegate RESULT DSP_PAN_GETROLLOFFGAIN_FUNC (ref DSP_STATE dsp_state, DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, out float gain); + + + public enum DSP_TYPE : int + { + UNKNOWN, + MIXER, + OSCILLATOR, + LOWPASS, + ITLOWPASS, + HIGHPASS, + ECHO, + FADER, + FLANGE, + DISTORTION, + NORMALIZE, + LIMITER, + PARAMEQ, + PITCHSHIFT, + CHORUS, + ITECHO, + COMPRESSOR, + SFXREVERB, + LOWPASS_SIMPLE, + DELAY, + TREMOLO, + SEND, + RETURN, + HIGHPASS_SIMPLE, + PAN, + THREE_EQ, + FFT, + LOUDNESS_METER, + CONVOLUTIONREVERB, + CHANNELMIX, + TRANSCEIVER, + OBJECTPAN, + MULTIBAND_EQ, + MULTIBAND_DYNAMICS, + MAX + } + + public enum DSP_PARAMETER_TYPE + { + FLOAT = 0, + INT, + BOOL, + DATA, + MAX + } + + public enum DSP_PARAMETER_FLOAT_MAPPING_TYPE + { + DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR = 0, + DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO, + DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR, + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR + { + public int numpoints; + public IntPtr pointparamvalues; + public IntPtr pointpositions; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_FLOAT_MAPPING + { + public DSP_PARAMETER_FLOAT_MAPPING_TYPE type; + public DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping; + } + + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_FLOAT + { + public float min; + public float max; + public float defaultval; + public DSP_PARAMETER_FLOAT_MAPPING mapping; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_INT + { + public int min; + public int max; + public int defaultval; + public bool goestoinf; + public IntPtr valuenames; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_BOOL + { + public bool defaultval; + public IntPtr valuenames; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_DATA + { + public int datatype; + } + + [StructLayout(LayoutKind.Explicit)] + public struct DSP_PARAMETER_DESC_UNION + { + [FieldOffset(0)] + public DSP_PARAMETER_DESC_FLOAT floatdesc; + [FieldOffset(0)] + public DSP_PARAMETER_DESC_INT intdesc; + [FieldOffset(0)] + public DSP_PARAMETER_DESC_BOOL booldesc; + [FieldOffset(0)] + public DSP_PARAMETER_DESC_DATA datadesc; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC + { + public DSP_PARAMETER_TYPE type; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] name; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] label; + public string description; + + public DSP_PARAMETER_DESC_UNION desc; + } + + public enum DSP_PARAMETER_DATA_TYPE + { + DSP_PARAMETER_DATA_TYPE_USER = 0, + DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1, + DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2, + DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3, + DSP_PARAMETER_DATA_TYPE_FFT = -4, + DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5, + DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6, + DSP_PARAMETER_DATA_TYPE_DYNAMIC_RESPONSE = -7 + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_OVERALLGAIN + { + public float linear_gain; + public float linear_gain_additive; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_3DATTRIBUTES + { + public ATTRIBUTES_3D relative; + public ATTRIBUTES_3D absolute; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_3DATTRIBUTES_MULTI + { + public int numlisteners; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public ATTRIBUTES_3D[] relative; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public float[] weight; + public ATTRIBUTES_3D absolute; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_SIDECHAIN + { + public int sidechainenable; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_FFT + { + public int length; + public int numchannels; + + [MarshalAs(UnmanagedType.ByValArray,SizeConst=32)] + private IntPtr[] spectrum_internal; + + public float[][] spectrum + { + get + { + var buffer = new float[numchannels][]; + + for (int i = 0; i < numchannels; ++i) + { + buffer[i] = new float[length]; + Marshal.Copy(spectrum_internal[i], buffer[i], 0, length); + } + + return buffer; + } + } + + public void getSpectrum(ref float[][] buffer) + { + int bufferLength = Math.Min(buffer.Length, numchannels); + for (int i = 0; i < bufferLength; ++i) + { + getSpectrum(i, ref buffer[i]); + } + } + + public void getSpectrum(int channel, ref float[] buffer) + { + int bufferLength = Math.Min(buffer.Length, length); + Marshal.Copy(spectrum_internal[channel], buffer, 0, bufferLength); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DYNAMIC_RESPONSE + { + public int numchannels; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public float[] rms; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_LOUDNESS_METER_INFO_TYPE + { + public float momentaryloudness; + public float shorttermloudness; + public float integratedloudness; + public float loudness10thpercentile; + public float loudness95thpercentile; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 66)] + public float[] loudnesshistogram; + public float maxtruepeak; + public float maxmomentaryloudness; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_LOUDNESS_METER_WEIGHTING_TYPE + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public float[] channelweight; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_ATTENUATION_RANGE + { + public float min; + public float max; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_DESCRIPTION + { + public uint pluginsdkversion; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] name; + public uint version; + public int numinputbuffers; + public int numoutputbuffers; + public DSP_CREATE_CALLBACK create; + public DSP_RELEASE_CALLBACK release; + public DSP_RESET_CALLBACK reset; + public DSP_READ_CALLBACK read; + public DSP_PROCESS_CALLBACK process; + public DSP_SETPOSITION_CALLBACK setposition; + + public int numparameters; + public IntPtr paramdesc; + public DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat; + public DSP_SETPARAM_INT_CALLBACK setparameterint; + public DSP_SETPARAM_BOOL_CALLBACK setparameterbool; + public DSP_SETPARAM_DATA_CALLBACK setparameterdata; + public DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat; + public DSP_GETPARAM_INT_CALLBACK getparameterint; + public DSP_GETPARAM_BOOL_CALLBACK getparameterbool; + public DSP_GETPARAM_DATA_CALLBACK getparameterdata; + public DSP_SHOULDIPROCESS_CALLBACK shouldiprocess; + public IntPtr userdata; + + public DSP_SYSTEM_REGISTER_CALLBACK sys_register; + public DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister; + public DSP_SYSTEM_MIX_CALLBACK sys_mix; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE_DFT_FUNCTIONS + { + public DSP_DFT_FFTREAL_FUNC fftreal; + public DSP_DFT_IFFTREAL_FUNC inversefftreal; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE_PAN_FUNCTIONS + { + public DSP_PAN_SUMMONOMATRIX_FUNC summonomatrix; + public DSP_PAN_SUMSTEREOMATRIX_FUNC sumstereomatrix; + public DSP_PAN_SUMSURROUNDMATRIX_FUNC sumsurroundmatrix; + public DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC summonotosurroundmatrix; + public DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix; + public DSP_PAN_GETROLLOFFGAIN_FUNC getrolloffgain; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE_FUNCTIONS + { + public DSP_ALLOC_FUNC alloc; + public DSP_REALLOC_FUNC realloc; + public DSP_FREE_FUNC free; + public DSP_GETSAMPLERATE_FUNC getsamplerate; + public DSP_GETBLOCKSIZE_FUNC getblocksize; + public IntPtr dft_internal; + public IntPtr pan_internal; + public DSP_GETSPEAKERMODE_FUNC getspeakermode; + public DSP_GETCLOCK_FUNC getclock; + public DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes; + public DSP_LOG_FUNC log; + public DSP_GETUSERDATA_FUNC getuserdata; + public DSP_STATE_DFT_FUNCTIONS dft + { + get { return Marshal.PtrToStructure(dft_internal); } + } + public DSP_STATE_PAN_FUNCTIONS pan + { + get { return Marshal.PtrToStructure(pan_internal); } + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE + { + public IntPtr instance; + public IntPtr plugindata; + public uint channelmask; + public int source_speakermode; + public IntPtr sidechaindata; + public int sidechainchannels; + private IntPtr functions_internal; + public int systemobject; + + public DSP_STATE_FUNCTIONS functions + { + get { return Marshal.PtrToStructure(functions_internal); } + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_METERING_INFO + { + public int numsamples; + [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)] + public float[] peaklevel; + [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)] + public float[] rmslevel; + public short numchannels; + } + + /* + ============================================================================================================== + + FMOD built in effect parameters. + Use DSP::setParameter with these enums for the 'index' parameter. + + ============================================================================================================== + */ + + public enum DSP_OSCILLATOR : int + { + TYPE, + RATE + } + + public enum DSP_LOWPASS : int + { + CUTOFF, + RESONANCE + } + + public enum DSP_ITLOWPASS : int + { + CUTOFF, + RESONANCE + } + + public enum DSP_HIGHPASS : int + { + CUTOFF, + RESONANCE + } + + public enum DSP_ECHO : int + { + DELAY, + FEEDBACK, + DRYLEVEL, + WETLEVEL, + DELAYCHANGEMODE + } + + public enum DSP_ECHO_DELAYCHANGEMODE_TYPE : int + { + FADE, + LERP, + NONE + } + + public enum DSP_FADER : int + { + GAIN, + OVERALL_GAIN, + } + + public enum DSP_DELAY : int + { + CH0, + CH1, + CH2, + CH3, + CH4, + CH5, + CH6, + CH7, + CH8, + CH9, + CH10, + CH11, + CH12, + CH13, + CH14, + CH15, + MAXDELAY, + } + + public enum DSP_FLANGE : int + { + MIX, + DEPTH, + RATE + } + + public enum DSP_TREMOLO : int + { + FREQUENCY, + DEPTH, + SHAPE, + SKEW, + DUTY, + SQUARE, + PHASE, + SPREAD + } + + public enum DSP_DISTORTION : int + { + LEVEL + } + + public enum DSP_NORMALIZE : int + { + FADETIME, + THRESHOLD, + MAXAMP + } + + public enum DSP_LIMITER : int + { + RELEASETIME, + CEILING, + MAXIMIZERGAIN, + MODE, + } + + public enum DSP_PARAMEQ : int + { + CENTER, + BANDWIDTH, + GAIN + } + + public enum DSP_MULTIBAND_EQ : int + { + A_FILTER, + A_FREQUENCY, + A_Q, + A_GAIN, + B_FILTER, + B_FREQUENCY, + B_Q, + B_GAIN, + C_FILTER, + C_FREQUENCY, + C_Q, + C_GAIN, + D_FILTER, + D_FREQUENCY, + D_Q, + D_GAIN, + E_FILTER, + E_FREQUENCY, + E_Q, + E_GAIN, + } + + public enum DSP_MULTIBAND_EQ_FILTER_TYPE : int + { + DISABLED, + LOWPASS_12DB, + LOWPASS_24DB, + LOWPASS_48DB, + HIGHPASS_12DB, + HIGHPASS_24DB, + HIGHPASS_48DB, + LOWSHELF, + HIGHSHELF, + PEAKING, + BANDPASS, + NOTCH, + ALLPASS, + LOWPASS_6DB, + HIGHPASS_6DB, + } + + public enum DSP_MULTIBAND_DYNAMICS : int + { + LOWER_FREQUENCY, + UPPER_FREQUENCY, + LINKED, + USE_SIDECHAIN, + A_MODE, + A_GAIN, + A_THRESHOLD, + A_RATIO, + A_ATTACK, + A_RELEASE, + A_GAIN_MAKEUP, + A_RESPONSE_DATA, + B_MODE, + B_GAIN, + B_THRESHOLD, + B_RATIO, + B_ATTACK, + B_RELEASE, + B_GAIN_MAKEUP, + B_RESPONSE_DATA, + C_MODE, + C_GAIN, + C_THRESHOLD, + C_RATIO, + C_ATTACK, + C_RELEASE, + C_GAIN_MAKEUP, + C_RESPONSE_DATA, + } + + public enum DSP_MULTIBAND_DYNAMICS_MODE_TYPE : int + { + DISABLED, + COMPRESS_UP, + COMPRESS_DOWN, + EXPAND_UP, + EXPAND_DOWN + } + + public enum DSP_PITCHSHIFT : int + { + PITCH, + FFTSIZE, + OVERLAP, + MAXCHANNELS + } + + public enum DSP_CHORUS : int + { + MIX, + RATE, + DEPTH, + } + + public enum DSP_ITECHO : int + { + WETDRYMIX, + FEEDBACK, + LEFTDELAY, + RIGHTDELAY, + PANDELAY + } + + public enum DSP_COMPRESSOR : int + { + THRESHOLD, + RATIO, + ATTACK, + RELEASE, + GAINMAKEUP, + USESIDECHAIN, + LINKED + } + + public enum DSP_SFXREVERB : int + { + DECAYTIME, + EARLYDELAY, + LATEDELAY, + HFREFERENCE, + HFDECAYRATIO, + DIFFUSION, + DENSITY, + LOWSHELFFREQUENCY, + LOWSHELFGAIN, + HIGHCUT, + EARLYLATEMIX, + WETLEVEL, + DRYLEVEL + } + + public enum DSP_LOWPASS_SIMPLE : int + { + CUTOFF + } + + public enum DSP_SEND : int + { + RETURNID, + LEVEL, + } + + public enum DSP_RETURN : int + { + ID, + INPUT_SPEAKER_MODE + } + + public enum DSP_HIGHPASS_SIMPLE : int + { + CUTOFF + } + + public enum DSP_PAN_2D_STEREO_MODE_TYPE : int + { + DISTRIBUTED, + DISCRETE + } + + public enum DSP_PAN_MODE_TYPE : int + { + MONO, + STEREO, + SURROUND + } + + public enum DSP_PAN_3D_ROLLOFF_TYPE : int + { + LINEARSQUARED, + LINEAR, + INVERSE, + INVERSETAPERED, + CUSTOM + } + + public enum DSP_PAN_3D_EXTENT_MODE_TYPE : int + { + AUTO, + USER, + OFF + } + + public enum DSP_PAN : int + { + MODE, + _2D_STEREO_POSITION, + _2D_DIRECTION, + _2D_EXTENT, + _2D_ROTATION, + _2D_LFE_LEVEL, + _2D_STEREO_MODE, + _2D_STEREO_SEPARATION, + _2D_STEREO_AXIS, + ENABLED_SPEAKERS, + _3D_POSITION, + _3D_ROLLOFF, + _3D_MIN_DISTANCE, + _3D_MAX_DISTANCE, + _3D_EXTENT_MODE, + _3D_SOUND_SIZE, + _3D_MIN_EXTENT, + _3D_PAN_BLEND, + LFE_UPMIX_ENABLED, + OVERALL_GAIN, + SURROUND_SPEAKER_MODE, + _2D_HEIGHT_BLEND, + ATTENUATION_RANGE, + OVERRIDE_RANGE + } + + public enum DSP_THREE_EQ_CROSSOVERSLOPE_TYPE : int + { + _12DB, + _24DB, + _48DB + } + + public enum DSP_THREE_EQ : int + { + LOWGAIN, + MIDGAIN, + HIGHGAIN, + LOWCROSSOVER, + HIGHCROSSOVER, + CROSSOVERSLOPE + } + + public enum DSP_FFT_WINDOW_TYPE : int + { + RECT, + TRIANGLE, + HAMMING, + HANNING, + BLACKMAN, + BLACKMANHARRIS + } + + public enum DSP_FFT_DOWNMIX_TYPE : int + { + NONE, + MONO + } + + public enum DSP_FFT : int + { + WINDOWSIZE, + WINDOW, + BAND_START_FREQ, + BAND_STOP_FREQ, + SPECTRUMDATA, + RMS, + SPECTRAL_CENTROID, + IMMEDIATE_MODE, + DOWNMIX, + CHANNEL + } + + + public enum DSP_LOUDNESS_METER : int + { + STATE, + WEIGHTING, + INFO + } + + + public enum DSP_LOUDNESS_METER_STATE_TYPE : int + { + RESET_INTEGRATED = -3, + RESET_MAXPEAK = -2, + RESET_ALL = -1, + PAUSED = 0, + ANALYZING = 1 + } + + public enum DSP_CONVOLUTION_REVERB : int + { + IR, + WET, + DRY, + LINKED + } + + public enum DSP_CHANNELMIX_OUTPUT : int + { + DEFAULT, + ALLMONO, + ALLSTEREO, + ALLQUAD, + ALL5POINT1, + ALL7POINT1, + ALLLFE, + ALL7POINT1POINT4 + } + + public enum DSP_CHANNELMIX : int + { + OUTPUTGROUPING, + GAIN_CH0, + GAIN_CH1, + GAIN_CH2, + GAIN_CH3, + GAIN_CH4, + GAIN_CH5, + GAIN_CH6, + GAIN_CH7, + GAIN_CH8, + GAIN_CH9, + GAIN_CH10, + GAIN_CH11, + GAIN_CH12, + GAIN_CH13, + GAIN_CH14, + GAIN_CH15, + GAIN_CH16, + GAIN_CH17, + GAIN_CH18, + GAIN_CH19, + GAIN_CH20, + GAIN_CH21, + GAIN_CH22, + GAIN_CH23, + GAIN_CH24, + GAIN_CH25, + GAIN_CH26, + GAIN_CH27, + GAIN_CH28, + GAIN_CH29, + GAIN_CH30, + GAIN_CH31, + OUTPUT_CH0, + OUTPUT_CH1, + OUTPUT_CH2, + OUTPUT_CH3, + OUTPUT_CH4, + OUTPUT_CH5, + OUTPUT_CH6, + OUTPUT_CH7, + OUTPUT_CH8, + OUTPUT_CH9, + OUTPUT_CH10, + OUTPUT_CH11, + OUTPUT_CH12, + OUTPUT_CH13, + OUTPUT_CH14, + OUTPUT_CH15, + OUTPUT_CH16, + OUTPUT_CH17, + OUTPUT_CH18, + OUTPUT_CH19, + OUTPUT_CH20, + OUTPUT_CH21, + OUTPUT_CH22, + OUTPUT_CH23, + OUTPUT_CH24, + OUTPUT_CH25, + OUTPUT_CH26, + OUTPUT_CH27, + OUTPUT_CH28, + OUTPUT_CH29, + OUTPUT_CH30, + OUTPUT_CH31, + } + + public enum DSP_TRANSCEIVER_SPEAKERMODE : int + { + AUTO = -1, + MONO = 0, + STEREO, + SURROUND, + } + + public enum DSP_TRANSCEIVER : int + { + TRANSMIT, + GAIN, + CHANNEL, + TRANSMITSPEAKERMODE + } + + public enum DSP_OBJECTPAN : int + { + _3D_POSITION, + _3D_ROLLOFF, + _3D_MIN_DISTANCE, + _3D_MAX_DISTANCE, + _3D_EXTENT_MODE, + _3D_SOUND_SIZE, + _3D_MIN_EXTENT, + OVERALL_GAIN, + OUTPUTGAIN, + ATTENUATION_RANGE, + OVERRIDE_RANGE + } +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp.h b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp.h new file mode 100644 index 0000000..b20dda2 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp.h @@ -0,0 +1,428 @@ +/* ======================================================================================== */ +/* FMOD Core API - DSP header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header if you are wanting to develop your own DSP plugin to use with FMODs */ +/* dsp system. With this header you can make your own DSP plugin that FMOD can */ +/* register and use. See the documentation and examples on how to make a working plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/plugin-api-dsp.html */ +/* =========================================================================================*/ +#ifndef _FMOD_DSP_H +#define _FMOD_DSP_H + +#include "fmod_dsp_effects.h" + +typedef struct FMOD_DSP_STATE FMOD_DSP_STATE; +typedef struct FMOD_DSP_BUFFER_ARRAY FMOD_DSP_BUFFER_ARRAY; +typedef struct FMOD_COMPLEX FMOD_COMPLEX; + +/* + DSP Constants +*/ +#define FMOD_PLUGIN_SDK_VERSION 110 +#define FMOD_DSP_GETPARAM_VALUESTR_LENGTH 32 + +typedef enum +{ + FMOD_DSP_PROCESS_PERFORM, + FMOD_DSP_PROCESS_QUERY +} FMOD_DSP_PROCESS_OPERATION; + +typedef enum FMOD_DSP_PAN_SURROUND_FLAGS +{ + FMOD_DSP_PAN_SURROUND_DEFAULT = 0, + FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED = 1, + + FMOD_DSP_PAN_SURROUND_FLAGS_FORCEINT = 65536 +} FMOD_DSP_PAN_SURROUND_FLAGS; + +typedef enum +{ + FMOD_DSP_PARAMETER_TYPE_FLOAT, + FMOD_DSP_PARAMETER_TYPE_INT, + FMOD_DSP_PARAMETER_TYPE_BOOL, + FMOD_DSP_PARAMETER_TYPE_DATA, + + FMOD_DSP_PARAMETER_TYPE_MAX, + FMOD_DSP_PARAMETER_TYPE_FORCEINT = 65536 +} FMOD_DSP_PARAMETER_TYPE; + +typedef enum +{ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR, + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO, + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR, + + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_FORCEINT = 65536 +} FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE; + +typedef enum +{ + FMOD_DSP_PARAMETER_DATA_TYPE_USER = 0, + FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1, + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2, + FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3, + FMOD_DSP_PARAMETER_DATA_TYPE_FFT = -4, + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5, + FMOD_DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6, + FMOD_DSP_PARAMETER_DATA_TYPE_DYNAMIC_RESPONSE = -7, +} FMOD_DSP_PARAMETER_DATA_TYPE; + +/* + DSP Callbacks +*/ +typedef FMOD_RESULT (F_CALL *FMOD_DSP_CREATE_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_RELEASE_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_RESET_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_READ_CALLBACK) (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPOSITION_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int pos); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SHOULDIPROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float value); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int value); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void **data, unsigned int *length, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_REGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_MIX_CALLBACK) (FMOD_DSP_STATE *dsp_state, int stage); + +/* + DSP Functions +*/ +typedef void * (F_CALL *FMOD_DSP_ALLOC_FUNC) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void * (F_CALL *FMOD_DSP_REALLOC_FUNC) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void (F_CALL *FMOD_DSP_FREE_FUNC) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void (F_CALL *FMOD_DSP_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *str, ...); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSAMPLERATE_FUNC) (FMOD_DSP_STATE *dsp_state, int *rate); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETBLOCKSIZE_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned int *blocksize); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSPEAKERMODE_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE *speakermode_mixer, FMOD_SPEAKERMODE *speakermode_output); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETCLOCK_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned long long *clock, unsigned int *offset, unsigned int *length); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETLISTENERATTRIBUTES_FUNC) (FMOD_DSP_STATE *dsp_state, int *numlisteners, FMOD_3D_ATTRIBUTES *attributes); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETUSERDATA_FUNC) (FMOD_DSP_STATE *dsp_state, void **userdata); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_FFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const float *signal, FMOD_COMPLEX* dft, const float *window, int signalhop); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_IFFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const FMOD_COMPLEX *dft, float* signal, const float *window, int signalhop); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float lowFrequencyGain, float overallGain, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix, FMOD_DSP_PAN_SURROUND_FLAGS flags); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, float *gain); + +/* + DSP Structures +*/ +struct FMOD_DSP_BUFFER_ARRAY +{ + int numbuffers; + int *buffernumchannels; + FMOD_CHANNELMASK *bufferchannelmask; + float **buffers; + FMOD_SPEAKERMODE speakermode; +}; + +struct FMOD_COMPLEX +{ + float real; + float imag; +}; + +typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR +{ + int numpoints; + float *pointparamvalues; + float *pointpositions; +} FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR; + +typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING +{ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE type; + FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping; +} FMOD_DSP_PARAMETER_FLOAT_MAPPING; + +typedef struct FMOD_DSP_PARAMETER_DESC_FLOAT +{ + float min; + float max; + float defaultval; + FMOD_DSP_PARAMETER_FLOAT_MAPPING mapping; +} FMOD_DSP_PARAMETER_DESC_FLOAT; + +typedef struct FMOD_DSP_PARAMETER_DESC_INT +{ + int min; + int max; + int defaultval; + FMOD_BOOL goestoinf; + const char* const* valuenames; +} FMOD_DSP_PARAMETER_DESC_INT; + +typedef struct FMOD_DSP_PARAMETER_DESC_BOOL +{ + FMOD_BOOL defaultval; + const char* const* valuenames; +} FMOD_DSP_PARAMETER_DESC_BOOL; + +typedef struct FMOD_DSP_PARAMETER_DESC_DATA +{ + int datatype; +} FMOD_DSP_PARAMETER_DESC_DATA; + +typedef struct FMOD_DSP_PARAMETER_DESC +{ + FMOD_DSP_PARAMETER_TYPE type; + char name[16]; + char label[16]; + const char *description; + + union + { + FMOD_DSP_PARAMETER_DESC_FLOAT floatdesc; + FMOD_DSP_PARAMETER_DESC_INT intdesc; + FMOD_DSP_PARAMETER_DESC_BOOL booldesc; + FMOD_DSP_PARAMETER_DESC_DATA datadesc; + }; +} FMOD_DSP_PARAMETER_DESC; + +typedef struct FMOD_DSP_PARAMETER_OVERALLGAIN +{ + float linear_gain; + float linear_gain_additive; +} FMOD_DSP_PARAMETER_OVERALLGAIN; + +typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES +{ + FMOD_3D_ATTRIBUTES relative; + FMOD_3D_ATTRIBUTES absolute; +} FMOD_DSP_PARAMETER_3DATTRIBUTES; + +typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI +{ + int numlisteners; + FMOD_3D_ATTRIBUTES relative[FMOD_MAX_LISTENERS]; + float weight[FMOD_MAX_LISTENERS]; + FMOD_3D_ATTRIBUTES absolute; +} FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI; + +typedef struct FMOD_DSP_PARAMETER_ATTENUATION_RANGE +{ + float min; + float max; +} FMOD_DSP_PARAMETER_ATTENUATION_RANGE; + +typedef struct FMOD_DSP_PARAMETER_SIDECHAIN +{ + FMOD_BOOL sidechainenable; +} FMOD_DSP_PARAMETER_SIDECHAIN; + +typedef struct FMOD_DSP_PARAMETER_FFT +{ + int length; + int numchannels; + float *spectrum[32]; +} FMOD_DSP_PARAMETER_FFT; + +typedef struct FMOD_DSP_PARAMETER_DYNAMIC_RESPONSE +{ + int numchannels; + float rms[32]; +} FMOD_DSP_PARAMETER_DYNAMIC_RESPONSE; + +typedef struct FMOD_DSP_DESCRIPTION +{ + unsigned int pluginsdkversion; + char name[32]; + unsigned int version; + int numinputbuffers; + int numoutputbuffers; + FMOD_DSP_CREATE_CALLBACK create; + FMOD_DSP_RELEASE_CALLBACK release; + FMOD_DSP_RESET_CALLBACK reset; + FMOD_DSP_READ_CALLBACK read; + FMOD_DSP_PROCESS_CALLBACK process; + FMOD_DSP_SETPOSITION_CALLBACK setposition; + + int numparameters; + FMOD_DSP_PARAMETER_DESC **paramdesc; + FMOD_DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat; + FMOD_DSP_SETPARAM_INT_CALLBACK setparameterint; + FMOD_DSP_SETPARAM_BOOL_CALLBACK setparameterbool; + FMOD_DSP_SETPARAM_DATA_CALLBACK setparameterdata; + FMOD_DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat; + FMOD_DSP_GETPARAM_INT_CALLBACK getparameterint; + FMOD_DSP_GETPARAM_BOOL_CALLBACK getparameterbool; + FMOD_DSP_GETPARAM_DATA_CALLBACK getparameterdata; + FMOD_DSP_SHOULDIPROCESS_CALLBACK shouldiprocess; + void *userdata; + + FMOD_DSP_SYSTEM_REGISTER_CALLBACK sys_register; + FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister; + FMOD_DSP_SYSTEM_MIX_CALLBACK sys_mix; + +} FMOD_DSP_DESCRIPTION; + +typedef struct FMOD_DSP_STATE_DFT_FUNCTIONS +{ + FMOD_DSP_DFT_FFTREAL_FUNC fftreal; + FMOD_DSP_DFT_IFFTREAL_FUNC inversefftreal; +} FMOD_DSP_STATE_DFT_FUNCTIONS; + +typedef struct FMOD_DSP_STATE_PAN_FUNCTIONS +{ + FMOD_DSP_PAN_SUMMONOMATRIX_FUNC summonomatrix; + FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC sumstereomatrix; + FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC sumsurroundmatrix; + FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC summonotosurroundmatrix; + FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix; + FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC getrolloffgain; +} FMOD_DSP_STATE_PAN_FUNCTIONS; + +typedef struct FMOD_DSP_STATE_FUNCTIONS +{ + FMOD_DSP_ALLOC_FUNC alloc; + FMOD_DSP_REALLOC_FUNC realloc; + FMOD_DSP_FREE_FUNC free; + FMOD_DSP_GETSAMPLERATE_FUNC getsamplerate; + FMOD_DSP_GETBLOCKSIZE_FUNC getblocksize; + FMOD_DSP_STATE_DFT_FUNCTIONS *dft; + FMOD_DSP_STATE_PAN_FUNCTIONS *pan; + FMOD_DSP_GETSPEAKERMODE_FUNC getspeakermode; + FMOD_DSP_GETCLOCK_FUNC getclock; + FMOD_DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes; + FMOD_DSP_LOG_FUNC log; + FMOD_DSP_GETUSERDATA_FUNC getuserdata; +} FMOD_DSP_STATE_FUNCTIONS; + +struct FMOD_DSP_STATE +{ + void *instance; + void *plugindata; + FMOD_CHANNELMASK channelmask; + FMOD_SPEAKERMODE source_speakermode; + float *sidechaindata; + int sidechainchannels; + FMOD_DSP_STATE_FUNCTIONS *functions; + int systemobject; +}; + +typedef struct FMOD_DSP_METERING_INFO +{ + int numsamples; + float peaklevel[32]; + float rmslevel[32]; + short numchannels; +} FMOD_DSP_METERING_INFO; + +/* + DSP Macros +*/ +#define FMOD_DSP_INIT_PARAMDESC_FLOAT(_paramstruct, _name, _label, _description, _min, _max, _defaultval) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \ + strncpy((_paramstruct).name, _name, 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).floatdesc.min = _min; \ + (_paramstruct).floatdesc.max = _max; \ + (_paramstruct).floatdesc.defaultval = _defaultval; \ + (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO; + +#define FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(_paramstruct, _name, _label, _description, _defaultval, _values, _positions); \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).floatdesc.min = _values[0]; \ + (_paramstruct).floatdesc.max = _values[sizeof(_values) / sizeof(float) - 1]; \ + (_paramstruct).floatdesc.defaultval = _defaultval; \ + (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR; \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.numpoints = sizeof(_values) / sizeof(float); \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointparamvalues = _values; \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointpositions = _positions; + +#define FMOD_DSP_INIT_PARAMDESC_INT(_paramstruct, _name, _label, _description, _min, _max, _defaultval, _goestoinf, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).intdesc.min = _min; \ + (_paramstruct).intdesc.max = _max; \ + (_paramstruct).intdesc.defaultval = _defaultval; \ + (_paramstruct).intdesc.goestoinf = _goestoinf; \ + (_paramstruct).intdesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_INT_ENUMERATED(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).intdesc.min = 0; \ + (_paramstruct).intdesc.max = sizeof(_valuenames) / sizeof(char*) - 1; \ + (_paramstruct).intdesc.defaultval = _defaultval; \ + (_paramstruct).intdesc.goestoinf = false; \ + (_paramstruct).intdesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_BOOL(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_BOOL; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).booldesc.defaultval = _defaultval; \ + (_paramstruct).booldesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_DATA(_paramstruct, _name, _label, _description, _datatype) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_DATA; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).datadesc.datatype = _datatype; + +#define FMOD_DSP_ALLOC(_state, _size) \ + (_state)->functions->alloc(_size, FMOD_MEMORY_NORMAL, __FILE__) +#define FMOD_DSP_REALLOC(_state, _ptr, _size) \ + (_state)->functions->realloc(_ptr, _size, FMOD_MEMORY_NORMAL, __FILE__) +#define FMOD_DSP_FREE(_state, _ptr) \ + (_state)->functions->free(_ptr, FMOD_MEMORY_NORMAL, __FILE__) +#define FMOD_DSP_LOG(_state, _level, _location, _format, ...) \ + (_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, ##__VA_ARGS__) +#define FMOD_DSP_GETSAMPLERATE(_state, _rate) \ + (_state)->functions->getsamplerate(_state, _rate) +#define FMOD_DSP_GETBLOCKSIZE(_state, _blocksize) \ + (_state)->functions->getblocksize(_state, _blocksize) +#define FMOD_DSP_GETSPEAKERMODE(_state, _speakermodemix, _speakermodeout) \ + (_state)->functions->getspeakermode(_state, _speakermodemix, _speakermodeout) +#define FMOD_DSP_GETCLOCK(_state, _clock, _offset, _length) \ + (_state)->functions->getclock(_state, _clock, _offset, _length) +#define FMOD_DSP_GETLISTENERATTRIBUTES(_state, _numlisteners, _attributes) \ + (_state)->functions->getlistenerattributes(_state, _numlisteners, _attributes) +#define FMOD_DSP_GETUSERDATA(_state, _userdata) \ + (_state)->functions->getuserdata(_state, _userdata) +#define FMOD_DSP_DFT_FFTREAL(_state, _size, _signal, _dft, _window, _signalhop) \ + (_state)->functions->dft->fftreal(_state, _size, _signal, _dft, _window, _signalhop) +#define FMOD_DSP_DFT_IFFTREAL(_state, _size, _dft, _signal, _window, _signalhop) \ + (_state)->functions->dft->inversefftreal(_state, _size, _dft, _signal, _window, _signalhop) +#define FMOD_DSP_PAN_SUMMONOMATRIX(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix) \ + (_state)->functions->pan->summonomatrix(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix) +#define FMOD_DSP_PAN_SUMSTEREOMATRIX(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \ + (_state)->functions->pan->sumstereomatrix(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix) +#define FMOD_DSP_PAN_SUMSURROUNDMATRIX(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags) \ + (_state)->functions->pan->sumsurroundmatrix(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags) +#define FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \ + (_state)->functions->pan->summonotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix) +#define FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix) \ + (_state)->functions->pan->sumstereotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix) +#define FMOD_DSP_PAN_GETROLLOFFGAIN(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain) \ + (_state)->functions->pan->getrolloffgain(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain) + +#endif + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp_effects.h b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp_effects.h new file mode 100644 index 0000000..e7408a9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_dsp_effects.h @@ -0,0 +1,632 @@ +/* ============================================================================================================= */ +/* FMOD Core API - Built-in effects header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* In this header you can find parameter structures for FMOD system registered DSP effects */ +/* and generators. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api-common-dsp-effects.html#fmod_dsp_type */ +/* ============================================================================================================= */ + +#ifndef _FMOD_DSP_EFFECTS_H +#define _FMOD_DSP_EFFECTS_H + +typedef enum +{ + FMOD_DSP_TYPE_UNKNOWN, + FMOD_DSP_TYPE_MIXER, + FMOD_DSP_TYPE_OSCILLATOR, + FMOD_DSP_TYPE_LOWPASS, + FMOD_DSP_TYPE_ITLOWPASS, + FMOD_DSP_TYPE_HIGHPASS, + FMOD_DSP_TYPE_ECHO, + FMOD_DSP_TYPE_FADER, + FMOD_DSP_TYPE_FLANGE, + FMOD_DSP_TYPE_DISTORTION, + FMOD_DSP_TYPE_NORMALIZE, + FMOD_DSP_TYPE_LIMITER, + FMOD_DSP_TYPE_PARAMEQ, + FMOD_DSP_TYPE_PITCHSHIFT, + FMOD_DSP_TYPE_CHORUS, + FMOD_DSP_TYPE_ITECHO, + FMOD_DSP_TYPE_COMPRESSOR, + FMOD_DSP_TYPE_SFXREVERB, + FMOD_DSP_TYPE_LOWPASS_SIMPLE, + FMOD_DSP_TYPE_DELAY, + FMOD_DSP_TYPE_TREMOLO, + FMOD_DSP_TYPE_SEND, + FMOD_DSP_TYPE_RETURN, + FMOD_DSP_TYPE_HIGHPASS_SIMPLE, + FMOD_DSP_TYPE_PAN, + FMOD_DSP_TYPE_THREE_EQ, + FMOD_DSP_TYPE_FFT, + FMOD_DSP_TYPE_LOUDNESS_METER, + FMOD_DSP_TYPE_CONVOLUTIONREVERB, + FMOD_DSP_TYPE_CHANNELMIX, + FMOD_DSP_TYPE_TRANSCEIVER, + FMOD_DSP_TYPE_OBJECTPAN, + FMOD_DSP_TYPE_MULTIBAND_EQ, + FMOD_DSP_TYPE_MULTIBAND_DYNAMICS, + + FMOD_DSP_TYPE_MAX, + FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSP_TYPE; + +/* + =================================================================================================== + + FMOD built in effect parameters. + Use DSP::setParameter with these enums for the 'index' parameter. + + =================================================================================================== +*/ + +typedef enum +{ + FMOD_DSP_OSCILLATOR_TYPE, + FMOD_DSP_OSCILLATOR_RATE +} FMOD_DSP_OSCILLATOR; + + +typedef enum +{ + FMOD_DSP_LOWPASS_CUTOFF, + FMOD_DSP_LOWPASS_RESONANCE +} FMOD_DSP_LOWPASS; + + +typedef enum +{ + FMOD_DSP_ITLOWPASS_CUTOFF, + FMOD_DSP_ITLOWPASS_RESONANCE +} FMOD_DSP_ITLOWPASS; + + +typedef enum +{ + FMOD_DSP_HIGHPASS_CUTOFF, + FMOD_DSP_HIGHPASS_RESONANCE +} FMOD_DSP_HIGHPASS; + + +typedef enum +{ + FMOD_DSP_ECHO_DELAY, + FMOD_DSP_ECHO_FEEDBACK, + FMOD_DSP_ECHO_DRYLEVEL, + FMOD_DSP_ECHO_WETLEVEL, + FMOD_DSP_ECHO_DELAYCHANGEMODE +} FMOD_DSP_ECHO; + + +typedef enum +{ + FMOD_DSP_ECHO_DELAYCHANGEMODE_FADE, + FMOD_DSP_ECHO_DELAYCHANGEMODE_LERP, + FMOD_DSP_ECHO_DELAYCHANGEMODE_NONE +} FMOD_DSP_ECHO_DELAYCHANGEMODE_TYPE; + + +typedef enum FMOD_DSP_FADER +{ + FMOD_DSP_FADER_GAIN, + FMOD_DSP_FADER_OVERALL_GAIN, +} FMOD_DSP_FADER; + + +typedef enum +{ + FMOD_DSP_FLANGE_MIX, + FMOD_DSP_FLANGE_DEPTH, + FMOD_DSP_FLANGE_RATE +} FMOD_DSP_FLANGE; + + +typedef enum +{ + FMOD_DSP_DISTORTION_LEVEL +} FMOD_DSP_DISTORTION; + + +typedef enum +{ + FMOD_DSP_NORMALIZE_FADETIME, + FMOD_DSP_NORMALIZE_THRESHOLD, + FMOD_DSP_NORMALIZE_MAXAMP +} FMOD_DSP_NORMALIZE; + + +typedef enum +{ + FMOD_DSP_LIMITER_RELEASETIME, + FMOD_DSP_LIMITER_CEILING, + FMOD_DSP_LIMITER_MAXIMIZERGAIN, + FMOD_DSP_LIMITER_MODE, +} FMOD_DSP_LIMITER; + + +typedef enum +{ + FMOD_DSP_PARAMEQ_CENTER, + FMOD_DSP_PARAMEQ_BANDWIDTH, + FMOD_DSP_PARAMEQ_GAIN +} FMOD_DSP_PARAMEQ; + + +typedef enum FMOD_DSP_MULTIBAND_EQ +{ + FMOD_DSP_MULTIBAND_EQ_A_FILTER, + FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_A_Q, + FMOD_DSP_MULTIBAND_EQ_A_GAIN, + FMOD_DSP_MULTIBAND_EQ_B_FILTER, + FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_B_Q, + FMOD_DSP_MULTIBAND_EQ_B_GAIN, + FMOD_DSP_MULTIBAND_EQ_C_FILTER, + FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_C_Q, + FMOD_DSP_MULTIBAND_EQ_C_GAIN, + FMOD_DSP_MULTIBAND_EQ_D_FILTER, + FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_D_Q, + FMOD_DSP_MULTIBAND_EQ_D_GAIN, + FMOD_DSP_MULTIBAND_EQ_E_FILTER, + FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_E_Q, + FMOD_DSP_MULTIBAND_EQ_E_GAIN, +} FMOD_DSP_MULTIBAND_EQ; + + +typedef enum FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE +{ + FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF, + FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING, + FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS, + FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH, + FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_6DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_6DB, +} FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE; + + +typedef enum FMOD_DSP_MULTIBAND_DYNAMICS +{ + FMOD_DSP_MULTIBAND_DYNAMICS_LOWER_FREQUENCY, + FMOD_DSP_MULTIBAND_DYNAMICS_UPPER_FREQUENCY, + FMOD_DSP_MULTIBAND_DYNAMICS_LINKED, + FMOD_DSP_MULTIBAND_DYNAMICS_USE_SIDECHAIN, + FMOD_DSP_MULTIBAND_DYNAMICS_A_MODE, + FMOD_DSP_MULTIBAND_DYNAMICS_A_GAIN, + FMOD_DSP_MULTIBAND_DYNAMICS_A_THRESHOLD, + FMOD_DSP_MULTIBAND_DYNAMICS_A_RATIO, + FMOD_DSP_MULTIBAND_DYNAMICS_A_ATTACK, + FMOD_DSP_MULTIBAND_DYNAMICS_A_RELEASE, + FMOD_DSP_MULTIBAND_DYNAMICS_A_GAIN_MAKEUP, + FMOD_DSP_MULTIBAND_DYNAMICS_A_RESPONSE_DATA, + FMOD_DSP_MULTIBAND_DYNAMICS_B_MODE, + FMOD_DSP_MULTIBAND_DYNAMICS_B_GAIN, + FMOD_DSP_MULTIBAND_DYNAMICS_B_THRESHOLD, + FMOD_DSP_MULTIBAND_DYNAMICS_B_RATIO, + FMOD_DSP_MULTIBAND_DYNAMICS_B_ATTACK, + FMOD_DSP_MULTIBAND_DYNAMICS_B_RELEASE, + FMOD_DSP_MULTIBAND_DYNAMICS_B_GAIN_MAKEUP, + FMOD_DSP_MULTIBAND_DYNAMICS_B_RESPONSE_DATA, + FMOD_DSP_MULTIBAND_DYNAMICS_C_MODE, + FMOD_DSP_MULTIBAND_DYNAMICS_C_GAIN, + FMOD_DSP_MULTIBAND_DYNAMICS_C_THRESHOLD, + FMOD_DSP_MULTIBAND_DYNAMICS_C_RATIO, + FMOD_DSP_MULTIBAND_DYNAMICS_C_ATTACK, + FMOD_DSP_MULTIBAND_DYNAMICS_C_RELEASE, + FMOD_DSP_MULTIBAND_DYNAMICS_C_GAIN_MAKEUP, + FMOD_DSP_MULTIBAND_DYNAMICS_C_RESPONSE_DATA, +} FMOD_DSP_MULTIBAND_DYNAMICS; + + +typedef enum FMOD_DSP_MULTIBAND_DYNAMICS_MODE_TYPE +{ + FMOD_DSP_MULTIBAND_DYNAMICS_MODE_DISABLED, + FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_UP, + FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_DOWN, + FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_UP, + FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_DOWN +} FMOD_DSP_MULTIBAND_DYNAMICS_MODE_TYPE; + + +typedef enum +{ + FMOD_DSP_PITCHSHIFT_PITCH, + FMOD_DSP_PITCHSHIFT_FFTSIZE, + FMOD_DSP_PITCHSHIFT_OVERLAP, + FMOD_DSP_PITCHSHIFT_MAXCHANNELS +} FMOD_DSP_PITCHSHIFT; + + +typedef enum +{ + FMOD_DSP_CHORUS_MIX, + FMOD_DSP_CHORUS_RATE, + FMOD_DSP_CHORUS_DEPTH, +} FMOD_DSP_CHORUS; + + +typedef enum +{ + FMOD_DSP_ITECHO_WETDRYMIX, + FMOD_DSP_ITECHO_FEEDBACK, + FMOD_DSP_ITECHO_LEFTDELAY, + FMOD_DSP_ITECHO_RIGHTDELAY, + FMOD_DSP_ITECHO_PANDELAY +} FMOD_DSP_ITECHO; + +typedef enum +{ + FMOD_DSP_COMPRESSOR_THRESHOLD, + FMOD_DSP_COMPRESSOR_RATIO, + FMOD_DSP_COMPRESSOR_ATTACK, + FMOD_DSP_COMPRESSOR_RELEASE, + FMOD_DSP_COMPRESSOR_GAINMAKEUP, + FMOD_DSP_COMPRESSOR_USESIDECHAIN, + FMOD_DSP_COMPRESSOR_LINKED +} FMOD_DSP_COMPRESSOR; + +typedef enum +{ + FMOD_DSP_SFXREVERB_DECAYTIME, + FMOD_DSP_SFXREVERB_EARLYDELAY, + FMOD_DSP_SFXREVERB_LATEDELAY, + FMOD_DSP_SFXREVERB_HFREFERENCE, + FMOD_DSP_SFXREVERB_HFDECAYRATIO, + FMOD_DSP_SFXREVERB_DIFFUSION, + FMOD_DSP_SFXREVERB_DENSITY, + FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY, + FMOD_DSP_SFXREVERB_LOWSHELFGAIN, + FMOD_DSP_SFXREVERB_HIGHCUT, + FMOD_DSP_SFXREVERB_EARLYLATEMIX, + FMOD_DSP_SFXREVERB_WETLEVEL, + FMOD_DSP_SFXREVERB_DRYLEVEL +} FMOD_DSP_SFXREVERB; + +typedef enum +{ + FMOD_DSP_LOWPASS_SIMPLE_CUTOFF +} FMOD_DSP_LOWPASS_SIMPLE; + + +typedef enum +{ + FMOD_DSP_DELAY_CH0, + FMOD_DSP_DELAY_CH1, + FMOD_DSP_DELAY_CH2, + FMOD_DSP_DELAY_CH3, + FMOD_DSP_DELAY_CH4, + FMOD_DSP_DELAY_CH5, + FMOD_DSP_DELAY_CH6, + FMOD_DSP_DELAY_CH7, + FMOD_DSP_DELAY_CH8, + FMOD_DSP_DELAY_CH9, + FMOD_DSP_DELAY_CH10, + FMOD_DSP_DELAY_CH11, + FMOD_DSP_DELAY_CH12, + FMOD_DSP_DELAY_CH13, + FMOD_DSP_DELAY_CH14, + FMOD_DSP_DELAY_CH15, + FMOD_DSP_DELAY_MAXDELAY +} FMOD_DSP_DELAY; + + +typedef enum +{ + FMOD_DSP_TREMOLO_FREQUENCY, + FMOD_DSP_TREMOLO_DEPTH, + FMOD_DSP_TREMOLO_SHAPE, + FMOD_DSP_TREMOLO_SKEW, + FMOD_DSP_TREMOLO_DUTY, + FMOD_DSP_TREMOLO_SQUARE, + FMOD_DSP_TREMOLO_PHASE, + FMOD_DSP_TREMOLO_SPREAD +} FMOD_DSP_TREMOLO; + + +typedef enum +{ + FMOD_DSP_SEND_RETURNID, + FMOD_DSP_SEND_LEVEL, +} FMOD_DSP_SEND; + + +typedef enum +{ + FMOD_DSP_RETURN_ID, + FMOD_DSP_RETURN_INPUT_SPEAKER_MODE +} FMOD_DSP_RETURN; + + +typedef enum +{ + FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF +} FMOD_DSP_HIGHPASS_SIMPLE; + + +typedef enum +{ + FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED, + FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE +} FMOD_DSP_PAN_2D_STEREO_MODE_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_MODE_MONO, + FMOD_DSP_PAN_MODE_STEREO, + FMOD_DSP_PAN_MODE_SURROUND +} FMOD_DSP_PAN_MODE_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED, + FMOD_DSP_PAN_3D_ROLLOFF_LINEAR, + FMOD_DSP_PAN_3D_ROLLOFF_INVERSE, + FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED, + FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM +} FMOD_DSP_PAN_3D_ROLLOFF_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO, + FMOD_DSP_PAN_3D_EXTENT_MODE_USER, + FMOD_DSP_PAN_3D_EXTENT_MODE_OFF +} FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_MODE, + FMOD_DSP_PAN_2D_STEREO_POSITION, + FMOD_DSP_PAN_2D_DIRECTION, + FMOD_DSP_PAN_2D_EXTENT, + FMOD_DSP_PAN_2D_ROTATION, + FMOD_DSP_PAN_2D_LFE_LEVEL, + FMOD_DSP_PAN_2D_STEREO_MODE, + FMOD_DSP_PAN_2D_STEREO_SEPARATION, + FMOD_DSP_PAN_2D_STEREO_AXIS, + FMOD_DSP_PAN_ENABLED_SPEAKERS, + FMOD_DSP_PAN_3D_POSITION, + FMOD_DSP_PAN_3D_ROLLOFF, + FMOD_DSP_PAN_3D_MIN_DISTANCE, + FMOD_DSP_PAN_3D_MAX_DISTANCE, + FMOD_DSP_PAN_3D_EXTENT_MODE, + FMOD_DSP_PAN_3D_SOUND_SIZE, + FMOD_DSP_PAN_3D_MIN_EXTENT, + FMOD_DSP_PAN_3D_PAN_BLEND, + FMOD_DSP_PAN_LFE_UPMIX_ENABLED, + FMOD_DSP_PAN_OVERALL_GAIN, + FMOD_DSP_PAN_SURROUND_SPEAKER_MODE, + FMOD_DSP_PAN_2D_HEIGHT_BLEND, + FMOD_DSP_PAN_ATTENUATION_RANGE, + FMOD_DSP_PAN_OVERRIDE_RANGE +} FMOD_DSP_PAN; + + +typedef enum +{ + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB +} FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE; + + +typedef enum +{ + FMOD_DSP_THREE_EQ_LOWGAIN, + FMOD_DSP_THREE_EQ_MIDGAIN, + FMOD_DSP_THREE_EQ_HIGHGAIN, + FMOD_DSP_THREE_EQ_LOWCROSSOVER, + FMOD_DSP_THREE_EQ_HIGHCROSSOVER, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE +} FMOD_DSP_THREE_EQ; + + +typedef enum +{ + FMOD_DSP_FFT_WINDOW_RECT, + FMOD_DSP_FFT_WINDOW_TRIANGLE, + FMOD_DSP_FFT_WINDOW_HAMMING, + FMOD_DSP_FFT_WINDOW_HANNING, + FMOD_DSP_FFT_WINDOW_BLACKMAN, + FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS +} FMOD_DSP_FFT_WINDOW_TYPE; + + +typedef enum +{ + FMOD_DSP_FFT_DOWNMIX_NONE, + FMOD_DSP_FFT_DOWNMIX_MONO, +} FMOD_DSP_FFT_DOWNMIX_TYPE; + + +typedef enum +{ + FMOD_DSP_FFT_WINDOWSIZE, + FMOD_DSP_FFT_WINDOW, + FMOD_DSP_FFT_BAND_START_FREQ, + FMOD_DSP_FFT_BAND_STOP_FREQ, + FMOD_DSP_FFT_SPECTRUMDATA, + FMOD_DSP_FFT_RMS, + FMOD_DSP_FFT_SPECTRAL_CENTROID, + FMOD_DSP_FFT_IMMEDIATE_MODE, + FMOD_DSP_FFT_DOWNMIX, + FMOD_DSP_FFT_CHANNEL, +} FMOD_DSP_FFT; + +#define FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES 66 + +typedef enum +{ + FMOD_DSP_LOUDNESS_METER_STATE, + FMOD_DSP_LOUDNESS_METER_WEIGHTING, + FMOD_DSP_LOUDNESS_METER_INFO +} FMOD_DSP_LOUDNESS_METER; + + +typedef enum +{ + FMOD_DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED = -3, + FMOD_DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK = -2, + FMOD_DSP_LOUDNESS_METER_STATE_RESET_ALL = -1, + FMOD_DSP_LOUDNESS_METER_STATE_PAUSED = 0, + FMOD_DSP_LOUDNESS_METER_STATE_ANALYZING = 1 +} FMOD_DSP_LOUDNESS_METER_STATE_TYPE; + +typedef struct FMOD_DSP_LOUDNESS_METER_INFO_TYPE +{ + float momentaryloudness; + float shorttermloudness; + float integratedloudness; + float loudness10thpercentile; + float loudness95thpercentile; + float loudnesshistogram[FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES]; + float maxtruepeak; + float maxmomentaryloudness; +} FMOD_DSP_LOUDNESS_METER_INFO_TYPE; + +typedef struct FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE +{ + float channelweight[32]; +} FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE; + +typedef enum +{ + FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR, + FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET, + FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY, + FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED +} FMOD_DSP_CONVOLUTION_REVERB; + +typedef enum +{ + FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD, + FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1, + FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE, + FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4 +} FMOD_DSP_CHANNELMIX_OUTPUT; + +typedef enum +{ + FMOD_DSP_CHANNELMIX_OUTPUTGROUPING, + FMOD_DSP_CHANNELMIX_GAIN_CH0, + FMOD_DSP_CHANNELMIX_GAIN_CH1, + FMOD_DSP_CHANNELMIX_GAIN_CH2, + FMOD_DSP_CHANNELMIX_GAIN_CH3, + FMOD_DSP_CHANNELMIX_GAIN_CH4, + FMOD_DSP_CHANNELMIX_GAIN_CH5, + FMOD_DSP_CHANNELMIX_GAIN_CH6, + FMOD_DSP_CHANNELMIX_GAIN_CH7, + FMOD_DSP_CHANNELMIX_GAIN_CH8, + FMOD_DSP_CHANNELMIX_GAIN_CH9, + FMOD_DSP_CHANNELMIX_GAIN_CH10, + FMOD_DSP_CHANNELMIX_GAIN_CH11, + FMOD_DSP_CHANNELMIX_GAIN_CH12, + FMOD_DSP_CHANNELMIX_GAIN_CH13, + FMOD_DSP_CHANNELMIX_GAIN_CH14, + FMOD_DSP_CHANNELMIX_GAIN_CH15, + FMOD_DSP_CHANNELMIX_GAIN_CH16, + FMOD_DSP_CHANNELMIX_GAIN_CH17, + FMOD_DSP_CHANNELMIX_GAIN_CH18, + FMOD_DSP_CHANNELMIX_GAIN_CH19, + FMOD_DSP_CHANNELMIX_GAIN_CH20, + FMOD_DSP_CHANNELMIX_GAIN_CH21, + FMOD_DSP_CHANNELMIX_GAIN_CH22, + FMOD_DSP_CHANNELMIX_GAIN_CH23, + FMOD_DSP_CHANNELMIX_GAIN_CH24, + FMOD_DSP_CHANNELMIX_GAIN_CH25, + FMOD_DSP_CHANNELMIX_GAIN_CH26, + FMOD_DSP_CHANNELMIX_GAIN_CH27, + FMOD_DSP_CHANNELMIX_GAIN_CH28, + FMOD_DSP_CHANNELMIX_GAIN_CH29, + FMOD_DSP_CHANNELMIX_GAIN_CH30, + FMOD_DSP_CHANNELMIX_GAIN_CH31, + FMOD_DSP_CHANNELMIX_OUTPUT_CH0, + FMOD_DSP_CHANNELMIX_OUTPUT_CH1, + FMOD_DSP_CHANNELMIX_OUTPUT_CH2, + FMOD_DSP_CHANNELMIX_OUTPUT_CH3, + FMOD_DSP_CHANNELMIX_OUTPUT_CH4, + FMOD_DSP_CHANNELMIX_OUTPUT_CH5, + FMOD_DSP_CHANNELMIX_OUTPUT_CH6, + FMOD_DSP_CHANNELMIX_OUTPUT_CH7, + FMOD_DSP_CHANNELMIX_OUTPUT_CH8, + FMOD_DSP_CHANNELMIX_OUTPUT_CH9, + FMOD_DSP_CHANNELMIX_OUTPUT_CH10, + FMOD_DSP_CHANNELMIX_OUTPUT_CH11, + FMOD_DSP_CHANNELMIX_OUTPUT_CH12, + FMOD_DSP_CHANNELMIX_OUTPUT_CH13, + FMOD_DSP_CHANNELMIX_OUTPUT_CH14, + FMOD_DSP_CHANNELMIX_OUTPUT_CH15, + FMOD_DSP_CHANNELMIX_OUTPUT_CH16, + FMOD_DSP_CHANNELMIX_OUTPUT_CH17, + FMOD_DSP_CHANNELMIX_OUTPUT_CH18, + FMOD_DSP_CHANNELMIX_OUTPUT_CH19, + FMOD_DSP_CHANNELMIX_OUTPUT_CH20, + FMOD_DSP_CHANNELMIX_OUTPUT_CH21, + FMOD_DSP_CHANNELMIX_OUTPUT_CH22, + FMOD_DSP_CHANNELMIX_OUTPUT_CH23, + FMOD_DSP_CHANNELMIX_OUTPUT_CH24, + FMOD_DSP_CHANNELMIX_OUTPUT_CH25, + FMOD_DSP_CHANNELMIX_OUTPUT_CH26, + FMOD_DSP_CHANNELMIX_OUTPUT_CH27, + FMOD_DSP_CHANNELMIX_OUTPUT_CH28, + FMOD_DSP_CHANNELMIX_OUTPUT_CH29, + FMOD_DSP_CHANNELMIX_OUTPUT_CH30, + FMOD_DSP_CHANNELMIX_OUTPUT_CH31 +} FMOD_DSP_CHANNELMIX; + +typedef enum +{ + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1, + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0, + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO, + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND, +} FMOD_DSP_TRANSCEIVER_SPEAKERMODE; + + +typedef enum +{ + FMOD_DSP_TRANSCEIVER_TRANSMIT, + FMOD_DSP_TRANSCEIVER_GAIN, + FMOD_DSP_TRANSCEIVER_CHANNEL, + FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE +} FMOD_DSP_TRANSCEIVER; + + +typedef enum +{ + FMOD_DSP_OBJECTPAN_3D_POSITION, + FMOD_DSP_OBJECTPAN_3D_ROLLOFF, + FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE, + FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE, + FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE, + FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE, + FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT, + FMOD_DSP_OBJECTPAN_OVERALL_GAIN, + FMOD_DSP_OBJECTPAN_OUTPUTGAIN, + FMOD_DSP_OBJECTPAN_ATTENUATION_RANGE, + FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE +} FMOD_DSP_OBJECTPAN; + +#endif + diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_errors.cs b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_errors.cs new file mode 100644 index 0000000..88f5ae2 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_errors.cs @@ -0,0 +1,106 @@ +/* ============================================================================================== */ +/* FMOD Core / Studio API - Error string header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header if you want to store or display a string version / english explanation */ +/* of the FMOD error codes. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api-common.html#fmod_result */ +/* =============================================================================================== */ + +namespace FMOD +{ + public class Error + { + public static string String(FMOD.RESULT errcode) + { + switch (errcode) + { + case FMOD.RESULT.OK: return "No errors."; + case FMOD.RESULT.ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound)."; + case FMOD.RESULT.ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel."; + case FMOD.RESULT.ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound."; + case FMOD.RESULT.ERR_DMA: return "DMA Failure. See debug output for more information."; + case FMOD.RESULT.ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts."; + case FMOD.RESULT.ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph."; + case FMOD.RESULT.ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map."; + case FMOD.RESULT.ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released."; + case FMOD.RESULT.ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified."; + case FMOD.RESULT.ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system."; + case FMOD.RESULT.ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph."; + case FMOD.RESULT.ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type."; + case FMOD.RESULT.ERR_FILE_BAD: return "Error loading file."; + case FMOD.RESULT.ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format."; + case FMOD.RESULT.ERR_FILE_DISKEJECTED: return "Media was ejected while reading."; + case FMOD.RESULT.ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?)."; + case FMOD.RESULT.ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data."; + case FMOD.RESULT.ERR_FILE_NOTFOUND: return "File not found."; + case FMOD.RESULT.ERR_FORMAT: return "Unsupported file or audio format."; + case FMOD.RESULT.ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library."; + case FMOD.RESULT.ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere."; + case FMOD.RESULT.ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden."; + case FMOD.RESULT.ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource."; + case FMOD.RESULT.ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred."; + case FMOD.RESULT.ERR_HTTP_TIMEOUT: return "The HTTP request timed out."; + case FMOD.RESULT.ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function."; + case FMOD.RESULT.ERR_INITIALIZED: return "Cannot call this command after System::init."; + case FMOD.RESULT.ERR_INTERNAL: return "An error occured in the FMOD system. Use the logging version of FMOD for more information."; + case FMOD.RESULT.ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float."; + case FMOD.RESULT.ERR_INVALID_HANDLE: return "An invalid object handle was used."; + case FMOD.RESULT.ERR_INVALID_PARAM: return "An invalid parameter was passed to this function."; + case FMOD.RESULT.ERR_INVALID_POSITION: return "An invalid seek position was passed to this function."; + case FMOD.RESULT.ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode."; + case FMOD.RESULT.ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle."; + case FMOD.RESULT.ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported."; + case FMOD.RESULT.ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular."; + case FMOD.RESULT.ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup."; + case FMOD.RESULT.ERR_MEMORY: return "Not enough memory or resources."; + case FMOD.RESULT.ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used."; + case FMOD.RESULT.ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound."; + case FMOD.RESULT.ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support."; + case FMOD.RESULT.ERR_NET_CONNECT: return "Couldn't connect to the specified host."; + case FMOD.RESULT.ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere."; + case FMOD.RESULT.ERR_NET_URL: return "The specified URL couldn't be resolved."; + case FMOD.RESULT.ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately."; + case FMOD.RESULT.ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready."; + case FMOD.RESULT.ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused."; + case FMOD.RESULT.ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer."; + case FMOD.RESULT.ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted."; + case FMOD.RESULT.ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format."; + case FMOD.RESULT.ERR_OUTPUT_INIT: return "Error initializing output device."; + case FMOD.RESULT.ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails."; + case FMOD.RESULT.ERR_PLUGIN: return "An unspecified error has been returned from a plugin."; + case FMOD.RESULT.ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available."; + case FMOD.RESULT.ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be allocated or found. (ie the DLS file for MIDI playback)"; + case FMOD.RESULT.ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version."; + case FMOD.RESULT.ERR_RECORD: return "An error occurred trying to initialize the recording device."; + case FMOD.RESULT.ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection."; + case FMOD.RESULT.ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist."; + case FMOD.RESULT.ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound."; + case FMOD.RESULT.ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first."; + case FMOD.RESULT.ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file."; + case FMOD.RESULT.ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags."; + case FMOD.RESULT.ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat."; + case FMOD.RESULT.ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated."; + case FMOD.RESULT.ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be. Contact support."; + case FMOD.RESULT.ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called."; + case FMOD.RESULT.ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified."; + case FMOD.RESULT.ERR_VERSION: return "The version number of this file format is not supported."; + case FMOD.RESULT.ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded."; + case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected."; + case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool."; + case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out."; + case FMOD.RESULT.ERR_EVENT_NOTFOUND: return "The requested event, bus or vca could not be found."; + case FMOD.RESULT.ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized."; + case FMOD.RESULT.ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded."; + case FMOD.RESULT.ERR_INVALID_STRING: return "An invalid string was passed to this function."; + case FMOD.RESULT.ERR_ALREADY_LOCKED: return "The specified resource is already locked."; + case FMOD.RESULT.ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked."; + case FMOD.RESULT.ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected."; + case FMOD.RESULT.ERR_TOOMANYSAMPLES: return "The length provided exceed the allowable limit."; + default: return "Unknown error."; + } + } + } +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_errors.h b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_errors.h new file mode 100644 index 0000000..de0ce78 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_errors.h @@ -0,0 +1,110 @@ +/* ============================================================================================== */ +/* FMOD Core / Studio API - Error string header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header if you want to store or display a string version / english explanation */ +/* of the FMOD error codes. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/core-api-common.html#fmod_result */ +/* =============================================================================================== */ +#ifndef _FMOD_ERRORS_H +#define _FMOD_ERRORS_H + +#include "fmod.h" + +#ifdef __GNUC__ +static const char *FMOD_ErrorString(FMOD_RESULT errcode) __attribute__((unused)); +#endif + +static const char *FMOD_ErrorString(FMOD_RESULT errcode) +{ + switch (errcode) + { + case FMOD_OK: return "No errors."; + case FMOD_ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound)."; + case FMOD_ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel."; + case FMOD_ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound."; + case FMOD_ERR_DMA: return "DMA Failure. See debug output for more information."; + case FMOD_ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts."; + case FMOD_ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph."; + case FMOD_ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map."; + case FMOD_ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released."; + case FMOD_ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified."; + case FMOD_ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system."; + case FMOD_ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph."; + case FMOD_ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type."; + case FMOD_ERR_FILE_BAD: return "Error loading file."; + case FMOD_ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format."; + case FMOD_ERR_FILE_DISKEJECTED: return "Media was ejected while reading."; + case FMOD_ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?)."; + case FMOD_ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data."; + case FMOD_ERR_FILE_NOTFOUND: return "File not found."; + case FMOD_ERR_FORMAT: return "Unsupported file or audio format."; + case FMOD_ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library."; + case FMOD_ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere."; + case FMOD_ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden."; + case FMOD_ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource."; + case FMOD_ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred."; + case FMOD_ERR_HTTP_TIMEOUT: return "The HTTP request timed out."; + case FMOD_ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function."; + case FMOD_ERR_INITIALIZED: return "Cannot call this command after System::init."; + case FMOD_ERR_INTERNAL: return "An error occured in the FMOD system. Use the logging version of FMOD for more information."; + case FMOD_ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float."; + case FMOD_ERR_INVALID_HANDLE: return "An invalid object handle was used."; + case FMOD_ERR_INVALID_PARAM: return "An invalid parameter was passed to this function."; + case FMOD_ERR_INVALID_POSITION: return "An invalid seek position was passed to this function."; + case FMOD_ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode."; + case FMOD_ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle."; + case FMOD_ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported."; + case FMOD_ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular."; + case FMOD_ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup."; + case FMOD_ERR_MEMORY: return "Not enough memory or resources."; + case FMOD_ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used."; + case FMOD_ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound."; + case FMOD_ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support."; + case FMOD_ERR_NET_CONNECT: return "Couldn't connect to the specified host."; + case FMOD_ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere."; + case FMOD_ERR_NET_URL: return "The specified URL couldn't be resolved."; + case FMOD_ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately."; + case FMOD_ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready."; + case FMOD_ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused."; + case FMOD_ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer."; + case FMOD_ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted."; + case FMOD_ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format."; + case FMOD_ERR_OUTPUT_INIT: return "Error initializing output device."; + case FMOD_ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails."; + case FMOD_ERR_PLUGIN: return "An unspecified error has been returned from a plugin."; + case FMOD_ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available."; + case FMOD_ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be allocated or found. (ie the DLS file for MIDI playback)"; + case FMOD_ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version."; + case FMOD_ERR_RECORD: return "An error occurred trying to initialize the recording device."; + case FMOD_ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection."; + case FMOD_ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist."; + case FMOD_ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound."; + case FMOD_ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first."; + case FMOD_ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file."; + case FMOD_ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags."; + case FMOD_ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat."; + case FMOD_ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated."; + case FMOD_ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be. Contact support."; + case FMOD_ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called."; + case FMOD_ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified."; + case FMOD_ERR_VERSION: return "The version number of this file format is not supported."; + case FMOD_ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded."; + case FMOD_ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected."; + case FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool."; + case FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out."; + case FMOD_ERR_EVENT_NOTFOUND: return "The requested event, parameter, bus or vca could not be found."; + case FMOD_ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized."; + case FMOD_ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded."; + case FMOD_ERR_INVALID_STRING: return "An invalid string was passed to this function."; + case FMOD_ERR_ALREADY_LOCKED: return "The specified resource is already locked."; + case FMOD_ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked."; + case FMOD_ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected."; + case FMOD_ERR_TOOMANYSAMPLES: return "The length provided exceeds the allowable limit."; + default : return "Unknown error."; + }; +} + +#endif diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_output.h b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_output.h new file mode 100644 index 0000000..95b3714 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/inc/fmod_output.h @@ -0,0 +1,122 @@ +/* ======================================================================================== */ +/* FMOD Core API - output development header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header if you are wanting to develop your own output plugin to use with */ +/* FMOD's output system. With this header you can make your own output plugin that FMOD */ +/* can register and use. See the documentation and examples on how to make a working */ +/* plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/plugin-api-output.html */ +/* ======================================================================================== */ +#ifndef _FMOD_OUTPUT_H +#define _FMOD_OUTPUT_H + +typedef struct FMOD_OUTPUT_STATE FMOD_OUTPUT_STATE; +typedef struct FMOD_OUTPUT_OBJECT3DINFO FMOD_OUTPUT_OBJECT3DINFO; + +/* + Output constants +*/ +#define FMOD_OUTPUT_PLUGIN_VERSION 5 + +typedef unsigned int FMOD_OUTPUT_METHOD; +#define FMOD_OUTPUT_METHOD_MIX_DIRECT 0 +#define FMOD_OUTPUT_METHOD_MIX_BUFFERED 1 + +/* + Output callbacks +*/ +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *numdrivers); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETDRIVERINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_INIT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int selecteddriver, FMOD_INITFLAGS flags, int *outputrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_SOUND_FORMAT *outputformat, int dspbufferlength, int *dspnumbuffers, int *dspnumadditionalbuffers, void *extradriverdata); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_START_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_STOP_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSE_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_UPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETHANDLE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **handle); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_MIXER_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *maxhardwareobjects); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **object3d); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DFREE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d, const FMOD_OUTPUT_OBJECT3DINFO *info); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OPENPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, int *portId, int *portRate, int *portChannels, FMOD_SOUND_FORMAT *portFormat); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSEPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int portId); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK)(FMOD_OUTPUT_STATE *output_state); + +/* + Output functions +*/ +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_READFROMMIXER_FUNC) (FMOD_OUTPUT_STATE *output_state, void *buffer, unsigned int length); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_COPYPORT_FUNC) (FMOD_OUTPUT_STATE *output_state, int portId, void *buffer, unsigned int length); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_REQUESTRESET_FUNC) (FMOD_OUTPUT_STATE *output_state); +typedef void * (F_CALL *FMOD_OUTPUT_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line); +typedef void (F_CALL *FMOD_OUTPUT_FREE_FUNC) (void *ptr, const char *file, int line); +typedef void (F_CALL *FMOD_OUTPUT_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...); + +/* + Output structures +*/ +typedef struct FMOD_OUTPUT_DESCRIPTION +{ + unsigned int apiversion; + const char *name; + unsigned int version; + FMOD_OUTPUT_METHOD method; + FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK getnumdrivers; + FMOD_OUTPUT_GETDRIVERINFO_CALLBACK getdriverinfo; + FMOD_OUTPUT_INIT_CALLBACK init; + FMOD_OUTPUT_START_CALLBACK start; + FMOD_OUTPUT_STOP_CALLBACK stop; + FMOD_OUTPUT_CLOSE_CALLBACK close; + FMOD_OUTPUT_UPDATE_CALLBACK update; + FMOD_OUTPUT_GETHANDLE_CALLBACK gethandle; + FMOD_OUTPUT_MIXER_CALLBACK mixer; + FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK object3dgetinfo; + FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK object3dalloc; + FMOD_OUTPUT_OBJECT3DFREE_CALLBACK object3dfree; + FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK object3dupdate; + FMOD_OUTPUT_OPENPORT_CALLBACK openport; + FMOD_OUTPUT_CLOSEPORT_CALLBACK closeport; + FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK devicelistchanged; +} FMOD_OUTPUT_DESCRIPTION; + +struct FMOD_OUTPUT_STATE +{ + void *plugindata; + FMOD_OUTPUT_READFROMMIXER_FUNC readfrommixer; + FMOD_OUTPUT_ALLOC_FUNC alloc; + FMOD_OUTPUT_FREE_FUNC free; + FMOD_OUTPUT_LOG_FUNC log; + FMOD_OUTPUT_COPYPORT_FUNC copyport; + FMOD_OUTPUT_REQUESTRESET_FUNC requestreset; +}; + +struct FMOD_OUTPUT_OBJECT3DINFO +{ + float *buffer; + unsigned int bufferlength; + FMOD_VECTOR position; + float gain; + float spread; + float priority; +}; + +/* + Output macros +*/ +#define FMOD_OUTPUT_READFROMMIXER(_state, _buffer, _length) \ + (_state)->readfrommixer(_state, _buffer, _length) +#define FMOD_OUTPUT_ALLOC(_state, _size, _align) \ + (_state)->alloc(_size, _align, __FILE__, __LINE__) +#define FMOD_OUTPUT_FREE(_state, _ptr) \ + (_state)->free(_ptr, __FILE__, __LINE__) +#define FMOD_OUTPUT_LOG(_state, _level, _location, _format, ...) \ + (_state)->log(_level, __FILE__, __LINE__, _location, _format, ##__VA_ARGS__) +#define FMOD_OUTPUT_COPYPORT(_state, _id, _buffer, _length) \ + (_state)->copyport(_state, _id, _buffer, _length) +#define FMOD_OUTPUT_REQUESTRESET(_state) \ + (_state)->requestreset(_state) + +#endif /* _FMOD_OUTPUT_H */ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmod.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmod.so.14 new file mode 120000 index 0000000..1e134f3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmod.so.14 @@ -0,0 +1 @@ +libfmod.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmod.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmod.so.14.7 new file mode 100755 index 0000000..7b1d5fd Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmod.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmodL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmodL.so.14 new file mode 120000 index 0000000..6bc362f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmodL.so.14 @@ -0,0 +1 @@ +libfmodL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmodL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmodL.so.14.7 new file mode 100755 index 0000000..13c84c0 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm/libfmodL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmod.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmod.so.14 new file mode 120000 index 0000000..1e134f3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmod.so.14 @@ -0,0 +1 @@ +libfmod.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmod.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmod.so.14.7 new file mode 100755 index 0000000..4a8dbbb Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmod.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmodL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmodL.so.14 new file mode 120000 index 0000000..6bc362f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmodL.so.14 @@ -0,0 +1 @@ +libfmodL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmodL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmodL.so.14.7 new file mode 100755 index 0000000..c735e37 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/arm64/libfmodL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmod.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmod.so.14 new file mode 120000 index 0000000..1e134f3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmod.so.14 @@ -0,0 +1 @@ +libfmod.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmod.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmod.so.14.7 new file mode 100755 index 0000000..ab067fc Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmod.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmodL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmodL.so.14 new file mode 120000 index 0000000..6bc362f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmodL.so.14 @@ -0,0 +1 @@ +libfmodL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmodL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmodL.so.14.7 new file mode 100755 index 0000000..4417969 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86/libfmodL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmod.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmod.so.14 new file mode 120000 index 0000000..1e134f3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmod.so.14 @@ -0,0 +1 @@ +libfmod.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmod.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmod.so.14.7 new file mode 100755 index 0000000..282065f Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmod.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmodL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmodL.so.14 new file mode 120000 index 0000000..6bc362f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmodL.so.14 @@ -0,0 +1 @@ +libfmodL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmodL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmodL.so.14.7 new file mode 100755 index 0000000..fab895d Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/core/lib/x86_64/libfmodL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/inc/fsbank.h b/SimpleGame/fmodstudioapi20307linux/api/fsbank/inc/fsbank.h new file mode 100644 index 0000000..6340365 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/fsbank/inc/fsbank.h @@ -0,0 +1,158 @@ +#ifndef _FSBANK_H +#define _FSBANK_H + +#if defined(_WIN32) + #define FB_EXPORT __declspec(dllexport) + #define FB_CALL __stdcall +#else + #define FB_EXPORT __attribute__((visibility("default"))) + #define FB_CALL +#endif + +#if defined(DLL_EXPORTS) + #define FB_API FB_EXPORT FB_CALL +#else + #define FB_API FB_CALL +#endif + +/* + FSBank types +*/ +typedef unsigned int FSBANK_INITFLAGS; +typedef unsigned int FSBANK_BUILDFLAGS; + +#define FSBANK_INIT_NORMAL 0x00000000 +#define FSBANK_INIT_IGNOREERRORS 0x00000001 +#define FSBANK_INIT_WARNINGSASERRORS 0x00000002 +#define FSBANK_INIT_CREATEINCLUDEHEADER 0x00000004 +#define FSBANK_INIT_DONTLOADCACHEFILES 0x00000008 +#define FSBANK_INIT_GENERATEPROGRESSITEMS 0x00000010 + +#define FSBANK_BUILD_DEFAULT 0x00000000 +#define FSBANK_BUILD_DISABLESYNCPOINTS 0x00000001 +#define FSBANK_BUILD_DONTLOOP 0x00000002 +#define FSBANK_BUILD_FILTERHIGHFREQ 0x00000004 +#define FSBANK_BUILD_DISABLESEEKING 0x00000008 +#define FSBANK_BUILD_OPTIMIZESAMPLERATE 0x00000010 +#define FSBANK_BUILD_FSB5_DONTWRITENAMES 0x00000080 +#define FSBANK_BUILD_NOGUID 0x00000100 +#define FSBANK_BUILD_WRITEPEAKVOLUME 0x00000200 +#define FSBANK_BUILD_ALIGN4K 0x00000400 + +#define FSBANK_BUILD_OVERRIDE_MASK (FSBANK_BUILD_DISABLESYNCPOINTS | FSBANK_BUILD_DONTLOOP | FSBANK_BUILD_FILTERHIGHFREQ | FSBANK_BUILD_DISABLESEEKING | FSBANK_BUILD_OPTIMIZESAMPLERATE | FSBANK_BUILD_WRITEPEAKVOLUME) +#define FSBANK_BUILD_CACHE_VALIDATION_MASK (FSBANK_BUILD_DONTLOOP | FSBANK_BUILD_FILTERHIGHFREQ | FSBANK_BUILD_OPTIMIZESAMPLERATE) + +typedef enum FSBANK_RESULT +{ + FSBANK_OK, + FSBANK_ERR_CACHE_CHUNKNOTFOUND, + FSBANK_ERR_CANCELLED, + FSBANK_ERR_CANNOT_CONTINUE, + FSBANK_ERR_ENCODER, + FSBANK_ERR_ENCODER_INIT, + FSBANK_ERR_ENCODER_NOTSUPPORTED, + FSBANK_ERR_FILE_OS, + FSBANK_ERR_FILE_NOTFOUND, + FSBANK_ERR_FMOD, + FSBANK_ERR_INITIALIZED, + FSBANK_ERR_INVALID_FORMAT, + FSBANK_ERR_INVALID_PARAM, + FSBANK_ERR_MEMORY, + FSBANK_ERR_UNINITIALIZED, + FSBANK_ERR_WRITER_FORMAT, + FSBANK_WARN_CANNOTLOOP, + FSBANK_WARN_IGNORED_FILTERHIGHFREQ, + FSBANK_WARN_IGNORED_DISABLESEEKING, + FSBANK_WARN_FORCED_DONTWRITENAMES, + FSBANK_ERR_ENCODER_FILE_NOTFOUND, + FSBANK_ERR_ENCODER_FILE_BAD, + FSBANK_WARN_IGNORED_ALIGN4K, +} FSBANK_RESULT; + +typedef enum FSBANK_FORMAT +{ + FSBANK_FORMAT_PCM, + FSBANK_FORMAT_XMA, + FSBANK_FORMAT_AT9, + FSBANK_FORMAT_VORBIS, + FSBANK_FORMAT_FADPCM, + FSBANK_FORMAT_OPUS, + + FSBANK_FORMAT_MAX +} FSBANK_FORMAT; + +typedef enum FSBANK_FSBVERSION +{ + FSBANK_FSBVERSION_FSB5, + + FSBANK_FSBVERSION_MAX +} FSBANK_FSBVERSION; + +typedef enum FSBANK_STATE +{ + FSBANK_STATE_DECODING, + FSBANK_STATE_ANALYSING, + FSBANK_STATE_PREPROCESSING, + FSBANK_STATE_ENCODING, + FSBANK_STATE_WRITING, + FSBANK_STATE_FINISHED, + FSBANK_STATE_FAILED, + FSBANK_STATE_WARNING, +} FSBANK_STATE; + +typedef struct FSBANK_SUBSOUND +{ + const char* const *fileNames; + const void* const *fileData; + const unsigned int *fileDataLengths; + unsigned int numFiles; + FSBANK_BUILDFLAGS overrideFlags; + unsigned int overrideQuality; + float desiredSampleRate; + float percentOptimizedRate; +} FSBANK_SUBSOUND; + +typedef struct FSBANK_PROGRESSITEM +{ + int subSoundIndex; + int threadIndex; + FSBANK_STATE state; + const void *stateData; +} FSBANK_PROGRESSITEM; + +typedef struct FSBANK_STATEDATA_FAILED +{ + FSBANK_RESULT errorCode; + char errorString[256]; +} FSBANK_STATEDATA_FAILED; + +typedef struct FSBANK_STATEDATA_WARNING +{ + FSBANK_RESULT warnCode; + char warningString[256]; +} FSBANK_STATEDATA_WARNING; + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* (FB_CALL *FSBANK_MEMORY_ALLOC_CALLBACK)(unsigned int size, unsigned int type, const char *sourceStr); +typedef void* (FB_CALL *FSBANK_MEMORY_REALLOC_CALLBACK)(void *ptr, unsigned int size, unsigned int type, const char *sourceStr); +typedef void (FB_CALL *FSBANK_MEMORY_FREE_CALLBACK)(void *ptr, unsigned int type, const char *sourceStr); + +FSBANK_RESULT FB_API FSBank_MemoryInit(FSBANK_MEMORY_ALLOC_CALLBACK userAlloc, FSBANK_MEMORY_REALLOC_CALLBACK userRealloc, FSBANK_MEMORY_FREE_CALLBACK userFree); +FSBANK_RESULT FB_API FSBank_Init(FSBANK_FSBVERSION version, FSBANK_INITFLAGS flags, unsigned int numSimultaneousJobs, const char *cacheDirectory); +FSBANK_RESULT FB_API FSBank_Release(); +FSBANK_RESULT FB_API FSBank_Build(const FSBANK_SUBSOUND *subSounds, unsigned int numSubSounds, FSBANK_FORMAT encodeFormat, FSBANK_BUILDFLAGS buildFlags, unsigned int quality, const char *encryptKey, const char *outputFileName); +FSBANK_RESULT FB_API FSBank_FetchFSBMemory(const void **data, unsigned int *length); +FSBANK_RESULT FB_API FSBank_BuildCancel(); +FSBANK_RESULT FB_API FSBank_FetchNextProgressItem(const FSBANK_PROGRESSITEM **progressItem); +FSBANK_RESULT FB_API FSBank_ReleaseProgressItem(const FSBANK_PROGRESSITEM *progressItem); +FSBANK_RESULT FB_API FSBank_MemoryGetStats(unsigned int *currentAllocated, unsigned int *maximumAllocated); + +#ifdef __cplusplus +} +#endif + +#endif // _FSBANK_H diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/inc/fsbank_errors.h b/SimpleGame/fmodstudioapi20307linux/api/fsbank/inc/fsbank_errors.h new file mode 100644 index 0000000..d9ec5c3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/fsbank/inc/fsbank_errors.h @@ -0,0 +1,35 @@ +#pragma once + +#include "fsbank.h" + +static const char *FSBank_ErrorString(FSBANK_RESULT result) +{ + switch (result) + { + case FSBANK_OK: return "No errors."; + case FSBANK_ERR_CACHE_CHUNKNOTFOUND: return "An expected chunk is missing from the cache, perhaps try deleting cache files."; + case FSBANK_ERR_CANCELLED: return "The build process was cancelled during compilation by the user."; + case FSBANK_ERR_CANNOT_CONTINUE: return "The build process cannot continue due to previously ignored errors."; + case FSBANK_ERR_ENCODER: return "Encoder for chosen format has encountered an unexpected error."; + case FSBANK_ERR_ENCODER_INIT: return "Encoder initialization failed."; + case FSBANK_ERR_ENCODER_NOTSUPPORTED: return "Encoder for chosen format is not supported on this platform."; + case FSBANK_ERR_FILE_OS: return "An operating system based file error was encountered."; + case FSBANK_ERR_FILE_NOTFOUND: return "A specified file could not be found."; + case FSBANK_ERR_FMOD: return "Internal error from FMOD sub-system."; + case FSBANK_ERR_INITIALIZED: return "Already initialized."; + case FSBANK_ERR_INVALID_FORMAT: return "The format of the source file is invalid."; + case FSBANK_ERR_INVALID_PARAM: return "An invalid parameter has been passed to this function."; + case FSBANK_ERR_MEMORY: return "Run out of memory."; + case FSBANK_ERR_UNINITIALIZED: return "Not initialized yet."; + case FSBANK_ERR_WRITER_FORMAT: return "Chosen encode format is not supported by this FSB version."; + case FSBANK_WARN_CANNOTLOOP: return "Source file is too short for seamless looping. Looping disabled."; + case FSBANK_WARN_IGNORED_FILTERHIGHFREQ: return "FSBANK_BUILD_FILTERHIGHFREQ flag ignored: feature only supported by XMA format."; + case FSBANK_WARN_IGNORED_DISABLESEEKING: return "FSBANK_BUILD_DISABLESEEKING flag ignored: feature only supported by XMA format."; + case FSBANK_WARN_FORCED_DONTWRITENAMES: return "FSBANK_BUILD_FSB5_DONTWRITENAMES flag forced: cannot write names when source is from memory."; + case FSBANK_ERR_ENCODER_FILE_NOTFOUND: return "External encoder dynamic library not found."; + case FSBANK_ERR_ENCODER_FILE_BAD: return "External encoder dynamic library could not be loaded, possibly incorrect binary format, incorrect architecture, or file corruption."; + case FSBANK_WARN_IGNORED_ALIGN4K: return "FSBANK_BUILD_ALIGN4K flag ignored: feature only supported by Opus, Vorbis, and FADPCM formats."; + default: return "Unknown error."; + } +} + diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbank.so.14 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbank.so.14 new file mode 120000 index 0000000..64e3255 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbank.so.14 @@ -0,0 +1 @@ +libfsbank.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbank.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbank.so.14.7 new file mode 100755 index 0000000..70c910e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbank.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbankL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbankL.so.14 new file mode 120000 index 0000000..9f91bb8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbankL.so.14 @@ -0,0 +1 @@ +libfsbankL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbankL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbankL.so.14.7 new file mode 100755 index 0000000..692059e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86/libfsbankL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbank.so.14 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbank.so.14 new file mode 120000 index 0000000..64e3255 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbank.so.14 @@ -0,0 +1 @@ +libfsbank.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbank.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbank.so.14.7 new file mode 100755 index 0000000..9638396 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbank.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbankL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbankL.so.14 new file mode 120000 index 0000000..9f91bb8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbankL.so.14 @@ -0,0 +1 @@ +libfsbankL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbankL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbankL.so.14.7 new file mode 100755 index 0000000..da9cc71 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/fsbank/lib/x86_64/libfsbankL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d.cpp new file mode 100644 index 0000000..9495b24 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d.cpp @@ -0,0 +1,163 @@ +/*============================================================================== +Event 3D Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example demonstrates how to position events in 3D for spatialization. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" + +const int SCREEN_WIDTH = NUM_COLUMNS; +const int SCREEN_HEIGHT = 16; + +int currentScreenPosition = -1; +char screenBuffer[(SCREEN_WIDTH + 1) * SCREEN_HEIGHT + 1] = {0}; + +void initializeScreenBuffer(); +void updateScreenPosition(const FMOD_VECTOR& worldPosition); + +int FMOD_Main() +{ + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + + // The example Studio project is authored for 5.1 sound, so set up the system output mode to match + FMOD::System* coreSystem = NULL; + ERRCHECK( system->getCoreSystem(&coreSystem) ); + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); + + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + FMOD::Studio::Bank* masterBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); + + FMOD::Studio::Bank* stringsBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); + + FMOD::Studio::Bank* vehiclesBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Vehicles.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &vehiclesBank) ); + + FMOD::Studio::EventDescription* eventDescription = NULL; + ERRCHECK( system->getEvent("event:/Vehicles/Ride-on Mower", &eventDescription) ); + + FMOD::Studio::EventInstance* eventInstance = NULL; + ERRCHECK( eventDescription->createInstance(&eventInstance) ); + + ERRCHECK( eventInstance->setParameterByName("RPM", 650.0f) ); + ERRCHECK( eventInstance->start() ); + + // Position the listener at the origin + FMOD_3D_ATTRIBUTES attributes = { { 0 } }; + attributes.forward.z = 1.0f; + attributes.up.y = 1.0f; + ERRCHECK( system->setListenerAttributes(0, &attributes) ); + + // Position the event 2 units in front of the listener + attributes.position.z = 2.0f; + ERRCHECK( eventInstance->set3DAttributes(&attributes) ); + + initializeScreenBuffer(); + + do + { + Common_Update(); + + if (Common_BtnDown(BTN_LEFT)) + { + attributes.position.x -= 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&attributes) ); + } + + if (Common_BtnDown(BTN_RIGHT)) + { + attributes.position.x += 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&attributes) ); + } + + if (Common_BtnDown(BTN_UP)) + { + attributes.position.z += 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&attributes) ); + } + + if (Common_BtnDown(BTN_DOWN)) + { + attributes.position.z -= 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&attributes) ); + } + + ERRCHECK( system->update() ); + + updateScreenPosition(attributes.position); + Common_Draw("=================================================="); + Common_Draw("Event 3D Example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(screenBuffer); + Common_Draw("Use the arrow keys (%s, %s, %s, %s) to control the event position", + Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT), Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} + +void initializeScreenBuffer() +{ + memset(screenBuffer, ' ', sizeof(screenBuffer)); + + int idx = SCREEN_WIDTH; + for (int i = 0; i < SCREEN_HEIGHT; ++i) + { + screenBuffer[idx] = '\n'; + idx += SCREEN_WIDTH + 1; + } + + screenBuffer[(SCREEN_WIDTH + 1) * SCREEN_HEIGHT] = '\0'; +} + +int getCharacterIndex(const FMOD_VECTOR& position) +{ + int row = static_cast(-position.z + (SCREEN_HEIGHT / 2)); + int col = static_cast(position.x + (SCREEN_WIDTH / 2)); + + if (0 < row && row < SCREEN_HEIGHT && 0 < col && col < SCREEN_WIDTH) + { + return (row * (SCREEN_WIDTH + 1)) + col; + } + + return -1; +} + +void updateScreenPosition(const FMOD_VECTOR& eventPosition) +{ + if (currentScreenPosition != -1) + { + screenBuffer[currentScreenPosition] = ' '; + currentScreenPosition = -1; + } + + FMOD_VECTOR origin = {0}; + int idx = getCharacterIndex(origin); + screenBuffer[idx] = '^'; + + idx = getCharacterIndex(eventPosition); + if (idx != -1) + { + screenBuffer[idx] = 'o'; + currentScreenPosition = idx; + } +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.creator.shared new file mode 100644 index 0000000..090da91 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/3d + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.files new file mode 100644 index 0000000..cbca9bb --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/3d.makefile +../3d.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d/3d.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi.cpp new file mode 100644 index 0000000..ec85e56 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi.cpp @@ -0,0 +1,241 @@ +/*============================================================================== +Event 3D Multi-Listener Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example demonstrates how use listener weighting to crossfade listeners +in and out. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" + +const int SCREEN_WIDTH = NUM_COLUMNS; +const int SCREEN_HEIGHT = 10; + +char backBuffer[(SCREEN_WIDTH + 1) * SCREEN_HEIGHT + 1] = {0}; +char screenBuffer[(SCREEN_WIDTH + 1) * SCREEN_HEIGHT + 1] = {0}; + +void initializeScreenBuffer(); +void updateScreenPosition(const FMOD_VECTOR& worldPosition, float listenerDist, float weight1, float weight2); + +int FMOD_Main() +{ + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + + // The example Studio project is authored for 5.1 sound, so set up the system output mode to match + FMOD::System* coreSystem = NULL; + ERRCHECK( system->getCoreSystem(&coreSystem) ); + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); + + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + FMOD::Studio::Bank* masterBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); + + FMOD::Studio::Bank* stringsBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); + + FMOD::Studio::Bank* vehiclesBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Vehicles.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &vehiclesBank) ); + + FMOD::Studio::EventDescription* eventDescription = NULL; + ERRCHECK( system->getEvent("event:/Vehicles/Ride-on Mower", &eventDescription) ); + + FMOD::Studio::EventInstance* eventInstance = NULL; + ERRCHECK( eventDescription->createInstance(&eventInstance) ); + + ERRCHECK( eventInstance->setParameterByName("RPM", 650.0f) ); + ERRCHECK( eventInstance->start() ); + + // Position two listeners + ERRCHECK( system->setNumListeners(2) ); + int activeListener = 0; + float listenerDist = 8.0f; + float listenerWeight[2] = { 1.0f, 0.0f }; + FMOD_3D_ATTRIBUTES listenerAttributes[2] = {}; + listenerAttributes[0].forward.z = 1.0f; + listenerAttributes[0].up.y = 1.0f; + listenerAttributes[0].position.x = -listenerDist; + listenerAttributes[1].forward.z = 1.0f; + listenerAttributes[1].up.y = 1.0f; + listenerAttributes[1].position.x = listenerDist; + + ERRCHECK( system->setListenerAttributes(0, &listenerAttributes[0]) ); + ERRCHECK( system->setListenerWeight(0, listenerWeight[0]) ); + ERRCHECK( system->setListenerAttributes(1, &listenerAttributes[1]) ); + ERRCHECK( system->setListenerWeight(1, listenerWeight[1]) ); + + // Position the event 2 units in front of the listener + FMOD_3D_ATTRIBUTES carAttributes = {}; + carAttributes.forward.z = 1.0f; + carAttributes.up.y = 1.0f; + carAttributes.position.x = 0.0f; + carAttributes.position.z = 2.0f; + ERRCHECK( eventInstance->set3DAttributes(&carAttributes) ); + + initializeScreenBuffer(); + + do + { + Common_Update(); + + if (Common_BtnPress(BTN_LEFT)) + { + carAttributes.position.x -= 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&carAttributes) ); + } + + if (Common_BtnPress(BTN_RIGHT)) + { + carAttributes.position.x += 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&carAttributes) ); + } + + if (Common_BtnPress(BTN_UP)) + { + carAttributes.position.z += 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&carAttributes) ); + } + + if (Common_BtnPress(BTN_DOWN)) + { + carAttributes.position.z -= 1.0f; + ERRCHECK( eventInstance->set3DAttributes(&carAttributes) ); + } + + if (Common_BtnPress(BTN_ACTION1)) + { + activeListener++; + if (activeListener > 2) + activeListener = 0; + } + + if (Common_BtnPress(BTN_ACTION2)) + { + activeListener--; + if (activeListener < 0) + activeListener = 2; + } + + if (Common_BtnPress(BTN_ACTION3)) + { + listenerDist -= 1.0f; + if (listenerDist < 0.0f) + listenerDist = 0.0f; + } + + if (Common_BtnPress(BTN_ACTION4)) + { + listenerDist += 1.0f; + if (listenerDist < 0.0f) + listenerDist = 0.0f; + } + + for (int i=0; i<2; ++i) + { + float target = (activeListener == i || activeListener == 2); // 0 = left, 1 = right, 2 = both + + float dist = (target - listenerWeight[i]); + float step = 50.0f / 1000.0f; // very rough estimate of 50ms per update, not properly timed + + if (dist >= -step && dist <= step) + listenerWeight[i] = target; + else if (dist > 0.0f) + listenerWeight[i] += step; + else + listenerWeight[i] += -step; + } + + listenerAttributes[0].position.x = -listenerDist; + listenerAttributes[1].position.x = listenerDist; + ERRCHECK( system->setListenerAttributes(0, &listenerAttributes[0]) ); + ERRCHECK( system->setListenerAttributes(1, &listenerAttributes[1]) ); + ERRCHECK( system->setListenerWeight(0, listenerWeight[0]) ); + ERRCHECK( system->setListenerWeight(1, listenerWeight[1]) ); + + ERRCHECK( system->update() ); + + updateScreenPosition(carAttributes.position, listenerDist, listenerWeight[0], listenerWeight[1]); + + Common_Draw("=================================================="); + Common_Draw("Event 3D Multi-Listener Example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(screenBuffer); + + Common_Draw("Left listener: %d%%", (int)(listenerWeight[0] * 100)); + Common_Draw("Right listener: %d%%", (int)(listenerWeight[1] * 100)); + Common_Draw("Use the arrow keys (%s, %s, %s, %s) to control the event position", + Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT), Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Use %s and %s to toggle left/right/both listeners", Common_BtnStr(BTN_ACTION1), Common_BtnStr(BTN_ACTION2)); + Common_Draw("Use %s and %s to move listeners closer or further apart", Common_BtnStr(BTN_ACTION3), Common_BtnStr(BTN_ACTION4)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} + +void initializeScreenBuffer() +{ + memset(backBuffer, ' ', sizeof(backBuffer)); + + int idx = SCREEN_WIDTH; + for (int i = 0; i < SCREEN_HEIGHT; ++i) + { + backBuffer[idx] = '\n'; + idx += SCREEN_WIDTH + 1; + } + + backBuffer[(SCREEN_WIDTH + 1) * SCREEN_HEIGHT] = '\0'; + memcpy(screenBuffer, backBuffer, sizeof(screenBuffer)); +} + +void setCharacterIndex(const FMOD_VECTOR& position, char ch) +{ + int row = static_cast(-position.z + (SCREEN_HEIGHT / 2)); + int col = static_cast(position.x + (SCREEN_WIDTH / 2)); + + if (0 < row && row < SCREEN_HEIGHT && 0 < col && col < SCREEN_WIDTH) + { + screenBuffer[row * (SCREEN_WIDTH + 1) + col] = ch; + } +} + +char symbolForWeight(float weight) +{ + if (weight >= 0.95f) + return 'X'; + else if (weight >= 0.05f) + return 'x'; + else + return '.'; +} + +void updateScreenPosition(const FMOD_VECTOR& worldPosition, float listenerDist, float weight1, float weight2) +{ + memcpy(screenBuffer, backBuffer, sizeof(screenBuffer)); + + FMOD_VECTOR pos = {0}; + setCharacterIndex(pos, '^'); + + pos.x = -listenerDist; + setCharacterIndex(pos, symbolForWeight(weight1)); + + pos.x = listenerDist; + setCharacterIndex(pos, symbolForWeight(weight2)); + + setCharacterIndex(worldPosition, 'o'); +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.creator.shared new file mode 100644 index 0000000..5d59284 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f 3d_multi.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/3d_multi + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.files new file mode 100644 index 0000000..e9c4654 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/3d_multi.makefile +../3d_multi.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/3d_multi/3d_multi.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common.cpp new file mode 100644 index 0000000..2dd1383 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common.cpp @@ -0,0 +1,234 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. +==============================================================================*/ +#include "common.h" +#include "fmod_errors.h" + +/* Cross platform OS Functions internal to the FMOD library, exposed for the example framework. */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct FMOD_OS_FILE FMOD_OS_FILE; +typedef struct FMOD_OS_CRITICALSECTION FMOD_OS_CRITICALSECTION; + +FMOD_RESULT F_API FMOD_OS_Time_GetUs(unsigned int *us); +FMOD_RESULT F_API FMOD_OS_Debug_Output(const char *format, ...); +FMOD_RESULT F_API FMOD_OS_File_Open(const char *name, int mode, unsigned int *filesize, FMOD_OS_FILE **handle); +FMOD_RESULT F_API FMOD_OS_File_Close(FMOD_OS_FILE *handle); +FMOD_RESULT F_API FMOD_OS_File_Read(FMOD_OS_FILE *handle, void *buf, unsigned int count, unsigned int *read); +FMOD_RESULT F_API FMOD_OS_File_Write(FMOD_OS_FILE *handle, const void *buffer, unsigned int bytesToWrite, bool flush); +FMOD_RESULT F_API FMOD_OS_File_Seek(FMOD_OS_FILE *handle, unsigned int offset); +FMOD_RESULT F_API FMOD_OS_Time_Sleep(unsigned int ms); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Create(FMOD_OS_CRITICALSECTION **crit, bool memorycrit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Free(FMOD_OS_CRITICALSECTION *crit, bool memorycrit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Enter(FMOD_OS_CRITICALSECTION *crit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_Leave(FMOD_OS_CRITICALSECTION *crit); +FMOD_RESULT F_API FMOD_OS_CriticalSection_TryEnter(FMOD_OS_CRITICALSECTION *crit, bool *entered); +FMOD_RESULT F_API FMOD_OS_CriticalSection_IsLocked(FMOD_OS_CRITICALSECTION *crit, bool *locked); +FMOD_RESULT F_API FMOD_OS_Thread_Create(const char *name, void (*callback)(void *param), void *param, FMOD_THREAD_AFFINITY affinity, FMOD_THREAD_PRIORITY priority, FMOD_THREAD_STACK_SIZE stacksize, void **handle); +FMOD_RESULT F_API FMOD_OS_Thread_Destroy(void *handle); + +#ifdef __cplusplus +} +#endif + +void (*Common_Private_Error)(FMOD_RESULT, const char *, int); + +void ERRCHECK_fn(FMOD_RESULT result, const char *file, int line) +{ + if (result != FMOD_OK) + { + if (Common_Private_Error) + { + Common_Private_Error(result, file, line); + } + Common_Fatal("%s(%d): FMOD error %d - %s", file, line, result, FMOD_ErrorString(result)); + } +} + +void Common_Format(char *buffer, int bufferSize, const char *formatString...) +{ + va_list args; + va_start(args, formatString); + Common_vsnprintf(buffer, bufferSize, formatString, args); + va_end(args); + buffer[bufferSize-1] = '\0'; +} + +void Common_Fatal(const char *format, ...) +{ + char error[1024]; + + va_list args; + va_start(args, format); + Common_vsnprintf(error, 1024, format, args); + va_end(args); + error[1023] = '\0'; + + do + { + Common_Draw("A fatal error has occurred..."); + Common_Draw(""); + Common_Draw("%s", error); + Common_Draw(""); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Update(); + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + Common_Exit(0); +} + +void Common_Draw(const char *format, ...) +{ + char string[1024]; + char *stringPtr = string; + + va_list args; + va_start(args, format); + Common_vsnprintf(string, 1024, format, args); + va_end(args); + string[1023] = '\0'; + + unsigned int length = (unsigned int)strlen(string); + + do + { + bool consumeNewLine = false; + unsigned int copyLength = length; + + // Search for new line characters + char *newLinePtr = strchr(stringPtr, '\n'); + if (newLinePtr) + { + consumeNewLine = true; + copyLength = (unsigned int)(newLinePtr - stringPtr); + } + + if (copyLength > NUM_COLUMNS) + { + // Hard wrap by default + copyLength = NUM_COLUMNS; + + // Loop for a soft wrap + for (int i = NUM_COLUMNS - 1; i >= 0; i--) + { + if (stringPtr[i] == ' ') + { + copyLength = i + 1; + break; + } + } + } + + // Null terminate the sub string temporarily by swapping out a char + char tempChar = stringPtr[copyLength]; + stringPtr[copyLength] = 0; + Common_DrawText(stringPtr); + stringPtr[copyLength] = tempChar; + + copyLength += (consumeNewLine ? 1 : 0); + length -= copyLength; + stringPtr += copyLength; + } while (length > 0); +} + +void Common_Time_GetUs(unsigned int *us) +{ + FMOD_OS_Time_GetUs(us); +} + +void Common_Log(const char *format, ...) +{ + char string[1024]; + + va_list args; + va_start(args, format); + Common_vsnprintf(string, 1024, format, args); + va_end(args); + string[1023] = '\0'; + + FMOD_OS_Debug_Output(string); +} + +void Common_LoadFileMemory(const char *name, void **buff, int *length) +{ + FMOD_OS_FILE *file = NULL; + unsigned int len, bytesread; + + FMOD_OS_File_Open(name, 0, &len, &file); + void *mem = malloc(len); + FMOD_OS_File_Read(file, mem, len, &bytesread); + FMOD_OS_File_Close(file); + + *buff = mem; + *length = bytesread; +} + +void Common_UnloadFileMemory(void *buff) +{ + free(buff); +} + +void Common_Sleep(unsigned int ms) +{ + FMOD_OS_Time_Sleep(ms); +} + +void Common_File_Open(const char *name, int mode, unsigned int *filesize, void **handle) +{ + FMOD_OS_File_Open(name, mode, filesize, (FMOD_OS_FILE **)handle); +} + +void Common_File_Close(void *handle) +{ + FMOD_OS_File_Close((FMOD_OS_FILE *)handle); +} + +void Common_File_Read(void *handle, void *buf, unsigned int length, unsigned int *read) +{ + FMOD_OS_File_Read((FMOD_OS_FILE *)handle, buf, length, read); +} + +void Common_File_Write(void *handle, void *buf, unsigned int length) +{ + FMOD_OS_File_Write((FMOD_OS_FILE *)handle, buf, length, true); +} + +void Common_File_Seek(void *handle, unsigned int offset) +{ + FMOD_OS_File_Seek((FMOD_OS_FILE *)handle, offset); +} + +void Common_Mutex_Create(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Create((FMOD_OS_CRITICALSECTION **)&mutex->crit, false); +} + +void Common_Mutex_Destroy(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Free((FMOD_OS_CRITICALSECTION *)mutex->crit, false); +} + +void Common_Mutex_Enter(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Enter((FMOD_OS_CRITICALSECTION *)mutex->crit); +} + +void Common_Mutex_Leave(Common_Mutex *mutex) +{ + FMOD_OS_CriticalSection_Leave((FMOD_OS_CRITICALSECTION *)mutex->crit); +} + +void Common_Thread_Create(void (*callback)(void *param), void *param, void **handle) +{ + FMOD_OS_Thread_Create("FMOD Example Thread", callback, param, FMOD_THREAD_AFFINITY_GROUP_A, FMOD_THREAD_PRIORITY_MEDIUM, (16 * 1024), handle); +} + +void Common_Thread_Destroy(void *handle) +{ + FMOD_OS_Thread_Destroy(handle); +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common.h b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common.h new file mode 100644 index 0000000..3a6ceb0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common.h @@ -0,0 +1,93 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. +==============================================================================*/ +#ifndef FMOD_EXAMPLES_COMMON_H +#define FMOD_EXAMPLES_COMMON_H + +#include "common_platform.h" +#include "fmod.h" + +#include +#include +#include +#include +#include +#include +#include + +#define NUM_COLUMNS 50 +#define NUM_ROWS 25 + +#ifndef Common_Sin + #define Common_Sin sin +#endif + +#ifndef Common_snprintf + #define Common_snprintf snprintf +#endif + +#ifndef Common_vsnprintf + #define Common_vsnprintf vsnprintf +#endif + +enum Common_Button +{ + BTN_ACTION1, + BTN_ACTION2, + BTN_ACTION3, + BTN_ACTION4, + BTN_LEFT, + BTN_RIGHT, + BTN_UP, + BTN_DOWN, + BTN_MORE, + BTN_QUIT +}; + +typedef struct +{ + void *crit; +} Common_Mutex; + +/* Cross platform functions (common) */ +void Common_Format(char *buffer, int bufferSize, const char *formatString...); +void Common_Fatal(const char *format, ...); +void Common_Draw(const char *format, ...); +void Common_Time_GetUs(unsigned int *us); +void Common_Log(const char *format, ...); +void Common_LoadFileMemory(const char *name, void **buff, int *length); +void Common_UnloadFileMemory(void *buff); +void Common_Sleep(unsigned int ms); +void Common_File_Open(const char *name, int mode, unsigned int *filesize, void **handle); // mode : 0 = read, 1 = write. +void Common_File_Close(void *handle); +void Common_File_Read(void *handle, void *buf, unsigned int length, unsigned int *read); +void Common_File_Write(void *handle, void *buf, unsigned int length); +void Common_File_Seek(void *handle, unsigned int offset); +void Common_Mutex_Create(Common_Mutex *mutex); +void Common_Mutex_Destroy(Common_Mutex *mutex); +void Common_Mutex_Enter(Common_Mutex *mutex); +void Common_Mutex_Leave(Common_Mutex *mutex); +void Common_Thread_Create(void (*callback)(void *param), void *param, void **handle); +void Common_Thread_Destroy(void *handle); + +void ERRCHECK_fn(FMOD_RESULT result, const char *file, int line); +#define ERRCHECK(_result) ERRCHECK_fn(_result, __FILE__, __LINE__) +#define Common_Max(_a, _b) ((_a) > (_b) ? (_a) : (_b)) +#define Common_Min(_a, _b) ((_a) < (_b) ? (_a) : (_b)) +#define Common_Clamp(_min, _val, _max) ((_val) < (_min) ? (_min) : ((_val) > (_max) ? (_max) : (_val))) + +/* Functions with platform specific implementation (common_platform) */ +void Common_Init(void **extraDriverData); +void Common_Close(); +void Common_Update(); +void Common_Exit(int returnCode); +void Common_DrawText(const char *text); +bool Common_BtnPress(Common_Button btn); +bool Common_BtnDown(Common_Button btn); +const char *Common_BtnStr(Common_Button btn); +const char *Common_MediaPath(const char *fileName); +const char *Common_WritePath(const char *fileName); + + +#endif diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common_platform.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common_platform.cpp new file mode 100644 index 0000000..06fe4e7 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common_platform.cpp @@ -0,0 +1,188 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2014-2025. +==============================================================================*/ +#include "common.h" +#include +#include +#include +#include + +static unsigned int gPressedButtons = 0; +static unsigned int gDownButtons = 0; +static std::string gConsoleText; +static std::vector gPathList; +static termios originalTerm = {0}; + +static void RevertTerminal() +{ + tcsetattr(STDIN_FILENO, TCSANOW, &originalTerm); + + printf("%c[?25h", 0x1B); // Show the cursor +} + +void Common_Init(void **extraDriverData) +{ + int err = tcgetattr(STDIN_FILENO, &originalTerm); + assert(err == 0); + + err = atexit(RevertTerminal); // Register for atexit in case we bail and don't call Common_Close + assert(err == 0); + + termios term = {0}; + err = tcgetattr(STDIN_FILENO, &term); + assert(err == 0); + + term.c_lflag &= ~(ICANON); // Disable special characters, i.e. EOF, EOL, etc + term.c_lflag &= ~(ECHO); // Prevent echo of characters + term.c_cc[VMIN] = 1; // Specify min number of bytes before a read() can return + + err = tcsetattr(STDIN_FILENO, TCSANOW, &term); + assert(err == 0); + + printf("%c[?25l", 0x1B); // Hide the cursor +} + +void Common_Close() +{ + for (std::vector::iterator item = gPathList.begin(); item != gPathList.end(); ++item) + { + free(*item); + } +} + +static bool IsKeyPressed() +{ + fd_set fileDescMask; + FD_ZERO(&fileDescMask); + FD_SET(STDIN_FILENO, &fileDescMask); + + timeval timeSpan = {0, 1000}; // 0s, 1000us + + // Check file descriptor provided for read, returns number of ready for read file descriptors + int err = select(1, &fileDescMask, NULL, NULL, &timeSpan); + assert(err >= 0); + + return (err > 0); +} + +void Common_Update() +{ + /* + Capture key input + */ + unsigned int newButtons = 0; + while (IsKeyPressed()) + { + unsigned int key = getchar(); + + if (key == '1') newButtons |= (1 << BTN_ACTION1); + else if (key == '2') newButtons |= (1 << BTN_ACTION2); + else if (key == '3') newButtons |= (1 << BTN_ACTION3); + else if (key == '4') newButtons |= (1 << BTN_ACTION4); + else if (key == 'w') newButtons |= (1 << BTN_UP); + else if (key == 'a') newButtons |= (1 << BTN_LEFT); + else if (key == 's') newButtons |= (1 << BTN_DOWN); + else if (key == 'd') newButtons |= (1 << BTN_RIGHT); + else if (key == 32) newButtons |= (1 << BTN_MORE); + else if (key == 'q') newButtons |= (1 << BTN_QUIT); + } + + gPressedButtons = (gDownButtons ^ newButtons) & newButtons; + gDownButtons = newButtons; + + /* + Update the screen + */ + printf("%c[H", 0x1B); // Move cursor to home position + printf("%s", gConsoleText.c_str()); // Terminal console is already double buffered, so just print + printf("%c[J", 0x1B); // Clear the rest of the screen + + gConsoleText.clear(); +} + +void Common_Exit(int returnCode) +{ + exit(returnCode); +} + +void Common_DrawText(const char *text) +{ + char s[256]; + snprintf(s, sizeof(s), "%s%c[K\n", text, 0x1B); // Print the text and clear the rest of the line + + gConsoleText.append(s); +} + +bool Common_BtnPress(Common_Button btn) +{ + return ((gPressedButtons & (1 << btn)) != 0); +} + +bool Common_BtnDown(Common_Button btn) +{ + return ((gDownButtons & (1 << btn)) != 0); +} + +const char *Common_BtnStr(Common_Button btn) +{ + switch (btn) + { + case BTN_ACTION1: return "1"; + case BTN_ACTION2: return "2"; + case BTN_ACTION3: return "3"; + case BTN_ACTION4: return "4"; + case BTN_UP: return "W"; + case BTN_LEFT: return "A"; + case BTN_DOWN: return "S"; + case BTN_RIGHT: return "D"; + case BTN_MORE: return "SPACE"; + case BTN_QUIT: return "Q"; + default: return "Unknown"; + } +} + +const char *Common_MediaPath(const char *fileName) +{ + static bool pathInitialized = false; + static char pathPrefix[256] = { }; + if (!pathInitialized) + { + pathInitialized = true; + FILE *file = fopen(fileName, "r"); + if (file) + { + fclose(file); + pathPrefix[0] = 0; + } + else + { + ssize_t len = readlink("/proc/self/exe", pathPrefix, 256); + assert(len != -1); + + char *filePathEnd = strrchr(pathPrefix, '/'); + assert (filePathEnd != NULL); + + filePathEnd++; // Move past the last slash + filePathEnd[0] = '\0'; + + strcat(pathPrefix, "../media/"); + } + } + if (pathPrefix[0] == 0) + { + return fileName; + } + + char *filePath = (char *)calloc(256, sizeof(char)); + strcpy(filePath, pathPrefix); + strcat(filePath, fileName); + gPathList.push_back(filePath); + + return filePath; +} + +const char *Common_WritePath(const char *fileName) +{ + return Common_MediaPath(fileName); +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common_platform.h b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common_platform.h new file mode 100644 index 0000000..2febd31 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/common_platform.h @@ -0,0 +1,12 @@ +/*============================================================================== +FMOD Example Framework +Copyright (c), Firelight Technologies Pty, Ltd 2014-2025. +==============================================================================*/ +#include +#include +#include + +#define COMMON_PLATFORM_SUPPORTS_FOPEN + +#define FMOD_Main() main(int, char**) +#define Common_TTY(format, ...) fprintf(stderr, format, __VA_ARGS__) diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter.cpp new file mode 100644 index 0000000..472ec93 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter.cpp @@ -0,0 +1,97 @@ +/*============================================================================== +Event Parameter Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example demonstrates how to control event playback using game parameters. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + FMOD::Studio::Bank* masterBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); + + FMOD::Studio::Bank* stringsBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); + + FMOD::Studio::Bank* sfxBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("SFX.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &sfxBank) ); + + FMOD::Studio::EventDescription* eventDescription = NULL; + ERRCHECK( system->getEvent("event:/Character/Player Footsteps", &eventDescription) ); + + // Find the parameter once and then set by handle + // Or we can just find by name every time but by handle is more efficient if we are setting lots of parameters + FMOD_STUDIO_PARAMETER_DESCRIPTION paramDesc; + ERRCHECK( eventDescription->getParameterDescriptionByName("Surface", ¶mDesc) ); + FMOD_STUDIO_PARAMETER_ID surfaceID = paramDesc.id; + + FMOD::Studio::EventInstance* eventInstance = NULL; + ERRCHECK( eventDescription->createInstance(&eventInstance) ); + + // Make the event audible to start with + float surfaceParameterValue = 1.0f; + ERRCHECK( eventInstance->setParameterByID(surfaceID, surfaceParameterValue) ); + + do + { + Common_Update(); + + if (Common_BtnPress(BTN_MORE)) + { + ERRCHECK( eventInstance->start() ); + } + + if (Common_BtnPress(BTN_ACTION1)) + { + surfaceParameterValue = Common_Max(paramDesc.minimum, surfaceParameterValue - 1.0f); + ERRCHECK( eventInstance->setParameterByID(surfaceID, surfaceParameterValue) ); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + surfaceParameterValue = Common_Min(surfaceParameterValue + 1.0f, paramDesc.maximum); + ERRCHECK( eventInstance->setParameterByID(surfaceID, surfaceParameterValue) ); + } + + ERRCHECK( system->update() ); + + float userValue = 0.0f; + float finalValue = 0.0f; + ERRCHECK( eventInstance->getParameterByID(surfaceID, &userValue, &finalValue) ); + + Common_Draw("=================================================="); + Common_Draw("Event Parameter Example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Surface Parameter = (user: %1.1f, final: %1.1f)", userValue, finalValue); + Common_Draw(""); + Common_Draw("Surface Parameter:"); + Common_Draw("Press %s to play event", Common_BtnStr(BTN_MORE)); + Common_Draw("Press %s to decrease value", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to increase value", Common_BtnStr(BTN_ACTION2)); + Common_Draw(""); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.creator.shared new file mode 100644 index 0000000..2a3c317 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f event_parameter.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/event_parameter + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.files new file mode 100644 index 0000000..9b56687 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/event_parameter.makefile +../event_parameter.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/event_parameter/event_parameter.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks.cpp new file mode 100644 index 0000000..4c857b0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks.cpp @@ -0,0 +1,427 @@ +/*============================================================================== +Load Banks Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example demonstrates loading banks via file, memory, and user callbacks. + +The banks that are loaded are: + +* SFX.bank (file) +* Music.bank (memory) +* Vehicles.bank (memory-point) +* VO.bank (custom) + +The loading and unloading is asynchronous, and we displays the current +state of each bank as loading is occuring. + +### See Also ### +* Studio::System::loadBankFile +* Studio::System::loadBankMemory +* Studio::System::loadBankCustom +* Studio::Bank::loadSampleData +* Studio::Bank::getLoadingState +* Studio::Bank::getSampleLoadingState +* Studio::Bank::getUserData +* Studio::Bank::setUserData + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" +#include + +// +// Some platforms don't support cross platform fopen. Or you can disable this +// to see how the sample deals with bank load failures. +// +#ifdef COMMON_PLATFORM_SUPPORTS_FOPEN + #define ENABLE_FILE_OPEN +#endif + +// +// Load method as enum for our sample code +// +enum LoadBankMethod +{ + LoadBank_File, + LoadBank_Memory, + LoadBank_MemoryPoint, + LoadBank_Custom +}; +static const char* BANK_LOAD_METHOD_NAMES[] = +{ + "File", + "Memory", + "Memory-Point", + "Custom" +}; + +// +// Sanity check for loading files +// +#ifdef ENABLE_FILE_OPEN + static const size_t MAX_FILE_LENGTH = 2*1024*1024*1024ULL; +#endif + +// +// Custom callbacks that just wrap fopen +// +FMOD_RESULT F_CALL customFileOpen(const char *name, unsigned int *filesize, void **handle, void *userdata) +{ +#ifdef ENABLE_FILE_OPEN + // We pass the filename into our callbacks via userdata in the custom info struct + const char* filename = (const char*)userdata; + FILE* file = fopen(filename, "rb"); + if (!file) + { + return FMOD_ERR_FILE_NOTFOUND; + } + fseek(file, 0, SEEK_END); + size_t length = ftell(file); + fseek(file, 0, SEEK_SET); + if (length >= MAX_FILE_LENGTH) + { + fclose(file); + return FMOD_ERR_FILE_BAD; + } + *filesize = (unsigned int)length; + *handle = file; + return FMOD_OK; +#else + return FMOD_ERR_FILE_NOTFOUND; +#endif +} + +FMOD_RESULT F_CALL customFileClose(void *handle, void *userdata) +{ +#ifdef ENABLE_FILE_OPEN + FILE* file = (FILE*)handle; + fclose(file); +#endif + return FMOD_OK; +} + +FMOD_RESULT F_CALL customFileRead(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata) +{ + *bytesread = 0; +#ifdef ENABLE_FILE_OPEN + FILE* file = (FILE*)handle; + size_t read = fread(buffer, 1, sizebytes, file); + *bytesread = (unsigned int)read; + // If the request is larger than the bytes left in the file, then we must return EOF + if (read < sizebytes) + { + return FMOD_ERR_FILE_EOF; + } +#endif + return FMOD_OK; +} + +FMOD_RESULT F_CALL customFileSeek(void *handle, unsigned int pos, void *userdata) +{ +#ifdef ENABLE_FILE_OPEN + FILE* file = (FILE*)handle; + fseek(file, pos, SEEK_SET); +#endif + return FMOD_OK; +} + +// +// Helper function that loads a file into aligned memory buffer +// +FMOD_RESULT loadFile(const char* filename, char** memoryBase, char** memoryPtr, int* memoryLength) +{ + // If we don't support fopen then just return a single invalid byte for our file + size_t length = 1; + +#ifdef ENABLE_FILE_OPEN + FILE* file = fopen(filename, "rb"); + if (!file) + { + return FMOD_ERR_FILE_NOTFOUND; + } + fseek(file, 0, SEEK_END); + length = ftell(file); + fseek(file, 0, SEEK_SET); + if (length >= MAX_FILE_LENGTH) + { + fclose(file); + return FMOD_ERR_FILE_BAD; + } +#endif + + // Load into a pointer aligned to FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT + char* membase = reinterpret_cast(malloc(length + FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT)); + char* memptr = (char*)(((size_t)membase + (FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT-1)) & ~(FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT-1)); + +#ifdef ENABLE_FILE_OPEN + size_t bytesRead = fread(memptr, 1, length, file); + fclose(file); + if (bytesRead != length) + { + free(membase); + return FMOD_ERR_FILE_BAD; + } +#endif + + *memoryBase = membase; + *memoryPtr = memptr; + *memoryLength = (int)length; + return FMOD_OK; +} + +// +// Helper function that loads a bank in using the given method +// +FMOD_RESULT loadBank(FMOD::Studio::System* system, LoadBankMethod method, const char* filename, FMOD::Studio::Bank** bank) +{ + if (method == LoadBank_File) + { + return system->loadBankFile(filename, FMOD_STUDIO_LOAD_BANK_NONBLOCKING, bank); + } + else if (method == LoadBank_Memory || method == LoadBank_MemoryPoint) + { + char* memoryBase; + char* memoryPtr; + int memoryLength; + FMOD_RESULT result = loadFile(filename, &memoryBase, &memoryPtr, &memoryLength); + if (result != FMOD_OK) + { + return result; + } + + FMOD_STUDIO_LOAD_MEMORY_MODE memoryMode = (method == LoadBank_MemoryPoint ? FMOD_STUDIO_LOAD_MEMORY_POINT : FMOD_STUDIO_LOAD_MEMORY); + result = system->loadBankMemory(memoryPtr, memoryLength, memoryMode, FMOD_STUDIO_LOAD_BANK_NONBLOCKING, bank); + if (result != FMOD_OK) + { + free(memoryBase); + return result; + } + + if (method == LoadBank_MemoryPoint) + { + // Keep memory around until bank unload completes + result = (*bank)->setUserData(memoryBase); + } + else + { + // Don't need memory any more + free(memoryBase); + } + return result; + } + else + { + // Set up custom callback + FMOD_STUDIO_BANK_INFO info; + memset(&info, 0, sizeof(info)); + info.size = sizeof(info); + info.opencallback = customFileOpen; + info.closecallback = customFileClose; + info.readcallback = customFileRead; + info.seekcallback = customFileSeek; + info.userdata = (void*)filename; + + return system->loadBankCustom(&info, FMOD_STUDIO_LOAD_BANK_NONBLOCKING, bank); + } +} + +// +// Helper function to return state as a string +// +const char* getLoadingStateString(FMOD_STUDIO_LOADING_STATE state, FMOD_RESULT loadResult) +{ + switch (state) + { + case FMOD_STUDIO_LOADING_STATE_UNLOADING: + return "unloading "; + case FMOD_STUDIO_LOADING_STATE_UNLOADED: + return "unloaded "; + case FMOD_STUDIO_LOADING_STATE_LOADING: + return "loading "; + case FMOD_STUDIO_LOADING_STATE_LOADED: + return "loaded "; + case FMOD_STUDIO_LOADING_STATE_ERROR: + // Show some common errors + if (loadResult == FMOD_ERR_NOTREADY) + { + return "error (rdy)"; + } + else if (loadResult == FMOD_ERR_FILE_BAD) + { + return "error (bad)"; + } + else if (loadResult == FMOD_ERR_FILE_NOTFOUND) + { + return "error (mis)"; + } + else + { + return "error "; + } + default: + return "???"; + }; +} + +// +// Helper function to return handle validity as a string. +// Just because the bank handle is valid doesn't mean the bank load +// has completed successfully! +// +const char* getHandleStateString(FMOD::Studio::Bank* bank) +{ + if (bank == NULL) + { + return "null "; + } + else if (!bank->isValid()) + { + return "invalid"; + } + else + { + return "valid "; + } +} + +// +// Callback to free memory-point allocation when it is safe to do so +// +FMOD_RESULT F_CALL studioCallback(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void *commanddata, void *userdata) +{ + if (type == FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD) + { + // For memory-point, it is now safe to free our memory + FMOD::Studio::Bank* bank = (FMOD::Studio::Bank*)commanddata; + void* memory; + ERRCHECK(bank->getUserData(&memory)); + if (memory) + { + free(memory); + } + } + return FMOD_OK; +} + +// +// Main example code +// +int FMOD_Main() +{ + void *extraDriverData = 0; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system; + ERRCHECK( FMOD::Studio::System::create(&system) ); + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + ERRCHECK( system->setCallback(studioCallback, FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD) ); + + static const int BANK_COUNT = 4; + static const char* BANK_NAMES[] = + { + "SFX.bank", + "Music.bank", + "Vehicles.bank", + "VO.bank", + }; + + FMOD::Studio::Bank* banks[BANK_COUNT] = {0}; + bool wantBankLoaded[BANK_COUNT] = {0}; + bool wantSampleLoad = true; + + do + { + Common_Update(); + + for (int i=0; iunload()); + wantBankLoaded[i] = false; + } + } + } + if (Common_BtnPress(BTN_MORE)) + { + wantSampleLoad = !wantSampleLoad; + } + + // Load bank sample data automatically if that mode is enabled + // Also query current status for text display + FMOD_RESULT loadStateResult[BANK_COUNT] = { FMOD_OK, FMOD_OK, FMOD_OK, FMOD_OK, }; + FMOD_RESULT sampleStateResult[BANK_COUNT] = { FMOD_OK, FMOD_OK, FMOD_OK, FMOD_OK, }; + FMOD_STUDIO_LOADING_STATE bankLoadState[BANK_COUNT] = { FMOD_STUDIO_LOADING_STATE_UNLOADED, FMOD_STUDIO_LOADING_STATE_UNLOADED, FMOD_STUDIO_LOADING_STATE_UNLOADED, FMOD_STUDIO_LOADING_STATE_UNLOADED }; + FMOD_STUDIO_LOADING_STATE sampleLoadState[BANK_COUNT] = { FMOD_STUDIO_LOADING_STATE_UNLOADED, FMOD_STUDIO_LOADING_STATE_UNLOADED, FMOD_STUDIO_LOADING_STATE_UNLOADED, FMOD_STUDIO_LOADING_STATE_UNLOADED }; + for (int i=0; iisValid()) + { + loadStateResult[i] = banks[i]->getLoadingState(&bankLoadState[i]); + } + if (bankLoadState[i] == FMOD_STUDIO_LOADING_STATE_LOADED) + { + sampleStateResult[i] = banks[i]->getSampleLoadingState(&sampleLoadState[i]); + if (wantSampleLoad && sampleLoadState[i] == FMOD_STUDIO_LOADING_STATE_UNLOADED) + { + ERRCHECK(banks[i]->loadSampleData()); + } + else if (!wantSampleLoad && (sampleLoadState[i] == FMOD_STUDIO_LOADING_STATE_LOADING || sampleLoadState[i] == FMOD_STUDIO_LOADING_STATE_LOADED)) + { + ERRCHECK(banks[i]->unloadSampleData()); + } + } + } + + ERRCHECK( system->update() ); + + Common_Draw("=================================================="); + Common_Draw("Bank Load Example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw("Name Handle Bank-State Sample-State"); + + for (int i=0; iunloadAll() ); + ERRCHECK( system->flushCommands() ); + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.creator.shared new file mode 100644 index 0000000..3936891 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f load_banks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/load_banks + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.files new file mode 100644 index 0000000..3544898 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/load_banks.makefile +../load_banks.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/load_banks/load_banks.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/3d.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/3d.makefile new file mode 100644 index 0000000..8aa17a1 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/3d.makefile @@ -0,0 +1,43 @@ +NAME = 3d + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../3d.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/3d_multi.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/3d_multi.makefile new file mode 100644 index 0000000..ba35579 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/3d_multi.makefile @@ -0,0 +1,43 @@ +NAME = 3d_multi + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../3d_multi.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/event_parameter.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/event_parameter.makefile new file mode 100644 index 0000000..d2a9d4b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/event_parameter.makefile @@ -0,0 +1,43 @@ +NAME = event_parameter + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../event_parameter.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/load_banks.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/load_banks.makefile new file mode 100644 index 0000000..a26f350 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/load_banks.makefile @@ -0,0 +1,43 @@ +NAME = load_banks + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../load_banks.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/music_callbacks.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/music_callbacks.makefile new file mode 100644 index 0000000..417484a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/music_callbacks.makefile @@ -0,0 +1,43 @@ +NAME = music_callbacks + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../music_callbacks.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/objectpan.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/objectpan.makefile new file mode 100644 index 0000000..d60372c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/objectpan.makefile @@ -0,0 +1,43 @@ +NAME = objectpan + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../objectpan.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/programmer_sound.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/programmer_sound.makefile new file mode 100644 index 0000000..7d2e167 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/programmer_sound.makefile @@ -0,0 +1,43 @@ +NAME = programmer_sound + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../programmer_sound.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/recording_playback.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/recording_playback.makefile new file mode 100644 index 0000000..780cfe9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/recording_playback.makefile @@ -0,0 +1,43 @@ +NAME = recording_playback + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../recording_playback.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/simple_event.makefile b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/simple_event.makefile new file mode 100644 index 0000000..76f5953 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/make/simple_event.makefile @@ -0,0 +1,43 @@ +NAME = simple_event + +ifndef CPU + $(error Specify CPU=[x86|x86_64|arm|arm64]) +endif +ifndef CONFIG + $(error Specify CONFIG=[Debug|Release]) +endif + +ifeq (${CPU}, arm) + FLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard +else ifeq (${CPU}, arm64) + FLAGS += -m64 -target aarch64-linux-gnu -march=armv8-a +else ifeq (${CPU}, x86) + FLAGS += -m32 +else + override CPU = x86_64 + FLAGS += -m64 +endif + +ifeq (${CONFIG}, Debug) + FLAGS += -g + SUFFIX = L +else + override CONFIG = Release + FLAGS += -O2 + SUFFIX = +endif + +SOURCE_FILES = \ + ../simple_event.cpp \ + ../common.cpp \ + ../common_platform.cpp + +INCLUDE_DIRS = \ + -I../../../core/inc \ + -I../../../studio/inc + +CORE_LIB = ../../../core/lib/${CPU}/libfmod${SUFFIX}.so +STUDIO_LIB = ../../../studio/lib/${CPU}/libfmodstudio${SUFFIX}.so + +all: + g++ -pthread ${FLAGS} -o ${NAME} ${SOURCE_FILES} -Wl,-rpath=\$$ORIGIN/$(dir ${CORE_LIB}),-rpath=\$$ORIGIN/$(dir ${STUDIO_LIB}) ${CORE_LIB} ${STUDIO_LIB} ${INCLUDE_DIRS} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640148main_APU Shutdown.ogg b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640148main_APU Shutdown.ogg new file mode 100644 index 0000000..7c8c88b Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640148main_APU Shutdown.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640165main_Lookin At It.ogg b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640165main_Lookin At It.ogg new file mode 100644 index 0000000..b0e4008 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640165main_Lookin At It.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640166main_MECO.ogg b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640166main_MECO.ogg new file mode 100644 index 0000000..c775fb1 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640166main_MECO.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640169main_Press to ATO.ogg b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640169main_Press to ATO.ogg new file mode 100644 index 0000000..644ed1f Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/640169main_Press to ATO.ogg differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_CN.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_CN.bank new file mode 100644 index 0000000..18e0561 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_CN.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_EN.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_EN.bank new file mode 100644 index 0000000..34ff7eb Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_EN.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_JP.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_JP.bank new file mode 100644 index 0000000..1f48d59 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Dialogue_JP.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Master.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Master.bank new file mode 100644 index 0000000..98366d0 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Master.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Master.strings.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Master.strings.bank new file mode 100644 index 0000000..d479933 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Master.strings.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Music.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Music.bank new file mode 100644 index 0000000..56dcc1b Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Music.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/SFX.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/SFX.bank new file mode 100644 index 0000000..6ad07ce Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/SFX.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/VO.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/VO.bank new file mode 100644 index 0000000..90511d3 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/VO.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Vehicles.bank b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Vehicles.bank new file mode 100644 index 0000000..9792c52 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/Vehicles.bank differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/programmer_sound.fsb b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/programmer_sound.fsb new file mode 100644 index 0000000..936a7bf Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/media/programmer_sound.fsb differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks.cpp new file mode 100644 index 0000000..c4a52fa --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks.cpp @@ -0,0 +1,175 @@ +/*============================================================================== +Music Callback Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example demonstrates beat and named marker callbacks when playing music. + +### See Also ### +* Studio::EventInstance::setCallback +* FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER +* FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" +#include +#include + +static const int MAX_ENTRIES = 6; + +struct CallbackInfo +{ + Common_Mutex mMutex; + std::vector mEntries; +}; + +FMOD_RESULT F_CALL markerCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void *parameters); + +int FMOD_Main() +{ + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + + // The example Studio project is authored for 5.1 sound, so set up the system output mode to match + FMOD::System* coreSystem = NULL; + ERRCHECK( system->getCoreSystem(&coreSystem) ); + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); + + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + FMOD::Studio::Bank* masterBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); + + FMOD::Studio::Bank* stringsBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); + + FMOD::Studio::Bank* musicBank = NULL; + FMOD_RESULT result = system->loadBankFile(Common_MediaPath("Music.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &musicBank); + if (result != FMOD_OK) + { + // Music bank is not exported by default, you will have to export from the tool first + Common_Fatal("Please export music.bank from the Studio tool to run this example"); + } + + FMOD::Studio::EventDescription* eventDescription = NULL; + ERRCHECK( system->getEvent("event:/Music/Level 01", &eventDescription) ); + + FMOD::Studio::EventInstance* eventInstance = NULL; + ERRCHECK( eventDescription->createInstance(&eventInstance) ); + + CallbackInfo info; + Common_Mutex_Create(&info.mMutex); + + ERRCHECK( eventInstance->setUserData(&info) ); + ERRCHECK( eventInstance->setCallback(markerCallback, + FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER | FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT | + FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED | FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED) ); + ERRCHECK( eventInstance->start() ); + + FMOD_STUDIO_PARAMETER_DESCRIPTION parameterDescription; + ERRCHECK( eventDescription->getParameterDescriptionByName("Progression", ¶meterDescription) ); + + FMOD_STUDIO_PARAMETER_ID progressionID = parameterDescription.id; + + float progression = 0.0f; + ERRCHECK(eventInstance->setParameterByID(progressionID, progression)); + + do + { + Common_Update(); + + if (Common_BtnPress(BTN_MORE)) + { + progression = (progression == 0.0f ? 1.0f : 0.0f); + ERRCHECK(eventInstance->setParameterByID(progressionID, progression)); + } + + ERRCHECK( system->update() ); + + int position; + ERRCHECK( eventInstance->getTimelinePosition(&position) ); + + Common_Draw("=================================================="); + Common_Draw("Music Callback Example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Timeline = %d", position); + Common_Draw(""); + // Obtain lock and look at our strings + Common_Mutex_Enter(&info.mMutex); + for (size_t i=0; irelease() ); + + Common_Mutex_Destroy(&info.mMutex); + Common_Close(); + + return 0; +} + +// Obtain a lock and add a string entry to our list +void markerAddString(CallbackInfo* info, const char* format, ...) +{ + char buf[256]; + va_list args; + va_start(args, format); + Common_vsnprintf(buf, 256, format, args); + va_end(args); + buf[255] = '\0'; + Common_Mutex_Enter(&info->mMutex); + if (info->mEntries.size() >= MAX_ENTRIES) + { + info->mEntries.erase(info->mEntries.begin()); + } + info->mEntries.push_back(std::string(buf)); + Common_Mutex_Leave(&info->mMutex); +} + +// Callback from Studio - Remember these callbacks will occur in the Studio update thread, NOT the game thread. +FMOD_RESULT F_CALL markerCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void *parameters) +{ + CallbackInfo* callbackInfo; + ERRCHECK(((FMOD::Studio::EventInstance*)event)->getUserData((void**)&callbackInfo)); + + if (type == FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER) + { + FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES* props = (FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES*)parameters; + markerAddString(callbackInfo, "Named marker '%s'", props->name); + } + else if (type == FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT) + { + FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES* props = (FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES*)parameters; + markerAddString(callbackInfo, "beat %d, bar %d (tempo %.1f %d:%d)", props->beat, props->bar, props->tempo, props->timesignatureupper, props->timesignaturelower); + } + if (type == FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED || type == FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED) + { + FMOD::Sound* sound = (FMOD::Sound*)parameters; + char name[256]; + ERRCHECK(sound->getName(name, 256)); + unsigned int len; + ERRCHECK(sound->getLength(&len, FMOD_TIMEUNIT_MS)); + + markerAddString(callbackInfo, "Sound '%s' (length %.3f) %s", + name, (float)len/1000.0f, + type == FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED ? "Started" : "Stopped"); + } + + return FMOD_OK; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.creator.shared new file mode 100644 index 0000000..2db284f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f music_callbacks.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/music_callbacks + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.files new file mode 100644 index 0000000..ff572fc --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/music_callbacks.makefile +../music_callbacks.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/music_callbacks/music_callbacks.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan.cpp new file mode 100644 index 0000000..9c53748 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan.cpp @@ -0,0 +1,189 @@ +/*============================================================================== +Object Panning Example +Copyright (c), Firelight Technologies Pty, Ltd 2015-2025. + +This example demonstrates the FMOD object panner. The usage is completely +transparent to the API, the only difference is how the event is authored in the +FMOD Studio tool. + +To hear the difference between object panning and normal panning this example +has two events (one configured with the normal panner, and one with the object +panner). As they move around the listener you may toggle between panning method +and two different sounds. + +Object panning requires compatible hardware such as a Dolby Atmos amplifier or +a Playstation VR headset. For cases when the necessary hardware is not available +FMOD will fallback to standard 3D panning. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" +#include + +int FMOD_Main() +{ + bool isOnGround = false; + bool useListenerAttenuationPosition = false; + + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + FMOD::Studio::System *system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + + // The example Studio project is authored for 5.1 sound, so set up the system output mode to match + FMOD::System* coreSystem = NULL; + ERRCHECK( system->getCoreSystem(&coreSystem) ); + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); + + // Attempt to initialize with a compatible object panning output + FMOD_RESULT result = coreSystem->setOutput(FMOD_OUTPUTTYPE_AUDIO3D); + if (result != FMOD_OK) + { + result = coreSystem->setOutput(FMOD_OUTPUTTYPE_WINSONIC); + if (result == FMOD_OK) + { + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_7POINT1POINT4, 0) ); + } + else + { + result = coreSystem->setOutput(FMOD_OUTPUTTYPE_PHASE); + if (result == FMOD_OK) + { + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_7POINT1POINT4, 0) ); + } + } + } + + int numDrivers = 0; + ERRCHECK( coreSystem->getNumDrivers(&numDrivers) ); + + if (numDrivers == 0) + { + ERRCHECK( coreSystem->setDSPBufferSize(512, 4) ); + ERRCHECK( coreSystem->setOutput(FMOD_OUTPUTTYPE_AUTODETECT) ); + } + + // Due to a bug in WinSonic on Windows, FMOD initialization may fail on some machines. + // If you get the error "FMOD error 51 - Error initializing output device", try using + // a different output type such as FMOD_OUTPUTTYPE_AUTODETECT + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + // Load everything needed for playback + FMOD::Studio::Bank *masterBank = NULL; + FMOD::Studio::Bank *musicBank = NULL; + FMOD::Studio::Bank *stringsBank = NULL; + FMOD::Studio::EventDescription *spatializerDescription = NULL; + FMOD::Studio::EventInstance *spatializerInstance = NULL; + float spatializer; + float radioFrequency; + + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); + ERRCHECK( system->loadBankFile(Common_MediaPath("Music.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &musicBank) ); + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); + ERRCHECK( system->getEvent("event:/Music/Radio Station", &spatializerDescription) ); + ERRCHECK( spatializerDescription->createInstance(&spatializerInstance) ); + ERRCHECK( spatializerInstance->start() ); + + do + { + Common_Update(); + + ERRCHECK(spatializerInstance->getParameterByName("Freq", NULL, &radioFrequency)); + ERRCHECK(spatializerInstance->getParameterByName("Spatializer", NULL, &spatializer)); + + if (Common_BtnPress(BTN_ACTION1)) + { + if (radioFrequency == 3.00f) + { + ERRCHECK(spatializerInstance->setParameterByName("Freq", 0.00f)); + } + else + { + ERRCHECK(spatializerInstance->setParameterByName("Freq", (radioFrequency + 1.50f))); + } + } + + if (Common_BtnPress(BTN_ACTION2)) + { + if (spatializer == 1.00) + { + ERRCHECK(spatializerInstance->setParameterByName("Spatializer", 0.00f)); + } + else + { + ERRCHECK(spatializerInstance->setParameterByName("Spatializer", 1.00f)); + } + } + + if (Common_BtnPress(BTN_ACTION3)) + { + isOnGround = !isOnGround; + } + + if (Common_BtnPress(BTN_ACTION4)) + { + useListenerAttenuationPosition = !useListenerAttenuationPosition; + } + + FMOD_3D_ATTRIBUTES vec = { }; + vec.forward.z = 1.0f; + vec.up.y = 1.0f; + static float t = 0; + vec.position.x = sinf(t) * 3.0f; /* Rotate sound in a circle */ + vec.position.z = cosf(t) * 3.0f; /* Rotate sound in a circle */ + t += 0.03f; + + if (isOnGround) + { + vec.position.y = 0; /* At ground level */ + } + else + { + vec.position.y = 5.0f; /* Up high */ + } + + ERRCHECK( spatializerInstance->set3DAttributes(&vec) ); + + FMOD_3D_ATTRIBUTES listener_vec = { }; + listener_vec.forward.z = 1.0f; + listener_vec.up.y = 1.0f; + + FMOD_VECTOR listener_attenuationPos = vec.position; + listener_attenuationPos.z -= -10.0f; + + ERRCHECK( system->setListenerAttributes(0, &listener_vec, useListenerAttenuationPosition ? &listener_attenuationPos : nullptr) ); + ERRCHECK( system->update() ); + + const char *radioString = (radioFrequency == 0.00f) ? "Rock" : (radioFrequency == 1.50f) ? "Lo-fi" : "Hip hop"; + const char *spatialString = (spatializer == 0.00f) ? "Standard 3D Spatializer" : "Object Spatializer"; + + Common_Draw("=================================================="); + Common_Draw("Object Panning Example."); + Common_Draw("Copyright (c) Firelight Technologies 2015-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Playing %s with the %s.", radioString, spatialString); + Common_Draw("Radio is %s.", isOnGround ? "on the ground" : "up in the air"); + Common_Draw(""); + Common_Draw("Press %s to switch stations.", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to switch spatializer.", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to elevate the event instance.", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to %s use of attenuation position.", Common_BtnStr(BTN_ACTION4), useListenerAttenuationPosition ? "disable" : "enable"); + Common_Draw(""); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + ERRCHECK( stringsBank->unload() ); + ERRCHECK( musicBank->unload() ); + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.creator.shared new file mode 100644 index 0000000..7740492 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f objectpan.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/objectpan + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.files new file mode 100644 index 0000000..64bfaa5 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/objectpan.makefile +../objectpan.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/objectpan/objectpan.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound.cpp new file mode 100644 index 0000000..957b8d8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound.cpp @@ -0,0 +1,177 @@ +/*============================================================================== +Programmer Sound Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example demonstrates how to implement the programmer sound callback to +play an event that has a programmer specified sound. + +### See Also ### +Studio::EventInstance::setCallback + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" + +struct ProgrammerSoundContext +{ + const char* dialogueString; +}; + +FMOD_RESULT F_CALL programmerSoundCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void *parameters); + +int FMOD_Main() +{ + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + + // The example Studio project is authored for 5.1 sound, so set up the system output mode to match + FMOD::System* coreSystem = NULL; + ERRCHECK( system->getCoreSystem(&coreSystem) ); + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); + + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + FMOD::Studio::Bank* masterBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); + + FMOD::Studio::Bank* stringsBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); + + FMOD::Studio::Bank* sfxBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("SFX.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &sfxBank) ); + + // Available banks + unsigned int bankIndex = 0; + static const char* const banks[] = { "Dialogue_EN.bank", "Dialogue_JP.bank", "Dialogue_CN.bank" }; + + FMOD::Studio::Bank* localizedBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath(banks[bankIndex]), FMOD_STUDIO_LOAD_BANK_NORMAL, &localizedBank) ); + + FMOD::Studio::EventDescription* eventDescription = NULL; + ERRCHECK( system->getEvent("event:/Character/Dialogue", &eventDescription) ); + + FMOD::Studio::EventInstance* eventInstance = NULL; + ERRCHECK( eventDescription->createInstance(&eventInstance) ); + + // Dialogue keys available + // These keys are shared amongst all audio tables + unsigned int dialogueIndex = 0; + static const char* const dialogue[] = {"welcome", "main menu", "goodbye"}; + + ProgrammerSoundContext programmerSoundContext; + programmerSoundContext.dialogueString = dialogue[dialogueIndex]; + + ERRCHECK( eventInstance->setUserData(&programmerSoundContext) ); + ERRCHECK( eventInstance->setCallback(programmerSoundCallback, FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND | FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND) ); + + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + ERRCHECK( localizedBank->unload() ); + + bankIndex = (bankIndex < 2) ? bankIndex + 1 : 0; + ERRCHECK( system->loadBankFile(Common_MediaPath(banks[bankIndex]), FMOD_STUDIO_LOAD_BANK_NORMAL, &localizedBank) ); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + dialogueIndex = (dialogueIndex < 2) ? dialogueIndex + 1 : 0; + programmerSoundContext.dialogueString = dialogue[dialogueIndex]; + } + + if (Common_BtnPress(BTN_MORE)) + { + ERRCHECK( eventInstance->start() ); + } + + ERRCHECK( system->update() ); + + Common_Draw("=================================================="); + Common_Draw("Programmer Sound Example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to change language", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to change dialogue", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to play the event", Common_BtnStr(BTN_MORE)); + Common_Draw(""); + Common_Draw("Language:"); + Common_Draw(" %s English", bankIndex == 0 ? ">" : " "); + Common_Draw(" %s Japanese", bankIndex == 1 ? ">" : " "); + Common_Draw(" %s Chinese", bankIndex == 2 ? ">" : " "); + Common_Draw(""); + Common_Draw("Dialogue:"); + Common_Draw(" %s Welcome to the FMOD Studio tutorial", dialogueIndex == 0 ? ">" : " "); + Common_Draw(" %s This is the main menu", dialogueIndex == 1 ? ">" : " "); + Common_Draw(" %s Goodbye", dialogueIndex == 2 ? ">" : " "); + Common_Draw(""); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} + +#define CHECK_RESULT(op) \ + { \ + FMOD_RESULT res = (op); \ + if (res != FMOD_OK) \ + { \ + return res; \ + } \ + } + +FMOD_RESULT F_CALL programmerSoundCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void *parameters) +{ + FMOD::Studio::EventInstance* eventInstance = (FMOD::Studio::EventInstance*)event; + + if (type == FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND) + { + FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters; + + // Get our context from the event instance user data + ProgrammerSoundContext* context = NULL; + CHECK_RESULT( eventInstance->getUserData((void**)&context) ); + + FMOD::Studio::System* studioSystem = NULL; + CHECK_RESULT( eventInstance->getSystem(&studioSystem) ); + // Find the audio file in the audio table with the key + FMOD_STUDIO_SOUND_INFO info; + CHECK_RESULT( studioSystem->getSoundInfo(context->dialogueString, &info) ); + + FMOD::System* coreSystem = NULL; + CHECK_RESULT( studioSystem->getCoreSystem(&coreSystem) ); + FMOD::Sound* sound = NULL; + CHECK_RESULT( coreSystem->createSound(info.name_or_data, FMOD_LOOP_NORMAL | FMOD_CREATECOMPRESSEDSAMPLE | FMOD_NONBLOCKING | info.mode, &info.exinfo, &sound) ); + + // Pass the sound to FMOD + props->sound = (FMOD_SOUND*)sound; + props->subsoundIndex = info.subsoundindex; + } + else if (type == FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND) + { + FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters; + + // Obtain the sound + FMOD::Sound* sound = (FMOD::Sound*)props->sound; + + // Release the sound + CHECK_RESULT( sound->release() ); + } + + return FMOD_OK; +} \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.creator.shared new file mode 100644 index 0000000..0e89e4b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f programmer_sound.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/programmer_sound + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.files new file mode 100644 index 0000000..997540c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/programmer_sound.makefile +../programmer_sound.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/programmer_sound/programmer_sound.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback.cpp new file mode 100644 index 0000000..17cc1b8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback.cpp @@ -0,0 +1,373 @@ +/*============================================================================== +API Recording Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example shows recording and playback functionality, allowing the user to +trigger some sounds and then play back what they have recorded. The provided +functionality is intended to assist in debugging. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" + +const int SCREEN_WIDTH = NUM_COLUMNS; +const int SCREEN_HEIGHT = 10; + +int currentScreenPosition = -1; +char screenBuffer[(SCREEN_WIDTH + 1) * SCREEN_HEIGHT + 1] = {0}; + +void initializeScreenBuffer(); +void updateScreenPosition(const FMOD_VECTOR& worldPosition); + +static const char* RECORD_FILENAME = "playback.cmd.txt"; + +enum State +{ + State_Selection, + State_Record, + State_Playback, + State_Quit +}; + +State executeSelection(FMOD::Studio::System* system); +State executeRecord(FMOD::Studio::System* system); +State executePlayback(FMOD::Studio::System* system); + +int FMOD_Main() +{ + void *extraDriverData = 0; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + + // The example Studio project is authored for 5.1 sound, so set up the system output mode to match + FMOD::System* coreSystem = NULL; + ERRCHECK( system->getCoreSystem(&coreSystem) ); + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); + + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + State state = State_Selection; + while (state != State_Quit) + { + switch (state) + { + case State_Selection: + state = executeSelection(system); + break; + case State_Record: + state = executeRecord(system); + break; + case State_Playback: + state = executePlayback(system); + break; + case State_Quit: + break; + }; + }; + + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} + +// Show the main selection menu +State executeSelection(FMOD::Studio::System* system) +{ + for (;;) + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + return State_Record; + } + if (Common_BtnPress(BTN_ACTION2)) + { + return State_Playback; + } + if (Common_BtnPress(BTN_QUIT)) + { + return State_Quit; + } + + ERRCHECK( system->update() ); + + Common_Draw("=================================================="); + Common_Draw("Recording and playback example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Waiting to start recording"); + Common_Draw(""); + Common_Draw("Press %s to start recording", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to play back recording", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + Common_Draw(""); + Common_Sleep(50); + } +} + +// Start recording, load banks and then let the user trigger some sounds +State executeRecord(FMOD::Studio::System* system) +{ + FMOD::Studio::Bank* masterBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NONBLOCKING, &masterBank) ); + + FMOD::Studio::Bank* stringsBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NONBLOCKING, &stringsBank) ); + + FMOD::Studio::Bank* vehiclesBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Vehicles.bank"), FMOD_STUDIO_LOAD_BANK_NONBLOCKING, &vehiclesBank) ); + + FMOD::Studio::Bank* sfxBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("SFX.bank"), FMOD_STUDIO_LOAD_BANK_NONBLOCKING, &sfxBank) ); + + // Wait for banks to load + ERRCHECK( system->flushCommands() ); + + // Start recording commands - it will also record which banks we have already loaded by now + ERRCHECK( system->startCommandCapture(Common_WritePath(RECORD_FILENAME), FMOD_STUDIO_COMMANDCAPTURE_NORMAL) ); + + FMOD_GUID explosionID = {0}; + ERRCHECK( system->lookupID("event:/Weapons/Explosion", &explosionID) ); + + FMOD::Studio::EventDescription* engineDescription = NULL; + ERRCHECK( system->getEvent("event:/Vehicles/Ride-on Mower", &engineDescription) ); + + FMOD::Studio::EventInstance* engineInstance = NULL; + ERRCHECK( engineDescription->createInstance(&engineInstance) ); + + ERRCHECK( engineInstance->setParameterByName("RPM", 650.0f) ); + ERRCHECK( engineInstance->start() ); + + // Position the listener at the origin + FMOD_3D_ATTRIBUTES attributes = { { 0 } }; + attributes.forward.z = 1.0f; + attributes.up.y = 1.0f; + ERRCHECK( system->setListenerAttributes(0, &attributes) ); + + // Position the event 2 units in front of the listener + attributes.position.z = 2.0f; + ERRCHECK( engineInstance->set3DAttributes(&attributes) ); + + initializeScreenBuffer(); + + bool wantQuit = false; + + for (;;) + { + Common_Update(); + + if (Common_BtnPress(BTN_MORE)) + { + break; + } + + if (Common_BtnPress(BTN_QUIT)) + { + wantQuit = true; + break; + } + + if (Common_BtnPress(BTN_ACTION1)) + { + // One-shot event + FMOD::Studio::EventDescription* eventDescription = NULL; + ERRCHECK( system->getEventByID(&explosionID, &eventDescription) ); + + FMOD::Studio::EventInstance* eventInstance = NULL; + ERRCHECK( eventDescription->createInstance(&eventInstance) ); + for (int i=0; i<10; ++i) + { + ERRCHECK( eventInstance->setVolume(i / 10.0f) ); + } + + ERRCHECK( eventInstance->start() ); + + // Release will clean up the instance when it completes + ERRCHECK( eventInstance->release() ); + } + + if (Common_BtnPress(BTN_LEFT)) + { + attributes.position.x -= 1.0f; + ERRCHECK( engineInstance->set3DAttributes(&attributes) ); + } + + if (Common_BtnPress(BTN_RIGHT)) + { + attributes.position.x += 1.0f; + ERRCHECK( engineInstance->set3DAttributes(&attributes) ); + } + + if (Common_BtnPress(BTN_UP)) + { + attributes.position.z += 1.0f; + ERRCHECK( engineInstance->set3DAttributes(&attributes) ); + } + + if (Common_BtnPress(BTN_DOWN)) + { + attributes.position.z -= 1.0f; + ERRCHECK( engineInstance->set3DAttributes(&attributes) ); + } + + if (Common_BtnPress(BTN_MORE)) + { + break; + } + if (Common_BtnPress(BTN_QUIT)) + { + wantQuit = true; + break; + } + + ERRCHECK(system->update()); + + updateScreenPosition(attributes.position); + Common_Draw("=================================================="); + Common_Draw("Recording and playback example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Recording!"); + Common_Draw(""); + Common_Draw(screenBuffer); + Common_Draw(""); + Common_Draw("Press %s to finish recording", Common_BtnStr(BTN_MORE)); + Common_Draw("Press %s to play a one-shot", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Use the arrow keys (%s, %s, %s, %s) to control the engine position", + Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT), Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } + + // Unload all the banks + ERRCHECK( masterBank->unload() ); + ERRCHECK( stringsBank->unload() ); + ERRCHECK( vehiclesBank->unload() ); + ERRCHECK( sfxBank->unload() ); + + // Finish recording + ERRCHECK( system->flushCommands() ); + ERRCHECK( system->stopCommandCapture() ); + + return (wantQuit ? State_Quit : State_Selection); +} + +// Play back a previously recorded file +State executePlayback(FMOD::Studio::System* system) +{ + FMOD::Studio::CommandReplay* replay; + ERRCHECK( system->loadCommandReplay(Common_WritePath(RECORD_FILENAME), FMOD_STUDIO_COMMANDREPLAY_NORMAL, &replay)); + int commandCount; + ERRCHECK(replay->getCommandCount(&commandCount)); + float totalTime; + ERRCHECK(replay->getLength(&totalTime)); + ERRCHECK(replay->start()); + ERRCHECK(system->update()); + + for (;;) + { + Common_Update(); + + if (Common_BtnPress(BTN_QUIT)) + { + break; + } + + if (Common_BtnPress(BTN_MORE)) + { + bool paused; + ERRCHECK(replay->getPaused(&paused)); + ERRCHECK(replay->setPaused(!paused)); + } + + FMOD_STUDIO_PLAYBACK_STATE state; + ERRCHECK(replay->getPlaybackState(&state)); + if (state == FMOD_STUDIO_PLAYBACK_STOPPED) + { + break; + } + + int currentIndex; + float currentTime; + ERRCHECK(replay->getCurrentCommand(¤tIndex, ¤tTime)); + + ERRCHECK(system->update()); + + Common_Draw("=================================================="); + Common_Draw("Recording and playback example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Playing back commands:"); + Common_Draw("Command = %d / %d\n", currentIndex, commandCount); + Common_Draw("Time = %.3f / %.3f\n", currentTime, totalTime); + Common_Draw(""); + Common_Draw("Press %s to pause/unpause recording", Common_BtnStr(BTN_MORE)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } + + + ERRCHECK( replay->release() ); + ERRCHECK( system->unloadAll() ); + return State_Selection; +} + +void initializeScreenBuffer() +{ + memset(screenBuffer, ' ', sizeof(screenBuffer)); + + int idx = SCREEN_WIDTH; + for (int i = 0; i < SCREEN_HEIGHT; ++i) + { + screenBuffer[idx] = '\n'; + idx += SCREEN_WIDTH + 1; + } + + screenBuffer[(SCREEN_WIDTH + 1) * SCREEN_HEIGHT] = '\0'; +} + +int getCharacterIndex(const FMOD_VECTOR& position) +{ + int row = static_cast(-position.z + (SCREEN_HEIGHT / 2)); + int col = static_cast(position.x + (SCREEN_WIDTH / 2)); + + if (0 < row && row < SCREEN_HEIGHT && 0 < col && col < SCREEN_WIDTH) + { + return (row * (SCREEN_WIDTH + 1)) + col; + } + + return -1; +} + +void updateScreenPosition(const FMOD_VECTOR& eventPosition) +{ + if (currentScreenPosition != -1) + { + screenBuffer[currentScreenPosition] = ' '; + currentScreenPosition = -1; + } + + FMOD_VECTOR origin = {0}; + int idx = getCharacterIndex(origin); + screenBuffer[idx] = '^'; + + idx = getCharacterIndex(eventPosition); + if (idx != -1) + { + screenBuffer[idx] = 'o'; + currentScreenPosition = idx; + } +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.creator.shared new file mode 100644 index 0000000..698059a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f recording_playback.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/recording_playback + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.files new file mode 100644 index 0000000..70e5ca7 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/recording_playback.makefile +../recording_playback.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/recording_playback/recording_playback.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event.cpp b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event.cpp new file mode 100644 index 0000000..8135620 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event.cpp @@ -0,0 +1,126 @@ +/*============================================================================== +Simple Event Example +Copyright (c), Firelight Technologies Pty, Ltd 2012-2025. + +This example demonstrates the various ways of playing an event. + +#### Explosion Event #### +This event is played as a one-shot and released immediately after it has been +created. + +#### Looping Ambience Event #### +A single instance is started or stopped based on user input. + +#### Cancel Event #### +This instance is started and if already playing, restarted. + +For information on using FMOD example code in your own programs, visit +https://www.fmod.com/legal +==============================================================================*/ +#include "fmod_studio.hpp" +#include "fmod.hpp" +#include "common.h" + +int FMOD_Main() +{ + void *extraDriverData = NULL; + Common_Init(&extraDriverData); + + FMOD::Studio::System* system = NULL; + ERRCHECK( FMOD::Studio::System::create(&system) ); + + // The example Studio project is authored for 5.1 sound, so set up the system output mode to match + FMOD::System* coreSystem = NULL; + ERRCHECK( system->getCoreSystem(&coreSystem) ); + ERRCHECK( coreSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); + + ERRCHECK( system->initialize(1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); + + FMOD::Studio::Bank* masterBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); + + FMOD::Studio::Bank* stringsBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("Master.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); + + FMOD::Studio::Bank* sfxBank = NULL; + ERRCHECK( system->loadBankFile(Common_MediaPath("SFX.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &sfxBank) ); + + // Get the Looping Ambience event + FMOD::Studio::EventDescription* loopingAmbienceDescription = NULL; + ERRCHECK( system->getEvent("event:/Ambience/Country", &loopingAmbienceDescription) ); + + FMOD::Studio::EventInstance* loopingAmbienceInstance = NULL; + ERRCHECK( loopingAmbienceDescription->createInstance(&loopingAmbienceInstance) ); + + // Get the 4 Second Surge event + FMOD::Studio::EventDescription* cancelDescription = NULL; + ERRCHECK( system->getEvent("event:/UI/Cancel", &cancelDescription) ); + + FMOD::Studio::EventInstance* cancelInstance = NULL; + ERRCHECK( cancelDescription->createInstance(&cancelInstance) ); + + // Get the Single Explosion event + FMOD::Studio::EventDescription* explosionDescription = NULL; + ERRCHECK( system->getEvent("event:/Weapons/Explosion", &explosionDescription) ); + + // Start loading explosion sample data and keep it in memory + ERRCHECK( explosionDescription->loadSampleData() ); + + do + { + Common_Update(); + + if (Common_BtnPress(BTN_ACTION1)) + { + // One-shot event + FMOD::Studio::EventInstance* eventInstance = NULL; + ERRCHECK( explosionDescription->createInstance(&eventInstance) ); + + ERRCHECK( eventInstance->start() ); + + // Release will clean up the instance when it completes + ERRCHECK( eventInstance->release() ); + } + + if (Common_BtnPress(BTN_ACTION2)) + { + ERRCHECK( loopingAmbienceInstance->start() ); + } + + if (Common_BtnPress(BTN_ACTION3)) + { + ERRCHECK( loopingAmbienceInstance->stop(FMOD_STUDIO_STOP_IMMEDIATE) ); + } + + if (Common_BtnPress(BTN_ACTION4)) + { + // Calling start on an instance will cause it to restart if it's already playing + ERRCHECK( cancelInstance->start() ); + } + + ERRCHECK( system->update() ); + + Common_Draw("=================================================="); + Common_Draw("Simple Event Example."); + Common_Draw("Copyright (c) Firelight Technologies 2012-2025."); + Common_Draw("=================================================="); + Common_Draw(""); + Common_Draw("Press %s to fire and forget the explosion", Common_BtnStr(BTN_ACTION1)); + Common_Draw("Press %s to start the looping ambience", Common_BtnStr(BTN_ACTION2)); + Common_Draw("Press %s to stop the looping ambience", Common_BtnStr(BTN_ACTION3)); + Common_Draw("Press %s to start/restart the cancel sound", Common_BtnStr(BTN_ACTION4)); + Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); + + Common_Sleep(50); + } while (!Common_BtnPress(BTN_QUIT)); + + ERRCHECK( sfxBank->unload() ); + ERRCHECK( stringsBank->unload() ); + ERRCHECK( masterBank->unload() ); + + ERRCHECK( system->release() ); + + Common_Close(); + + return 0; +} diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.cflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.cflags new file mode 100644 index 0000000..9fb7395 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.cflags @@ -0,0 +1 @@ +-std=c17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.config b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.config new file mode 100644 index 0000000..823e067 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.config @@ -0,0 +1 @@ +#define FMOD_USE_PLATFORM_HEADERS diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.creator b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.creator @@ -0,0 +1 @@ +[General] diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.creator.shared b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.creator.shared new file mode 100644 index 0000000..d90d02b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.creator.shared @@ -0,0 +1,442 @@ + + + + + EnvironmentId + {71064a00-ba92-4c03-affd-e7f374fa3265} + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {22e4ca2b-856c-4a9e-96b1-3ef2b55f3da9} + + %{sourceDir}/../make + + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86_64 + + Debug x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + + Release x64 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86 + + Release x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Debug + CPU=x86 + + Debug x86 + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=address + + Address Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=memory + + Memory Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=thread + + Thread Sanitizer + GenericProjectManager.GenericBuildConfiguration + + + %{sourceDir}/../make + + + + all + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + -f simple_event.makefile CPU=$CPU CONFIG=$CONFIGURATION SANITIZE=$SANITIZER + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + CONFIGURATION=Release + CPU=x86_64 + SANITIZER=undefined + + Undefined Behaviour Sanitizer + GenericProjectManager.GenericBuildConfiguration + + 8 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}/simple_event + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + true + %{buildDir}/../../../../../examples/media + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.cxxflags b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.cxxflags new file mode 100644 index 0000000..7d01704 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.cxxflags @@ -0,0 +1 @@ +-std=c++17 -fPIC -fno-trapping-math \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.files b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.files new file mode 100644 index 0000000..c157256 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.files @@ -0,0 +1,690 @@ +../../../../../../core_api/src/fmod.cpp +../../../../../../core_api/src/fmod.cs +../../../../../../core_api/src/fmod.h +../../../../../../core_api/src/fmod.hpp +../../../../../../core_api/src/fmod5.cpp +../../../../../../core_api/src/fmod_3d.h +../../../../../../core_api/src/fmod_array.h +../../../../../../core_api/src/fmod_asm_macros.m4 +../../../../../../core_api/src/fmod_async.cpp +../../../../../../core_api/src/fmod_async.h +../../../../../../core_api/src/fmod_atomic.h +../../../../../../core_api/src/fmod_atomic_c11.h +../../../../../../core_api/src/fmod_atomic_clang.h +../../../../../../core_api/src/fmod_atomic_cpp11.h +../../../../../../core_api/src/fmod_atomic_gcc.h +../../../../../../core_api/src/fmod_atomic_legacy.h +../../../../../../core_api/src/fmod_autocleanup.h +../../../../../../core_api/src/fmod_channel.cpp +../../../../../../core_api/src/fmod_channel_emulated.h +../../../../../../core_api/src/fmod_channel_real.cpp +../../../../../../core_api/src/fmod_channel_real.h +../../../../../../core_api/src/fmod_channel_software.cpp +../../../../../../core_api/src/fmod_channel_software.h +../../../../../../core_api/src/fmod_channel_stream.cpp +../../../../../../core_api/src/fmod_channel_stream.h +../../../../../../core_api/src/fmod_channelcontrol.cpp +../../../../../../core_api/src/fmod_channelcontroli.cpp +../../../../../../core_api/src/fmod_channelcontroli.h +../../../../../../core_api/src/fmod_channelgroup.cpp +../../../../../../core_api/src/fmod_channelgroupi.cpp +../../../../../../core_api/src/fmod_channelgroupi.h +../../../../../../core_api/src/fmod_channeli.cpp +../../../../../../core_api/src/fmod_channeli.h +../../../../../../core_api/src/fmod_channelpool.h +../../../../../../core_api/src/fmod_codec.cpp +../../../../../../core_api/src/fmod_codec.h +../../../../../../core_api/src/fmod_codec_aiff.cpp +../../../../../../core_api/src/fmod_codec_aiff.h +../../../../../../core_api/src/fmod_codec_dls.cpp +../../../../../../core_api/src/fmod_codec_dls.h +../../../../../../core_api/src/fmod_codec_fadpcm.cpp +../../../../../../core_api/src/fmod_codec_fadpcm.h +../../../../../../core_api/src/fmod_codec_fadpcm_arm.m4 +../../../../../../core_api/src/fmod_codec_flac.cpp +../../../../../../core_api/src/fmod_codec_flac.h +../../../../../../core_api/src/fmod_codec_fsb5.cpp +../../../../../../core_api/src/fmod_codec_fsb5.h +../../../../../../core_api/src/fmod_codec_fsbvorbis.cpp +../../../../../../core_api/src/fmod_codec_fsbvorbis.h +../../../../../../core_api/src/fmod_codec_fsbvorbis_books.cpp +../../../../../../core_api/src/fmod_codec_it.cpp +../../../../../../core_api/src/fmod_codec_it.h +../../../../../../core_api/src/fmod_codec_midi.cpp +../../../../../../core_api/src/fmod_codec_midi.h +../../../../../../core_api/src/fmod_codec_mod.cpp +../../../../../../core_api/src/fmod_codec_mod.h +../../../../../../core_api/src/fmod_codec_mpeg.cpp +../../../../../../core_api/src/fmod_codec_mpeg.h +../../../../../../core_api/src/fmod_codec_mpeg_decode.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer2.cpp +../../../../../../core_api/src/fmod_codec_mpeg_layer3.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.cpp +../../../../../../core_api/src/fmod_codec_oggvorbis.h +../../../../../../core_api/src/fmod_codec_playlist.cpp +../../../../../../core_api/src/fmod_codec_playlist.h +../../../../../../core_api/src/fmod_codec_raw.cpp +../../../../../../core_api/src/fmod_codec_raw.h +../../../../../../core_api/src/fmod_codec_s3m.cpp +../../../../../../core_api/src/fmod_codec_s3m.h +../../../../../../core_api/src/fmod_codec_tag.cpp +../../../../../../core_api/src/fmod_codec_tag.h +../../../../../../core_api/src/fmod_codec_user.cpp +../../../../../../core_api/src/fmod_codec_user.h +../../../../../../core_api/src/fmod_codec_wav.cpp +../../../../../../core_api/src/fmod_codec_wav.h +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.cpp +../../../../../../core_api/src/fmod_codec_wav_imaadpcm.h +../../../../../../core_api/src/fmod_codec_wav_riff.cpp +../../../../../../core_api/src/fmod_codec_xm.cpp +../../../../../../core_api/src/fmod_codec_xm.h +../../../../../../core_api/src/fmod_codeci.h +../../../../../../core_api/src/fmod_common.h +../../../../../../core_api/src/fmod_complex.hlsli +../../../../../../core_api/src/fmod_convolution.hlsl +../../../../../../core_api/src/fmod_debug.cpp +../../../../../../core_api/src/fmod_debug.h +../../../../../../core_api/src/fmod_downmix.cpp +../../../../../../core_api/src/fmod_downmix.h +../../../../../../core_api/src/fmod_downmix_dolby_pl2.cpp +../../../../../../core_api/src/fmod_downmix_dolby_pl2.h +../../../../../../core_api/src/fmod_dsp.cpp +../../../../../../core_api/src/fmod_dsp.cs +../../../../../../core_api/src/fmod_dsp.h +../../../../../../core_api/src/fmod_dsp_biquad.cpp +../../../../../../core_api/src/fmod_dsp_biquad.h +../../../../../../core_api/src/fmod_dsp_channelmix.cpp +../../../../../../core_api/src/fmod_dsp_channelmix.h +../../../../../../core_api/src/fmod_dsp_chorus.cpp +../../../../../../core_api/src/fmod_dsp_chorus.h +../../../../../../core_api/src/fmod_dsp_codec.cpp +../../../../../../core_api/src/fmod_dsp_codec.h +../../../../../../core_api/src/fmod_dsp_codecpool.cpp +../../../../../../core_api/src/fmod_dsp_codecpool.h +../../../../../../core_api/src/fmod_dsp_compressor.cpp +../../../../../../core_api/src/fmod_dsp_compressor.h +../../../../../../core_api/src/fmod_dsp_compressor_noopt.cpp +../../../../../../core_api/src/fmod_dsp_compressor_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection.cpp +../../../../../../core_api/src/fmod_dsp_connection_arm.cpp +../../../../../../core_api/src/fmod_dsp_connection_avx.cpp +../../../../../../core_api/src/fmod_dsp_connection_neon.cpp +../../../../../../core_api/src/fmod_dsp_connection_noopt.cpp +../../../../../../core_api/src/fmod_dsp_connection_sse.cpp +../../../../../../core_api/src/fmod_dsp_connection_vfp.m4 +../../../../../../core_api/src/fmod_dsp_connectioni.cpp +../../../../../../core_api/src/fmod_dsp_connectioni.h +../../../../../../core_api/src/fmod_dsp_convert.cpp +../../../../../../core_api/src/fmod_dsp_convert.h +../../../../../../core_api/src/fmod_dsp_convert_avx.cpp +../../../../../../core_api/src/fmod_dsp_convert_noopt.cpp +../../../../../../core_api/src/fmod_dsp_convert_sse.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb.h +../../../../../../core_api/src/fmod_dsp_convolutionreverb_async.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_avx.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_cpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_gpu.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_neon.cpp +../../../../../../core_api/src/fmod_dsp_convolutionreverb_sse.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.cpp +../../../../../../core_api/src/fmod_dsp_defaultmatrix.h +../../../../../../core_api/src/fmod_dsp_delay.cpp +../../../../../../core_api/src/fmod_dsp_delay.h +../../../../../../core_api/src/fmod_dsp_distortion.cpp +../../../../../../core_api/src/fmod_dsp_distortion.h +../../../../../../core_api/src/fmod_dsp_echo.cpp +../../../../../../core_api/src/fmod_dsp_echo.h +../../../../../../core_api/src/fmod_dsp_echo_noopt.cpp +../../../../../../core_api/src/fmod_dsp_echo_sse.cpp +../../../../../../core_api/src/fmod_dsp_effects.h +../../../../../../core_api/src/fmod_dsp_emulated.cpp +../../../../../../core_api/src/fmod_dsp_emulated.h +../../../../../../core_api/src/fmod_dsp_fader.cpp +../../../../../../core_api/src/fmod_dsp_fader.h +../../../../../../core_api/src/fmod_dsp_fft.cpp +../../../../../../core_api/src/fmod_dsp_fft.h +../../../../../../core_api/src/fmod_dsp_flange.cpp +../../../../../../core_api/src/fmod_dsp_flange.h +../../../../../../core_api/src/fmod_dsp_highpass.cpp +../../../../../../core_api/src/fmod_dsp_highpass.h +../../../../../../core_api/src/fmod_dsp_highpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_highpass_simple.h +../../../../../../core_api/src/fmod_dsp_interleave_noopt.cpp +../../../../../../core_api/src/fmod_dsp_interleave_sse.cpp +../../../../../../core_api/src/fmod_dsp_itecho.cpp +../../../../../../core_api/src/fmod_dsp_itecho.h +../../../../../../core_api/src/fmod_dsp_limiter.cpp +../../../../../../core_api/src/fmod_dsp_limiter.h +../../../../../../core_api/src/fmod_dsp_loudness_meter.cpp +../../../../../../core_api/src/fmod_dsp_loudness_meter.h +../../../../../../core_api/src/fmod_dsp_lowpass.cpp +../../../../../../core_api/src/fmod_dsp_lowpass.h +../../../../../../core_api/src/fmod_dsp_lowpass2.cpp +../../../../../../core_api/src/fmod_dsp_lowpass2.h +../../../../../../core_api/src/fmod_dsp_lowpass_simple.cpp +../../../../../../core_api/src/fmod_dsp_lowpass_simple.h +../../../../../../core_api/src/fmod_dsp_matrix.cpp +../../../../../../core_api/src/fmod_dsp_matrix.h +../../../../../../core_api/src/fmod_dsp_metering_noopt.cpp +../../../../../../core_api/src/fmod_dsp_metering_sse.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.cpp +../../../../../../core_api/src/fmod_dsp_multiband_dynamics.h +../../../../../../core_api/src/fmod_dsp_multiband_eq.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq.h +../../../../../../core_api/src/fmod_dsp_multiband_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_multiband_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_normalize.cpp +../../../../../../core_api/src/fmod_dsp_normalize.h +../../../../../../core_api/src/fmod_dsp_objectpan.cpp +../../../../../../core_api/src/fmod_dsp_objectpan.h +../../../../../../core_api/src/fmod_dsp_oscillator.cpp +../../../../../../core_api/src/fmod_dsp_oscillator.h +../../../../../../core_api/src/fmod_dsp_pan.cpp +../../../../../../core_api/src/fmod_dsp_pan.h +../../../../../../core_api/src/fmod_dsp_parameq.cpp +../../../../../../core_api/src/fmod_dsp_parameq.h +../../../../../../core_api/src/fmod_dsp_pitchshift.cpp +../../../../../../core_api/src/fmod_dsp_pitchshift.h +../../../../../../core_api/src/fmod_dsp_porthead.cpp +../../../../../../core_api/src/fmod_dsp_porthead.h +../../../../../../core_api/src/fmod_dsp_resampler.cpp +../../../../../../core_api/src/fmod_dsp_resampler.h +../../../../../../core_api/src/fmod_dsp_resampler_cubic.cpp +../../../../../../core_api/src/fmod_dsp_resampler_cubic.h +../../../../../../core_api/src/fmod_dsp_resampler_linear.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear.h +../../../../../../core_api/src/fmod_dsp_resampler_linear_arm.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx2.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_avx512.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_neon.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_linear_vfp.m4 +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp.h +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_noopt.cpp +../../../../../../core_api/src/fmod_dsp_resampler_nointerp_sse.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.cpp +../../../../../../core_api/src/fmod_dsp_resampler_spline.h +../../../../../../core_api/src/fmod_dsp_return.cpp +../../../../../../core_api/src/fmod_dsp_return.h +../../../../../../core_api/src/fmod_dsp_send.cpp +../../../../../../core_api/src/fmod_dsp_send.h +../../../../../../core_api/src/fmod_dsp_sfxreverb.cpp +../../../../../../core_api/src/fmod_dsp_sfxreverb.h +../../../../../../core_api/src/fmod_dsp_source.cpp +../../../../../../core_api/src/fmod_dsp_source.h +../../../../../../core_api/src/fmod_dsp_three_eq.cpp +../../../../../../core_api/src/fmod_dsp_three_eq.h +../../../../../../core_api/src/fmod_dsp_three_eq_neon.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_noopt.cpp +../../../../../../core_api/src/fmod_dsp_three_eq_sse.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.cpp +../../../../../../core_api/src/fmod_dsp_transceiver.h +../../../../../../core_api/src/fmod_dsp_tremolo.cpp +../../../../../../core_api/src/fmod_dsp_tremolo.h +../../../../../../core_api/src/fmod_dsp_wavetable.cpp +../../../../../../core_api/src/fmod_dsp_wavetable.h +../../../../../../core_api/src/fmod_dspi.cpp +../../../../../../core_api/src/fmod_dspi.h +../../../../../../core_api/src/fmod_endian.h +../../../../../../core_api/src/fmod_errors.cs +../../../../../../core_api/src/fmod_errors.h +../../../../../../core_api/src/fmod_expandingpool.cpp +../../../../../../core_api/src/fmod_expandingpool.h +../../../../../../core_api/src/fmod_fft.cpp +../../../../../../core_api/src/fmod_fft.h +../../../../../../core_api/src/fmod_fft_0.hlsl +../../../../../../core_api/src/fmod_fft_1.hlsl +../../../../../../core_api/src/fmod_fft_common.hlsli +../../../../../../core_api/src/fmod_fft_noopt.cpp +../../../../../../core_api/src/fmod_fft_sse.cpp +../../../../../../core_api/src/fmod_file.cpp +../../../../../../core_api/src/fmod_file.h +../../../../../../core_api/src/fmod_file_disk.cpp +../../../../../../core_api/src/fmod_file_disk.h +../../../../../../core_api/src/fmod_file_memory.cpp +../../../../../../core_api/src/fmod_file_memory.h +../../../../../../core_api/src/fmod_file_net.cpp +../../../../../../core_api/src/fmod_file_net.h +../../../../../../core_api/src/fmod_file_null.cpp +../../../../../../core_api/src/fmod_file_null.h +../../../../../../core_api/src/fmod_file_remote.cpp +../../../../../../core_api/src/fmod_file_remote.h +../../../../../../core_api/src/fmod_file_user.cpp +../../../../../../core_api/src/fmod_file_user.h +../../../../../../core_api/src/fmod_format.cpp +../../../../../../core_api/src/fmod_format.h +../../../../../../core_api/src/fmod_freelist.h +../../../../../../core_api/src/fmod_geometry.cpp +../../../../../../core_api/src/fmod_geometry_mgr.cpp +../../../../../../core_api/src/fmod_geometry_mgr.h +../../../../../../core_api/src/fmod_geometryi.cpp +../../../../../../core_api/src/fmod_geometryi.h +../../../../../../core_api/src/fmod_globals.cpp +../../../../../../core_api/src/fmod_globals.h +../../../../../../core_api/src/fmod_gpu_compute.cpp +../../../../../../core_api/src/fmod_gpu_compute.h +../../../../../../core_api/src/fmod_ifft_0.hlsl +../../../../../../core_api/src/fmod_ifft_1.hlsl +../../../../../../core_api/src/fmod_iterator.h +../../../../../../core_api/src/fmod_linkedlist.h +../../../../../../core_api/src/fmod_listener.cpp +../../../../../../core_api/src/fmod_listener.h +../../../../../../core_api/src/fmod_localcriticalsection.h +../../../../../../core_api/src/fmod_map.h +../../../../../../core_api/src/fmod_memory.cpp +../../../../../../core_api/src/fmod_memory.h +../../../../../../core_api/src/fmod_memory_tracking.cpp +../../../../../../core_api/src/fmod_memory_tracking.h +../../../../../../core_api/src/fmod_metadata.cpp +../../../../../../core_api/src/fmod_metadata.h +../../../../../../core_api/src/fmod_mode.h +../../../../../../core_api/src/fmod_music.cpp +../../../../../../core_api/src/fmod_music.h +../../../../../../core_api/src/fmod_net.cpp +../../../../../../core_api/src/fmod_net.h +../../../../../../core_api/src/fmod_octree.cpp +../../../../../../core_api/src/fmod_octree.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.h +../../../../../../core_api/src/fmod_os_atomic_gcc_arm.m4 +../../../../../../core_api/src/fmod_os_atomic_gcc_arm64.h +../../../../../../core_api/src/fmod_os_atomic_gcc_x86.h +../../../../../../core_api/src/fmod_os_misc.h +../../../../../../core_api/src/fmod_os_net.h +../../../../../../core_api/src/fmod_os_net_posix.cpp +../../../../../../core_api/src/fmod_os_net_winsock.cpp +../../../../../../core_api/src/fmod_os_output.h +../../../../../../core_api/src/fmod_output.cpp +../../../../../../core_api/src/fmod_output.h +../../../../../../core_api/src/fmod_output_emulated.h +../../../../../../core_api/src/fmod_output_nosound.cpp +../../../../../../core_api/src/fmod_output_nosound.h +../../../../../../core_api/src/fmod_output_nosound_nrt.cpp +../../../../../../core_api/src/fmod_output_nosound_nrt.h +../../../../../../core_api/src/fmod_output_phase.h +../../../../../../core_api/src/fmod_output_phase.mm +../../../../../../core_api/src/fmod_output_software.cpp +../../../../../../core_api/src/fmod_output_software.h +../../../../../../core_api/src/fmod_output_wavwriter.cpp +../../../../../../core_api/src/fmod_output_wavwriter.h +../../../../../../core_api/src/fmod_output_wavwriter_nrt.cpp +../../../../../../core_api/src/fmod_output_wavwriter_nrt.h +../../../../../../core_api/src/fmod_output_winsonic.cpp +../../../../../../core_api/src/fmod_output_winsonic.h +../../../../../../core_api/src/fmod_output_winsonic_compat.h +../../../../../../core_api/src/fmod_outputi.h +../../../../../../core_api/src/fmod_pan.cpp +../../../../../../core_api/src/fmod_pan.h +../../../../../../core_api/src/fmod_pluginfactory.cpp +../../../../../../core_api/src/fmod_pluginfactory.h +../../../../../../core_api/src/fmod_poolallocator.h +../../../../../../core_api/src/fmod_profile.cpp +../../../../../../core_api/src/fmod_profile.h +../../../../../../core_api/src/fmod_profile_channel_pkt.h +../../../../../../core_api/src/fmod_profile_client.cpp +../../../../../../core_api/src/fmod_profile_client.h +../../../../../../core_api/src/fmod_profile_codec_pkt.h +../../../../../../core_api/src/fmod_profile_cpu_pkt.h +../../../../../../core_api/src/fmod_profile_dsp.cpp +../../../../../../core_api/src/fmod_profile_dsp.h +../../../../../../core_api/src/fmod_profile_dsp_pkt.h +../../../../../../core_api/src/fmod_profile_group_pkt.h +../../../../../../core_api/src/fmod_profile_markers.cpp +../../../../../../core_api/src/fmod_profile_markers.h +../../../../../../core_api/src/fmod_profile_pkt.h +../../../../../../core_api/src/fmod_profile_remotefile.cpp +../../../../../../core_api/src/fmod_profile_remotefile.h +../../../../../../core_api/src/fmod_profile_remotefile_pkt.h +../../../../../../core_api/src/fmod_profile_stats.cpp +../../../../../../core_api/src/fmod_profile_stats.h +../../../../../../core_api/src/fmod_profile_stats_pkt.h +../../../../../../core_api/src/fmod_random.h +../../../../../../core_api/src/fmod_reverb.cpp +../../../../../../core_api/src/fmod_reverbi.cpp +../../../../../../core_api/src/fmod_reverbi.h +../../../../../../core_api/src/fmod_rootsignature.hlsl +../../../../../../core_api/src/fmod_sample_software.cpp +../../../../../../core_api/src/fmod_sample_software.h +../../../../../../core_api/src/fmod_settings.h +../../../../../../core_api/src/fmod_shader_compat.hlsli +../../../../../../core_api/src/fmod_simd_util_sse.h +../../../../../../core_api/src/fmod_sound.cpp +../../../../../../core_api/src/fmod_sound_sample.cpp +../../../../../../core_api/src/fmod_sound_sample.h +../../../../../../core_api/src/fmod_sound_stream.cpp +../../../../../../core_api/src/fmod_sound_stream.h +../../../../../../core_api/src/fmod_soundgroup.cpp +../../../../../../core_api/src/fmod_soundgroupi.cpp +../../../../../../core_api/src/fmod_soundgroupi.h +../../../../../../core_api/src/fmod_soundi.cpp +../../../../../../core_api/src/fmod_soundi.h +../../../../../../core_api/src/fmod_speakermap.h +../../../../../../core_api/src/fmod_string.cpp +../../../../../../core_api/src/fmod_string.h +../../../../../../core_api/src/fmod_stringw.cpp +../../../../../../core_api/src/fmod_stringw.h +../../../../../../core_api/src/fmod_syncpoint.h +../../../../../../core_api/src/fmod_system.cpp +../../../../../../core_api/src/fmod_systemi.cpp +../../../../../../core_api/src/fmod_systemi.h +../../../../../../core_api/src/fmod_systemi_channel.cpp +../../../../../../core_api/src/fmod_systemi_driver.cpp +../../../../../../core_api/src/fmod_systemi_dsp.cpp +../../../../../../core_api/src/fmod_systemi_fft.cpp +../../../../../../core_api/src/fmod_systemi_sound.cpp +../../../../../../core_api/src/fmod_systemi_speaker.cpp +../../../../../../core_api/src/fmod_systemi_thread.cpp +../../../../../../core_api/src/fmod_systemi_update.cpp +../../../../../../core_api/src/fmod_thread.cpp +../../../../../../core_api/src/fmod_thread.h +../../../../../../core_api/src/fmod_threadsafe.cpp +../../../../../../core_api/src/fmod_threadsafe.h +../../../../../../core_api/src/fmod_time.cpp +../../../../../../core_api/src/fmod_time.h +../../../../../../core_api/src/fmod_types.h +../../../../../../core_api/platforms/linux/src/fmod_os_atomic.h +../../../../../../core_api/platforms/linux/src/fmod_os_misc.cpp +../../../../../../core_api/platforms/linux/src/fmod_os_output.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_alsa.h +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.cpp +../../../../../../core_api/platforms/linux/src/fmod_output_pulseaudio.h +../../../../../../core_api/platforms/linux/src/fmod_settings_platform.h +../../../../../../core_api/platforms/linux/src/fmod_types_platform.h +../../../../../../studio_api/src/fmod_asynccommand.cpp +../../../../../../studio_api/src/fmod_asynccommand.h +../../../../../../studio_api/src/fmod_asynccommand_impl.cpp +../../../../../../studio_api/src/fmod_asynccommand_impl.h +../../../../../../studio_api/src/fmod_asynccommandbuffer.cpp +../../../../../../studio_api/src/fmod_asynccommandbuffer.h +../../../../../../studio_api/src/fmod_asynccommandparser.cpp +../../../../../../studio_api/src/fmod_asynccommandparser.h +../../../../../../studio_api/src/fmod_asynccommandplayback.cpp +../../../../../../studio_api/src/fmod_asynccommandplayback.h +../../../../../../studio_api/src/fmod_asynccommandprinter.cpp +../../../../../../studio_api/src/fmod_asynccommandprinter.h +../../../../../../studio_api/src/fmod_asyncmanager.cpp +../../../../../../studio_api/src/fmod_asyncmanager.h +../../../../../../studio_api/src/fmod_bank_loader.cpp +../../../../../../studio_api/src/fmod_bank_loader.h +../../../../../../studio_api/src/fmod_bankmodel.cpp +../../../../../../studio_api/src/fmod_bankmodel.h +../../../../../../studio_api/src/fmod_buildhelper.cpp +../../../../../../studio_api/src/fmod_buildhelper.h +../../../../../../studio_api/src/fmod_busmodel.cpp +../../../../../../studio_api/src/fmod_busmodel.h +../../../../../../studio_api/src/fmod_controllermodel.cpp +../../../../../../studio_api/src/fmod_controllermodel.h +../../../../../../studio_api/src/fmod_curvemodel.cpp +../../../../../../studio_api/src/fmod_curvemodel.h +../../../../../../studio_api/src/fmod_effect.cpp +../../../../../../studio_api/src/fmod_effect.h +../../../../../../studio_api/src/fmod_endian.h +../../../../../../studio_api/src/fmod_eventmodel.cpp +../../../../../../studio_api/src/fmod_eventmodel.h +../../../../../../studio_api/src/fmod_factory.cpp +../../../../../../studio_api/src/fmod_factory.h +../../../../../../studio_api/src/fmod_guid_hash.cpp +../../../../../../studio_api/src/fmod_guid_hash.h +../../../../../../studio_api/src/fmod_hotswaplookup.cpp +../../../../../../studio_api/src/fmod_hotswaplookup.h +../../../../../../studio_api/src/fmod_instrumentmodel.cpp +../../../../../../studio_api/src/fmod_instrumentmodel.h +../../../../../../studio_api/src/fmod_intrusivelist.h +../../../../../../studio_api/src/fmod_lfo_shapes.cpp +../../../../../../studio_api/src/fmod_lfo_shapes.h +../../../../../../studio_api/src/fmod_list.h +../../../../../../studio_api/src/fmod_liveupdate.cpp +../../../../../../studio_api/src/fmod_liveupdate.h +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.cpp +../../../../../../studio_api/src/fmod_liveupdate_cmd_base.h +../../../../../../studio_api/src/fmod_liveupdate_control.h +../../../../../../studio_api/src/fmod_liveupdate_modelsync.h +../../../../../../studio_api/src/fmod_liveupdate_network_pkt.h +../../../../../../studio_api/src/fmod_liveupdate_observer.h +../../../../../../studio_api/src/fmod_mappingmodel.cpp +../../../../../../studio_api/src/fmod_mappingmodel.h +../../../../../../studio_api/src/fmod_md5hash.cpp +../../../../../../studio_api/src/fmod_md5hash.h +../../../../../../studio_api/src/fmod_model_base.h +../../../../../../studio_api/src/fmod_model_types.h +../../../../../../studio_api/src/fmod_modelbuilder.cpp +../../../../../../studio_api/src/fmod_modelbuilder.h +../../../../../../studio_api/src/fmod_modelbuilder_impl.h +../../../../../../studio_api/src/fmod_modelid_set.h +../../../../../../studio_api/src/fmod_modulatormodel.cpp +../../../../../../studio_api/src/fmod_modulatormodel.h +../../../../../../studio_api/src/fmod_monitoring_builder.cpp +../../../../../../studio_api/src/fmod_monitoring_builder.h +../../../../../../studio_api/src/fmod_monitoring_dsp.cpp +../../../../../../studio_api/src/fmod_monitoring_dsp.h +../../../../../../studio_api/src/fmod_monitoring_module.cpp +../../../../../../studio_api/src/fmod_monitoring_module.h +../../../../../../studio_api/src/fmod_monitoring_network_pkt.h +../../../../../../studio_api/src/fmod_objectlookup.cpp +../../../../../../studio_api/src/fmod_objectlookup.h +../../../../../../studio_api/src/fmod_parametermodel.cpp +../../../../../../studio_api/src/fmod_parametermodel.h +../../../../../../studio_api/src/fmod_parse.cpp +../../../../../../studio_api/src/fmod_parse.h +../../../../../../studio_api/src/fmod_playback.h +../../../../../../studio_api/src/fmod_playback_bus.cpp +../../../../../../studio_api/src/fmod_playback_bus.h +../../../../../../studio_api/src/fmod_playback_controller.cpp +../../../../../../studio_api/src/fmod_playback_controller.h +../../../../../../studio_api/src/fmod_playback_core.cpp +../../../../../../studio_api/src/fmod_playback_core.h +../../../../../../studio_api/src/fmod_playback_effect.cpp +../../../../../../studio_api/src/fmod_playback_effect.h +../../../../../../studio_api/src/fmod_playback_event.cpp +../../../../../../studio_api/src/fmod_playback_event.h +../../../../../../studio_api/src/fmod_playback_factory.cpp +../../../../../../studio_api/src/fmod_playback_factory.h +../../../../../../studio_api/src/fmod_playback_instrument.cpp +../../../../../../studio_api/src/fmod_playback_instrument.h +../../../../../../studio_api/src/fmod_playback_modulator.cpp +../../../../../../studio_api/src/fmod_playback_modulator.h +../../../../../../studio_api/src/fmod_playback_parameter.cpp +../../../../../../studio_api/src/fmod_playback_parameter.h +../../../../../../studio_api/src/fmod_playback_property.cpp +../../../../../../studio_api/src/fmod_playback_property.h +../../../../../../studio_api/src/fmod_playback_resource.cpp +../../../../../../studio_api/src/fmod_playback_resource.h +../../../../../../studio_api/src/fmod_playback_scheduling.cpp +../../../../../../studio_api/src/fmod_playback_scheduling.h +../../../../../../studio_api/src/fmod_playback_snapshot.cpp +../../../../../../studio_api/src/fmod_playback_snapshot.h +../../../../../../studio_api/src/fmod_playback_system.cpp +../../../../../../studio_api/src/fmod_playback_system.h +../../../../../../studio_api/src/fmod_playback_timeline.cpp +../../../../../../studio_api/src/fmod_playback_timeline.h +../../../../../../studio_api/src/fmod_playback_vca.cpp +../../../../../../studio_api/src/fmod_playback_vca.h +../../../../../../studio_api/src/fmod_profile_studiogroups.cpp +../../../../../../studio_api/src/fmod_profile_studiogroups.h +../../../../../../studio_api/src/fmod_property.cpp +../../../../../../studio_api/src/fmod_property.h +../../../../../../studio_api/src/fmod_radixtree.cpp +../../../../../../studio_api/src/fmod_radixtree.h +../../../../../../studio_api/src/fmod_repository.cpp +../../../../../../studio_api/src/fmod_repository.h +../../../../../../studio_api/src/fmod_resource_loader.cpp +../../../../../../studio_api/src/fmod_resource_loader.h +../../../../../../studio_api/src/fmod_resourcemodel.cpp +../../../../../../studio_api/src/fmod_resourcemodel.h +../../../../../../studio_api/src/fmod_riff.cpp +../../../../../../studio_api/src/fmod_riff.h +../../../../../../studio_api/src/fmod_riffstream.cpp +../../../../../../studio_api/src/fmod_riffstream.h +../../../../../../studio_api/src/fmod_runtime_interface.h +../../../../../../studio_api/src/fmod_runtime_manager.cpp +../../../../../../studio_api/src/fmod_runtime_manager.h +../../../../../../studio_api/src/fmod_serialization.cpp +../../../../../../studio_api/src/fmod_serialization.h +../../../../../../studio_api/src/fmod_shadow_bank.cpp +../../../../../../studio_api/src/fmod_shadow_bank.h +../../../../../../studio_api/src/fmod_shadow_bus.cpp +../../../../../../studio_api/src/fmod_shadow_bus.h +../../../../../../studio_api/src/fmod_shadow_event.cpp +../../../../../../studio_api/src/fmod_shadow_event.h +../../../../../../studio_api/src/fmod_shadow_parameter.cpp +../../../../../../studio_api/src/fmod_shadow_parameter.h +../../../../../../studio_api/src/fmod_shadow_vca.cpp +../../../../../../studio_api/src/fmod_shadow_vca.h +../../../../../../studio_api/src/fmod_snapshotmodel.cpp +../../../../../../studio_api/src/fmod_snapshotmodel.h +../../../../../../studio_api/src/fmod_sound_loader.cpp +../../../../../../studio_api/src/fmod_sound_loader.h +../../../../../../studio_api/src/fmod_soundtable.cpp +../../../../../../studio_api/src/fmod_soundtable.h +../../../../../../studio_api/src/fmod_studio.cpp +../../../../../../studio_api/src/fmod_studio.cs +../../../../../../studio_api/src/fmod_studio.h +../../../../../../studio_api/src/fmod_studio.hpp +../../../../../../studio_api/src/fmod_studio_common.h +../../../../../../studio_api/src/fmod_studio_impl.cpp +../../../../../../studio_api/src/fmod_studio_impl.h +../../../../../../studio_api/src/fmod_studio_string.h +../../../../../../studio_api/src/fmod_studio_timeunit.h +../../../../../../studio_api/src/fmod_studio_types.h +../../../../../../studio_api/src/fmod_threadsafe_queue.cpp +../../../../../../studio_api/src/fmod_threadsafe_queue.h +../../../../../../studio_api/src/fmod_timelinemodel.cpp +../../../../../../studio_api/src/fmod_timelinemodel.h +../../../../../../studio_api/src/fmod_unique_id.h +../../../../../../studio_api/src/fmod_vcamodel.cpp +../../../../../../studio_api/src/fmod_vcamodel.h +../../../../../../studio_api/src/fmod_waveformmodel.h +../../../../../../studio_api/src/fmod_weakhandle.cpp +../../../../../../studio_api/src/fmod_weakhandle.h +../../../../../../studio_api/src/fmod_weakhandle_system.cpp +../../../../../../studio_api/src/fmod_weakhandle_system.h +../../../../../../examples/src/autotest.cpp +../../../../../../examples/src/common.cpp +../../../../../../examples/src/common.h +../../../../../../examples/src/common_dx12.cpp +../../../../../../examples/src/common_dx12.h +../../../../../../examples/src/common_dx12_ps.h +../../../../../../examples/src/common_dx12_vs.h +../../../../../../examples/src/common_font_glyphs.h +../../../../../../examples/src/common_font_texture.h +../../../../../../examples/src/common_vulkan.cpp +../../../../../../examples/src/common_vulkan.h +../../../../../../examples/src/common_vulkan_fs.h +../../../../../../examples/src/common_vulkan_vs.h +../../../../../../examples/platforms/linux/src/common_platform.cpp +../../../../../../examples/platforms/linux/src/common_platform.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/assert.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/callback.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/export.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/format.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/ordinals.h +../../../../../../external/decoders/flac-1.2.1/include/FLAC/stream_decoder.h +../../../../../../external/decoders/flac-1.2.1/include/share/alloc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitmath.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/bitreader.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/cpu.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/crc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/fixed.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/format.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/lpc.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/md5.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/memory.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/stream_decoder.c +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/bitreader_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/cpu_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/fixed_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/lpc_asm.nasm +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/ia32/nasm.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitmath.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/bitreader.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/cpu.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/crc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/fixed.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/float.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/format.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/lpc.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/md5.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/private/memory.h +../../../../../../external/decoders/flac-1.2.1/src/libFLAC/include/protected/stream_decoder.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/ogg.h +../../../../../../external/decoders/ogg_vorbis/ogg/include/ogg/os_types.h +../../../../../../external/decoders/ogg_vorbis/ogg/src/bitwise.c +../../../../../../external/decoders/ogg_vorbis/ogg/src/framing.c +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/codec.h +../../../../../../external/decoders/ogg_vorbis/vorbis/include/vorbis/vorbisfile.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/backends.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/block.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codebook.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/codec_internal.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/floor1.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/highlevel.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/info.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lookup_data.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lpc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/lsp.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mapping0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/masking.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/mdct.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/misc.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/os.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/psy.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/registry.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/res0.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/scales.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/sharedbook.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/smallft.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/synthesis.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/vorbisfile.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.c +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/window.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/floor_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/psych_44.h +../../../../../../external/decoders/ogg_vorbis/vorbis/lib/modes/residue_44.h +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.c +../../../../../../external/decoders/tremor_lowmem/tremor_bitwise.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook.h +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_codebook_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_codec.h +../../../../../../external/decoders/tremor_lowmem/tremor_codec_internal.h +../../../../../../external/decoders/tremor_lowmem/tremor_dsp.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_dsp_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor1_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_floor_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_info.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_avx512.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_neon.c +../../../../../../external/decoders/tremor_lowmem/tremor_mapping0_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct.h +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_avx2.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_float_lookup.c +../../../../../../external/decoders/tremor_lowmem/tremor_mdct_sse.c +../../../../../../external/decoders/tremor_lowmem/tremor_misc.h +../../../../../../external/decoders/tremor_lowmem/tremor_os.h +../../../../../../external/decoders/tremor_lowmem/tremor_os_types.h +../../../../../../external/decoders/tremor_lowmem/tremor_res012.c +../../../../../../external/decoders/tremor_lowmem/tremor_window_lookup.h +../../../../../../external/misc/dlmalloc/dlmalloc.cpp +../../../../../../external/misc/dlmalloc/dlmalloc.h +../make/simple_event.makefile +../simple_event.cpp diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.includes b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.includes new file mode 100644 index 0000000..bebde0f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/examples/simple_event/simple_event.includes @@ -0,0 +1,8 @@ +../../../../../../examples/src +../../../../../../examples/platforms/linux/src +../../../../../../core_api/src +../../../../../../core_api/platforms/linux/src +../../../../../src +../../../../../../external/misc +../../../../../../external/dsps +../../../../../../external/decoders diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.cs b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.cs new file mode 100644 index 0000000..eabae46 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.cs @@ -0,0 +1,2256 @@ +/* ======================================================================================== */ +/* FMOD Studio API - C# wrapper. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/studio-api.html */ +/* ======================================================================================== */ + +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Collections; + +namespace FMOD.Studio +{ + public partial class STUDIO_VERSION + { +#if !UNITY_2021_3_OR_NEWER + public const string dll = "fmodstudio"; +#endif + } + + public enum STOP_MODE : int + { + ALLOWFADEOUT, + IMMEDIATE, + } + + public enum LOADING_STATE : int + { + UNLOADING, + UNLOADED, + LOADING, + LOADED, + ERROR, + } + + [StructLayout(LayoutKind.Sequential)] + public struct PROGRAMMER_SOUND_PROPERTIES + { + public StringWrapper name; + public IntPtr sound; + public int subsoundIndex; + } + + [StructLayout(LayoutKind.Sequential)] + public struct TIMELINE_MARKER_PROPERTIES + { + public StringWrapper name; + public int position; + } + + [StructLayout(LayoutKind.Sequential)] + public struct TIMELINE_BEAT_PROPERTIES + { + public int bar; + public int beat; + public int position; + public float tempo; + public int timesignatureupper; + public int timesignaturelower; + } + + [StructLayout(LayoutKind.Sequential)] + public struct TIMELINE_NESTED_BEAT_PROPERTIES + { + public GUID eventid; + public TIMELINE_BEAT_PROPERTIES properties; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ADVANCEDSETTINGS + { + public int cbsize; + public int commandqueuesize; + public int handleinitialsize; + public int studioupdateperiod; + public int idlesampledatapoolsize; + public int streamingscheduledelay; + public IntPtr encryptionkey; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CPU_USAGE + { + public float update; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BUFFER_INFO + { + public int currentusage; + public int peakusage; + public int capacity; + public int stallcount; + public float stalltime; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BUFFER_USAGE + { + public BUFFER_INFO studiocommandqueue; + public BUFFER_INFO studiohandle; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BANK_INFO + { + public int size; + public IntPtr userdata; + public int userdatalength; + public FILE_OPEN_CALLBACK opencallback; + public FILE_CLOSE_CALLBACK closecallback; + public FILE_READ_CALLBACK readcallback; + public FILE_SEEK_CALLBACK seekcallback; + } + + [Flags] + public enum SYSTEM_CALLBACK_TYPE : uint + { + PREUPDATE = 0x00000001, + POSTUPDATE = 0x00000002, + BANK_UNLOAD = 0x00000004, + LIVEUPDATE_CONNECTED = 0x00000008, + LIVEUPDATE_DISCONNECTED = 0x00000010, + ALL = 0xFFFFFFFF, + } + + public delegate RESULT SYSTEM_CALLBACK(IntPtr system, SYSTEM_CALLBACK_TYPE type, IntPtr commanddata, IntPtr userdata); + + public enum PARAMETER_TYPE : int + { + GAME_CONTROLLED, + AUTOMATIC_DISTANCE, + AUTOMATIC_EVENT_CONE_ANGLE, + AUTOMATIC_EVENT_ORIENTATION, + AUTOMATIC_DIRECTION, + AUTOMATIC_ELEVATION, + AUTOMATIC_LISTENER_ORIENTATION, + AUTOMATIC_SPEED, + AUTOMATIC_SPEED_ABSOLUTE, + AUTOMATIC_DISTANCE_NORMALIZED, + MAX + } + + [Flags] + public enum PARAMETER_FLAGS : uint + { + READONLY = 0x00000001, + AUTOMATIC = 0x00000002, + GLOBAL = 0x00000004, + DISCRETE = 0x00000008, + LABELED = 0x00000010, + } + + [StructLayout(LayoutKind.Sequential)] + public struct PARAMETER_ID + { + public uint data1; + public uint data2; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PARAMETER_DESCRIPTION + { + public StringWrapper name; + public PARAMETER_ID id; + public float minimum; + public float maximum; + public float defaultvalue; + public PARAMETER_TYPE type; + public PARAMETER_FLAGS flags; + public GUID guid; + } + + // This is only need for loading memory and given our C# wrapper LOAD_MEMORY_POINT isn't feasible anyway + enum LOAD_MEMORY_MODE : int + { + LOAD_MEMORY, + LOAD_MEMORY_POINT, + } + + enum LOAD_MEMORY_ALIGNMENT : int + { + VALUE = 32 + } + + [StructLayout(LayoutKind.Sequential)] + public struct SOUND_INFO + { + public IntPtr name_or_data; + public MODE mode; + public CREATESOUNDEXINFO exinfo; + public int subsoundindex; + + public string name + { + get + { + using (StringHelper.ThreadSafeEncoding encoding = StringHelper.GetFreeHelper()) + { + return ((mode & (MODE.OPENMEMORY | MODE.OPENMEMORY_POINT)) == 0) ? encoding.stringFromNative(name_or_data) : String.Empty; + } + } + } + } + + public enum USER_PROPERTY_TYPE : int + { + INTEGER, + BOOLEAN, + FLOAT, + STRING, + } + + [StructLayout(LayoutKind.Sequential)] + public struct USER_PROPERTY + { + public StringWrapper name; + public USER_PROPERTY_TYPE type; + private Union_IntBoolFloatString value; + + public int intValue() { return (type == USER_PROPERTY_TYPE.INTEGER) ? value.intvalue : -1; } + public bool boolValue() { return (type == USER_PROPERTY_TYPE.BOOLEAN) ? value.boolvalue : false; } + public float floatValue() { return (type == USER_PROPERTY_TYPE.FLOAT) ? value.floatvalue : -1; } + public string stringValue() { return (type == USER_PROPERTY_TYPE.STRING) ? value.stringvalue : ""; } + }; + + [StructLayout(LayoutKind.Explicit)] + struct Union_IntBoolFloatString + { + [FieldOffset(0)] + public int intvalue; + [FieldOffset(0)] + public bool boolvalue; + [FieldOffset(0)] + public float floatvalue; + [FieldOffset(0)] + public StringWrapper stringvalue; + } + + [Flags] + public enum INITFLAGS : uint + { + NORMAL = 0x00000000, + LIVEUPDATE = 0x00000001, + ALLOW_MISSING_PLUGINS = 0x00000002, + SYNCHRONOUS_UPDATE = 0x00000004, + DEFERRED_CALLBACKS = 0x00000008, + LOAD_FROM_UPDATE = 0x00000010, + MEMORY_TRACKING = 0x00000020, + } + + [Flags] + public enum LOAD_BANK_FLAGS : uint + { + NORMAL = 0x00000000, + NONBLOCKING = 0x00000001, + DECOMPRESS_SAMPLES = 0x00000002, + UNENCRYPTED = 0x00000004, + } + + [Flags] + public enum COMMANDCAPTURE_FLAGS : uint + { + NORMAL = 0x00000000, + FILEFLUSH = 0x00000001, + SKIP_INITIAL_STATE = 0x00000002, + } + + [Flags] + public enum COMMANDREPLAY_FLAGS : uint + { + NORMAL = 0x00000000, + SKIP_CLEANUP = 0x00000001, + FAST_FORWARD = 0x00000002, + SKIP_BANK_LOAD = 0x00000004, + } + + public enum PLAYBACK_STATE : int + { + PLAYING, + SUSTAINING, + STOPPED, + STARTING, + STOPPING, + } + + public enum EVENT_PROPERTY : int + { + CHANNELPRIORITY, + SCHEDULE_DELAY, + SCHEDULE_LOOKAHEAD, + MINIMUM_DISTANCE, + MAXIMUM_DISTANCE, + COOLDOWN, + MAX + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PLUGIN_INSTANCE_PROPERTIES + { + public IntPtr name; + public IntPtr dsp; + } + + [Flags] + public enum EVENT_CALLBACK_TYPE : uint + { + CREATED = 0x00000001, + DESTROYED = 0x00000002, + STARTING = 0x00000004, + STARTED = 0x00000008, + RESTARTED = 0x00000010, + STOPPED = 0x00000020, + START_FAILED = 0x00000040, + CREATE_PROGRAMMER_SOUND = 0x00000080, + DESTROY_PROGRAMMER_SOUND = 0x00000100, + PLUGIN_CREATED = 0x00000200, + PLUGIN_DESTROYED = 0x00000400, + TIMELINE_MARKER = 0x00000800, + TIMELINE_BEAT = 0x00001000, + SOUND_PLAYED = 0x00002000, + SOUND_STOPPED = 0x00004000, + REAL_TO_VIRTUAL = 0x00008000, + VIRTUAL_TO_REAL = 0x00010000, + START_EVENT_COMMAND = 0x00020000, + NESTED_TIMELINE_BEAT = 0x00040000, + + ALL = 0xFFFFFFFF, + } + + public delegate RESULT EVENT_CALLBACK(EVENT_CALLBACK_TYPE type, IntPtr _event, IntPtr parameters); + + public delegate RESULT COMMANDREPLAY_FRAME_CALLBACK(IntPtr replay, int commandindex, float currenttime, IntPtr userdata); + public delegate RESULT COMMANDREPLAY_LOAD_BANK_CALLBACK(IntPtr replay, int commandindex, GUID bankguid, IntPtr bankfilename, LOAD_BANK_FLAGS flags, out IntPtr bank, IntPtr userdata); + public delegate RESULT COMMANDREPLAY_CREATE_INSTANCE_CALLBACK(IntPtr replay, int commandindex, IntPtr eventdescription, out IntPtr instance, IntPtr userdata); + + public enum INSTANCETYPE : int + { + NONE, + SYSTEM, + EVENTDESCRIPTION, + EVENTINSTANCE, + PARAMETERINSTANCE, + BUS, + VCA, + BANK, + COMMANDREPLAY, + } + + [StructLayout(LayoutKind.Sequential)] + public struct COMMAND_INFO + { + public StringWrapper commandname; + public int parentcommandindex; + public int framenumber; + public float frametime; + public INSTANCETYPE instancetype; + public INSTANCETYPE outputtype; + public UInt32 instancehandle; + public UInt32 outputhandle; + } + + [StructLayout(LayoutKind.Sequential)] + public struct MEMORY_USAGE + { + public int exclusive; + public int inclusive; + public int sampledata; + } + + public struct Util + { + public static RESULT parseID(string idString, out GUID id) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_ParseID(encoder.byteFromStringUTF8(idString), out id); + } + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_ParseID(byte[] idString, out GUID id); + #endregion + } + + public struct System + { + // Initialization / system functions. + public static RESULT create(out System system) + { + return FMOD_Studio_System_Create(out system.handle, VERSION.number); + } + public RESULT setAdvancedSettings(ADVANCEDSETTINGS settings) + { + settings.cbsize = Marshal.SizeOf(); + return FMOD_Studio_System_SetAdvancedSettings(this.handle, ref settings); + } + public RESULT setAdvancedSettings(ADVANCEDSETTINGS settings, string encryptionKey) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr userKey = settings.encryptionkey; + settings.encryptionkey = encoder.intptrFromStringUTF8(encryptionKey); + FMOD.RESULT result = setAdvancedSettings(settings); + settings.encryptionkey = userKey; + return result; + } + } + public RESULT getAdvancedSettings(out ADVANCEDSETTINGS settings) + { + settings.cbsize = Marshal.SizeOf(); + return FMOD_Studio_System_GetAdvancedSettings(this.handle, out settings); + } + public RESULT initialize(int maxchannels, INITFLAGS studioflags, FMOD.INITFLAGS flags, IntPtr extradriverdata) + { + return FMOD_Studio_System_Initialize(this.handle, maxchannels, studioflags, flags, extradriverdata); + } + public RESULT release() + { + return FMOD_Studio_System_Release(this.handle); + } + public RESULT update() + { + return FMOD_Studio_System_Update(this.handle); + } + public RESULT getCoreSystem(out FMOD.System coresystem) + { + return FMOD_Studio_System_GetCoreSystem(this.handle, out coresystem.handle); + } + public RESULT getEvent(string path, out EventDescription _event) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetEvent(this.handle, encoder.byteFromStringUTF8(path), out _event.handle); + } + } + public RESULT getBus(string path, out Bus bus) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetBus(this.handle, encoder.byteFromStringUTF8(path), out bus.handle); + } + } + public RESULT getVCA(string path, out VCA vca) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetVCA(this.handle, encoder.byteFromStringUTF8(path), out vca.handle); + } + } + public RESULT getBank(string path, out Bank bank) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetBank(this.handle, encoder.byteFromStringUTF8(path), out bank.handle); + } + } + + public RESULT getEventByID(GUID id, out EventDescription _event) + { + return FMOD_Studio_System_GetEventByID(this.handle, ref id, out _event.handle); + } + public RESULT getBusByID(GUID id, out Bus bus) + { + return FMOD_Studio_System_GetBusByID(this.handle, ref id, out bus.handle); + } + public RESULT getVCAByID(GUID id, out VCA vca) + { + return FMOD_Studio_System_GetVCAByID(this.handle, ref id, out vca.handle); + } + public RESULT getBankByID(GUID id, out Bank bank) + { + return FMOD_Studio_System_GetBankByID(this.handle, ref id, out bank.handle); + } + public RESULT getSoundInfo(string key, out SOUND_INFO info) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetSoundInfo(this.handle, encoder.byteFromStringUTF8(key), out info); + } + } + public RESULT getParameterDescriptionByName(string name, out PARAMETER_DESCRIPTION parameter) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetParameterDescriptionByName(this.handle, encoder.byteFromStringUTF8(name), out parameter); + } + } + public RESULT getParameterDescriptionByID(PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter) + { + return FMOD_Studio_System_GetParameterDescriptionByID(this.handle, id, out parameter); + } + public RESULT getParameterLabelByName(string name, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + byte[] nameBytes = encoder.byteFromStringUTF8(name); + RESULT result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterLabelByID(PARAMETER_ID id, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterByID(PARAMETER_ID id, out float value) + { + float finalValue; + return getParameterByID(id, out value, out finalValue); + } + public RESULT getParameterByID(PARAMETER_ID id, out float value, out float finalvalue) + { + return FMOD_Studio_System_GetParameterByID(this.handle, id, out value, out finalvalue); + } + public RESULT setParameterByID(PARAMETER_ID id, float value, bool ignoreseekspeed = false) + { + return FMOD_Studio_System_SetParameterByID(this.handle, id, value, ignoreseekspeed); + } + public RESULT setParameterByIDWithLabel(PARAMETER_ID id, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_SetParameterByIDWithLabel(this.handle, id, encoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT setParametersByIDs(PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed = false) + { + return FMOD_Studio_System_SetParametersByIDs(this.handle, ids, values, count, ignoreseekspeed); + } + public RESULT getParameterByName(string name, out float value) + { + float finalValue; + return getParameterByName(name, out value, out finalValue); + } + public RESULT getParameterByName(string name, out float value, out float finalvalue) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetParameterByName(this.handle, encoder.byteFromStringUTF8(name), out value, out finalvalue); + } + } + public RESULT setParameterByName(string name, float value, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_SetParameterByName(this.handle, encoder.byteFromStringUTF8(name), value, ignoreseekspeed); + } + } + public RESULT setParameterByNameWithLabel(string name, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper(), + labelEncoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_SetParameterByNameWithLabel(this.handle, encoder.byteFromStringUTF8(name), labelEncoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT lookupID(string path, out GUID id) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_LookupID(this.handle, encoder.byteFromStringUTF8(path), out id); + } + } + public RESULT lookupPath(GUID id, out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_System_LookupPath(this.handle, ref id, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_System_LookupPath(this.handle, ref id, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getNumListeners(out int numlisteners) + { + return FMOD_Studio_System_GetNumListeners(this.handle, out numlisteners); + } + public RESULT setNumListeners(int numlisteners) + { + return FMOD_Studio_System_SetNumListeners(this.handle, numlisteners); + } + public RESULT getListenerAttributes(int listener, out ATTRIBUTES_3D attributes) + { + return FMOD_Studio_System_GetListenerAttributes(this.handle, listener, out attributes, IntPtr.Zero); + } + public RESULT getListenerAttributes(int listener, out ATTRIBUTES_3D attributes, out VECTOR attenuationposition) + { + return FMOD_Studio_System_GetListenerAttributes(this.handle, listener, out attributes, out attenuationposition); + } + public RESULT setListenerAttributes(int listener, ATTRIBUTES_3D attributes) + { + return FMOD_Studio_System_SetListenerAttributes(this.handle, listener, ref attributes, IntPtr.Zero); + } + public RESULT setListenerAttributes(int listener, ATTRIBUTES_3D attributes, VECTOR attenuationposition) + { + return FMOD_Studio_System_SetListenerAttributes(this.handle, listener, ref attributes, ref attenuationposition); + } + public RESULT getListenerWeight(int listener, out float weight) + { + return FMOD_Studio_System_GetListenerWeight(this.handle, listener, out weight); + } + public RESULT setListenerWeight(int listener, float weight) + { + return FMOD_Studio_System_SetListenerWeight(this.handle, listener, weight); + } + public RESULT loadBankFile(string filename, LOAD_BANK_FLAGS flags, out Bank bank) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_LoadBankFile(this.handle, encoder.byteFromStringUTF8(filename), flags, out bank.handle); + } + } + public RESULT loadBankMemory(byte[] buffer, LOAD_BANK_FLAGS flags, out Bank bank) + { + // Manually pin the byte array. It's what the marshaller should do anyway but don't leave it to chance. + GCHandle pinnedArray = GCHandle.Alloc(buffer, GCHandleType.Pinned); + IntPtr pointer = pinnedArray.AddrOfPinnedObject(); + RESULT result = FMOD_Studio_System_LoadBankMemory(this.handle, pointer, buffer.Length, LOAD_MEMORY_MODE.LOAD_MEMORY, flags, out bank.handle); + pinnedArray.Free(); + return result; + } + public RESULT loadBankCustom(BANK_INFO info, LOAD_BANK_FLAGS flags, out Bank bank) + { + info.size = Marshal.SizeOf(); + return FMOD_Studio_System_LoadBankCustom(this.handle, ref info, flags, out bank.handle); + } + public RESULT unloadAll() + { + return FMOD_Studio_System_UnloadAll(this.handle); + } + public RESULT flushCommands() + { + return FMOD_Studio_System_FlushCommands(this.handle); + } + public RESULT flushSampleLoading() + { + return FMOD_Studio_System_FlushSampleLoading(this.handle); + } + public RESULT startCommandCapture(string filename, COMMANDCAPTURE_FLAGS flags) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_StartCommandCapture(this.handle, encoder.byteFromStringUTF8(filename), flags); + } + } + public RESULT stopCommandCapture() + { + return FMOD_Studio_System_StopCommandCapture(this.handle); + } + public RESULT loadCommandReplay(string filename, COMMANDREPLAY_FLAGS flags, out CommandReplay replay) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_LoadCommandReplay(this.handle, encoder.byteFromStringUTF8(filename), flags, out replay.handle); + } + } + public RESULT getBankCount(out int count) + { + return FMOD_Studio_System_GetBankCount(this.handle, out count); + } + public RESULT getBankList(out Bank[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_System_GetBankCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new Bank[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_System_GetBankList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new Bank[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + public RESULT getParameterDescriptionCount(out int count) + { + return FMOD_Studio_System_GetParameterDescriptionCount(this.handle, out count); + } + public RESULT getParameterDescriptionList(out PARAMETER_DESCRIPTION[] array) + { + array = null; + + int capacity; + RESULT result = FMOD_Studio_System_GetParameterDescriptionCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new PARAMETER_DESCRIPTION[0]; + return RESULT.OK; + } + + PARAMETER_DESCRIPTION[] tempArray = new PARAMETER_DESCRIPTION[capacity]; + int actualCount; + result = FMOD_Studio_System_GetParameterDescriptionList(this.handle, tempArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + + if (actualCount != capacity) + { + Array.Resize(ref tempArray, actualCount); + } + + array = tempArray; + + return RESULT.OK; + } + public RESULT getCPUUsage(out CPU_USAGE usage, out FMOD.CPU_USAGE usage_core) + { + return FMOD_Studio_System_GetCPUUsage(this.handle, out usage, out usage_core); + } + public RESULT getBufferUsage(out BUFFER_USAGE usage) + { + return FMOD_Studio_System_GetBufferUsage(this.handle, out usage); + } + public RESULT resetBufferUsage() + { + return FMOD_Studio_System_ResetBufferUsage(this.handle); + } + + public RESULT setCallback(SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL) + { + return FMOD_Studio_System_SetCallback(this.handle, callback, callbackmask); + } + + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_System_GetUserData(this.handle, out userdata); + } + + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_System_SetUserData(this.handle, userdata); + } + + public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) + { + return FMOD_Studio_System_GetMemoryUsage(this.handle, out memoryusage); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Create (out IntPtr system, uint headerversion); + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_System_IsValid (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetAdvancedSettings (IntPtr system, out ADVANCEDSETTINGS settings); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Initialize (IntPtr system, int maxchannels, INITFLAGS studioflags, FMOD.INITFLAGS flags, IntPtr extradriverdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Release (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Update (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetCoreSystem (IntPtr system, out IntPtr coresystem); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetEvent (IntPtr system, byte[] path, out IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBus (IntPtr system, byte[] path, out IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetVCA (IntPtr system, byte[] path, out IntPtr vca); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBank (IntPtr system, byte[] path, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetEventByID (IntPtr system, ref GUID id, out IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBusByID (IntPtr system, ref GUID id, out IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetVCAByID (IntPtr system, ref GUID id, out IntPtr vca); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBankByID (IntPtr system, ref GUID id, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetSoundInfo (IntPtr system, byte[] key, out SOUND_INFO info); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionByName(IntPtr system, byte[] name, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionByID(IntPtr system, PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterLabelByName (IntPtr system, byte[] name, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterLabelByID (IntPtr system, PARAMETER_ID id, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterByID (IntPtr system, PARAMETER_ID id, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByID (IntPtr system, PARAMETER_ID id, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByIDWithLabel (IntPtr system, PARAMETER_ID id, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParametersByIDs (IntPtr system, PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterByName (IntPtr system, byte[] name, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByName (IntPtr system, byte[] name, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByNameWithLabel (IntPtr system, byte[] name, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LookupID (IntPtr system, byte[] path, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LookupPath (IntPtr system, ref GUID id, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetNumListeners (IntPtr system, out int numlisteners); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetNumListeners (IntPtr system, int numlisteners); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetListenerAttributes (IntPtr system, int listener, out ATTRIBUTES_3D attributes, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetListenerAttributes (IntPtr system, int listener, out ATTRIBUTES_3D attributes, out VECTOR attenuationposition); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetListenerAttributes (IntPtr system, int listener, ref ATTRIBUTES_3D attributes, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetListenerAttributes (IntPtr system, int listener, ref ATTRIBUTES_3D attributes, ref VECTOR attenuationposition); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetListenerWeight (IntPtr system, int listener, out float weight); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetListenerWeight (IntPtr system, int listener, float weight); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadBankFile (IntPtr system, byte[] filename, LOAD_BANK_FLAGS flags, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadBankMemory (IntPtr system, IntPtr buffer, int length, LOAD_MEMORY_MODE mode, LOAD_BANK_FLAGS flags, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadBankCustom (IntPtr system, ref BANK_INFO info, LOAD_BANK_FLAGS flags, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_UnloadAll (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_FlushCommands (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_FlushSampleLoading (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_StartCommandCapture (IntPtr system, byte[] filename, COMMANDCAPTURE_FLAGS flags); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_StopCommandCapture (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadCommandReplay (IntPtr system, byte[] filename, COMMANDREPLAY_FLAGS flags, out IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBankCount (IntPtr system, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBankList (IntPtr system, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionCount(IntPtr system, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionList(IntPtr system, [Out] PARAMETER_DESCRIPTION[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetCPUUsage (IntPtr system, out CPU_USAGE usage, out FMOD.CPU_USAGE usage_core); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBufferUsage (IntPtr system, out BUFFER_USAGE usage); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_ResetBufferUsage (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetCallback (IntPtr system, SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetUserData (IntPtr system, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetUserData (IntPtr system, IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetMemoryUsage (IntPtr system, out MEMORY_USAGE memoryusage); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public System(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_System_IsValid(this.handle); + } + + #endregion + } + + public struct EventDescription + { + public RESULT getID(out GUID id) + { + return FMOD_Studio_EventDescription_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_EventDescription_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterDescriptionCount(out int count) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionCount(this.handle, out count); + } + public RESULT getParameterDescriptionByIndex(int index, out PARAMETER_DESCRIPTION parameter) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(this.handle, index, out parameter); + } + public RESULT getParameterDescriptionByName(string name, out PARAMETER_DESCRIPTION parameter) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionByName(this.handle, encoder.byteFromStringUTF8(name), out parameter); + } + } + public RESULT getParameterDescriptionByID(PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionByID(this.handle, id, out parameter); + } + public RESULT getParameterLabelByIndex(int index, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterLabelByName(string name, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + byte[] nameBytes = encoder.byteFromStringUTF8(name); + RESULT result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterLabelByID(PARAMETER_ID id, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getUserPropertyCount(out int count) + { + return FMOD_Studio_EventDescription_GetUserPropertyCount(this.handle, out count); + } + public RESULT getUserPropertyByIndex(int index, out USER_PROPERTY property) + { + return FMOD_Studio_EventDescription_GetUserPropertyByIndex(this.handle, index, out property); + } + public RESULT getUserProperty(string name, out USER_PROPERTY property) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventDescription_GetUserProperty(this.handle, encoder.byteFromStringUTF8(name), out property); + } + } + public RESULT getLength(out int length) + { + return FMOD_Studio_EventDescription_GetLength(this.handle, out length); + } + public RESULT getMinMaxDistance(out float min, out float max) + { + return FMOD_Studio_EventDescription_GetMinMaxDistance(this.handle, out min, out max); + } + public RESULT getSoundSize(out float size) + { + return FMOD_Studio_EventDescription_GetSoundSize(this.handle, out size); + } + public RESULT isSnapshot(out bool snapshot) + { + return FMOD_Studio_EventDescription_IsSnapshot(this.handle, out snapshot); + } + public RESULT isOneshot(out bool oneshot) + { + return FMOD_Studio_EventDescription_IsOneshot(this.handle, out oneshot); + } + public RESULT isStream(out bool isStream) + { + return FMOD_Studio_EventDescription_IsStream(this.handle, out isStream); + } + public RESULT is3D(out bool is3D) + { + return FMOD_Studio_EventDescription_Is3D(this.handle, out is3D); + } + public RESULT isDopplerEnabled(out bool doppler) + { + return FMOD_Studio_EventDescription_IsDopplerEnabled(this.handle, out doppler); + } + public RESULT hasSustainPoint(out bool sustainPoint) + { + return FMOD_Studio_EventDescription_HasSustainPoint(this.handle, out sustainPoint); + } + + public RESULT createInstance(out EventInstance instance) + { + return FMOD_Studio_EventDescription_CreateInstance(this.handle, out instance.handle); + } + + public RESULT getInstanceCount(out int count) + { + return FMOD_Studio_EventDescription_GetInstanceCount(this.handle, out count); + } + public RESULT getInstanceList(out EventInstance[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_EventDescription_GetInstanceCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new EventInstance[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_EventDescription_GetInstanceList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new EventInstance[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + + public RESULT loadSampleData() + { + return FMOD_Studio_EventDescription_LoadSampleData(this.handle); + } + + public RESULT unloadSampleData() + { + return FMOD_Studio_EventDescription_UnloadSampleData(this.handle); + } + + public RESULT getSampleLoadingState(out LOADING_STATE state) + { + return FMOD_Studio_EventDescription_GetSampleLoadingState(this.handle, out state); + } + + public RESULT releaseAllInstances() + { + return FMOD_Studio_EventDescription_ReleaseAllInstances(this.handle); + } + public RESULT setCallback(EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL) + { + return FMOD_Studio_EventDescription_SetCallback(this.handle, callback, callbackmask); + } + + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_EventDescription_GetUserData(this.handle, out userdata); + } + + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_EventDescription_SetUserData(this.handle, userdata); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_EventDescription_IsValid (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetID (IntPtr eventdescription, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetPath (IntPtr eventdescription, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionCount(IntPtr eventdescription, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(IntPtr eventdescription, int index, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByName(IntPtr eventdescription, byte[] name, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByID(IntPtr eventdescription, PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByIndex(IntPtr eventdescription, int index, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByName(IntPtr eventdescription, byte[] name, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByID (IntPtr eventdescription, PARAMETER_ID id, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserPropertyCount (IntPtr eventdescription, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserPropertyByIndex(IntPtr eventdescription, int index, out USER_PROPERTY property); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserProperty (IntPtr eventdescription, byte[] name, out USER_PROPERTY property); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetLength (IntPtr eventdescription, out int length); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetMinMaxDistance (IntPtr eventdescription, out float min, out float max); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetSoundSize (IntPtr eventdescription, out float size); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsSnapshot (IntPtr eventdescription, out bool snapshot); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsOneshot (IntPtr eventdescription, out bool oneshot); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsStream (IntPtr eventdescription, out bool isStream); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_Is3D (IntPtr eventdescription, out bool is3D); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsDopplerEnabled (IntPtr eventdescription, out bool doppler); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_HasSustainPoint (IntPtr eventdescription, out bool sustainPoint); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_CreateInstance (IntPtr eventdescription, out IntPtr instance); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetInstanceCount (IntPtr eventdescription, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetInstanceList (IntPtr eventdescription, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_LoadSampleData (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_UnloadSampleData (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetSampleLoadingState (IntPtr eventdescription, out LOADING_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_ReleaseAllInstances (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_SetCallback (IntPtr eventdescription, EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserData (IntPtr eventdescription, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_SetUserData (IntPtr eventdescription, IntPtr userdata); + #endregion + #region wrapperinternal + + public IntPtr handle; + + public EventDescription(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_EventDescription_IsValid(this.handle); + } + + #endregion + } + + public struct EventInstance + { + public RESULT getDescription(out EventDescription description) + { + return FMOD_Studio_EventInstance_GetDescription(this.handle, out description.handle); + } + public RESULT getSystem(out System system) + { + return FMOD_Studio_EventInstance_GetSystem(this.handle, out system.handle); + } + public RESULT getVolume(out float volume) + { + return FMOD_Studio_EventInstance_GetVolume(this.handle, out volume, IntPtr.Zero); + } + public RESULT getVolume(out float volume, out float finalvolume) + { + return FMOD_Studio_EventInstance_GetVolume(this.handle, out volume, out finalvolume); + } + public RESULT setVolume(float volume) + { + return FMOD_Studio_EventInstance_SetVolume(this.handle, volume); + } + public RESULT getPitch(out float pitch) + { + return FMOD_Studio_EventInstance_GetPitch(this.handle, out pitch, IntPtr.Zero); + } + public RESULT getPitch(out float pitch, out float finalpitch) + { + return FMOD_Studio_EventInstance_GetPitch(this.handle, out pitch, out finalpitch); + } + public RESULT setPitch(float pitch) + { + return FMOD_Studio_EventInstance_SetPitch(this.handle, pitch); + } + public RESULT get3DAttributes(out ATTRIBUTES_3D attributes) + { + return FMOD_Studio_EventInstance_Get3DAttributes(this.handle, out attributes); + } + public RESULT set3DAttributes(ATTRIBUTES_3D attributes) + { + return FMOD_Studio_EventInstance_Set3DAttributes(this.handle, ref attributes); + } + public RESULT getListenerMask(out uint mask) + { + return FMOD_Studio_EventInstance_GetListenerMask(this.handle, out mask); + } + public RESULT setListenerMask(uint mask) + { + return FMOD_Studio_EventInstance_SetListenerMask(this.handle, mask); + } + public RESULT getProperty(EVENT_PROPERTY index, out float value) + { + return FMOD_Studio_EventInstance_GetProperty(this.handle, index, out value); + } + public RESULT setProperty(EVENT_PROPERTY index, float value) + { + return FMOD_Studio_EventInstance_SetProperty(this.handle, index, value); + } + public RESULT getReverbLevel(int index, out float level) + { + return FMOD_Studio_EventInstance_GetReverbLevel(this.handle, index, out level); + } + public RESULT setReverbLevel(int index, float level) + { + return FMOD_Studio_EventInstance_SetReverbLevel(this.handle, index, level); + } + public RESULT getPaused(out bool paused) + { + return FMOD_Studio_EventInstance_GetPaused(this.handle, out paused); + } + public RESULT setPaused(bool paused) + { + return FMOD_Studio_EventInstance_SetPaused(this.handle, paused); + } + public RESULT start() + { + return FMOD_Studio_EventInstance_Start(this.handle); + } + public RESULT stop(STOP_MODE mode) + { + return FMOD_Studio_EventInstance_Stop(this.handle, mode); + } + public RESULT getTimelinePosition(out int position) + { + return FMOD_Studio_EventInstance_GetTimelinePosition(this.handle, out position); + } + public RESULT setTimelinePosition(int position) + { + return FMOD_Studio_EventInstance_SetTimelinePosition(this.handle, position); + } + public RESULT getPlaybackState(out PLAYBACK_STATE state) + { + return FMOD_Studio_EventInstance_GetPlaybackState(this.handle, out state); + } + public RESULT getChannelGroup(out FMOD.ChannelGroup group) + { + return FMOD_Studio_EventInstance_GetChannelGroup(this.handle, out group.handle); + } + public RESULT getMinMaxDistance(out float min, out float max) + { + return FMOD_Studio_EventInstance_GetMinMaxDistance(this.handle, out min, out max); + } + public RESULT release() + { + return FMOD_Studio_EventInstance_Release(this.handle); + } + public RESULT isVirtual(out bool virtualstate) + { + return FMOD_Studio_EventInstance_IsVirtual(this.handle, out virtualstate); + } + public RESULT getParameterByID(PARAMETER_ID id, out float value) + { + float finalvalue; + return getParameterByID(id, out value, out finalvalue); + } + public RESULT getParameterByID(PARAMETER_ID id, out float value, out float finalvalue) + { + return FMOD_Studio_EventInstance_GetParameterByID(this.handle, id, out value, out finalvalue); + } + public RESULT setParameterByID(PARAMETER_ID id, float value, bool ignoreseekspeed = false) + { + return FMOD_Studio_EventInstance_SetParameterByID(this.handle, id, value, ignoreseekspeed); + } + public RESULT setParameterByIDWithLabel(PARAMETER_ID id, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_SetParameterByIDWithLabel(this.handle, id, encoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT setParametersByIDs(PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed = false) + { + return FMOD_Studio_EventInstance_SetParametersByIDs(this.handle, ids, values, count, ignoreseekspeed); + } + public RESULT getParameterByName(string name, out float value) + { + float finalValue; + return getParameterByName(name, out value, out finalValue); + } + public RESULT getParameterByName(string name, out float value, out float finalvalue) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_GetParameterByName(this.handle, encoder.byteFromStringUTF8(name), out value, out finalvalue); + } + } + public RESULT setParameterByName(string name, float value, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_SetParameterByName(this.handle, encoder.byteFromStringUTF8(name), value, ignoreseekspeed); + } + } + public RESULT setParameterByNameWithLabel(string name, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper(), + labelEncoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_SetParameterByNameWithLabel(this.handle, encoder.byteFromStringUTF8(name), labelEncoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT keyOff() + { + return FMOD_Studio_EventInstance_KeyOff(this.handle); + } + public RESULT setCallback(EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL) + { + return FMOD_Studio_EventInstance_SetCallback(this.handle, callback, callbackmask); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_EventInstance_GetUserData(this.handle, out userdata); + } + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_EventInstance_SetUserData(this.handle, userdata); + } + public RESULT getCPUUsage(out uint exclusive, out uint inclusive) + { + return FMOD_Studio_EventInstance_GetCPUUsage(this.handle, out exclusive, out inclusive); + } + public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) + { + return FMOD_Studio_EventInstance_GetMemoryUsage(this.handle, out memoryusage); + } + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_EventInstance_IsValid (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetDescription (IntPtr _event, out IntPtr description); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetSystem (IntPtr _event, out IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetVolume (IntPtr _event, out float volume, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetVolume (IntPtr _event, out float volume, out float finalvolume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetVolume (IntPtr _event, float volume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPitch (IntPtr _event, out float pitch, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPitch (IntPtr _event, out float pitch, out float finalpitch); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetPitch (IntPtr _event, float pitch); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Get3DAttributes (IntPtr _event, out ATTRIBUTES_3D attributes); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Set3DAttributes (IntPtr _event, ref ATTRIBUTES_3D attributes); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetListenerMask (IntPtr _event, out uint mask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetListenerMask (IntPtr _event, uint mask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetProperty (IntPtr _event, EVENT_PROPERTY index, out float value); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetProperty (IntPtr _event, EVENT_PROPERTY index, float value); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetReverbLevel (IntPtr _event, int index, out float level); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetReverbLevel (IntPtr _event, int index, float level); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPaused (IntPtr _event, out bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetPaused (IntPtr _event, bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Start (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Stop (IntPtr _event, STOP_MODE mode); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetTimelinePosition (IntPtr _event, out int position); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetTimelinePosition (IntPtr _event, int position); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPlaybackState (IntPtr _event, out PLAYBACK_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetChannelGroup (IntPtr _event, out IntPtr group); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetMinMaxDistance (IntPtr _event, out float min, out float max); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Release (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_IsVirtual (IntPtr _event, out bool virtualstate); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetParameterByName (IntPtr _event, byte[] name, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByName (IntPtr _event, byte[] name, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByNameWithLabel (IntPtr _event, byte[] name, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetParameterByID (IntPtr _event, PARAMETER_ID id, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByID (IntPtr _event, PARAMETER_ID id, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByIDWithLabel (IntPtr _event, PARAMETER_ID id, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParametersByIDs (IntPtr _event, PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_KeyOff (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetCallback (IntPtr _event, EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask); + [DllImport (STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetUserData (IntPtr _event, out IntPtr userdata); + [DllImport (STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetUserData (IntPtr _event, IntPtr userdata); + [DllImport (STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetCPUUsage (IntPtr _event, out uint exclusive, out uint inclusive); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetMemoryUsage (IntPtr _event, out MEMORY_USAGE memoryusage); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public EventInstance(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_EventInstance_IsValid(this.handle); + } + + #endregion + } + + public struct Bus + { + public RESULT getID(out GUID id) + { + return FMOD_Studio_Bus_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_Bus_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_Bus_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + + } + public RESULT getVolume(out float volume) + { + float finalVolume; + return getVolume(out volume, out finalVolume); + } + public RESULT getVolume(out float volume, out float finalvolume) + { + return FMOD_Studio_Bus_GetVolume(this.handle, out volume, out finalvolume); + } + public RESULT setVolume(float volume) + { + return FMOD_Studio_Bus_SetVolume(this.handle, volume); + } + public RESULT getPaused(out bool paused) + { + return FMOD_Studio_Bus_GetPaused(this.handle, out paused); + } + public RESULT setPaused(bool paused) + { + return FMOD_Studio_Bus_SetPaused(this.handle, paused); + } + public RESULT getMute(out bool mute) + { + return FMOD_Studio_Bus_GetMute(this.handle, out mute); + } + public RESULT setMute(bool mute) + { + return FMOD_Studio_Bus_SetMute(this.handle, mute); + } + public RESULT stopAllEvents(STOP_MODE mode) + { + return FMOD_Studio_Bus_StopAllEvents(this.handle, mode); + } + public RESULT lockChannelGroup() + { + return FMOD_Studio_Bus_LockChannelGroup(this.handle); + } + public RESULT unlockChannelGroup() + { + return FMOD_Studio_Bus_UnlockChannelGroup(this.handle); + } + public RESULT getChannelGroup(out FMOD.ChannelGroup group) + { + return FMOD_Studio_Bus_GetChannelGroup(this.handle, out group.handle); + } + public RESULT getCPUUsage(out uint exclusive, out uint inclusive) + { + return FMOD_Studio_Bus_GetCPUUsage(this.handle, out exclusive, out inclusive); + } + public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) + { + return FMOD_Studio_Bus_GetMemoryUsage(this.handle, out memoryusage); + } + public RESULT getPortIndex(out ulong index) + { + return FMOD_Studio_Bus_GetPortIndex(this.handle, out index); + } + public RESULT setPortIndex(ulong index) + { + return FMOD_Studio_Bus_SetPortIndex(this.handle, index); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_Bus_IsValid (IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetID (IntPtr bus, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetPath (IntPtr bus, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetVolume (IntPtr bus, out float volume, out float finalvolume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetVolume (IntPtr bus, float volume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetPaused (IntPtr bus, out bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetPaused (IntPtr bus, bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetMute (IntPtr bus, out bool mute); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetMute (IntPtr bus, bool mute); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_StopAllEvents (IntPtr bus, STOP_MODE mode); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_LockChannelGroup (IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_UnlockChannelGroup (IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetChannelGroup (IntPtr bus, out IntPtr group); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetCPUUsage (IntPtr bus, out uint exclusive, out uint inclusive); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetMemoryUsage (IntPtr bus, out MEMORY_USAGE memoryusage); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetPortIndex (IntPtr bus, out ulong index); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetPortIndex (IntPtr bus, ulong index); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Bus(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_Bus_IsValid(this.handle); + } + + #endregion + } + + public struct VCA + { + public RESULT getID(out GUID id) + { + return FMOD_Studio_VCA_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_VCA_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_VCA_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getVolume(out float volume) + { + float finalVolume; + return getVolume(out volume, out finalVolume); + } + public RESULT getVolume(out float volume, out float finalvolume) + { + return FMOD_Studio_VCA_GetVolume(this.handle, out volume, out finalvolume); + } + public RESULT setVolume(float volume) + { + return FMOD_Studio_VCA_SetVolume(this.handle, volume); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_VCA_IsValid (IntPtr vca); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_GetID (IntPtr vca, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_GetPath (IntPtr vca, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_GetVolume (IntPtr vca, out float volume, out float finalvolume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_SetVolume (IntPtr vca, float volume); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public VCA(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_VCA_IsValid(this.handle); + } + + #endregion + } + + public struct Bank + { + // Property access + + public RESULT getID(out GUID id) + { + return FMOD_Studio_Bank_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_Bank_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_Bank_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT unload() + { + return FMOD_Studio_Bank_Unload(this.handle); + } + public RESULT loadSampleData() + { + return FMOD_Studio_Bank_LoadSampleData(this.handle); + } + public RESULT unloadSampleData() + { + return FMOD_Studio_Bank_UnloadSampleData(this.handle); + } + public RESULT getLoadingState(out LOADING_STATE state) + { + return FMOD_Studio_Bank_GetLoadingState(this.handle, out state); + } + public RESULT getSampleLoadingState(out LOADING_STATE state) + { + return FMOD_Studio_Bank_GetSampleLoadingState(this.handle, out state); + } + + // Enumeration + public RESULT getStringCount(out int count) + { + return FMOD_Studio_Bank_GetStringCount(this.handle, out count); + } + public RESULT getStringInfo(int index, out GUID id, out string path) + { + path = null; + id = new GUID(); + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_Bank_GetStringInfo(this.handle, index, out id, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_Bank_GetStringInfo(this.handle, index, out id, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + + public RESULT getEventCount(out int count) + { + return FMOD_Studio_Bank_GetEventCount(this.handle, out count); + } + public RESULT getEventList(out EventDescription[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_Bank_GetEventCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new EventDescription[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_Bank_GetEventList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new EventDescription[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + public RESULT getBusCount(out int count) + { + return FMOD_Studio_Bank_GetBusCount(this.handle, out count); + } + public RESULT getBusList(out Bus[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_Bank_GetBusCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new Bus[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_Bank_GetBusList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new Bus[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + public RESULT getVCACount(out int count) + { + return FMOD_Studio_Bank_GetVCACount(this.handle, out count); + } + public RESULT getVCAList(out VCA[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_Bank_GetVCACount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new VCA[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_Bank_GetVCAList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new VCA[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_Bank_GetUserData(this.handle, out userdata); + } + + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_Bank_SetUserData(this.handle, userdata); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_Bank_IsValid (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetID (IntPtr bank, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetPath (IntPtr bank, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_Unload (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_LoadSampleData (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_UnloadSampleData (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetLoadingState (IntPtr bank, out LOADING_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetSampleLoadingState (IntPtr bank, out LOADING_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetStringCount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetStringInfo (IntPtr bank, int index, out GUID id, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetEventCount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetEventList (IntPtr bank, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetBusCount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetBusList (IntPtr bank, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetVCACount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetVCAList (IntPtr bank, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetUserData (IntPtr bank, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_SetUserData (IntPtr bank, IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Bank(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_Bank_IsValid(this.handle); + } + + #endregion + } + + public struct CommandReplay + { + // Information query + public RESULT getSystem(out System system) + { + return FMOD_Studio_CommandReplay_GetSystem(this.handle, out system.handle); + } + + public RESULT getLength(out float length) + { + return FMOD_Studio_CommandReplay_GetLength(this.handle, out length); + } + public RESULT getCommandCount(out int count) + { + return FMOD_Studio_CommandReplay_GetCommandCount(this.handle, out count); + } + public RESULT getCommandInfo(int commandIndex, out COMMAND_INFO info) + { + return FMOD_Studio_CommandReplay_GetCommandInfo(this.handle, commandIndex, out info); + } + + public RESULT getCommandString(int commandIndex, out string buffer) + { + buffer = null; + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + int stringLength = 256; + IntPtr stringMem = Marshal.AllocHGlobal(256); + RESULT result = FMOD_Studio_CommandReplay_GetCommandString(this.handle, commandIndex, stringMem, stringLength); + + while (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringLength *= 2; + stringMem = Marshal.AllocHGlobal(stringLength); + result = FMOD_Studio_CommandReplay_GetCommandString(this.handle, commandIndex, stringMem, stringLength); + } + + if (result == RESULT.OK) + { + buffer = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getCommandAtTime(float time, out int commandIndex) + { + return FMOD_Studio_CommandReplay_GetCommandAtTime(this.handle, time, out commandIndex); + } + // Playback + public RESULT setBankPath(string bankPath) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_CommandReplay_SetBankPath(this.handle, encoder.byteFromStringUTF8(bankPath)); + } + } + public RESULT start() + { + return FMOD_Studio_CommandReplay_Start(this.handle); + } + public RESULT stop() + { + return FMOD_Studio_CommandReplay_Stop(this.handle); + } + public RESULT seekToTime(float time) + { + return FMOD_Studio_CommandReplay_SeekToTime(this.handle, time); + } + public RESULT seekToCommand(int commandIndex) + { + return FMOD_Studio_CommandReplay_SeekToCommand(this.handle, commandIndex); + } + public RESULT getPaused(out bool paused) + { + return FMOD_Studio_CommandReplay_GetPaused(this.handle, out paused); + } + public RESULT setPaused(bool paused) + { + return FMOD_Studio_CommandReplay_SetPaused(this.handle, paused); + } + public RESULT getPlaybackState(out PLAYBACK_STATE state) + { + return FMOD_Studio_CommandReplay_GetPlaybackState(this.handle, out state); + } + public RESULT getCurrentCommand(out int commandIndex, out float currentTime) + { + return FMOD_Studio_CommandReplay_GetCurrentCommand(this.handle, out commandIndex, out currentTime); + } + // Release + public RESULT release() + { + return FMOD_Studio_CommandReplay_Release(this.handle); + } + // Callbacks + public RESULT setFrameCallback(COMMANDREPLAY_FRAME_CALLBACK callback) + { + return FMOD_Studio_CommandReplay_SetFrameCallback(this.handle, callback); + } + public RESULT setLoadBankCallback(COMMANDREPLAY_LOAD_BANK_CALLBACK callback) + { + return FMOD_Studio_CommandReplay_SetLoadBankCallback(this.handle, callback); + } + public RESULT setCreateInstanceCallback(COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback) + { + return FMOD_Studio_CommandReplay_SetCreateInstanceCallback(this.handle, callback); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_CommandReplay_GetUserData(this.handle, out userdata); + } + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_CommandReplay_SetUserData(this.handle, userdata); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_CommandReplay_IsValid (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetSystem (IntPtr replay, out IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetLength (IntPtr replay, out float length); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandCount (IntPtr replay, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandInfo (IntPtr replay, int commandindex, out COMMAND_INFO info); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandString (IntPtr replay, int commandIndex, IntPtr buffer, int length); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandAtTime (IntPtr replay, float time, out int commandIndex); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetBankPath (IntPtr replay, byte[] bankPath); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_Start (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_Stop (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SeekToTime (IntPtr replay, float time); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SeekToCommand (IntPtr replay, int commandIndex); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetPaused (IntPtr replay, out bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetPaused (IntPtr replay, bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetPlaybackState (IntPtr replay, out PLAYBACK_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCurrentCommand (IntPtr replay, out int commandIndex, out float currentTime); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_Release (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetFrameCallback (IntPtr replay, COMMANDREPLAY_FRAME_CALLBACK callback); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetLoadBankCallback (IntPtr replay, COMMANDREPLAY_LOAD_BANK_CALLBACK callback); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetCreateInstanceCallback(IntPtr replay, COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetUserData (IntPtr replay, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetUserData (IntPtr replay, IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public CommandReplay(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_CommandReplay_IsValid(this.handle); + } + + #endregion + } +} // FMOD diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.h b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.h new file mode 100644 index 0000000..bcad31a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.h @@ -0,0 +1,249 @@ +/* ======================================================================================== */ +/* FMOD Studio API - C header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header in conjunction with fmod_studio_common.h (which contains all the */ +/* constants / callbacks) to develop using the C language. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/studio-api.html */ +/* ======================================================================================== */ +#ifndef FMOD_STUDIO_H +#define FMOD_STUDIO_H + +#include "fmod_studio_common.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + Global +*/ +FMOD_RESULT F_API FMOD_Studio_ParseID(const char *idstring, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_System_Create(FMOD_STUDIO_SYSTEM **system, unsigned int headerversion); + +/* + System +*/ +FMOD_BOOL F_API FMOD_Studio_System_IsValid(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_SetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_Studio_System_GetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_Studio_System_Initialize(FMOD_STUDIO_SYSTEM *system, int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata); +FMOD_RESULT F_API FMOD_Studio_System_Release(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_Update(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_GetCoreSystem(FMOD_STUDIO_SYSTEM *system, FMOD_SYSTEM **coresystem); +FMOD_RESULT F_API FMOD_Studio_System_GetEvent(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_EVENTDESCRIPTION **event); +FMOD_RESULT F_API FMOD_Studio_System_GetBus(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BUS **bus); +FMOD_RESULT F_API FMOD_Studio_System_GetVCA(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_VCA **vca); +FMOD_RESULT F_API FMOD_Studio_System_GetBank(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_GetEventByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_EVENTDESCRIPTION **event); +FMOD_RESULT F_API FMOD_Studio_System_GetBusByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BUS **bus); +FMOD_RESULT F_API FMOD_Studio_System_GetVCAByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_VCA **vca); +FMOD_RESULT F_API FMOD_Studio_System_GetBankByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_GetSoundInfo(FMOD_STUDIO_SYSTEM *system, const char *key, FMOD_STUDIO_SOUND_INFO *info); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByName(FMOD_STUDIO_SYSTEM *system, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByName(FMOD_STUDIO_SYSTEM *system, const char *name, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByIDWithLabel(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_SetParametersByIDs(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByNameWithLabel(FMOD_STUDIO_SYSTEM *system, const char *name, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_LookupID(FMOD_STUDIO_SYSTEM *system, const char *path, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_System_LookupPath(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_System_GetNumListeners(FMOD_STUDIO_SYSTEM *system, int *numlisteners); +FMOD_RESULT F_API FMOD_Studio_System_SetNumListeners(FMOD_STUDIO_SYSTEM *system, int numlisteners); +FMOD_RESULT F_API FMOD_Studio_System_GetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition); +FMOD_RESULT F_API FMOD_Studio_System_SetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition); +FMOD_RESULT F_API FMOD_Studio_System_GetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float *weight); +FMOD_RESULT F_API FMOD_Studio_System_SetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float weight); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankFile(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankMemory(FMOD_STUDIO_SYSTEM *system, const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankCustom(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_RegisterPlugin(FMOD_STUDIO_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description); +FMOD_RESULT F_API FMOD_Studio_System_UnregisterPlugin(FMOD_STUDIO_SYSTEM *system, const char *name); +FMOD_RESULT F_API FMOD_Studio_System_UnloadAll(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_FlushCommands(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_FlushSampleLoading(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_StartCommandCapture(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags); +FMOD_RESULT F_API FMOD_Studio_System_StopCommandCapture(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_LoadCommandReplay(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, FMOD_STUDIO_COMMANDREPLAY **replay); +FMOD_RESULT F_API FMOD_Studio_System_GetBankCount(FMOD_STUDIO_SYSTEM *system, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetBankList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BANK **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionCount(FMOD_STUDIO_SYSTEM *system, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetCPUUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core); +FMOD_RESULT F_API FMOD_Studio_System_GetBufferUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BUFFER_USAGE *usage); +FMOD_RESULT F_API FMOD_Studio_System_ResetBufferUsage(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_SetCallback(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_System_SetUserData(FMOD_STUDIO_SYSTEM *system, void *userdata); +FMOD_RESULT F_API FMOD_Studio_System_GetUserData(FMOD_STUDIO_SYSTEM *system, void **userdata); +FMOD_RESULT F_API FMOD_Studio_System_GetMemoryUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_MEMORY_USAGE *memoryusage); + +/* + EventDescription +*/ +FMOD_BOOL F_API FMOD_Studio_EventDescription_IsValid(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetPath(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_USER_PROPERTY *property); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserProperty(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_USER_PROPERTY *property); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetLength(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *length); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetMinMaxDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *min, float *max); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSoundSize(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *size); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsSnapshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *snapshot); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsOneshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *oneshot); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsStream(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *isStream); +FMOD_RESULT F_API FMOD_Studio_EventDescription_Is3D(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *is3D); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsDopplerEnabled(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *doppler); +FMOD_RESULT F_API FMOD_Studio_EventDescription_HasSustainPoint(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *sustainPoint); +FMOD_RESULT F_API FMOD_Studio_EventDescription_CreateInstance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceList(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_LoadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_UnloadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSampleLoadingState(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_EventDescription_ReleaseAllInstances(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_SetCallback(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void **userdata); +FMOD_RESULT F_API FMOD_Studio_EventDescription_SetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void *userdata); + +/* + EventInstance +*/ +FMOD_BOOL F_API FMOD_Studio_EventInstance_IsValid(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetDescription(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENTDESCRIPTION **description); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetSystem(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_SYSTEM **system); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *volume, float *finalvolume); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float volume); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *pitch, float *finalpitch); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float pitch); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Get3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Set3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *mask); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int mask); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float *value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float *level); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float level); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Start(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Stop(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_STOP_MODE mode); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *position); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int position); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPlaybackState(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PLAYBACK_STATE *state); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetChannelGroup(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMinMaxDistance(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *min, float *max); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Release(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_IsVirtual(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *virtualstate); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByNameWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByIDWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParametersByIDs(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_KeyOff(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetCallback(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void **userdata); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void *userdata); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetCPUUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *exclusive, unsigned int *inclusive); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMemoryUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_MEMORY_USAGE *memoryusage); + +/* + Bus +*/ +FMOD_BOOL F_API FMOD_Studio_Bus_IsValid(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_GetID(FMOD_STUDIO_BUS *bus, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPath(FMOD_STUDIO_BUS *bus, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bus_GetVolume(FMOD_STUDIO_BUS *bus, float *volume, float *finalvolume); +FMOD_RESULT F_API FMOD_Studio_Bus_SetVolume(FMOD_STUDIO_BUS *bus, float volume); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_Bus_SetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_Bus_GetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_Studio_Bus_SetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_Studio_Bus_StopAllEvents(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_STOP_MODE mode); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX *index); +FMOD_RESULT F_API FMOD_Studio_Bus_SetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX index); +FMOD_RESULT F_API FMOD_Studio_Bus_LockChannelGroup(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_UnlockChannelGroup(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_GetChannelGroup(FMOD_STUDIO_BUS *bus, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_Studio_Bus_GetCPUUsage(FMOD_STUDIO_BUS *bus, unsigned int *exclusive, unsigned int *inclusive); +FMOD_RESULT F_API FMOD_Studio_Bus_GetMemoryUsage(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_MEMORY_USAGE *memoryusage); + +/* + VCA +*/ +FMOD_BOOL F_API FMOD_Studio_VCA_IsValid(FMOD_STUDIO_VCA *vca); +FMOD_RESULT F_API FMOD_Studio_VCA_GetID(FMOD_STUDIO_VCA *vca, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_VCA_GetPath(FMOD_STUDIO_VCA *vca, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_VCA_GetVolume(FMOD_STUDIO_VCA *vca, float *volume, float *finalvolume); +FMOD_RESULT F_API FMOD_Studio_VCA_SetVolume(FMOD_STUDIO_VCA *vca, float volume); + +/* + Bank +*/ +FMOD_BOOL F_API FMOD_Studio_Bank_IsValid(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_GetID(FMOD_STUDIO_BANK *bank, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_Bank_GetPath(FMOD_STUDIO_BANK *bank, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bank_Unload(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_LoadSampleData(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_UnloadSampleData(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_GetLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_Bank_GetSampleLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_Bank_GetStringCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetStringInfo(FMOD_STUDIO_BANK *bank, int index, FMOD_GUID *id, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bank_GetEventCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetEventList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_EVENTDESCRIPTION **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetBusCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetBusList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_BUS **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetVCACount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetVCAList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_VCA **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetUserData(FMOD_STUDIO_BANK *bank, void **userdata); +FMOD_RESULT F_API FMOD_Studio_Bank_SetUserData(FMOD_STUDIO_BANK *bank, void *userdata); + +/* + Command playback information +*/ +FMOD_BOOL F_API FMOD_Studio_CommandReplay_IsValid(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetSystem(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_SYSTEM **system); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetLength(FMOD_STUDIO_COMMANDREPLAY *replay, float *length); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandCount(FMOD_STUDIO_COMMANDREPLAY *replay, int *count); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandInfo(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_COMMAND_INFO *info); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandString(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, char *buffer, int length); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandAtTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time, int *commandindex); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetBankPath(FMOD_STUDIO_COMMANDREPLAY *replay, const char *bankPath); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Start(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Stop(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPlaybackState(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_PLAYBACK_STATE *state); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCurrentCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int *commandindex, float *currenttime); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Release(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetFrameCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void **userdata); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void *userdata); + +#ifdef __cplusplus +} +#endif + +#endif /* FMOD_STUDIO_H */ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.hpp b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.hpp new file mode 100644 index 0000000..acc15c4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio.hpp @@ -0,0 +1,403 @@ +/* ======================================================================================== */ +/* FMOD Studio API - C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* Use this header in conjunction with fmod_studio_common.h (which contains all the */ +/* constants / callbacks) to develop using the C++ language. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/studio-api.html */ +/* ======================================================================================== */ +#ifndef FMOD_STUDIO_HPP +#define FMOD_STUDIO_HPP + +#include "fmod_studio_common.h" +#include "fmod_studio.h" + +#include "fmod.hpp" + +namespace FMOD +{ + +namespace Studio +{ + typedef FMOD_GUID ID; // Deprecated. Please use FMOD_GUID type. + + class System; + class EventDescription; + class EventInstance; + class Bus; + class VCA; + class Bank; + class CommandReplay; + + inline FMOD_RESULT parseID(const char *idstring, FMOD_GUID *id) { return FMOD_Studio_ParseID(idstring, id); } + + class System + { + private: + // Constructor made private so user cannot statically instance a System class. System::create must be used. + System(); + System(const System &); + + public: + static FMOD_RESULT F_API create(System **system, unsigned int headerversion = FMOD_VERSION); + FMOD_RESULT F_API setAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API getAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API initialize(int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata); + FMOD_RESULT F_API release(); + + // Handle validity + bool F_API isValid() const; + + // Update processing + FMOD_RESULT F_API update(); + FMOD_RESULT F_API flushCommands(); + FMOD_RESULT F_API flushSampleLoading(); + + // Low-level API access + FMOD_RESULT F_API getCoreSystem(FMOD::System **system) const; + + // Asset retrieval + FMOD_RESULT F_API getEvent(const char *path, EventDescription **event) const; + FMOD_RESULT F_API getBus(const char *path, Bus **bus) const; + FMOD_RESULT F_API getVCA(const char *path, VCA **vca) const; + FMOD_RESULT F_API getBank(const char *path, Bank **bank) const; + FMOD_RESULT F_API getEventByID(const FMOD_GUID *id, EventDescription **event) const; + FMOD_RESULT F_API getBusByID(const FMOD_GUID *id, Bus **bus) const; + FMOD_RESULT F_API getVCAByID(const FMOD_GUID *id, VCA **vca) const; + FMOD_RESULT F_API getBankByID(const FMOD_GUID *id, Bank **bank) const; + FMOD_RESULT F_API getSoundInfo(const char *key, FMOD_STUDIO_SOUND_INFO *info) const; + FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const; + + // Global parameter control + FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char *label, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false); + FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char *label, bool ignoreseekspeed = false); + + // Path lookup + FMOD_RESULT F_API lookupID(const char *path, FMOD_GUID *id) const; + FMOD_RESULT F_API lookupPath(const FMOD_GUID *id, char *path, int size, int *retrieved) const; + + // Listener control + FMOD_RESULT F_API getNumListeners(int *numlisteners); + FMOD_RESULT F_API setNumListeners(int numlisteners); + FMOD_RESULT F_API getListenerAttributes(int listener, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition = 0) const; + FMOD_RESULT F_API setListenerAttributes(int listener, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition = 0); + FMOD_RESULT F_API getListenerWeight(int listener, float *weight); + FMOD_RESULT F_API setListenerWeight(int listener, float weight); + + // Bank control + FMOD_RESULT F_API loadBankFile(const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API loadBankMemory(const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API loadBankCustom(const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API unloadAll(); + + // General functionality + FMOD_RESULT F_API getBufferUsage(FMOD_STUDIO_BUFFER_USAGE *usage) const; + FMOD_RESULT F_API resetBufferUsage(); + FMOD_RESULT F_API registerPlugin(const FMOD_DSP_DESCRIPTION *description); + FMOD_RESULT F_API unregisterPlugin(const char *name); + + // Enumeration + FMOD_RESULT F_API getBankCount(int *count) const; + FMOD_RESULT F_API getBankList(Bank **array, int capacity, int *count) const; + FMOD_RESULT F_API getParameterDescriptionCount(int *count) const; + FMOD_RESULT F_API getParameterDescriptionList(FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count) const; + + // Command capture and replay + FMOD_RESULT F_API startCommandCapture(const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags); + FMOD_RESULT F_API stopCommandCapture(); + FMOD_RESULT F_API loadCommandReplay(const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, CommandReplay **replay); + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_STUDIO_SYSTEM_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + + // Monitoring + FMOD_RESULT F_API getCPUUsage(FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core) const; + FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const; + }; + + class EventDescription + { + private: + // Constructor made private so user cannot statically instance the class. + EventDescription(); + EventDescription(const EventDescription &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterDescriptionCount(int *count) const; + FMOD_RESULT F_API getParameterDescriptionByIndex(int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterLabelByIndex(int index, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getUserPropertyCount(int *count) const; + FMOD_RESULT F_API getUserPropertyByIndex(int index, FMOD_STUDIO_USER_PROPERTY *property) const; + FMOD_RESULT F_API getUserProperty(const char *name, FMOD_STUDIO_USER_PROPERTY *property) const; + FMOD_RESULT F_API getLength(int *length) const; + FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const; + FMOD_RESULT F_API getSoundSize(float *size) const; + + FMOD_RESULT F_API isSnapshot(bool *snapshot) const; + FMOD_RESULT F_API isOneshot(bool *oneshot) const; + FMOD_RESULT F_API isStream(bool *isStream) const; + FMOD_RESULT F_API is3D(bool *is3d) const; + FMOD_RESULT F_API isDopplerEnabled(bool *doppler) const; + FMOD_RESULT F_API hasSustainPoint(bool *sustainPoint) const; + + // Playback control + FMOD_RESULT F_API createInstance(EventInstance **instance) const; + FMOD_RESULT F_API getInstanceCount(int *count) const; + FMOD_RESULT F_API getInstanceList(EventInstance **array, int capacity, int *count) const; + + // Sample data loading control + FMOD_RESULT F_API loadSampleData(); + FMOD_RESULT F_API unloadSampleData(); + FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + + // Convenience functions + FMOD_RESULT F_API releaseAllInstances(); + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + + class EventInstance + { + private: + // Constructor made private so user cannot statically instance the class. + EventInstance(); + EventInstance(const EventInstance &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getDescription(EventDescription **description) const; + FMOD_RESULT F_API getSystem(System **system) const; + + // Playback control + FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const; + FMOD_RESULT F_API setVolume(float volume); + + FMOD_RESULT F_API getPitch(float *pitch, float *finalpitch = 0) const; + FMOD_RESULT F_API setPitch(float pitch); + + FMOD_RESULT F_API get3DAttributes(FMOD_3D_ATTRIBUTES *attributes) const; + FMOD_RESULT F_API set3DAttributes(const FMOD_3D_ATTRIBUTES *attributes); + + FMOD_RESULT F_API getListenerMask(unsigned int *mask) const; + FMOD_RESULT F_API setListenerMask(unsigned int mask); + + FMOD_RESULT F_API getProperty(FMOD_STUDIO_EVENT_PROPERTY index, float *value) const; + FMOD_RESULT F_API setProperty(FMOD_STUDIO_EVENT_PROPERTY index, float value); + + FMOD_RESULT F_API getReverbLevel(int index, float *level) const; + FMOD_RESULT F_API setReverbLevel(int index, float level); + + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + + FMOD_RESULT F_API start(); + FMOD_RESULT F_API stop(FMOD_STUDIO_STOP_MODE mode); + + FMOD_RESULT F_API getTimelinePosition(int *position) const; + FMOD_RESULT F_API setTimelinePosition(int position); + + FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const; + + FMOD_RESULT F_API getChannelGroup(ChannelGroup **group) const; + + FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const; + + FMOD_RESULT F_API release(); + + FMOD_RESULT F_API isVirtual(bool *virtualstate) const; + + FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char* label, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false); + + FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char* label, bool ignoreseekspeed = false); + + FMOD_RESULT F_API keyOff(); + + // Monitoring + FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const; + FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const; + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + + class Bus + { + private: + // Constructor made private so user cannot statically instance the class. + Bus(); + Bus(const Bus &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Playback control + FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const; + FMOD_RESULT F_API setVolume(float volume); + + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + + FMOD_RESULT F_API getMute(bool *mute) const; + FMOD_RESULT F_API setMute(bool mute); + + FMOD_RESULT F_API stopAllEvents(FMOD_STUDIO_STOP_MODE mode); + + // Output port + FMOD_RESULT F_API getPortIndex(FMOD_PORT_INDEX *index) const; + FMOD_RESULT F_API setPortIndex(FMOD_PORT_INDEX index); + + // Low-level API access + FMOD_RESULT F_API lockChannelGroup(); + FMOD_RESULT F_API unlockChannelGroup(); + FMOD_RESULT F_API getChannelGroup(FMOD::ChannelGroup **group) const; + + // Monitoring + FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const; + FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const; + }; + + class VCA + { + private: + // Constructor made private so user cannot statically instance the class. + VCA(); + VCA(const VCA &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Playback control + FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const; + FMOD_RESULT F_API setVolume(float volume); + }; + + class Bank + { + private: + // Constructor made private so user cannot statically instance the class. + Bank(); + Bank(const Bank &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Loading control + FMOD_RESULT F_API unload(); + FMOD_RESULT F_API loadSampleData(); + FMOD_RESULT F_API unloadSampleData(); + + FMOD_RESULT F_API getLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + + // Enumeration + FMOD_RESULT F_API getStringCount(int *count) const; + FMOD_RESULT F_API getStringInfo(int index, FMOD_GUID *id, char *path, int size, int *retrieved) const; + FMOD_RESULT F_API getEventCount(int *count) const; + FMOD_RESULT F_API getEventList(EventDescription **array, int capacity, int *count) const; + FMOD_RESULT F_API getBusCount(int *count) const; + FMOD_RESULT F_API getBusList(Bus **array, int capacity, int *count) const; + FMOD_RESULT F_API getVCACount(int *count) const; + FMOD_RESULT F_API getVCAList(VCA **array, int capacity, int *count) const; + + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + + class CommandReplay + { + private: + // Constructor made private so user cannot statically instance the class. + CommandReplay(); + CommandReplay(const CommandReplay &); + + public: + // Handle validity + bool F_API isValid() const; + + // Information query + FMOD_RESULT F_API getSystem(System **system) const; + FMOD_RESULT F_API getLength(float *length) const; + + FMOD_RESULT F_API getCommandCount(int *count) const; + FMOD_RESULT F_API getCommandInfo(int commandindex, FMOD_STUDIO_COMMAND_INFO *info) const; + FMOD_RESULT F_API getCommandString(int commandindex, char *buffer, int length) const; + FMOD_RESULT F_API getCommandAtTime(float time, int *commandindex) const; + + // Playback + FMOD_RESULT F_API setBankPath(const char *bankPath); + FMOD_RESULT F_API start(); + FMOD_RESULT F_API stop(); + FMOD_RESULT F_API seekToTime(float time); + FMOD_RESULT F_API seekToCommand(int commandindex); + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const; + FMOD_RESULT F_API getCurrentCommand(int *commandindex, float *currenttime) const; + + // Release + FMOD_RESULT F_API release(); + + // Callbacks + FMOD_RESULT F_API setFrameCallback(FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback); + FMOD_RESULT F_API setLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback); + FMOD_RESULT F_API setCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); + + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + +} // namespace Studio + +} // namespace FMOD + +#endif //FMOD_STUDIO_HPP diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio_common.h b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio_common.h new file mode 100644 index 0000000..489c723 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/inc/fmod_studio_common.h @@ -0,0 +1,336 @@ +/* ======================================================================================== */ +/* FMOD Studio API - Common C/C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ +/* */ +/* This header defines common enumerations, structs and callbacks that are shared between */ +/* the C and C++ interfaces. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.03/api/studio-api.html */ +/* ======================================================================================== */ +#ifndef FMOD_STUDIO_COMMON_H +#define FMOD_STUDIO_COMMON_H + +#include "fmod.h" + +/* + FMOD Studio types. +*/ +typedef struct FMOD_STUDIO_SYSTEM FMOD_STUDIO_SYSTEM; +typedef struct FMOD_STUDIO_EVENTDESCRIPTION FMOD_STUDIO_EVENTDESCRIPTION; +typedef struct FMOD_STUDIO_EVENTINSTANCE FMOD_STUDIO_EVENTINSTANCE; +typedef struct FMOD_STUDIO_BUS FMOD_STUDIO_BUS; +typedef struct FMOD_STUDIO_VCA FMOD_STUDIO_VCA; +typedef struct FMOD_STUDIO_BANK FMOD_STUDIO_BANK; +typedef struct FMOD_STUDIO_COMMANDREPLAY FMOD_STUDIO_COMMANDREPLAY; + +/* + FMOD Studio constants +*/ +#define FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT 32 + +typedef unsigned int FMOD_STUDIO_INITFLAGS; +#define FMOD_STUDIO_INIT_NORMAL 0x00000000 +#define FMOD_STUDIO_INIT_LIVEUPDATE 0x00000001 +#define FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS 0x00000002 +#define FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE 0x00000004 +#define FMOD_STUDIO_INIT_DEFERRED_CALLBACKS 0x00000008 +#define FMOD_STUDIO_INIT_LOAD_FROM_UPDATE 0x00000010 +#define FMOD_STUDIO_INIT_MEMORY_TRACKING 0x00000020 + +typedef unsigned int FMOD_STUDIO_PARAMETER_FLAGS; +#define FMOD_STUDIO_PARAMETER_READONLY 0x00000001 +#define FMOD_STUDIO_PARAMETER_AUTOMATIC 0x00000002 +#define FMOD_STUDIO_PARAMETER_GLOBAL 0x00000004 +#define FMOD_STUDIO_PARAMETER_DISCRETE 0x00000008 +#define FMOD_STUDIO_PARAMETER_LABELED 0x00000010 + +typedef unsigned int FMOD_STUDIO_SYSTEM_CALLBACK_TYPE; +#define FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE 0x00000001 +#define FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE 0x00000002 +#define FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD 0x00000004 +#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED 0x00000008 +#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED 0x00000010 +#define FMOD_STUDIO_SYSTEM_CALLBACK_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_STUDIO_EVENT_CALLBACK_TYPE; +#define FMOD_STUDIO_EVENT_CALLBACK_CREATED 0x00000001 +#define FMOD_STUDIO_EVENT_CALLBACK_DESTROYED 0x00000002 +#define FMOD_STUDIO_EVENT_CALLBACK_STARTING 0x00000004 +#define FMOD_STUDIO_EVENT_CALLBACK_STARTED 0x00000008 +#define FMOD_STUDIO_EVENT_CALLBACK_RESTARTED 0x00000010 +#define FMOD_STUDIO_EVENT_CALLBACK_STOPPED 0x00000020 +#define FMOD_STUDIO_EVENT_CALLBACK_START_FAILED 0x00000040 +#define FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND 0x00000080 +#define FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000100 +#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED 0x00000200 +#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED 0x00000400 +#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER 0x00000800 +#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT 0x00001000 +#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED 0x00002000 +#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED 0x00004000 +#define FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL 0x00008000 +#define FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL 0x00010000 +#define FMOD_STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND 0x00020000 +#define FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT 0x00040000 +#define FMOD_STUDIO_EVENT_CALLBACK_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_STUDIO_LOAD_BANK_FLAGS; +#define FMOD_STUDIO_LOAD_BANK_NORMAL 0x00000000 +#define FMOD_STUDIO_LOAD_BANK_NONBLOCKING 0x00000001 +#define FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES 0x00000002 +#define FMOD_STUDIO_LOAD_BANK_UNENCRYPTED 0x00000004 + +typedef unsigned int FMOD_STUDIO_COMMANDCAPTURE_FLAGS; +#define FMOD_STUDIO_COMMANDCAPTURE_NORMAL 0x00000000 +#define FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH 0x00000001 +#define FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE 0x00000002 + +typedef unsigned int FMOD_STUDIO_COMMANDREPLAY_FLAGS; +#define FMOD_STUDIO_COMMANDREPLAY_NORMAL 0x00000000 +#define FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP 0x00000001 +#define FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD 0x00000002 +#define FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD 0x00000004 + +typedef enum FMOD_STUDIO_LOADING_STATE +{ + FMOD_STUDIO_LOADING_STATE_UNLOADING, + FMOD_STUDIO_LOADING_STATE_UNLOADED, + FMOD_STUDIO_LOADING_STATE_LOADING, + FMOD_STUDIO_LOADING_STATE_LOADED, + FMOD_STUDIO_LOADING_STATE_ERROR, + + FMOD_STUDIO_LOADING_STATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_LOADING_STATE; + +typedef enum FMOD_STUDIO_LOAD_MEMORY_MODE +{ + FMOD_STUDIO_LOAD_MEMORY, + FMOD_STUDIO_LOAD_MEMORY_POINT, + + FMOD_STUDIO_LOAD_MEMORY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_LOAD_MEMORY_MODE; + +typedef enum FMOD_STUDIO_PARAMETER_TYPE +{ + FMOD_STUDIO_PARAMETER_GAME_CONTROLLED, + FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE, + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE, + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED, + FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE, + FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED, + + FMOD_STUDIO_PARAMETER_MAX, + FMOD_STUDIO_PARAMETER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_PARAMETER_TYPE; + +typedef enum FMOD_STUDIO_USER_PROPERTY_TYPE +{ + FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER, + FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN, + FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT, + FMOD_STUDIO_USER_PROPERTY_TYPE_STRING, + + FMOD_STUDIO_USER_PROPERTY_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_USER_PROPERTY_TYPE; + +typedef enum FMOD_STUDIO_EVENT_PROPERTY +{ + FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY, + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY, + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD, + FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE, + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE, + FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN, + FMOD_STUDIO_EVENT_PROPERTY_MAX, + + FMOD_STUDIO_EVENT_PROPERTY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_EVENT_PROPERTY; + +typedef enum FMOD_STUDIO_PLAYBACK_STATE +{ + FMOD_STUDIO_PLAYBACK_PLAYING, + FMOD_STUDIO_PLAYBACK_SUSTAINING, + FMOD_STUDIO_PLAYBACK_STOPPED, + FMOD_STUDIO_PLAYBACK_STARTING, + FMOD_STUDIO_PLAYBACK_STOPPING, + + FMOD_STUDIO_PLAYBACK_FORCEINT = 65536 +} FMOD_STUDIO_PLAYBACK_STATE; + +typedef enum FMOD_STUDIO_STOP_MODE +{ + FMOD_STUDIO_STOP_ALLOWFADEOUT, + FMOD_STUDIO_STOP_IMMEDIATE, + + FMOD_STUDIO_STOP_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_STOP_MODE; + +typedef enum FMOD_STUDIO_INSTANCETYPE +{ + FMOD_STUDIO_INSTANCETYPE_NONE, + FMOD_STUDIO_INSTANCETYPE_SYSTEM, + FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION, + FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE, + FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE, + FMOD_STUDIO_INSTANCETYPE_BUS, + FMOD_STUDIO_INSTANCETYPE_VCA, + FMOD_STUDIO_INSTANCETYPE_BANK, + FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY, + + FMOD_STUDIO_INSTANCETYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_INSTANCETYPE; + +/* + FMOD Studio structures +*/ +typedef struct FMOD_STUDIO_BANK_INFO +{ + int size; + void *userdata; + int userdatalength; + FMOD_FILE_OPEN_CALLBACK opencallback; + FMOD_FILE_CLOSE_CALLBACK closecallback; + FMOD_FILE_READ_CALLBACK readcallback; + FMOD_FILE_SEEK_CALLBACK seekcallback; +} FMOD_STUDIO_BANK_INFO; + +typedef struct FMOD_STUDIO_PARAMETER_ID +{ + unsigned int data1; + unsigned int data2; +} FMOD_STUDIO_PARAMETER_ID; + +typedef struct FMOD_STUDIO_PARAMETER_DESCRIPTION +{ + const char *name; + FMOD_STUDIO_PARAMETER_ID id; + float minimum; + float maximum; + float defaultvalue; + FMOD_STUDIO_PARAMETER_TYPE type; + FMOD_STUDIO_PARAMETER_FLAGS flags; + FMOD_GUID guid; +} FMOD_STUDIO_PARAMETER_DESCRIPTION; + +typedef struct FMOD_STUDIO_USER_PROPERTY +{ + const char *name; + FMOD_STUDIO_USER_PROPERTY_TYPE type; + + union + { + int intvalue; + FMOD_BOOL boolvalue; + float floatvalue; + const char *stringvalue; + }; +} FMOD_STUDIO_USER_PROPERTY; + +typedef struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES +{ + const char *name; + FMOD_SOUND *sound; + int subsoundIndex; +} FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES; + +typedef struct FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES +{ + const char *name; + FMOD_DSP *dsp; +} FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES; + +typedef struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES +{ + const char *name; + int position; +} FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES; + +typedef struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES +{ + int bar; + int beat; + int position; + float tempo; + int timesignatureupper; + int timesignaturelower; +} FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES; + +typedef struct FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES +{ + FMOD_GUID eventid; + FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES properties; +} FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES; + +typedef struct FMOD_STUDIO_ADVANCEDSETTINGS +{ + int cbsize; + unsigned int commandqueuesize; + unsigned int handleinitialsize; + int studioupdateperiod; + int idlesampledatapoolsize; + unsigned int streamingscheduledelay; + const char* encryptionkey; +} FMOD_STUDIO_ADVANCEDSETTINGS; + +typedef struct FMOD_STUDIO_CPU_USAGE +{ + float update; +} FMOD_STUDIO_CPU_USAGE; + +typedef struct FMOD_STUDIO_BUFFER_INFO +{ + int currentusage; + int peakusage; + int capacity; + int stallcount; + float stalltime; +} FMOD_STUDIO_BUFFER_INFO; + +typedef struct FMOD_STUDIO_BUFFER_USAGE +{ + FMOD_STUDIO_BUFFER_INFO studiocommandqueue; + FMOD_STUDIO_BUFFER_INFO studiohandle; +} FMOD_STUDIO_BUFFER_USAGE; + +typedef struct FMOD_STUDIO_SOUND_INFO +{ + const char *name_or_data; + FMOD_MODE mode; + FMOD_CREATESOUNDEXINFO exinfo; + int subsoundindex; +} FMOD_STUDIO_SOUND_INFO; + +typedef struct FMOD_STUDIO_COMMAND_INFO +{ + const char *commandname; + int parentcommandindex; + int framenumber; + float frametime; + FMOD_STUDIO_INSTANCETYPE instancetype; + FMOD_STUDIO_INSTANCETYPE outputtype; + unsigned int instancehandle; + unsigned int outputhandle; +} FMOD_STUDIO_COMMAND_INFO; + +typedef struct FMOD_STUDIO_MEMORY_USAGE +{ + int exclusive; + int inclusive; + int sampledata; +} FMOD_STUDIO_MEMORY_USAGE; + +/* + FMOD Studio callbacks. +*/ +typedef FMOD_RESULT (F_CALL *FMOD_STUDIO_SYSTEM_CALLBACK) (FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void *commanddata, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_STUDIO_EVENT_CALLBACK) (FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters); +typedef FMOD_RESULT (F_CALL *FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, float currenttime, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, const FMOD_GUID *bankguid, const char *bankfilename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance, void *userdata); + +#endif // FMOD_STUDIO_COMMON_H diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudio.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudio.so.14 new file mode 120000 index 0000000..872f24a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudio.so.14 @@ -0,0 +1 @@ +libfmodstudio.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudio.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudio.so.14.7 new file mode 100755 index 0000000..3e237db Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudio.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudioL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudioL.so.14 new file mode 120000 index 0000000..ccabde9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudioL.so.14 @@ -0,0 +1 @@ +libfmodstudioL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudioL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudioL.so.14.7 new file mode 100755 index 0000000..31206a0 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm/libfmodstudioL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudio.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudio.so.14 new file mode 120000 index 0000000..872f24a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudio.so.14 @@ -0,0 +1 @@ +libfmodstudio.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudio.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudio.so.14.7 new file mode 100755 index 0000000..849fc3e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudio.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudioL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudioL.so.14 new file mode 120000 index 0000000..ccabde9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudioL.so.14 @@ -0,0 +1 @@ +libfmodstudioL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudioL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudioL.so.14.7 new file mode 100755 index 0000000..40c78c6 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/arm64/libfmodstudioL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudio.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudio.so.14 new file mode 120000 index 0000000..872f24a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudio.so.14 @@ -0,0 +1 @@ +libfmodstudio.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudio.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudio.so.14.7 new file mode 100755 index 0000000..0cff173 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudio.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudioL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudioL.so.14 new file mode 120000 index 0000000..ccabde9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudioL.so.14 @@ -0,0 +1 @@ +libfmodstudioL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudioL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudioL.so.14.7 new file mode 100755 index 0000000..169d988 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86/libfmodstudioL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudio.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudio.so.14 new file mode 120000 index 0000000..872f24a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudio.so.14 @@ -0,0 +1 @@ +libfmodstudio.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudio.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudio.so.14.7 new file mode 100755 index 0000000..70c30df Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudio.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudioL.so.14 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudioL.so.14 new file mode 120000 index 0000000..ccabde9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudioL.so.14 @@ -0,0 +1 @@ +libfmodstudioL.so.14.7 \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudioL.so.14.7 b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudioL.so.14.7 new file mode 100755 index 0000000..66daa11 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/api/studio/lib/x86_64/libfmodstudioL.so.14.7 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/fmodprofiler b/SimpleGame/fmodstudioapi20307linux/bin/fmodprofiler new file mode 100755 index 0000000..02ed00e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/fmodprofiler differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/fsbank b/SimpleGame/fmodstudioapi20307linux/bin/fsbank new file mode 100755 index 0000000..d4ebca9 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/fsbank differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/fsbank_gui b/SimpleGame/fmodstudioapi20307linux/bin/fsbank_gui new file mode 100755 index 0000000..8b98bbb Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/fsbank_gui differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Core.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Core.so.6 new file mode 100644 index 0000000..1fc2f59 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Core.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6DBus.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6DBus.so.6 new file mode 100644 index 0000000..e200829 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6DBus.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Gui.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Gui.so.6 new file mode 100644 index 0000000..d8fd7c5 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Gui.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Network.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Network.so.6 new file mode 100644 index 0000000..4c487c9 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Network.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6OpenGL.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6OpenGL.so.6 new file mode 100644 index 0000000..0e32572 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6OpenGL.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Widgets.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Widgets.so.6 new file mode 100644 index 0000000..f56bcee Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Widgets.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6XcbQpa.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6XcbQpa.so.6 new file mode 100644 index 0000000..4ba2665 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6XcbQpa.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Xml.so.6 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Xml.so.6 new file mode 100644 index 0000000..de5ff5b Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libQt6Xml.so.6 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libfmodL.so.14 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libfmodL.so.14 new file mode 100644 index 0000000..6d93cef Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libfmodL.so.14 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libfsbankL.so.14 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libfsbankL.so.14 new file mode 100644 index 0000000..2b6419e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libfsbankL.so.14 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libicudata.so.56 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libicudata.so.56 new file mode 100644 index 0000000..4ada68b Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libicudata.so.56 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libicui18n.so.56 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libicui18n.so.56 new file mode 100644 index 0000000..fd8fa23 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libicui18n.so.56 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/lib/libicuuc.so.56 b/SimpleGame/fmodstudioapi20307linux/bin/lib/libicuuc.so.56 new file mode 100644 index 0000000..e5cbca7 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/bin/lib/libicuuc.so.56 differ diff --git a/SimpleGame/fmodstudioapi20307linux/bin/qt.conf b/SimpleGame/fmodstudioapi20307linux/bin/qt.conf new file mode 100644 index 0000000..fb1e282 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/bin/qt.conf @@ -0,0 +1,2 @@ +[Paths] +Plugins = Qt \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channel.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channel.html new file mode 100644 index 0000000..3a24a3a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channel.html @@ -0,0 +1,804 @@ + + +Core API Reference | Channel + + + + +
+ +
+

7. Core API Reference | Channel

+

A source of audio signal that connects to the ChannelGroup mixing hierarchy.

+

Create with System::playSound or System::playDSP.

+

Playback control:

+ +

Information:

+ +

The following APIs are inherited from ChannelControl:

+

Playback:

+ +

Volume levels:

+ +

Spatialization:

+ +

Panning and level adjustment:

+ +

Filtering:

+ +

DSP chain configuration:

+ +

Sample accurate scheduling:

+ +

General:

+ +

Channel::getChannelGroup

+

Retrieves the ChannelGroup this object outputs to.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getChannelGroup(
+  ChannelGroup **channelgroup
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetChannelGroup(
+  FMOD_CHANNEL *channel,
+  FMOD_CHANNELGROUP **channelgroup
+);
+
+ +
RESULT Channel.getChannelGroup(
+  out ChannelGroup channelgroup
+);
+
+ +
Channel.getChannelGroup(
+  channelgroup
+);
+
+ +
+
channelgroup Out
+
Output group. (ChannelGroup)
+
+

See Also: Channel::setChannelGroup

+

Channel::getCurrentSound

+

Retrieves the currently playing Sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getCurrentSound(
+  Sound **sound
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetCurrentSound(
+  FMOD_CHANNEL *channel,
+  FMOD_SOUND **sound
+);
+
+ +
RESULT Channel.getCurrentSound(
+  out Sound sound
+);
+
+ +
Channel.getCurrentSound(
+  sound
+);
+
+ +
+
sound Out
+
Currently playing sound. (Sound)
+
+

May return NULL or equivalent if no Sound is playing.

+

See Also: System::playSound

+

Channel::getFrequency

+

Retrieves the playback frequency or playback rate.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getFrequency(
+  float *frequency
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetFrequency(
+  FMOD_CHANNEL *channel,
+  float *frequency
+);
+
+ +
RESULT Channel.getFrequency(
+  out float frequency
+);
+
+ +
Channel.getFrequency(
+  frequency
+);
+
+ +
+
frequency Out
+
+

Playback frequency.

+
    +
  • Units: Hertz
  • +
+
+
+

See Also: Channel::setFrequency

+

Channel::getIndex

+

Retrieves the index of this object in the System Channel pool.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getIndex(
+  int *index
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetIndex(
+  FMOD_CHANNEL *channel,
+  int *index
+);
+
+ +
RESULT Channel.getIndex(
+  out int index
+);
+
+ +
Channel.getIndex(
+  index
+);
+
+ +
+
index Out
+
+

Index within the System Channel pool.

+ +
+
+

See Also: System::getChannel

+

Channel::getLoopCount

+

Retrieves the number of times to loop before stopping.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getLoopCount(
+  int *loopcount
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetLoopCount(
+  FMOD_CHANNEL *channel,
+  int *loopcount
+);
+
+ +
RESULT Channel.getLoopCount(
+  out int loopcount
+);
+
+ +
Channel.getLoopCount(
+  loopcount
+);
+
+ +
+
loopcount Out
+
Times to loop before stopping where 0 represents "oneshot", 1 represents "loop once then stop" and -1 represents "loop forever".
+
+

This is the current loop countdown value that will decrement as it plays until reaching 0. Reset with Channel::setLoopCount.

+

Channel::getLoopPoints

+

Retrieves the loop start and end points.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getLoopPoints(
+  unsigned int *loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int *loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetLoopPoints(
+  FMOD_CHANNEL *channel,
+  unsigned int *loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int *loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
RESULT Channel.getLoopPoints(
+  out uint loopstart,
+  TIMEUNIT loopstarttype,
+  out uint loopend,
+  TIMEUNIT loopendtype
+);
+
+ +
Channel.getLoopPoints(
+  loopstart,
+  loopstarttype,
+  loopend,
+  loopendtype
+);
+
+ +
+
loopstart OutOpt
+
+

Loop start point.

+ +
+
loopstarttype
+
Time units for loopstart. (FMOD_TIMEUNIT)
+
loopend OutOpt
+
+

Loop end point.

+ +
+
loopendtype
+
Time units for loopend. (FMOD_TIMEUNIT)
+
+

Valid FMOD_TIMEUNIT types are FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_MS, FMOD_TIMEUNIT_PCMBYTES. Any other time units return FMOD_ERR_FORMAT.
+If FMOD_TIMEUNIT_MS or FMOD_TIMEUNIT_PCMBYTES are used, the value is internally converted from FMOD_TIMEUNIT_PCM, so the retrieved value may not exactly match the set value.

+

See Also: Channel::setLoopPoints

+

Channel::getPosition

+

Retrieves the current playback position.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getPosition(
+  unsigned int *position,
+  FMOD_TIMEUNIT postype
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetPosition(
+  FMOD_CHANNEL *channel,
+  unsigned int *position,
+  FMOD_TIMEUNIT postype
+);
+
+ +
RESULT Channel.getPosition(
+  out uint position,
+  TIMEUNIT postype
+);
+
+ +
Channel.getPosition(
+  position,
+  postype
+);
+
+ +
+
position Out
+
Playback position.
+
postype
+
Time units for position. (FMOD_TIMEUNIT)
+
+

Certain FMOD_TIMEUNIT types are always available: FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_PCMBYTES and FMOD_TIMEUNIT_MS. The others are format specific such as FMOD_TIMEUNIT_MODORDER / FMOD_TIMEUNIT_MODROW / FMOD_TIMEUNIT_MODPATTERN which is specific to files of type MOD / S3M / XM / IT.

+

If FMOD_TIMEUNIT_MS or FMOD_TIMEUNIT_PCMBYTES are used, the value is internally converted from FMOD_TIMEUNIT_PCM, so the retrieved value may not exactly match the set value.

+

See Also: Channel::setPosition

+

Channel::getPriority

+

Retrieves the priority used for virtual voice ordering.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::getPriority(
+  int *priority
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetPriority(
+  FMOD_CHANNEL *channel,
+  int *priority
+);
+
+ +
RESULT Channel.getPriority(
+  out int priority
+);
+
+ +
Channel.getPriority(
+  priority
+);
+
+ +
+
priority Out
+
+

Priority where 0 represents most important and 256 represents least important.

+
    +
  • Range: [0, 256]
  • +
  • Default: 128
  • +
+
+
+

Priority is used as a coarse grain control for the virtual voice system, lower priority Channels will always be stolen before higher ones. For Channels of equal priority, those with the quietest ChannelControl::getAudibility value will be stolen first.

+

See the Virtual Voices guide for more information.

+

See Also: Channel::setPriority

+

Channel::isVirtual

+

Retrieves whether the Channel is being emulated by the virtual voice system.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::isVirtual(
+  bool *isvirtual
+);
+
+ +
FMOD_RESULT FMOD_Channel_IsVirtual(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL *isvirtual
+);
+
+ +
RESULT Channel.isVirtual(
+  out bool isvirtual
+);
+
+ +
Channel.isVirtual(
+  isvirtual
+);
+
+ +
+
isvirtual Out
+
+

Virtual state. True = silent / emulated. False = audible / real.

+
    +
  • Units: Boolean
  • +
+
+
+

See the Virtual Voices guide for more information.

+

See Also: ChannelControl::getAudibility

+

Channel::setChannelGroup

+

Sets the ChannelGroup this object outputs to.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::setChannelGroup(
+  ChannelGroup *channelgroup
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetChannelGroup(
+  FMOD_CHANNEL *channel,
+  FMOD_CHANNELGROUP *channelgroup
+);
+
+ +
RESULT Channel.setChannelGroup(
+  ChannelGroup channelgroup
+);
+
+ +
Channel.setChannelGroup(
+  channelgroup
+);
+
+ +
+
channelgroup
+
Output group. (ChannelGroup)
+
+

A ChannelGroup may contain many Channels.

+

Channels may only output to a single ChannelGroup. This operation will remove it from the previous group first.

+

See Also: Channel::getChannelGroup

+

Channel::setFrequency

+

Sets the frequency or playback rate.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::setFrequency(
+  float frequency
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetFrequency(
+  FMOD_CHANNEL *channel,
+  float frequency
+);
+
+ +
RESULT Channel.setFrequency(
+  float frequency
+);
+
+ +
Channel.setFrequency(
+  frequency
+);
+
+ +
+
frequency
+
+

Playback rate.

+
    +
  • Units: Hertz
  • +
+
+
+

Default frequency is determined by the audio format of the Sound or DSP.

+

Sounds opened as FMOD_CREATESAMPLE (not FMOD_CREATESTREAM or FMOD_CREATECOMPRESSEDSAMPLE) can be played backwards by giving a negative frequency.

+

See Also: Channel::getFrequency, Sound::setDefaults

+

Channel::setLoopCount

+

Sets the number of times to loop before stopping.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::setLoopCount(
+  int loopcount
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetLoopCount(
+  FMOD_CHANNEL *channel,
+  int loopcount
+);
+
+ +
RESULT Channel.setLoopCount(
+  int loopcount
+);
+
+ +
Channel.setLoopCount(
+  loopcount
+);
+
+ +
+
loopcount
+
Times to loop before stopping where 0 represents "oneshot", 1 represents "loop once then stop" and -1 represents "loop forever".
+
+

The 'mode' of the Sound or Channel must be FMOD_LOOP_NORMAL or FMOD_LOOP_BIDI for this function to work.

+

See Also: Streaming Issues, Channel::getLoopCount, ChannelControl::setMode, Sound::setMode, System::createSound

+

Channel::setLoopPoints

+

Sets the loop start and end points.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::setLoopPoints(
+  unsigned int loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetLoopPoints(
+  FMOD_CHANNEL *channel,
+  unsigned int loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
RESULT Channel.setLoopPoints(
+  uint loopstart,
+  TIMEUNIT loopstarttype,
+  uint loopend,
+  TIMEUNIT loopendtype
+);
+
+ +
Channel.setLoopPoints(
+  loopstart,
+  loopstarttype,
+  loopend,
+  loopendtype
+);
+
+ +
+
loopstart
+
+

Loop start point.

+ +
+
loopstarttype
+
Time units for loopstart. (FMOD_TIMEUNIT)
+
loopend
+
+

Loop end point.

+ +
+
loopendtype
+
Time units for loopend. (FMOD_TIMEUNIT)
+
+

Loop points may only be set on a Channel playing a Sound, not a Channel playing a DSP (See System::playDSP).

+

Valid FMOD_TIMEUNIT types are FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_MS, FMOD_TIMEUNIT_PCMBYTES. Any other time units return FMOD_ERR_FORMAT.
+If FMOD_TIMEUNIT_MS or FMOD_TIMEUNIT_PCMBYTES, the value is internally converted to FMOD_TIMEUNIT_PCM.

+

The Channel's mode must be set to FMOD_LOOP_NORMAL or FMOD_LOOP_BIDI for loop points to affect playback.

+

See Also: Streaming Issues, Channel::getLoopPoints, ChannelControl::setMode

+

Channel::setPosition

+

Sets the current playback position.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::setPosition(
+  unsigned int position,
+  FMOD_TIMEUNIT postype
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetPosition(
+  FMOD_CHANNEL *channel,
+  unsigned int position,
+  FMOD_TIMEUNIT postype
+);
+
+ +
RESULT Channel.setPosition(
+  uint position,
+  TIMEUNIT postype
+);
+
+ +
Channel.setPosition(
+  position,
+  postype
+);
+
+ +
+
position
+
Playback position.
+
postype
+
Time units for position. (FMOD_TIMEUNIT)
+
+

Certain FMOD_TIMEUNIT types are always available: FMOD_TIMEUNIT_PCM, FMOD_TIMEUNIT_PCMBYTES and FMOD_TIMEUNIT_MS. The others are format specific such as FMOD_TIMEUNIT_MODORDER / FMOD_TIMEUNIT_MODROW / FMOD_TIMEUNIT_MODPATTERN which is specific to files of type MOD / S3M / XM / IT.

+

If playing a Sound created with System::createStream or FMOD_CREATESTREAM changing the position may cause a slow reflush operation while the file seek and decode occurs. You can avoid this by creating the stream with FMOD_NONBLOCKING. This will cause the stream to go into FMOD_OPENSTATE_SETPOSITION state (see Sound::getOpenState) and Sound commands will return FMOD_ERR_NOTREADY. Channel::getPosition will also not update until this non-blocking set position operation has completed.

+

Using a VBR source that does not have an associated seek table or seek information (such as MP3 or MOD/S3M/XM/IT) may cause inaccurate seeking if you specify FMOD_TIMEUNIT_MS or FMOD_TIMEUNIT_PCM. If you want FMOD to create a PCM vs bytes seek table so that seeking is accurate, you will have to specify FMOD_ACCURATETIME when loading or opening the sound. This means there is a slight delay as FMOD scans the whole file when loading the sound to create this table.

+

See Also: Channel::getPosition

+

Channel::setPriority

+

Sets the priority used for virtual voice ordering.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Channel::setPriority(
+  int priority
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetPriority(
+  FMOD_CHANNEL *channel,
+  int priority
+);
+
+ +
RESULT Channel.setPriority(
+  int priority
+);
+
+ +
Channel.setPriority(
+  priority
+);
+
+ +
+
priority
+
+

Priority where 0 represents most important and 256 represents least important.

+
    +
  • Range: [0, 256]
  • +
  • Default: 128
  • +
+
+
+

Priority is used as a coarse grain control for the virtual voice system, lower priority Channels will always be stolen before higher ones. For Channels of equal priority, those with the quietest ChannelControl::getAudibility value will be stolen first.

+

See the Virtual Voices guide for more information.

+

See Also: Channel::getPriority

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channelcontrol.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channelcontrol.html new file mode 100644 index 0000000..c21078c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channelcontrol.html @@ -0,0 +1,4008 @@ + + +Core API Reference | ChannelControl + + + + +
+ +
+

7. Core API Reference | ChannelControl

+

An interface that represents the shared APIs between Channel and ChannelGroup.

+

Playback:

+ +

Volume levels:

+ +

Spatialization:

+ +

Panning and level adjustment:

+ +

Filtering:

+ +

DSP chain configuration:

+ +
+ +

Sample accurate scheduling:

+ +

General:

+ +
+ +
+ +

ChannelControl::addDSP

+

Adds a DSP unit to the specified index in the DSP chain.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::addDSP(
+  int index,
+  DSP *dsp
+);
+
+ +
FMOD_RESULT FMOD_Channel_AddDSP(
+  FMOD_CHANNEL *channel,
+  int index,
+  FMOD_DSP *dsp
+);
+FMOD_RESULT FMOD_ChannelGroup_AddDSP(
+  FMOD_CHANNELGROUP *channelgroup,
+  int index,
+  FMOD_DSP *dsp
+);
+
+ +
RESULT ChannelControl.addDSP(
+  int index,
+  DSP dsp
+);
+
+ +
Channel.addDSP(
+  index,
+  dsp
+);
+ChannelGroup.addDSP(
+  index,
+  dsp
+);
+
+ +
+
index
+
+

Offset into the DSP chain, see FMOD_CHANNELCONTROL_DSP_INDEX for special named offsets for 'head' and 'tail' and 'fader' units.

+ +
+
dsp
+
DSP unit to be added. (DSP)
+
+

If dsp is already added to an existing object it will be removed and then added to this object.

+

For detailed information on FMOD's DSP graph, read the DSP Architecture and Usage white paper.

+

See Also: ChannelControl::removeDSP, System::createDSP, System::createDSPByType, System::createDSPByPlugin

+

ChannelControl::addFadePoint

+

Adds a sample accurate fade point at a time relative to the parent ChannelGroup DSP clock.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::addFadePoint(
+  unsigned long long dspclock,
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_Channel_AddFadePoint(
+  FMOD_CHANNEL *channel,
+  unsigned long long dspclock,
+  float volume
+);
+FMOD_RESULT FMOD_ChannelGroup_AddFadePoint(
+  FMOD_CHANNELGROUP *channelgroup,
+  unsigned long long dspclock,
+  float volume
+);
+
+ +
RESULT ChannelControl.addFadePoint(
+  ulong dspclock,
+  float volume
+);
+
+ +
Channel.addFadePoint(
+  dspclock,
+  volume
+);
+ChannelGroup.addFadePoint(
+  dspclock,
+  volume
+);
+
+ +
+
dspclock
+
+

DSP clock of the parent ChannelGroup to set the fade point volume.

+
    +
  • Units: Samples
  • +
+
+
volume
+
+

Volume level at the given dspclock. Values above 1.0 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: [0, inf)
  • +
+
+
+

Fade points are scaled against other volume settings and in-between each fade point the volume will be linearly ramped.

+

To perform sample accurate fading use ChannelControl::getDSPClock to query the parent clock value. If a parent ChannelGroup changes its pitch, the fade points will still be correct as the parent clock rate is adjusted by that pitch.

+
/* Example. Ramp from full volume to half volume over the next 4096 samples */
+unsigned long long parentclock;
+FMOD_ChannelControl_GetDSPClock(target, NULL, &parentclock);
+FMOD_ChannelControl_AddFadePoint(target, parentclock,        1.0f);
+FMOD_ChannelControl_AddFadePoint(target, parentclock + 4096, 0.5f);
+
+ +
// Example. Ramp from full volume to half volume over the next 4096 samples
+unsigned long long parentclock;
+target->getDSPClock(nullptr, &parentclock);
+target->addFadePoint(parentclock,        1.0f);
+target->addFadePoint(parentclock + 4096, 0.5f);
+
+ +

See Also: ChannelControl::removeFadePoints, ChannelControl::setFadePointRamp, ChannelControl::getFadePoints

+

FMOD_CHANNELCONTROL_CALLBACK

+

Callback for Channel or ChannelGroup notifications.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CHANNELCONTROL_CALLBACK(
+  FMOD_CHANNELCONTROL *channelcontrol,
+  FMOD_CHANNELCONTROL_TYPE controltype,
+  FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype,
+  void *commanddata1,
+  void *commanddata2
+);
+
+ +
delegate RESULT CHANNELCONTROL_CALLBACK(
+  IntPtr channelcontrol,
+  CHANNELCONTROL_TYPE controltype,
+  CHANNELCONTROL_CALLBACK_TYPE callbacktype,
+  IntPtr commanddata1,
+  IntPtr commanddata2
+);
+
+ +
function FMOD_CHANNELCONTROL_CALLBACK(
+  channelcontrol,
+  controltype,
+  callbacktype,
+  commanddata1,
+  commanddata2
+)
+
+ +
+
channelcontrol
+
Base Channel or ChannelGroup handle. (ChannelControl)
+
controltype
+
Identifier to distinguish between Channel and ChannelGroup. (FMOD_CHANNELCONTROL_TYPE)
+
callbacktype
+
Type of callback. (FMOD_CHANNELCONTROL_CALLBACK_TYPE)
+
commanddata1 Opt
+
First callback parameter, see FMOD_CHANNELCONTROL_CALLBACK_TYPE for details.
+
commanddata2 Opt
+
Second callback parameter, see FMOD_CHANNELCONTROL_CALLBACK_TYPE for details.
+
+
+

The 'channelcontrol' argument can be cast to FMOD::Channel * or FMOD::ChannelGroup * given controltype.

+
+
+

The 'channelcontrol' argument can be cast to FMOD_CHANNEL * or FMOD_CHANNELGROUP * given controltype.

+
+
+

The 'channelcontrol' argument can be used via Channel or ChannelGroup by using FMOD.Channel channel = new FMOD.Channel(channelcontrol);

+
+

See Also: Callback Behavior, ChannelControl::setCallback

+

FMOD_CHANNELCONTROL_CALLBACK_TYPE

+

Types of callbacks called by Channels and ChannelGroups.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_CHANNELCONTROL_CALLBACK_TYPE {
+  FMOD_CHANNELCONTROL_CALLBACK_END,
+  FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE,
+  FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT,
+  FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION,
+  FMOD_CHANNELCONTROL_CALLBACK_MAX
+} FMOD_CHANNELCONTROL_CALLBACK_TYPE;
+
+ +
enum CHANNELCONTROL_CALLBACK_TYPE : int
+{
+  END,
+  VIRTUALVOICE,
+  SYNCPOINT,
+  OCCLUSION,
+  MAX,
+}
+
+ +
CHANNELCONTROL_CALLBACK_END
+CHANNELCONTROL_CALLBACK_VIRTUALVOICE
+CHANNELCONTROL_CALLBACK_SYNCPOINT
+CHANNELCONTROL_CALLBACK_OCCLUSION
+CHANNELCONTROL_CALLBACK_MAX
+
+ +
+
FMOD_CHANNELCONTROL_CALLBACK_END
+
Called when a sound ends. Supported by Channel only.
+commanddata1: Unused.
+commanddata2: Unused.
+
FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE
+
Called when a Channel is made virtual or real. Supported by Channel objects only.
+commanddata1: (int) 0 represents 'virtual to real' and 1 represents 'real to virtual'.
+commanddata2: Unused.
+
FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT
+
Called when a syncpoint is encountered. Can be from wav file markers or user added. Supported by Channel only.
+commanddata1: (int) representing the index of the sync point for use with Sound::getSyncPointInfo.
+commanddata2: Unused.
+
FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION
+
Called when geometry occlusion values are calculated. Can be used to clamp or change the value. Supported by Channel and ChannelGroup.
+commanddata1: (float *) representing the calculated direct occlusion value, can be modified.
+commanddata2: (float *) representing the calculated reverb occlusion value, can be modified.
+
FMOD_CHANNELCONTROL_CALLBACK_MAX
+
Maximum number of callback types supported.
+
+

commanddata1 and commanddata2 are parameters passed into the callback and each callback may interpret them differently as specified above. See FMOD_CHANNELCONTROL_CALLBACK.

+

Callbacks are called from the game thread when set from the Core API or Studio API in synchronous mode, and from the Studio Update Thread when in default / async mode.

+

See Also: Callback Behavior, ChannelControl::setCallback

+

FMOD_CHANNELCONTROL_DSP_INDEX

+

References to built-in DSP positions that reside in a Channel or ChannelGroup's DSP chain.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_CHANNELCONTROL_DSP_INDEX {
+  FMOD_CHANNELCONTROL_DSP_HEAD  = -1,
+  FMOD_CHANNELCONTROL_DSP_FADER = -2,
+  FMOD_CHANNELCONTROL_DSP_TAIL  = -3
+} FMOD_CHANNELCONTROL_DSP_INDEX;
+
+ +
struct CHANNELCONTROL_DSP_INDEX
+{
+  const int HEAD  = -1;
+  const int FADER = -2;
+  const int TAIL  = -3;
+}
+
+ +
CHANNELCONTROL_DSP_HEAD     = -1
+CHANNELCONTROL_DSP_FADER    = -2
+CHANNELCONTROL_DSP_TAIL     = -3
+
+ +
+
FMOD_CHANNELCONTROL_DSP_HEAD
+
Head of the DSP chain, closest to the output, equivalent of index 0.
+
FMOD_CHANNELCONTROL_DSP_FADER
+
Built-in fader DSP.
+
FMOD_CHANNELCONTROL_DSP_TAIL
+
Tail of the DSP chain, closest to the input, equivalent of the number of DSPs minus 1.
+
+

Before any DSPs have been added by the user, there is only one DSP available for a Channel or ChannelGroup. This is of type FMOD_DSP_TYPE_FADER. This handles volume and panning for a Channel or ChannelGroup.
+As only 1 DSP exists by default, initially CHANNELCONTROL_DSP_HEAD, CHANNELCONTROL_DSP_TAIL and CHANNELCONTROL_DSP_FADER all reference the same DSP.

+

See Also: ChannelControl::getDSP, ChannelControl::getNumDSPs, ChannelControl::setDSPIndex

+

ChannelControl::get3DAttributes

+

Retrieves the 3D position and velocity used to apply panning, attenuation and doppler.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DAttributes(
+  FMOD_VECTOR *pos,
+  FMOD_VECTOR *vel
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DAttributes(
+  FMOD_CHANNEL *channel,
+  FMOD_VECTOR *pos,
+  FMOD_VECTOR *vel
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DAttributes(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_VECTOR *pos,
+  FMOD_VECTOR *vel
+);
+
+ +
RESULT ChannelControl.get3DAttributes(
+  out VECTOR pos,
+  out VECTOR vel
+);
+
+ +
Channel.get3DAttributes(
+  pos,
+  vel
+);
+ChannelGroup.get3DAttributes(
+  pos,
+  vel
+);
+
+ +
+
pos OutOpt
+
+

Position in 3D space used for panning and attenuation. (FMOD_VECTOR)

+ +
+
vel OutOpt
+
+

Velocity in 3D space used for doppler. (FMOD_VECTOR)

+ +
+
+

See Also: ChannelControl::set3DAttributes

+

ChannelControl::get3DConeOrientation

+

Retrieves the orientation of a 3D cone shape, used for simulated occlusion.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DConeOrientation(
+  FMOD_VECTOR *orientation
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DConeOrientation(
+  FMOD_CHANNEL *channel,
+  FMOD_VECTOR *orientation
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DConeOrientation(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_VECTOR *orientation
+);
+
+ +
RESULT ChannelControl.get3DConeOrientation(
+  out VECTOR orientation
+);
+
+ +
Channel.get3DConeOrientation(
+  orientation
+);
+ChannelGroup.get3DConeOrientation(
+  orientation
+);
+
+ +
+
orientation Out
+
+

Normalized orientation vector, which represents the direction of the sound cone. (FMOD_VECTOR)

+
    +
  • Default: (0, 0, 1)
  • +
+
+
+

See Also: ChannelControl::set3DConeOrientation

+

ChannelControl::get3DConeSettings

+

Retrieves the angles and attenuation levels of a 3D cone shape, for simulated occlusion which is based on direction.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DConeSettings(
+  float *insideconeangle,
+  float *outsideconeangle,
+  float *outsidevolume
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DConeSettings(
+  FMOD_CHANNEL *channel,
+  float *insideconeangle,
+  float *outsideconeangle,
+  float *outsidevolume
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DConeSettings(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *insideconeangle,
+  float *outsideconeangle,
+  float *outsidevolume
+);
+
+ +
RESULT ChannelControl.get3DConeSettings(
+  out float insideconeangle,
+  out float outsideconeangle,
+  out float outsidevolume
+);
+
+ +
Channel.get3DConeSettings(
+  insideconeangle,
+  outsideconeangle,
+  outsidevolume
+);
+ChannelGroup.get3DConeSettings(
+  insideconeangle,
+  outsideconeangle,
+  outsidevolume
+);
+
+ +
+
insideconeangle OutOpt
+
+

Inside cone angle. This is the angle spread within which the sound is unattenuated.

+
    +
  • Units: Degrees
  • +
  • Range: [0, 360]
  • +
  • Default: 360
  • +
+
+
outsideconeangle OutOpt
+
+

Outside cone angle. This is the angle spread outside of which the sound is attenuated to its outsidevolume.

+
    +
  • Units: Degrees
  • +
  • Range: [0, 360]
  • +
  • Default: 360
  • +
+
+
outsidevolume OutOpt
+
+

Cone outside volume.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

When ChannelControl::set3DConeOrientation is used and a 3D 'cone' is set up, attenuation will automatically occur for a sound based on the relative angle of the direction the cone is facing, vs the angle between the sound and the listener.

+
    +
  • If the relative angle is within the insideconeangle, the sound will not have any attenuation applied.
  • +
  • If the relative angle is between the insideconeangle and outsideconeangle, linear volume attenuation (between 1 and outsidevolume) is applied between the two angles until it reaches the outsideconeangle.
  • +
  • If the relative angle is outside of the outsideconeangle the volume does not attenuate any further.
  • +
+

See Also: ChannelControl::set3DConeSettings

+

ChannelControl::get3DCustomRolloff

+

Retrieves the current custom roll-off shape for 3D distance attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DCustomRolloff(
+  FMOD_VECTOR **points,
+  int *numpoints
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DCustomRolloff(
+  FMOD_CHANNEL *channel,
+  FMOD_VECTOR **points,
+  int *numpoints
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DCustomRolloff(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_VECTOR **points,
+  int *numpoints
+);
+
+ +
RESULT ChannelControl.get3DCustomRolloff(
+  out IntPtr points,
+  out int numpoints
+);
+
+ +
Channel.get3DCustomRolloff(
+  points,
+  numpoints
+);
+ChannelGroup.get3DCustomRolloff(
+  points,
+  numpoints
+);
+
+ +
+
points OutOpt
+
+

Array of vectors sorted by distance, where x = distance and y = volume from 0 to 1. z is unused. (FMOD_VECTOR)

+ +
+
numpoints OutOpt
+
Number of entries in the points array.
+
+

See Also: ChannelControl::set3DCustomRolloff

+

ChannelControl::get3DDistanceFilter

+

Retrieves the override values for the 3D distance filter.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DDistanceFilter(
+  bool *custom,
+  float *customLevel,
+  float *centerFreq
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DDistanceFilter(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL *custom,
+  float *customLevel,
+  float *centerFreq
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DDistanceFilter(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL *custom,
+  float *customLevel,
+  float *centerFreq
+);
+
+ +
RESULT ChannelControl.get3DDistanceFilter(
+  out bool custom,
+  out float customLevel,
+  out float centerFreq
+);
+
+ +
Channel.get3DDistanceFilter(
+  custom,
+  customLevel,
+  centerFreq
+);
+ChannelGroup.get3DDistanceFilter(
+  custom,
+  customLevel,
+  centerFreq
+);
+
+ +
+
custom OutOpt
+
+

Override automatic distance filtering and use customLevel instead.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
customLevel OutOpt
+
+

Attenuation factor where 1 represents no attenuation and 0 represents complete attenuation.

+
    +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
centerFreq OutOpt
+
+

Center frequency of the band-pass filter used to simulate distance attenuation, 0 for default of FMOD_ADVANCEDSETTINGS::distanceFilterCenterFreq.

+ +
+
+

See Also: ChannelControl::set3DDistanceFilter

+

ChannelControl::get3DDopplerLevel

+

Retrieves the amount by which doppler is scaled.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DDopplerLevel(
+  float *level
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DDopplerLevel(
+  FMOD_CHANNEL *channel,
+  float *level
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DDopplerLevel(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *level
+);
+
+ +
RESULT ChannelControl.get3DDopplerLevel(
+  out float level
+);
+
+ +
Channel.get3DDopplerLevel(
+  level
+);
+ChannelGroup.get3DDopplerLevel(
+  level
+);
+
+ +
+
level Out
+
+

Doppler scale where 0 represents no doppler, 1 represents natural doppler and 5 represents exaggerated doppler.

+
    +
  • Range: [0, 5]
  • +
  • Default: 1
  • +
+
+
+

See Also: ChannelControl::set3DDopplerLevel

+

ChannelControl::get3DLevel

+

Retrieves the blend between 3D panning and 2D panning.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DLevel(
+  float *level
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DLevel(
+  FMOD_CHANNEL *channel,
+  float *level
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DLevel(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *level
+);
+
+ +
RESULT ChannelControl.get3DLevel(
+  out float level
+);
+
+ +
Channel.get3DLevel(
+  level
+);
+ChannelGroup.get3DLevel(
+  level
+);
+
+ +
+
level Out
+
+

3D pan level where 0 represents panning/attenuating solely with 2D panning functions and 1 represents solely 3D.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

2D functions include:

+ +

3D functions include:

+ +

See Also: ChannelControl::set3DLevel

+

ChannelControl::get3DMinMaxDistance

+

Retrieves the minimum and maximum distances used to calculate the 3D roll-off attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DMinMaxDistance(
+  float *mindistance,
+  float *maxdistance
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DMinMaxDistance(
+  FMOD_CHANNEL *channel,
+  float *mindistance,
+  float *maxdistance
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DMinMaxDistance(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *mindistance,
+  float *maxdistance
+);
+
+ +
RESULT ChannelControl.get3DMinMaxDistance(
+  out float mindistance,
+  out float maxdistance
+);
+
+ +
Channel.get3DMinMaxDistance(
+  mindistance,
+  maxdistance
+);
+ChannelGroup.get3DMinMaxDistance(
+  mindistance,
+  maxdistance
+);
+
+ +
+
mindistance OutOpt
+
+

Distance from the source where attenuation begins.

+ +
+
maxdistance OutOpt
+
+

Distance from the source where attenuation ends.

+ +
+
+

See Also: ChannelControl::set3DMinMaxDistance, System::set3DSettings

+

ChannelControl::get3DOcclusion

+

Retrieves the 3D attenuation factors for the direct and reverb paths.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DOcclusion(
+  float *directocclusion,
+  float *reverbocclusion
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DOcclusion(
+  FMOD_CHANNEL *channel,
+  float *directocclusion,
+  float *reverbocclusion
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DOcclusion(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *directocclusion,
+  float *reverbocclusion
+);
+
+ +
RESULT ChannelControl.get3DOcclusion(
+  out float directocclusion,
+  out float reverbocclusion
+);
+
+ +
Channel.get3DOcclusion(
+  directocclusion,
+  reverbocclusion
+);
+ChannelGroup.get3DOcclusion(
+  directocclusion,
+  reverbocclusion
+);
+
+ +
+
directocclusion OutOpt
+
+

Occlusion factor for the direct path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
reverbocclusion OutOpt
+
+

Occlusion factor for the reverb path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
+

See Also: ChannelControl::set3DOcclusion

+

ChannelControl::get3DSpread

+

Retrieves the spread of a 3D sound in speaker space.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::get3DSpread(
+  float *angle
+);
+
+ +
FMOD_RESULT FMOD_Channel_Get3DSpread(
+  FMOD_CHANNEL *channel,
+  float *angle
+);
+FMOD_RESULT FMOD_ChannelGroup_Get3DSpread(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *angle
+);
+
+ +
RESULT ChannelControl.get3DSpread(
+  out float angle
+);
+
+ +
Channel.get3DSpread(
+  angle
+);
+ChannelGroup.get3DSpread(
+  angle
+);
+
+ +
+
angle Out
+
+

Angle over which the sound is spread.

+
    +
  • Units: Degrees
  • +
  • Range: [0, 360]
  • +
  • Default: 0
  • +
+
+
+

See Also: ChannelControl::set3DSpread

+

ChannelControl::getAudibility

+

Gets the calculated audibility based on all attenuation factors which contribute to the final output volume.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getAudibility(
+  float *audibility
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetAudibility(
+  FMOD_CHANNEL *channel,
+  float *audibility
+);
+FMOD_RESULT FMOD_ChannelGroup_GetAudibility(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *audibility
+);
+
+ +
RESULT ChannelControl.getAudibility(
+  out float audibility
+);
+
+ +
Channel.getAudibility(
+  audibility
+);
+ChannelGroup.getAudibility(
+  audibility
+);
+
+ +
+
audibility Out
+
Estimated audibility.
+
+

The estimated volume is calculated using a number of factors which are detailed in the Virtual Voice System white paper.

+

While this does not represent the actual waveform, Channels playing FSB files will take into consideration the overall peak level of the file (if available).

+

This value is used to determine which Channels should be audible and which Channels to virtualize when resources are limited.

+

See Also: Channel::isVirtual, ChannelControl::getVolume, ChannelControl::get3DOcclusion, ChannelControl::get3DAttributes, FMOD_DSP_PARAMETER_OVERALLGAIN

+

ChannelControl::getDelay

+

Retrieves a sample accurate start (and/or stop) time relative to the parent ChannelGroup DSP clock.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getDelay(
+  unsigned long long *dspclock_start,
+  unsigned long long *dspclock_end,
+  bool *stopchannels = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetDelay(
+  FMOD_CHANNEL *channel,
+  unsigned long long *dspclock_start,
+  unsigned long long *dspclock_end,
+  FMOD_BOOL *stopchannels
+);
+FMOD_RESULT FMOD_ChannelGroup_GetDelay(
+  FMOD_CHANNELGROUP *channelgroup,
+  unsigned long long *dspclock_start,
+  unsigned long long *dspclock_end,
+  FMOD_BOOL *stopchannels
+);
+
+ +
RESULT ChannelControl.getDelay(
+  out ulong dspclock_start,
+  out ulong dspclock_end
+);
+RESULT ChannelControl.getDelay(
+  out ulong dspclock_start,
+  out ulong dspclock_end,
+  out bool stopchannels
+);
+
+ +
Channel.getDelay(
+  dspclock_start,
+  dspclock_end,
+  stopchannels
+);
+ChannelGroup.getDelay(
+  dspclock_start,
+  dspclock_end,
+  stopchannels
+);
+
+ +
+
dspclock_start OutOpt
+
+

DSP clock of the parent ChannelGroup to audibly start playing sound at.

+
    +
  • Units: Samples
  • +
  • Default: 0
  • +
+
+
dspclock_end OutOpt
+
+

DSP clock of the parent ChannelGroup to audibly stop playing sound at.

+
    +
  • Units: Samples
  • +
  • Default: 0
  • +
+
+
stopchannels OutOpt
+
+

True: When dspclock_end is reached, behaves like ChannelControl::stop has been called.
+False: When dspclock_end is reached, behaves like ChannelControl::setPaused has been called, a subsequent dspclock_start allows it to resume.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: ChannelControl::setDelay,ChannelControl::getDSPClock

+

ChannelControl::getDSP

+

Retrieves the DSP unit at the specified index in the DSP chain.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getDSP(
+  int index,
+  DSP **dsp
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetDSP(
+  FMOD_CHANNEL *channel,
+  int index,
+  FMOD_DSP **dsp
+);
+FMOD_RESULT FMOD_ChannelGroup_GetDSP(
+  FMOD_CHANNELGROUP *channelgroup,
+  int index,
+  FMOD_DSP **dsp
+);
+
+ +
RESULT ChannelControl.getDSP(
+  int index,
+  out DSP dsp
+);
+
+ +
Channel.getDSP(
+  index,
+  dsp
+);
+ChannelGroup.getDSP(
+  index,
+  dsp
+);
+
+ +
+
index
+
+

Offset into the DSP chain, see FMOD_CHANNELCONTROL_DSP_INDEX for special named offsets for 'head' and 'tail' and 'fader' units.

+ +
+
dsp Out
+
DSP unit at the specified index. (DSP)
+
+

ChannelControl::getDSPClock

+

Retrieves the DSP clock values at this point in time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getDSPClock(
+  unsigned long long *dspclock,
+  unsigned long long *parentclock
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetDSPClock(
+  FMOD_CHANNEL *channel,
+  unsigned long long *dspclock,
+  unsigned long long *parentclock
+);
+FMOD_RESULT FMOD_ChannelGroup_GetDSPClock(
+  FMOD_CHANNELGROUP *channelgroup,
+  unsigned long long *dspclock,
+  unsigned long long *parentclock
+);
+
+ +
RESULT ChannelControl.getDSPClock(
+  out ulong dspclock,
+  out ulong parentclock
+);
+
+ +
Channel.getDSPClock(
+  dspclock,
+  parentclock
+);
+ChannelGroup.getDSPClock(
+  dspclock,
+  parentclock
+);
+
+ +
+
dspclock OutOpt
+
+

DSP clock value for the tail DSP (FMOD_CHANNELCONTROL_DSP_TAIL) node.

+
    +
  • Units: Samples
  • +
+
+
parentclock OutOpt
+
+

DSP clock value for the tail DSP (FMOD_CHANNELCONTROL_DSP_TAIL) node of the parent ChannelGroup.

+
    +
  • Units: Samples
  • +
+
+
+

To perform sample accurate scheduling in conjunction with ChannelControl::setDelay and ChannelControl::addFadePoint query the parentclock value.

+

See Also: ChannelControl::getDelay

+

ChannelControl::getDSPIndex

+

Retrieves the index of a DSP inside the Channel or ChannelGroup's DSP chain.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getDSPIndex(
+  DSP *dsp,
+  int *index
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetDSPIndex(
+  FMOD_CHANNEL *channel,
+  FMOD_DSP *dsp,
+  int *index
+);
+FMOD_RESULT FMOD_ChannelGroup_GetDSPIndex(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_DSP *dsp,
+  int *index
+);
+
+ +
RESULT ChannelControl.getDSPIndex(
+  DSP dsp,
+  out int index
+);
+
+ +
Channel.getDSPIndex(
+  dsp,
+  index
+);
+ChannelGroup.getDSPIndex(
+  dsp,
+  index
+);
+
+ +
+
dsp
+
DSP unit that exists in the DSP chain. (DSP)
+
index Out
+
Offset into the DSP chain.
+
+

See Also: ChannelControl::setDSPIndex

+

ChannelControl::getFadePoints

+

Retrieves information about stored fade points.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getFadePoints(
+  unsigned int *numpoints,
+  unsigned long long *point_dspclock,
+  float *point_volume
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetFadePoints(
+  FMOD_CHANNEL *channel,
+  unsigned int *numpoints,
+  unsigned long long *point_dspclock,
+  float *point_volume
+);
+FMOD_RESULT FMOD_ChannelGroup_GetFadePoints(
+  FMOD_CHANNELGROUP *channelgroup,
+  unsigned int *numpoints,
+  unsigned long long *point_dspclock,
+  float *point_volume
+);
+
+ +
RESULT ChannelControl.getFadePoints(
+  ref uint numpoints,
+  ulong[] point_dspclock,
+  float[] point_volume
+);
+
+ +
Channel.getFadePoints(
+  numpoints,
+  point_dspclock,
+  point_volume
+);
+ChannelGroup.getFadePoints(
+  numpoints,
+  point_dspclock,
+  point_volume
+);
+
+ +
+
numpoints Out
+
Number of fade points.
+
point_dspclock OutOpt
+
+

Array of DSP clock values that represent the fade point times.

+
    +
  • Units: Samples
  • +
+
+
point_volume OutOpt
+
+

Array of volume levels that represent the fade point values.

+
    +
  • Units: Linear
  • +
  • Range: [0, inf)
  • +
+
+
+

Passing NULL for point_dspclock and point_volume will allow you to query the number of fade points stored, with result stored in numpoints.
+If numpoints is specified by the user, the value will be used as an input for the maximum number of fade points to output. It will then output as the number of fadepoints retrieved.

+

See Also: ChannelControl::addFadePoint, ChannelControl::setFadePointRamp, ChannelControl::removeFadePoints

+

ChannelControl::getLowPassGain

+

Retrieves the gain of the dry signal when built in lowpass / distance filtering is applied.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getLowPassGain(
+  float *gain
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetLowPassGain(
+  FMOD_CHANNEL *channel,
+  float *gain
+);
+FMOD_RESULT FMOD_ChannelGroup_GetLowPassGain(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *gain
+);
+
+ +
RESULT ChannelControl.getLowPassGain(
+  out float gain
+);
+
+ +
Channel.getLowPassGain(
+  gain
+);
+ChannelGroup.getLowPassGain(
+  gain
+);
+
+ +
+
gain Out
+
+

gain level where 0 represents silent (full filtering) and 1 represents full volume (no filtering).

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

Requires the built in lowpass to be created with FMOD_INIT_CHANNEL_LOWPASS or FMOD_INIT_CHANNEL_DISTANCEFILTER.

+
+

Currently only supported for Channel, not ChannelGroup.

+
+

See Also: ChannelControl::setLowPassGain

+

ChannelControl::getMixMatrix

+

Retrieves a 2 dimensional pan matrix that maps the signal from input channels (columns) to output speakers (rows).

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getMixMatrix(
+  float *matrix,
+  int *outchannels,
+  int *inchannels,
+  int inchannel_hop = 0
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetMixMatrix(
+  FMOD_CHANNEL *channel,
+  float *matrix,
+  int *outchannels,
+  int *inchannels,
+  int inchannel_hop
+);
+FMOD_RESULT FMOD_ChannelGroup_GetMixMatrix(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *matrix,
+  int *outchannels,
+  int *inchannels,
+  int inchannel_hop
+);
+
+ +
RESULT ChannelControl.getMixMatrix(
+  float[] matrix,
+  out int outchannels,
+  out int inchannels,
+  int inchannel_hop = 0
+);
+
+ +
Channel.getMixMatrix(
+  matrix,
+  outchannels,
+  inchannels,
+  inchannel_hop
+);
+ChannelGroup.getMixMatrix(
+  matrix,
+  outchannels,
+  inchannels,
+  inchannel_hop
+);
+
+ +
+
matrix OutOpt
+
+

Two dimensional array of volume levels in row-major order. Each row represents an output speaker, each column represents an input channel.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
outchannels OutOpt
+
Number of valid output channels (rows) in matrix.
+
+ +
+
inchannels OutOpt
+
Number of valid input channels (columns) in matrix.
+
+ +
+
inchannel_hop OutOpt
+
Width (total number of columns) in destination matrix. A matrix element is referenced as 'outchannel * inchannel_hop + inchannel'.
+
+

Passing NULL for matrix will allow you to query outchannels and inchannels otherwise they are not optional.

+

Matrix element values can be below 0 to invert a signal and above 1 to amplify the signal. Note that increasing the signal level too far may cause audible distortion.

+

See Also: ChannelControl::setMixMatrix

+

ChannelControl::getMode

+

Retrieves the playback mode bits that control how this object behaves.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getMode(
+  FMOD_MODE *mode
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetMode(
+  FMOD_CHANNEL *channel,
+  FMOD_MODE *mode
+);
+FMOD_RESULT FMOD_ChannelGroup_GetMode(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_MODE *mode
+);
+
+ +
RESULT ChannelControl.getMode(
+  out MODE mode
+);
+
+ +
Channel.getMode(
+  mode
+);
+ChannelGroup.getMode(
+  mode
+);
+
+ +
+
mode Out
+
Playback mode bitfield. Test against a specific mode with the AND operator. (FMOD_MODE)
+
+

See Also: ChannelControl::setMode

+

ChannelControl::getMute

+

Retrieves the mute state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getMute(
+  bool *mute
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetMute(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL *mute
+);
+FMOD_RESULT FMOD_ChannelGroup_GetMute(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL *mute
+);
+
+ +
RESULT ChannelControl.getMute(
+  out bool mute
+);
+
+ +
Channel.getMute(
+  mute
+);
+ChannelGroup.getMute(
+  mute
+);
+
+ +
+
mute Out
+
+

Mute state. True = silent. False = audible.

+
    +
  • Units: Boolean
  • +
+
+
+

An individual mute state is kept for each object, a parent ChannelGroup being muted will effectively mute this object however when queried the individual mute state is returned. ChannelControl::getAudibility can be used to calculate overall audibility for a Channel or ChannelGroup.

+

See Also: ChannelControl::setMute

+

ChannelControl::getNumDSPs

+

Retrieves the number of DSP units in the DSP chain.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getNumDSPs(
+  int *numdsps
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetNumDSPs(
+  FMOD_CHANNEL *channel,
+  int *numdsps
+);
+FMOD_RESULT FMOD_ChannelGroup_GetNumDSPs(
+  FMOD_CHANNELGROUP *channelgroup,
+  int *numdsps
+);
+
+ +
RESULT ChannelControl.getNumDSPs(
+  out int numdsps
+);
+
+ +
Channel.getNumDSPs(
+  numdsps
+);
+ChannelGroup.getNumDSPs(
+  numdsps
+);
+
+ +
+
numdsps Out
+
Number of DSP units in the DSP chain.
+
+

See Also: ChannelControl::addDSP, ChannelControl::removeDSP, ChannelControl::getDSP

+

ChannelControl::getPaused

+

Retrieves the paused state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getPaused(
+  bool *paused
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetPaused(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL *paused
+);
+FMOD_RESULT FMOD_ChannelGroup_GetPaused(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL *paused
+);
+
+ +
RESULT ChannelControl.getPaused(
+  out bool paused
+);
+
+ +
Channel.getPaused(
+  paused
+);
+ChannelGroup.getPaused(
+  paused
+);
+
+ +
+
paused Out
+
+

Paused state. True = playback halted. False = playback active.

+
    +
  • Units: Boolean
  • +
+
+
+

An individual pause state is kept for each object, a parent ChannelGroup being paused will effectively pause this object however when queried the individual pause state is returned.

+

See Also: ChannelControl::setPaused

+

ChannelControl::getPitch

+

Retrieves the relative pitch / playback rate.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getPitch(
+  float *pitch
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetPitch(
+  FMOD_CHANNEL *channel,
+  float *pitch
+);
+FMOD_RESULT FMOD_ChannelGroup_GetPitch(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *pitch
+);
+
+ +
RESULT ChannelControl.getPitch(
+  out float pitch
+);
+
+ +
Channel.getPitch(
+  pitch
+);
+ChannelGroup.getPitch(
+  pitch
+);
+
+ +
+
pitch Out
+
Pitch value where 0.5 represents half pitch (one octave down), 1 represents unmodified pitch and 2 represents double pitch (one octave up).
+
+

An individual pitch value is kept for each object, a parent ChannelGroup pitch will effectively scale the pitch of this object however when queried the individual pitch value is returned.

+

See Also: ChannelControl::setPitch

+

ChannelControl::getReverbProperties

+

Retrieves the wet / send level for a particular reverb instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getReverbProperties(
+  int instance,
+  float *wet
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetReverbProperties(
+  FMOD_CHANNEL *channel,
+  int instance,
+  float *wet
+);
+FMOD_RESULT FMOD_ChannelGroup_GetReverbProperties(
+  FMOD_CHANNELGROUP *channelgroup,
+  int instance,
+  float *wet
+);
+
+ +
RESULT ChannelControl.getReverbProperties(
+  int instance,
+  out float wet
+);
+
+ +
Channel.getReverbProperties(
+  instance,
+  wet
+);
+ChannelGroup.getReverbProperties(
+  instance,
+  wet
+);
+
+ +
+
instance
+
+

Reverb instance index.

+ +
+
wet Out
+
+

Send level for the signal to the reverb. 0 = none, 1 = full.

+ +
+
+

See Also: ChannelControl::setReverbProperties

+

ChannelControl::getSystemObject

+

Retrieves the System that created this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getSystemObject(
+  System **system
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetSystemObject(
+  FMOD_CHANNEL *channel,
+  FMOD_SYSTEM **system
+);
+FMOD_RESULT FMOD_ChannelGroup_GetSystemObject(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_SYSTEM **system
+);
+
+ +
RESULT ChannelControl.getSystemObject(
+  out System system
+);
+
+ +
Channel.getSystemObject(
+  system
+);
+ChannelGroup.getSystemObject(
+  system
+);
+
+ +
+
system Out
+
System object. (System)
+
+

See Also: System::createChannelGroup, System::getMasterChannelGroup, System::playSound

+

ChannelControl::getUserData

+

Retrieves a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetUserData(
+  FMOD_CHANNEL *channel,
+  void **userdata
+);
+FMOD_RESULT FMOD_ChannelGroup_GetUserData(
+  FMOD_CHANNELGROUP *channelgroup,
+  void **userdata
+);
+
+ +
RESULT ChannelControl.getUserData(
+  out IntPtr userdata
+);
+
+ +
Channel.getUserData(
+  userdata
+);
+ChannelGroup.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling ChannelControl::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

ChannelControl::getVolume

+

Retrieves the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getVolume(
+  float *volume
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetVolume(
+  FMOD_CHANNEL *channel,
+  float *volume
+);
+FMOD_RESULT FMOD_ChannelGroup_GetVolume(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *volume
+);
+
+ +
RESULT ChannelControl.getVolume(
+  out float volume
+);
+
+ +
Channel.getVolume(
+  volume
+);
+ChannelGroup.getVolume(
+  volume
+);
+
+ +
+
volume Out
+
+

Volume level.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
+

See Also: ChannelControl::setVolume

+

ChannelControl::getVolumeRamp

+

Retrieves whether volume changes are ramped or instantaneous.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::getVolumeRamp(
+  bool *ramp
+);
+
+ +
FMOD_RESULT FMOD_Channel_GetVolumeRamp(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL *ramp
+);
+FMOD_RESULT FMOD_ChannelGroup_GetVolumeRamp(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL *ramp
+);
+
+ +
RESULT ChannelControl.getVolumeRamp(
+  out bool ramp
+);
+
+ +
Channel.getVolumeRamp(
+  ramp
+);
+ChannelGroup.getVolumeRamp(
+  ramp
+);
+
+ +
+
ramp Out
+
+

Ramp state. True = volume change is ramped. False = volume change is instantaeous.

+
    +
  • Units: Boolean
  • +
  • Default: True
  • +
+
+
+

See Also: ChannelControl::setVolumeRamp

+

ChannelControl::isPlaying

+

Retrieves the playing state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::isPlaying(
+  bool *isplaying
+);
+
+ +
FMOD_RESULT FMOD_Channel_IsPlaying(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL *isplaying
+);
+FMOD_RESULT FMOD_ChannelGroup_IsPlaying(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL *isplaying
+);
+
+ +
RESULT ChannelControl.isPlaying(
+  out bool isplaying
+);
+
+ +
Channel.isPlaying(
+  isplaying
+);
+ChannelGroup.isPlaying(
+  isplaying
+);
+
+ +
+
isplaying Out
+
+

Playing state.

+
    +
  • Units: Boolean
  • +
+
+
+

A Channel is considered playing after System::playSound or System::playDSP, even if it is paused.

+

A ChannelGroup is considered playing if it has any playing Channels.

+

ChannelControl::removeDSP

+

Removes the specified DSP unit from the DSP chain.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::removeDSP(
+  DSP *dsp
+);
+
+ +
FMOD_RESULT FMOD_Channel_RemoveDSP(
+  FMOD_CHANNEL *channel,
+  FMOD_DSP *dsp
+);
+FMOD_RESULT FMOD_ChannelGroup_RemoveDSP(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_DSP *dsp
+);
+
+ +
RESULT ChannelControl.removeDSP(
+  DSP dsp
+);
+
+ +
Channel.removeDSP(
+  dsp
+);
+ChannelGroup.removeDSP(
+  dsp
+);
+
+ +
+
dsp
+
DSP unit to be removed. (DSP)
+
+

See Also: ChannelControl::addDSP, ChannelControl::getDSP, ChannelControl::getNumDSPs

+

ChannelControl::removeFadePoints

+

Removes all fade points between the two specified clock values (inclusive).

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::removeFadePoints(
+  unsigned long long dspclock_start,
+  unsigned long long dspclock_end
+);
+
+ +
FMOD_RESULT FMOD_Channel_RemoveFadePoints(
+  FMOD_CHANNEL *channel,
+  unsigned long long dspclock_start,
+  unsigned long long dspclock_end
+);
+FMOD_RESULT FMOD_ChannelGroup_RemoveFadePoints(
+  FMOD_CHANNELGROUP *channelgroup,
+  unsigned long long dspclock_start,
+  unsigned long long dspclock_end
+);
+
+ +
RESULT ChannelControl.removeFadePoints(
+  ulong dspclock_start,
+  ulong dspclock_end
+);
+
+ +
Channel.removeFadePoints(
+  dspclock_start,
+  dspclock_end
+);
+ChannelGroup.removeFadePoints(
+  dspclock_start,
+  dspclock_end
+);
+
+ +
+
dspclock_start
+
+

DSP clock of the parent ChannelGroup at which to begin removing fade points.

+
    +
  • Units: Samples
  • +
+
+
dspclock_end
+
+

DSP clock of the parent ChannelGroup at which to stop removing fade points.

+
    +
  • Units: Samples
  • +
+
+
+

See Also: ChannelControl::addFadePoint, ChannelControl::setFadePointRamp, ChannelControl::getFadePoints

+

ChannelControl::set3DAttributes

+

Sets the 3D position and velocity used to apply panning, attenuation and doppler.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DAttributes(
+  const FMOD_VECTOR *pos,
+  const FMOD_VECTOR *vel
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DAttributes(
+  FMOD_CHANNEL *channel,
+  const FMOD_VECTOR *pos,
+  const FMOD_VECTOR *vel
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DAttributes(
+  FMOD_CHANNELGROUP *channelgroup,
+  const FMOD_VECTOR *pos,
+  const FMOD_VECTOR *vel
+);
+
+ +
RESULT ChannelControl.set3DAttributes(
+  ref VECTOR pos,
+  ref VECTOR vel
+);
+RESULT ChannelControl.set3DAttributes(
+  ref VECTOR pos,
+  ref VECTOR vel
+);
+
+ +
Channel.set3DAttributes(
+  pos,
+  vel
+);
+ChannelGroup.set3DAttributes(
+  pos,
+  vel
+);
+
+ +
+
pos Opt
+
+

Position in 3D space used for panning and attenuation. (FMOD_VECTOR)

+ +
+
vel Opt
+
+

Velocity in 3D space used for doppler. (FMOD_VECTOR)

+ +
+
+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

Vectors must be provided in the correct handedness.

+

For a stereo 3D sound, you can set the spread of the left/right parts in speaker space by using ChannelControl::set3DSpread.

+

See Also: ChannelControl::get3DAttributes

+

ChannelControl::set3DConeOrientation

+

Sets the orientation of a 3D cone shape, used for simulated occlusion.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DConeOrientation(
+  FMOD_VECTOR *orientation
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DConeOrientation(
+  FMOD_CHANNEL *channel,
+  FMOD_VECTOR *orientation
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DConeOrientation(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_VECTOR *orientation
+);
+
+ +
RESULT ChannelControl.set3DConeOrientation(
+  ref VECTOR orientation
+);
+
+ +
Channel.set3DConeOrientation(
+  orientation
+);
+ChannelGroup.set3DConeOrientation(
+  orientation
+);
+
+ +
+
orientation
+
+

Normalized orientation vector, which represents the direction of the sound cone. (FMOD_VECTOR)

+
    +
  • Default: (0, 0, 1)
  • +
+
+
+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

This function has no effect unless ChannelControl::set3DConeSettings has been used to change the cone inside/outside angles from the default.

+

Vectors must be provided in the correct handedness.

+

See Also: ChannelControl::get3DConeOrientation

+

ChannelControl::set3DConeSettings

+

Sets the angles and attenuation levels of a 3D cone shape, for simulated occlusion which is based on direction.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DConeSettings(
+  float insideconeangle,
+  float outsideconeangle,
+  float outsidevolume
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DConeSettings(
+  FMOD_CHANNEL *channel,
+  float insideconeangle,
+  float outsideconeangle,
+  float outsidevolume
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DConeSettings(
+  FMOD_CHANNELGROUP *channelgroup,
+  float insideconeangle,
+  float outsideconeangle,
+  float outsidevolume
+);
+
+ +
RESULT ChannelControl.set3DConeSettings(
+  float insideconeangle,
+  float outsideconeangle,
+  float outsidevolume
+);
+
+ +
Channel.set3DConeSettings(
+  insideconeangle,
+  outsideconeangle,
+  outsidevolume
+);
+ChannelGroup.set3DConeSettings(
+  insideconeangle,
+  outsideconeangle,
+  outsidevolume
+);
+
+ +
+
insideconeangle
+
+

Inside cone angle. This is the angle spread within which the sound is unattenuated.

+
    +
  • Units: Degrees
  • +
  • Range: [0, outsideconeangle]
  • +
  • Default: 360
  • +
+
+
outsideconeangle
+
+

Outside cone angle. This is the angle spread outside of which the sound is attenuated to its outsidevolume.

+
    +
  • Units: Degrees
  • +
  • Range: [insideconeangle, 360]
  • +
  • Default: 360
  • +
+
+
outsidevolume
+
+

Cone outside volume.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

When ChannelControl::set3DConeOrientation is used and a 3D 'cone' is set up, attenuation will automatically occur for a sound based on the relative angle of the direction the cone is facing, vs the angle between the sound and the listener.

+
    +
  • If the relative angle is within the insideconeangle, the sound will not have any attenuation applied.
  • +
  • If the relative angle is between the insideconeangle and outsideconeangle, linear volume attenuation (between 1 and outsidevolume) is applied between the two angles until it reaches the outsideconeangle.
  • +
  • If the relative angle is outside of the outsideconeangle the volume does not attenuate any further.
  • +
+

See Also: ChannelControl::get3DConeSettings, Sound::set3DConeSettings

+

ChannelControl::set3DCustomRolloff

+

Sets a custom roll-off shape for 3D distance attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DCustomRolloff(
+  FMOD_VECTOR *points,
+  int numpoints
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DCustomRolloff(
+  FMOD_CHANNEL *channel,
+  FMOD_VECTOR *points,
+  int numpoints
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DCustomRolloff(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_VECTOR *points,
+  int numpoints
+);
+
+ +
RESULT ChannelControl.set3DCustomRolloff(
+  ref VECTOR points,
+  int numpoints
+);
+
+ +
Channel.set3DCustomRolloff(
+  points,
+  numpoints
+);
+ChannelGroup.set3DCustomRolloff(
+  points,
+  numpoints
+);
+
+ +
+
points
+
+

Array of vectors sorted by distance, where x = distance and y = volume from 0 to 1. z should be set to 0. Pass null or equivalen to disable custom rolloff. (FMOD_VECTOR)

+ +
+
numpoints
+
Number of points.
+
+

Must be used in conjunction with FMOD_3D_CUSTOMROLLOFF flag to be activated.

+

This function does not duplicate the memory for the points internally. The memory you pass to FMOD must remain valid while in use.

+

If FMOD_3D_CUSTOMROLLOFF is set and the roll-off shape is not set, FMOD will revert to FMOD_3D_INVERSEROLLOFF roll-off mode.

+

When a custom roll-off is specified a Channel or ChannelGroup's 3D 'minimum' and 'maximum' distances are ignored.

+

The distance in-between point values is linearly interpolated until the final point where the last value is held.

+

If the points are not sorted by distance, an error will result.

+
// Defining a custom array of points
+FMOD_VECTOR curve[3] =
+{
+    { 0.0f,  1.0f, 0.0f },
+    { 2.0f,  0.2f, 0.0f },
+    { 20.0f, 0.0f, 0.0f }
+};
+
+ +

See Also: Sound::set3DCustomRolloff, ChannelControl::get3DCustomRolloff

+

ChannelControl::set3DDistanceFilter

+

Sets an override value for the 3D distance filter.

+

If distance filtering is enabled, by default the 3D engine will automatically attenuate frequencies using a lowpass and a highpass filter, based on 3D distance.
+This function allows the distance filter effect to be set manually, or to be set back to 'automatic' mode.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DDistanceFilter(
+  bool custom,
+  float customLevel,
+  float centerFreq
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DDistanceFilter(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL custom,
+  float customLevel,
+  float centerFreq
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DDistanceFilter(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL custom,
+  float customLevel,
+  float centerFreq
+);
+
+ +
RESULT ChannelControl.set3DDistanceFilter(
+  bool custom,
+  float customLevel,
+  float centerFreq
+);
+
+ +
Channel.set3DDistanceFilter(
+  custom,
+  customLevel,
+  centerFreq
+);
+ChannelGroup.set3DDistanceFilter(
+  custom,
+  customLevel,
+  centerFreq
+);
+
+ +
+
custom
+
+

Override automatic distance filtering and use customLevel instead.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
customLevel
+
+

Attenuation factor where 1 represents no attenuation and 0 represents complete attenuation.

+
    +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
centerFreq Opt
+
+

Center frequency of the band-pass filter used to simulate distance attenuation, 0 for default.

+ +
+
+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

The System must be initialized with FMOD_INIT_CHANNEL_DISTANCEFILTER for this feature to work.

+
+

Currently only supported for Channel, not ChannelGroup.

+
+

See Also: ChannelControl::get3DDistanceFilter

+

ChannelControl::set3DDopplerLevel

+

Sets the amount by which doppler is scaled.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DDopplerLevel(
+  float level
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DDopplerLevel(
+  FMOD_CHANNEL *channel,
+  float level
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DDopplerLevel(
+  FMOD_CHANNELGROUP *channelgroup,
+  float level
+);
+
+ +
RESULT ChannelControl.set3DDopplerLevel(
+  float level
+);
+
+ +
Channel.set3DDopplerLevel(
+  level
+);
+ChannelGroup.set3DDopplerLevel(
+  level
+);
+
+ +
+
level
+
+

Doppler scale where 0 represents no doppler, 1 represents natural doppler and 5 represents exaggerated doppler.

+
    +
  • Range: [0, 5]
  • +
  • Default: 1
  • +
+
+
+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

The doppler effect will disabled if System::set3DNumListeners is given a value greater than 1.

+
+

Currently only supported for Channel, not ChannelGroup.

+
+

See Also: ChannelControl::get3DDopplerLevel, System::set3DSettings

+

ChannelControl::set3DLevel

+

Sets the blend between 3D panning and 2D panning.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DLevel(
+  float level
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DLevel(
+  FMOD_CHANNEL *channel,
+  float level
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DLevel(
+  FMOD_CHANNELGROUP *channelgroup,
+  float level
+);
+
+ +
RESULT ChannelControl.set3DLevel(
+  float level
+);
+
+ +
Channel.set3DLevel(
+  level
+);
+ChannelGroup.set3DLevel(
+  level
+);
+
+ +
+
level
+
+

3D pan level where 0 represents panning/attenuating solely with 2D panning functions and 1 represents solely 3D.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

2D functions include:

+ +

3D functions include:

+ +

See Also: ChannelControl::get3DLevel

+

ChannelControl::set3DMinMaxDistance

+

Sets the minimum and maximum distances used to calculate the 3D roll-off attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DMinMaxDistance(
+  float mindistance,
+  float maxdistance
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DMinMaxDistance(
+  FMOD_CHANNEL *channel,
+  float mindistance,
+  float maxdistance
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DMinMaxDistance(
+  FMOD_CHANNELGROUP *channelgroup,
+  float mindistance,
+  float maxdistance
+);
+
+ +
RESULT ChannelControl.set3DMinMaxDistance(
+  float mindistance,
+  float maxdistance
+);
+
+ +
Channel.set3DMinMaxDistance(
+  mindistance,
+  maxdistance
+);
+ChannelGroup.set3DMinMaxDistance(
+  mindistance,
+  maxdistance
+);
+
+ +
+
mindistance
+
+

Distance from the source where attenuation begins.

+ +
+
maxdistance
+
+

Distance from the source where attenuation ends.

+ +
+
+

When the listener is within the minimum distance of the sound source the 3D volume will be at its maximum. As the listener moves from the minimum distance to the maximum distance the sound will attenuate following the roll-off curve set. When outside the maximum distance the sound will no longer attenuate.

+

Attenuation in 3D space is controlled by the roll-off mode, these are FMOD_3D_INVERSEROLLOFF, FMOD_3D_LINEARROLLOFF, FMOD_3D_LINEARSQUAREROLLOFF, FMOD_3D_INVERSETAPEREDROLLOFF, FMOD_3D_CUSTOMROLLOFF.

+

Minimum distance is useful to give the impression that the sound is loud or soft in 3D space.
+A sound with a small 3D minimum distance in a typical (non custom) roll-off mode will make the sound appear small, and the sound will attenuate quickly.
+A sound with a large minimum distance will make the sound appear larger.

+

The FMOD_3D flag must be set on this object otherwise FMOD_ERR_NEEDS3D is returned.

+

To define the min and max distance per Sound instead of Channel or ChannelGroup use Sound::set3DMinMaxDistance.

+

If FMOD_3D_CUSTOMROLLOFF has been set on this object these values are stored, but ignored in 3D processing.

+

See Also: ChannelControl::get3DMinMaxDistance

+

ChannelControl::set3DOcclusion

+

Sets the 3D attenuation factors for the direct and reverb paths.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DOcclusion(
+  float directocclusion,
+  float reverbocclusion
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DOcclusion(
+  FMOD_CHANNEL *channel,
+  float directocclusion,
+  float reverbocclusion
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DOcclusion(
+  FMOD_CHANNELGROUP *channelgroup,
+  float directocclusion,
+  float reverbocclusion
+);
+
+ +
RESULT ChannelControl.set3DOcclusion(
+  float directocclusion,
+  float reverbocclusion
+);
+
+ +
Channel.set3DOcclusion(
+  directocclusion,
+  reverbocclusion
+);
+ChannelGroup.set3DOcclusion(
+  directocclusion,
+  reverbocclusion
+);
+
+ +
+
directocclusion
+
+

Occlusion factor for the direct path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
reverbocclusion
+
+

Occlusion factor for the reverb path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
+

There is a reverb path/send when ChannelControl::setReverbProperties has been used, reverbocclusion controls its attenuation.

+

If the System has been initialized with FMOD_INIT_CHANNEL_DISTANCEFILTER or FMOD_INIT_CHANNEL_LOWPASS the directocclusion is applied as frequency filtering rather than volume attenuation.

+

See Also: ChannelControl::get3DOcclusion

+

ChannelControl::set3DSpread

+

Sets the spread of a 3D sound in speaker space.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::set3DSpread(
+  float angle
+);
+
+ +
FMOD_RESULT FMOD_Channel_Set3DSpread(
+  FMOD_CHANNEL *channel,
+  float angle
+);
+FMOD_RESULT FMOD_ChannelGroup_Set3DSpread(
+  FMOD_CHANNELGROUP *channelgroup,
+  float angle
+);
+
+ +
RESULT ChannelControl.set3DSpread(
+  float angle
+);
+
+ +
Channel.set3DSpread(
+  angle
+);
+ChannelGroup.set3DSpread(
+  angle
+);
+
+ +
+
angle
+
+

Angle over which the sound is spread.

+
    +
  • Units: Degrees
  • +
  • Range: [0, 360]
  • +
  • Default: 0
  • +
+
+
+

When the spread angle is 0 (default) a multi-channel signal will collapse to mono and be spatialized to a single point based on ChannelControl::set3DAttributes calculations. As the angle is increased, each channel within a multi-channel signal will be rotated away from that point. For 2, 4, 6, 8, and 12 channel signals, the spread is arranged from leftmost speaker to rightmost speaker intelligently, for example in 5.1 the leftmost speaker is rear left, followed by front left, center, front right then finally rear right as the rightmost speaker (LFE is not spread). For other channel counts the individual channels are spread evenly in the order of the signal. As the signal is spread the power will be preserved.

+

For a stereo signal given different spread angles:

+
    +
  • 0: Sound is collapsed to mono and spatialized to a single point.
  • +
  • 90: Left channel is rotated 45 degrees to the left compared with angle=0 and the right channel 45 degrees to the right.
  • +
  • 180: Left channel is rotated 90 degrees to the left compared with angle=0 and the right channel 90 degrees to the right.
  • +
  • 360: Left channel is rotated 180 degrees to the left and the right channel 180 degrees to the right. This means the sound is collapsed to mono and spatialized to a single point in the opposite direction compared with (angle=0).
  • +
+

See Also: ChannelControl::get3DSpread

+

ChannelControl::setCallback

+

Sets the callback for ChannelControl level notifications.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setCallback(
+  FMOD_CHANNELCONTROL_CALLBACK callback
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetCallback(
+  FMOD_CHANNEL *channel,
+  FMOD_CHANNELCONTROL_CALLBACK callback
+);
+FMOD_RESULT FMOD_ChannelGroup_SetCallback(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_CHANNELCONTROL_CALLBACK callback
+);
+
+ +
RESULT ChannelControl.setCallback(
+  CHANNEL_CALLBACK callback
+);
+
+ +
Channel.setCallback(
+  callback
+);
+ChannelGroup.setCallback(
+  callback
+);
+
+ +
+
callback
+
Callback to invoke. (FMOD_CHANNELCONTROL_CALLBACK)
+
+

See Also: Callback Behavior, FMOD_CHANNELCONTROL_CALLBACK_TYPE

+

ChannelControl::setDelay

+

Sets a sample accurate start (and/or stop) time relative to the parent ChannelGroup DSP clock.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setDelay(
+  unsigned long long dspclock_start,
+  unsigned long long dspclock_end,
+  bool stopchannels = true
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetDelay(
+  FMOD_CHANNEL *channel,
+  unsigned long long dspclock_start,
+  unsigned long long dspclock_end,
+  FMOD_BOOL stopchannels
+);
+FMOD_RESULT FMOD_ChannelGroup_SetDelay(
+  FMOD_CHANNELGROUP *channelgroup,
+  unsigned long long dspclock_start,
+  unsigned long long dspclock_end,
+  FMOD_BOOL stopchannels
+);
+
+ +
RESULT ChannelControl.setDelay(
+  ulong dspclock_start,
+  ulong dspclock_end,
+  bool stopchannels = true
+);
+
+ +
Channel.setDelay(
+  dspclock_start,
+  dspclock_end,
+  stopchannels
+);
+ChannelGroup.setDelay(
+  dspclock_start,
+  dspclock_end,
+  stopchannels
+);
+
+ +
+
dspclock_start Opt
+
+

DSP clock of the parent ChannelGroup to audibly start playing sound at.

+
    +
  • Units: Samples
  • +
  • Default: 0
  • +
+
+
dspclock_end Opt
+
+

DSP clock of the parent ChannelGroup to audibly stop playing sound at.

+
    +
  • Units: Samples
  • +
  • Default: 0
  • +
+
+
stopchannels
+
+

True: When dspclock_end is reached, behaves like ChannelControl::stop has been called.
+False: When dspclock_end is reached, behaves like ChannelControl::setPaused has been called, a subsequent dspclock_start allows it to resume.

+
    +
  • Units: Boolean
  • +
+
+
+

To perform sample accurate scheduling use ChannelControl::getDSPClock to query the parent clock value. If a parent ChannelGroup changes its pitch, the start and stop times will still be correct as the parent clock rate is adjusted by that pitch.

+

See Also: ChannelControl::getDelay

+

ChannelControl::setDSPIndex

+

Sets the index in the DSP chain of the specified DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setDSPIndex(
+  DSP *dsp,
+  int index
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetDSPIndex(
+  FMOD_CHANNEL *channel,
+  FMOD_DSP *dsp,
+  int index
+);
+FMOD_RESULT FMOD_ChannelGroup_SetDSPIndex(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_DSP *dsp,
+  int index
+);
+
+ +
RESULT ChannelControl.setDSPIndex(
+  DSP dsp,
+  int index
+);
+
+ +
Channel.setDSPIndex(
+  dsp,
+  index
+);
+ChannelGroup.setDSPIndex(
+  dsp,
+  index
+);
+
+ +
+
dsp
+
A DSP unit that exists in the DSP chain. (DSP)
+
index
+
Offset into the DSP chain to move the DSP to, see FMOD_CHANNELCONTROL_DSP_INDEX for special named offsets.
+
+

This will move a DSP already in the DSP chain to a new offset.

+

See Also: ChannelControl::getDSPIndex

+

ChannelControl::setFadePointRamp

+

Adds a volume ramp at the specified time in the future using fade points.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setFadePointRamp(
+  unsigned long long dspclock,
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetFadePointRamp(
+  FMOD_CHANNEL *channel,
+  unsigned long long dspclock,
+  float volume
+);
+FMOD_RESULT FMOD_ChannelGroup_SetFadePointRamp(
+  FMOD_CHANNELGROUP *channelgroup,
+  unsigned long long dspclock,
+  float volume
+);
+
+ +
RESULT ChannelControl.setFadePointRamp(
+  ulong dspclock,
+  float volume
+);
+
+ +
Channel.setFadePointRamp(
+  dspclock,
+  volume
+);
+ChannelGroup.setFadePointRamp(
+  dspclock,
+  volume
+);
+
+ +
+
dspclock
+
+

Time at which the ramp will end, as measured by the DSP clock of the parent ChannelGroup.

+
    +
  • Units: Samples
  • +
+
+
volume
+
+

Volume level at the given dspclock. 0 = silent, 1 = full.

+
    +
  • Units: Linear
  • +
  • Range: [0, inf)
  • +
+
+
+

This is a convenience function that creates a scheduled 64 sample fade point ramp from the current volume level to volume arriving at dspclock time.

+

Can be use in conjunction with ChannelControl::SetDelay.

+

All fade points after dspclock will be removed.

+

See Also: ChannelControl::removeFadePoints, ChannelControl::addFadePoint, ChannelControl::getFadePoints

+

ChannelControl::setLowPassGain

+

Sets the gain of the dry signal when built in lowpass / distance filtering is applied.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setLowPassGain(
+  float gain
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetLowPassGain(
+  FMOD_CHANNEL *channel,
+  float gain
+);
+FMOD_RESULT FMOD_ChannelGroup_SetLowPassGain(
+  FMOD_CHANNELGROUP *channelgroup,
+  float gain
+);
+
+ +
RESULT ChannelControl.setLowPassGain(
+  float gain
+);
+
+ +
Channel.setLowPassGain(
+  gain
+);
+ChannelGroup.setLowPassGain(
+  gain
+);
+
+ +
+
gain
+
+

gain level where 0 represents silent (full filtering) and 1 represents full volume (no filtering).

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

Requires the built in lowpass to be created with FMOD_INIT_CHANNEL_LOWPASS or FMOD_INIT_CHANNEL_DISTANCEFILTER.

+
+

Currently only supported for Channel, not ChannelGroup.

+
+

See Also: ChannelControl::getLowPassGain

+

ChannelControl::setMixLevelsInput

+

Sets the incoming volume level for each channel of a multi-channel signal.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setMixLevelsInput(
+  float *levels,
+  int numlevels
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetMixLevelsInput(
+  FMOD_CHANNEL *channel,
+  float *levels,
+  int numlevels
+);
+FMOD_RESULT FMOD_ChannelGroup_SetMixLevelsInput(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *levels,
+  int numlevels
+);
+
+ +
RESULT ChannelControl.setMixLevelsInput(
+  float[] levels,
+  int numlevels
+);
+
+ +
Channel.setMixLevelsInput(
+  levels,
+  numlevels
+);
+ChannelGroup.setMixLevelsInput(
+  levels,
+  numlevels
+);
+
+ +
+
levels
+
+

Array of volume levels for each incoming channel. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
numlevels
+
+

Number of levels in the array.

+ +
+
+

This is a convenience function to avoid passing a matrix, it will overwrite values set via ChannelControl::setPan, ChannelControl::setMixLevelsOutput and ChannelControl::setMixMatrix.

+
+

Currently only supported for Channel, not ChannelGroup.

+
+

See Also: ChannelControl::getMixMatrix

+

ChannelControl::setMixLevelsOutput

+

Sets the outgoing volume levels for each speaker.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setMixLevelsOutput(
+  float frontleft,
+  float frontright,
+  float center,
+  float lfe,
+  float surroundleft,
+  float surroundright,
+  float backleft,
+  float backright
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetMixLevelsOutput(
+  FMOD_CHANNEL *channel,
+  float frontleft,
+  float frontright,
+  float center,
+  float lfe,
+  float surroundleft,
+  float surroundright,
+  float backleft,
+  float backright
+);
+FMOD_RESULT FMOD_ChannelGroup_SetMixLevelsOutput(
+  FMOD_CHANNELGROUP *channelgroup,
+  float frontleft,
+  float frontright,
+  float center,
+  float lfe,
+  float surroundleft,
+  float surroundright,
+  float backleft,
+  float backright
+);
+
+ +
RESULT ChannelControl.setMixLevelsOutput(
+  float frontleft,
+  float frontright,
+  float center,
+  float lfe,
+  float surroundleft,
+  float surroundright,
+  float backleft,
+  float backright
+);
+
+ +
Channel.setMixLevelsOutput(
+  frontleft,
+  frontright,
+  center,
+  lfe,
+  surroundleft,
+  surroundright,
+  backleft,
+  backright
+);
+ChannelGroup.setMixLevelsOutput(
+  frontleft,
+  frontright,
+  center,
+  lfe,
+  surroundleft,
+  surroundright,
+  backleft,
+  backright
+);
+
+ +
+
frontleft
+
+

Volume level for FMOD_SPEAKER_FRONT_LEFT. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
frontright
+
+

Volume level for FMOD_SPEAKER_FRONT_RIGHT. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
center
+
+

Volume level for FMOD_SPEAKER_FRONT_CENTER. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
lfe
+
+

Volume level for FMOD_SPEAKER_LOW_FREQUENCY. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
surroundleft
+
+

Volume level for FMOD_SPEAKER_SURROUND_LEFT. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
surroundright
+
+

Volume level for FMOD_SPEAKER_SURROUND_RIGHT. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
backleft
+
+

Volume level for FMOD_SPEAKER_BACK_LEFT. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
backright
+
+

Volume level for FMOD_SPEAKER_BACK_RIGHT. Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
+

Specify the level for a given output speaker, if the channel count of the input and output do not match, channels will be up/down mixed as appropriate to approximate the given speaker values. For example stereo input with 5.1 output will use the center parameter to distribute signal to the center speaker from front left and front right channels.

+

This is a convenience function to avoid passing a matrix, it will overwrite values set via ChannelControl::setPan, ChannelControl::setMixLevelsInput and ChannelControl::setMixMatrix.

+

The output channel count will always match the System speaker mode set via System::setSoftwareFormat.

+

If the System is initialized with FMOD_SPEAKERMODE_RAW calling this function will produce silence.

+

See Also: ChannelControl::getMixMatrix

+

ChannelControl::setMixMatrix

+

Sets a two-dimensional pan matrix that maps the signal from input channels (columns) to output speakers (rows).

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setMixMatrix(
+  float *matrix,
+  int outchannels,
+  int inchannels,
+  int inchannel_hop = 0
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetMixMatrix(
+  FMOD_CHANNEL *channel,
+  float *matrix,
+  int outchannels,
+  int inchannels,
+  int inchannel_hop
+);
+FMOD_RESULT FMOD_ChannelGroup_SetMixMatrix(
+  FMOD_CHANNELGROUP *channelgroup,
+  float *matrix,
+  int outchannels,
+  int inchannels,
+  int inchannel_hop
+);
+
+ +
RESULT ChannelControl.setMixMatrix(
+  float[] matrix,
+  int outchannels,
+  int inchannels,
+  int inchannel_hop = 0
+);
+
+ +
Channel.setMixMatrix(
+  matrix,
+  outchannels,
+  inchannels,
+  inchannel_hop
+);
+ChannelGroup.setMixMatrix(
+  matrix,
+  outchannels,
+  inchannels,
+  inchannel_hop
+);
+
+ +
+
matrix Opt
+
+

Two dimensional array of volume levels in row-major order. Each row represents an output speaker, each column represents an input channel.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
outchannels
+
+

Number of output channels (rows) in matrix.

+ +
+
inchannels
+
+

Number of input channels (columns) in matrix.

+ +
+
inchannel_hop Opt
+
Width (total number of columns) in source matrix. A matrix element is referenced as 'outchannel * inchannel_hop + inchannel'.
+
+ +

This will overwrite values set via ChannelControl::setPan, ChannelControl::setMixLevelsInput and ChannelControl::setMixLevelsOutput.

+

If no matrix is passed in via matrix a default upmix, downmix, or unit matrix will take its place. A unit matrix allows a signal to pass through unchanged.

+

Example 5.1 unit matrix:

+
1 0 0 0 0 0 
+0 1 0 0 0 0 
+0 0 1 0 0 0 
+0 0 0 1 0 0 
+0 0 0 0 1 0 
+0 0 0 0 0 1
+
+

Matrix element values can be below 0 to invert a signal and above 1 to amplify the signal. Note that increasing the signal level too far may cause audible distortion.

+

See Also: ChannelControl::getMixMatrix

+

ChannelControl::setMode

+

Sets the playback mode that controls how this object behaves.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setMode(
+  FMOD_MODE mode
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetMode(
+  FMOD_CHANNEL *channel,
+  FMOD_MODE mode
+);
+FMOD_RESULT FMOD_ChannelGroup_SetMode(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_MODE mode
+);
+
+ +
RESULT ChannelControl.setMode(
+  MODE mode
+);
+
+ +
Channel.setMode(
+  mode
+);
+ChannelGroup.setMode(
+  mode
+);
+
+ +
+
mode
+
+

Playback mode. More than one mode can be set at once by combining them with the OR operator. (FMOD_MODE)

+ +
+
+

Modes supported:

+ +

When changing the loop mode, sounds created with System::createStream or FMOD_CREATESTREAM may have already been pre-buffered and executed their loop logic ahead of time before this call was even made. This is dependent on the size of the sound versus the size of the stream decode buffer (see FMOD_CREATESOUNDEXINFO). If this happens, you may need to reflush the stream buffer by calling Channel::setPosition. Note this will usually only happen if you have sounds or loop points that are smaller than the stream decode buffer size.

+

When changing the loop mode of sounds created with with System::createSound or FMOD_CREATESAMPLE, if the sound was set up as FMOD_LOOP_OFF, then set to FMOD_LOOP_NORMAL with this function, the sound may click when playing the end of the sound. This is because the sound needs to be prepared for looping using Sound::setMode, by modifying the content of the PCM data (i.e. data past the end of the actual sample data) to allow the interpolators to read ahead without clicking. If you use ChannelControl::setMode it will not do this (because different Channels may have different loop modes for the same sound) and may click if you try to set it to looping on an unprepared sound. If you want to change the loop mode at runtime it may be better to load the sound as looping first (or use Sound::setMode), to let it prepare the data as if it was looping so that it does not click whenever ChannelControl::setMode is used to turn looping on.

+

If FMOD_3D_IGNOREGEOMETRY or FMOD_VIRTUAL_PLAYFROMSTART is not specified, the flag will be cleared if it was specified previously.

+

See Also: ChannelControl::getMode

+

ChannelControl::setMute

+

Sets the mute state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setMute(
+  bool mute
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetMute(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL mute
+);
+FMOD_RESULT FMOD_ChannelGroup_SetMute(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL mute
+);
+
+ +
RESULT ChannelControl.setMute(
+  bool mute
+);
+
+ +
Channel.setMute(
+  mute
+);
+ChannelGroup.setMute(
+  mute
+);
+
+ +
+
mute
+
+

Mute state. True = silent. False = audible.

+
    +
  • Units: Boolean
  • +
+
+
+

Mute is an additional control for volume, the effect of which is equivalent to setting the volume to zero.

+

An individual mute state is kept for each object, muting a parent ChannelGroup will effectively mute this object however when queried the individual mute state is returned. ChannelControl::getAudibility can be used to calculate overall audibility for a Channel or ChannelGroup.

+

See Also: ChannelControl::getMute

+

ChannelControl::setPan

+

Sets the left/right pan level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setPan(
+  float pan
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetPan(
+  FMOD_CHANNEL *channel,
+  float pan
+);
+FMOD_RESULT FMOD_ChannelGroup_SetPan(
+  FMOD_CHANNELGROUP *channelgroup,
+  float pan
+);
+
+ +
RESULT ChannelControl.setPan(
+  float pan
+);
+
+ +
Channel.setPan(
+  pan
+);
+ChannelGroup.setPan(
+  pan
+);
+
+ +
+
pan
+
+

Pan level where -1 represents full left, 0 represents center and 1 represents full right.

+
    +
  • Range: [-1, 1]
  • +
  • Default: 0
  • +
+
+
+

This is a convenience function to avoid passing a matrix, it will overwrite values set via ChannelControl::setMixLevelsInput, ChannelControl::setMixLevelsOutput and ChannelControl::setMixMatrix.

+

Mono inputs are panned from left to right using constant power panning (non linear fade). Stereo and greater inputs will isolate the front left and right input channels and fade them up and down based on the pan value (silencing other channels). The output channel count will always match the System speaker mode set via System::setSoftwareFormat.

+

If the System is initialized with FMOD_SPEAKERMODE_RAW calling this function will produce silence.

+

See Also: ChannelControl::getMixMatrix

+

ChannelControl::setPaused

+

Sets the paused state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setPaused(
+  bool paused
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetPaused(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL paused
+);
+FMOD_RESULT FMOD_ChannelGroup_SetPaused(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL paused
+);
+
+ +
RESULT ChannelControl.setPaused(
+  bool paused
+);
+
+ +
Channel.setPaused(
+  paused
+);
+ChannelGroup.setPaused(
+  paused
+);
+
+ +
+
paused
+
+

Paused state. True = playback halted. False = playback active.

+
    +
  • Units: Boolean
  • +
+
+
+

Pause halts playback which effectively freezes Channel::getPosition and ChannelControl::getDSPClock values.

+

An individual pause state is kept for each object, pausing a parent ChannelGroup will effectively pause this object however when queried the individual pause state is returned.

+

See Also: ChannelControl::getPaused

+

ChannelControl::setPitch

+

Sets the relative pitch / playback rate.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setPitch(
+  float pitch
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetPitch(
+  FMOD_CHANNEL *channel,
+  float pitch
+);
+FMOD_RESULT FMOD_ChannelGroup_SetPitch(
+  FMOD_CHANNELGROUP *channelgroup,
+  float pitch
+);
+
+ +
RESULT ChannelControl.setPitch(
+  float pitch
+);
+
+ +
Channel.setPitch(
+  pitch
+);
+ChannelGroup.setPitch(
+  pitch
+);
+
+ +
+
pitch
+
Pitch value where 0.5 represents half pitch (one octave down), 1.0 represents unmodified pitch and 2.0 represents double pitch (one octave up).
+
+

Scales playback frequency of Channel object or if issued on a ChannelGroup it scales the frequencies of all Channels contained in the ChannelGroup.

+

An individual pitch value is kept for each object, changing the pitch of a parent ChannelGroup will effectively alter the pitch of this object however when queried the individual pitch value is returned.

+

See Also: ChannelControl::getPitch, Channel::setFrequency, Channel::getFrequency

+

ChannelControl::setReverbProperties

+

Sets the wet / send level for a particular reverb instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setReverbProperties(
+  int instance,
+  float wet
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetReverbProperties(
+  FMOD_CHANNEL *channel,
+  int instance,
+  float wet
+);
+FMOD_RESULT FMOD_ChannelGroup_SetReverbProperties(
+  FMOD_CHANNELGROUP *channelgroup,
+  int instance,
+  float wet
+);
+
+ +
RESULT ChannelControl.setReverbProperties(
+  int instance,
+  float wet
+);
+
+ +
Channel.setReverbProperties(
+  instance,
+  wet
+);
+ChannelGroup.setReverbProperties(
+  instance,
+  wet
+);
+
+ +
+
instance
+
+

Reverb instance index.

+ +
+
wet
+
+

Send level for the signal to the reverb. 0 = none, 1 = full. Negative level inverts the signal.

+ +
+
+

Channels are automatically connected to all existing reverb instances due to the default wet level of 1. ChannelGroups however will not send to any reverb by default requiring an explicit call to this function.

+

ChannelGroup reverb is optimal for the case where you want to send 1 mixed signal to the reverb, rather than a lot of individual Channel reverb sends. It is advisable to do this to reduce CPU if you have many Channels inside a ChannelGroup.

+

When setting a wet level for a ChannelGroup, any Channels under that ChannelGroup will still have their existing sends to the reverb. To avoid this doubling up you should explicitly set the Channel wet levels to 0.

+

See Also: ChannelControl::getReverbProperties

+

ChannelControl::setUserData

+

Sets a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetUserData(
+  FMOD_CHANNEL *channel,
+  void *userdata
+);
+FMOD_RESULT FMOD_ChannelGroup_SetUserData(
+  FMOD_CHANNELGROUP *channelgroup,
+  void *userdata
+);
+
+ +
RESULT ChannelControl.setUserData(
+  IntPtr userdata
+);
+
+ +
Channel.setUserData(
+  userdata
+);
+ChannelGroup.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
Value stored on this object.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: ChannelControl::getUserData, ChannelControl::setCallback

+

ChannelControl::setVolume

+

Sets the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setVolume(
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetVolume(
+  FMOD_CHANNEL *channel,
+  float volume
+);
+FMOD_RESULT FMOD_ChannelGroup_SetVolume(
+  FMOD_CHANNELGROUP *channelgroup,
+  float volume
+);
+
+ +
RESULT ChannelControl.setVolume(
+  float volume
+);
+
+ +
Channel.setVolume(
+  volume
+);
+ChannelGroup.setVolume(
+  volume
+);
+
+ +
+
volume
+
+

Volume level. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
+

To define the volume per Sound use Sound::setDefaults.

+

Setting volume at a level higher than 1 can lead to distortion/clipping.

+

See Also: ChannelControl::getVolume

+

ChannelControl::setVolumeRamp

+

Sets whether volume changes are ramped or instantaneous.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::setVolumeRamp(
+  bool ramp
+);
+
+ +
FMOD_RESULT FMOD_Channel_SetVolumeRamp(
+  FMOD_CHANNEL *channel,
+  FMOD_BOOL ramp
+);
+FMOD_RESULT FMOD_ChannelGroup_SetVolumeRamp(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL ramp
+);
+
+ +
RESULT ChannelControl.setVolumeRamp(
+  bool ramp
+);
+
+ +
Channel.setVolumeRamp(
+  ramp
+);
+ChannelGroup.setVolumeRamp(
+  ramp
+);
+
+ +
+
ramp
+
+

Ramp state. True = volume change is ramped. False = volume change is instantaeous.

+
    +
  • Units: Boolean
  • +
  • Default: True
  • +
+
+
+

Volume changes when not paused will be ramped to the target value to avoid a pop sound, this function allows that setting to be overridden and volume changes to be applied immediately.

+

See Also: ChannelControl::getVolumeRamp

+

ChannelControl::stop

+

Stops the Channel (or all Channels in nested ChannelGroups) from playing.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelControl::stop();
+
+ +
FMOD_RESULT FMOD_Channel_Stop(FMOD_CHANNEL *channel);
+FMOD_RESULT FMOD_ChannelGroup_Stop(FMOD_CHANNELGROUP *channelgroup);
+
+ +
RESULT ChannelControl.stop();
+
+ +
Channel.stop();
+ChannelGroup.stop();
+
+ +

This will free up internal resources for reuse by the virtual voice system.

+

Channels are stopped automatically when their playback position reaches the length of the Sound being played. This is not the case however if the Channel is playing a DSP or the Sound is looping, in which case the Channel will continue playing until stop is called. Once stopped, the Channel handle will become invalid and can be discarded and any API calls made with it will return FMOD_ERR_INVALID_HANDLE.

+

See Also: System::playSound, Channel::getPosition, Sound::getLength, System::playDSP

+

FMOD_CHANNELCONTROL_TYPE

+

Identifier used to distinguish between Channel and ChannelGroup in the ChannelControl callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_CHANNELCONTROL_TYPE {
+  FMOD_CHANNELCONTROL_CHANNEL,
+  FMOD_CHANNELCONTROL_CHANNELGROUP,
+  FMOD_CHANNELCONTROL_MAX,
+} FMOD_CHANNELCONTROL_TYPE;
+
+ +
enum CHANNELCONTROL_TYPE : int
+{
+    CHANNEL,
+    CHANNELGROUP,
+    MAX
+}
+
+ +
CHANNELCONTROL_CHANNEL
+CHANNELCONTROL_CHANNELGROUP
+CHANNELCONTROL_MAX
+
+ +
+
FMOD_CHANNELCONTROL_CHANNEL
+
Type representing Channel
+
FMOD_CHANNELCONTROL_CHANNELGROUP
+
Type representing ChannelGroup
+
FMOD_CHANNELCONTROL_MAX
+
Maximum number of ChannelControl types.
+
+

See Also: ChannelControl::setCallback

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channelgroup.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channelgroup.html new file mode 100644 index 0000000..335d2c3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-channelgroup.html @@ -0,0 +1,466 @@ + + +Core API Reference | ChannelGroup + + + + +
+ +
+

7. Core API Reference | ChannelGroup

+

A submix in the mixing hierarchy akin to a bus that can contain both Channel and ChannelGroup objects.

+

Create with System::createChannelGroup.

+

Channel management:

+ +

ChannelGroup management:

+ +

General:

+ +

The following APIs are inherited from ChannelControl:

+

Playback:

+ +

Volume levels:

+ +

Spatialization:

+ +

Panning and level adjustment:

+ +

Filtering:

+ +

DSP chain configuration:

+ +

Sample accurate scheduling:

+ +

General:

+ +

ChannelGroup::addGroup

+

Adds a ChannelGroup as an input to this group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::addGroup(
+  ChannelGroup *group,
+  bool propagatedspclock = true,
+  DSPConnection **connection = nullptr
+);
+
+ +
FMOD_RESULT FMOD_ChannelGroup_AddGroup(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_CHANNELGROUP *group,
+  FMOD_BOOL propagatedspclock,
+  FMOD_DSPCONNECTION **connection
+);
+
+ +
RESULT ChannelGroup.addGroup(
+  ChannelGroup group,
+  bool propagatedspclock = true
+);
+RESULT ChannelGroup.addGroup(
+  ChannelGroup group,
+  bool propagatedspclock,
+  out DSPConnection connection
+);
+
+ +
ChannelGroup.addGroup(
+  group,
+  propagatedspclock,
+  connection
+);
+
+ +
+
group
+
Group to add. (ChannelGroup)
+
propagatedspclock
+
+

Recursively propagate this object's clock values to group.

+
    +
  • Units: Boolean
  • +
+
+
connection OutOpt
+
Connection between the head DSP of group and the tail DSP of this object. (DSPConnection)
+
+

See Also: ChannelGroup::getNumGroups, ChannelGroup::getGroup, ChannelGroup::getParentGroup

+

ChannelGroup::getChannel

+

Retrieves the Channel at the specified index in the list of Channel inputs.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::getChannel(
+  int index,
+  Channel **channel
+);
+
+ +
FMOD_RESULT FMOD_ChannelGroup_GetChannel(
+  FMOD_CHANNELGROUP *channelgroup,
+  int index,
+  FMOD_CHANNEL **channel
+);
+
+ +
RESULT ChannelGroup.getChannel(
+  int index,
+  out Channel channel
+);
+
+ +
ChannelGroup.getChannel(
+  index,
+  channel
+);
+
+ +
+
index
+
+

Offset into the list of Channel inputs.

+ +
+
channel Out
+
Channel at the specified index. (Channel)
+
+

ChannelGroup::getGroup

+

Retrieves the ChannelGroup at the specified index in the list of group inputs.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::getGroup(
+  int index,
+  ChannelGroup **group
+);
+
+ +
FMOD_RESULT FMOD_ChannelGroup_GetGroup(
+  FMOD_CHANNELGROUP *channelgroup,
+  int index,
+  FMOD_CHANNELGROUP **group
+);
+
+ +
RESULT ChannelGroup.getGroup(
+  int index,
+  out ChannelGroup group
+);
+
+ +
ChannelGroup.getGroup(
+  index,
+  group
+);
+
+ +
+
index
+
+

Offset into the list of group inputs.

+ +
+
group Out
+
Group at the specified index. (ChannelGroup)
+
+

See Also: ChannelGroup::addGroup, ChannelGroup::getParentGroup

+

ChannelGroup::getName

+

Retrieves the name set when the group was created.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::getName(
+  char *name,
+  int namelen
+);
+
+ +
FMOD_RESULT FMOD_ChannelGroup_GetName(
+  FMOD_CHANNELGROUP *channelgroup,
+  char *name,
+  int namelen
+);
+
+ +
RESULT ChannelGroup.getName(
+  out string name,
+  int namelen
+);
+
+ +
ChannelGroup.getName(
+  name
+);
+
+ +
+
name Out
+
Name of the group. (UTF-8 string)
+
namelen
+
+

Length of name.

+
    +
  • Units: Bytes
  • +
+
+
+

See Also: System::getMasterChannelGroup, System::createChannelGroup

+

ChannelGroup::getNumChannels

+

Retrieves the number of Channels that feed into to this group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::getNumChannels(
+  int *numchannels
+);
+
+ +
FMOD_RESULT FMOD_ChannelGroup_GetNumChannels(
+  FMOD_CHANNELGROUP *channelgroup,
+  int *numchannels
+);
+
+ +
RESULT ChannelGroup.getNumChannels(
+  out int numchannels
+);
+
+ +
ChannelGroup.getNumChannels(
+  numchannels
+);
+
+ +
+
numchannels Out
+
Number of Channels.
+
+

See Also: ChannelGroup::getChannel

+

ChannelGroup::getNumGroups

+

Retrieves the number of ChannelGroups that feed into to this group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::getNumGroups(
+  int *numgroups
+);
+
+ +
FMOD_RESULT FMOD_ChannelGroup_GetNumGroups(
+  FMOD_CHANNELGROUP *channelgroup,
+  int *numgroups
+);
+
+ +
RESULT ChannelGroup.getNumGroups(
+  out int numgroups
+);
+
+ +
ChannelGroup.getNumGroups(
+  numgroups
+);
+
+ +
+
numgroups Out
+
Number of ChannelGroups.
+
+

See Also: ChannelGroup::addGroup, ChannelGroup::getGroup, ChannelGroup::getParentGroup

+

ChannelGroup::getParentGroup

+

Retrieves the ChannelGroup this object outputs to.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::getParentGroup(
+  ChannelGroup **group
+);
+
+ +
FMOD_RESULT FMOD_ChannelGroup_GetParentGroup(
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_CHANNELGROUP **group
+);
+
+ +
RESULT ChannelGroup.getParentGroup(
+  out ChannelGroup group
+);
+
+ +
ChannelGroup.getParentGroup(
+  group
+);
+
+ +
+
group Out
+
Output group. (ChannelGroup)
+
+

See Also: ChannelGroup::addGroup, ChannelGroup::getNumGroups, ChannelGroup::getGroup

+

ChannelGroup::release

+

Frees the memory for the group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT ChannelGroup::release();
+
+ +
FMOD_RESULT FMOD_ChannelGroup_Release(FMOD_CHANNELGROUP *channelgroup);
+
+ +
RESULT ChannelGroup.release();
+
+ +
ChannelGroup.release();
+
+ +

Any Channels or ChannelGroups feeding into this group are moved to the master ChannelGroup.

+

See Also: System::createChannelGroup, System::getMasterChannelGroup

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-common-dsp-effects.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-common-dsp-effects.html new file mode 100644 index 0000000..810ac5a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-common-dsp-effects.html @@ -0,0 +1,4999 @@ + + +Core API Reference | Effect Parameters + + + + +
+ +
+

7. Core API Reference | Effect Parameters

+

These are the parameters for controlling digital signal processors.

+

DSP Types:

+ +

DSP Parameters:

+ +

DSP Parameter Types:

+ +

FMOD_DSP_CHANNELMIX

+

Channel Mix DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_CHANNELMIX {
+  FMOD_DSP_CHANNELMIX_OUTPUTGROUPING,
+  FMOD_DSP_CHANNELMIX_GAIN_CH0,
+  FMOD_DSP_CHANNELMIX_GAIN_CH1,
+  FMOD_DSP_CHANNELMIX_GAIN_CH2,
+  FMOD_DSP_CHANNELMIX_GAIN_CH3,
+  FMOD_DSP_CHANNELMIX_GAIN_CH4,
+  FMOD_DSP_CHANNELMIX_GAIN_CH5,
+  FMOD_DSP_CHANNELMIX_GAIN_CH6,
+  FMOD_DSP_CHANNELMIX_GAIN_CH7,
+  FMOD_DSP_CHANNELMIX_GAIN_CH8,
+  FMOD_DSP_CHANNELMIX_GAIN_CH9,
+  FMOD_DSP_CHANNELMIX_GAIN_CH10,
+  FMOD_DSP_CHANNELMIX_GAIN_CH11,
+  FMOD_DSP_CHANNELMIX_GAIN_CH12,
+  FMOD_DSP_CHANNELMIX_GAIN_CH13,
+  FMOD_DSP_CHANNELMIX_GAIN_CH14,
+  FMOD_DSP_CHANNELMIX_GAIN_CH15,
+  FMOD_DSP_CHANNELMIX_GAIN_CH16,
+  FMOD_DSP_CHANNELMIX_GAIN_CH17,
+  FMOD_DSP_CHANNELMIX_GAIN_CH18,
+  FMOD_DSP_CHANNELMIX_GAIN_CH19,
+  FMOD_DSP_CHANNELMIX_GAIN_CH20,
+  FMOD_DSP_CHANNELMIX_GAIN_CH21,
+  FMOD_DSP_CHANNELMIX_GAIN_CH22,
+  FMOD_DSP_CHANNELMIX_GAIN_CH23,
+  FMOD_DSP_CHANNELMIX_GAIN_CH24,
+  FMOD_DSP_CHANNELMIX_GAIN_CH25,
+  FMOD_DSP_CHANNELMIX_GAIN_CH26,
+  FMOD_DSP_CHANNELMIX_GAIN_CH27,
+  FMOD_DSP_CHANNELMIX_GAIN_CH28,
+  FMOD_DSP_CHANNELMIX_GAIN_CH29,
+  FMOD_DSP_CHANNELMIX_GAIN_CH30,
+  FMOD_DSP_CHANNELMIX_GAIN_CH31,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH0,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH1,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH2,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH3,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH4,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH5,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH6,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH7,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH8,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH9,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH10,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH11,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH12,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH13,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH14,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH15,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH16,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH17,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH18,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH19,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH20,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH21,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH22,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH23,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH24,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH25,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH26,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH27,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH28,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH29,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH30,
+  FMOD_DSP_CHANNELMIX_OUTPUT_CH31
+} FMOD_DSP_CHANNELMIX;
+
+ +
enum DSP_CHANNELMIX
+{
+  OUTPUTGROUPING,
+  GAIN_CH0,
+  GAIN_CH1,
+  GAIN_CH2,
+  GAIN_CH3,
+  GAIN_CH4,
+  GAIN_CH5,
+  GAIN_CH6,
+  GAIN_CH7,
+  GAIN_CH8,
+  GAIN_CH9,
+  GAIN_CH10,
+  GAIN_CH11,
+  GAIN_CH12,
+  GAIN_CH13,
+  GAIN_CH14,
+  GAIN_CH15,
+  GAIN_CH16,
+  GAIN_CH17,
+  GAIN_CH18,
+  GAIN_CH19,
+  GAIN_CH20,
+  GAIN_CH21,
+  GAIN_CH22,
+  GAIN_CH23,
+  GAIN_CH24,
+  GAIN_CH25,
+  GAIN_CH26,
+  GAIN_CH27,
+  GAIN_CH28,
+  GAIN_CH29,
+  GAIN_CH30,
+  GAIN_CH31,
+  OUTPUT_CH0,
+  OUTPUT_CH1,
+  OUTPUT_CH2,
+  OUTPUT_CH3,
+  OUTPUT_CH4,
+  OUTPUT_CH5,
+  OUTPUT_CH6,
+  OUTPUT_CH7,
+  OUTPUT_CH8,
+  OUTPUT_CH9,
+  OUTPUT_CH10,
+  OUTPUT_CH11,
+  OUTPUT_CH12,
+  OUTPUT_CH13,
+  OUTPUT_CH14,
+  OUTPUT_CH15,
+  OUTPUT_CH16,
+  OUTPUT_CH17,
+  OUTPUT_CH18,
+  OUTPUT_CH19,
+  OUTPUT_CH20,
+  OUTPUT_CH21,
+  OUTPUT_CH22,
+  OUTPUT_CH23,
+  OUTPUT_CH24,
+  OUTPUT_CH25,
+  OUTPUT_CH26,
+  OUTPUT_CH27,
+  OUTPUT_CH28,
+  OUTPUT_CH29,
+  OUTPUT_CH30,
+  OUTPUT_CH31
+}
+
+ +
FMOD.DSP_CHANNELMIX_OUTPUTGROUPING
+FMOD.DSP_CHANNELMIX_GAIN_CH0
+FMOD.DSP_CHANNELMIX_GAIN_CH1
+FMOD.DSP_CHANNELMIX_GAIN_CH2
+FMOD.DSP_CHANNELMIX_GAIN_CH3
+FMOD.DSP_CHANNELMIX_GAIN_CH4
+FMOD.DSP_CHANNELMIX_GAIN_CH5
+FMOD.DSP_CHANNELMIX_GAIN_CH6
+FMOD.DSP_CHANNELMIX_GAIN_CH7
+FMOD.DSP_CHANNELMIX_GAIN_CH8
+FMOD.DSP_CHANNELMIX_GAIN_CH9
+FMOD.DSP_CHANNELMIX_GAIN_CH10
+FMOD.DSP_CHANNELMIX_GAIN_CH11
+FMOD.DSP_CHANNELMIX_GAIN_CH12
+FMOD.DSP_CHANNELMIX_GAIN_CH13
+FMOD.DSP_CHANNELMIX_GAIN_CH14
+FMOD.DSP_CHANNELMIX_GAIN_CH15
+FMOD.DSP_CHANNELMIX_GAIN_CH16
+FMOD.DSP_CHANNELMIX_GAIN_CH17
+FMOD.DSP_CHANNELMIX_GAIN_CH18
+FMOD.DSP_CHANNELMIX_GAIN_CH19
+FMOD.DSP_CHANNELMIX_GAIN_CH20
+FMOD.DSP_CHANNELMIX_GAIN_CH21
+FMOD.DSP_CHANNELMIX_GAIN_CH22
+FMOD.DSP_CHANNELMIX_GAIN_CH23
+FMOD.DSP_CHANNELMIX_GAIN_CH24
+FMOD.DSP_CHANNELMIX_GAIN_CH25
+FMOD.DSP_CHANNELMIX_GAIN_CH26
+FMOD.DSP_CHANNELMIX_GAIN_CH27
+FMOD.DSP_CHANNELMIX_GAIN_CH28
+FMOD.DSP_CHANNELMIX_GAIN_CH29
+FMOD.DSP_CHANNELMIX_GAIN_CH30
+FMOD.DSP_CHANNELMIX_GAIN_CH31
+FMOD.DSP_CHANNELMIX_OUTPUT_CH0,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH1,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH2,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH3,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH4,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH5,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH6,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH7,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH8,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH9,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH10,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH11,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH12,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH13,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH14,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH15,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH16,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH17,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH18,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH19,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH20,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH21,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH22,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH23,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH24,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH25,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH26,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH27,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH28,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH29,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH30,
+FMOD.DSP_CHANNELMIX_OUTPUT_CH31
+
+ +
+
FMOD_DSP_CHANNELMIX_OUTPUTGROUPING
+
+

Channel mix output grouping. (FMOD_DSP_CHANNELMIX_OUTPUT)

+ +
+
FMOD_DSP_CHANNELMIX_GAIN_CH0
+
+

Channel #0 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH1
+
+

Channel #1 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH2
+
+

Channel #2 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH3
+
+

Channel #3 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH4
+
+

Channel #4 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH5
+
+

Channel #5 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH6
+
+

Channel #6 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH7
+
+

Channel #7 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH8
+
+

Channel #8 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH9
+
+

Channel #9 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH10
+
+

Channel #10 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH11
+
+

Channel #11 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH12
+
+

Channel #12 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH13
+
+

Channel #13 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH14
+
+

Channel #14 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH15
+
+

Channel #15 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH16
+
+

Channel #16 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH17
+
+

Channel #17 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH18
+
+

Channel #18 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH19
+
+

Channel #19 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH20
+
+

Channel #20 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH21
+
+

Channel #21 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH22
+
+

Channel #22 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH23
+
+

Channel #23 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH24
+
+

Channel #24 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH25
+
+

Channel #25 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH26
+
+

Channel #26 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH27
+
+

Channel #27 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH28
+
+

Channel #28 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH29
+
+

Channel #29 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH30
+
+

Channel #30 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_GAIN_CH31
+
+

Channel #31 gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH0
+
+

Output channel for Input channel #0

+
    +
  • Type: int
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH1
+
+

Output channel for Input channel #1

+
    +
  • Type: int
  • +
  • Default: 1
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH2
+
+

Output channel for Input channel #2

+
    +
  • Type: int
  • +
  • Default: 2
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH3
+
+

Output channel for Input channel #3

+
    +
  • Type: int
  • +
  • Default: 3
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH4
+
+

Output channel for Input channel #4

+
    +
  • Type: int
  • +
  • Default: 4
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH5
+
+

Output channel for Input channel #5

+
    +
  • Type: int
  • +
  • Default: 5
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH6
+
+

Output channel for Input channel #6

+
    +
  • Type: int
  • +
  • Default: 6
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH7
+
+

Output channel for Input channel #7

+
    +
  • Type: int
  • +
  • Default: 7
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH8
+
+

Output channel for Input channel #8

+
    +
  • Type: int
  • +
  • Default: 8
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH9
+
+

Output channel for Input channel #9

+
    +
  • Type: int
  • +
  • Default: 9
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH10
+
+

Output channel for Input channel #10

+
    +
  • Type: int
  • +
  • Default: 10
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH11
+
+

Output channel for Input channel #11

+
    +
  • Type: int
  • +
  • Default: 11
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH12
+
+

Output channel for Input channel #12

+
    +
  • Type: int
  • +
  • Default: 12
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH13
+
+

Output channel for Input channel #13

+
    +
  • Type: int
  • +
  • Default: 13
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH14
+
+

Output channel for Input channel #14

+
    +
  • Type: int
  • +
  • Default: 14
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH15
+
+

Output channel for Input channel #15

+
    +
  • Type: int
  • +
  • Default: 15
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH16
+
+

Output channel for Input channel #16

+
    +
  • Type: int
  • +
  • Default: 16
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH17
+
+

Output channel for Input channel #17

+
    +
  • Type: int
  • +
  • Default: 17
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH18
+
+

Output channel for Input channel #18

+
    +
  • Type: int
  • +
  • Default: 18
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH19
+
+

Output channel for Input channel #19

+
    +
  • Type: int
  • +
  • Default: 19
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH20
+
+

Output channel for Input channel #20

+
    +
  • Type: int
  • +
  • Default: 20
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH21
+
+

Output channel for Input channel #21

+
    +
  • Type: int
  • +
  • Default: 21
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH22
+
+

Output channel for Input channel #22

+
    +
  • Type: int
  • +
  • Default: 22
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH23
+
+

Output channel for Input channel #23

+
    +
  • Type: int
  • +
  • Default: 23
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH24
+
+

Output channel for Input channel #24

+
    +
  • Type: int
  • +
  • Default: 24
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH25
+
+

Output channel for Input channel #25

+
    +
  • Type: int
  • +
  • Default: 25
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH26
+
+

Output channel for Input channel #26

+
    +
  • Type: int
  • +
  • Default: 26
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH27
+
+

Output channel for Input channel #27

+
    +
  • Type: int
  • +
  • Default: 27
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH28
+
+

Output channel for Input channel #28

+
    +
  • Type: int
  • +
  • Default: 28
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH29
+
+

Output channel for Input channel #29

+
    +
  • Type: int
  • +
  • Default: 29
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH30
+
+

Output channel for Input channel #30

+
    +
  • Type: int
  • +
  • Default: 30
  • +
+
+
FMOD_DSP_CHANNELMIX_OUTPUT_CH31
+
+

Output channel for Input channel #31

+
    +
  • Type: int
  • +
  • Default: 31
  • +
+
+
+

For FMOD_DSP_CHANNELMIX_OUTPUTGROUPING, this value will set the output speaker format for the DSP. This determines the number of output channels.

+

If an input channel is mapped to an output channel in excess of the number of output channels, the input channel is instead mapped to the modulo of that channel's index. E.g.: If there are 4 output channels, an input channel mapped to output channel index 5 is mapped to index 1.

+

See Also: FMOD_DSP_TYPE_CHANNELMIX, DSP::setParameterInt, DSP::setParameterFloat, FMOD_DSP_TYPE

+

FMOD_DSP_CHANNELMIX_OUTPUT

+

Channel mix DSP output grouping types for the FMOD_DSP_CHANNELMIX_OUTPUTGROUPING parameter. Output grouping sets the output speaker format for the Channel Mix DSP. This determines the number of output channels.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_CHANNELMIX_OUTPUT {
+  FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT,
+  FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO,
+  FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO,
+  FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD,
+  FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1,
+  FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1,
+  FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE,
+  FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4
+} FMOD_DSP_CHANNELMIX_OUTPUT;
+
+ +
enum DSP_CHANNELMIX_OUTPUT
+{
+  DEFAULT,
+  ALLMONO,
+  ALLSTEREO,
+  ALLQUAD,
+  ALL5POINT1,
+  ALL7POINT1,
+  ALLLFE,
+  ALL7POINT1POINT4
+}
+
+ +
FMOD.DSP_CHANNELMIX_OUTPUT_DEFAULT
+FMOD.DSP_CHANNELMIX_OUTPUT_ALLMONO
+FMOD.DSP_CHANNELMIX_OUTPUT_ALLSTEREO
+FMOD.DSP_CHANNELMIX_OUTPUT_ALLQUAD
+FMOD.DSP_CHANNELMIX_OUTPUT_ALL5POINT1
+FMOD.DSP_CHANNELMIX_OUTPUT_ALL7POINT1
+FMOD.DSP_CHANNELMIX_OUTPUT_ALLLFE
+FMOD.DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4
+
+ +
+
FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT
+
Output channel count = input channel count. Mapping: See FMOD_SPEAKER enumeration.
+
FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO
+
Output channel count = 1. Mapping: Mono, Mono, Mono, Mono, Mono, Mono, ... (each channel all the way up to FMOD_MAX_CHANNEL_WIDTH channels are treated as if they were mono)
+
FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO
+
Output channel count = 2. Mapping: Left, Right, Left, Right, Left, Right, ... (each pair of channels is treated as stereo all the way up to FMOD_MAX_CHANNEL_WIDTH channels)
+
FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD
+
Output channel count = 4. Mapping: Repeating pattern of Front Left, Front Right, Surround Left, Surround Right.
+
FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1
+
Output channel count = 6. Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right.
+
FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1
+
Output channel count = 8. Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right.
+
FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE
+
Output channel count = 6. Mapping: Repeating pattern of LFE in a 5.1 output signal.
+
FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4
+
Output channel count = 12. Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right, Top Front Left, Top Front Right, Top Back Left, Top Back Right.
+
+

See Also: FMOD_DSP_CHANNELMIX_OUTPUTGROUPING, FMOD_DSP_TYPE_CHANNELMIX, DSP::setParameterInt, DSP::getParameterInt, FMOD_DSP_TYPE

+

FMOD_DSP_CHORUS

+

Chorus DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_CHORUS {
+  FMOD_DSP_CHORUS_MIX,
+  FMOD_DSP_CHORUS_RATE,
+  FMOD_DSP_CHORUS_DEPTH
+} FMOD_DSP_CHORUS;
+
+ +
enum DSP_CHORUS
+{
+  MIX,
+  RATE,
+  DEPTH,
+}
+
+ +
FMOD.DSP_CHORUS_MIX
+FMOD.DSP_CHORUS_RATE
+FMOD.DSP_CHORUS_DEPTH
+
+ +
+
FMOD_DSP_CHORUS_MIX
+
+

Percentage of wet signal in mix.

+
    +
  • Type: float
  • +
  • Units: Percentage
  • +
  • Range: [0, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_CHORUS_RATE
+
+

Chorus modulation rate.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [0, 20]
  • +
  • Default: 0.8
  • +
+
+
FMOD_DSP_CHORUS_DEPTH
+
+

Chorus modulation depth.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 100]
  • +
  • Default: 3
  • +
+
+
+

Chorus is an effect where the sound is more 'spacious' due a copy of the signal being played along side the original, but with the delay of each copy modulating on a sine wave. As there are 2 versions of the same signal (dry vs wet), by default each signal is given 50% mix, so that the total is not louder than the original unaffected signal.

+

See Also: FMOD_DSP_TYPE_CHORUS, DSP::setParameterFloat, DSP::getParameterFloat, FMOD_DSP_TYPE

+

FMOD_DSP_COMPRESSOR

+

Compressor DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_COMPRESSOR {
+  FMOD_DSP_COMPRESSOR_THRESHOLD,
+  FMOD_DSP_COMPRESSOR_RATIO,
+  FMOD_DSP_COMPRESSOR_ATTACK,
+  FMOD_DSP_COMPRESSOR_RELEASE,
+  FMOD_DSP_COMPRESSOR_GAINMAKEUP,
+  FMOD_DSP_COMPRESSOR_USESIDECHAIN,
+  FMOD_DSP_COMPRESSOR_LINKED
+} FMOD_DSP_COMPRESSOR;
+
+ +
enum DSP_COMPRESSOR
+{
+  THRESHOLD,
+  RATIO,
+  ATTACK,
+  RELEASE,
+  GAINMAKEUP,
+  USESIDECHAIN,
+  LINKED
+}
+
+ +
FMOD.DSP_COMPRESSOR_THRESHOLD
+FMOD.DSP_COMPRESSOR_RATIO
+FMOD.DSP_COMPRESSOR_ATTACK
+FMOD.DSP_COMPRESSOR_RELEASE
+FMOD.DSP_COMPRESSOR_GAINMAKEUP
+FMOD.DSP_COMPRESSOR_USESIDECHAIN
+FMOD.DSP_COMPRESSOR_LINKED
+
+ +
+
FMOD_DSP_COMPRESSOR_THRESHOLD
+
+

Threshold level.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-60, 0]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_COMPRESSOR_RATIO
+
+

Compression Ratio.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [1, 50]
  • +
  • Default: 2.5
  • +
+
+
FMOD_DSP_COMPRESSOR_ATTACK
+
+

Attack time.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0.1, 500]
  • +
  • Default: 20
  • +
+
+
FMOD_DSP_COMPRESSOR_RELEASE
+
+

Release time.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [10, 5000]
  • +
  • Default: 100
  • +
+
+
FMOD_DSP_COMPRESSOR_GAINMAKEUP
+
+

Make-up gain applied after limiting.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-30, 30]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_COMPRESSOR_USESIDECHAIN
+
Data of type FMOD_DSP_PARAMETER_SIDECHAIN. Whether to analyse the sidechain signal instead of the input signal. The FMOD_DSP_PARAMETER_SIDECHAIN::sidechainenable default is false.
+
FMOD_DSP_COMPRESSOR_LINKED
+
+

false = Independent (compressor per channel), true = Linked.

+
    +
  • Type: bool
  • +
  • Default: true
  • +
+
+
+

This is a multi-channel software limiter that is uniform across the whole spectrum.
+The limiter is not guaranteed to catch every peak above the threshold level, because it cannot apply gain reduction instantaneously - the time delay is determined by the attack time. However setting the attack time too short will distort the sound, so it is a compromise. High level peaks can be avoided by using a short attack time - but not too short, and setting the threshold a few decibels below the critical level.

+

See Also: FMOD_DSP_TYPE_COMPRESSOR, DSP::setParameterFloat, DSP::setParameterBool

+

FMOD_DSP_CONVOLUTION_REVERB

+

Convolution reverb DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_CONVOLUTION_REVERB {
+  FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR,
+  FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET,
+  FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY,
+  FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED
+} FMOD_DSP_CONVOLUTION_REVERB;
+
+ +
enum DSP_CONVOLUTION_REVERB
+{
+  IR,
+  WET,
+  DRY,
+  LINKED
+}
+
+ +
FMOD.DSP_CONVOLUTION_REVERB_PARAM_IR
+FMOD.DSP_CONVOLUTION_REVERB_PARAM_WET
+FMOD.DSP_CONVOLUTION_REVERB_PARAM_DRY
+FMOD.DSP_CONVOLUTION_REVERB_PARAM_LINKED
+
+ +
+
FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR
+
Array of signed 16-bit (short) PCM data to be used as reverb impulse response. First member of the array should be a 16 bit value (short) which specifies the number of channels. Array looks like [index 0=numchannels][index 1+ = raw 16 bit PCM data]. Data is copied internally so source can be freed.
+
FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET
+
+

Volume of echo signal to pass to output.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY
+
+

Original sound volume.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED
+
+

Linked - channels are mixed together before processing through the reverb.

+
    +
  • Type: bool
  • +
  • Default: true
  • +
+
+
+

Convolution reverb is a reverberation effect that uses a recording of a physical space known as an Impulse Response file (or IR file) to generate frequency specific reverberation.

+

See Also: FMOD_DSP_TYPE_CONVOLUTIONREVERB, DSP::setParameterFloat, DSP::setParameterData

+

FMOD_DSP_DELAY

+

Delay DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_DELAY {
+  FMOD_DSP_DELAY_CH0,
+  FMOD_DSP_DELAY_CH1,
+  FMOD_DSP_DELAY_CH2,
+  FMOD_DSP_DELAY_CH3,
+  FMOD_DSP_DELAY_CH4,
+  FMOD_DSP_DELAY_CH5,
+  FMOD_DSP_DELAY_CH6,
+  FMOD_DSP_DELAY_CH7,
+  FMOD_DSP_DELAY_CH8,
+  FMOD_DSP_DELAY_CH9,
+  FMOD_DSP_DELAY_CH10,
+  FMOD_DSP_DELAY_CH11,
+  FMOD_DSP_DELAY_CH12,
+  FMOD_DSP_DELAY_CH13,
+  FMOD_DSP_DELAY_CH14,
+  FMOD_DSP_DELAY_CH15,
+  FMOD_DSP_DELAY_MAXDELAY
+} FMOD_DSP_DELAY;
+
+ +
enum DSP_DELAY
+{
+  CH0,
+  CH1,
+  CH2,
+  CH3,
+  CH4,
+  CH5,
+  CH6,
+  CH7,
+  CH8,
+  CH9,
+  CH10,
+  CH11,
+  CH12,
+  CH13,
+  CH14,
+  CH15,
+  MAXDELAY,
+}
+
+ +
FMOD.DSP_DELAY_CH0
+FMOD.DSP_DELAY_CH1
+FMOD.DSP_DELAY_CH2
+FMOD.DSP_DELAY_CH3
+FMOD.DSP_DELAY_CH4
+FMOD.DSP_DELAY_CH5
+FMOD.DSP_DELAY_CH6
+FMOD.DSP_DELAY_CH7
+FMOD.DSP_DELAY_CH8
+FMOD.DSP_DELAY_CH9
+FMOD.DSP_DELAY_CH10
+FMOD.DSP_DELAY_CH11
+FMOD.DSP_DELAY_CH12
+FMOD.DSP_DELAY_CH13
+FMOD.DSP_DELAY_CH14
+FMOD.DSP_DELAY_CH15
+FMOD.DSP_DELAY_MAXDELAY
+
+ +
+
FMOD_DSP_DELAY_CH0
+
+

Channel #0 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH1
+
+

Channel #1 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH2
+
+

Channel #2 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH3
+
+

Channel #3 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH4
+
+

Channel #4 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH5
+
+

Channel #5 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH6
+
+

Channel #6 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH7
+
+

Channel #7 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH8
+
+

Channel #8 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH9
+
+

Channel #9 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH10
+
+

Channel #10 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH11
+
+

Channel #11 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH12
+
+

Channel #12 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH13
+
+

Channel #13 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH14
+
+

Channel #14 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_CH15
+
+

Channel #15 Delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_DELAY_MAXDELAY
+
+

Maximum delay, for memory allocation purposes.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 10000]
  • +
  • Default: 10
  • +
+
+
+

Every time MaxDelay is changed, the plug-in re-allocates the delay buffer. This means the delay disappears at that time while it refills its new buffer. A larger MaxDelay results in larger amounts of memory allocated.

+

Channel delays above MaxDelay will be clipped to MaxDelay and the delay buffer will not be resized.

+

See Also: FMOD_DSP_TYPE_DELAY, DSP::setParameterFloat

+

FMOD_DSP_DISTORTION

+

Distortion DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_DISTORTION {
+  FMOD_DSP_DISTORTION_LEVEL
+} FMOD_DSP_DISTORTION;
+
+ +
enum DSP_DISTORTION
+{
+  LEVEL
+}
+
+ +
FMOD.DSP_DISTORTION_LEVEL
+
+ +
+
FMOD_DSP_DISTORTION_LEVEL
+
+

Distortion value.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0.5
  • +
+
+
+

See Also: FMOD_DSP_TYPE_DISTORTION, DSP::setParameterFloat

+

FMOD_DSP_ECHO

+

Echo DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_ECHO {
+  FMOD_DSP_ECHO_DELAY,
+  FMOD_DSP_ECHO_FEEDBACK,
+  FMOD_DSP_ECHO_DRYLEVEL,
+  FMOD_DSP_ECHO_WETLEVEL,
+  FMOD_DSP_ECHO_DELAYCHANGEMODE
+} FMOD_DSP_ECHO;
+
+ +
enum DSP_ECHO
+{
+  DELAY,
+  FEEDBACK,
+  DRYLEVEL,
+  WETLEVEL,
+  DELAYCHANGEMODE
+}
+
+ +
FMOD.DSP_ECHO_DELAY
+FMOD.DSP_ECHO_FEEDBACK
+FMOD.DSP_ECHO_DRYLEVEL
+FMOD.DSP_ECHO_WETLEVEL
+FMOD.DSP_ECHO_DELAYCHANGEMODE
+
+ +
+
FMOD_DSP_ECHO_DELAY
+
+

Echo delay.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [1, 5000]
  • +
  • Default: 500
  • +
+
+
FMOD_DSP_ECHO_FEEDBACK
+
+

Echo decay per delay. 100.0 = No decay, 0.0 = total decay.

+
    +
  • Type: float
  • +
  • Units: Percentage
  • +
  • Range: [0, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_ECHO_DRYLEVEL
+
+

Original sound volume.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_ECHO_WETLEVEL
+
+

Volume of echo signal to pass to output.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_ECHO_DELAYCHANGEMODE
+
+

The method used to smooth delay changes.

+ +
+
+

Every time the delay is changed, the plug-in reallocates the echo buffer. This means the echo disappears at that time while it refills its new buffer. Larger echo delays result in larger amounts of memory allocated.

+

See Also: FMOD_DSP_TYPE_ECHO, DSP::setParameterFloat

+

FMOD_DSP_ECHO_DELAYCHANGEMODE_TYPE

+

Options for smoothing delay changes in the echo effect.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_ECHO_DELAYCHANGEMODE_TYPE {
+    FMOD_DSP_ECHO_DELAYCHANGEMODE_FADE,
+    FMOD_DSP_ECHO_DELAYCHANGEMODE_LERP,
+    FMOD_DSP_ECHO_DELAYCHANGEMODE_NONE
+} FMOD_DSP_ECHO_DELAYCHANGEMODE_TYPE;
+
+ +
enum DSP_ECHO_DELAYCHANGEMODE_TYPE
+{
+    FADE,
+    LERP,
+    NONE
+}
+
+ +
    FMOD.DSP_ECHO_DELAYCHANGEMODE_FADE,
+    FMOD.DSP_ECHO_DELAYCHANGEMODE_LERP,
+    FMOD.DSP_ECHO_DELAYCHANGEMODE_NONE
+
+ +
+
FMOD_DSP_ECHO_DELAYCHANGEMODE_FADE
+
The ramp delay change mode will fade-in the new delay value and fade-out the old delay value. This is best suited for large, fast parameter changes.
+
FMOD_DSP_ECHO_DELAYCHANGEMODE_LERP
+
The lerp delay change mode will use linear interpolation to approach the new delay target. This is best suited for small, slow parameter changes, and for emulating the doppler effect.
+
FMOD_DSP_ECHO_DELAYCHANGEMODE_NONE
+
The none delay change mode will disable value smoothing between delay changes.
+
+

See Also: FMOD_DSP_ECHO_DELAYCHANGEMODE

+

FMOD_DSP_FADER

+

Fader DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_FADER {
+  FMOD_DSP_FADER_GAIN,
+  FMOD_DSP_FADER_OVERALL_GAIN
+} FMOD_DSP_FADER;
+
+ +
enum DSP_FADER
+{
+  GAIN,
+  OVERALL_GAIN,
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_DSP_FADER_GAIN
+
+

Signal gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_FADER_OVERALL_GAIN
+
+

Overall gain to allow FMOD to know the DSP is scaling the signal for visualization purposes.

+ +
+
+

See Also: FMOD_DSP_TYPE_FADER, DSP::setParameterFloat

+

FMOD_DSP_FFT

+

FFT DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_FFT {
+  FMOD_DSP_FFT_WINDOWSIZE,
+  FMOD_DSP_FFT_WINDOW,
+  FMOD_DSP_FFT_BAND_START_FREQ,
+  FMOD_DSP_FFT_BAND_STOP_FREQ,
+  FMOD_DSP_FFT_SPECTRUMDATA,
+  FMOD_DSP_FFT_RMS,
+  FMOD_DSP_FFT_SPECTRAL_CENTROID,
+  FMOD_DSP_FFT_IMMEDIATE_MODE,
+  FMOD_DSP_FFT_DOWNMIX,
+  FMOD_DSP_FFT_CHANNEL
+} FMOD_DSP_FFT;
+
+ +
enum DSP_FFT
+{
+    WINDOWSIZE,
+    WINDOW,
+    BAND_START_FREQ,
+    BAND_STOP_FREQ,
+    SPECTRUMDATA,
+    RMS,
+    SPECTRAL_CENTROID,
+    IMMEDIATE_MODE,
+    DOWNMIX,
+    CHANNEL
+}
+
+ +
FMOD.DSP_FFT_WINDOWSIZE
+FMOD.DSP_FFT_WINDOW
+FMOD.DSP_FFT_BAND_START_FREQ
+FMOD.DSP_FFT_BAND_STOP_FREQ
+FMOD.DSP_FFT_SPECTRUMDATA
+FMOD.DSP_FFT_RMS
+FMOD.DSP_FFT_SPECTRAL_CENTROID
+FMOD.DSP_FFT_IMMEDIATE_MODE
+FMOD.DSP_FFT_DOWNMIX
+FMOD.DSP_FFT_CHANNEL
+
+ +
+
FMOD_DSP_FFT_WINDOWSIZE
+
+

Window size. Must be a power of 2 between 128 and 16384.

+
    +
  • Type: int
  • +
  • Default: 2048
  • +
+
+
FMOD_DSP_FFT_WINDOW
+
+

FFT Window Type.

+ +
+
FMOD_DSP_FFT_BAND_START_FREQ
+
+

The start frequency of the analysis band.

+
    +
  • Type: float
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_FFT_BAND_STOP_FREQ
+
+

The stop frequency of the analysis band.

+
    +
  • Type: float
  • +
  • Default: 22000
  • +
+
+
FMOD_DSP_FFT_SPECTRUMDATA R/O
+
+

Returns the current spectrum values between 0 and 1 for each 'fft bin'. Divide the Nyquist frequency by the window size to get the hz value per entry.

+ +
+
FMOD_DSP_FFT_RMS R/O
+
+

The total RMS value of the spectral components within the analysis band.

+
    +
  • Type: float
  • +
+
+
FMOD_DSP_FFT_SPECTRAL_CENTROID R/O
+
+

Returns the centroid of the spectral components within the analysis band for the first channel.

+
    +
  • Type: float
  • +
+
+
FMOD_DSP_FFT_IMMEDIATE_MODE
+
+

Immediate Mode. False = data requests will have a delay on first time use and hardware acceleration, if available, will be used. True = data requests will have no delay on first time use, and no hardware acceleration will be used.

+
    +
  • Type: bool
  • +
  • Default: false
  • +
+
+
FMOD_DSP_FFT_DOWNMIX
+
+

Downmix mode. If set to FMOD_DSP_FFT_DOWNMIX_MONO, the DSP will downmix the input signal to mono before analysis, producing a single spectrum. Note that this only affects the analysis - the DSP will pass the unmodified signal through to its output regardless of the downmix setting.

+ +
+
FMOD_DSP_FFT_CHANNEL
+
+

The channel to analyze. If set to -1, all channels will be analyzed, producing multiple spectra. Otherwise only the specified channel will be analyzed, producing a single spectrum.

+
    +
  • Type: int
  • +
  • Default: -1
  • +
+
+
+

Set the attributes for the spectrum analysis with FMOD_DSP_FFT_WINDOWSIZE, FMOD_DSP_FFT_WINDOW, FMOD_DSP_FFT_BAND_START_FREQ, FMOD_DSP_FFT_BAND_STOP_FREQ, FMOD_DSP_FFT_DOWNMIX, and FMOD_DSP_FFT_CHANNEL.
+Retrieve the results with FMOD_DSP_FFT_SPECTRUMDATA, FMOD_DSP_FFT_RMS and FMOD_DSP_FFT_SPECTRAL_CENTROID.
+FMOD_DSP_FFT_SPECTRUMDATA stores its data in the FMOD_DSP_PARAMETER_DATA_TYPE_FFT. You will need to cast to this structure to get the right data.

+

See Also: FMOD_DSP_TYPE_FFT, DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterData, FMOD_DSP_FFT_WINDOW_TYPE

+

FMOD_DSP_FFT_DOWNMIX_TYPE

+

List of downmix modes for the FFT DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_FFT_DOWNMIX_TYPE {
+  FMOD_DSP_FFT_DOWNMIX_NONE,
+  FMOD_DSP_FFT_DOWNMIX_MONO
+} FMOD_DSP_FFT_DOWNMIX_TYPE;
+
+ +
enum DSP_FFT_DOWNMIX_TYPE
+{
+  NONE,
+  MONO
+}
+
+ +
FMOD.DSP_FFT_DOWNMIX_NONE
+FMOD.DSP_FFT_DOWNMIX_MONO
+
+ +
+
FMOD_DSP_FFT_DOWNMIX_NONE
+
No downmix.
+
FMOD_DSP_FFT_DOWNMIX_MONO
+
Downmix to mono.
+
+

Used to specify the downmix applied by the FFT DSP before spectrum analysis.

+

See Also: FMOD_DSP_FFT, FMOD_DSP_TYPE_FFT

+

FMOD_DSP_FFT_WINDOW_TYPE

+

List of windowing methods for the FFT DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_FFT_WINDOW_TYPE {
+  FMOD_DSP_FFT_WINDOW_RECT,
+  FMOD_DSP_FFT_WINDOW_TRIANGLE,
+  FMOD_DSP_FFT_WINDOW_HAMMING,
+  FMOD_DSP_FFT_WINDOW_HANNING,
+  FMOD_DSP_FFT_WINDOW_BLACKMAN,
+  FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS
+} FMOD_DSP_FFT_WINDOW_TYPE;
+
+ +
enum DSP_FFT_WINDOW_TYPE
+{
+  RECT,
+  TRIANGLE,
+  HAMMING,
+  HANNING,
+  BLACKMAN,
+  BLACKMANHARRIS
+}
+
+ +
FMOD.DSP_FFT_WINDOW_RECT
+FMOD.DSP_FFT_WINDOW_TRIANGLE
+FMOD.DSP_FFT_WINDOW_HAMMING
+FMOD.DSP_FFT_WINDOW_HANNING
+FMOD.DSP_FFT_WINDOW_BLACKMAN
+FMOD.DSP_FFT_WINDOW_BLACKMANHARRIS
+
+ +
+
FMOD_DSP_FFT_WINDOW_RECT
+
w[n] = 1.0
+
FMOD_DSP_FFT_WINDOW_TRIANGLE
+
w[n] = TRI(2n/N)
+
FMOD_DSP_FFT_WINDOW_HAMMING
+
w[n] = 0.54 - (0.46 * COS(n/N) )
+
FMOD_DSP_FFT_WINDOW_HANNING
+
w[n] = 0.5 * (1.0 - COS(n/N) )
+
FMOD_DSP_FFT_WINDOW_BLACKMAN
+
w[n] = 0.42 - (0.5 * COS(n/N) ) + (0.08 * COS(2.0 * n/N) )
+
FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS
+
w[n] = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N))
+
+

Used in spectrum analysis to reduce leakage / transient signals interfering with the analysis. This is a problem with analysis of continuous signals that only have a small portion of the signal sample (the fft window size). Windowing the signal with a curve or triangle tapers the sides of the fft window to help alleviate this problem.

+

Cyclic signals such as a sine wave that repeat their cycle in a multiple of the window size do not need windowing. I.e. If the sine wave repeats every 1024, 512, 256 etc samples and the FMOD fft window is 1024, then the signal would not need windowing.

+

Not windowing is represented by FMOD_DSP_FFT_WINDOW_RECT. If the cycle of the signal (ie the sine wave) is not a multiple of the window size, it will cause frequency abnormalities, so a different windowing method is needed.

+

FMOD_DSP_FFT_WINDOW_RECT

+

FFT Window Rectangle

+

FMOD_DSP_FFT_WINDOW_TRIANGLE

+

FFT Window Triangle

+

FMOD_DSP_FFT_WINDOW_HAMMING

+

FFT Window Hamming

+

FMOD_DSP_FFT_WINDOW_HANNING

+

FFT Window Hanning

+

FMOD_DSP_FFT_WINDOW_BLACKMAN

+

FFT Window Blackman

+

FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS

+

FFT Window Blackman Harris

+

See Also: FMOD_DSP_FFT, FMOD_DSP_TYPE_FFT

+

FMOD_DSP_FLANGE

+

Flange DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_FLANGE {
+  FMOD_DSP_FLANGE_MIX,
+  FMOD_DSP_FLANGE_DEPTH,
+  FMOD_DSP_FLANGE_RATE
+} FMOD_DSP_FLANGE;
+
+ +
enum DSP_FLANGE
+{
+  MIX,
+  DEPTH,
+  RATE
+}
+
+ +
FMOD.DSP_FLANGE_MIX
+FMOD.DSP_FLANGE_DEPTH
+FMOD.DSP_FLANGE_RATE
+
+ +
+
FMOD_DSP_FLANGE_MIX
+
+

Percentage of wet signal in the mix.

+
    +
  • Type: float
  • +
  • Units: Percentage
  • +
  • Range: [0, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_FLANGE_DEPTH
+
+

Flange depth.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0.01, 1]
  • +
  • Default: 1
  • +
+
+
FMOD_DSP_FLANGE_RATE
+
+

Flange speed.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [0, 20]
  • +
  • Default: .1
  • +
+
+
+

Flange is an effect where the signal is played twice at the same time, and one copy slides back and forth creating a whooshing or flanging effect. As there are 2 versions of the same signal (dry vs wet), by default each signal is given 50% mix, so that the total is not louder than the original unaffected signal.

+

Flange depth is a percentage of a 10ms shift from the original signal. Anything above 10ms is not considered flange because to the ear it begins to 'echo' so 10ms is the highest value possible.

+

See Also: FMOD_DSP_TYPE_FLANGE, DSP::setParameterFloat

+

FMOD_DSP_HIGHPASS

+

Highpass DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_HIGHPASS {
+  FMOD_DSP_HIGHPASS_CUTOFF,
+  FMOD_DSP_HIGHPASS_RESONANCE
+} FMOD_DSP_HIGHPASS;
+
+ +
enum DSP_HIGHPASS
+{
+  CUTOFF,
+  RESONANCE
+}
+
+ +
FMOD.DSP_HIGHPASS_CUTOFF
+FMOD.DSP_HIGHPASS_RESONANCE
+
+ +
+
FMOD_DSP_HIGHPASS_CUTOFF
+
+

Highpass cutoff frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [1, 22000]
  • +
  • Default: 5000
  • +
+
+
FMOD_DSP_HIGHPASS_RESONANCE
+
+

Highpass resonance Q value.

+
    +
  • Type: float
  • +
  • Range: [1, 10]
  • +
  • Default: 1
  • +
+
+
+

Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:

+
// Configure a single band (band A) as a highpass (all other bands default to off).
+// 12dB roll-off to approximate the old effect curve.
+// Cutoff frequency can be used the same as with the old effect.
+// Resonance can be applied by setting the 'Q' value of the new effect.
+FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_Q, resonance);
+
+ +

See Also: FMOD_DSP_TYPE_HIGHPASS, DSP::setParameterFloat

+

FMOD_DSP_HIGHPASS_SIMPLE

+

High pass simple DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_HIGHPASS_SIMPLE {
+  FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF
+} FMOD_DSP_HIGHPASS_SIMPLE;
+
+ +
enum DSP_HIGHPASS_SIMPLE
+{
+  CUTOFF
+}
+
+ +
FMOD.DSP_HIGHPASS_SIMPLE_CUTOFF
+
+ +
+
FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF
+
+

Highpass cutoff frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [1, 22000]
  • +
  • Default: 5000
  • +
+
+
+

Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:

+
// Configure a single band (band A) as a highpass (all other bands default to off).
+// 12dB roll-off to approximate the old effect curve.
+// Cutoff frequency can be used the same as with the old effect.
+// Resonance / 'Q' should remain at default 0.707.
+FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);
+
+ +

This is a very simple single-order high pass filter. The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.

+

See Also: FMOD_DSP_TYPE_HIGHPASS_SIMPLE, DSP::setParameterFloat

+

FMOD_DSP_ITECHO

+

IT echo DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_ITECHO {
+  FMOD_DSP_ITECHO_WETDRYMIX,
+  FMOD_DSP_ITECHO_FEEDBACK,
+  FMOD_DSP_ITECHO_LEFTDELAY,
+  FMOD_DSP_ITECHO_RIGHTDELAY,
+  FMOD_DSP_ITECHO_PANDELAY
+} FMOD_DSP_ITECHO;
+
+ +
enum DSP_ITECHO
+{
+  WETDRYMIX,
+  FEEDBACK,
+  LEFTDELAY,
+  RIGHTDELAY,
+  PANDELAY
+}
+
+ +
FMOD.DSP_ITECHO_WETDRYMIX
+FMOD.DSP_ITECHO_FEEDBACK
+FMOD.DSP_ITECHO_LEFTDELAY
+FMOD.DSP_ITECHO_RIGHTDELAY
+FMOD.DSP_ITECHO_PANDELAY
+
+ +
+
FMOD_DSP_ITECHO_WETDRYMIX
+
+

Ratio of wet (processed) signal to dry (unprocessed) signal. Higher is wetter.

+
    +
  • Type: float
  • +
  • Units: Percentage
  • +
  • Range: [0, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_ITECHO_FEEDBACK
+
+

Percentage of output fed back into input.

+
    +
  • Type: float
  • +
  • Units: Percentage
  • +
  • Range: [0, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_ITECHO_LEFTDELAY
+
+

Delay for left channel.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [1, 2000]
  • +
  • Default: 500
  • +
+
+
FMOD_DSP_ITECHO_RIGHTDELAY
+
+

Delay for right channel.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [1, 2000]
  • +
  • Default: 500
  • +
+
+
FMOD_DSP_ITECHO_PANDELAY
+
+

Value that specifies whether to swap left and right delays with each successive echo. CURRENTLY NOT SUPPORTED.

+
    +
  • Type: float
  • +
  • Range: 0, 1
  • +
  • Default: 0
  • +
+
+
+

This is effectively a software based echo filter that emulates the DirectX DMO echo effect. Impulse tracker files can support this, and FMOD will produce the effect on ANY platform, not just those that support DirectX effects!

+

Every time the delay is changed, the plug-in reallocates the echo buffer. This means the echo disappears at that time while it refills its new buffer. Larger echo delays result in larger amounts of memory allocated.

+

As this is a stereo filter made mainly for IT playback, it is targeted for stereo signals. With mono signals only the FMOD_DSP_ITECHO_LEFTDELAY is used. For multi-channel signals (>2) there will be no echo on those channels.

+

See Also: FMOD_DSP_TYPE_ITECHO, DSP::setParameterFloat

+

FMOD_DSP_ITLOWPASS

+

Lowpass DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_ITLOWPASS {
+  FMOD_DSP_ITLOWPASS_CUTOFF,
+  FMOD_DSP_ITLOWPASS_RESONANCE
+} FMOD_DSP_ITLOWPASS;
+
+ +
enum DSP_ITLOWPASS
+{
+  CUTOFF,
+  RESONANCE
+}
+
+ +
FMOD.DSP_ITLOWPASS_CUTOFF
+FMOD.DSP_ITLOWPASS_RESONANCE
+
+ +
+
FMOD_DSP_ITLOWPASS_CUTOFF
+
+

Lowpass cutoff frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [1, 22000]
  • +
  • Default: 5000
  • +
+
+
FMOD_DSP_ITLOWPASS_RESONANCE
+
+

Lowpass resonance Q value.

+
    +
  • Type: float
  • +
  • Range: [0, 127]
  • +
  • Default: 1
  • +
+
+
+

The FMOD Engine's .IT playback (FMOD_SOUND_TYPE_IT) uses this filter.

+

This is different to the default FMOD_DSP_TYPE_ITLOWPASS filter in that it uses a different quality algorithm and is the filter used to produce the correct sounding playback in .IT files.

+

Note! This filter actually has a limited cutoff frequency below the specified maximum, due to its limited design. For a more open range filter, use FMOD_DSP_LOWPASS, or if you don't mind not having resonance, FMOD_DSP_LOWPASS_SIMPLE.

+

The effective maximum cutoff is about 8060hz.

+

See Also: FMOD_DSP_TYPE_ITLOWPASS, DSP::setParameterFloat

+

FMOD_DSP_LIMITER

+

Limiter DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_LIMITER {
+  FMOD_DSP_LIMITER_RELEASETIME,
+  FMOD_DSP_LIMITER_CEILING,
+  FMOD_DSP_LIMITER_MAXIMIZERGAIN,
+  FMOD_DSP_LIMITER_MODE
+} FMOD_DSP_LIMITER;
+
+ +
enum DSP_LIMITER
+{
+  RELEASETIME,
+  CEILING,
+  MAXIMIZERGAIN,
+  MODE,
+}
+
+ +
FMOD.DSP_LIMITER_RELEASETIME
+FMOD.DSP_LIMITER_CEILING
+FMOD.DSP_LIMITER_MAXIMIZERGAIN
+FMOD.DSP_LIMITER_MODE
+
+ +
+
FMOD_DSP_LIMITER_RELEASETIME
+
+

Time to return the gain reduction to full in ms.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [1, 1000]
  • +
  • Default: 10
  • +
+
+
FMOD_DSP_LIMITER_CEILING
+
+

Maximum level of the output signal.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-12, 0]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_LIMITER_MAXIMIZERGAIN
+
+

Maximum amplification allowed.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [0, 12]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_LIMITER_MODE
+
+

Channel processing mode where false is independent (limiter per channel) and true is linked (all channels are summed together before processing).

+
    +
  • Type: bool
  • +
  • Default: false
  • +
+
+
+

See Also: FMOD_DSP_TYPE_LIMITER, DSP::setParameterFloat

+

FMOD_DSP_LOUDNESS_METER

+

Loudness meter DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_LOUDNESS_METER {
+  FMOD_DSP_LOUDNESS_METER_STATE,
+  FMOD_DSP_LOUDNESS_METER_WEIGHTING,
+  FMOD_DSP_LOUDNESS_METER_INFO
+} FMOD_DSP_LOUDNESS_METER;
+
+ +
enum DSP_LOUDNESS_METER
+{
+  STATE,
+  WEIGHTING,
+  INFO
+}
+
+ +
FMOD.DSP_LOUDNESS_METER_STATE,
+FMOD.DSP_LOUDNESS_METER_WEIGHTING,
+FMOD.DSP_LOUDNESS_METER_INFO
+
+ +
+
FMOD_DSP_LOUDNESS_METER_STATE
+
+

Update state.

+ +
+
FMOD_DSP_LOUDNESS_METER_WEIGHTING
+
+

Channel weighting.

+ +
+
FMOD_DSP_LOUDNESS_METER_INFO R/O
+
+

Metering information.

+ +
+
+

See Also: FMOD_DSP_TYPE_LOUDNESS_METER, DSP::setParameterInt, DSP::setParameterData

+

FMOD_DSP_LOUDNESS_METER_INFO_TYPE

+

Loudness meter information data structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_LOUDNESS_METER_INFO_TYPE
+{
+  float momentaryloudness;
+  float shorttermloudness;
+  float integratedloudness;
+  float loudness10thpercentile;
+  float loudness95thpercentile;
+  float loudnesshistogram[66];
+  float maxtruepeak;
+  float maxmomentaryloudness;
+} FMOD_DSP_LOUDNESS_METER_INFO_TYPE;
+
+ +
struct DSP_LOUDNESS_METER_INFO_TYPE
+{
+  float momentaryloudness;
+  float shorttermloudness;
+  float integratedloudness;
+  float loudness10thpercentile;
+  float loudness95thpercentile;
+  float loudnesshistogram[66];
+  float maxtruepeak;
+  float maxmomentaryloudness;
+}
+
+ +
FMOD_DSP_LOUDNESS_METER_INFO_TYPE
+{
+  momentaryloudness;
+  shorttermloudness;
+  integratedloudness;
+  loudness10thpercentile;
+  loudness95thpercentile;
+  loudnesshistogram;
+  maxtruepeak;
+  maxmomentaryloudness;
+}
+
+ +
+
momentaryloudness
+
Loudness value indicating current loudness. Calculated using a 400ms window.
+
+
    +
  • Units: Decibels
  • +
  • Range: [-80, inf)
  • +
+
+
shorttermloudness
+
Loudness value indicating loudness averaged over a short time duration. Calculated using a 3 second window.
+
+
    +
  • Units: Decibels
  • +
  • Range: [-80, inf)
  • +
+
+
integratedloudness
+
Loudness value indicating loudness over the entire duration of the recording period.
+
+
    +
  • Units: Decibels
  • +
  • Range: [-80, inf)
  • +
+
+
loudness10thpercentile
+
10th percentile loudness (towards lowest loudness). Uses short term loudness values (3 second averages).
+
+
    +
  • Units: Decibels
  • +
  • Range: [-80, inf)
  • +
+
+
loudness95thpercentile
+
95th percentile loudness (towards highest loudness). Uses short term loudness values (3 second averages).
+
+
    +
  • Units: Decibels
  • +
  • Range: [-80, inf)
  • +
+
+
loudnesshistogram
+
Array containing distribution of loudness values. Each array entry is a count of the momentary loudness values (400ms averages) evenly distributed along the range [-60, 6] excluding loudness values outside that range.
+
maxtruepeak
+
Highest peak.
+
+
    +
  • Units: Decibels
  • +
  • Range: [-80, inf)
  • +
+
+
maxmomentaryloudness
+
Highest momentary loudness value (400ms averages).
+
+
    +
  • Units: Decibels
  • +
  • Range: [-80, inf)
  • +
+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_LOUDNESS_METER_STATE_TYPE

+

Loudness meter state indicating update behavior.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_LOUDNESS_METER_STATE_TYPE {
+  FMOD_DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED = -3,
+  FMOD_DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK = -2,
+  FMOD_DSP_LOUDNESS_METER_STATE_RESET_ALL = -1,
+  FMOD_DSP_LOUDNESS_METER_STATE_PAUSED = 0,
+  FMOD_DSP_LOUDNESS_METER_STATE_ANALYZING = 1
+} FMOD_DSP_LOUDNESS_METER_STATE_TYPE;
+
+ +
enum DSP_LOUDNESS_METER_STATE_TYPE
+{
+  RESET_INTEGRATED = -3,
+  RESET_MAXPEAK = -2,
+  ESET_ALL = -1,
+  PAUSED,
+  ANALYZING
+}
+
+ +
FMOD.DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED = -3,
+FMOD.DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK = -2,
+FMOD.DSP_LOUDNESS_METER_STATE_RESET_ALL = -1,
+FMOD.DSP_LOUDNESS_METER_STATE_PAUSED = 0,
+FMOD.DSP_LOUDNESS_METER_STATE_ANALYZING = 1
+
+ +
+
FMOD_DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED
+
Reset loudness meter information except max peak.
+
FMOD_DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK
+
Reset loudness meter max peak.
+
FMOD_DSP_LOUDNESS_METER_STATE_RESET_ALL
+
Reset all loudness meter information.
+
FMOD_DSP_LOUDNESS_METER_STATE_PAUSED
+
Pause loudness meter.
+
FMOD_DSP_LOUDNESS_METER_STATE_ANALYZING
+
Enable loudness meter recording and analyzing.
+
+

See Also: FMOD_DSP_TYPE_LOUDNESS_METER

+

FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE

+

Loudness meter channel weighting.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE
+{
+  float channelweight[32];
+} FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE;
+
+ +
struct DSP_LOUDNESS_METER_WEIGHTING_TYPE
+{
+  float channelweight[32];
+}
+
+ +
FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE
+{
+  channelweight;
+}
+
+ +
+
channelweight
+
+

The weighting of each channel used in calculating loudness.

+
    +
  • Default: { 1, 1, 1, 0, 1.4, 1.4, 1.4, 1.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
  • +
+
+
+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_LOWPASS

+

Low pass DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_LOWPASS {
+  FMOD_DSP_LOWPASS_CUTOFF,
+  FMOD_DSP_LOWPASS_RESONANCE
+} FMOD_DSP_LOWPASS;
+
+ +
enum DSP_LOWPASS
+{
+  CUTOFF,
+  RESONANCE
+}
+
+ +
FMOD.DSP_LOWPASS_CUTOFF
+FMOD.DSP_LOWPASS_RESONANCE
+
+ +
+
FMOD_DSP_LOWPASS_CUTOFF
+
+

Lowpass cutoff frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [1, 22000]
  • +
  • Default: 5000
  • +
+
+
FMOD_DSP_LOWPASS_RESONANCE
+
+

Lowpass resonance Q value.

+
    +
  • Type: float
  • +
  • Range: [0, 10]
  • +
  • Default: 1
  • +
+
+
+

Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:

+
// Configure a single band (band A) as a lowpass (all other bands default to off).
+// 24dB roll-off to approximate the old effect curve.
+// Cutoff frequency can be used the same as with the old effect.
+// Resonance can be applied by setting the 'Q' value of the new effect.
+FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_Q, resonance);
+
+ +

See Also: FMOD_DSP_TYPE_LOWPASS, DSP::setParameterFloat

+

FMOD_DSP_LOWPASS_SIMPLE

+

Low pass simple DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_LOWPASS_SIMPLE {
+  FMOD_DSP_LOWPASS_SIMPLE_CUTOFF
+} FMOD_DSP_LOWPASS_SIMPLE;
+
+ +
enum DSP_LOWPASS_SIMPLE
+{
+  CUTOFF
+}
+
+ +
FMOD.DSP_LOWPASS_SIMPLE_CUTOFF
+
+ +
+
FMOD_DSP_LOWPASS_SIMPLE_CUTOFF
+
+

Lowpass cutoff frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [1, 22000]
  • +
  • Default: 5000
  • +
+
+
+

Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:

+
//  Configure a single band (band A) as a lowpass (all other bands default to off).
+//  12dB roll-off to approximate the old effect curve.
+//  Cutoff frequency can be used the same as with the old effect.
+//  Resonance / 'Q' should remain at default 0.707.
+FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);
+
+ +

This is a very simple low pass filter, based on two single-pole RC time-constant modules.

+

The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.

+

See Also: FMOD_DSP_TYPE_LOWPASS_SIMPLE, DSP::setParameterFloat, DSP::getParameterFloat, FMOD_DSP_TYPE

+

FMOD_DSP_MULTIBAND_DYNAMICS

+

Three-band compressor/expander effect.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_MULTIBAND_DYNAMICS
+{
+  FMOD_DSP_MULTIBAND_DYNAMICS_LOWER_FREQUENCY,
+  FMOD_DSP_MULTIBAND_DYNAMICS_UPPER_FREQUENCY,
+  FMOD_DSP_MULTIBAND_DYNAMICS_LINKED,
+  FMOD_DSP_MULTIBAND_DYNAMICS_USE_SIDECHAIN,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_MODE,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_GAIN,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_THRESHOLD,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_RATIO,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_ATTACK,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_RELEASE,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_GAIN_MAKEUP,
+  FMOD_DSP_MULTIBAND_DYNAMICS_A_RESPONSE_DATA,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_MODE,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_GAIN,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_THRESHOLD,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_RATIO,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_ATTACK,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_RELEASE,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_GAIN_MAKEUP,
+  FMOD_DSP_MULTIBAND_DYNAMICS_B_RESPONSE_DATA,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_MODE,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_GAIN,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_THRESHOLD,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_RATIO,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_ATTACK,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_RELEASE,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_GAIN_MAKEUP,
+  FMOD_DSP_MULTIBAND_DYNAMICS_C_RESPONSE_DATA
+};
+
+ +
enum DSP_MULTIBAND_DYNAMICS
+{
+  LOWER_FREQUENCY,
+  UPPER_FREQUENCY,
+  LINKED,
+  USE_SIDECHAIN,
+  A_MODE,
+  A_GAIN,
+  A_THRESHOLD,
+  A_RATIO,
+  A_ATTACK,
+  A_RELEASE,
+  A_GAIN_MAKEUP,
+  A_RESPONSE_DATA,
+  B_MODE,
+  B_GAIN,
+  B_THRESHOLD,
+  B_RATIO,
+  B_ATTACK,
+  B_RELEASE,
+  B_GAIN_MAKEUP,
+  B_RESPONSE_DATA,
+  C_MODE,
+  C_GAIN,
+  C_THRESHOLD,
+  C_RATIO,
+  C_ATTACK,
+  C_RELEASE,
+  C_GAIN_MAKEUP,
+  C_RESPONSE_DATA
+}
+
+ +
FMOD.DSP_MULTIBAND_DYNAMICS_LOWER_FREQUENCY,
+FMOD.DSP_MULTIBAND_DYNAMICS_UPPER_FREQUENCY,
+FMOD.DSP_MULTIBAND_DYNAMICS_LINKED,
+FMOD.DSP_MULTIBAND_DYNAMICS_USE_SIDECHAIN,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_MODE,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_GAIN,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_THRESHOLD,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_RATIO,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_ATTACK,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_RELEASE,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_GAIN_MAKEUP,
+FMOD.DSP_MULTIBAND_DYNAMICS_A_RESPONSE_DATA,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_MODE,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_GAIN,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_THRESHOLD,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_RATIO,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_ATTACK,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_RELEASE,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_GAIN_MAKEUP,
+FMOD.DSP_MULTIBAND_DYNAMICS_B_RESPONSE_DATA,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_MODE,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_GAIN,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_THRESHOLD,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_RATIO,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_ATTACK,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_RELEASE,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_GAIN_MAKEUP,
+FMOD.DSP_MULTIBAND_DYNAMICS_C_RESPONSE_DATA
+
+ +
+
FMOD_DSP_MULTIBAND_DYNAMICS_LOWER_FREQUENCY
+
+

Lower crossover frequency. Band A will process the dynamic content ranging from 20Hz to this value, and Band B will process the dynamic content ranging from this value to the value of FMOD_DSP_MULTIBAND_DYNAMICS_UPPER_FREQUENCY.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [20, 22000]
  • +
  • Default: 400
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_UPPER_FREQUENCY
+
+

Upper crossover frequency. Band B will process the dynamic content ranging from the value of FMOD_DSP_MULTIBAND_DYNAMICS_LOWER_FREQUENCY to this value, and Band C will process the dynamic content ranging from this value to 20kHz.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [20, 22000]
  • +
  • Default: 4000
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_LINKED
+
+

Enables optimized processing mode. When set to true, the input signal is mixed down to mono before passing through the dynamic processor bands.

+
    +
  • Type: Boolean
  • +
  • Default: True
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_USE_SIDECHAIN
+
+

Whether to analyse the sidechain signal instead of the input signal. When sidechaining is enabled the sidechain channel will be split into separate bands and analyzed for their dynamic content, but the resulting dynamic response will still be applied to the host channel.

+ +
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_MODE
+
+

Band A: Dynamic response mode. Use this to configure how the band will respond to the envelope of the signal. The "Upward" modes will amplify the signal, and the "Downward" modes will attenuate the signal.

+ +
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_GAIN
+
+

Band A: Gain applied before dynamic processing. This amplifies or attenuates the signal before it is split into separate bands and dynamic processors.

+
    +
  • Type: float
  • +
  • Units: dB
  • +
  • Range: [-30, 30]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_THRESHOLD
+
+

Band A: Dynamic response threshold. This changes the threshold at which this band will start attenuating or amplifying the signal.

+
    +
  • Type: float
  • +
  • Units: dB
  • +
  • Range: [-80, 0]
  • +
  • Default: -5
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_RATIO
+
+

Band A: Dynamic response ratio. This changes the amount of amplification or attenuation that will be applied to the signal. The result of dynamic processing will be more subtle at lower ratio values, and will intensify as the ratio increases.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [1, 50]
  • +
  • Default: 2.5
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_ATTACK
+
+

Band A: Dynamic attack time. This is the duration it will take the dynamic processor to apply the full ratio of amplification or attenuation. Lower values will mean the full ratio is applied quickly, and will approach the ratio value more smoothly as the attack value increases.

+
    +
  • Type: float
  • +
  • Units: ms
  • +
  • Range: [0.1, 1000]
  • +
  • Default: 20
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_RELEASE
+
+

Band A: Dynamic release time. This is the duration it will take the dynamic processor to return to stop applying amplification or attenuation. Lower values will mean the ratio stops being applied quickly, and will back off the ratio value more smoothly as the release value increases.

+
    +
  • Type: float
  • +
  • Units: ms
  • +
  • Range: [10, 5000]
  • +
  • Default: 100
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_GAIN_MAKEUP
+
+

Band A: Gain applied after dynamic processing. This amplifies or attenuates the signal after it passes through the dynamic processors and before the split signal is mixed back together.

+
    +
  • Type: float
  • +
  • Units: dB
  • +
  • Range: [-30, 30]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_MULTIBAND_DYNAMICS_A_RESPONSE_DATA
+
+

Band A: Dynamic response metering information. This structure contains data on the average attenuation or amplification applied per channel in the last mix block.

+ +
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_MODE
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_GAIN
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_THRESHOLD
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_RATIO
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_ATTACK
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_RELEASE
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_GAIN_MAKEUP
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_B_RESPONSE_DATA
+
Band B: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_MODE
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_GAIN
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_THRESHOLD
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_RATIO
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_ATTACK
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_RELEASE
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_GAIN_MAKEUP
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_DYNAMICS_C_RESPONSE_DATA
+
Band C: See Band A.
+
+

FMOD_DSP_MULTIBAND_DYNAMICS_MODE_TYPE

+

Multiband Dynamics dynamic response types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_MULTIBAND_DYNAMICS_MODE_TYPE {
+  FMOD_DSP_MULTIBAND_DYNAMICS_MODE_DISABLED,
+  FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_UP,
+  FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_DOWN,
+  FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_UP,
+  FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_DOWN
+};
+
+ +
enum DSP_MULTIBAND_DYNAMICS_MODE_TYPE
+{
+  DISABLED,
+  COMPRESS_UP,
+  COMPRESS_DOWN,
+  EXPAND_UP,
+  EXPAND_DOWN
+}
+
+ +
FMOD.DSP_MULTIBAND_DYNAMICS_MODE_DISABLED,
+FMOD.DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_UP,
+FMOD.DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_DOWN,
+FMOD.DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_UP,
+FMOD.DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_DOWN
+
+ +
+
FMOD_DSP_MULTIBAND_DYNAMICS_MODE_DISABLED
+
Response disabled, no processing.
+
FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_UP
+
Dynamic upward compression. Amplifies the signal below a defined threshold.
+
FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_DOWN
+
Dynamic downward compression. Attenuates the signal above a defined threshold.
+
FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_UP
+
Dynamic upward expansion. Amplifies the signal above a defined threshold.
+
FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_DOWN
+
Dynamic downward expansion. Attenuates the signal below a defined threshold.
+
+

See Also: FMOD_DSP_MULTIBAND_DYNAMICS

+

FMOD_DSP_MULTIBAND_EQ

+

Multiband equalizer DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_MULTIBAND_EQ {
+  FMOD_DSP_MULTIBAND_EQ_A_FILTER,
+  FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY,
+  FMOD_DSP_MULTIBAND_EQ_A_Q,
+  FMOD_DSP_MULTIBAND_EQ_A_GAIN,
+  FMOD_DSP_MULTIBAND_EQ_B_FILTER,
+  FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY,
+  FMOD_DSP_MULTIBAND_EQ_B_Q,
+  FMOD_DSP_MULTIBAND_EQ_B_GAIN,
+  FMOD_DSP_MULTIBAND_EQ_C_FILTER,
+  FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY,
+  FMOD_DSP_MULTIBAND_EQ_C_Q,
+  FMOD_DSP_MULTIBAND_EQ_C_GAIN,
+  FMOD_DSP_MULTIBAND_EQ_D_FILTER,
+  FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY,
+  FMOD_DSP_MULTIBAND_EQ_D_Q,
+  FMOD_DSP_MULTIBAND_EQ_D_GAIN,
+  FMOD_DSP_MULTIBAND_EQ_E_FILTER,
+  FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY,
+  FMOD_DSP_MULTIBAND_EQ_E_Q,
+  FMOD_DSP_MULTIBAND_EQ_E_GAIN
+} FMOD_DSP_MULTIBAND_EQ;
+
+ +
enum DSP_MULTIBAND_EQ
+{
+  A_FILTER,
+  A_FREQUENCY,
+  A_Q,
+  A_GAIN,
+  B_FILTER,
+  B_FREQUENCY,
+  B_Q,
+  B_GAIN,
+  C_FILTER,
+  C_FREQUENCY,
+  C_Q,
+  C_GAIN,
+  D_FILTER,
+  D_FREQUENCY,
+  D_Q,
+  D_GAIN,
+  E_FILTER,
+  E_FREQUENCY,
+  E_Q,
+  E_GAIN,
+}
+
+ +
FMOD.DSP_MULTIBAND_EQ_A_FILTER
+FMOD.DSP_MULTIBAND_EQ_A_FREQUENCY
+FMOD.DSP_MULTIBAND_EQ_A_Q
+FMOD.DSP_MULTIBAND_EQ_A_GAIN
+FMOD.DSP_MULTIBAND_EQ_B_FILTER
+FMOD.DSP_MULTIBAND_EQ_B_FREQUENCY
+FMOD.DSP_MULTIBAND_EQ_B_Q
+FMOD.DSP_MULTIBAND_EQ_B_GAIN
+FMOD.DSP_MULTIBAND_EQ_C_FILTER
+FMOD.DSP_MULTIBAND_EQ_C_FREQUENCY
+FMOD.DSP_MULTIBAND_EQ_C_Q
+FMOD.DSP_MULTIBAND_EQ_C_GAIN
+FMOD.DSP_MULTIBAND_EQ_D_FILTER
+FMOD.DSP_MULTIBAND_EQ_D_FREQUENCY
+FMOD.DSP_MULTIBAND_EQ_D_Q
+FMOD.DSP_MULTIBAND_EQ_D_GAIN
+FMOD.DSP_MULTIBAND_EQ_E_FILTER
+FMOD.DSP_MULTIBAND_EQ_E_FREQUENCY
+FMOD.DSP_MULTIBAND_EQ_E_Q
+FMOD.DSP_MULTIBAND_EQ_E_GAIN
+
+ +
+
FMOD_DSP_MULTIBAND_EQ_A_FILTER
+
+

Band A: used to interpret the behavior of the remaining parameters.

+ +
+
FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY
+
+

Band A: Significant frequency, cutoff [low/high pass, low/high shelf], center [notch, peaking, band-pass], phase transition point [all-pass].

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [20, 22000]
  • +
  • Default: 8000
  • +
+
+
FMOD_DSP_MULTIBAND_EQ_A_Q
+
+

Band A: Quality factor, resonance [low/high pass], bandwidth [notch, peaking, band-pass], phase transition sharpness [all-pass], unused [low/high shelf].

+
    +
  • Type: float
  • +
  • Range: [0.1, 10]
  • +
  • Default: 0.707
  • +
+
+
FMOD_DSP_MULTIBAND_EQ_A_GAIN
+
+

Band A: Boost or attenuation in dB [peaking, high/low shelf only]. -30 to 30. Default = 0.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-30, 30]
  • +
  • Default: 8000
  • +
+
+
FMOD_DSP_MULTIBAND_EQ_B_FILTER
+
+

Band B: See Band A.

+ +
+
FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY
+
Band B: See Band A
+
FMOD_DSP_MULTIBAND_EQ_B_Q
+
Band B: See Band A
+
FMOD_DSP_MULTIBAND_EQ_B_GAIN
+
Band B: See Band A
+
FMOD_DSP_MULTIBAND_EQ_C_FILTER
+
+

Band C: See Band A.

+ +
+
FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_C_Q
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_C_GAIN
+
Band C: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_D_FILTER
+
+

Band D: See Band A.

+ +
+
FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY
+
Band D: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_D_Q
+
Band D: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_D_GAIN
+
Band D: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_E_FILTER
+
+

Band E: See Band A.

+ +
+
FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY
+
Band E: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_E_Q
+
Band E: See Band A.
+
FMOD_DSP_MULTIBAND_EQ_E_GAIN
+
Band E: See Band A.
+
+

Flexible five band parametric equalizer.

+

See Also: FMOD_DSP_TYPE_MULTIBAND_EQ, DSP::setParameterInt, DSP::setParameterFloat

+

FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE

+

Multiband equalizer filter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE {
+  FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_6DB,
+  FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_6DB
+} FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE;
+
+ +
enum DSP_MULTIBAND_EQ_FILTER_TYPE
+{
+  DISABLED,
+  LOWPASS_12DB,
+  LOWPASS_24DB,
+  LOWPASS_48DB,
+  HIGHPASS_12DB,
+  HIGHPASS_24DB,
+  HIGHPASS_48DB,
+  LOWSHELF,
+  HIGHSHELF,
+  PEAKING,
+  BANDPASS,
+  NOTCH,
+  ALLPASS,
+  LOWPASS_6DB,
+  HIGHPASS_6DB
+}
+
+ +
FMOD.DSP_MULTIBAND_EQ_FILTER_DISABLED
+FMOD.DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB
+FMOD.DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB
+FMOD.DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB
+FMOD.DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB
+FMOD.DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB
+FMOD.DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB
+FMOD.DSP_MULTIBAND_EQ_FILTER_LOWSHELF
+FMOD.DSP_MULTIBAND_EQ_FILTER_HIGHSHELF
+FMOD.DSP_MULTIBAND_EQ_FILTER_PEAKING
+FMOD.DSP_MULTIBAND_EQ_FILTER_BANDPASS
+FMOD.DSP_MULTIBAND_EQ_FILTER_NOTCH
+FMOD.DSP_MULTIBAND_EQ_FILTER_ALLPASS
+FMOD.DSP_MULTIBAND_EQ_FILTER_LOWPASS_6DB
+FMOD.DSP_MULTIBAND_EQ_FILTER_HIGHPASS_6DB
+
+ +
+
FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED
+
Disabled filter, no processing.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB
+
Resonant low-pass filter, attenuates frequencies (12dB per octave) above a given point (with specificed resonance) while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB
+
Resonant low-pass filter, attenuates frequencies (24dB per octave) above a given point (with specificed resonance) while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB
+
Resonant low-pass filter, attenuates frequencies (48dB per octave) above a given point (with specificed resonance) while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB
+
Resonant high-pass filter, attenuates frequencies (12dB per octave) below a given point (with specificed resonance) while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB
+
Resonant high-pass filter, attenuates frequencies (24dB per octave) below a given point (with specificed resonance) while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB
+
Resonant high-pass filter, attenuates frequencies (48dB per octave) below a given point (with specificed resonance) while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF
+
Low-shelf filter, boosts or attenuates frequencies (with specified gain) below a given point while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF
+
High-shelf filter, boosts or attenuates frequencies (with specified gain) above a given point while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING
+
Peaking filter, boosts or attenuates frequencies (with specified gain) at a given point (with specificed bandwidth) while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS
+
Band-pass filter, allows frequencies at a given point (with specificed bandwidth) to pass while attenuating frequencies outside this range.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH
+
Notch or band-reject filter, attenuates frequencies at a given point (with specificed bandwidth) while allowing frequencies outside this range to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS
+
All-pass filter, allows all frequencies to pass, but changes the phase response at a given point (with specified sharpness).
+
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_6DB
+
Non-resonant low-pass filter, attenuates frequencies (6dB per octave) above a given point while allowing the rest to pass.
+
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_6DB
+
Non-resonant high-pass filter, attenuates frequencies (6dB per octave) below a given point while allowing the rest to pass.
+
+

See Also: FMOD_DSP_MULTIBAND_EQ

+

FMOD_DSP_NORMALIZE

+

Normalize DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_NORMALIZE {
+  FMOD_DSP_NORMALIZE_FADETIME,
+  FMOD_DSP_NORMALIZE_THRESHOLD,
+  FMOD_DSP_NORMALIZE_MAXAMP
+} FMOD_DSP_NORMALIZE;
+
+ +
enum DSP_NORMALIZE
+{
+  FADETIME,
+  THRESHOLD,
+  MAXAMP
+}
+
+ +
FMOD.DSP_NORMALIZE_FADETIME
+FMOD.DSP_NORMALIZE_THRESHOLD
+FMOD.DSP_NORMALIZE_MAXAMP
+
+ +
+
FMOD_DSP_NORMALIZE_FADETIME
+
+

Time to ramp the silence to full.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 20000]
  • +
  • Default: 5000
  • +
+
+
FMOD_DSP_NORMALIZE_THRESHOLD
+
+

Lower volume range threshold to ignore.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0.1
  • +
+
+
FMOD_DSP_NORMALIZE_MAXAMP
+
+

Maximum amplification allowed.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [1, 100000]
  • +
  • Default: 20
  • +
+
+
+

Normalize amplifies the sound based on the maximum peaks within the signal. For example if the maximum peaks in the signal were 50% of the bandwidth, it would scale the whole sound by 2.

+

The lower threshold value makes the normalizer ignore peaks below a certain point, to avoid over-amplification if a loud signal suddenly came in, and also to avoid amplifying to maximum things like background hiss.

+

Because FMOD is a realtime audio processor, it doesn't have the luxury of knowing the peak for the whole sound (ie it can't see into the future), so it has to process data as it comes in.

+

To avoid very sudden changes in volume level based on small samples of new data, FMOD fades towards the desired amplification which makes for smooth gain control. The fadetime parameter can control this.

+

See Also: FMOD_DSP_TYPE_NORMALIZE, DSP::setParameterFloat

+

FMOD_DSP_OBJECTPAN

+

Object based spatializer parameters.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_OBJECTPAN {
+  FMOD_DSP_OBJECTPAN_3D_POSITION,
+  FMOD_DSP_OBJECTPAN_3D_ROLLOFF,
+  FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE,
+  FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE,
+  FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE,
+  FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE,
+  FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT,
+  FMOD_DSP_OBJECTPAN_OVERALL_GAIN,
+  FMOD_DSP_OBJECTPAN_OUTPUTGAIN,
+  FMOD_DSP_OBJECTPAN_ATTENUATION_RANGE,
+  FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE
+} FMOD_DSP_OBJECTPAN;
+
+ +
enum DSP_OBJECTPAN
+{
+  _3D_POSITION,
+  _3D_ROLLOFF,
+  _3D_MIN_DISTANCE,
+  _3D_MAX_DISTANCE,
+  _3D_EXTENT_MODE,
+  _3D_SOUND_SIZE,
+  _3D_MIN_EXTENT,
+  OVERALL_GAIN,
+  OUTPUTGAIN,
+  ATTENUATION_RANGE,
+  OVERRIDE_RANGE
+}
+
+ +
FMOD.DSP_OBJECTPAN_3D_POSITION
+FMOD.DSP_OBJECTPAN_3D_ROLLOFF
+FMOD.DSP_OBJECTPAN_3D_MIN_DISTANCE
+FMOD.DSP_OBJECTPAN_3D_MAX_DISTANCE
+FMOD.DSP_OBJECTPAN_3D_EXTENT_MODE
+FMOD.DSP_OBJECTPAN_3D_SOUND_SIZE
+FMOD.DSP_OBJECTPAN_3D_MIN_EXTENT
+FMOD.DSP_OBJECTPAN_OVERALL_GAIN
+FMOD.DSP_OBJECTPAN_OUTPUTGAIN
+FMOD.DSP_OBJECTPAN_ATTENUATION_RANGE
+FMOD.DSP_OBJECTPAN_OVERRIDE_RANGE
+
+ +
+
FMOD_DSP_OBJECTPAN_3D_POSITION
+
+

3D Position.

+ +
+
FMOD_DSP_OBJECTPAN_3D_ROLLOFF
+
+

3D Roll-off Type.

+ +
+
FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE
+
+

3D Min Distance when FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE is true.

+ +
+
FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE
+
+

3D Max Distance when FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE is true.

+ +
+
FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE
+
+

3D Extent Mode.

+ +
+
FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE
+
+

3D Sound Size.

+ +
+
FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT
+
+

3D Min Extent.

+
    +
  • Type: float
  • +
  • Units: Degrees
  • +
  • Range: [0, 360]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_OBJECTPAN_OVERALL_GAIN R/O
+
+

Overall gain to allow FMOD to know the DSP is scaling the signal for virtualization purposes.

+ +
+
FMOD_DSP_OBJECTPAN_OUTPUTGAIN
+
+

Output gain level.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_OBJECTPAN_ATTENUATION_RANGE
+
+

Attenuation Range when FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE is false.

+ +
+
FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE
+
+

Override Attenuation Range with FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE and FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE.

+
    +
  • Type: bool
  • +
  • Default: true
  • +
+
+
+

Signal processed by this DSP will be sent to the global object mixer (effectively a send), any DSP connected after this will receive silence.

+

For best results this DSP should be used with FMOD_OUTPUTTYPE_WINSONIC or FMOD_OUTPUTTYPE_AUDIO3D to get height spatialization. Playback with any other output will result in fallback spatialization provided by FMOD_DSP_TYPE_PAN.

+

FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE defaults to true for backwards compatability.

+

See Also: FMOD_DSP_TYPE_OBJECTPAN, DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterData, Controlling a Spatializer DSP

+

FMOD_DSP_OSCILLATOR

+

Oscillator DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_OSCILLATOR {
+  FMOD_DSP_OSCILLATOR_TYPE,
+  FMOD_DSP_OSCILLATOR_RATE
+} FMOD_DSP_OSCILLATOR;
+
+ +
enum DSP_OSCILLATOR
+{
+  TYPE,
+  RATE
+}
+
+ +
FMOD.DSP_OSCILLATOR_TYPE
+FMOD.DSP_OSCILLATOR_RATE
+
+ +
+
FMOD_DSP_OSCILLATOR_TYPE
+
+

Waveform type. 0 = sine. 1 = square. 2 = sawup. 3 = sawdown. 4 = triangle. 5 = noise.

+
    +
  • Type: int
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_OSCILLATOR_RATE
+
+

Frequency of the tone. Does not affect the noise generator.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [0, 22000]
  • +
  • Default: 220
  • +
+
+
+

See Also: FMOD_DSP_TYPE_OSCILLATOR, DSP::setParameterFloat, DSP::setParameterInt

+

FMOD_DSP_PAN

+

Pan DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PAN {
+  FMOD_DSP_PAN_MODE,
+  FMOD_DSP_PAN_2D_STEREO_POSITION,
+  FMOD_DSP_PAN_2D_DIRECTION,
+  FMOD_DSP_PAN_2D_EXTENT,
+  FMOD_DSP_PAN_2D_ROTATION,
+  FMOD_DSP_PAN_2D_LFE_LEVEL,
+  FMOD_DSP_PAN_2D_STEREO_MODE,
+  FMOD_DSP_PAN_2D_STEREO_SEPARATION,
+  FMOD_DSP_PAN_2D_STEREO_AXIS,
+  FMOD_DSP_PAN_ENABLED_SPEAKERS,
+  FMOD_DSP_PAN_3D_POSITION,
+  FMOD_DSP_PAN_3D_ROLLOFF,
+  FMOD_DSP_PAN_3D_MIN_DISTANCE,
+  FMOD_DSP_PAN_3D_MAX_DISTANCE,
+  FMOD_DSP_PAN_3D_EXTENT_MODE,
+  FMOD_DSP_PAN_3D_SOUND_SIZE,
+  FMOD_DSP_PAN_3D_MIN_EXTENT,
+  FMOD_DSP_PAN_3D_PAN_BLEND,
+  FMOD_DSP_PAN_LFE_UPMIX_ENABLED,
+  FMOD_DSP_PAN_OVERALL_GAIN,
+  FMOD_DSP_PAN_SURROUND_SPEAKER_MODE,
+  FMOD_DSP_PAN_2D_HEIGHT_BLEND,
+  FMOD_DSP_PAN_ATTENUATION_RANGE,
+  FMOD_DSP_PAN_OVERRIDE_RANGE
+} FMOD_DSP_PAN;
+
+ +
enum DSP_PAN
+{
+  MODE,
+  _2D_STEREO_POSITION,
+  _2D_DIRECTION,
+  _2D_EXTENT,
+  _2D_ROTATION,
+  _2D_LFE_LEVEL,
+  _2D_STEREO_MODE,
+  _2D_STEREO_SEPARATION,
+  _2D_STEREO_AXIS,
+  ENABLED_SPEAKERS,
+  _3D_POSITION,
+  _3D_ROLLOFF,
+  _3D_MIN_DISTANCE,
+  _3D_MAX_DISTANCE,
+  _3D_EXTENT_MODE,
+  _3D_SOUND_SIZE,
+  _3D_MIN_EXTENT,
+  _3D_PAN_BLEND,
+  LFE_UPMIX_ENABLED,
+  OVERALL_GAIN,
+  SURROUND_SPEAKER_MODE,
+  _2D_HEIGHT_BLEND,
+  ATTENUATION_RANGE,
+  OVERRIDE_RANGE
+}
+
+ +
FMOD.DSP_PAN_MODE
+FMOD.DSP_PAN_2D_STEREO_POSITION
+FMOD.DSP_PAN_2D_DIRECTION
+FMOD.DSP_PAN_2D_EXTENT
+FMOD.DSP_PAN_2D_ROTATION
+FMOD.DSP_PAN_2D_LFE_LEVEL
+FMOD.DSP_PAN_2D_STEREO_MODE
+FMOD.DSP_PAN_2D_STEREO_SEPARATION
+FMOD.DSP_PAN_2D_STEREO_AXIS
+FMOD.DSP_PAN_ENABLED_SPEAKERS
+FMOD.DSP_PAN_3D_POSITION
+FMOD.DSP_PAN_3D_ROLLOFF
+FMOD.DSP_PAN_3D_MIN_DISTANCE
+FMOD.DSP_PAN_3D_MAX_DISTANCE
+FMOD.DSP_PAN_3D_EXTENT_MODE
+FMOD.DSP_PAN_3D_SOUND_SIZE
+FMOD.DSP_PAN_3D_MIN_EXTENT
+FMOD.DSP_PAN_3D_PAN_BLEND
+FMOD.DSP_PAN_LFE_UPMIX_ENABLED
+FMOD.DSP_PAN_OVERALL_GAIN
+FMOD.DSP_PAN_SURROUND_SPEAKER_MODE
+FMOD.DSP_PAN_2D_HEIGHT_BLEND
+FMOD.DSP_PAN_ATTENUATION_RANGE
+FMOD.DSP_PAN_OVERRIDE_RANGE
+
+ +
+
FMOD_DSP_PAN_MODE
+
+

Panner mode.

+ +
+
FMOD_DSP_PAN_2D_STEREO_POSITION
+
+

2D Stereo pan position.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [-100, 100]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_2D_DIRECTION
+
+

2D Surround pan direction. Direction from center point of panning circle where 0 is front center and -180 or +180 is rear speakers center point.

+
    +
  • Type: float
  • +
  • Units: Degrees
  • +
  • Range: [-180, 180]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_2D_EXTENT
+
+

2D Surround pan extent.

+
    +
  • Type: float
  • +
  • Units: Degrees
  • +
  • Range: [0, 360]
  • +
  • Default: 360
  • +
+
+
FMOD_DSP_PAN_2D_ROTATION
+
+

2D Surround pan rotation.

+
    +
  • Type: float
  • +
  • Units: Degrees
  • +
  • Range: [-180, 180]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_2D_LFE_LEVEL
+
+

2D Surround pan LFE level.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 20]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_2D_STEREO_MODE
+
+

Stereo-To-Surround Mode.

+ +
+
FMOD_DSP_PAN_2D_STEREO_SEPARATION
+
+

Stereo-To-Surround Stereo For FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE mode. Separation/width of L/R parts of stereo sound.

+
    +
  • Type: float
  • +
  • Units: Degrees
  • +
  • Range: [-180, 180]
  • +
  • Default: 60
  • +
+
+
FMOD_DSP_PAN_2D_STEREO_AXIS
+
+

Stereo-To-Surround Stereo For FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE mode. Axis/rotation of L/R parts of stereo sound.

+
    +
  • Type: float
  • +
  • Units: Degrees
  • +
  • Range: [-180, 180]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_ENABLED_SPEAKERS
+
+

Speakers Enabled Bitmask for each speaker from 0 to 32 to be considered by panner. Use to disable speakers from being panned to. 0 to 0xFFF. Default = 0xFFF (All on).

+
    +
  • Type: int
  • +
  • Range: [0, 0xFFF]
  • +
  • Default: 0xFFF
  • +
+
+
FMOD_DSP_PAN_3D_POSITION
+
+

3D Position of panner and listener(s).

+ +
+
FMOD_DSP_PAN_3D_ROLLOFF
+
+

3D volume attenuation curve shape.

+ +
+
FMOD_DSP_PAN_3D_MIN_DISTANCE
+
+

3D volume attenuation minimum distance when FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE is true.

+ +
+
FMOD_DSP_PAN_3D_MAX_DISTANCE
+
+

3D volume attenuation maximum distance when FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE is true.

+ +
+
FMOD_DSP_PAN_3D_EXTENT_MODE
+
+

3D Extent Mode.

+ +
+
FMOD_DSP_PAN_3D_SOUND_SIZE
+
+

3D Sound Size.

+ +
+
FMOD_DSP_PAN_3D_MIN_EXTENT
+
+

3D Min Extent.

+
    +
  • Type: float
  • +
  • Units: Degrees
  • +
  • Range: [0, 360]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_3D_PAN_BLEND
+
+

3D Pan Blend.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_LFE_UPMIX_ENABLED
+
+

LFE Upmix Enabled. Determines whether non-LFE source channels should mix to the LFE or leave it alone. 0 (off) to 1 (on). Default = 0 (off).

+
    +
  • Type: int
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_OVERALL_GAIN
+
+

Overall gain to allow FMOD to know the DSP is scaling the signal for visualization purposes.

+ +
+
FMOD_DSP_PAN_SURROUND_SPEAKER_MODE
+
+

Surround speaker mode. (FMOD_SPEAKERMODE)

+ +
+
FMOD_DSP_PAN_2D_HEIGHT_BLEND
+
+

2D Height blend. When the input or FMOD_DSP_PAN_SURROUND_SPEAKER_MODE has height speakers, control the blend between ground and height. -1.0 (push top speakers to ground), 0.0 (preserve top / ground separation), 1.0 (push ground speakers to top).

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [-1, 1]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_PAN_ATTENUATION_RANGE
+
+

Attenuation Range when FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE is false.

+ +
+
FMOD_DSP_PAN_OVERRIDE_RANGE
+
+

Override Attenuation Range with FMOD_DSP_PAN_3D_MIN_DISTANCE and FMOD_DSP_PAN_3D_MAX_DISTANCE.

+
    +
  • Type: bool
  • +
  • Default: true
  • +
+
+
+

FMOD_DSP_PAN_3D_PAN_BLEND controls the percentage of the effect supplied by FMOD_DSP_PAN_2D_DIRECTION and FMOD_DSP_PAN_2D_EXTENT.

+

For FMOD_DSP_PAN_3D_POSITION, the following members in the FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI struct should be non zero.
+- numlisteners - This is typically 1, can be up to 8. Typically more than 1 is only used for split screen purposes. The FMOD Panner will average angles and produce the best compromise for panning and attenuation.
+- relative[listenernum].position - This is the delta between the listener position and the sound position. Typically the listener position is subtracted from the sound position.
+- relative[listenernum].forward - This is the sound's forward vector. Optional, set to 0,0,1 if not needed. This is only relevant for more than mono sounds in 3D, that are spread amongst the destination speakers at the time of panning.

+
    If the sound rotates then the L/R part of a stereo sound will rotate amongst its destination speakers.
+    If the sound has moved and pinpointed into a single speaker, rotation of the sound will have no effect as at that point the channels are collapsed into a single point.
+
+ +

For FMOD_DSP_PAN_2D_STEREO_MODE, when it is set to FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE, only FMOD_DSP_PAN_2D_STEREO_SEPARATION and FMOD_DSP_PAN_2D_STEREO_AXIS are used.
+When it is set to FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED, then standard FMOD_DSP_PAN_2D_DIRECTION/FMOD_DSP_PAN_2D_EXTENT parameters are used.

+

FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE defaults to true for backwards compatability.

+

See Also: FMOD_DSP_TYPE_PAN, DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterData, Controlling a Spatializer DSP

+

FMOD_DSP_PAN_2D_STEREO_MODE_TYPE

+

2D stereo mode values for pan DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PAN_2D_STEREO_MODE_TYPE {
+  FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED,
+  FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE
+} FMOD_DSP_PAN_2D_STEREO_MODE_TYPE;
+
+ +
enum DSP_PAN_2D_STEREO_MODE_TYPE
+{
+  DISTRIBUTED,
+  DISCRETE
+}
+
+ +
FMOD.DSP_PAN_2D_STEREO_MODE_DISTRIBUTED
+FMOD.DSP_PAN_2D_STEREO_MODE_DISCRETE
+
+ +
+
FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED
+
The parts of a stereo sound are spread around destination speakers based on FMOD_DSP_PAN_2D_EXTENT / FMOD_DSP_PAN_2D_DIRECTION
+
FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE
+
The L/R parts of a stereo sound are rotated around a circle based on FMOD_DSP_PAN_2D_STEREO_AXIS / FMOD_DSP_PAN_2D_STEREO_SEPARATION.
+
+

See Also: FMOD_DSP_PAN_2D_STEREO_MODE, FMOD_DSP_TYPE_PAN, FMOD_DSP_PAN

+

FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE

+

3D extent mode values for pan DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE {
+  FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO,
+  FMOD_DSP_PAN_3D_EXTENT_MODE_USER,
+  FMOD_DSP_PAN_3D_EXTENT_MODE_OFF
+} FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE;
+
+ +
enum DSP_PAN_3D_EXTENT_MODE_TYPE
+{
+  AUTO,
+  USER,
+  OFF
+}
+
+ +
FMOD.DSP_PAN_3D_EXTENT_MODE_AUTO
+FMOD.DSP_PAN_3D_EXTENT_MODE_USER
+FMOD.DSP_PAN_3D_EXTENT_MODE_OFF
+
+ +
+
FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO
+
+
FMOD_DSP_PAN_3D_EXTENT_MODE_USER
+
+
FMOD_DSP_PAN_3D_EXTENT_MODE_OFF
+
+
+

See Also: FMOD_DSP_PAN_3D_EXTENT_MODE, FMOD_DSP_TYPE_PAN, FMOD_DSP_PAN

+

FMOD_DSP_PAN_3D_ROLLOFF_TYPE

+

3D roll-off values for pan DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PAN_3D_ROLLOFF_TYPE {
+  FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED,
+  FMOD_DSP_PAN_3D_ROLLOFF_LINEAR,
+  FMOD_DSP_PAN_3D_ROLLOFF_INVERSE,
+  FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED,
+  FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM
+} FMOD_DSP_PAN_3D_ROLLOFF_TYPE;
+
+ +
enum DSP_PAN_3D_ROLLOFF_TYPE
+{
+  LINEARSQUARED,
+  LINEAR,
+  INVERSE,
+  INVERSETAPERED,
+  CUSTOM
+}
+
+ +
FMOD.DSP_PAN_3D_ROLLOFF_LINEARSQUARED
+FMOD.DSP_PAN_3D_ROLLOFF_LINEAR
+FMOD.DSP_PAN_3D_ROLLOFF_INVERSE
+FMOD.DSP_PAN_3D_ROLLOFF_INVERSETAPERED
+FMOD.DSP_PAN_3D_ROLLOFF_CUSTOM
+
+ +
+
FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED
+
This is a linear-square roll-off model. Below mindistance, the volume is unattenuated; as distance increases from mindistance to maxdistance, the volume attenuates to silence according to a linear squared gradient. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. This roll-off mode provides steeper volume ramping close to the mindistance, and more gradual ramping close to the maxdistance, than linear roll-off mode.
+
Linear Square Roll-off Graph
+
FMOD_DSP_PAN_3D_ROLLOFF_LINEAR
+
This is a linear roll-off model. Below mindistance, the volume is unattenuated; as distance increases from mindistance to maxdistance, the volume attenuates to silence using a linear gradient. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. While this roll-off mode is not as realistic as inverse roll-off mode, it is easier to comprehend.
+
Linear Roll-off Graph
+
FMOD_DSP_PAN_3D_ROLLOFF_INVERSE
+
This is an inverse roll-off model. Below mindistance, the volume is unattenuated; as distance increases above mindistance, the volume attenuates using mindistance/distance as the gradient until it reaches maxdistance, where it stops attenuating. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. This roll-off mode accurately models the way sounds attenuate over distance in the real world. (DEFAULT)
+
Inverse Roll-off Graph
+
FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED
+
This is a combination of the inverse and linear-square roll-off models. At short distances where inverse roll-off would provide greater attenuation, it functions as inverse roll-off mode; then at greater distances where linear-square roll-off mode would provide greater attenuation, it uses that roll-off mode instead. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. Inverse tapered roll-off mode approximates realistic behavior while still guaranteeing the sound attenuates to silence at maxdistance.
+
Inverse Tapered Roll-off Graph
+
FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM
+
Custom roll-off can be defined by the programmer setting volume manually. Attenuation in the Pan DSP is turned off in this mode.
+
+

Minimum and Maximum distance settings are controlled with FMOD_DSP_PAN_3D_MIN_DISTANCE and FMOD_DSP_PAN_3D_MAX_DISTANCE.

+

See Also: FMOD_DSP_PAN_3D_ROLLOFF, FMOD_DSP_TYPE_PAN, FMOD_DSP_PAN

+

FMOD_DSP_PAN_MODE_TYPE

+

Pan mode values for the pan DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PAN_MODE_TYPE {
+  FMOD_DSP_PAN_MODE_MONO,
+  FMOD_DSP_PAN_MODE_STEREO,
+  FMOD_DSP_PAN_MODE_SURROUND
+} FMOD_DSP_PAN_MODE_TYPE;
+
+ +
enum DSP_PAN_MODE_TYPE
+{
+  MONO,
+  STEREO,
+  SURROUND
+}
+
+ +
FMOD.DSP_PAN_MODE_MONO
+FMOD.DSP_PAN_MODE_STEREO
+FMOD.DSP_PAN_MODE_SURROUND
+
+ +
+
FMOD_DSP_PAN_MODE_MONO
+
Single channel output.
+
FMOD_DSP_PAN_MODE_STEREO
+
Two channel output
+
FMOD_DSP_PAN_MODE_SURROUND
+
Three or more channel output. Includes common modes like quad, 5.1 or 7.1.
+
+

See Also: FMOD_DSP_PAN_MODE, FMOD_DSP_TYPE_PAN, FMOD_DSP_PAN

+

FMOD_DSP_PARAMEQ

+

Parametric EQ DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PARAMEQ {
+  FMOD_DSP_PARAMEQ_CENTER,
+  FMOD_DSP_PARAMEQ_BANDWIDTH,
+  FMOD_DSP_PARAMEQ_GAIN
+} FMOD_DSP_PARAMEQ;
+
+ +
enum DSP_PARAMEQ
+{
+  CENTER,
+  BANDWIDTH,
+  GAIN
+}
+
+ +
FMOD.DSP_PARAMEQ_CENTER
+FMOD.DSP_PARAMEQ_BANDWIDTH
+FMOD.DSP_PARAMEQ_GAIN
+
+ +
+
FMOD_DSP_PARAMEQ_CENTER
+
+

Frequency center.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [20, 22000]
  • +
  • Default: 8000
  • +
+
+
FMOD_DSP_PARAMEQ_BANDWIDTH
+
+

Octave range around the center frequency to filter.

+
    +
  • Type: float
  • +
  • Range: [0.2, 5]
  • +
  • Default: 1
  • +
+
+
FMOD_DSP_PARAMEQ_GAIN
+
+

Frequency Gain in dB.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-30, 30]
  • +
  • Default: 0
  • +
+
+
+

Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:

+
// Configure a single band (band A) as a peaking EQ (all other bands default to off).
+// Center frequency can be used as with the old effect.
+// Bandwidth can be applied by setting the 'Q' value of the new effect.
+// Gain at the center frequency can be used the same as with the old effect.
+FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, center);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_Q, bandwidth);
+FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_GAIN, gain);
+
+ +

Parametric EQ is a single band peaking EQ filter that attenuates or amplifies a selected frequency and its neighboring frequencies.

+

When the gain is set to zero decibels the sound will be unaffected and represents the original signal exactly.

+

See Also: FMOD_DSP_TYPE_PARAMEQ, DSP::setParameterFloat, DSP::getParameterFloat, FMOD_DSP_TYPE

+

FMOD_DSP_PITCHSHIFT

+

Pitch shifter DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PITCHSHIFT {
+  FMOD_DSP_PITCHSHIFT_PITCH,
+  FMOD_DSP_PITCHSHIFT_FFTSIZE,
+  FMOD_DSP_PITCHSHIFT_OVERLAP,
+  FMOD_DSP_PITCHSHIFT_MAXCHANNELS
+} FMOD_DSP_PITCHSHIFT;
+
+ +
enum DSP_PITCHSHIFT
+{
+  PITCH,
+  FFTSIZE,
+  OVERLAP,
+  MAXCHANNELS
+}
+
+ +
FMOD.DSP_PITCHSHIFT_PITCH
+FMOD.DSP_PITCHSHIFT_FFTSIZE
+FMOD.DSP_PITCHSHIFT_OVERLAP
+FMOD.DSP_PITCHSHIFT_MAXCHANNELS
+
+ +
+
FMOD_DSP_PITCHSHIFT_PITCH
+
+

Pitch value. 0.5 = one octave down, 2.0 = one octave up. 1.0 does not change the pitch.

+
    +
  • Type: float
  • +
  • Range: [0.5, 2]
  • +
  • Default: 1
  • +
+
+
FMOD_DSP_PITCHSHIFT_FFTSIZE
+
+

FFT window size - 256, 512, 1024, 2048, 4096. Increase this to reduce 'smearing'. This effect creates a warbling sound similar to when an mp3 is encoded at very low bitrates.

+
    +
  • Type: float
  • +
  • Default: 1024
  • +
+
+
FMOD_DSP_PITCHSHIFT_OVERLAP
+
Removed. Do not use. FMOD now uses 4 overlaps and cannot be changed.
+
FMOD_DSP_PITCHSHIFT_MAXCHANNELS
+
+

Maximum channels supported. 0 = same as FMOD's default output polyphony, 1 = mono, 2 = stereo etc. See remarks for more. It is recommended to leave it at 0.

+
    +
  • Type: float
  • +
  • Range: [0, 16]
  • +
+
+
+

FMOD_DSP_PITCHSHIFT_MAXCHANNELS dictates the amount of memory allocated. By default, the maxchannels value is 0. If FMOD is set to stereo, the pitch shift unit will allocate enough memory for 2 channels. If it is 5.1, it will allocate enough memory for a 6 channel pitch shift, etc.

+

If the pitch shift effect is only ever applied to the global mix (i.e. with ChannelControl::addDSP on a ChannelGroup object), then 0 is the value to set as it will be enough to handle all speaker modes.

+

When the pitch shift is added to a Channel (i.e. with ChannelControl::addDSP on a Channel object) then the channel count of the signal that comes in could potentially be anything from 1 to 8. It is only in this case that you might want to increase the channel count above the output's channel count.

+

If a Channel pitch shift is set to a lower number than the signal's channel count that is coming in, it will not pitch shift the sound.

+

See Also: FMOD_DSP_TYPE_PITCHSHIFT, DSP::setParameterFloat

+

FMOD_DSP_RETURN

+

Return DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_RETURN {
+  FMOD_DSP_RETURN_ID,
+  FMOD_DSP_RETURN_INPUT_SPEAKER_MODE
+} FMOD_DSP_RETURN;
+
+ +
enum DSP_RETURN
+{
+  ID,
+  INPUT_SPEAKER_MODE
+}
+
+ +
FMOD.DSP_RETURN_ID
+FMOD.DSP_RETURN_INPUT_SPEAKER_MODE
+
+ +
+
FMOD_DSP_RETURN_ID R/O
+
+

ID of this Return DSP.

+
    +
  • Type: int
  • +
  • Default: -1
  • +
+
+
FMOD_DSP_RETURN_INPUT_SPEAKER_MODE
+
+

Input speaker mode of this return.

+ +
+
+

See Also: FMOD_DSP_TYPE_RETURN, DSP::setParameterInt

+

FMOD_DSP_SEND

+

Send DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_SEND {
+  FMOD_DSP_SEND_RETURNID,
+  FMOD_DSP_SEND_LEVEL
+} FMOD_DSP_SEND;
+
+ +
enum DSP_SEND
+{
+  RETURNID,
+  LEVEL,
+}
+
+ +
FMOD.DSP_SEND_RETURNID
+FMOD.DSP_SEND_LEVEL
+
+ +
+
FMOD_DSP_SEND_RETURNID
+
+

ID of the Return DSP this send is connected to where -1 indicates no connected return DSP.

+
    +
  • Type: int
  • +
  • Default = -1
  • +
+
+
FMOD_DSP_SEND_LEVEL
+
+

Send level.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

See Also: FMOD_DSP_TYPE_SEND, DSP::setParameterInt, DSP::setParameterFloat

+

FMOD_DSP_SFXREVERB

+

SFX reverb DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_SFXREVERB {
+  FMOD_DSP_SFXREVERB_DECAYTIME,
+  FMOD_DSP_SFXREVERB_EARLYDELAY,
+  FMOD_DSP_SFXREVERB_LATEDELAY,
+  FMOD_DSP_SFXREVERB_HFREFERENCE,
+  FMOD_DSP_SFXREVERB_HFDECAYRATIO,
+  FMOD_DSP_SFXREVERB_DIFFUSION,
+  FMOD_DSP_SFXREVERB_DENSITY,
+  FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY,
+  FMOD_DSP_SFXREVERB_LOWSHELFGAIN,
+  FMOD_DSP_SFXREVERB_HIGHCUT,
+  FMOD_DSP_SFXREVERB_EARLYLATEMIX,
+  FMOD_DSP_SFXREVERB_WETLEVEL,
+  FMOD_DSP_SFXREVERB_DRYLEVEL
+} FMOD_DSP_SFXREVERB;
+
+ +
enum DSP_SFXREVERB
+{
+  DECAYTIME,
+  EARLYDELAY,
+  LATEDELAY,
+  HFREFERENCE,
+  HFDECAYRATIO,
+  DIFFUSION,
+  DENSITY,
+  LOWSHELFFREQUENCY,
+  LOWSHELFGAIN,
+  HIGHCUT,
+  EARLYLATEMIX,
+  WETLEVEL,
+  DRYLEVEL
+}
+
+ +
FMOD.DSP_SFXREVERB_DECAYTIME
+FMOD.DSP_SFXREVERB_EARLYDELAY
+FMOD.DSP_SFXREVERB_LATEDELAY
+FMOD.DSP_SFXREVERB_HFREFERENCE
+FMOD.DSP_SFXREVERB_HFDECAYRATIO
+FMOD.DSP_SFXREVERB_DIFFUSION
+FMOD.DSP_SFXREVERB_DENSITY
+FMOD.DSP_SFXREVERB_LOWSHELFFREQUENCY
+FMOD.DSP_SFXREVERB_LOWSHELFGAIN
+FMOD.DSP_SFXREVERB_HIGHCUT
+FMOD.DSP_SFXREVERB_EARLYLATEMIX
+FMOD.DSP_SFXREVERB_WETLEVEL
+FMOD.DSP_SFXREVERB_DRYLEVEL
+
+ +
+
FMOD_DSP_SFXREVERB_DECAYTIME
+
+

Reverberation decay time at low-frequencies.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [100, 20000]
  • +
  • Default: 1500
  • +
+
+
FMOD_DSP_SFXREVERB_EARLYDELAY
+
+

Delay time of first reflection.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 300]
  • +
  • Default: 20
  • +
+
+
FMOD_DSP_SFXREVERB_LATEDELAY
+
+

Late reverberation delay time relative to first reflection in milliseconds.

+
    +
  • Type: float
  • +
  • Units: Milliseconds
  • +
  • Range: [0, 100]
  • +
  • Default: 40
  • +
+
+
FMOD_DSP_SFXREVERB_HFREFERENCE
+
+

Reference frequency for high-frequency decay.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [20, 20000]
  • +
  • Default: 5000
  • +
+
+
FMOD_DSP_SFXREVERB_HFDECAYRATIO
+
+

High-frequency decay time relative to decay time.

+
    +
  • Type: float
  • +
  • Units: Percent
  • +
  • Range: [10, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_SFXREVERB_DIFFUSION
+
+

Reverberation diffusion (echo density).

+
    +
  • Type: float
  • +
  • Units: Percent
  • +
  • Range: [10, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_SFXREVERB_DENSITY
+
+

Reverberation density (modal density).

+
    +
  • Type: float
  • +
  • Units: Percent
  • +
  • Range: [10, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY
+
+

Transition frequency of low-shelf filter.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [20, 1000]
  • +
  • Default: 250
  • +
+
+
FMOD_DSP_SFXREVERB_LOWSHELFGAIN
+
+

Gain of low-shelf filter.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-36, 12]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_SFXREVERB_HIGHCUT
+
+

Cutoff frequency of low-pass filter.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [20, 20000]
  • +
  • Default: 20000
  • +
+
+
FMOD_DSP_SFXREVERB_EARLYLATEMIX
+
+

Blend ratio of late reverb to early reflections.

+
    +
  • Type: float
  • +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
  • Default: 50
  • +
+
+
FMOD_DSP_SFXREVERB_WETLEVEL
+
+

Reverb signal level.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 20]
  • +
  • Default: -6
  • +
+
+
FMOD_DSP_SFXREVERB_DRYLEVEL
+
+

Dry signal level.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 20]
  • +
  • Default: 0
  • +
+
+
+

This is a high quality I3DL2 based reverb. On top of the I3DL2 property set, "Dry Level" is also included to allow the dry mix to be changed. These properties can be set with presets in FMOD_REVERB_PRESETS.

+

See Also: FMOD_DSP_TYPE_SFXREVERB, DSP::setParameterFloat, FMOD_REVERB_PRESETS

+

FMOD_DSP_THREE_EQ

+

Three EQ DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_THREE_EQ {
+  FMOD_DSP_THREE_EQ_LOWGAIN,
+  FMOD_DSP_THREE_EQ_MIDGAIN,
+  FMOD_DSP_THREE_EQ_HIGHGAIN,
+  FMOD_DSP_THREE_EQ_LOWCROSSOVER,
+  FMOD_DSP_THREE_EQ_HIGHCROSSOVER,
+  FMOD_DSP_THREE_EQ_CROSSOVERSLOPE
+} FMOD_DSP_THREE_EQ;
+
+ +
enum DSP_THREE_EQ
+{
+  LOWGAIN,
+  MIDGAIN,
+  HIGHGAIN,
+  LOWCROSSOVER,
+  HIGHCROSSOVER,
+  CROSSOVERSLOPE
+}
+
+ +
FMOD.DSP_THREE_EQ_LOWGAIN
+FMOD.DSP_THREE_EQ_MIDGAIN
+FMOD.DSP_THREE_EQ_HIGHGAIN
+FMOD.DSP_THREE_EQ_LOWCROSSOVER
+FMOD.DSP_THREE_EQ_HIGHCROSSOVER
+FMOD.DSP_THREE_EQ_CROSSOVERSLOPE
+
+ +
+
FMOD_DSP_THREE_EQ_LOWGAIN
+
+

Low frequency gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_THREE_EQ_MIDGAIN
+
+

Mid frequency gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_THREE_EQ_HIGHGAIN
+
+

High frequency gain.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_THREE_EQ_LOWCROSSOVER
+
+

Low-to-mid crossover frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [10, 22000]
  • +
  • Default: 400
  • +
+
+
FMOD_DSP_THREE_EQ_HIGHCROSSOVER
+
+

Mid-to-high crossover frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [10, 22000]
  • +
  • Default: 4000
  • +
+
+
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE
+
+

Crossover Slope type.

+ +
+
+

See Also: FMOD_DSP_TYPE_THREE_EQ, DSP::setParameterFloat, DSP::setParameterInt

+

FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE

+

Crossover values for the three EQ DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE {
+  FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB,
+  FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB,
+  FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB
+} FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE;
+
+ +
enum DSP_THREE_EQ_CROSSOVERSLOPE_TYPE
+{
+  _12DB,
+  _24DB,
+  _48DB
+}
+
+ +
FMOD.DSP_THREE_EQ_CROSSOVERSLOPE_12DB
+FMOD.DSP_THREE_EQ_CROSSOVERSLOPE_24DB
+FMOD.DSP_THREE_EQ_CROSSOVERSLOPE_48DB
+
+ +
+
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB
+
12dB/Octave crossover slope.
+
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB
+
24dB/Octave crossover slope.
+
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB
+
48dB/Octave crossover slope.
+
+

See Also: FMOD_DSP_THREE_EQ_CROSSOVERSLOPE, FMOD_DSP_TYPE_THREE_EQ, FMOD_DSP_THREE_EQ

+

FMOD_DSP_TRANSCEIVER

+

Transceiver DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_TRANSCEIVER {
+  FMOD_DSP_TRANSCEIVER_TRANSMIT,
+  FMOD_DSP_TRANSCEIVER_GAIN,
+  FMOD_DSP_TRANSCEIVER_CHANNEL,
+  FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE
+} FMOD_DSP_TRANSCEIVER;
+
+ +
enum DSP_TRANSCEIVER
+{
+  TRANSMIT,
+  GAIN,
+  CHANNEL,
+  TRANSMITSPEAKERMODE
+}
+
+ +
FMOD.DSP_TRANSCEIVER_TRANSMIT
+FMOD.DSP_TRANSCEIVER_GAIN
+FMOD.DSP_TRANSCEIVER_CHANNEL
+FMOD.DSP_TRANSCEIVER_TRANSMITSPEAKERMODE
+
+ +
+
FMOD_DSP_TRANSCEIVER_TRANSMIT
+
+

FALSE = Transceiver is a 'receiver' (like a return) and accepts data from a channel. TRUE = Transceiver is a 'transmitter' (like a send).

+
    +
  • Type: bool
  • +
  • Default: false
  • +
+
+
FMOD_DSP_TRANSCEIVER_GAIN
+
+

Gain to receive or transmit.

+
    +
  • Type: float
  • +
  • Units: Decibels
  • +
  • Range: [-80, 10]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_TRANSCEIVER_CHANNEL
+
+

Global slot that can be transmitted to or received from.

+
    +
  • Type: int
  • +
  • Range: [0, 31]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE
+
+

Speaker mode (transmitter mode only). (FMOD_DSP_TRANSCEIVER_SPEAKERMODE)

+ +
+
+

The transceiver only transmits and receives to a global array of 32 channels. The transceiver can be set to receiver mode (like a return) and can receive the signal at a variable gain. The transceiver can also be set to transmit to a channel (like a send) and can transmit the signal with a variable gain.

+

The FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE is only applicable to the transmission format, not the receive format. This means this parameter is ignored in 'receive mode'. This allows receivers to receive at the speaker mode of the user's choice. Receiving from a mono channel, is cheaper than receiving from a surround channel for example. The 3 speaker modes FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO, FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO, FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND are stored as separate buffers in memory for a transmitter channel. To save memory, use 1 common speaker mode for a transmitter.

+

The transceiver is double buffered to avoid desyncing of transmitters and receivers. This means there will be a 1 block delay on a receiver, compared to the data sent from a transmitter. Multiple transmitters sending to the same channel will be mixed together.

+

See Also: FMOD_DSP_TYPE_TRANSCEIVER, FMOD_DSP_TRANSCEIVER_GAIN, DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterBool

+

FMOD_DSP_TRANSCEIVER_SPEAKERMODE

+

Speaker mode values for the transceiver DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_TRANSCEIVER_SPEAKERMODE {
+  FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1,
+  FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0,
+  FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO,
+  FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND
+} FMOD_DSP_TRANSCEIVER_SPEAKERMODE;
+
+ +
enum DSP_TRANSCEIVER_SPEAKERMODE
+{
+  AUTO = -1,
+  MONO = 0,
+  STEREO,
+  SURROUND,
+}
+
+ +
FMOD.DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1
+FMOD.DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0
+FMOD.DSP_TRANSCEIVER_SPEAKERMODE_STEREO
+FMOD.DSP_TRANSCEIVER_SPEAKERMODE_SURROUND
+
+ +
+
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO
+
The transmitter uses the channel count of its input signal as the channel count of its channel buffer.
+
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO
+
The transmitter downmixes its input signal to a mono channel buffer.
+
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO
+
The transmitter upmixes or downmixes its input signal to a stereo channel buffer.
+
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND
+
The transmitter upmixes or downmixes its input signal to a surround channel buffer. Surround could mean any speaker mode above stereo, so this could mean quad/surround/5.1/7.1.
+
+

The speaker mode of a transceiver buffer (of which there are up to 32) is determined automatically depending on the signal flowing through the transceiver effect, or it can be forced to a specific mode. Smaller fixed speaker mode buffers can save memory. This is only relevant for transmitter DSPs, as only transmitters control the format of the transceiver channel's buffer.

+

If multiple transceivers transmit to a single buffer in different speaker modes, the buffer allocates memory for each of those speaker modes. This uses more memory than a single speaker mode. If there are multiple receivers reading from a channel with multiple speaker modes in its buffer, each receiver reads them all and mixes them together.

+

If the system's speaker mode is stereo or mono, it will not create a 3rd buffer, it will just use the mono/stereo speaker mode buffer.

+

See Also: FMOD_DSP_TYPE_TRANSCEIVER, FMOD_DSP_TRANSCEIVER_SPEAKERMODE, DSP::setParameterInt

+

FMOD_DSP_TREMOLO

+

Tremolo DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_TREMOLO {
+  FMOD_DSP_TREMOLO_FREQUENCY,
+  FMOD_DSP_TREMOLO_DEPTH,
+  FMOD_DSP_TREMOLO_SHAPE,
+  FMOD_DSP_TREMOLO_SKEW,
+  FMOD_DSP_TREMOLO_DUTY,
+  FMOD_DSP_TREMOLO_SQUARE,
+  FMOD_DSP_TREMOLO_PHASE,
+  FMOD_DSP_TREMOLO_SPREAD
+} FMOD_DSP_TREMOLO;
+
+ +
enum DSP_TREMOLO
+{
+  FREQUENCY,
+  DEPTH,
+  SHAPE,
+  SKEW,
+  DUTY,
+  SQUARE,
+  PHASE,
+  SPREAD
+}
+
+ +
FMOD.DSP_TREMOLO_FREQUENCY
+FMOD.DSP_TREMOLO_DEPTH
+FMOD.DSP_TREMOLO_SHAPE
+FMOD.DSP_TREMOLO_SKEW
+FMOD.DSP_TREMOLO_DUTY
+FMOD.DSP_TREMOLO_SQUARE
+FMOD.DSP_TREMOLO_PHASE
+FMOD.DSP_TREMOLO_SPREAD
+
+ +
+
FMOD_DSP_TREMOLO_FREQUENCY
+
+

LFO frequency.

+
    +
  • Type: float
  • +
  • Units: Hertz
  • +
  • Range: [0.1, 20]
  • +
  • Default: 5
  • +
+
+
FMOD_DSP_TREMOLO_DEPTH
+
+

Tremolo depth.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
FMOD_DSP_TREMOLO_SHAPE
+
+

LFO shape morph between triangle and sine.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
FMOD_DSP_TREMOLO_SKEW
+
+

Time-skewing of LFO cycle.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [-1, 1]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_TREMOLO_DUTY
+
+

LFO on-time.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0.5
  • +
+
+
FMOD_DSP_TREMOLO_SQUARE
+
+

Flatness of the LFO shape.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
FMOD_DSP_TREMOLO_PHASE
+
+

Instantaneous LFO phase.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
FMOD_DSP_TREMOLO_SPREAD
+
+

Rotation / auto-pan effect.

+
    +
  • Type: float
  • +
  • Units: Linear
  • +
  • Range: [-1, 1]
  • +
  • Default: 0
  • +
+
+
+

The tremolo effect varies the amplitude of a sound. Depending on the settings, this unit can produce a tremolo, chopper or auto-pan effect.

+

The shape of the LFO (low freq. oscillator) can morphed between sine, triangle and sawtooth waves using the FMOD_DSP_TREMOLO_SHAPE and FMOD_DSP_TREMOLO_SKEW parameters.

+

FMOD_DSP_TREMOLO_DUTY and FMOD_DSP_TREMOLO_SQUARE are useful for a chopper-type effect where the first controls the on-time duration and second controls the flatness of the envelope.

+

FMOD_DSP_TREMOLO_SPREAD varies the LFO phase between channels to get an auto-pan effect. This works best with a sine shape LFO.

+

The LFO can be synchronized using the FMOD_DSP_TREMOLO_PHASE parameter which sets its instantaneous phase.

+

See Also: FMOD_DSP_TYPE_TREMOLO, DSP::setParameterFloat

+

FMOD_DSP_TYPE

+

DSP types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_TYPE {
+  FMOD_DSP_TYPE_UNKNOWN,
+  FMOD_DSP_TYPE_MIXER,
+  FMOD_DSP_TYPE_OSCILLATOR,
+  FMOD_DSP_TYPE_LOWPASS,
+  FMOD_DSP_TYPE_ITLOWPASS,
+  FMOD_DSP_TYPE_HIGHPASS,
+  FMOD_DSP_TYPE_ECHO,
+  FMOD_DSP_TYPE_FADER,
+  FMOD_DSP_TYPE_FLANGE,
+  FMOD_DSP_TYPE_DISTORTION,
+  FMOD_DSP_TYPE_NORMALIZE,
+  FMOD_DSP_TYPE_LIMITER,
+  FMOD_DSP_TYPE_PARAMEQ,
+  FMOD_DSP_TYPE_PITCHSHIFT,
+  FMOD_DSP_TYPE_CHORUS,
+  FMOD_DSP_TYPE_ITECHO,
+  FMOD_DSP_TYPE_COMPRESSOR,
+  FMOD_DSP_TYPE_SFXREVERB,
+  FMOD_DSP_TYPE_LOWPASS_SIMPLE,
+  FMOD_DSP_TYPE_DELAY,
+  FMOD_DSP_TYPE_TREMOLO,
+  FMOD_DSP_TYPE_SEND,
+  FMOD_DSP_TYPE_RETURN,
+  FMOD_DSP_TYPE_HIGHPASS_SIMPLE,
+  FMOD_DSP_TYPE_PAN,
+  FMOD_DSP_TYPE_THREE_EQ,
+  FMOD_DSP_TYPE_FFT,
+  FMOD_DSP_TYPE_LOUDNESS_METER,
+  FMOD_DSP_TYPE_CONVOLUTIONREVERB,
+  FMOD_DSP_TYPE_CHANNELMIX,
+  FMOD_DSP_TYPE_TRANSCEIVER,
+  FMOD_DSP_TYPE_OBJECTPAN,
+  FMOD_DSP_TYPE_MULTIBAND_EQ,
+  FMOD_DSP_TYPE_MULTIBAND_DYNAMICS,
+  FMOD_DSP_TYPE_MAX
+} FMOD_DSP_TYPE;
+
+ +
enum DSP_TYPE : int
+{
+  UNKNOWN,
+  MIXER,
+  OSCILLATOR,
+  LOWPASS,
+  ITLOWPASS,
+  HIGHPASS,
+  ECHO,
+  FADER,
+  FLANGE,
+  DISTORTION,
+  NORMALIZE,
+  LIMITER,
+  PARAMEQ,
+  PITCHSHIFT,
+  CHORUS,
+  ITECHO,
+  COMPRESSOR,
+  SFXREVERB,
+  LOWPASS_SIMPLE,
+  DELAY,
+  TREMOLO,
+  SEND,
+  RETURN,
+  HIGHPASS_SIMPLE,
+  PAN,
+  THREE_EQ,
+  FFT,
+  LOUDNESS_METER,
+  CONVOLUTIONREVERB,
+  CHANNELMIX,
+  TRANSCEIVER,
+  OBJECTPAN,
+  MULTIBAND_EQ,
+  MULTIBAND_DYNAMICS,
+  MAX
+}
+
+ +
FMOD.DSP_TYPE_UNKNOWN
+FMOD.DSP_TYPE_MIXER
+FMOD.DSP_TYPE_OSCILLATOR
+FMOD.DSP_TYPE_LOWPASS
+FMOD.DSP_TYPE_ITLOWPASS
+FMOD.DSP_TYPE_HIGHPASS
+FMOD.DSP_TYPE_ECHO
+FMOD.DSP_TYPE_FADER
+FMOD.DSP_TYPE_FLANGE
+FMOD.DSP_TYPE_DISTORTION
+FMOD.DSP_TYPE_NORMALIZE
+FMOD.DSP_TYPE_LIMITER
+FMOD.DSP_TYPE_PARAMEQ
+FMOD.DSP_TYPE_PITCHSHIFT
+FMOD.DSP_TYPE_CHORUS
+FMOD.DSP_TYPE_ITECHO
+FMOD.DSP_TYPE_COMPRESSOR
+FMOD.DSP_TYPE_SFXREVERB
+FMOD.DSP_TYPE_LOWPASS_SIMPLE
+FMOD.DSP_TYPE_DELAY
+FMOD.DSP_TYPE_TREMOLO
+FMOD.DSP_TYPE_SEND
+FMOD.DSP_TYPE_RETURN
+FMOD.DSP_TYPE_HIGHPASS_SIMPLE
+FMOD.DSP_TYPE_PAN
+FMOD.DSP_TYPE_THREE_EQ
+FMOD.DSP_TYPE_FFT
+FMOD.DSP_TYPE_LOUDNESS_METER
+FMOD.DSP_TYPE_CONVOLUTIONREVERB
+FMOD.DSP_TYPE_CHANNELMIX
+FMOD.DSP_TYPE_TRANSCEIVER
+FMOD.DSP_TYPE_OBJECTPAN
+FMOD.DSP_TYPE_MULTIBAND_EQ
+FMOD.DSP_TYPE_MULTIBAND_DYNAMICS
+FMOD.DSP_TYPE_MAX
+
+ +
+
FMOD_DSP_TYPE_UNKNOWN
+
Was created via a non-FMOD plug-in and has an unknown purpose.
+
FMOD_DSP_TYPE_MIXER
+
Does not process the signal. Acts as a unit purely for mixing inputs.
+
FMOD_DSP_TYPE_OSCILLATOR
+
Generates sine/square/saw/triangle or noise tones. See FMOD_DSP_OSCILLATOR for parameter information, Effect reference - Oscillator for overview.
+
FMOD_DSP_TYPE_LOWPASS
+
Filters sound using a high quality, resonant lowpass filter algorithm but consumes more CPU time. Deprecated and will be removed in a future release. See FMOD_DSP_LOWPASS remarks for parameter information, Effect reference - Low Pass for overview.
+
FMOD_DSP_TYPE_ITLOWPASS
+
Filters sound using a resonant lowpass filter algorithm that is used in Impulse Tracker, but with limited cutoff range (0 to 8060hz). See FMOD_DSP_ITLOWPASS for parameter information, Effect reference - IT Low Pass for overview.
+
FMOD_DSP_TYPE_HIGHPASS
+
Filters sound using a resonant highpass filter algorithm. Deprecated and will be removed in a future release. See FMOD_DSP_HIGHPASS remarks for parameter information, Effect reference - High Pass for overview.
+
FMOD_DSP_TYPE_ECHO
+
Produces an echo on the sound and fades out at the desired rate. See FMOD_DSP_ECHO for parameter information, Effect reference - Echo for overview.
+
FMOD_DSP_TYPE_FADER
+
Pans and scales the volume of a unit. See FMOD_DSP_FADER for parameter information, Effect reference - Fader for overview.
+
FMOD_DSP_TYPE_FLANGE
+
Produces a flange effect on the sound. See FMOD_DSP_FLANGE for parameter information, Effect reference - Flange for overview.
+
FMOD_DSP_TYPE_DISTORTION
+
Distorts the sound. See FMOD_DSP_DISTORTION for parameter information, Effect reference - Distortion for overview.
+
FMOD_DSP_TYPE_NORMALIZE
+
Normalizes or amplifies the sound to a certain level. See FMOD_DSP_NORMALIZE for parameter information, Effect reference - Normalize for overview.
+
FMOD_DSP_TYPE_LIMITER
+
Limits the sound to a certain level. See FMOD_DSP_LIMITER for parameter information, Effect reference - Limiter for overview.
+
FMOD_DSP_TYPE_PARAMEQ
+
Attenuates or amplifies a selected frequency range. Deprecated and will be removed in a future release. See FMOD_DSP_PARAMEQ for parameter information, Effect reference - Parametric EQ for overview.
+
FMOD_DSP_TYPE_PITCHSHIFT
+
Bends the pitch of a sound without changing the speed of playback. See FMOD_DSP_PITCHSHIFT for parameter information, Effect reference - Pitch Shifter for overview.
+
FMOD_DSP_TYPE_CHORUS
+
Produces a chorus effect on the sound. See FMOD_DSP_CHORUS for parameter information, Effect reference - Chorus for overview.
+
FMOD_DSP_TYPE_ITECHO
+
Produces an echo on the sound and fades out at the desired rate as is used in Impulse Tracker. See FMOD_DSP_ITECHO for parameter information, Effect reference - IT Echo for overview.
+
FMOD_DSP_TYPE_COMPRESSOR
+
Dynamic compression (linked/unlinked multi-channel, wideband). See FMOD_DSP_COMPRESSOR for parameter information, Effect reference - Compressor for overview.
+
FMOD_DSP_TYPE_SFXREVERB
+
I3DL2 reverb effect. See FMOD_DSP_SFXREVERB for parameter information, Effect reference - SFX Reverb for overview.
+
FMOD_DSP_TYPE_LOWPASS_SIMPLE
+
Filters sound using a simple lowpass with no resonance, but has flexible cutoff and is fast. Deprecated and will be removed in a future release. See FMOD_DSP_LOWPASS_SIMPLE remarks for parameter information, Effect reference - Low Pass Simple for overview.
+
FMOD_DSP_TYPE_DELAY
+
Produces different delays on individual channels of the sound. See FMOD_DSP_DELAY for parameter information, Effect reference - Delay for overview.
+
FMOD_DSP_TYPE_TREMOLO
+
Produces a tremolo / chopper effect on the sound. See FMOD_DSP_TREMOLO for parameter information, Effect reference - Tremolo for overview.
+
FMOD_DSP_TYPE_SEND
+
Sends a copy of the signal to a return DSP anywhere in the DSP tree. See FMOD_DSP_SEND for parameter information, Effect reference - Send for overview.
+
FMOD_DSP_TYPE_RETURN
+
Receives signals from a number of send DSPs. See FMOD_DSP_RETURN for parameter information, Effect reference - Return for overview.
+
FMOD_DSP_TYPE_HIGHPASS_SIMPLE
+
Filters sound using a simple highpass with no resonance, but has flexible cutoff and is fast. Deprecated and will be removed in a future release. See FMOD_DSP_HIGHPASS_SIMPLE remarks for parameter information, Effect reference - High Pass Simple for overview.
+
FMOD_DSP_TYPE_PAN
+
Pans the signal in 2D or 3D, possibly upmixing or downmixing as well. See FMOD_DSP_PAN for parameter information, Effect reference - Pan for overview.
+
FMOD_DSP_TYPE_THREE_EQ
+
Three-band equalizer. See FMOD_DSP_THREE_EQ for parameter information, Effect reference - Three EQ for overview.
+
FMOD_DSP_TYPE_FFT
+
Analyzes the signal and provides spectrum information back through getParameter. See FMOD_DSP_FFT for parameter information, Effect reference - FFT for overview.
+
FMOD_DSP_TYPE_LOUDNESS_METER
+
Analyzes the loudness and true peak of the signal.
+
FMOD_DSP_TYPE_CONVOLUTIONREVERB
+
Convolution reverb. See FMOD_DSP_CONVOLUTION_REVERB for parameter information, Effect reference - Convolution Reverb for overview.
+
FMOD_DSP_TYPE_CHANNELMIX
+
Provides per channel gain, channel grouping of the input signal which also sets the speaker format for the output signal, and customizable input to output channel routing. See FMOD_DSP_CHANNELMIX for parameter information, Effect reference - Channel Mix for overview.
+
FMOD_DSP_TYPE_TRANSCEIVER
+
'sends' and 'receives' from a selection of up to 32 different slots. It is like a send/return but it uses global slots rather than returns as the destination. It also has other features. Multiple transceivers can receive from a single channel, or multiple transceivers can send to a single channel, or a combination of both. See FMOD_DSP_TRANSCEIVER for parameter information, Effect reference - Transceiver for overview.
+
FMOD_DSP_TYPE_OBJECTPAN
+
Spatializes input signal by passing it to an external object mixer. See FMOD_DSP_OBJECTPAN for parameter information, Effect reference - Object Panner for overview.
+
FMOD_DSP_TYPE_MULTIBAND_EQ
+
Five band parametric equalizer. See FMOD_DSP_MULTIBAND_EQ for parameter information, Effect reference - Multiband Equalizer for overview.
+
FMOD_DSP_TYPE_MULTIBAND_DYNAMICS
+
Three-band compressor/expander. See FMOD_DSP_MULTIBAND_DYNAMICS for parameter information, Effect reference - Multiband Dynamics for overview.
+
FMOD_DSP_TYPE_MAX
+
Maximum number of pre-defined DSP types.
+
+

See Also: System::createDSPByType

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-common.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-common.html new file mode 100644 index 0000000..cbd0e0d --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-common.html @@ -0,0 +1,2624 @@ + + +Core API Reference | Common + + + + +
+ +
+

7. Core API Reference | Common

+

File:

+
    +
  • File_GetDiskBusy Information function to retrieve the state of FMOD disk access.
  • +
  • File_SetDiskBusy Sets the busy state for disk access ensuring mutual exclusion of file operations.
  • +
+

Memory:

+
    +
  • Memory_GetStats Returns information on the memory usage of FMOD.
  • +
  • Memory_Initialize Specifies a method for FMOD to allocate and free memory, either through user supplied callbacks or through a user supplied memory buffer with a fixed size.
  • +
+
+ +
+
    +
  • FMOD_MEMORY_TYPE Bitfields for memory allocation type being passed into FMOD memory callbacks.
  • +
+

Debugging:

+
    +
  • Debug_Initialize Specify the level and delivery method of log messages when using the logging version of FMOD.
  • +
+
+ +
+
    +
  • FMOD_DEBUG_MODE Specify the destination of log output when using the logging version of FMOD.
  • +
  • FMOD_DEBUG_FLAGS Specify the requested information to be output when using the logging version of FMOD.
  • +
+

Threading:

+
    +
  • Thread_SetAttributes Specify the affinity, priority and stack size for all FMOD created threads.
  • +
+
+ +

General:

+ +
+ +

FMOD_3D_ATTRIBUTES

+

Structure describing a position, velocity and orientation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_3D_ATTRIBUTES {
+  FMOD_VECTOR position;
+  FMOD_VECTOR velocity;
+  FMOD_VECTOR forward;
+  FMOD_VECTOR up;
+} FMOD_3D_ATTRIBUTES;
+
+ +
struct ATTRIBUTES_3D
+{
+  VECTOR position;
+  VECTOR velocity;
+  VECTOR forward;
+  VECTOR up;
+}
+
+ +
_3D_ATTRIBUTES
+{
+  position,
+  velocity,
+  forward,
+  up,
+};
+
+ +
+
position
+
+

Position in world space used for panning and attenuation. (FMOD_VECTOR)

+ +
+
velocity
+
+

Velocity in world space used for doppler. (FMOD_VECTOR)

+ +
+
forward
+
Forwards orientation, must be of unit length (1.0) and perpendicular to up. (FMOD_VECTOR)
+
up
+
Upwards orientation, must be of unit length (1.0) and perpendicular to forward. (FMOD_VECTOR)
+
+

Vectors must be provided in the correct handedness.

+

See Also: FMOD_DSP_PARAMETER_3DATTRIBUTES

+

FMOD_CHANNELMASK

+

Flags that describe the speakers present in a given signal.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_CHANNELMASK_FRONT_LEFT       0x00000001
+#define FMOD_CHANNELMASK_FRONT_RIGHT      0x00000002
+#define FMOD_CHANNELMASK_FRONT_CENTER     0x00000004
+#define FMOD_CHANNELMASK_LOW_FREQUENCY    0x00000008
+#define FMOD_CHANNELMASK_SURROUND_LEFT    0x00000010
+#define FMOD_CHANNELMASK_SURROUND_RIGHT   0x00000020
+#define FMOD_CHANNELMASK_BACK_LEFT        0x00000040
+#define FMOD_CHANNELMASK_BACK_RIGHT       0x00000080
+#define FMOD_CHANNELMASK_BACK_CENTER      0x00000100
+#define FMOD_CHANNELMASK_MONO             (FMOD_CHANNELMASK_FRONT_LEFT)
+#define FMOD_CHANNELMASK_STEREO           (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT)
+#define FMOD_CHANNELMASK_LRC              (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER)
+#define FMOD_CHANNELMASK_QUAD             (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
+#define FMOD_CHANNELMASK_SURROUND         (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
+#define FMOD_CHANNELMASK_5POINT1          (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
+#define FMOD_CHANNELMASK_5POINT1_REARS    (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
+#define FMOD_CHANNELMASK_7POINT0          (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
+#define FMOD_CHANNELMASK_7POINT1          (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
+
+ +
[Flags]
+enum CHANNELMASK : uint
+{
+  FRONT_LEFT        = 0x00000001,
+  FRONT_RIGHT       = 0x00000002,
+  FRONT_CENTER      = 0x00000004,
+  LOW_FREQUENCY     = 0x00000008,
+  SURROUND_LEFT     = 0x00000010,
+  SURROUND_RIGHT    = 0x00000020,
+  BACK_LEFT         = 0x00000040,
+  BACK_RIGHT        = 0x00000080,
+  BACK_CENTER       = 0x00000100,
+  MONO              = (FRONT_LEFT),
+  STEREO            = (FRONT_LEFT | FRONT_RIGHT),
+  LRC               = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER),
+  QUAD              = (FRONT_LEFT | FRONT_RIGHT | SURROUND_LEFT | SURROUND_RIGHT),
+  SURROUND          = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT),
+  _5POINT1          = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT),
+  _5POINT1_REARS    = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | BACK_LEFT | BACK_RIGHT),
+  _7POINT0          = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT),
+  _7POINT1          = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT)
+}
+
+ +
CHANNELMASK_FRONT_LEFT      = 0x00000001
+CHANNELMASK_FRONT_RIGHT     = 0x00000002
+CHANNELMASK_FRONT_CENTER    = 0x00000004
+CHANNELMASK_LOW_FREQUENCY   = 0x00000008
+CHANNELMASK_SURROUND_LEFT   = 0x00000010
+CHANNELMASK_SURROUND_RIGHT  = 0x00000020
+CHANNELMASK_BACK_LEFT       = 0x00000040
+CHANNELMASK_BACK_RIGHT      = 0x00000080
+CHANNELMASK_BACK_CENTER     = 0x00000100
+CHANNELMASK_MONO            = (CHANNELMASK_FRONT_LEFT))
+CHANNELMASK_STEREO          = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT))
+CHANNELMASK_LRC             = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT | CHANNELMASK_FRONT_CENTER))
+CHANNELMASK_QUAD            = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT | CHANNELMASK_SURROUND_LEFT | CHANNELMASK_SURROUND_RIGHT))
+CHANNELMASK_SURROUND        = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT | CHANNELMASK_FRONT_CENTER | CHANNELMASK_SURROUND_LEFT | CHANNELMASK_SURROUND_RIGHT))
+CHANNELMASK_5POINT1         = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT | CHANNELMASK_FRONT_CENTER | CHANNELMASK_LOW_FREQUENCY | CHANNELMASK_SURROUND_LEFT | CHANNELMASK_SURROUND_RIGHT))
+CHANNELMASK_5POINT1_REARS   = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT | CHANNELMASK_FRONT_CENTER | CHANNELMASK_LOW_FREQUENCY | CHANNELMASK_BACK_LEFT | CHANNELMASK_BACK_RIGHT))
+CHANNELMASK_7POINT0         = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT | CHANNELMASK_FRONT_CENTER | CHANNELMASK_SURROUND_LEFT | CHANNELMASK_SURROUND_RIGHT | CHANNELMASK_BACK_LEFT | CHANNELMASK_BACK_RIGHT))
+CHANNELMASK_7POINT1         = (CHANNELMASK_FRONT_LEFT | CHANNELMASK_FRONT_RIGHT | CHANNELMASK_FRONT_CENTER | CHANNELMASK_LOW_FREQUENCY | CHANNELMASK_SURROUND_LEFT | CHANNELMASK_SURROUND_RIGHT | CHANNELMASK_BACK_LEFT | CHANNELMASK_BACK_RIGHT))
+
+ +
+
FMOD_CHANNELMASK_FRONT_LEFT
+
Front left channel.
+
FMOD_CHANNELMASK_FRONT_RIGHT
+
Front right channel.
+
FMOD_CHANNELMASK_FRONT_CENTER
+
Front center channel.
+
FMOD_CHANNELMASK_LOW_FREQUENCY
+
Low frequency channel.
+
FMOD_CHANNELMASK_SURROUND_LEFT
+
Surround left channel.
+
FMOD_CHANNELMASK_SURROUND_RIGHT
+
Surround right channel.
+
FMOD_CHANNELMASK_BACK_LEFT
+
Back left channel.
+
FMOD_CHANNELMASK_BACK_RIGHT
+
Back right channel.
+
FMOD_CHANNELMASK_BACK_CENTER
+
Back center channel, not represented in any FMOD_SPEAKERMODE.
+
FMOD_CHANNELMASK_MONO
+
Mono channel mask.
+
FMOD_CHANNELMASK_STEREO
+
Stereo channel mask.
+
FMOD_CHANNELMASK_LRC
+
Left / right / center channel mask.
+
FMOD_CHANNELMASK_QUAD
+
Quadphonic channel mask.
+
FMOD_CHANNELMASK_SURROUND
+
5.0 surround channel mask.
+
FMOD_CHANNELMASK_5POINT1
+
5.1 surround channel mask.
+
FMOD_CHANNELMASK_5POINT1_REARS
+
5.1 surround channel mask, using rears instead of surrounds.
+
FMOD_CHANNELMASK_7POINT0
+
7.0 surround channel mask.
+
FMOD_CHANNELMASK_7POINT1
+
7.1 surround channel mask.
+
+

See Also: DSP::setChannelFormat, DSP::getChannelFormat

+

FMOD_CHANNELORDER

+

Speaker ordering for multi-channel signals.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_CHANNELORDER {
+  FMOD_CHANNELORDER_DEFAULT,
+  FMOD_CHANNELORDER_WAVEFORMAT,
+  FMOD_CHANNELORDER_PROTOOLS,
+  FMOD_CHANNELORDER_ALLMONO,
+  FMOD_CHANNELORDER_ALLSTEREO,
+  FMOD_CHANNELORDER_ALSA,
+  FMOD_CHANNELORDER_MAX
+} FMOD_CHANNELORDER;
+
+ +
enum CHANNELORDER : int
+{
+  DEFAULT,
+  WAVEFORMAT,
+  PROTOOLS,
+  ALLMONO,
+  ALLSTEREO,
+  ALSA,
+  MAX,
+}
+
+ +
CHANNELORDER_DEFAULT
+CHANNELORDER_WAVEFORMAT
+CHANNELORDER_PROTOOLS
+CHANNELORDER_ALLMONO
+CHANNELORDER_ALLSTEREO
+CHANNELORDER_ALSA
+CHANNELORDER_MAX
+
+ +
+
FMOD_CHANNELORDER_DEFAULT
+
Left, Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right (see FMOD_SPEAKER enumeration)
+
FMOD_CHANNELORDER_WAVEFORMAT
+
Left, Right, Center, LFE, Back Left, Back Right, Surround Left, Surround Right (as per Microsoft .wav WAVEFORMAT structure master order)
+
FMOD_CHANNELORDER_PROTOOLS
+
Left, Center, Right, Surround Left, Surround Right, LFE
+
FMOD_CHANNELORDER_ALLMONO
+
Mono, Mono, Mono, Mono, Mono, Mono, ... (each channel up to FMOD_MAX_CHANNEL_WIDTH treated as mono)
+
FMOD_CHANNELORDER_ALLSTEREO
+
Left, Right, Left, Right, Left, Right, ... (each pair of channels up to FMOD_MAX_CHANNEL_WIDTH treated as stereo)
+
FMOD_CHANNELORDER_ALSA
+
Left, Right, Surround Left, Surround Right, Center, LFE (as per Linux ALSA channel order)
+
FMOD_CHANNELORDER_MAX
+
Maximum number of channel orderings supported.
+
+

See Also: FMOD_CREATESOUNDEXINFO

+

FMOD_CPU_USAGE

+

Performance information for Core API functionality.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_CPU_USAGE {
+    float           dsp;
+    float           stream;
+    float           geometry;
+    float           update;
+    float           convolution1;
+    float           convolution2;
+} FMOD_CPU_USAGE;
+
+ +
struct CPU_USAGE
+{
+    float           dsp;
+    float           stream;
+    float           geometry;
+    float           update;
+    float           convolution1;
+    float           convolution2;
+}
+
+ +
CPU_USAGE
+{
+    dsp,
+    stream,
+    geometry,
+    update,
+    convolution1,
+    convolution2
+};
+
+ +
+
dsp
+
+

DSP mixing engine CPU usage. Percentage of FMOD_THREAD_TYPE_MIXER, or main thread if FMOD_INIT_MIX_FROM_UPDATE flag is used with System::init.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
stream
+
+

Streaming engine CPU usage. Percentage of FMOD_THREAD_TYPE_STREAM, or main thread if FMOD_INIT_STREAM_FROM_UPDATE flag is used with System::init.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
geometry
+
+

Geometry engine CPU usage. Percentage of FMOD_THREAD_TYPE_GEOMETRY.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
update
+
+

System::update CPU usage. Percentage of main thread.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
convolution1
+
+

Convolution reverb processing thread #1 CPU usage. Percentage of FMOD_THREAD_TYPE_CONVOLUTION1.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
convolution2
+
+

Convolution reverb processing thread #2 CPU usage. Percentage of FMOD_THREAD_TYPE_CONVOLUTION2.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
+

This structure is filled in with System::getCPUUsage.

+

For readability, the percentage values are smoothed to provide a more stable output.

+

'Percentage of main thread' in the descriptions above refers to the thread that the function is called from by the user.

+

The use of FMOD_THREAD_TYPE_CONVOLUTION1 or FMOD_THREAD_TYPE_CONVOLUTION2 can be controlled with FMOD_ADVANCEDSETTINGS::maxConvolutionThreads.

+

See Also: Studio::System::getCPUUsage, FMOD_STUDIO_CPU_USAGE

+

FMOD_DEBUG_CALLBACK

+

Callback for debug messages when using the logging version of FMOD.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DEBUG_CALLBACK(
+  FMOD_DEBUG_FLAGS flags,
+  const char *file,
+  int line,
+  const char *func,
+  const char *message
+);
+
+ +
delegate RESULT DEBUG_CALLBACK(
+  DEBUG_FLAGS flags,
+  IntPtr file,
+  int line,
+  IntPtr func,
+  IntPtr message
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
flags
+
Flags which detail the level and type of this log. (FMOD_DEBUG_FLAGS)
+
file
+
Source code file name where the message originated. (UTF-8 string)
+
line
+
Source code line number where the message originated.
+
func
+
Class and function name where the message originated. (UTF-8 string)
+
message
+
Actual debug message associated with the callback. (UTF-8 string)
+
+
+

The 'file', 'func', and 'message' arguments can be used via StringWrapper by using FMOD.StringWrapper string = new FMOD.StringWrapper(ptrToString);

+
+

This callback will fire directly from the log line, as such it can be from any thread.

+

See Also: Debug_Initialize

+

FMOD_DEBUG_FLAGS

+

Specify the requested information to be output when using the logging version of FMOD.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_DEBUG_LEVEL_NONE            0x00000000
+#define FMOD_DEBUG_LEVEL_ERROR           0x00000001
+#define FMOD_DEBUG_LEVEL_WARNING         0x00000002
+#define FMOD_DEBUG_LEVEL_LOG             0x00000004
+#define FMOD_DEBUG_TYPE_MEMORY           0x00000100
+#define FMOD_DEBUG_TYPE_FILE             0x00000200
+#define FMOD_DEBUG_TYPE_CODEC            0x00000400
+#define FMOD_DEBUG_TYPE_TRACE            0x00000800
+#define FMOD_DEBUG_DISPLAY_TIMESTAMPS    0x00010000
+#define FMOD_DEBUG_DISPLAY_LINENUMBERS   0x00020000
+#define FMOD_DEBUG_DISPLAY_THREAD        0x00040000
+
+ +
[Flags]
+enum DEBUG_FLAGS : uint
+{
+  NONE                  = 0x00000000,
+  ERROR                 = 0x00000001,
+  WARNING               = 0x00000002,
+  LOG                   = 0x00000004,
+  TYPE_MEMORY           = 0x00000100,
+  TYPE_FILE             = 0x00000200,
+  TYPE_CODEC            = 0x00000400,
+  TYPE_TRACE            = 0x00000800,
+  DISPLAY_TIMESTAMPS    = 0x00010000,
+  DISPLAY_LINENUMBERS   = 0x00020000,
+  DISPLAY_THREAD        = 0x00040000,
+}
+
+ +
DEBUG_LEVEL_NONE            = 0x00000000
+DEBUG_LEVEL_ERROR           = 0x00000001
+DEBUG_LEVEL_WARNING         = 0x00000002
+DEBUG_LEVEL_LOG             = 0x00000004
+DEBUG_TYPE_MEMORY           = 0x00000100
+DEBUG_TYPE_FILE             = 0x00000200
+DEBUG_TYPE_CODEC            = 0x00000400
+DEBUG_TYPE_TRACE            = 0x00000800
+DEBUG_DISPLAY_TIMESTAMPS    = 0x00010000
+DEBUG_DISPLAY_LINENUMBERS   = 0x00020000
+DEBUG_DISPLAY_THREAD        = 0x00040000
+
+ +
+
FMOD_DEBUG_LEVEL_NONE
+
Disable all messages.
+
FMOD_DEBUG_LEVEL_ERROR
+
Enable only error messages.
+
FMOD_DEBUG_LEVEL_WARNING
+
Enable warning and error messages.
+
FMOD_DEBUG_LEVEL_LOG
+
Enable informational, warning and error messages (default).
+
FMOD_DEBUG_TYPE_MEMORY
+
Verbose logging for memory operations, only use this if you are debugging a memory related issue.
+
FMOD_DEBUG_TYPE_FILE
+
Verbose logging for file access, only use this if you are debugging a file related issue.
+
FMOD_DEBUG_TYPE_CODEC
+
Verbose logging for codec initialization, only use this if you are debugging a codec related issue.
+
FMOD_DEBUG_TYPE_TRACE
+
Verbose logging for internal errors, use this for tracking the origin of error codes.
+
FMOD_DEBUG_DISPLAY_TIMESTAMPS
+
Display the time stamp of the log message in milliseconds.
+
FMOD_DEBUG_DISPLAY_LINENUMBERS
+
Display the source code file and line number for where the message originated.
+
FMOD_DEBUG_DISPLAY_THREAD
+
Display the thread ID of the calling function that generated the message.
+
+

See Also: Debug_Initialize

+

Debug_Initialize

+

Specify the level and delivery method of log messages when using the logging version of FMOD.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Debug_Initialize(
+  FMOD_DEBUG_FLAGS flags,
+  FMOD_DEBUG_MODE mode = FMOD_DEBUG_MODE_TTY,
+  FMOD_DEBUG_CALLBACK callback = 0,
+  const char *filename = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Debug_Initialize(
+  FMOD_DEBUG_FLAGS flags,
+  FMOD_DEBUG_MODE mode,
+  FMOD_DEBUG_CALLBACK callback,
+  const char *filename
+);
+
+ +
static RESULT Debug.Initialize(
+  DEBUG_FLAGS flags,
+  DEBUG_MODE mode = DEBUG_MODE.TTY,
+  DEBUG_CALLBACK callback = null,
+  string filename = null
+);
+
+ +
Debug_Initialize(
+  flags
+);
+
+ +
+
flags
+
Debug level, type and display control flags. More than one mode can be set at once by combining them with the OR operator. (FMOD_DEBUG_FLAGS)
+
mode Opt
+
Destination for log messages. (FMOD_DEBUG_MODE)
+
callback Opt
+
Callback to use when mode is set to callback, only required when using that mode. (FMOD_DEBUG_CALLBACK)
+
filename Opt
+
Filename to use when mode is set to file, only required when using that mode. (UTF-8 string)
+
+

This function will return FMOD_ERR_UNSUPPORTED when using the non-logging (release) versions of FMOD.

+

The logging version of FMOD can be recognized by the 'L' suffix in the library name, fmodL.dll or libfmodL.so for instance.

+

Note that:

+ +

See Also: Callback Behavior

+

FMOD_DEBUG_MODE

+

Specify the destination of log output when using the logging version of FMOD.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DEBUG_MODE {
+  FMOD_DEBUG_MODE_TTY,
+  FMOD_DEBUG_MODE_FILE,
+  FMOD_DEBUG_MODE_CALLBACK
+} FMOD_DEBUG_MODE;
+
+ +
enum DEBUG_MODE : int
+{
+  TTY,
+  FILE,
+  CALLBACK,
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_DEBUG_MODE_TTY
+
Default log location per platform, i.e. Visual Studio output window, stderr, LogCat, etc.
+
FMOD_DEBUG_MODE_FILE
+
Write log to specified file path.
+
FMOD_DEBUG_MODE_CALLBACK
+
Call specified callback with log information.
+
+

TTY destination can vary depending on platform, common examples include the Visual Studio / Xcode output window, stderr and LogCat.

+

See Also: Debug_Initialize

+

File_GetDiskBusy

+

Information function to retrieve the state of FMOD disk access.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT File_GetDiskBusy(
+  int *busy
+);
+
+ +
FMOD_RESULT FMOD_File_GetDiskBusy(
+  int *busy
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
busy Out
+
Busy state of the disk at the current time.
+
+

Do not use this function to synchronize your own reads with, as due to timing, you might call this function and it says false = it is not busy, but the split second after calling this function, internally FMOD might set it to busy. Use File_SetDiskBusy for proper mutual exclusion as it uses semaphores.

+

See Also: File_SetDiskBusy

+

File_SetDiskBusy

+

Sets the busy state for disk access ensuring mutual exclusion of file operations.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT File_SetDiskBusy(
+  int busy
+);
+
+ +
FMOD_RESULT FMOD_File_SetDiskBusy(
+  int busy
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
busy
+
Busy state where 1 represent the begining of disk access and 0 represents the end of disk access.
+
+

If file IO is currently being performed by FMOD this function will block until it has completed.

+

This function should be called in pairs once to set the state, then again to clear it once complete.

+

See Also: File_GetDiskBusy

+

FMOD_GUID

+

Structure describing a globally unique identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_GUID {
+  unsigned int     Data1;
+  unsigned short   Data2;
+  unsigned short   Data3;
+  unsigned char    Data4[8];
+} FMOD_GUID;
+
+ +
struct System.Guid
+
+ +
FMOD_GUID
+{
+  Data1,
+  Data2,
+  Data3,
+  Data4,
+};
+
+ +
+
Data1
+
Specifies the first 8 hexadecimal digits of the GUID.
+
Data2
+
Specifies the first group of 4 hexadecimal digits.
+
Data3
+
Specifies the second group of 4 hexadecimal digits.
+
Data4
+
Array of 8 bytes. The first 2 bytes contain the third group of 4 hexadecimal digits. The remaining 6 bytes contain the final 12 hexadecimal digits.
+
+

See Also: System::getDriverInfo

+

FMOD_MAX_CHANNEL_WIDTH

+

Maximum number of channels per sample of audio supported by audio files, buffers, connections and DSPs.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_MAX_CHANNEL_WIDTH 32
+
+ +
class CONSTANTS
+{
+  const int MAX_CHANNEL_WIDTH = 32;
+}
+
+ +
MAX_CHANNEL_WIDTH = 32
+
+ +
+
FMOD_MAX_CHANNEL_WIDTH
+
Maximum number of channels.
+
+

See Also: System::setSoftwareFormat, ChannelControl::setMixMatrix, DSP::setChannelFormat

+

FMOD_MAX_LISTENERS

+

Maximum number of listeners supported.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_MAX_LISTENERS 8
+
+ +
class CONSTANTS
+{
+  const int MAX_LISTENERS = 8;
+}
+
+ +
MAX_LISTENERS = 8
+
+ +
+
FMOD_MAX_LISTENERS
+
Maximum listeners.
+
+

See Also: System::set3DNumListeners, System::set3DListenerAttributes

+

FMOD_MAX_SYSTEMS

+

Maximum number of System objects allowed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_MAX_SYSTEMS 8
+
+ +
class CONSTANTS
+{
+  const int MAX_SYSTEMS = 8;
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_MAX_SYSTEMS
+
Maximum System objects.
+
+

See Also: System_Create

+

FMOD_MEMORY_ALLOC_CALLBACK

+

Callback to allocate a block of memory.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
void * F_CALL FMOD_MEMORY_ALLOC_CALLBACK(
+  unsigned int size,
+  FMOD_MEMORY_TYPE type,
+  const char *sourcestr
+);
+
+ +
delegate IntPtr MEMORY_ALLOC_CALLBACK(
+  uint size,
+  MEMORY_TYPE type,
+  IntPtr sourcestr
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
size
+
+

Size of the memory block to be allocated and returned.

+
    +
  • Units: Bytes
  • +
+
+
type
+
Type of memory allocation. (FMOD_MEMORY_TYPE)
+
sourcestr Opt
+
String with the FMOD source code filename and line number in it. Only valid in logging versions of FMOD. (UTF-8 string)
+
+

Returning an aligned pointer, of 16 byte alignment is recommended for performance reasons.

+
+

The 'sourcestr' argument can be used via StringWrapper by using FMOD.StringWrapper sourceStr = new FMOD.StringWrapper(sourcestr);

+
+

See Also: Memory_Initialize, Memory_GetStats, FMOD_MEMORY_REALLOC_CALLBACK, FMOD_MEMORY_FREE_CALLBACK

+

FMOD_MEMORY_FREE_CALLBACK

+

Callback to free a block of memory.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
void F_CALL FMOD_MEMORY_FREE_CALLBACK(
+  void *ptr,
+  FMOD_MEMORY_TYPE type,
+  const char *sourcestr
+);
+
+ +
delegate void MEMORY_FREE_CALLBACK(
+  IntPtr ptr,
+  MEMORY_TYPE type,
+  IntPtr sourcestr
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
ptr
+
Pre-existing block of memory to be freed.
+
type
+
Type of memory to be freed. (FMOD_MEMORY_TYPE)
+
sourcestr
+
String with the FMOD source code filename and line number in it. Only valid in logging versions of FMOD. (UTF-8 string)
+
+
+

The 'sourcestr' argument can be used via StringWrapper by using FMOD.StringWrapper sourceStr = new FMOD.StringWrapper(sourcestr);

+
+

See Also: Memory_Initialize, FMOD_MEMORY_ALLOC_CALLBACK, FMOD_MEMORY_REALLOC_CALLBACK

+

Memory_GetStats

+

Returns information on the memory usage of FMOD.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Memory_GetStats(
+  int *currentalloced,
+  int *maxalloced,
+  bool blocking = true
+);
+
+ +
FMOD_RESULT FMOD_Memory_GetStats(
+  int *currentalloced,
+  int *maxalloced,
+  FMOD_BOOL blocking
+);
+
+ +
static RESULT Memory.GetStats(
+  out int currentalloced,
+  out int maxalloced,
+  bool blocking = true
+);
+
+ +
Memory_GetStats(
+  currentalloced,
+  maxalloced,
+  blocking
+);
+
+ +
+
currentalloced OutOpt
+
Currently allocated memory at time of call.
+
maxalloced OutOpt
+
Maximum allocated memory since System::init or Memory_Initialize.
+
blocking
+
+

Flag to indicate whether to favour speed or accuracy. Specifying true for this parameter will flush the DSP graph to make sure all queued allocations happen immediately, which can be costly.

+
    +
  • Units: Boolean
  • +
+
+
+

This information is byte accurate and counts all allocs and frees internally. This is useful for determining a fixed memory size to make FMOD work within for fixed memory machines such as consoles.

+

Note that if using Memory_Initialize, the memory usage will be slightly higher than without it, as FMOD has to have a small amount of memory overhead to manage the available memory.

+

Memory_Initialize

+

Specifies a method for FMOD to allocate and free memory, either through user supplied callbacks or through a user supplied memory buffer with a fixed size.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Memory_Initialize(
+  void *poolmem,
+  int poollen,
+  FMOD_MEMORY_ALLOC_CALLBACK useralloc,
+  FMOD_MEMORY_REALLOC_CALLBACK userrealloc,
+  FMOD_MEMORY_FREE_CALLBACK userfree,
+  FMOD_MEMORY_TYPE memtypeflags = FMOD_MEMORY_ALL
+);
+
+ +
FMOD_RESULT FMOD_Memory_Initialize(
+  void *poolmem,
+  int poollen,
+  FMOD_MEMORY_ALLOC_CALLBACK useralloc,
+  FMOD_MEMORY_REALLOC_CALLBACK userrealloc,
+  FMOD_MEMORY_FREE_CALLBACK userfree,
+  FMOD_MEMORY_TYPE memtypeflags
+);
+
+ +
static RESULT Memory.Initialize(
+  IntPtr poolmem,
+  int poollen,
+  MEMORY_ALLOC_CALLBACK useralloc,
+  MEMORY_REALLOC_CALLBACK userrealloc,
+  MEMORY_FREE_CALLBACK userfree,
+  MEMORY_TYPE memtypeflags = MEMORY_TYPE.ALL
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
poolmem Opt
+
Block of memory of size poollen bytes for FMOD to manage, mutually exclusive with useralloc / userrealloc / userfree.
+
poollen Opt
+
+

Size of poolmem, must be a multiple of 512.

+
    +
  • Units: Bytes
  • +
+
+
useralloc Opt
+
Memory allocation callback compatible with ANSI malloc, mutually exclusive with poolmem. (FMOD_MEMORY_ALLOC_CALLBACK)
+
userrealloc Opt
+
Memory reallocation callback compatible with ANSI realloc, mutually exclusive with poolmem. (FMOD_MEMORY_REALLOC_CALLBACK)
+
userfree Opt
+
Memory free callback compatible with ANSI free, mutually exclusive with poolmem. (FMOD_MEMORY_FREE_CALLBACK)
+
memtypeflags Opt
+
Types of memory callbacks you wish to handle. OR these together to handle multiple types. (FMOD_MEMORY_TYPE)
+
+

This function must be called before any FMOD System object is created.

+

Valid usage of this function requires either poolmem and poollen or useralloc, userrealloc and userfree being set.
+If 'useralloc' and 'userfree' are provided without 'userrealloc' the reallocation is implemented via an allocation of the new size, copy from old address to new, then a free of the old address.

+

To find out the required fixed size call Memory_Initialize with an overly large pool size (or no pool) and find out the maximum RAM usage at any one time with Memory_GetStats.

+

Callback implementations must be thread safe.

+

If you specify a fixed size pool that is too small, FMOD will return FMOD_ERR_MEMORY when the limit of the fixed size pool is exceeded. At this point, it's possible that FMOD may become unstable. To maintain stability, do not allow FMOD to run out of memory.

+

See Also: Callback Behavior

+

FMOD_MEMORY_REALLOC_CALLBACK

+

Callback to re-allocate a block of memory to a different size.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
void * F_CALL FMOD_MEMORY_REALLOC_CALLBACK(
+  void *ptr,
+  unsigned int size,
+  FMOD_MEMORY_TYPE type,
+  const char *sourcestr
+);
+
+ +
delegate IntPtr MEMORY_REALLOC_CALLBACK(
+  IntPtr ptr,
+  uint size,
+  MEMORY_TYPE type,
+  IntPtr sourcestr
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
ptr
+
Block of memory to be resized. If this is null, then a new block of memory is allocated and no memory is freed.
+
size
+
+

Size of the memory to be reallocated.

+
    +
  • Units: Bytes
  • +
+
+
type
+
Memory allocation type. (FMOD_MEMORY_TYPE)
+
sourcestr
+
String with the FMOD source code filename and line number in it. Only valid in logging versions of FMOD. (UTF-8 string)
+
+

When allocating new memory, the contents of the old memory block must be preserved.

+

Returning an aligned pointer, of 16 byte alignment is recommended for performance reasons.

+
+

The 'sourcestr' argument can be used via StringWrapper by using FMOD.StringWrapper sourceStr = new FMOD.StringWrapper(sourcestr);

+
+

See Also: Memory_Initialize, Memory_GetStats, FMOD_MEMORY_ALLOC_CALLBACK, FMOD_MEMORY_FREE_CALLBACK

+

FMOD_MEMORY_TYPE

+

Bitfields for memory allocation type being passed into FMOD memory callbacks.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_MEMORY_NORMAL             0x00000000
+#define FMOD_MEMORY_STREAM_FILE        0x00000001
+#define FMOD_MEMORY_STREAM_DECODE      0x00000002
+#define FMOD_MEMORY_SAMPLEDATA         0x00000004
+#define FMOD_MEMORY_DSP_BUFFER         0x00000008
+#define FMOD_MEMORY_PLUGIN             0x00000010
+#define FMOD_MEMORY_PERSISTENT         0x00200000
+#define FMOD_MEMORY_ALL                0xFFFFFFFF
+
+ +
[Flags]
+enum MEMORY_TYPE : uint
+{
+  NORMAL            = 0x00000000,
+  STREAM_FILE       = 0x00000001,
+  STREAM_DECODE     = 0x00000002,
+  SAMPLEDATA        = 0x00000004,
+  DSP_BUFFER        = 0x00000008,
+  PLUGIN            = 0x00000010,
+  PERSISTENT        = 0x00200000,
+  ALL               = 0xFFFFFFFF
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_MEMORY_NORMAL
+
Standard memory.
+
FMOD_MEMORY_STREAM_FILE
+
Stream file buffer, size controllable with System::setStreamBufferSize.
+
FMOD_MEMORY_STREAM_DECODE
+
Stream decode buffer, size controllable with FMOD_CREATESOUNDEXINFO::decodebuffersize.
+
FMOD_MEMORY_SAMPLEDATA
+
Sample data buffer. Raw audio data, usually PCM/MPEG/ADPCM/XMA data.
+
FMOD_MEMORY_DSP_BUFFER
+
Deprecated.
+
FMOD_MEMORY_PLUGIN
+
Memory allocated by a third party plugin.
+
FMOD_MEMORY_PERSISTENT
+
Persistent memory. Memory will be freed when System::release is called.
+
FMOD_MEMORY_ALL
+
Mask specifying all memory types.
+
+

See Also: FMOD_MEMORY_ALLOC_CALLBACK, FMOD_MEMORY_REALLOC_CALLBACK, FMOD_MEMORY_FREE_CALLBACK, Memory_Initialize

+

FMOD_MODE

+

Sound description bitfields, bitwise OR them together for loading and describing Sounds.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_DEFAULT                    0x00000000
+#define FMOD_LOOP_OFF                   0x00000001
+#define FMOD_LOOP_NORMAL                0x00000002
+#define FMOD_LOOP_BIDI                  0x00000004
+#define FMOD_2D                         0x00000008
+#define FMOD_3D                         0x00000010
+#define FMOD_CREATESTREAM               0x00000080
+#define FMOD_CREATESAMPLE               0x00000100
+#define FMOD_CREATECOMPRESSEDSAMPLE     0x00000200
+#define FMOD_OPENUSER                   0x00000400
+#define FMOD_OPENMEMORY                 0x00000800
+#define FMOD_OPENMEMORY_POINT           0x10000000
+#define FMOD_OPENRAW                    0x00001000
+#define FMOD_OPENONLY                   0x00002000
+#define FMOD_ACCURATETIME               0x00004000
+#define FMOD_MPEGSEARCH                 0x00008000
+#define FMOD_NONBLOCKING                0x00010000
+#define FMOD_UNIQUE                     0x00020000
+#define FMOD_3D_HEADRELATIVE            0x00040000
+#define FMOD_3D_WORLDRELATIVE           0x00080000
+#define FMOD_3D_INVERSEROLLOFF          0x00100000
+#define FMOD_3D_LINEARROLLOFF           0x00200000
+#define FMOD_3D_LINEARSQUAREROLLOFF     0x00400000
+#define FMOD_3D_INVERSETAPEREDROLLOFF   0x00800000
+#define FMOD_3D_CUSTOMROLLOFF           0x04000000
+#define FMOD_3D_IGNOREGEOMETRY          0x40000000
+#define FMOD_IGNORETAGS                 0x02000000
+#define FMOD_LOWMEM                     0x08000000
+#define FMOD_VIRTUAL_PLAYFROMSTART      0x80000000
+
+ +
[Flags]
+enum MODE : uint
+{
+  DEFAULT                   = 0x00000000,
+  LOOP_OFF                  = 0x00000001,
+  LOOP_NORMAL               = 0x00000002,
+  LOOP_BIDI                 = 0x00000004,
+  _2D                       = 0x00000008,
+  _3D                       = 0x00000010,
+  CREATESTREAM              = 0x00000080,
+  CREATESAMPLE              = 0x00000100,
+  CREATECOMPRESSEDSAMPLE    = 0x00000200,
+  OPENUSER                  = 0x00000400,
+  OPENMEMORY                = 0x00000800,
+  OPENMEMORY_POINT          = 0x10000000,
+  OPENRAW                   = 0x00001000,
+  OPENONLY                  = 0x00002000,
+  ACCURATETIME              = 0x00004000,
+  MPEGSEARCH                = 0x00008000,
+  NONBLOCKING               = 0x00010000,
+  UNIQUE                    = 0x00020000,
+  _3D_HEADRELATIVE          = 0x00040000,
+  _3D_WORLDRELATIVE         = 0x00080000,
+  _3D_INVERSEROLLOFF        = 0x00100000,
+  _3D_LINEARROLLOFF         = 0x00200000,
+  _3D_LINEARSQUAREROLLOFF   = 0x00400000,
+  _3D_INVERSETAPEREDROLLOFF = 0x00800000,
+  _3D_CUSTOMROLLOFF         = 0x04000000,
+  _3D_IGNOREGEOMETRY        = 0x40000000,
+  IGNORETAGS                = 0x02000000,
+  LOWMEM                    = 0x08000000,
+  VIRTUAL_PLAYFROMSTART     = 0x80000000
+}
+
+ +
DEFAULT                     = 0x00000000
+LOOP_OFF                    = 0x00000001
+LOOP_NORMAL                 = 0x00000002
+LOOP_BIDI                   = 0x00000004
+_2D                         = 0x00000008
+_3D                         = 0x00000010
+CREATESTREAM                = 0x00000080
+CREATESAMPLE                = 0x00000100
+CREATECOMPRESSEDSAMPLE      = 0x00000200
+OPENUSER                    = 0x00000400
+OPENMEMORY                  = 0x00000800
+OPENMEMORY_POINT            = 0x10000000
+OPENRAW                     = 0x00001000
+OPENONLY                    = 0x00002000
+ACCURATETIME                = 0x00004000
+MPEGSEARCH                  = 0x00008000
+NONBLOCKING                 = 0x00010000
+UNIQUE                      = 0x00020000
+_3D_HEADRELATIVE            = 0x00040000
+_3D_WORLDRELATIVE           = 0x00080000
+_3D_INVERSEROLLOFF          = 0x00100000
+_3D_LINEARROLLOFF           = 0x00200000
+_3D_LINEARSQUAREROLLOFF     = 0x00400000
+_3D_INVERSETAPEREDROLLOFF   = 0x00800000
+_3D_CUSTOMROLLOFF           = 0x04000000
+_3D_IGNOREGEOMETRY          = 0x40000000
+IGNORETAGS                  = 0x02000000
+LOWMEM                      = 0x08000000
+VIRTUAL_PLAYFROMSTART       = 0x80000000
+
+ +
+
FMOD_DEFAULT
+
Default for all modes listed below. FMOD_LOOP_OFF, FMOD_2D, FMOD_3D_WORLDRELATIVE, FMOD_3D_INVERSEROLLOFF
+
FMOD_LOOP_OFF
+
For non looping Sounds. (DEFAULT). Overrides FMOD_LOOP_NORMAL / FMOD_LOOP_BIDI.
+
FMOD_LOOP_NORMAL
+
For forward looping Sounds.
+
FMOD_LOOP_BIDI
+
For bidirectional looping Sounds. (only works on non-streaming, real voices).
+
FMOD_2D
+
Ignores any 3d processing. (DEFAULT).
+
FMOD_3D
+
Makes the Sound positionable in 3D. Overrides FMOD_2D.
+
FMOD_CREATESTREAM
+
Decompress at runtime, streaming from the source provided (ie from disk). Overrides FMOD_CREATESAMPLE and FMOD_CREATECOMPRESSEDSAMPLE. Note a stream can only be played once at a time due to a stream only having 1 stream buffer and file handle. Open multiple streams to have them play concurrently.
+
FMOD_CREATESAMPLE
+
Decompress at loadtime, decompressing or decoding whole file into memory as the target sample format (ie PCM). Fastest for playback and most flexible.
+
FMOD_CREATECOMPRESSEDSAMPLE
+
Load MP2/MP3/FADPCM/IMAADPCM/Vorbis/AT9 or XMA into memory and leave it compressed. Vorbis/AT9/FADPCM encoding only supported in the .FSB container format. During playback the FMOD software mixer will decode it in realtime as a 'compressed sample'. Overrides FMOD_CREATESAMPLE. If the sound data is not one of the supported formats, it will behave as if it was created with FMOD_CREATESAMPLE and decode the sound into PCM.
+
FMOD_OPENUSER
+
Opens a user-created static sample or stream. When used, the first argument of System::createSound and System::createStream, name_or_data, is ignored, so recommended practice is to pass null or equivalent. The following data must be provided using FMOD_CREATESOUNDEXINFO: cbsize, length, numchannels, defaultfrequency, format, and optionally readcallback. If a user-created 'sample' is created with no read callback, the sample will be empty. If this is the case, use Sound::lock and Sound::unlock to place sound data into the Sound.
+
FMOD_OPENMEMORY
+
When used, the first argument of System::createSound and System::createStream, name_or_data, is interpreted as a pointer to memory instead of filename for creating sounds. The following data must be provided using FMOD_CREATESOUNDEXINFO: cbsize, and length. If used with FMOD_CREATESAMPLE or FMOD_CREATECOMPRESSEDSAMPLE, FMOD duplicates the memory into its own buffers. Your own buffer can be freed after open, unless you are using FMOD_NONBLOCKING then wait until the Sound is in the FMOD_OPENSTATE_READY state. If used with FMOD_CREATESTREAM, FMOD will stream out of the buffer whose pointer you passed in. In this case, your own buffer should not be freed until you have finished with and released the stream.
+
FMOD_OPENMEMORY_POINT
+
When used, the first argument of System::createSound and System::createStream, name_or_data, is interpreted as a pointer to memory instead of filename for creating sounds. The following data must be provided using FMOD_CREATESOUNDEXINFO: cbsize, and length. This differs to FMOD_OPENMEMORY in that it uses the memory as is, without duplicating the memory into its own buffers. Cannot be freed after open, only after Sound::release. Will not work if the data is compressed and FMOD_CREATECOMPRESSEDSAMPLE is not used. Cannot be used in conjunction with FMOD_CREATESOUNDEXINFO::encryptionkey.
+
FMOD_OPENRAW
+
Will ignore file format and treat as raw pcm. The following data must be provided using FMOD_CREATESOUNDEXINFO: cbsize, numchannels, defaultfrequency, and format. Must be little endian data.
+
FMOD_OPENONLY
+
Just open the file, don't prebuffer or read. Good for fast opens for info, or when Sound::readData is to be used.
+
FMOD_ACCURATETIME
+
For System::createSound - for accurate Sound::getLength / Channel::setPosition on VBR MP3, and MOD/S3M/XM/IT/MIDI files. Scans file first, so takes longer to open. FMOD_OPENONLY does not affect this.
+
FMOD_MPEGSEARCH
+
For corrupted / bad MP3 files. This will search all the way through the file until it hits a valid MPEG header. Normally only searches for 4k.
+
FMOD_NONBLOCKING
+
For opening Sounds and getting streamed subsounds (seeking) asynchronously. Use Sound::getOpenState to poll the state of the Sound as it opens or retrieves the subsound in the background.
+
FMOD_UNIQUE
+
Unique Sound, can only be played one at a time.
+
FMOD_3D_HEADRELATIVE
+
Make the Sound's position, velocity and orientation relative to the listener.
+
FMOD_3D_WORLDRELATIVE
+
Make the Sound's position, velocity and orientation absolute (relative to the world). (DEFAULT)
+
FMOD_3D_INVERSEROLLOFF
+
This sound follows an inverse roll-off model. Below mindistance, the volume is unattenuated; as distance increases above mindistance, the volume attenuates using mindistance/distance as the gradient until it reaches maxdistance, where it stops attenuating. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. This roll-off mode accurately models the way sounds attenuate over distance in the real world. (DEFAULT)
+
Inverse Roll-off Graph
+
FMOD_3D_LINEARROLLOFF
+
This sound follows a linear roll-off model. Below mindistance, the volume is unattenuated; as distance increases from mindistance to maxdistance, the volume attenuates to silence using a linear gradient. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. While this roll-off mode is not as realistic as inverse roll-off mode, it is easier to comprehend.
+
Linear Roll-off Graph
+
FMOD_3D_LINEARSQUAREROLLOFF
+
This sound follows a linear-square roll-off model. Below mindistance, the volume is unattenuated; as distance increases from mindistance to maxdistance, the volume attenuates to silence according to a linear squared gradient. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. This roll-off mode provides steeper volume ramping close to the mindistance, and more gradual ramping close to the maxdistance, than linear roll-off mode.
+
Linear Square Roll-off Graph
+
FMOD_3D_INVERSETAPEREDROLLOFF
+
This sound follows a combination of the inverse and linear-square roll-off models. At short distances where inverse roll-off would provide greater attenuation, it functions as inverse roll-off mode; then at greater distances where linear-square roll-off mode would provide greater attenuation, it uses that roll-off mode instead. For this roll-off mode, distance values greater than mindistance are scaled according to the rolloffscale. Inverse tapered roll-off mode approximates realistic behavior while still guaranteeing the sound attenuates to silence at maxdistance.
+
Inverse Tapered Roll-off Graph
+
FMOD_3D_CUSTOMROLLOFF
+
This sound follow a roll-off model defined by Sound::set3DCustomRolloff / ChannelControl::set3DCustomRolloff. This roll-off mode provides greater freedom and flexibility than any other, but must be defined manually.
+
FMOD_3D_IGNOREGEOMETRY
+
Is not affected by geometry occlusion. If not specified in Sound::setMode, or ChannelControl::setMode, the flag is cleared and it is affected by geometry again.
+
FMOD_IGNORETAGS
+
Skips id3v2/asf/etc tag checks when opening a Sound, to reduce seek/read overhead when opening files.
+
FMOD_LOWMEM
+
Removes some features from samples to give a lower memory overhead, like Sound::getName.
+
FMOD_VIRTUAL_PLAYFROMSTART
+
For Channels that start virtual (due to being quiet or low importance), instead of swapping back to audible, and playing at the correct offset according to time, this flag makes the Channel play from the start.
+
+

By default a Sound will open as a static sound that is decompressed fully into memory to PCM. (ie equivalent of FMOD_CREATESAMPLE) To have a stream instead, use FMOD_CREATESTREAM, or use the wrapper function System::createStream.

+

Some opening modes (ie FMOD_OPENUSER, FMOD_OPENMEMORY, FMOD_OPENMEMORY_POINT, FMOD_OPENRAW) will need extra information. This can be provided using the FMOD_CREATESOUNDEXINFO structure.

+

Specifying FMOD_OPENMEMORY_POINT will POINT to your memory rather allocating its own sound buffers and duplicating it internally. This means you cannot free the memory while FMOD is using it, until after Sound::release is called.

+

With FMOD_OPENMEMORY_POINT, for PCM formats, only WAV, FSB, and RAW are supported. For compressed formats, only those formats supported by FMOD_CREATECOMPRESSEDSAMPLE are supported.

+

With FMOD_OPENMEMORY_POINT and FMOD_OPENRAW or PCM, if using them together, note that you must pad the data on each side by 16 bytes. This is so fmod can modify the ends of the data for looping / interpolation / mixing purposes. If a wav file, you will need to insert silence, and then reset loop points to stop the playback from playing that silence.

+

See Also: System::createSound, System::createStream, Sound::setMode, ChannelControl::setMode

+

FMOD_RESULT

+

Error codes returned from every function.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_RESULT {
+  FMOD_OK,
+  FMOD_ERR_BADCOMMAND,
+  FMOD_ERR_CHANNEL_ALLOC,
+  FMOD_ERR_CHANNEL_STOLEN,
+  FMOD_ERR_DMA,
+  FMOD_ERR_DSP_CONNECTION,
+  FMOD_ERR_DSP_DONTPROCESS,
+  FMOD_ERR_DSP_FORMAT,
+  FMOD_ERR_DSP_INUSE,
+  FMOD_ERR_DSP_NOTFOUND,
+  FMOD_ERR_DSP_RESERVED,
+  FMOD_ERR_DSP_SILENCE,
+  FMOD_ERR_DSP_TYPE,
+  FMOD_ERR_FILE_BAD,
+  FMOD_ERR_FILE_COULDNOTSEEK,
+  FMOD_ERR_FILE_DISKEJECTED,
+  FMOD_ERR_FILE_EOF,
+  FMOD_ERR_FILE_ENDOFDATA,
+  FMOD_ERR_FILE_NOTFOUND,
+  FMOD_ERR_FORMAT,
+  FMOD_ERR_HEADER_MISMATCH,
+  FMOD_ERR_HTTP,
+  FMOD_ERR_HTTP_ACCESS,
+  FMOD_ERR_HTTP_PROXY_AUTH,
+  FMOD_ERR_HTTP_SERVER_ERROR,
+  FMOD_ERR_HTTP_TIMEOUT,
+  FMOD_ERR_INITIALIZATION,
+  FMOD_ERR_INITIALIZED,
+  FMOD_ERR_INTERNAL,
+  FMOD_ERR_INVALID_FLOAT,
+  FMOD_ERR_INVALID_HANDLE,
+  FMOD_ERR_INVALID_PARAM,
+  FMOD_ERR_INVALID_POSITION,
+  FMOD_ERR_INVALID_SPEAKER,
+  FMOD_ERR_INVALID_SYNCPOINT,
+  FMOD_ERR_INVALID_THREAD,
+  FMOD_ERR_INVALID_VECTOR,
+  FMOD_ERR_MAXAUDIBLE,
+  FMOD_ERR_MEMORY,
+  FMOD_ERR_MEMORY_CANTPOINT,
+  FMOD_ERR_NEEDS3D,
+  FMOD_ERR_NEEDSHARDWARE,
+  FMOD_ERR_NET_CONNECT,
+  FMOD_ERR_NET_SOCKET_ERROR,
+  FMOD_ERR_NET_URL,
+  FMOD_ERR_NET_WOULD_BLOCK,
+  FMOD_ERR_NOTREADY,
+  FMOD_ERR_OUTPUT_ALLOCATED,
+  FMOD_ERR_OUTPUT_CREATEBUFFER,
+  FMOD_ERR_OUTPUT_DRIVERCALL,
+  FMOD_ERR_OUTPUT_FORMAT,
+  FMOD_ERR_OUTPUT_INIT,
+  FMOD_ERR_OUTPUT_NODRIVERS,
+  FMOD_ERR_PLUGIN,
+  FMOD_ERR_PLUGIN_MISSING,
+  FMOD_ERR_PLUGIN_RESOURCE,
+  FMOD_ERR_PLUGIN_VERSION,
+  FMOD_ERR_RECORD,
+  FMOD_ERR_REVERB_CHANNELGROUP,
+  FMOD_ERR_REVERB_INSTANCE,
+  FMOD_ERR_SUBSOUNDS,
+  FMOD_ERR_SUBSOUND_ALLOCATED,
+  FMOD_ERR_SUBSOUND_CANTMOVE,
+  FMOD_ERR_TAGNOTFOUND,
+  FMOD_ERR_TOOMANYCHANNELS,
+  FMOD_ERR_TRUNCATED,
+  FMOD_ERR_UNIMPLEMENTED,
+  FMOD_ERR_UNINITIALIZED,
+  FMOD_ERR_UNSUPPORTED,
+  FMOD_ERR_VERSION,
+  FMOD_ERR_EVENT_ALREADY_LOADED,
+  FMOD_ERR_EVENT_LIVEUPDATE_BUSY,
+  FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH,
+  FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT,
+  FMOD_ERR_EVENT_NOTFOUND,
+  FMOD_ERR_STUDIO_UNINITIALIZED,
+  FMOD_ERR_STUDIO_NOT_LOADED,
+  FMOD_ERR_INVALID_STRING,
+  FMOD_ERR_ALREADY_LOCKED,
+  FMOD_ERR_NOT_LOCKED,
+  FMOD_ERR_RECORD_DISCONNECTED,
+  FMOD_ERR_TOOMANYSAMPLES
+} FMOD_RESULT;
+
+ +
enum RESULT : int
+{
+  OK,
+  ERR_BADCOMMAND,
+  ERR_CHANNEL_ALLOC,
+  ERR_CHANNEL_STOLEN,
+  ERR_DMA,
+  ERR_DSP_CONNECTION,
+  ERR_DSP_DONTPROCESS,
+  ERR_DSP_FORMAT,
+  ERR_DSP_INUSE,
+  ERR_DSP_NOTFOUND,
+  ERR_DSP_RESERVED,
+  ERR_DSP_SILENCE,
+  ERR_DSP_TYPE,
+  ERR_FILE_BAD,
+  ERR_FILE_COULDNOTSEEK,
+  ERR_FILE_DISKEJECTED,
+  ERR_FILE_EOF,
+  ERR_FILE_ENDOFDATA,
+  ERR_FILE_NOTFOUND,
+  ERR_FORMAT,
+  ERR_HEADER_MISMATCH,
+  ERR_HTTP,
+  ERR_HTTP_ACCESS,
+  ERR_HTTP_PROXY_AUTH,
+  ERR_HTTP_SERVER_ERROR,
+  ERR_HTTP_TIMEOUT,
+  ERR_INITIALIZATION,
+  ERR_INITIALIZED,
+  ERR_INTERNAL,
+  ERR_INVALID_FLOAT,
+  ERR_INVALID_HANDLE,
+  ERR_INVALID_PARAM,
+  ERR_INVALID_POSITION,
+  ERR_INVALID_SPEAKER,
+  ERR_INVALID_SYNCPOINT,
+  ERR_INVALID_THREAD,
+  ERR_INVALID_VECTOR,
+  ERR_MAXAUDIBLE,
+  ERR_MEMORY,
+  ERR_MEMORY_CANTPOINT,
+  ERR_NEEDS3D,
+  ERR_NEEDSHARDWARE,
+  ERR_NET_CONNECT,
+  ERR_NET_SOCKET_ERROR,
+  ERR_NET_URL,
+  ERR_NET_WOULD_BLOCK,
+  ERR_NOTREADY,
+  ERR_OUTPUT_ALLOCATED,
+  ERR_OUTPUT_CREATEBUFFER,
+  ERR_OUTPUT_DRIVERCALL,
+  ERR_OUTPUT_FORMAT,
+  ERR_OUTPUT_INIT,
+  ERR_OUTPUT_NODRIVERS,
+  ERR_PLUGIN,
+  ERR_PLUGIN_MISSING,
+  ERR_PLUGIN_RESOURCE,
+  ERR_PLUGIN_VERSION,
+  ERR_RECORD,
+  ERR_REVERB_CHANNELGROUP,
+  ERR_REVERB_INSTANCE,
+  ERR_SUBSOUNDS,
+  ERR_SUBSOUND_ALLOCATED,
+  ERR_SUBSOUND_CANTMOVE,
+  ERR_TAGNOTFOUND,
+  ERR_TOOMANYCHANNELS,
+  ERR_TRUNCATED,
+  ERR_UNIMPLEMENTED,
+  ERR_UNINITIALIZED,
+  ERR_UNSUPPORTED,
+  ERR_VERSION,
+  ERR_EVENT_ALREADY_LOADED,
+  ERR_EVENT_LIVEUPDATE_BUSY,
+  ERR_EVENT_LIVEUPDATE_MISMATCH,
+  ERR_EVENT_LIVEUPDATE_TIMEOUT,
+  ERR_EVENT_NOTFOUND,
+  ERR_STUDIO_UNINITIALIZED,
+  ERR_STUDIO_NOT_LOADED,
+  ERR_INVALID_STRING,
+  ERR_ALREADY_LOCKED,
+  ERR_NOT_LOCKED,
+  ERR_RECORD_DISCONNECTED,
+  ERR_TOOMANYSAMPLES,
+}
+
+ +
OK
+ERR_BADCOMMAND
+ERR_CHANNEL_ALLOC
+ERR_CHANNEL_STOLEN
+ERR_DMA
+ERR_DSP_CONNECTION
+ERR_DSP_DONTPROCESS
+ERR_DSP_FORMAT
+ERR_DSP_INUSE
+ERR_DSP_NOTFOUND
+ERR_DSP_RESERVED
+ERR_DSP_SILENCE
+ERR_DSP_TYPE
+ERR_FILE_BAD
+ERR_FILE_COULDNOTSEEK
+ERR_FILE_DISKEJECTED
+ERR_FILE_EOF
+ERR_FILE_ENDOFDATA
+ERR_FILE_NOTFOUND
+ERR_FORMAT
+ERR_HEADER_MISMATCH
+ERR_HTTP
+ERR_HTTP_ACCESS
+ERR_HTTP_PROXY_AUTH
+ERR_HTTP_SERVER_ERROR
+ERR_HTTP_TIMEOUT
+ERR_INITIALIZATION
+ERR_INITIALIZED
+ERR_INTERNAL
+ERR_INVALID_FLOAT
+ERR_INVALID_HANDLE
+ERR_INVALID_PARAM
+ERR_INVALID_POSITION
+ERR_INVALID_SPEAKER
+ERR_INVALID_SYNCPOINT
+ERR_INVALID_THREAD
+ERR_INVALID_VECTOR
+ERR_MAXAUDIBLE
+ERR_MEMORY
+ERR_MEMORY_CANTPOINT
+ERR_NEEDS3D
+ERR_NEEDSHARDWARE
+ERR_NET_CONNECT
+ERR_NET_SOCKET_ERROR
+ERR_NET_URL
+ERR_NET_WOULD_BLOCK
+ERR_NOTREADY
+ERR_OUTPUT_ALLOCATED
+ERR_OUTPUT_CREATEBUFFER
+ERR_OUTPUT_DRIVERCALL
+ERR_OUTPUT_FORMAT
+ERR_OUTPUT_INIT
+ERR_OUTPUT_NODRIVERS
+ERR_PLUGIN
+ERR_PLUGIN_MISSING
+ERR_PLUGIN_RESOURCE
+ERR_PLUGIN_VERSION
+ERR_RECORD
+ERR_REVERB_CHANNELGROUP
+ERR_REVERB_INSTANCE
+ERR_SUBSOUNDS
+ERR_SUBSOUND_ALLOCATED
+ERR_SUBSOUND_CANTMOVE
+ERR_TAGNOTFOUND
+ERR_TOOMANYCHANNELS
+ERR_TRUNCATED
+ERR_UNIMPLEMENTED
+ERR_UNINITIALIZED
+ERR_UNSUPPORTED
+ERR_VERSION
+ERR_EVENT_ALREADY_LOADED
+ERR_EVENT_LIVEUPDATE_BUSY
+ERR_EVENT_LIVEUPDATE_MISMATCH
+ERR_EVENT_LIVEUPDATE_TIMEOUT
+ERR_EVENT_NOTFOUND
+ERR_STUDIO_UNINITIALIZED
+ERR_STUDIO_NOT_LOADED
+ERR_INVALID_STRING
+ERR_ALREADY_LOCKED
+ERR_NOT_LOCKED
+ERR_RECORD_DISCONNECTED
+ERR_TOOMANYSAMPLES
+
+ +
+
FMOD_OK
+
No errors.
+
FMOD_ERR_BADCOMMAND
+
Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming Sound).
+
FMOD_ERR_CHANNEL_ALLOC
+
Error trying to allocate a Channel.
+
FMOD_ERR_CHANNEL_STOLEN
+
The specified Channel has been reused to play another Sound.
+
FMOD_ERR_DMA
+
DMA Failure. See debug output for more information.
+
FMOD_ERR_DSP_CONNECTION
+
DSP connection error. Connection possibly caused a cyclic dependency or connected DSPs with incompatible buffer counts.
+
FMOD_ERR_DSP_DONTPROCESS
+
DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph.
+
FMOD_ERR_DSP_FORMAT
+
DSP format error. A DSP unit may have attempted to connect to this graph with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map.
+
FMOD_ERR_DSP_INUSE
+
DSP is already in the mixer's DSP graph. It must be removed before being reinserted or released.
+
FMOD_ERR_DSP_NOTFOUND
+
DSP connection error. Couldn't find the DSP unit specified.
+
FMOD_ERR_DSP_RESERVED
+
DSP operation error. Cannot perform operation on this DSP as it is reserved by the system.
+
FMOD_ERR_DSP_SILENCE
+
DSP return code from a DSP process query callback. Tells the mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph.
+
FMOD_ERR_DSP_TYPE
+
DSP operation cannot be performed on a DSP of this type.
+
FMOD_ERR_FILE_BAD
+
Error loading file.
+
FMOD_ERR_FILE_COULDNOTSEEK
+
Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format.
+
FMOD_ERR_FILE_DISKEJECTED
+
Media was ejected while reading.
+
FMOD_ERR_FILE_EOF
+
End of file unexpectedly reached while trying to read essential data (truncated?).
+
FMOD_ERR_FILE_ENDOFDATA
+
End of current chunk reached while trying to read data.
+
FMOD_ERR_FILE_NOTFOUND
+
File not found.
+
FMOD_ERR_FORMAT
+
Unsupported file or audio format.
+
FMOD_ERR_HEADER_MISMATCH
+
There is a version mismatch between the FMOD header and either the FMOD API library or the Core API library.
+
FMOD_ERR_HTTP
+
A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere.
+
FMOD_ERR_HTTP_ACCESS
+
The specified resource requires authentication or is forbidden.
+
FMOD_ERR_HTTP_PROXY_AUTH
+
Proxy authentication is required to access the specified resource.
+
FMOD_ERR_HTTP_SERVER_ERROR
+
A HTTP server error occurred.
+
FMOD_ERR_HTTP_TIMEOUT
+
The HTTP request timed out.
+
FMOD_ERR_INITIALIZATION
+
FMOD was not initialized correctly to support this function.
+
FMOD_ERR_INITIALIZED
+
Cannot call this command after System::init.
+
FMOD_ERR_INTERNAL
+
An error occured in the FMOD system. Use the logging version of FMOD for more information.
+
FMOD_ERR_INVALID_FLOAT
+
Value passed in was a NaN, Inf or denormalized float.
+
FMOD_ERR_INVALID_HANDLE
+
An invalid object handle was used.
+
FMOD_ERR_INVALID_PARAM
+
An invalid parameter was passed to this function.
+
FMOD_ERR_INVALID_POSITION
+
An invalid seek position was passed to this function.
+
FMOD_ERR_INVALID_SPEAKER
+
An invalid speaker was passed to this function based on the current speaker mode.
+
FMOD_ERR_INVALID_SYNCPOINT
+
The syncpoint did not come from this Sound handle.
+
FMOD_ERR_INVALID_THREAD
+
Tried to call a function on a thread that is not supported.
+
FMOD_ERR_INVALID_VECTOR
+
The vectors passed in are not unit length, or perpendicular.
+
FMOD_ERR_MAXAUDIBLE
+
Reached maximum audible playback count for this Sound's SoundGroup.
+
FMOD_ERR_MEMORY
+
Not enough memory or resources.
+
FMOD_ERR_MEMORY_CANTPOINT
+
Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used.
+
FMOD_ERR_NEEDS3D
+
Tried to call a command on a 2D Sound when the command was meant for 3D Sound.
+
FMOD_ERR_NEEDSHARDWARE
+
Tried to use a feature that requires hardware support.
+
FMOD_ERR_NET_CONNECT
+
Couldn't connect to the specified host.
+
FMOD_ERR_NET_SOCKET_ERROR
+
A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere.
+
FMOD_ERR_NET_URL
+
The specified URL couldn't be resolved.
+
FMOD_ERR_NET_WOULD_BLOCK
+
Operation on a non-blocking socket could not complete immediately.
+
FMOD_ERR_NOTREADY
+
Operation could not be performed because specified Sound/DSP connection is not ready.
+
FMOD_ERR_OUTPUT_ALLOCATED
+
Error initializing output device, but more specifically, the output device is already in use and cannot be reused.
+
FMOD_ERR_OUTPUT_CREATEBUFFER
+
Error creating hardware sound buffer.
+
FMOD_ERR_OUTPUT_DRIVERCALL
+
A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted.
+
FMOD_ERR_OUTPUT_FORMAT
+
Soundcard does not support the specified format.
+
FMOD_ERR_OUTPUT_INIT
+
Error initializing output device.
+
FMOD_ERR_OUTPUT_NODRIVERS
+
The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails.
+
FMOD_ERR_PLUGIN
+
An unspecified error has been returned from a plug-in.
+
FMOD_ERR_PLUGIN_MISSING
+
A requested output, dsp unit type or codec was not available.
+
FMOD_ERR_PLUGIN_RESOURCE
+
A resource that the plug-in requires (e.g.: The DLS file for MIDI playback) cannot be allocated or found.
+
FMOD_ERR_PLUGIN_VERSION
+
A plug-in was built with an unsupported SDK version.
+
FMOD_ERR_RECORD
+
An error occurred trying to initialize the recording device.
+
FMOD_ERR_REVERB_CHANNELGROUP
+
Reverb properties cannot be set on this Channel because a parent ChannelGroup owns the reverb connection.
+
FMOD_ERR_REVERB_INSTANCE
+
Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist.
+
FMOD_ERR_SUBSOUNDS
+
The error occurred because the Sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent Sound.
+
FMOD_ERR_SUBSOUND_ALLOCATED
+
This subsound is already being used by another Sound, you cannot have more than one parent to a Sound. Null out the other parent's entry first.
+
FMOD_ERR_SUBSOUND_CANTMOVE
+
Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file.
+
FMOD_ERR_TAGNOTFOUND
+
The specified tag could not be found or there are no tags.
+
FMOD_ERR_TOOMANYCHANNELS
+
The Sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat.
+
FMOD_ERR_TRUNCATED
+
The retrieved string is too long to fit in the supplied buffer and has been truncated.
+
FMOD_ERR_UNIMPLEMENTED
+
Something in FMOD hasn't been implemented when it should be. Contact support.
+
FMOD_ERR_UNINITIALIZED
+
This command failed because System::init or System::setDriver was not called.
+
FMOD_ERR_UNSUPPORTED
+
A command issued was not supported by this object. Possibly a plug-in without certain callbacks specified.
+
FMOD_ERR_VERSION
+
The version number of this file format is not supported.
+
FMOD_ERR_EVENT_ALREADY_LOADED
+
The specified bank has already been loaded.
+
FMOD_ERR_EVENT_LIVEUPDATE_BUSY
+
The live update connection failed due to the game already being connected.
+
FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH
+
The live update connection failed due to the game data being out of sync with the tool.
+
FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT
+
The live update connection timed out.
+
FMOD_ERR_EVENT_NOTFOUND
+
The requested event, parameter, bus or vca could not be found.
+
FMOD_ERR_STUDIO_UNINITIALIZED
+
The Studio::System object is not yet initialized.
+
FMOD_ERR_STUDIO_NOT_LOADED
+
The specified resource is not loaded, so it can't be unloaded.
+
FMOD_ERR_INVALID_STRING
+
An invalid string was passed to this function.
+
FMOD_ERR_ALREADY_LOCKED
+
The specified resource is already locked.
+
FMOD_ERR_NOT_LOCKED
+
The specified resource is not locked, so it can't be unlocked.
+
FMOD_ERR_RECORD_DISCONNECTED
+
The specified recording driver has been disconnected.
+
FMOD_ERR_TOOMANYSAMPLES
+
The length provided exceeds the allowable limit.
+
+

FMOD_SPEAKER

+

Assigns an enumeration for a speaker index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_SPEAKER {
+  FMOD_SPEAKER_NONE = -1,
+  FMOD_SPEAKER_FRONT_LEFT,
+  FMOD_SPEAKER_FRONT_RIGHT,
+  FMOD_SPEAKER_FRONT_CENTER,
+  FMOD_SPEAKER_LOW_FREQUENCY,
+  FMOD_SPEAKER_SURROUND_LEFT,
+  FMOD_SPEAKER_SURROUND_RIGHT,
+  FMOD_SPEAKER_BACK_LEFT,
+  FMOD_SPEAKER_BACK_RIGHT,
+  FMOD_SPEAKER_TOP_FRONT_LEFT,
+  FMOD_SPEAKER_TOP_FRONT_RIGHT,
+  FMOD_SPEAKER_TOP_BACK_LEFT,
+  FMOD_SPEAKER_TOP_BACK_RIGHT,
+  FMOD_SPEAKER_MAX
+} FMOD_SPEAKER;
+
+ +
enum SPEAKER : int
+{
+  NONE = -1,
+  FRONT_LEFT,
+  FRONT_RIGHT,
+  FRONT_CENTER,
+  LOW_FREQUENCY,
+  SURROUND_LEFT,
+  SURROUND_RIGHT,
+  BACK_LEFT,
+  BACK_RIGHT,
+  TOP_FRONT_LEFT,
+  TOP_FRONT_RIGHT,
+  TOP_BACK_LEFT,
+  TOP_BACK_RIGHT,
+  MAX,
+}
+
+ +
SPEAKER_NONE = -1
+SPEAKER_FRONT_LEFT
+SPEAKER_FRONT_RIGHT
+SPEAKER_FRONT_CENTER
+SPEAKER_LOW_FREQUENCY
+SPEAKER_SURROUND_LEFT
+SPEAKER_SURROUND_RIGHT
+SPEAKER_BACK_LEFT
+SPEAKER_BACK_RIGHT
+SPEAKER_TOP_FRONT_LEFT
+SPEAKER_TOP_FRONT_RIGHT
+SPEAKER_TOP_BACK_LEFT
+SPEAKER_TOP_BACK_RIGHT
+SPEAKER_MAX
+
+ +
+
FMOD_SPEAKER_NONE
+
No speaker
+
FMOD_SPEAKER_FRONT_LEFT
+
The front left speaker
+
FMOD_SPEAKER_FRONT_RIGHT
+
The front right speaker
+
FMOD_SPEAKER_FRONT_CENTER
+
The front center speaker
+
FMOD_SPEAKER_LOW_FREQUENCY
+
The LFE or 'subwoofer' speaker
+
FMOD_SPEAKER_SURROUND_LEFT
+
The surround left (usually to the side) speaker
+
FMOD_SPEAKER_SURROUND_RIGHT
+
The surround right (usually to the side) speaker
+
FMOD_SPEAKER_BACK_LEFT
+
The back left speaker
+
FMOD_SPEAKER_BACK_RIGHT
+
The back right speaker
+
FMOD_SPEAKER_TOP_FRONT_LEFT
+
The top front left speaker
+
FMOD_SPEAKER_TOP_FRONT_RIGHT
+
The top front right speaker
+
FMOD_SPEAKER_TOP_BACK_LEFT
+
The top back left speaker
+
FMOD_SPEAKER_TOP_BACK_RIGHT
+
The top back right speaker
+
FMOD_SPEAKER_MAX
+
Maximum number of speaker types supported.
+
+

See Also: System::setSpeakerPosition, System::getSpeakerPosition

+

FMOD_SPEAKERMODE

+

Speaker mode types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_SPEAKERMODE {
+  FMOD_SPEAKERMODE_DEFAULT,
+  FMOD_SPEAKERMODE_RAW,
+  FMOD_SPEAKERMODE_MONO,
+  FMOD_SPEAKERMODE_STEREO,
+  FMOD_SPEAKERMODE_QUAD,
+  FMOD_SPEAKERMODE_SURROUND,
+  FMOD_SPEAKERMODE_5POINT1,
+  FMOD_SPEAKERMODE_7POINT1,
+  FMOD_SPEAKERMODE_7POINT1POINT4,
+  FMOD_SPEAKERMODE_MAX
+} FMOD_SPEAKERMODE;
+
+ +
enum SPEAKERMODE : int
+{
+  DEFAULT,
+  RAW,
+  MONO,
+  STEREO,
+  QUAD,
+  SURROUND,
+  _5POINT1,
+  _7POINT1,
+  _7POINT1POINT4,
+  MAX,
+}
+
+ +
SPEAKERMODE_DEFAULT
+SPEAKERMODE_RAW
+SPEAKERMODE_MONO
+SPEAKERMODE_STEREO
+SPEAKERMODE_QUAD
+SPEAKERMODE_SURROUND
+SPEAKERMODE_5POINT1
+SPEAKERMODE_7POINT1
+SPEAKERMODE_7POINT1POINT4
+SPEAKERMODE_MAX
+
+ +
+
FMOD_SPEAKERMODE_DEFAULT
+
Default speaker mode for the chosen output mode which will resolve after System::init.
+
FMOD_SPEAKERMODE_RAW
+
Assume there is no special mapping from a given channel to a speaker, channels map 1:1 in order. Use System::setSoftwareFormat to specify the speaker count.
+
FMOD_SPEAKERMODE_MONO
+
1 speaker setup (monaural).
+
FMOD_SPEAKERMODE_STEREO
+
2 speaker setup (stereo) front left, front right.
+
FMOD_SPEAKERMODE_QUAD
+
4 speaker setup (4.0) front left, front right, surround left, surround right.
+
FMOD_SPEAKERMODE_SURROUND
+
5 speaker setup (5.0) front left, front right, center, surround left, surround right.
+
FMOD_SPEAKERMODE_5POINT1
+
6 speaker setup (5.1) front left, front right, center, low frequency, surround left, surround right.
+
FMOD_SPEAKERMODE_7POINT1
+
8 speaker setup (7.1) front left, front right, center, low frequency, surround left, surround right, back left, back right.
+
FMOD_SPEAKERMODE_7POINT1POINT4
+
12 speaker setup (7.1.4) front left, front right, center, low frequency, surround left, surround right, back left, back right, top front left, top front right, top back left, top back right.
+
FMOD_SPEAKERMODE_MAX
+
Maximum number of speaker modes supported.
+
+

Note below the phrase 'sound channels' is used. These are the subchannels inside a sound, they are not related and have nothing to do with the FMOD class "Channel".

+

For example a mono sound has 1 sound channel, a stereo sound has 2 sound channels, and an AC3 or 6 channel wav file have 6 "sound channels".

+

FMOD_SPEAKERMODE_RAW
+This mode is for output devices that are not specifically mono/stereo/quad/surround/5.1 or 7.1, but are multi-channel.

+ +

FMOD_SPEAKERMODE_MONO
+This mode is for a 1 speaker arrangement.

+
    +
  • Panning does not work in this speaker mode.
  • +
  • Mono, stereo and multi-channel sounds have each sound channel played on the one speaker at unity.
  • +
  • Mix behavior for multi-channel sounds can be set with ChannelControl::setMixMatrix.
  • +
+

FMOD_SPEAKERMODE_STEREO
+This mode is for 2 speaker arrangements that have a left and right speaker.

+
    +
  • Mono sounds default to an even distribution between left and right. They can be panned with ChannelControl::setPan.
  • +
  • Stereo sounds default to the middle, or full left in the left speaker and full right in the right speaker. They can be cross faded with ChannelControl::setPan.
  • +
  • Multi-channel sounds have each sound channel played on each speaker at unity.
  • +
  • Mix behavior for multi-channel sounds can be set with ChannelControl::setMixMatrix.
  • +
+

FMOD_SPEAKERMODE_QUAD
+This mode is for 4 speaker arrangements that have a front left, front right, surround left and a surround right speaker.

+
    +
  • Mono sounds default to an even distribution between front left and front right. They can be panned with ChannelControl::setPan.
  • +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. They can be cross faded with ChannelControl::setPan.
  • +
  • Multi-channel sounds default to all of their sound channels being played on each speaker in order of input.
  • +
  • Mix behavior for multi-channel sounds can be set with ChannelControl::setMixMatrix.
  • +
+

FMOD_SPEAKERMODE_SURROUND
+This mode is for 5 speaker arrangements that have a left/right/center/surround left/surround right.

+
    +
  • Mono sounds default to the center speaker. They can be panned with ChannelControl::setPan.
  • +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. They can be cross faded with ChannelControl::setPan.
  • +
  • Multi-channel sounds default to all of their sound channels being played on each speaker in order of input.
  • +
  • Mix behavior for multi-channel sounds can be set with ChannelControl::setMixMatrix.
  • +
+

FMOD_SPEAKERMODE_5POINT1
+This mode is for 5.1 speaker arrangements that have a left/right/center/surround left/surround right and a subwoofer speaker.

+
    +
  • Mono sounds default to the center speaker. They can be panned with ChannelControl::setPan.
  • +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. They can be cross faded with ChannelControl::setPan.
  • +
  • Multi-channel sounds default to all of their sound channels being played on each speaker in order of input.
  • +
  • Mix behavior for multi-channel sounds can be set with ChannelControl::setMixMatrix.
  • +
+

FMOD_SPEAKERMODE_7POINT1
+This mode is for 7.1 speaker arrangements that have a left/right/center/surround left/surround right/rear left/rear right and a subwoofer speaker.

+
    +
  • Mono sounds default to the center speaker. They can be panned with ChannelControl::setPan.
  • +
  • Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. They can be cross faded with ChannelControl::setPan.
  • +
  • Multi-channel sounds default to all of their sound channels being played on each speaker in order of input.
  • +
  • Mix behavior for multi-channel sounds can be set with ChannelControl::setMixMatrix.
  • +
+

See the FMOD Studio Mixing Guide for graphical depictions of each speaker mode.

+

See Also: System::getSoftwareFormat, DSP::setChannelFormat

+

FMOD_SYNCPOINT

+

Named marker for a given point in time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_SYNCPOINT FMOD_SYNCPOINT;
+
+ +
IntPtr
+
+ +
+

Not supported for JavaScript.

+
+

This is an opaque type that you fetch with Sound::getSyncPoint then query with Sound::getSyncPointInfo.

+

See Also: Sound::addSyncPoint, Sound::deleteSyncPoint

+

FMOD_THREAD_AFFINITY

+

Bitfield for specifying the CPU core a given thread runs on.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_THREAD_AFFINITY_GROUP_DEFAULT          0x4000000000000000
+#define FMOD_THREAD_AFFINITY_GROUP_A                0x4000000000000001
+#define FMOD_THREAD_AFFINITY_GROUP_B                0x4000000000000002
+#define FMOD_THREAD_AFFINITY_GROUP_C                0x4000000000000003
+#define FMOD_THREAD_AFFINITY_MIXER                  FMOD_THREAD_AFFINITY_GROUP_A
+#define FMOD_THREAD_AFFINITY_FEEDER                 FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_STREAM                 FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_FILE                   FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_NONBLOCKING            FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_RECORD                 FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_GEOMETRY               FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_PROFILER               FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_STUDIO_UPDATE          FMOD_THREAD_AFFINITY_GROUP_B
+#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_BANK       FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_SAMPLE     FMOD_THREAD_AFFINITY_GROUP_C
+#define FMOD_THREAD_AFFINITY_CORE_ALL               0
+#define FMOD_THREAD_AFFINITY_CORE_0                 (1 << 0)
+#define FMOD_THREAD_AFFINITY_CORE_1                 (1 << 1)
+#define FMOD_THREAD_AFFINITY_CORE_2                 (1 << 2)
+#define FMOD_THREAD_AFFINITY_CORE_3                 (1 << 3)
+#define FMOD_THREAD_AFFINITY_CORE_4                 (1 << 4)
+#define FMOD_THREAD_AFFINITY_CORE_5                 (1 << 5)
+#define FMOD_THREAD_AFFINITY_CORE_6                 (1 << 6)
+#define FMOD_THREAD_AFFINITY_CORE_7                 (1 << 7)
+#define FMOD_THREAD_AFFINITY_CORE_8                 (1 << 8)
+#define FMOD_THREAD_AFFINITY_CORE_9                 (1 << 9)
+#define FMOD_THREAD_AFFINITY_CORE_10                (1 << 10)
+#define FMOD_THREAD_AFFINITY_CORE_11                (1 << 11)
+#define FMOD_THREAD_AFFINITY_CORE_12                (1 << 12)
+#define FMOD_THREAD_AFFINITY_CORE_13                (1 << 13)
+#define FMOD_THREAD_AFFINITY_CORE_14                (1 << 14)
+#define FMOD_THREAD_AFFINITY_CORE_15                (1 << 15)
+
+ +
[Flags]
+enum THREAD_AFFINITY : long
+{
+  GROUP_DEFAULT       = 0x4000000000000000,
+  GROUP_A             = 0x4000000000000001,
+  GROUP_B             = 0x4000000000000002,
+  GROUP_C             = 0x4000000000000003,
+  MIXER               = GROUP_A,
+  FEEDER              = GROUP_C,
+  STREAM              = GROUP_C,
+  FILE                = GROUP_C,
+  NONBLOCKING         = GROUP_C,
+  RECORD              = GROUP_C,
+  GEOMETRY            = GROUP_C,
+  PROFILER            = GROUP_C,
+  STUDIO_UPDATE       = GROUP_B,
+  STUDIO_LOAD_BANK    = GROUP_C,
+  STUDIO_LOAD_SAMPLE  = GROUP_C,
+  CORE_ALL            = 0,
+  CORE_0              = 1 << 0,
+  CORE_1              = 1 << 1,
+  CORE_2              = 1 << 2,
+  CORE_3              = 1 << 3,
+  CORE_4              = 1 << 4,
+  CORE_5              = 1 << 5,
+  CORE_6              = 1 << 6,
+  CORE_7              = 1 << 7,
+  CORE_8              = 1 << 8,
+  CORE_9              = 1 << 9,
+  CORE_10             = 1 << 10,
+  CORE_11             = 1 << 11,
+  CORE_12             = 1 << 12,
+  CORE_13             = 1 << 13,
+  CORE_14             = 1 << 14,
+  CORE_15             = 1 << 15
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_THREAD_AFFINITY_GROUP_DEFAULT
+
For a given thread use the default listed below, i.e. FMOD_THREAD_TYPE_MIXER uses FMOD_THREAD_AFFINITY_MIXER.
+
FMOD_THREAD_AFFINITY_GROUP_A
+
Grouping A is recommended to isolate the mixer thread FMOD_THREAD_TYPE_MIXER.
+
FMOD_THREAD_AFFINITY_GROUP_B
+
Grouping B is recommended to isolate the Studio update thread FMOD_THREAD_TYPE_STUDIO_UPDATE.
+
FMOD_THREAD_AFFINITY_GROUP_C
+
Grouping C is recommended for all remaining threads.
+
FMOD_THREAD_AFFINITY_MIXER
+
Default affinity for FMOD_THREAD_TYPE_MIXER.
+
FMOD_THREAD_AFFINITY_FEEDER
+
Default affinity for FMOD_THREAD_TYPE_FEEDER.
+
FMOD_THREAD_AFFINITY_STREAM
+
Default affinity for FMOD_THREAD_TYPE_STREAM.
+
FMOD_THREAD_AFFINITY_FILE
+
Default affinity for FMOD_THREAD_TYPE_FILE.
+
FMOD_THREAD_AFFINITY_NONBLOCKING
+
Default affinity for FMOD_THREAD_TYPE_NONBLOCKING.
+
FMOD_THREAD_AFFINITY_RECORD
+
Default affinity for FMOD_THREAD_TYPE_RECORD.
+
FMOD_THREAD_AFFINITY_GEOMETRY
+
Default affinity for FMOD_THREAD_TYPE_GEOMETRY.
+
FMOD_THREAD_AFFINITY_PROFILER
+
Default affinity for FMOD_THREAD_TYPE_PROFILER.
+
FMOD_THREAD_AFFINITY_STUDIO_UPDATE
+
Default affinity for FMOD_THREAD_TYPE_STUDIO_UPDATE.
+
FMOD_THREAD_AFFINITY_STUDIO_LOAD_BANK
+
Default affinity for FMOD_THREAD_TYPE_STUDIO_LOAD_BANK.
+
FMOD_THREAD_AFFINITY_STUDIO_LOAD_SAMPLE
+
Default affinity for FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE.
+
FMOD_THREAD_AFFINITY_CONVOLUTION1
+
Default affinity for FMOD_THREAD_TYPE_CONVOLUTION1.
+
FMOD_THREAD_AFFINITY_CONVOLUTION2
+
Default affinity for FMOD_THREAD_TYPE_CONVOLUTION2.
+
FMOD_THREAD_AFFINITY_CORE_ALL
+
Assign to all cores.
+
FMOD_THREAD_AFFINITY_CORE_0
+
Assign to core 0.
+
FMOD_THREAD_AFFINITY_CORE_1
+
Assign to core 1.
+
FMOD_THREAD_AFFINITY_CORE_2
+
Assign to core 2.
+
FMOD_THREAD_AFFINITY_CORE_3
+
Assign to core 3.
+
FMOD_THREAD_AFFINITY_CORE_4
+
Assign to core 4.
+
FMOD_THREAD_AFFINITY_CORE_5
+
Assign to core 5.
+
FMOD_THREAD_AFFINITY_CORE_6
+
Assign to core 6.
+
FMOD_THREAD_AFFINITY_CORE_7
+
Assign to core 7.
+
FMOD_THREAD_AFFINITY_CORE_8
+
Assign to core 8.
+
FMOD_THREAD_AFFINITY_CORE_9
+
Assign to core 9.
+
FMOD_THREAD_AFFINITY_CORE_10
+
Assign to core 10.
+
FMOD_THREAD_AFFINITY_CORE_11
+
Assign to core 11.
+
FMOD_THREAD_AFFINITY_CORE_12
+
Assign to core 12.
+
FMOD_THREAD_AFFINITY_CORE_13
+
Assign to core 13.
+
FMOD_THREAD_AFFINITY_CORE_14
+
Assign to core 14.
+
FMOD_THREAD_AFFINITY_CORE_15
+
Assign to core 15.
+
+

The platform agnostic thread groups, A, B and C give recommendations about FMOD threads that should be separated from one another.
+Platforms with fixed CPU core counts will try to honor this request, those that don't will leave affinity to the operating system.
+See the FMOD platform specific docs for each platform to see how the groups map to cores.

+

If an explicit core affinity is given, i.e. FMOD_THREAD_AFFINITY_CORE_11 and that core is unavailable a fatal error will be produced.

+

Explicit core assignment up to (1 << 61) is supported for platforms with that many cores.

+

See Also: Thread_SetAttributes

+

FMOD_THREAD_PRIORITY

+

Scheduling priority to assign a given thread to.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_THREAD_PRIORITY_PLATFORM_MIN           (-32 * 1024)
+#define FMOD_THREAD_PRIORITY_PLATFORM_MAX           ( 32 * 1024)
+#define FMOD_THREAD_PRIORITY_DEFAULT                (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 1)
+#define FMOD_THREAD_PRIORITY_LOW                    (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 2)
+#define FMOD_THREAD_PRIORITY_MEDIUM                 (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 3)
+#define FMOD_THREAD_PRIORITY_HIGH                   (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 4)
+#define FMOD_THREAD_PRIORITY_VERY_HIGH              (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 5)
+#define FMOD_THREAD_PRIORITY_EXTREME                (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 6)
+#define FMOD_THREAD_PRIORITY_CRITICAL               (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 7)
+#define FMOD_THREAD_PRIORITY_MIXER                  FMOD_THREAD_PRIORITY_EXTREME
+#define FMOD_THREAD_PRIORITY_FEEDER                 FMOD_THREAD_PRIORITY_CRITICAL
+#define FMOD_THREAD_PRIORITY_STREAM                 FMOD_THREAD_PRIORITY_VERY_HIGH
+#define FMOD_THREAD_PRIORITY_FILE                   FMOD_THREAD_PRIORITY_HIGH
+#define FMOD_THREAD_PRIORITY_NONBLOCKING            FMOD_THREAD_PRIORITY_HIGH
+#define FMOD_THREAD_PRIORITY_RECORD                 FMOD_THREAD_PRIORITY_HIGH
+#define FMOD_THREAD_PRIORITY_GEOMETRY               FMOD_THREAD_PRIORITY_LOW
+#define FMOD_THREAD_PRIORITY_PROFILER               FMOD_THREAD_PRIORITY_MEDIUM
+#define FMOD_THREAD_PRIORITY_STUDIO_UPDATE          FMOD_THREAD_PRIORITY_MEDIUM
+#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_BANK       FMOD_THREAD_PRIORITY_MEDIUM
+#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_SAMPLE     FMOD_THREAD_PRIORITY_MEDIUM
+
+ +
enum THREAD_PRIORITY : int
+{
+  PLATFORM_MIN        = -32 * 1024,
+  PLATFORM_MAX        =  32 * 1024,
+  DEFAULT             = PLATFORM_MIN - 1,
+  LOW                 = PLATFORM_MIN - 2,
+  MEDIUM              = PLATFORM_MIN - 3,
+  HIGH                = PLATFORM_MIN - 4,
+  VERY_HIGH           = PLATFORM_MIN - 5,
+  EXTREME             = PLATFORM_MIN - 6,
+  CRITICAL            = PLATFORM_MIN - 7,
+  MIXER               = EXTREME,
+  FEEDER              = CRITICAL,
+  STREAM              = VERY_HIGH,
+  FILE                = HIGH,
+  NONBLOCKING         = HIGH,
+  RECORD              = HIGH,
+  GEOMETRY            = LOW,
+  PROFILER            = MEDIUM,
+  STUDIO_UPDATE       = MEDIUM,
+  STUDIO_LOAD_BANK    = MEDIUM,
+  STUDIO_LOAD_SAMPLE  = MEDIUM
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_THREAD_PRIORITY_PLATFORM_MIN
+
Lower bound of platform specific priority range.
+
FMOD_THREAD_PRIORITY_PLATFORM_MAX
+
Upper bound of platform specific priority range.
+
FMOD_THREAD_PRIORITY_DEFAULT
+
For a given thread use the default listed below, i.e. FMOD_THREAD_TYPE_MIXER uses FMOD_THREAD_PRIORITY_MIXER.
+
FMOD_THREAD_PRIORITY_LOW
+
Low platform agnostic priority.
+
FMOD_THREAD_PRIORITY_MEDIUM
+
Medium platform agnostic priority.
+
FMOD_THREAD_PRIORITY_HIGH
+
High platform agnostic priority.
+
FMOD_THREAD_PRIORITY_VERY_HIGH
+
Very high platform agnostic priority.
+
FMOD_THREAD_PRIORITY_EXTREME
+
Extreme platform agnostic priority.
+
FMOD_THREAD_PRIORITY_CRITICAL
+
Critical platform agnostic priority.
+
FMOD_THREAD_PRIORITY_MIXER
+
Default priority for FMOD_THREAD_TYPE_MIXER.
+
FMOD_THREAD_PRIORITY_FEEDER
+
Default priority for FMOD_THREAD_TYPE_FEEDER.
+
FMOD_THREAD_PRIORITY_STREAM
+
Default priority for FMOD_THREAD_TYPE_STREAM.
+
FMOD_THREAD_PRIORITY_FILE
+
Default priority for FMOD_THREAD_TYPE_FILE.
+
FMOD_THREAD_PRIORITY_NONBLOCKING
+
Default priority for FMOD_THREAD_TYPE_NONBLOCKING.
+
FMOD_THREAD_PRIORITY_RECORD
+
Default priority for FMOD_THREAD_TYPE_RECORD.
+
FMOD_THREAD_PRIORITY_GEOMETRY
+
Default priority for FMOD_THREAD_TYPE_GEOMETRY.
+
FMOD_THREAD_PRIORITY_PROFILER
+
Default priority for FMOD_THREAD_TYPE_PROFILER.
+
FMOD_THREAD_PRIORITY_STUDIO_UPDATE
+
Default priority for FMOD_THREAD_TYPE_STUDIO_UPDATE.
+
FMOD_THREAD_PRIORITY_STUDIO_LOAD_BANK
+
Default priority for FMOD_THREAD_TYPE_STUDIO_LOAD_BANK.
+
FMOD_THREAD_PRIORITY_STUDIO_LOAD_SAMPLE
+
Default priority for FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE.
+
FMOD_THREAD_PRIORITY_CONVOLUTION1
+
Default priority for FMOD_THREAD_TYPE_CONVOLUTION1.
+
FMOD_THREAD_PRIORITY_CONVOLUTION2
+
Default priority for FMOD_THREAD_TYPE_CONVOLUTION2.
+
+

The platform agnostic priorities are used to rank FMOD threads against one another for best runtime scheduling.
+Platforms will translate these values in to platform specific priorities.
+See the FMOD platform specific docs for each platform to see how the agnostic priorities map to specific values.

+

Explicit platform specific priorities can be given within the range of FMOD_THREAD_PRIORITY_PLATFORM_MIN to FMOD_THREAD_PRIORITY_PLATFORM_MAX.
+See platform documentation for details on the available priority values for a given operating system.

+

See Also: Thread_SetAttributes

+

Thread_SetAttributes

+

Specify the affinity, priority and stack size for all FMOD created threads.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Thread_SetAttributes(
+  FMOD_THREAD_TYPE type,
+  FMOD_THREAD_AFFINITY affinity = FMOD_THREAD_AFFINITY_GROUP_DEFAULT,
+  FMOD_THREAD_PRIORITY priority = FMOD_THREAD_PRIORITY_DEFAULT,
+  FMOD_THREAD_STACK_SIZE stacksize = FMOD_THREAD_STACK_SIZE_DEFAULT
+);
+
+ +
FMOD_RESULT FMOD_Thread_SetAttributes(
+  FMOD_THREAD_TYPE type,
+  FMOD_THREAD_AFFINITY affinity,
+  FMOD_THREAD_PRIORITY priority,
+  FMOD_THREAD_STACK_SIZE stacksize
+);
+
+ +
static RESULT Thread.SetAttributes(
+  THREAD_TYPE type,
+  THREAD_AFFINITY affinity = THREAD_AFFINITY.GROUP_DEFAULT,
+  THREAD_PRIORITY priority = THREAD_PRIORITY.DEFAULT,
+  THREAD_STACK_SIZE stacksize = THREAD_STACK_SIZE.DEFAULT
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
type
+
Identifier for an FMOD thread. (FMOD_THREAD_TYPE)
+
affinity Opt
+
Bitfield of desired CPU cores to assign the given thread to. (FMOD_THREAD_AFFINITY)
+
priority Opt
+
Scheduling priority to assign the given thread to. (FMOD_THREAD_PRIORITY)
+
stacksize Opt
+
Amount of stack space available to the given thread. (FMOD_THREAD_STACK_SIZE)
+
+

You must call this function for the chosen thread before that thread is created for the settings to take effect.

+

Affinity can be specified using one (or more) of the FMOD_THREAD_AFFINITY constants or by providing the bits explicitly, i.e. (1<<3) for logical core three (core affinity is zero based).
+See platform documentation for details on the available cores for a given device.

+

Priority can be specified using one of the FMOD_THREAD_PRIORITY constants or by providing the value explicitly, i.e. (-2) for the lowest thread priority on Windows.
+See platform documentation for details on the available priority values for a given operating system.

+

Stack size can be specified explicitly, however for each thread you should provide a size equal to or larger than the expected default or risk causing a stack overflow at runtime.

+

FMOD_THREAD_STACK_SIZE

+

Stack space available to the given thread.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_THREAD_STACK_SIZE_DEFAULT              0
+#define FMOD_THREAD_STACK_SIZE_MIXER                (80  * 1024)
+#define FMOD_THREAD_STACK_SIZE_FEEDER               (16  * 1024)
+#define FMOD_THREAD_STACK_SIZE_STREAM               (96  * 1024)
+#define FMOD_THREAD_STACK_SIZE_FILE                 (64  * 1024)
+#define FMOD_THREAD_STACK_SIZE_NONBLOCKING          (112 * 1024)
+#define FMOD_THREAD_STACK_SIZE_RECORD               (16  * 1024)
+#define FMOD_THREAD_STACK_SIZE_GEOMETRY             (48  * 1024)
+#define FMOD_THREAD_STACK_SIZE_PROFILER             (128 * 1024)
+#define FMOD_THREAD_STACK_SIZE_STUDIO_UPDATE        (96  * 1024)
+#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_BANK     (96  * 1024)
+#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_SAMPLE   (96  * 1024)
+
+ +
enum THREAD_STACK_SIZE : uint
+{
+  DEFAULT             = 0,
+  MIXER               = 80  * 1024,
+  FEEDER              = 16  * 1024,
+  STREAM              = 96  * 1024,
+  FILE                = 64  * 1024,
+  NONBLOCKING         = 112 * 1024,
+  RECORD              = 16  * 1024,
+  GEOMETRY            = 48  * 1024,
+  PROFILER            = 128 * 1024,
+  STUDIO_UPDATE       = 96  * 1024,
+  STUDIO_LOAD_BANK    = 96  * 1024,
+  STUDIO_LOAD_SAMPLE  = 96  * 1024
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_THREAD_STACK_SIZE_DEFAULT
+
For a given thread use the default listed below, i.e. FMOD_THREAD_TYPE_MIXER uses FMOD_THREAD_STACK_SIZE_MIXER.
+
FMOD_THREAD_STACK_SIZE_MIXER
+
Default stack size for FMOD_THREAD_TYPE_MIXER.
+
FMOD_THREAD_STACK_SIZE_FEEDER
+
Default stack size for FMOD_THREAD_TYPE_FEEDER.
+
FMOD_THREAD_STACK_SIZE_STREAM
+
Default stack size for FMOD_THREAD_TYPE_STREAM.
+
FMOD_THREAD_STACK_SIZE_FILE
+
Default stack size for FMOD_THREAD_TYPE_FILE.
+
FMOD_THREAD_STACK_SIZE_NONBLOCKING
+
Default stack size for FMOD_THREAD_TYPE_NONBLOCKING.
+
FMOD_THREAD_STACK_SIZE_RECORD
+
Default stack size for FMOD_THREAD_TYPE_RECORD.
+
FMOD_THREAD_STACK_SIZE_GEOMETRY
+
Default stack size for FMOD_THREAD_TYPE_GEOMETRY.
+
FMOD_THREAD_STACK_SIZE_PROFILER
+
Default stack size for FMOD_THREAD_TYPE_PROFILER.
+
FMOD_THREAD_STACK_SIZE_STUDIO_UPDATE
+
Default stack size for FMOD_THREAD_TYPE_STUDIO_UPDATE.
+
FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_BANK
+
Default stack size for FMOD_THREAD_TYPE_STUDIO_LOAD_BANK.
+
FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_SAMPLE
+
Default stack size for FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE.
+
FMOD_THREAD_STACK_SIZE_CONVOLUTION1
+
Default stack size for FMOD_THREAD_TYPE_CONVOLUTION1.
+
FMOD_THREAD_STACK_SIZE_CONVOLUTION2
+
Default stack size for FMOD_THREAD_TYPE_CONVOLUTION2.
+
+

Stack size can be specified explicitly, however for each thread you should provide a size equal to or larger than the expected default or risk causing a stack overflow at runtime.

+

See Also: Thread_SetAttributes

+

FMOD_THREAD_TYPE

+

Named constants for threads created at runtime.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_THREAD_TYPE {
+  FMOD_THREAD_TYPE_MIXER,
+  FMOD_THREAD_TYPE_FEEDER,
+  FMOD_THREAD_TYPE_STREAM,
+  FMOD_THREAD_TYPE_FILE,
+  FMOD_THREAD_TYPE_NONBLOCKING,
+  FMOD_THREAD_TYPE_RECORD,
+  FMOD_THREAD_TYPE_GEOMETRY,
+  FMOD_THREAD_TYPE_PROFILER,
+  FMOD_THREAD_TYPE_STUDIO_UPDATE,
+  FMOD_THREAD_TYPE_STUDIO_LOAD_BANK,
+  FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE,
+  FMOD_THREAD_TYPE_CONVOLUTION1,
+  FMOD_THREAD_TYPE_CONVOLUTION2,
+  FMOD_THREAD_TYPE_MAX
+} FMOD_THREAD_TYPE;
+
+ +
enum THREAD_TYPE : int
+{
+  MIXER,
+  FEEDER,
+  STREAM,
+  FILE,
+  NONBLOCKING,
+  RECORD,
+  GEOMETRY,
+  PROFILER,
+  STUDIO_UPDATE,
+  STUDIO_LOAD_BANK,
+  STUDIO_LOAD_SAMPLE,
+  CONVOLUTION1,
+  CONVOLUTION2,
+  MAX
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_THREAD_TYPE_MIXER
+
Thread responsible for mixing and processing blocks of audio.
+
FMOD_THREAD_TYPE_FEEDER
+
Thread used by some output plug-ins for transferring buffered audio from FMOD_THREAD_TYPE_MIXER to the sound output device.
+
FMOD_THREAD_TYPE_STREAM
+
Thread that decodes compressed audio to PCM for Sounds created as FMOD_CREATESTREAM.
+
FMOD_THREAD_TYPE_FILE
+
Thread that reads compressed audio from disk to be consumed by FMOD_THREAD_TYPE_STREAM.
+
FMOD_THREAD_TYPE_NONBLOCKING
+
Thread that processes the creation of Sounds asynchronously when opened with FMOD_NONBLOCKING.
+
FMOD_THREAD_TYPE_RECORD
+
Thread used by some output plug-ins for transferring audio from a microphone to FMOD_THREAD_TYPE_MIXER.
+
FMOD_THREAD_TYPE_GEOMETRY
+
Thread used by the Geometry system for performing background calculations.
+
FMOD_THREAD_TYPE_PROFILER
+
Thread for network communication when using FMOD_INIT_PROFILE_ENABLE.
+
FMOD_THREAD_TYPE_STUDIO_UPDATE
+
Thread for processing Studio API commands and scheduling sound playback.
+
FMOD_THREAD_TYPE_STUDIO_LOAD_BANK
+
Thread for asynchronously loading Studio::Bank metadata.
+
FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE
+
Thread for asynchronously loading Studio::Bank sample data.
+
FMOD_THREAD_TYPE_CONVOLUTION1
+
Thread for processing medium size delay lines for FMOD_DSP_TYPE_CONVOLUTIONREVERB.
+
FMOD_THREAD_TYPE_CONVOLUTION2
+
Thread for processing larger size delay lines for FMOD_DSP_TYPE_CONVOLUTIONREVERB.
+
FMOD_THREAD_TYPE_MAX
+
Maximum number of thread types supported.
+
+

See Also: Thread_SetAttributes

+

FMOD_TIMEUNIT

+

Time types used for position or length.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_TIMEUNIT_MS            0x00000001
+#define FMOD_TIMEUNIT_PCM           0x00000002
+#define FMOD_TIMEUNIT_PCMBYTES      0x00000004
+#define FMOD_TIMEUNIT_RAWBYTES      0x00000008
+#define FMOD_TIMEUNIT_PCMFRACTION   0x00000010
+#define FMOD_TIMEUNIT_MODORDER      0x00000100
+#define FMOD_TIMEUNIT_MODROW        0x00000200
+#define FMOD_TIMEUNIT_MODPATTERN    0x00000400
+
+ +
[Flags]
+enum TIMEUNIT : uint
+{
+  MS          = 0x00000001,
+  PCM         = 0x00000002,
+  PCMBYTES    = 0x00000004,
+  RAWBYTES    = 0x00000008,
+  PCMFRACTION = 0x00000010,
+  MODORDER    = 0x00000100,
+  MODROW      = 0x00000200,
+  MODPATTERN  = 0x00000400,
+}
+
+ +
TIMEUNIT_MS            = 0x00000001
+TIMEUNIT_PCM           = 0x00000002
+TIMEUNIT_PCMBYTES      = 0x00000004
+TIMEUNIT_RAWBYTES      = 0x00000008
+TIMEUNIT_PCMFRACTION   = 0x00000010
+TIMEUNIT_MODORDER      = 0x00000100
+TIMEUNIT_MODROW        = 0x00000200
+TIMEUNIT_MODPATTERN    = 0x00000400
+
+ +
+
FMOD_TIMEUNIT_MS
+
Milliseconds.
+
FMOD_TIMEUNIT_PCM
+
PCM samples, related to milliseconds * samplerate / 1000.
+
FMOD_TIMEUNIT_PCMBYTES
+
Bytes, related to PCM samples * channels * datawidth (ie 16bit = 2 bytes).
+
FMOD_TIMEUNIT_RAWBYTES
+
Raw file bytes of (compressed) sound data (does not include headers). Only used by Sound::getLength and Channel::getPosition.
+
FMOD_TIMEUNIT_PCMFRACTION
+
Fractions of 1 PCM sample. Unsigned int range 0 to 0xFFFFFFFF. Used for sub-sample granularity for DSP purposes.
+
FMOD_TIMEUNIT_MODORDER
+
MOD/S3M/XM/IT. Order in a sequenced module format. Use Sound::getFormat to determine the PCM format being decoded to.
+
FMOD_TIMEUNIT_MODROW
+
MOD/S3M/XM/IT. Current row in a sequenced module format. Cannot use with Channel::setPosition. Sound::getLength will return the number of rows in the currently playing or seeked to pattern.
+
FMOD_TIMEUNIT_MODPATTERN
+
MOD/S3M/XM/IT. Current pattern in a sequenced module format. Cannot use with Channel::setPosition. Sound::getLength will return the number of patterns in the song and Channel::getPosition will return the currently playing pattern.
+
+

See Also: Sound::getLength, Channel::setPosition, Channel::getPosition

+

FMOD_VECTOR

+

Structure describing a point in 3D space.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_VECTOR {
+  float   x;
+  float   y;
+  float   z;
+} FMOD_VECTOR;
+
+ +
struct VECTOR
+{
+  float x;
+  float y;
+  float z;
+}
+
+ +
FMOD_VECTOR
+{
+  x,
+  y,
+  z,
+};
+
+ +
+
x
+
X coordinate in 3D space.
+
y
+
Y coordinate in 3D space.
+
z
+
Z coordinate in 3D space.
+
+

FMOD uses a left handed coordinate system by default.

+

To use a right handed coordinate system specify FMOD_INIT_3D_RIGHTHANDED from FMOD_INITFLAGS in System::init.

+

See Also: System::set3DListenerAttributes, ChannelControl::set3DAttributes

+

FMOD_VERSION

+

Current FMOD version number.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_VERSION ...
+
+ +
class VERSION
+{
+  const int number = ...;
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_VERSION
+
Current FMOD version number.
+
+

The version is a 32 bit hexadecimal value formatted as 16:8:8, with the upper 16 bits being the product version, the middle 8 bits being the major version and the bottom 8 bits being the minor version. For example a value of 0x00010203 is equal to 1.02.03.

+

See Also: Studio::System::create, System::getVersion

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-dsp.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-dsp.html new file mode 100644 index 0000000..1495a6b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-dsp.html @@ -0,0 +1,2231 @@ + + +Core API Reference | DSP + + + + +
+ +
+

7. Core API Reference | DSP

+

A digital signal processor is one node within a graph that transforms input audio signals into an output stream.

+

Create with System::createDSP, System::createDSPByType or System::createDSPByPlugin.

+

Connections:

+ +

Parameters:

+ +

Channel format:

+ +

Metering:

+ +

Processing:

+ +

General:

+ +
+ +

DSP::addInput

+

Adds a DSP unit as an input to this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::addInput(
+  DSP *input,
+  DSPConnection **connection = nullptr,
+  FMOD_DSPCONNECTION_TYPE type = FMOD_DSPCONNECTION_TYPE_STANDARD
+);
+
+ +
FMOD_RESULT FMOD_DSP_AddInput(
+  FMOD_DSP *dsp,
+  FMOD_DSP *input,
+  FMOD_DSPCONNECTION **connection,
+  FMOD_DSPCONNECTION_TYPE type
+);
+
+ +
RESULT DSP.addInput(
+  DSP input
+);
+RESULT DSP.addInput(
+  DSP input,
+  out DSPConnection connection,
+  DSPCONNECTION_TYPE type = DSPCONNECTION_TYPE.STANDARD
+);
+
+ +
DSP.addInput(
+  input,
+  connection,
+  type
+);
+
+ +
+
input
+
DSP unit to be added. (DSP)
+
connection OutOpt
+
Connection between the two units. (DSPConnection)
+
type
+
+

Type of connection between the two units. (FMOD_DSPCONNECTION_TYPE)

+ +
+
+

When a DSP has multiple inputs the signals are automatically mixed together, sent to the unit's output(s).

+

The returned connection will remain valid until the units are disconnected.

+

See Also: DSP::getInput, DSP::getNumInputs, DSP::getOutput, DSP::getNumOutputs

+

FMOD_DSP_CALLBACK

+

Callback for DSP notifications.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_CALLBACK(
+  FMOD_DSP *dsp,
+  FMOD_DSP_CALLBACK_TYPE type,
+  void *data
+);
+
+ +
delegate RESULT DSP_CALLBACK(
+  IntPtr dsp,
+  DSP_CALLBACK_TYPE type,
+  IntPtr data
+);
+
+ +
function FMOD_DSP_CALLBACK(
+  dsp,
+  type,
+  data
+)
+
+ +
+
dsp
+
DSP handle. (DSP)
+
type
+
Type of callback. (FMOD_DSP_CALLBACK_TYPE)
+
data Opt
+
Callback data; see FMOD_DSP_CALLBACK_TYPE for details.
+
+
+

The 'dsp' argument can be cast to FMOD::DSP *.

+
+
+

You can convert the 'dsp' argument to an FMOD.DSP object by using FMOD.DSP dspobject = new FMOD.DSP(dsp);

+
+

See Also: Callback Behavior, DSP::setCallback

+

FMOD_DSP_CALLBACK_TYPE

+

Types of callback called by a DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_CALLBACK_TYPE {
+  FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE,
+  FMOD_DSP_CALLBACK_MAX
+} FMOD_DSP_CALLBACK_TYPE;
+
+ +
enum DSP_CALLBACK_TYPE : int
+{
+  DATAPARAMETERRELEASE,
+  MAX,
+}
+
+ +
DSP_CALLBACK_DATAPARAMETERRELEASE
+DSP_CALLBACK_MAX
+
+ +
+
FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE
+
Called when a DSP's data parameter can be released.
+data: FMOD_DSP_DATA_PARAMETER_INFO.
+
+

Callbacks are called from the game thread when set from the Core API or Studio API in synchronous mode, and from the Studio Update Thread when in default / async mode.

+

See Also: Callback Behavior, DSP::setCallback

+

FMOD_DSP_DATA_PARAMETER_INFO

+

Describes the value of a DSP's data parameter.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_DATA_PARAMETER_INFO {
+  void          *data;
+  unsigned int  length;
+  int           index;
+} FMOD_DSP_DATA_PARAMETER_INFO;
+
+ +
struct DSP_DATA_PARAMETER_INFO
+{
+    IntPtr          data;
+    uint            length;
+    int             index;
+}
+
+ +
FMOD_DSP_DATA_PARAMETER_INFO
+{
+  data,
+  length,
+  index,
+};
+
+ +
+
data
+
Pointer to the data buffer.
+
length
+
Length of the data buffer in bytes. (unsigned int)
+
index
+
Index of the DSP parameter. (int)
+
+

This data is passed to the DSP callback function when type is FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE. The callback should free the data pointer if it is no longer required.

+

See Also: FMOD_DSP_CALLBACK

+

DSP::disconnectAll

+

Disconnects all inputs and/or outputs.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::disconnectAll(
+  bool inputs,
+  bool outputs
+);
+
+ +
FMOD_RESULT FMOD_DSP_DisconnectAll(
+  FMOD_DSP *dsp,
+  FMOD_BOOL inputs,
+  FMOD_BOOL outputs
+);
+
+ +
RESULT DSP.disconnectAll(
+  bool inputs,
+  bool outputs
+);
+
+ +
DSP.disconnectAll(
+  inputs,
+  outputs
+);
+
+ +
+
inputs
+
+

Whether all inputs should be disconnected.

+
    +
  • Units: Boolean
  • +
+
+
outputs
+
+

Whether all outputs should be disconnected.

+
    +
  • Units: Boolean
  • +
+
+
+

This is a convenience function that is faster than disconnecting all inputs and outputs individually.

+

See Also: DSP::disconnectFrom

+

DSP::disconnectFrom

+

Disconnect the specified input DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::disconnectFrom(
+  DSP *target,
+  DSPConnection *connection = nullptr
+);
+
+ +
FMOD_RESULT FMOD_DSP_DisconnectFrom(
+  FMOD_DSP *dsp,
+  FMOD_DSP *target,
+  FMOD_DSPCONNECTION *connection
+);
+
+ +
RESULT DSP.disconnectFrom(
+  DSP target,
+  DSPConnection connection = null
+);
+
+ +
DSP.disconnectFrom(
+  target,
+  connection
+);
+
+ +
+
target Opt
+
Input DSP unit to disconnect. If an input DSP unit is not specified, all inputs and outputs are disconnected from this unit. (DSP)
+
connection Opt
+
When there is more than one connection between two units this can be used to define which of the connections should be disconnected. (DSPConnection)
+
+

If target had only one output, after this operation that entire sub graph will no longer be connected to the DSP graph.

+

After this operation connection is no longer valid.

+

See Also: DSP::addInput, DSP::disconnectAll

+

DSP::getActive

+

Retrieves the processing active state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getActive(
+  bool *active
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetActive(
+  FMOD_DSP *dsp,
+  FMOD_BOOL *active
+);
+
+ +
RESULT DSP.getActive(
+  out bool active
+);
+
+ +
DSP.getActive(
+  active
+);
+
+ +
+
active Out
+
+

Active state.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
+

If active is False, processing of this unit and its inputs are stopped.

+

A DSP is inactive when first created. It is automatically activated when ChannelControl::addDSP is used; otherwise, it must be set to active manually.

+

See Also: DSP::setActive, DSP::setBypass

+

DSP::getBypass

+

Retrieves the processing bypass state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getBypass(
+  bool *bypass
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetBypass(
+  FMOD_DSP *dsp,
+  FMOD_BOOL *bypass
+);
+
+ +
RESULT DSP.getBypass(
+  out bool bypass
+);
+
+ +
DSP.getBypass(
+  bypass
+);
+
+ +
+
bypass Out
+
+

Bypass state.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
+

If bypass is true, processing of this unit is skipped but it continues to process its inputs.

+

See Also: DSP::setBypass, DSP::setActive

+

DSP::getChannelFormat

+

Retrieves the PCM input format this DSP will receive when processing.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getChannelFormat(
+  FMOD_CHANNELMASK *channelmask,
+  int *numchannels,
+  FMOD_SPEAKERMODE *source_speakermode
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetChannelFormat(
+  FMOD_DSP *dsp,
+  FMOD_CHANNELMASK *channelmask,
+  int *numchannels,
+  FMOD_SPEAKERMODE *source_speakermode
+);
+
+ +
RESULT DSP.getChannelFormat(
+  out CHANNELMASK channelmask,
+  out int numchannels,
+  out SPEAKERMODE source_speakermode
+);
+
+ +
DSP.getChannelFormat(
+  channelmask,
+  numchannels,
+  source_speakermode
+);
+
+ +
+
channelmask OutOpt
+
Deprecated. (FMOD_CHANNELMASK)
+
numchannels OutOpt
+
Number of channels to be processed.
+
source_speakermode OutOpt
+
Speaker mode to describe the channel mapping. (FMOD_SPEAKERMODE)
+
+

See Also: DSP::setChannelFormat

+

DSP::getCPUUsage

+

Retrieves statistics on the mixer thread CPU usage for this unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getCPUUsage(
+  unsigned int *exclusive,
+  unsigned int *inclusive
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetCPUUsage(
+  FMOD_DSP *dsp,
+  unsigned int *exclusive,
+  unsigned int *inclusive
+);
+
+ +
RESULT DSP.getCPUUsage(
+  out uint exclusive,
+  out uint inclusive
+);
+
+ +
DSP.getCPUUsage(
+  exclusive,
+  inclusive
+);
+
+ +
+
exclusive OutOpt
+
+

CPU time spent processing just this unit during the last mixer update.

+
    +
  • Units: Microseconds
  • +
+
+
inclusive OutOpt
+
+

CPU time spent processing this unit and all of its input during the last mixer update.

+
    +
  • Units: Microseconds
  • +
+
+
+

FMOD_INIT_PROFILE_ENABLE with System::init is required to call this function.

+

DSP::getDataParameterIndex

+

Retrieve the index of the first data parameter of a particular data type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getDataParameterIndex(
+  int datatype,
+  int *index
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetDataParameterIndex(
+  FMOD_DSP *dsp,
+  int datatype,
+  int *index
+);
+
+ +
RESULT DSP.getDataParameterIndex(
+  int datatype,
+  out int index
+);
+
+ +
DSP.getDataParameterIndex(
+  datatype,
+  index
+);
+
+ +
+
datatype
+
The type of data to find. Typically of type FMOD_DSP_PARAMETER_DATA_TYPE.
+
index OutOpt
+
Contains the index of the first data parameter of type datatype after the function is called. Will be -1 if no matches were found.
+
+

This function returns FMOD_OK if a parameter of matching type is found and FMOD_ERR_INVALID_PARAM if no matches were found.

+

The return code can be used to check whether the DSP supports specific functionality through data parameters of certain types without the need to provide index.

+

DSP::getIdle

+

Retrieves the idle state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getIdle(
+  bool *idle
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetIdle(
+  FMOD_DSP *dsp,
+  FMOD_BOOL *idle
+);
+
+ +
RESULT DSP.getIdle(
+  out bool idle
+);
+
+ +
DSP.getIdle(
+  idle
+);
+
+ +
+
idle Out
+
+

Idle state.

+
    +
  • Units: Boolean
  • +
+
+
+

A DSP is considered idle when it stops receiving input signals and all internal processing of stored input has been exhausted.

+

Different DSP types can have different idle behavior. A reverb or echo DSP may take longer to go idle after it stops receiving a valid signal than a DSP with a shorter tail length, such as an EQ filter.

+

DSP::getInfo

+

Retrieves information about this DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getInfo(
+  char *name,
+  unsigned int *version,
+  int *channels,
+  int *configwidth,
+  int *configheight
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetInfo(
+  FMOD_DSP *dsp,
+  char *name,
+  unsigned int *version,
+  int *channels,
+  int *configwidth,
+  int *configheight
+);
+
+ +
RESULT DSP.getInfo(
+  out string name,
+  out uint version,
+  out int channels,
+  out int configwidth,
+  out int configheight
+);
+
+ +
DSP.getInfo(
+  name,
+  version,
+  channels,
+  configwidth,
+  configheight
+);
+
+ +
+
name OutOpt
+
The name of this unit will be written (null terminated) to the provided 32 byte buffer. (UTF-8 string)
+
version OutOpt
+
Version number of this unit, usually formatted as hex AAAABBBB where the AAAA is the major version number and the BBBB is the minor version number.
+
channels OutOpt
+
Number of channels this unit processes where 0 represents "any".
+
configwidth OutOpt
+
Configuration dialog box width where 0 represents "no dialog box".
+
configheight OutOpt
+
Configuration dialog box height where 0 represents "no dialog box".
+
+

See Also: DSP::showConfigDialog

+

DSP::getInput

+

Retrieves the DSP unit at the specified index in the input list.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getInput(
+  int index,
+  DSP **input,
+  DSPConnection **inputconnection
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetInput(
+  FMOD_DSP *dsp,
+  int index,
+  FMOD_DSP **input,
+  FMOD_DSPCONNECTION **inputconnection
+);
+
+ +
RESULT DSP.getInput(
+  int index,
+  out DSP input,
+  out DSPConnection inputconnection
+);
+
+ +
DSP.getInput(
+  index,
+  input,
+  inputconnection
+);
+
+ +
+
index
+
+

Offset into this DSP's input list.

+ +
+
input OutOpt
+
DSP unit at the specified index. (DSP)
+
inputconnection OutOpt
+
Connection between this unit and input. (DSPConnection)
+
+

This will flush the DSP queue (which blocks against the mixer) to ensure the input list is correct, avoid this during time sensitive operations.

+

The returned connection will remain valid until the units are disconnected.

+

See Also: DSP::addInput, DSP::getOutput

+

DSP::getMeteringEnabled

+

Retrieves the input and output signal metering enabled states.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getMeteringEnabled(
+  bool *inputEnabled,
+  bool *outputEnabled
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetMeteringEnabled(
+  FMOD_DSP *dsp,
+  FMOD_BOOL *inputEnabled,
+  FMOD_BOOL *outputEnabled
+);
+
+ +
RESULT DSP.getMeteringEnabled(
+  out bool inputEnabled,
+  out bool outputEnabled
+);
+
+ +
DSP.getMeteringEnabled(
+  inputEnabled,
+  outputEnabled
+);
+
+ +
+
inputEnabled OutOpt
+
+

Metering enabled state for the input signal.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
outputEnabled OutOpt
+
+

Metering enabled state for the output signal.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
+

Input metering is pre processing, while output metering is post processing.

+

Enabled metering allows DSP::getMeteringInfo to return metering information and allows FMOD profiling tools to visualize the levels.

+

FMOD_INIT_PROFILE_METER_ALL with System::init will automatically turn on metering for all DSP units inside the dsp graph.

+

See Also: DSP::setMeteringEnabled

+

DSP::getMeteringInfo

+

Retrieve the signal metering enabled metering information.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getMeteringInfo(
+  FMOD_DSP_METERING_INFO *inputInfo,
+  FMOD_DSP_METERING_INFO *outputInfo
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetMeteringInfo(
+  FMOD_DSP *dsp,
+  FMOD_DSP_METERING_INFO *inputInfo,
+  FMOD_DSP_METERING_INFO *outputInfo
+);
+
+ +
RESULT DSP.getMeteringInfo(
+  IntPtr zero,
+  DSP_METERING_INFO outputInfo
+);
+RESULT DSP.getMeteringInfo(
+  DSP_METERING_INFO inputInfo,
+  IntPtr zero
+);
+RESULT DSP.getMeteringInfo(
+  DSP_METERING_INFO inputInfo,
+  DSP_METERING_INFO outputInfo
+);
+
+ +
DSP.getMeteringInfo(
+  inputInfo,
+  outputInfo
+);
+
+ +
+
inputInfo OutOpt
+
Input metering information before the DSP has processed. (FMOD_DSP_METERING_INFO)
+
outputInfo OutOpt
+
Output metering information after the DSP has processed. (FMOD_DSP_METERING_INFO)
+
+

Requesting metering information when it hasn't been enabled will result in FMOD_ERR_BADCOMMAND.

+

FMOD_INIT_PROFILE_METER_ALL with System::init will automatically enable metering for all DSP units.

+

See Also: DSP::setMeteringEnabled, DSP::getMeteringEnabled

+

DSP::getNumInputs

+

Retrieves the number of DSP units in the input list.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getNumInputs(
+  int *numinputs
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetNumInputs(
+  FMOD_DSP *dsp,
+  int *numinputs
+);
+
+ +
RESULT DSP.getNumInputs(
+  out int numinputs
+);
+
+ +
DSP.getNumInputs(
+  numinputs
+);
+
+ +
+
numinputs Out
+
Number of input DSPs.
+
+

This flushes the DSP queue (which blocks against the mixer) to ensure the input list is correct. You should avoid doing this during time-sensitive operations.

+

See Also: DSP::getNumOutputs, DSP::getInput

+

DSP::getNumOutputs

+

Retrieves the number of DSP units in the output list.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getNumOutputs(
+  int *numoutputs
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetNumOutputs(
+  FMOD_DSP *dsp,
+  int *numoutputs
+);
+
+ +
RESULT DSP.getNumOutputs(
+  out int numoutputs
+);
+
+ +
DSP.getNumOutputs(
+  numoutputs
+);
+
+ +
+
numoutputs Out
+
Number of output DSPs.
+
+

This flushes the DSP queue (which blocks against the mixer) to ensure the output list is correct. You should avoid doing this during time-sensitive operations.

+

See Also: DSP::getNumInputs, DSP::getOutput

+

DSP::getNumParameters

+

Retrieves the number of parameters exposed by this unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getNumParameters(
+  int *numparams
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetNumParameters(
+  FMOD_DSP *dsp,
+  int *numparams
+);
+
+ +
RESULT DSP.getNumParameters(
+  out int numparams
+);
+
+ +
DSP.getNumParameters(
+  numparams
+);
+
+ +
+
numparams Out
+
Number of parameters.
+
+

Use this to enumerate all parameters of a DSP unit with DSP::getParameterInfo.

+

See Also: DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterBool, DSP::setParameterData

+

DSP::getOutput

+

Retrieves the DSP unit at the specified index in the output list.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getOutput(
+  int index,
+  DSP **output,
+  DSPConnection **outputconnection
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetOutput(
+  FMOD_DSP *dsp,
+  int index,
+  FMOD_DSP **output,
+  FMOD_DSPCONNECTION **outputconnection
+);
+
+ +
RESULT DSP.getOutput(
+  int index,
+  out DSP output,
+  out DSPConnection outputconnection
+);
+
+ +
DSP.getOutput(
+  index,
+  output,
+  outputconnection
+);
+
+ +
+
index
+
+

Offset into this DSP's output list.

+ +
+
output OutOpt
+
DSP unit at the specified index. (DSP)
+
outputconnection OutOpt
+
Connection between this unit and output. (DSPConnection)
+
+

This flushes the DSP queue (which blocks against the mixer) to ensure the output list is correct. You should avoid doing this during time-sensitive operations.

+

The returned connection will remain valid until the units are disconnected.

+

See Also: DSP::addInput, DSP::getInput

+

DSP::getOutputChannelFormat

+

Retrieves the output format this DSP produces when processing based on the input specified.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getOutputChannelFormat(
+  FMOD_CHANNELMASK inmask,
+  int inchannels,
+  FMOD_SPEAKERMODE inspeakermode,
+  FMOD_CHANNELMASK *outmask,
+  int *outchannels,
+  FMOD_SPEAKERMODE *outspeakermode
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetOutputChannelFormat(
+  FMOD_DSP *dsp,
+  FMOD_CHANNELMASK inmask,
+  int inchannels,
+  FMOD_SPEAKERMODE inspeakermode,
+  FMOD_CHANNELMASK *outmask,
+  int *outchannels,
+  FMOD_SPEAKERMODE *outspeakermode
+);
+
+ +
RESULT DSP.getOutputChannelFormat(
+  CHANNELMASK inmask,
+  int inchannels,
+  SPEAKERMODE inspeakermode,
+  out CHANNELMASK outmask,
+  out int outchannels,
+  out SPEAKERMODE outspeakermode
+);
+
+ +
DSP.getOutputChannelFormat(
+  inmask,
+  inchannels,
+  inspeakermode,
+  outmask,
+  outchannels,
+  outspeakermode
+);
+
+ +
+
inmask
+
Deprecated. (FMOD_CHANNELMASK)
+
inchannels
+
Number of channels for the input signal.
+
inspeakermode
+
Speaker mode for the input signal. (FMOD_SPEAKERMODE)
+
outmask OutOpt
+
Deprecated. (FMOD_CHANNELMASK)
+
outchannels OutOpt
+
Number of channels for the output signal.
+
outspeakermode OutOpt
+
Speaker mode for the output signal. (FMOD_SPEAKERMODE)
+
+

See Also: DSP::setChannelFormat, DSP::getChannelFormat

+

DSP::getParameterBool

+

Retrieves a boolean parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getParameterBool(
+  int index,
+  bool *value,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetParameterBool(
+  FMOD_DSP *dsp,
+  int index,
+  FMOD_BOOL *value,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
RESULT DSP.getParameterBool(
+  int index,
+  out bool value
+);
+
+ +
DSP.getParameterBool(
+  index,
+  value,
+  valuestr
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
value OutOpt
+
+

Parameter boolean data.

+
    +
  • Units: Boolean
  • +
+
+
valuestr OutOpt
+
String representation value. (UTF-8 string)
+
valuestrlen
+
+

Length of valuestr.

+ +
+
+

See Also: DSP::setParameterBool, DSP::getParameterInfo

+

DSP::getParameterData

+

Retrieves a binary data parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getParameterData(
+  int index,
+  void **data,
+  unsigned int *length,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetParameterData(
+  FMOD_DSP *dsp,
+  int index,
+  void **data,
+  unsigned int *length,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
RESULT DSP.getParameterData(
+  int index,
+  out IntPtr data,
+  out uint length
+);
+
+ +
DSP.getParameterData(
+  index,
+  data,
+  length,
+  valuestr
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
data OutOpt
+
Parameter binary data.
+
length OutOpt
+
+

Length of data.

+
    +
  • Units: Bytes
  • +
+
+
valuestr OutOpt
+
String representation data. (UTF-8 string)
+
valuestrlen
+
+

Length of valuestr.

+ +
+
+

See Also: DSP::setParameterData, DSP::getParameterInfo

+

DSP::getParameterFloat

+

Retrieves a floating point parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getParameterFloat(
+  int index,
+  float *value,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetParameterFloat(
+  FMOD_DSP *dsp,
+  int index,
+  float *value,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
RESULT DSP.getParameterFloat(
+  int index,
+  out float value
+);
+
+ +
DSP.getParameterFloat(
+  index,
+  value,
+  valuestr
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
value OutOpt
+
Parameter floating point data.
+
valuestr OutOpt
+
String representation value. (UTF-8 string)
+
valuestrlen
+
+

Length of valuestr.

+ +
+
+

See Also: DSP::setParameterFloat, DSP::getParameterInfo

+

DSP::getParameterInfo

+

Retrieve information about a specified parameter.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getParameterInfo(
+  int index,
+  FMOD_DSP_PARAMETER_DESC **desc
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetParameterInfo(
+  FMOD_DSP *dsp,
+  int index,
+  FMOD_DSP_PARAMETER_DESC **desc
+);
+
+ +
RESULT DSP.getParameterInfo(
+  int index,
+  out DSP_PARAMETER_DESC desc
+);
+
+ +
DSP.getParameterInfo(
+  index,
+  desc
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
desc Out
+
Parameter description at the specified index. (FMOD_DSP_PARAMETER_DESC)
+
+

See Also: DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterBool, DSP::setParameterData

+

DSP::getParameterInt

+

Retrieves an integer parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getParameterInt(
+  int index,
+  int *value,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetParameterInt(
+  FMOD_DSP *dsp,
+  int index,
+  int *value,
+  char *valuestr,
+  int valuestrlen
+);
+
+ +
RESULT DSP.getParameterInt(
+  int index,
+  out int value
+);
+
+ +
DSP.getParameterInt(
+  index,
+  value,
+  valuestr
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
value OutOpt
+
Parameter integer data.
+
valuestr OutOpt
+
String representation value. (UTF-8 string)
+
valuestrlen
+
+

Length of valuestr.

+ +
+
+

See Also: DSP::setParameterInt, DSP::getParameterInfo

+

DSP::getSystemObject

+

Retrieves the parent System object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getSystemObject(
+  System **system
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetSystemObject(
+  FMOD_DSP *dsp,
+  FMOD_SYSTEM **system
+);
+
+ +
RESULT DSP.getSystemObject(
+  out System system
+);
+
+ +
DSP.getSystemObject(
+  system
+);
+
+ +
+
system Out
+
System object. (System)
+
+

See Also: System::createDSP, System::createDSPByType

+

DSP::getType

+

Retrieves the pre-defined type of a FMOD registered DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getType(
+  FMOD_DSP_TYPE *type
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetType(
+  FMOD_DSP *dsp,
+  FMOD_DSP_TYPE *type
+);
+
+ +
RESULT DSP.getType(
+  out DSP_TYPE type
+);
+
+ +
DSP.getType(
+  type
+);
+
+ +
+
type Out
+
DSP type. (FMOD_DSP_TYPE)
+
+

This is only valid for the DSP types built in to the FMOD Engine. For user-created plug-in DSPs, it instead returns FMOD_DSP_TYPE_UNKNOWN.

+

DSP::getUserData

+

Retrieves a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetUserData(
+  FMOD_DSP *dsp,
+  void **userdata
+);
+
+ +
RESULT DSP.getUserData(
+  out IntPtr userdata
+);
+
+ +
DSP.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling DSP::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

DSP::getWetDryMix

+

Retrieves the scale of the wet and dry signal components.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::getWetDryMix(
+  float *prewet,
+  float *postwet,
+  float *dry
+);
+
+ +
FMOD_RESULT FMOD_DSP_GetWetDryMix(
+  FMOD_DSP *dsp,
+  float *prewet,
+  float *postwet,
+  float *dry
+);
+
+ +
RESULT DSP.getWetDryMix(
+  out float prewet,
+  out float postwet,
+  out float dry
+);
+
+ +
DSP.getWetDryMix(
+  prewet,
+  postwet,
+  dry
+);
+
+ +
+
prewet OutOpt
+
+

Level of the 'Dry' (pre-processed signal) mix that is processed by the DSP. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
postwet OutOpt
+
+

Level of the 'Wet' (post-processed signal) mix that is output. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
dry OutOpt
+
+

Level of the 'Dry' (pre-processed signal) mix that is output. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
+

See Also: DSP::setWetDryMix

+

DSP::release

+

Releases a DSP unit, freeing the memory used by that object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::release();
+
+ +
FMOD_RESULT FMOD_DSP_Release(FMOD_DSP *dsp);
+
+ +
RESULT DSP.release();
+
+ +
DSP.release();
+
+ +

If DSP is not removed from the graph with ChannelControl::removeDSP after being added with ChannelControl::addDSP, it will not release and will instead return FMOD_ERR_DSP_INUSE.

+

See Also: System::createDSP

+

DSP::reset

+

Reset a DSP's internal state, making it ready for a new input signal.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::reset();
+
+ +
FMOD_RESULT FMOD_DSP_Reset(FMOD_DSP *dsp);
+
+ +
RESULT DSP.reset();
+
+ +
DSP.reset();
+
+ +

This will clear all internal state derived from input signal while retaining any set parameter values. The intended use of the function is to avoid audible artifacts if moving the DSP from one part of the DSP graph to another.

+

DSP::setActive

+

Sets the processing active state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setActive(
+  bool active
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetActive(
+  FMOD_DSP *dsp,
+  FMOD_BOOL active
+);
+
+ +
RESULT DSP.setActive(
+  bool active
+);
+
+ +
DSP.setActive(
+  active
+);
+
+ +
+
active
+
+

Active state.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
+

If active is false, processing of this unit and its inputs are stopped.

+

When created, a DSP is inactive. It is automatically activated when ChannelControl::addDSP is used; otherwise, it must be set to active manually.

+

See Also: DSP::getActive, DSP::setBypass, DSP::getBypass

+

DSP::setBypass

+

Sets the processing bypass state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setBypass(
+  bool bypass
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetBypass(
+  FMOD_DSP *dsp,
+  FMOD_BOOL bypass
+);
+
+ +
RESULT DSP.setBypass(
+  bool bypass
+);
+
+ +
DSP.setBypass(
+  bypass
+);
+
+ +
+
bypass
+
+

Bypass state.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
+

If bypass is true, processing of this unit is skipped but it continues to process its inputs.

+

See Also: DSP::getBypass, DSP::setActive, DSP::getActive

+

DSP::setCallback

+

Sets the callback for DSP notifications.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setCallback(
+  FMOD_DSP_CALLBACK callback
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetCallback(
+  FMOD_DSP *dsp,
+  FMOD_DSP_CALLBACK callback
+);
+
+ +
RESULT DSP.setCallback(
+  DSP_CALLBACK callback
+);
+
+ +
DSP.setCallback(
+  callback
+);
+
+ +
+
callback
+
Callback to invoke. (FMOD_DSP_CALLBACK)
+
+

See Also: Callback Behavior, FMOD_DSP_CALLBACK_TYPE

+

DSP::setChannelFormat

+

Sets the PCM input format this DSP is to receive when processing.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setChannelFormat(
+  FMOD_CHANNELMASK channelmask,
+  int numchannels,
+  FMOD_SPEAKERMODE source_speakermode
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetChannelFormat(
+  FMOD_DSP *dsp,
+  FMOD_CHANNELMASK channelmask,
+  int numchannels,
+  FMOD_SPEAKERMODE source_speakermode
+);
+
+ +
RESULT DSP.setChannelFormat(
+  CHANNELMASK channelmask,
+  int numchannels,
+  SPEAKERMODE source_speakermode
+);
+
+ +
DSP.setChannelFormat(
+  channelmask,
+  numchannels,
+  source_speakermode
+);
+
+ +
+
channelmask
+
Deprecated. (FMOD_CHANNELMASK)
+
numchannels
+
+

Number of channels to be processed.

+ +
+
source_speakermode
+
Speaker mode to describe the channel mapping. (FMOD_SPEAKERMODE)
+
+

Setting the number of channels on a unit forces either a down or up mix to that channel count before processing the DSP read/process callback.

+

See Also: DSP::getChannelFormat

+

DSP::setMeteringEnabled

+

Sets the input and output signal metering enabled states.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setMeteringEnabled(
+  bool inputEnabled,
+  bool outputEnabled
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetMeteringEnabled(
+  FMOD_DSP *dsp,
+  FMOD_BOOL inputEnabled,
+  FMOD_BOOL outputEnabled
+);
+
+ +
RESULT DSP.setMeteringEnabled(
+  bool inputEnabled,
+  bool outputEnabled
+);
+
+ +
DSP.setMeteringEnabled(
+  inputEnabled,
+  outputEnabled
+);
+
+ +
+
inputEnabled
+
+

Metering enabled state for the input signal.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
outputEnabled
+
+

Metering enabled state for the output signal.

+
    +
  • Units: Boolean
  • +
  • Default: False
  • +
+
+
+

Input metering is pre processing, while output metering is post processing.

+

Enabled metering allows DSP::getMeteringInfo to return metering information and allows FMOD profiling tools to visualize the levels.

+

FMOD_INIT_PROFILE_METER_ALL with System::init will automatically turn on metering for all DSP units inside the DSP graph.

+

This function must have inputEnabled and outputEnabled set to true if being used by the Studio API, such as in the Unity or Unreal Engine integrations, in order to avoid conflict with FMOD Studio's live update feature.

+

See Also: DSP::getMeteringEnabled

+

DSP::setParameterBool

+

Sets a boolean parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setParameterBool(
+  int index,
+  bool value
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetParameterBool(
+  FMOD_DSP *dsp,
+  int index,
+  FMOD_BOOL value
+);
+
+ +
RESULT DSP.setParameterBool(
+  int index,
+  bool value
+);
+
+ +
DSP.setParameterBool(
+  index,
+  value
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
value
+
+

Parameter value.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: DSP::getParameterInfo, DSP::getParameterBool

+

DSP::setParameterData

+

Sets a binary data parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setParameterData(
+  int index,
+  void *data,
+  unsigned int length
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetParameterData(
+  FMOD_DSP *dsp,
+  int index,
+  void *data,
+  unsigned int length
+);
+
+ +
RESULT DSP.setParameterData(
+  int index,
+  byte[] data
+);
+
+ +
DSP.setParameterData(
+  index,
+  data,
+  length
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
data
+
Parameter binary data.
+
length
+
+

Length of data.

+
    +
  • Units: Bytes
  • +
+
+
+

Certain data types are predefined by the system and can be specified via the FMOD_DSP_PARAMETER_DESC_DATA, see FMOD_DSP_PARAMETER_DATA_TYPE

+

See Also: DSP::getParameterInfo, DSP::getParameterData

+

DSP::setParameterFloat

+

Sets a floating point parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setParameterFloat(
+  int index,
+  float value
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetParameterFloat(
+  FMOD_DSP *dsp,
+  int index,
+  float value
+);
+
+ +
RESULT DSP.setParameterFloat(
+  int index,
+  float value
+);
+
+ +
DSP.setParameterFloat(
+  index,
+  value
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
value
+
Parameter floating point data.
+
+

See Also: DSP::getParameterInfo, DSP::getParameterFloat

+

DSP::setParameterInt

+

Sets an integer parameter by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setParameterInt(
+  int index,
+  int value
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetParameterInt(
+  FMOD_DSP *dsp,
+  int index,
+  int value
+);
+
+ +
RESULT DSP.setParameterInt(
+  int index,
+  int value
+);
+
+ +
DSP.setParameterInt(
+  index,
+  value
+);
+
+ +
+
index
+
+

Parameter index.

+ +
+
value
+
Parameter integer data.
+
+

See Also: DSP::getParameterInfo, DSP::getParameterInt

+

DSP::setUserData

+

Sets a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetUserData(
+  FMOD_DSP *dsp,
+  void *userdata
+);
+
+ +
RESULT DSP.setUserData(
+  IntPtr userdata
+);
+
+ +
DSP.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
Value stored on this object.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: DSP::getUserData

+

DSP::setWetDryMix

+

Sets the scale of the wet and dry signal components.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::setWetDryMix(
+  float prewet,
+  float postwet,
+  float dry
+);
+
+ +
FMOD_RESULT FMOD_DSP_SetWetDryMix(
+  FMOD_DSP *dsp,
+  float prewet,
+  float postwet,
+  float dry
+);
+
+ +
RESULT DSP.setWetDryMix(
+  float prewet,
+  float postwet,
+  float dry
+);
+
+ +
DSP.setWetDryMix(
+  prewet,
+  postwet,
+  dry
+);
+
+ +
+
prewet
+
+

Level of the 'Dry' (pre-processed signal) mix that is processed by the DSP. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
postwet
+
+

Level of the 'Wet' (post-processed signal) mix that is output. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
dry
+
+

Level of the 'Dry' (pre-processed signal) mix that is output. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 0
  • +
+
+
+

The dry signal path is silent by default, because DSP effects transform the input and pass the newly processed result to the output.

+

See Also: DSP::getWetDryMix

+

DSP::showConfigDialog

+

Display or hide a DSP unit configuration dialog box inside the target window.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSP::showConfigDialog(
+  void *hwnd,
+  bool show
+);
+
+ +
FMOD_RESULT FMOD_DSP_ShowConfigDialog(
+  FMOD_DSP *dsp,
+  void *hwnd,
+  FMOD_BOOL show
+);
+
+ +
RESULT DSP.showConfigDialog(
+  IntPtr hwnd,
+  bool show
+);
+
+ +
DSP.showConfigDialog(
+  hwnd,
+  show
+);
+
+ +
+
hwnd
+
Target HWND in windows to display configuration dialog.
+
show
+
+

Whether to show or hide the dialog box inside target hwnd.

+
    +
  • Units: Boolean
  • +
+
+
+

Some DSP plug-ins (especially VST plug-ins) use dialog boxes to display graphical user interfaces for modifying their parameters, rather than using the other method of enumerating their parameters and setting them with DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterBool, or DSP::setParameterData.

+

To find out what size window to create to store the configuration screen, use DSP::getInfo where you can get the width and height.

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-dspconnection.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-dspconnection.html new file mode 100644 index 0000000..d6bcdbd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-dspconnection.html @@ -0,0 +1,535 @@ + + +Core API Reference | DSPConnection + + + + +
+ +
+

7. Core API Reference | DSPConnection

+

An interface that manages Digital Signal Processor (DSP) connections

+

Mix Properties:

+ +

General:

+ +
+ +

DSPConnection::getInput

+

Retrieves the connection's input DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::getInput(
+  DSP **input
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_GetInput(
+  FMOD_DSPCONNECTION *dspconnection,
+  FMOD_DSP **input
+);
+
+ +
RESULT DSPConnection.getInput(
+  out DSP input
+);
+
+ +
DSPConnection.getInput(
+  input
+);
+
+ +
+
input Out
+
Input DSP unit. (DSP)
+
+

If this function is called very soon after DSP::addInput, the connection might not be ready because the DSP system is still queued to be connected and may need to wait several milliseconds for the next mix to occur. When this occurs, the function returns FMOD_ERR_NOTREADY and input is null.

+

See Also: DSPConnection::getOutput, DSP::addInput

+

DSPConnection::getMix

+

Retrieves the connection's volume scale.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::getMix(
+  float *volume
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_GetMix(
+  FMOD_DSPCONNECTION *dspconnection,
+  float *volume
+);
+
+ +
RESULT DSPConnection.getMix(
+  out float volume
+);
+
+ +
DSPConnection.getMix(
+  volume
+);
+
+ +
+
volume Out
+
+

Volume scale applied to the input before being passed to the output. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
+

See Also: DSPConnection::setMix

+

DSPConnection::getMixMatrix

+

Retrieves a 2 dimensional pan matrix that maps the signal from input channels (columns) to output speakers (rows).

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::getMixMatrix(
+  float *matrix,
+  int *outchannels,
+  int *inchannels,
+  int inchannel_hop = 0
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_GetMixMatrix(
+  FMOD_DSPCONNECTION *dspconnection,
+  float *matrix,
+  int *outchannels,
+  int *inchannels,
+  int inchannel_hop
+);
+
+ +
RESULT DSPConnection.getMixMatrix(
+  float[] matrix,
+  out int outchannels,
+  out int inchannels,
+  int inchannel_hop = 0
+);
+
+ +
DSPConnection.getMixMatrix(
+  matrix,
+  outchannels,
+  inchannels,
+  inchannel_hop
+);
+
+ +
+
matrix OutOpt
+
+

Two dimensional array of volume levels in row-major order. Each row represents an output speaker, each column represents an input channel. Passing null or equivalent as the matrix allows querying of outchannels and inchannels.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
outchannels OutOpt
+
Number of valid output channels (rows) in matrix. Optional only when matrix is null or equivalent.
+
inchannels OutOpt
+
Number of valid input channels (columns) in matrix. Optional only when matrix is null or equivalent.
+
inchannel_hop Opt
+
Width (total number of columns) in destination matrix. Can be larger than inchannels to represent a smaller valid region inside a larger matrix.
+
+

A matrix element is referenced from the incoming matrix data as outchannel * inchannel_hop + inchannel.

+

See Also: DSPConnection::setMixMatrix

+

DSPConnection::getOutput

+

Retrieves the connection's output DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::getOutput(
+  DSP **output
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_GetOutput(
+  FMOD_DSPCONNECTION *dspconnection,
+  FMOD_DSP **output
+);
+
+ +
RESULT DSPConnection.getOutput(
+  out DSP output
+);
+
+ +
DSPConnection.getOutput(
+  output
+);
+
+ +
+
output Out
+
Output DSP unit. (DSP)
+
+

If this function is called very soon after DSP::addInput, the connection might not be ready because the DSP system is still queued to be connected and may need to wait several milliseconds for the next mix to occur. When this occurs, the function returns FMOD_ERR_NOTREADY and output is null.

+

See Also: DSPConnection::getInput, DSP::addInput

+

DSPConnection::getType

+

Retrieves the type of the connection between two DSP units.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::getType(
+  FMOD_DSPCONNECTION_TYPE *type
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_GetType(
+  FMOD_DSPCONNECTION *dspconnection,
+  FMOD_DSPCONNECTION_TYPE *type
+);
+
+ +
RESULT DSPConnection.getType(
+  out DSPCONNECTION_TYPE type
+);
+
+ +
DSPConnection.getType(
+  type
+);
+
+ +
+
type Out
+
Type of connection. (FMOD_DSPCONNECTION_TYPE)
+
+

DSPConnection::getUserData

+

Retrieves a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_GetUserData(
+  FMOD_DSPCONNECTION *dspconnection,
+  void **userdata
+);
+
+ +
RESULT DSPConnection.getUserData(
+  out IntPtr userdata
+);
+
+ +
DSPConnection.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling DSPConnection::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

DSPConnection::setMix

+

Sets the connection's volume scale.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::setMix(
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_SetMix(
+  FMOD_DSPCONNECTION *dspconnection,
+  float volume
+);
+
+ +
RESULT DSPConnection.setMix(
+  float volume
+);
+
+ +
DSPConnection.setMix(
+  volume
+);
+
+ +
+
volume
+
+

Volume scale applied to the input before being passed to the output. 0 = silent, 1 = full. Negative level inverts the signal. Values larger than 1 amplify the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
+

See Also: DSPConnection::getMix, DSPConnection::setMixMatrix, DSPConnection::getMixMatrix

+

DSPConnection::setMixMatrix

+

Sets a 2 dimensional pan matrix that maps the signal from input channels (columns) to output speakers (rows).

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::setMixMatrix(
+  float *matrix,
+  int outchannels,
+  int inchannels,
+  int inchannel_hop = 0
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_SetMixMatrix(
+  FMOD_DSPCONNECTION *dspconnection,
+  float *matrix,
+  int outchannels,
+  int inchannels,
+  int inchannel_hop
+);
+
+ +
RESULT DSPConnection.setMixMatrix(
+  float[] matrix,
+  int outchannels,
+  int inchannels,
+  int inchannel_hop = 0
+);
+
+ +
DSPConnection.setMixMatrix(
+  matrix,
+  outchannels,
+  inchannels,
+  inchannel_hop
+);
+
+ +
+
matrix Opt
+
+

Two dimensional array of volume levels in row-major order. Each row represents an output speaker, each column represents an input channel. Null or equivalent sets a 'default' matrix.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
+
+
outchannels
+
+

Number of output channels (rows) in matrix.

+ +
+
inchannels
+
+

Number of input channels (columns) in matrix.

+ +
+
inchannel_hop Opt
+
Width (total number of columns) in source matrix. Can be larger than inchannels to represent a smaller valid region inside a larger matrix.
+
+ +

A matrix element is referenced from the incoming matrix data as outchannel * inchannel_hop + inchannel.

+

If null or equivalent is passed in via matrix a default upmix, downmix, or unit matrix will take its place. A unit matrix allows a signal to pass through unchanged.

+

Example 5.1 unit matrix:

+
1 0 0 0 0 0 
+0 1 0 0 0 0 
+0 0 1 0 0 0 
+0 0 0 1 0 0 
+0 0 0 0 1 0 
+0 0 0 0 0 1
+
+

Matrix element values can be below 0 to invert a signal and above 1 to amplify the signal. Note that increasing the signal level too far may cause audible distortion.

+

See Also: DSPConnection::getMixMatrix

+

DSPConnection::setUserData

+

Sets a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT DSPConnection::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_DSPConnection_SetUserData(
+  FMOD_DSPCONNECTION *dspconnection,
+  void *userdata
+);
+
+ +
RESULT DSPConnection.setUserData(
+  IntPtr userdata
+);
+
+ +
DSPConnection.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
Value stored on this object.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: DSPConnection::getUserData

+

FMOD_DSPCONNECTION_TYPE

+

List of connection types between two DSP units.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSPCONNECTION_TYPE {
+  FMOD_DSPCONNECTION_TYPE_STANDARD,
+  FMOD_DSPCONNECTION_TYPE_SIDECHAIN,
+  FMOD_DSPCONNECTION_TYPE_SEND,
+  FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN,
+  FMOD_DSPCONNECTION_TYPE_MAX
+} FMOD_DSPCONNECTION_TYPE;
+
+ +
enum DSPCONNECTION_TYPE
+{
+    STANDARD,
+    SIDECHAIN,
+    SEND,
+    SEND_SIDECHAIN,
+    MAX,
+}
+
+ +
FMOD.DSPCONNECTION_TYPE_STANDARD
+FMOD.DSPCONNECTION_TYPE_SIDECHAIN
+FMOD.DSPCONNECTION_TYPE_SEND
+FMOD.DSPCONNECTION_TYPE_SEND_SIDECHAIN
+FMOD.DSPCONNECTION_TYPE_MAX
+
+ +
+
FMOD_DSPCONNECTION_TYPE_STANDARD
+
Default connection type. Audio is mixed from the input to the output DSP's audible buffer.
+
FMOD_DSPCONNECTION_TYPE_SIDECHAIN
+
Sidechain connection type. Audio is mixed from the input to the output DSP's sidechain buffer.
+
FMOD_DSPCONNECTION_TYPE_SEND
+
Send connection type. Audio is mixed from the input to the output DSP's audible buffer, but the input is not executed, only copied from. A standard connection or sidechain needs to make an input execute to generate data.
+
FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN
+
Send sidechain connection type. Audio is mixed from the input to the output DSP's sidechain buffer, but the input is not executed, only copied from. A standard connection or sidechain needs to make an input execute to generate data.
+
FMOD_DSPCONNECTION_TYPE_MAX
+
Maximum number of DSP connection types supported.
+
+

FMOD_DSP_CONNECTION_TYPE_STANDARD

+
+

Default DSPConnection type. Audio is mixed from the input to the output DSP's audible buffer, meaning it will be part of the audible signal. A standard connection executes its input DSP if it has not been executed before.

+

FMOD_DSP_CONNECTION_TYPE_SIDECHAIN

+
+

Sidechain DSPConnection type. Audio is mixed from the input to the output DSP's sidechain buffer, meaning it will not be part of the audible signal. A sidechain connection executes its input DSP if it has not been executed before.

+

This separate sidechain buffer exists so that the DSP can privately access it for analysis purposes. For example, a compressor DSP could analyze the signal and use the result of that analysis to control its own compression level and gain parameters.

+

When a sidechain is connected to a DSP, the sidechain buffer is a member of the FMOD_DSP_STATE struct, which is itself passed in as a parameter of the read callback. This data simplifies the development of effects that make use of sidechaining.

+

FMOD_DSP_STATE::sidechaindata and FMOD_DSP_STATE::sidechainchannels will hold the mixed result of any sidechain data flowing into it.

+

FMOD_DSP_CONNECTION_TYPE_SEND

+
+

Send DSPConnection type. Audio is mixed from the input to the output DSP's audible buffer, meaning it becomes part of the audible signal. A send connection will not execute its input DSP if it has not been executed before.

+

A send connection only reads what exists at the input's buffer at the time of executing the output DSP unit (which can be considered the 'return').

+

FMOD_DSP_CONNECTION_TYPE_SEND_SIDECHAIN

+
+

Send sidechain DSPConnection type. Audio is mixed from the input to the output DSP's sidechain buffer, meaning it does not become part of the audible signal. A send sidechain connection does not execute its input DSP if it has not been executed before.

+

A send sidechain connection only reads what exists at the input's buffer at the time of executing the output DSP unit (which can be considered the 'sidechain return').

+

When a sidechain is connected to a DSP, the sidechain data is stored in the FMOD_DSP_STATE struct that is a function parameter of the read callback. This data simplifies the development of effects that make use of sidechaining.

+

FMOD_DSP_STATE::sidechaindata and FMOD_DSP_STATE::sidechainchannels hold the mixed result of any sidechain data flowing into them.

+

See Also: DSP::addInput, DSPConnection::getType

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-geometry.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-geometry.html new file mode 100644 index 0000000..431c10c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-geometry.html @@ -0,0 +1,1047 @@ + + +Core API Reference | Geometry + + + + +
+ +
+

7. Core API Reference | Geometry

+

An interface that allows the setup and modification of geometry for occlusion

+

Polygons:

+ +

Object Spatialization:

+ +

Object General:

+ +

Geometry::addPolygon

+

Adds a polygon.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::addPolygon(
+  float directocclusion,
+  float reverbocclusion,
+  bool doublesided,
+  int numvertices,
+  const FMOD_VECTOR *vertices,
+  int *polygonindex
+);
+
+ +
FMOD_RESULT FMOD_Geometry_AddPolygon(
+  FMOD_GEOMETRY *geometry,
+  float directocclusion,
+  float reverbocclusion,
+  FMOD_BOOL doublesided,
+  int numvertices,
+  const FMOD_VECTOR *vertices,
+  int *polygonindex
+);
+
+ +
RESULT Geometry.addPolygon(
+  float directocclusion,
+  float reverbocclusion,
+  bool doublesided,
+  int numvertices,
+  VECTOR[] vertices,
+  out int polygonindex
+);
+
+ +
+

Currently not supported for JavaScript.

+
+
+
directocclusion
+
+

Occlusion factor of the polygon for the direct path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
reverbocclusion
+
+

Occlusion factor of the polygon for the reverb path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
doublesided
+
+

True: Polygon is double sided.
+False: Polygon is single sided, and the winding of the polygon (which determines the polygon's normal) determines which side of the polygon will cause occlusion.

+
    +
  • Units: Boolean
  • +
+
+
numvertices
+
Number of vertices in this polygon. This must be at least 3.
+
vertices
+
Array of vertices located in object space of length numvertices. (FMOD_VECTOR)
+
polygonindex OutOpt
+
Polygon index. Use this with other per polygon based functions as a handle.
+
+

All vertices must lay in the same plane otherwise behavior may be unpredictable. The polygon is assumed to be convex. A non convex polygon will produce unpredictable behavior. Polygons with zero area will be ignored.

+

Polygons cannot be added if already at the maximum number of polygons or if the addition of their verticies would result in exceeding the maximum number of vertices.

+

Vertices of an object are in object space, not world space, and so are relative to the position, or center of the object. See Geometry::setPosition.

+

See Also: Geometry::setPolygonAttributes, Geometry::getNumPolygons, Geometry::getMaxPolygons

+

Geometry::getActive

+

Retrieves whether an object is processed by the geometry engine.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getActive(
+  bool *active
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetActive(
+  FMOD_GEOMETRY *geometry,
+  FMOD_BOOL *active
+);
+
+ +
RESULT Geometry.getActive(
+  out bool active
+);
+
+ +
Geometry.getActive(
+  active
+);
+
+ +
+
active Out
+
+

Object is allowed to be processed by the geometry engine.

+
    +
  • Units: Boolean
  • +
  • Default: True
  • +
+
+
+

See Also: Geometry::setActive

+

Geometry::getMaxPolygons

+

Retrieves the maximum number of polygons and vertices allocatable for this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getMaxPolygons(
+  int *maxpolygons,
+  int *maxvertices
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetMaxPolygons(
+  FMOD_GEOMETRY *geometry,
+  int *maxpolygons,
+  int *maxvertices
+);
+
+ +
RESULT Geometry.getMaxPolygons(
+  out int maxpolygons,
+  out int maxvertices
+);
+
+ +
Geometry.getMaxPolygons(
+  maxpolygons,
+  maxvertices
+);
+
+ +
+
maxpolygons OutOpt
+
Maximum possible number of polygons in this object.
+
maxvertices OutOpt
+
Maximum possible number of vertices in this object.
+
+

The maximum number was set with System::createGeometry.

+

See Also: System::loadGeometry

+

Geometry::getNumPolygons

+

Retrieves the number of polygons in this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getNumPolygons(
+  int *numpolygons
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetNumPolygons(
+  FMOD_GEOMETRY *geometry,
+  int *numpolygons
+);
+
+ +
RESULT Geometry.getNumPolygons(
+  out int numpolygons
+);
+
+ +
Geometry.getNumPolygons(
+  numpolygons
+);
+
+ +
+
numpolygons Out
+
Number of polygons.
+
+

See Also: Geometry::AddPolygon

+

Geometry::getPolygonAttributes

+

Retrieves the attributes for a polygon.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getPolygonAttributes(
+  int index,
+  float *directocclusion,
+  float *reverbocclusion,
+  bool *doublesided
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetPolygonAttributes(
+  FMOD_GEOMETRY *geometry,
+  int index,
+  float *directocclusion,
+  float *reverbocclusion,
+  FMOD_BOOL *doublesided
+);
+
+ +
RESULT Geometry.getPolygonAttributes(
+  int index,
+  out float directocclusion,
+  out float reverbocclusion,
+  out bool doublesided
+);
+
+ +
Geometry.getPolygonAttributes(
+  index,
+  directocclusion,
+  reverbocclusion,
+  doublesided
+);
+
+ +
+
index
+
+

Polygon index.

+ +
+
directocclusion OutOpt
+
+

Occlusion factor for the direct path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
  • Units: Linear
  • +
+
+
reverbocclusion OutOpt
+
+

Occlusion factor for the reverb path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
  • Units: Linear
  • +
+
+
doublesided OutOpt
+
+

True: Polygon is double sided.
+False: Polygon is single sided, and the winding of the polygon (which determines the polygon's normal) determines which side of the polygon will cause occlusion.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Geometry::setPolygonAttributes

+

Geometry::getPolygonNumVertices

+

Gets the number of vertices in a polygon.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getPolygonNumVertices(
+  int index,
+  int *numvertices
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetPolygonNumVertices(
+  FMOD_GEOMETRY *geometry,
+  int index,
+  int *numvertices
+);
+
+ +
RESULT Geometry.getPolygonNumVertices(
+  int index,
+  out int numvertices
+);
+
+ +
Geometry.getPolygonNumVertices(
+  index,
+  numvertices
+);
+
+ +
+
index
+
+

Polygon index.

+ +
+
numvertices OutOpt
+
Number of vertices.
+
+

Geometry::getPolygonVertex

+

Retrieves the position of a vertex.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getPolygonVertex(
+  int index,
+  int vertexindex,
+  FMOD_VECTOR *vertex
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetPolygonVertex(
+  FMOD_GEOMETRY *geometry,
+  int index,
+  int vertexindex,
+  FMOD_VECTOR *vertex
+);
+
+ +
RESULT Geometry.getPolygonVertex(
+  int index,
+  int vertexindex,
+  out VECTOR vertex
+);
+
+ +
Geometry.getPolygonVertex(
+  index,
+  vertexindex,
+  vertex
+);
+
+ +
+
index
+
+

Polygon index.

+ +
+
vertexindex
+
+

Polygon vertex index.

+ +
+
vertex Out
+
+

3D Position of the vertex. (FMOD_VECTOR)

+ +
+
+

Vertices are relative to the position of the object. See Geometry::setPosition.

+

See Also: Geometry::setPolygonVertex

+

Geometry::getPosition

+

Retrieves the 3D position of the object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getPosition(
+  FMOD_VECTOR *position
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetPosition(
+  FMOD_GEOMETRY *geometry,
+  FMOD_VECTOR *position
+);
+
+ +
RESULT Geometry.getPosition(
+  out VECTOR position
+);
+
+ +
Geometry.getPosition(
+  position
+);
+
+ +
+
position Out
+
+

3D position. (FMOD_VECTOR)

+ +
+
+

Position is in world space.

+

See Also: Geometry::setPosition

+

Geometry::getRotation

+

Retrieves the 3D orientation of the object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getRotation(
+  FMOD_VECTOR *forward,
+  FMOD_VECTOR *up
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetRotation(
+  FMOD_GEOMETRY *geometry,
+  FMOD_VECTOR *forward,
+  FMOD_VECTOR *up
+);
+
+ +
RESULT Geometry.getRotation(
+  out VECTOR forward,
+  out VECTOR up
+);
+
+ +
Geometry.getRotation(
+  forward,
+  up
+);
+
+ +
+
forward OutOpt
+
Forwards orientation. This vector must be of unit length and perpendicular to the up vector. (FMOD_VECTOR)
+
up OutOpt
+
Upwards orientation. This vector must be of unit length and perpendicular to the forwards vector. (FMOD_VECTOR)
+
+

See Also: Geometry::setRotation

+

Geometry::getScale

+

Retrieves the 3D scale of the object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getScale(
+  FMOD_VECTOR *scale
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetScale(
+  FMOD_GEOMETRY *geometry,
+  FMOD_VECTOR *scale
+);
+
+ +
RESULT Geometry.getScale(
+  out VECTOR scale
+);
+
+ +
Geometry.getScale(
+  scale
+);
+
+ +
+
scale Out
+
+

Scale value. (FMOD_VECTOR)

+
    +
  • Units: Linear
  • +
  • Default: (1, 1, 1)
  • +
+
+
+

See Also: Geometry::setScale

+

Geometry::getUserData

+

Retrieves a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Geometry_GetUserData(
+  FMOD_GEOMETRY *geometry,
+  void **userdata
+);
+
+ +
RESULT Geometry.getUserData(
+  out IntPtr userdata
+);
+
+ +
Geometry.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling Geometry::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

Geometry::release

+

Frees a geometry object and releases its memory.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::release();
+
+ +
FMOD_RESULT FMOD_Geometry_Release(FMOD_GEOMETRY *geometry);
+
+ +
RESULT Geometry.release();
+
+ +
Geometry.release();
+
+ +

Geometry::save

+

Saves the geometry object as a serialized binary block to a user memory buffer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::save(
+  void *data,
+  int *datasize
+);
+
+ +
FMOD_RESULT FMOD_Geometry_Save(
+  FMOD_GEOMETRY *geometry,
+  void *data,
+  int *datasize
+);
+
+ +
RESULT Geometry.save(
+  IntPtr data,
+  out int datasize
+);
+
+ +
+

Currently not supported for JavaScript.

+
+
+
data OutOpt
+
Serialized geometry object. Specify null to have the datasize parameter return the size of the memory required for this saved object.
+
datasize Out
+
+

Size required to save this object when 'data' parameter is null. Otherwise ignored.

+
    +
  • Units: Bytes
  • +
+
+
+

Typical usage of this function is to call it twice - once to get the size of the data, then again to write the data to your pointer.

+

The data can be saved to a file if required and loaded later with System::loadGeometry.

+

See Also: System::createGeometry

+

Geometry::setActive

+

Sets whether an object is processed by the geometry engine.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::setActive(
+  bool active
+);
+
+ +
FMOD_RESULT FMOD_Geometry_SetActive(
+  FMOD_GEOMETRY *geometry,
+  FMOD_BOOL active
+);
+
+ +
RESULT Geometry.setActive(
+  bool active
+);
+
+ +
Geometry.setActive(
+  active
+);
+
+ +
+
active
+
+

Allow object to be processed by the geometry engine.

+
    +
  • Units: Boolean
  • +
  • Default: True
  • +
+
+
+

See Also: Geometry::getActive

+

Geometry::setPolygonAttributes

+

Sets individual attributes for a polygon inside a geometry object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::setPolygonAttributes(
+  int index,
+  float directocclusion,
+  float reverbocclusion,
+  bool doublesided
+);
+
+ +
FMOD_RESULT FMOD_Geometry_SetPolygonAttributes(
+  FMOD_GEOMETRY *geometry,
+  int index,
+  float directocclusion,
+  float reverbocclusion,
+  FMOD_BOOL doublesided
+);
+
+ +
RESULT Geometry.setPolygonAttributes(
+  int index,
+  float directocclusion,
+  float reverbocclusion,
+  bool doublesided
+);
+
+ +
Geometry.setPolygonAttributes(
+  index,
+  directocclusion,
+  reverbocclusion,
+  doublesided
+);
+
+ +
+
index
+
+

Polygon index.

+ +
+
directocclusion
+
+

Occlusion factor of the polygon for the direct path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
  • Units: Linear
  • +
+
+
reverbocclusion
+
+

Occlusion factor of the polygon for the reverb path where 0 represents no occlusion and 1 represents full occlusion.

+
    +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
  • Units: Linear
  • +
+
+
doublesided
+
+

True: Polygon is double sided.
+False: Polygon is single sided, and the winding of the polygon (which determines the polygon's normal) determines which side of the polygon will cause occlusion.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Geometry::getPolygonAttributes, Geometry::getNumPolygons

+

Geometry::setPolygonVertex

+

Alters the position of a polygon's vertex inside a geometry object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::setPolygonVertex(
+  int index,
+  int vertexindex,
+  const FMOD_VECTOR *vertex
+);
+
+ +
FMOD_RESULT FMOD_Geometry_SetPolygonVertex(
+  FMOD_GEOMETRY *geometry,
+  int index,
+  int vertexindex,
+  const FMOD_VECTOR *vertex
+);
+
+ +
RESULT Geometry.setPolygonVertex(
+  int index,
+  int vertexindex,
+  ref VECTOR vertex
+);
+
+ +
Geometry.setPolygonVertex(
+  index,
+  vertexindex,
+  vertex
+);
+
+ +
+
index
+
+

Polygon index.

+ +
+
vertexindex
+
+

Polygon vertex index.

+ +
+
vertex
+
+

3D Position of the vertex. (FMOD_VECTOR)

+ +
+
+

Vertices are relative to the position of the object. See Geometry::setPosition.

+

There may be some significant overhead with this function as it may cause some reconfiguration of internal data structures used to speed up sound-ray testing.

+

You may get better results if you want to modify your object by using Geometry::setPosition, Geometry::setScale and Geometry::setRotation.

+

See Also: Geometry::getPolygonNumVertices, Geometry::getPolygonNumVertices, Geometry::getNumPolygons

+

Geometry::setPosition

+

Sets the 3D position of the object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::setPosition(
+  const FMOD_VECTOR *position
+);
+
+ +
FMOD_RESULT FMOD_Geometry_SetPosition(
+  FMOD_GEOMETRY *geometry,
+  const FMOD_VECTOR *position
+);
+
+ +
RESULT Geometry.setPosition(
+  ref VECTOR position
+);
+
+ +
Geometry.setPosition(
+  position
+);
+
+ +
+
position
+
+

3D position. (FMOD_VECTOR)

+ +
+
+

Position is in world space.

+

See Also: Geometry::getPosition, Geometry::setRotation, Geometry::setScale

+

Geometry::setRotation

+

Sets the 3D orientation of the object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::setRotation(
+  const FMOD_VECTOR *forward,
+  const FMOD_VECTOR *up
+);
+
+ +
FMOD_RESULT FMOD_Geometry_SetRotation(
+  FMOD_GEOMETRY *geometry,
+  const FMOD_VECTOR *forward,
+  const FMOD_VECTOR *up
+);
+
+ +
RESULT Geometry.setRotation(
+  ref VECTOR forward,
+  ref VECTOR up
+);
+
+ +
Geometry.setRotation(
+  forward,
+  up
+);
+
+ +
+
forward Opt
+
+

Forwards orientation. This vector must be of unit length and perpendicular to the up vector. (FMOD_VECTOR)

+
    +
  • Default: (0, 0, 1)
  • +
+
+
up Opt
+
+

Upwards orientation. This vector must be of unit length and perpendicular to the forwards vector. (FMOD_VECTOR)

+
    +
  • Default: (0, 1, 0)
  • +
+
+
+

See remarks in System::set3DListenerAttributes for more description on forward and up vectors.

+

See Also: Geometry::getRotation, Geometry::setPosition, Geometry::setScale

+

Geometry::setScale

+

Sets the 3D scale of the object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::setScale(
+  const FMOD_VECTOR *scale
+);
+
+ +
FMOD_RESULT FMOD_Geometry_SetScale(
+  FMOD_GEOMETRY *geometry,
+  const FMOD_VECTOR *scale
+);
+
+ +
RESULT Geometry.setScale(
+  ref VECTOR scale
+);
+
+ +
Geometry.setScale(
+  scale
+);
+
+ +
+
scale
+
+

Scale value. (FMOD_VECTOR)

+
    +
  • Units: Linear
  • +
  • Default: (1, 1, 1)
  • +
+
+
+

An object can be scaled/warped in all 3 dimensions separately using this function without having to modify polygon data.

+

See Also: Geometry::getScale, Geometry::setPosition, Geometry::setRotation

+

Geometry::setUserData

+

Sets a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Geometry::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Geometry_SetUserData(
+  FMOD_GEOMETRY *geometry,
+  void *userdata
+);
+
+ +
RESULT Geometry.setUserData(
+  IntPtr userdata
+);
+
+ +
Geometry.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
Value stored on this object.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Geometry::getUserData

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-platform-android.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-platform-android.html new file mode 100644 index 0000000..acf42dd --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-platform-android.html @@ -0,0 +1,95 @@ + + +Core API Reference | Android Specific + + + + +
+ +
+

7. Core API Reference | Android Specific

+

APIs and types for Android platform, see fmod_android.h

+ +

FMOD_Android_JNI_Close

+

Call to uninitialize FMOD from a native activity.

+

+

+
C
+
C++
+
C#
+
+

+
FMOD_RESULT FMOD_Android_JNI_Close();
+
+ +
RESULT FMOD.Android.JNI_Close();
+
+ +
+

Not supported for JavaScript.

+
+

When using a native activity, you will need to call this function after calling System::release.

+

See Also: Java

+

FMOD_Android_JNI_Init

+

Call to initialize FMOD from a native activity.

+

+

+
C
+
C++
+
C#
+
+

+
FMOD_RESULT FMOD_Android_JNI_Init(
+    JavaVM *vm,
+    jobject javaActivity
+);
+
+ +
FMOD_RESULT FMOD.Android.JNI_Init(
+    IntPtr vm,
+    IntPtr javaActivity
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
vm
+
Pointer to the ANativeActivity::vm JavaVM.
+
javaActivity
+
Pointer to your ANativeActivity::clazz jobject.
+
+

When using a native activity, you will need to call this function before making calls into the FMOD API.
+The vm must be attached to the current thread before being passed to this function. For example:

+
mApp->activity->vm->AttachCurrentThread(&mJniEnv, NULL);
+FMOD_Android_JNI_Init(mApp->activity->vm, mApp->activity->clazz);
+
+ +

See Also: Java

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-platform-ios.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-platform-ios.html new file mode 100644 index 0000000..881fdf7 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-platform-ios.html @@ -0,0 +1,68 @@ + + +Core API Reference | iOS Specific + + + + +
+ +
+

7. Core API Reference | iOS Specific

+

APIs and types for iOS platform, see fmod_ios.h

+ +

FMOD_AUDIOQUEUE_CODECPOLICY

+

Control whether the sound will use a the dedicated hardware decoder or a software codec.

+

+

+
C
+
C++
+
+

+
typedef enum FMOD_AUDIOQUEUE_CODECPOLICY {
+  FMOD_AUDIOQUEUE_CODECPOLICY_DEFAULT,
+  FMOD_AUDIOQUEUE_CODECPOLICY_SOFTWAREONLY,
+  FMOD_AUDIOQUEUE_CODECPOLICY_HARDWAREONLY
+} FMOD_AUDIOQUEUE_CODECPOLICY;
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
FMOD_AUDIOQUEUE_CODECPOLICY_DEFAULT
+
Try hardware first, if it's in use or prohibited by audio session, try software.
+
FMOD_AUDIOQUEUE_CODECPOLICY_SOFTWAREONLY
+
kAudioQueueHardwareCodecPolicy_UseSoftwareOnly ~ try software, if not available fail.
+
FMOD_AUDIOQUEUE_CODECPOLICY_HARDWAREONLY
+
kAudioQueueHardwareCodecPolicy_UseHardwareOnly ~ try hardware, if not available fail.
+
+

Every devices has a single hardware decoder and unlimited software decoders.

+

See Also: FMOD_CREATESOUNDEXINFO

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-reverb3d.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-reverb3d.html new file mode 100644 index 0000000..24ee1cf --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-reverb3d.html @@ -0,0 +1,422 @@ + + +Core API Reference | Reverb3D + + + + +
+ +
+

7. Core API Reference | Reverb3D

+

An interface that manages virtual 3D reverb spheres. See the 3D Reverb guide for more information.

+

General:

+ +

Reverb3D::get3DAttributes

+

Retrieves the 3D attributes of a reverb sphere.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::get3DAttributes(
+  FMOD_VECTOR *position,
+  float *mindistance,
+  float *maxdistance
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_Get3DAttributes(
+  FMOD_REVERB3D *reverb3d,
+  FMOD_VECTOR *position,
+  float *mindistance,
+  float *maxdistance
+);
+
+ +
RESULT Reverb3D.get3DAttributes(
+  ref VECTOR position,
+  ref float mindistance,
+  ref float maxdistance
+);
+
+ +
Reverb3D.get3DAttributes(
+  position,
+  mindistance,
+  maxdistance
+);
+
+ +
+
position OutOpt
+
Position in 3D space represnting the center of the reverb. (FMOD_VECTOR)
+
mindistance OutOpt
+
Distance from the centerpoint within which the reverb will have full effect.
+
maxdistance OutOpt
+
Distance from the centerpoint beyond which the reverb will have no effect.
+
+

See the 3D Reverb guide for more information.

+

See Also: Reverb3D::set3DAttributes

+

Reverb3D::getActive

+

Retrieves the active state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::getActive(
+  bool *active
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_GetActive(
+  FMOD_REVERB3D *reverb3d,
+  FMOD_BOOL *active
+);
+
+ +
RESULT Reverb3D.getActive(
+  out bool active
+);
+
+ +
Reverb3D.getActive(
+  active
+);
+
+ +
+
active Out
+
+

Active state of the reverb sphere.

+
    +
  • Units: Boolean
  • +
  • Default: True
  • +
+
+
+

See the 3D Reverb guide for more information.

+

See Also: Reverb3D::setActive

+

Reverb3D::getProperties

+

Retrieves the environmental properties of a reverb sphere.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::getProperties(
+  FMOD_REVERB_PROPERTIES *properties
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_GetProperties(
+  FMOD_REVERB3D *reverb3d,
+  FMOD_REVERB_PROPERTIES *properties
+);
+
+ +
RESULT Reverb3D.getProperties(
+  ref REVERB_PROPERTIES properties
+);
+
+ +
Reverb3D.getProperties(
+  properties
+);
+
+ +
+
properties Out
+
Reverb properties. (FMOD_REVERB_PROPERTIES)
+
+

See the 3D Reverb guide for more information.

+

See Also: Reverb3D::setProperties

+

Reverb3D::getUserData

+

Retrieves a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_GetUserData(
+  FMOD_REVERB3D *reverb3d,
+  void **userdata
+);
+
+ +
RESULT Reverb3D.getUserData(
+  out IntPtr userdata
+);
+
+ +
Reverb3D.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling Reverb3D::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: 3D Reverb

+

Reverb3D::release

+

Releases the memory for a reverb object and makes it inactive.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::release();
+
+ +
FMOD_RESULT FMOD_Reverb3D_Release(FMOD_REVERB3D *reverb3d);
+
+ +
RESULT Reverb3D.release();
+
+ +
Reverb3D.release();
+
+ +

If you release all Reverb3D objects and have not added a new Reverb3D object, System::setReverbProperties should be called to reset the reverb properties.

+

See Also: System::createReverb3D

+

Reverb3D::set3DAttributes

+

Sets the 3D attributes of a reverb sphere.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::set3DAttributes(
+  const FMOD_VECTOR *position,
+  float mindistance,
+  float maxdistance
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_Set3DAttributes(
+  FMOD_REVERB3D *reverb3d,
+  const FMOD_VECTOR *position,
+  float mindistance,
+  float maxdistance
+);
+
+ +
RESULT Reverb3D.set3DAttributes(
+  ref VECTOR position,
+  float mindistance,
+  float maxdistance
+);
+
+ +
Reverb3D.set3DAttributes(
+  position,
+  mindistance,
+  maxdistance
+);
+
+ +
+
position Opt
+
+

Position in 3D space represnting the center of the reverb. (FMOD_VECTOR)

+ +
+
mindistance
+
+

Distance from the centerpoint within which the reverb will have full effect.

+ +
+
maxdistance
+
+

Distance from the centerpoint beyond which the reverb will have no effect.

+ +
+
+

See the 3D Reverb guide for more information.

+

When the position of the listener is less than maxdistance away from the position of one or more reverb objects, the listener's 3D reverb properties are a weighted combination of those reverb objects. Otherwise, the reverb DSP will use the global reverb settings.

+

See Also: Reverb3D::get3DAttributes

+

Reverb3D::setActive

+

Sets the active state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::setActive(
+  bool active
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_SetActive(
+  FMOD_REVERB3D *reverb3d,
+  FMOD_BOOL active
+);
+
+ +
RESULT Reverb3D.setActive(
+  bool active
+);
+
+ +
Reverb3D.setActive(
+  active
+);
+
+ +
+
active
+
+

Active state of the reverb sphere.

+
    +
  • Units: Boolean
  • +
  • Default: True
  • +
+
+
+

See the 3D Reverb guide for more information.

+

See Also: Reverb3D::getActive

+

Reverb3D::setProperties

+

Sets the environmental properties of a reverb sphere.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::setProperties(
+  const FMOD_REVERB_PROPERTIES *properties
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_SetProperties(
+  FMOD_REVERB3D *reverb3d,
+  const FMOD_REVERB_PROPERTIES *properties
+);
+
+ +
RESULT Reverb3D.setProperties(
+  ref REVERB_PROPERTIES properties
+);
+
+ +
Reverb3D.setProperties(
+  properties
+);
+
+ +
+
properties
+
Reverb properties. (FMOD_REVERB_PROPERTIES)
+
+

See the 3D Reverb guide for more information.

+

Reverb presets are available, see FMOD_REVERB_PRESETS.

+

See Also: Reverb3D::getProperties

+

Reverb3D::setUserData

+

Sets a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Reverb3D::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Reverb3D_SetUserData(
+  FMOD_REVERB3D *reverb3d,
+  void *userdata
+);
+
+ +
RESULT Reverb3D.setUserData(
+  IntPtr userdata
+);
+
+ +
Reverb3D.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
Value stored on this object.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Reverb3D::getUserData

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-sound.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-sound.html new file mode 100644 index 0000000..990d331 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-sound.html @@ -0,0 +1,3025 @@ + + +Core API Reference | Sound + + + + +
+ +
+

7. Core API Reference | Sound

+

Container for sample data that can be played on a Channel.

+

Create with System::createSound or System::createStream.

+

Format information:

+ +
+
    +
  • FMOD_TAG Tag data / metadata description.
  • +
+
+
    +
  • FMOD_SOUND_TYPE Recognized audio formats that can be loaded into a Sound.
  • +
  • FMOD_SOUND_FORMAT These definitions describe the native format of the hardware or software buffer that will be used.
  • +
  • FMOD_TAGTYPE List of tag data / metadata types that could be stored within a sound. These include id3 tags, metadata from netstreams and vorbis/asf data.
  • +
  • FMOD_TAGDATATYPE List of tag data / metadata types.
  • +
+

Defaults when played:

+ +

Relationship management:

+ +

Data reading:

+
    +
  • Sound::getOpenState Retrieves the state a sound is in after being opened with the non blocking flag, or the current state of the streaming buffer.
  • +
  • Sound::readData Reads data from an opened sound to a specified buffer, using FMOD's internal codecs.
  • +
  • Sound::seekData Seeks a sound for use with data reading, using FMOD's internal codecs.
  • +
  • Sound::lock Gives access to a portion or all the sample data of a sound for direct manipulation.
  • +
  • Sound::unlock Finalizes a previous sample data lock and submits it back to the Sound object.
  • +
+
+
    +
  • FMOD_OPENSTATE These values describe what state a sound is in after FMOD_NONBLOCKING has been used to open it.
  • +
+

Music:

+ +

Synchronization / markers:

+ +

General:

+ +
+ +

FMOD_OPENSTATE

+

These values describe what state a sound is in after FMOD_NONBLOCKING has been used to open it.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_OPENSTATE {
+  FMOD_OPENSTATE_READY,
+  FMOD_OPENSTATE_LOADING,
+  FMOD_OPENSTATE_ERROR,
+  FMOD_OPENSTATE_CONNECTING,
+  FMOD_OPENSTATE_BUFFERING,
+  FMOD_OPENSTATE_SEEKING,
+  FMOD_OPENSTATE_PLAYING,
+  FMOD_OPENSTATE_SETPOSITION,
+  FMOD_OPENSTATE_MAX
+} FMOD_OPENSTATE;
+
+ +
enum OPENSTATE : int
+{
+  READY,
+  LOADING,
+  ERROR,
+  CONNECTING,
+  BUFFERING,
+  SEEKING,
+  PLAYING,
+  SETPOSITION,
+  MAX
+}
+
+ +
FMOD.OPENSTATE_READY
+FMOD.OPENSTATE_LOADING
+FMOD.OPENSTATE_ERROR
+FMOD.OPENSTATE_CONNECTING
+FMOD.OPENSTATE_BUFFERING
+FMOD.OPENSTATE_SEEKING
+FMOD.OPENSTATE_PLAYING
+FMOD.OPENSTATE_SETPOSITION
+FMOD.OPENSTATE_MAX
+
+ +
+
FMOD_OPENSTATE_READY
+
Opened and ready to play.
+
FMOD_OPENSTATE_LOADING
+
Initial load in progress.
+
FMOD_OPENSTATE_ERROR
+
Failed to open - file not found, out of memory etc. See return value of Sound::getOpenState for what happened.
+
FMOD_OPENSTATE_CONNECTING
+
Connecting to remote host (internet sounds only).
+
FMOD_OPENSTATE_BUFFERING
+
Buffering data.
+
FMOD_OPENSTATE_SEEKING
+
Seeking to subsound and re-flushing stream buffer.
+
FMOD_OPENSTATE_PLAYING
+
Ready and playing, but not possible to release at this time without stalling the main thread.
+
FMOD_OPENSTATE_SETPOSITION
+
Seeking within a stream to a different position.
+
FMOD_OPENSTATE_MAX
+
Maximum number of open state types.
+
+

With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Sound::getSubSound, a stream will go into FMOD_OPENSTATE_SEEKING state and sound related commands will return FMOD_ERR_NOTREADY.

+

With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Channel::getPosition, a stream will go into FMOD_OPENSTATE_SETPOSITION state and sound related commands will return FMOD_ERR_NOTREADY.

+

See Also: Sound::getOpenState, FMOD_MODE

+

Sound::addSyncPoint

+

Adds a sync point at a specific time within the sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::addSyncPoint(
+  unsigned int offset,
+  FMOD_TIMEUNIT offsettype,
+  const char *name,
+  FMOD_SYNCPOINT **point
+);
+
+ +
FMOD_RESULT FMOD_Sound_AddSyncPoint(
+  FMOD_SOUND *sound,
+  unsigned int offset,
+  FMOD_TIMEUNIT offsettype,
+  const char *name,
+  FMOD_SYNCPOINT **point
+);
+
+ +
RESULT Sound.addSyncPoint(
+  uint offset,
+  TIMEUNIT offsettype,
+  string name,
+  out IntPtr point
+);
+
+ +
Sound.addSyncPoint(
+  offset,
+  offsettype,
+  name,
+  point
+);
+
+ +
+
offset
+
Offset value.
+
offsettype
+
offset unit type. (FMOD_TIMEUNIT)
+
name Opt
+
Sync point name. (UTF-8 string)
+
point OutOpt
+
Sync point. (FMOD_SYNCPOINT)
+
+

For more information on sync points see Sync Points.

+

See Also: Sound::getNumSyncPoints, Sound::getSyncPoint, Sound::getSyncPointInfo, Sound::deleteSyncPoint

+

Sound::deleteSyncPoint

+

Deletes a sync point within the sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::deleteSyncPoint(
+  FMOD_SYNCPOINT *point
+);
+
+ +
FMOD_RESULT FMOD_Sound_DeleteSyncPoint(
+  FMOD_SOUND *sound,
+  FMOD_SYNCPOINT *point
+);
+
+ +
RESULT Sound.deleteSyncPoint(
+  IntPtr point
+);
+
+ +
Sound.deleteSyncPoint(
+  point
+);
+
+ +
+
point
+
Sync point. (FMOD_SYNCPOINT)
+
+

For for more information on sync points see Sync Points.

+

See Also: Sound::addSyncPoint, Sound::getNumSyncPoints, Sound::getSyncPoint

+

FMOD_SOUND_FORMAT

+

These definitions describe the native format of the hardware or software buffer that will be used.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_SOUND_FORMAT {
+  FMOD_SOUND_FORMAT_NONE,
+  FMOD_SOUND_FORMAT_PCM8,
+  FMOD_SOUND_FORMAT_PCM16,
+  FMOD_SOUND_FORMAT_PCM24,
+  FMOD_SOUND_FORMAT_PCM32,
+  FMOD_SOUND_FORMAT_PCMFLOAT,
+  FMOD_SOUND_FORMAT_BITSTREAM,
+  FMOD_SOUND_FORMAT_MAX
+} FMOD_SOUND_FORMAT;
+
+ +
enum SOUND_FORMAT
+{
+  NONE,
+  PCM8,
+  PCM16,
+  PCM24,
+  PCM32,
+  PCMFLOAT,
+  BITSTREAM,
+  MAX
+}
+
+ +
FMOD.SOUND_FORMAT_NONE
+FMOD.SOUND_FORMAT_PCM8
+FMOD.SOUND_FORMAT_PCM16
+FMOD.SOUND_FORMAT_PCM24
+FMOD.SOUND_FORMAT_PCM32
+FMOD.SOUND_FORMAT_PCMFLOAT
+FMOD.SOUND_FORMAT_BITSTREAM
+FMOD.SOUND_FORMAT_MAX
+
+ +
+
FMOD_SOUND_FORMAT_NONE
+
Uninitalized / unknown.
+
FMOD_SOUND_FORMAT_PCM8
+
8bit integer PCM data.
+
FMOD_SOUND_FORMAT_PCM16
+
16bit integer PCM data.
+
FMOD_SOUND_FORMAT_PCM24
+
24bit integer PCM data.
+
FMOD_SOUND_FORMAT_PCM32
+
32bit integer PCM data.
+
FMOD_SOUND_FORMAT_PCMFLOAT
+
32bit floating point PCM data.
+
FMOD_SOUND_FORMAT_BITSTREAM
+
Sound data is in its native compressed format. See FMOD_CREATECOMPRESSEDSAMPLE
+
FMOD_SOUND_FORMAT_MAX
+
Maximum number of sound formats supported.
+
+

See Also: System::createSound, Sound::getFormat

+

Sound::get3DConeSettings

+

Retrieves the inside and outside angles of the 3D projection cone and the outside volume.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::get3DConeSettings(
+  float *insideconeangle,
+  float *outsideconeangle,
+  float *outsidevolume
+);
+
+ +
FMOD_RESULT FMOD_Sound_Get3DConeSettings(
+  FMOD_SOUND *sound,
+  float *insideconeangle,
+  float *outsideconeangle,
+  float *outsidevolume
+);
+
+ +
RESULT Sound.get3DConeSettings(
+  out float insideconeangle,
+  out float outsideconeangle,
+  out float outsidevolume
+);
+
+ +
Sound.get3DConeSettings(
+  insideconeangle,
+  outsideconeangle,
+  outsidevolume
+);
+
+ +
+
insideconeangle OutOpt
+
+

Inside cone angle. This is the angle within which the sound is unattenuated.

+
    +
  • Units: Degrees
  • +
  • Range: [0, outsideconeangle]
  • +
  • Default: 360
  • +
+
+
outsideconeangle OutOpt
+
+

Outside cone angle. This is the angle outside of which the sound is attenuated to its outside volume.

+
    +
  • Units: Degrees
  • +
  • Range: [insideconeangle, 360]
  • +
  • Default: 360
  • +
+
+
outsidevolume OutOpt
+
+

Cone outside volume.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

See Also: Sound::set3DConeSettings

+

Sound::get3DCustomRolloff

+

Retrieves the current custom roll-off shape for 3D distance attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::get3DCustomRolloff(
+  FMOD_VECTOR **points,
+  int *numpoints
+);
+
+ +
FMOD_RESULT FMOD_Sound_Get3DCustomRolloff(
+  FMOD_SOUND *sound,
+  FMOD_VECTOR **points,
+  int *numpoints
+);
+
+ +
RESULT Sound.get3DCustomRolloff(
+  out IntPtr points,
+  out int numpoints
+);
+
+ +
Sound.get3DCustomRolloff(
+  points,
+  numpoints
+);
+
+ +
+
points OutOpt
+
Array of points sorted by distance where x = distance and y = volume from 0 to 1. (FMOD_VECTOR)
+
numpoints OutOpt
+
Number of points.
+
+

See Also: Sound::set3DCustomRolloff

+

Sound::get3DMinMaxDistance

+

Retrieve the minimum and maximum audible distance for a 3D sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::get3DMinMaxDistance(
+  float *min,
+  float *max
+);
+
+ +
FMOD_RESULT FMOD_Sound_Get3DMinMaxDistance(
+  FMOD_SOUND *sound,
+  float *min,
+  float *max
+);
+
+ +
RESULT Sound.get3DMinMaxDistance(
+  out float min,
+  out float max
+);
+
+ +
Sound.get3DMinMaxDistance(
+  min,
+  max
+);
+
+ +
+
min OutOpt
+
+

Minimum volume distance for the sound.

+ +
+
max OutOpt
+
+

Maximum volume distance for the sound.

+ +
+
+

See Also: Sound::set3DMinMaxDistance

+

Sound::getDefaults

+

Retrieves a sound's default playback attributes.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getDefaults(
+  float *frequency,
+  int *priority
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetDefaults(
+  FMOD_SOUND *sound,
+  float *frequency,
+  int *priority
+);
+
+ +
RESULT Sound.getDefaults(
+  out float frequency,
+  out int priority
+);
+
+ +
Sound.getDefaults(
+  frequency,
+  priority
+);
+
+ +
+
frequency OutOpt
+
+

Default playback frequency.

+
    +
  • Units: Hertz
  • +
  • Default: 48000
  • +
+
+
priority OutOpt
+
+

Default priority where 0 is the highest priority.

+
    +
  • Range: [0, 256]
  • +
  • Default: 128
  • +
+
+
+

See Also: Sound::setDefaults

+

Sound::getFormat

+

Returns format information about the sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getFormat(
+  FMOD_SOUND_TYPE *type,
+  FMOD_SOUND_FORMAT *format,
+  int *channels,
+  int *bits
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetFormat(
+  FMOD_SOUND *sound,
+  FMOD_SOUND_TYPE *type,
+  FMOD_SOUND_FORMAT *format,
+  int *channels,
+  int *bits
+);
+
+ +
RESULT Sound.getFormat(
+  out SOUND_TYPE type,
+  out SOUND_FORMAT format,
+  out int channels,
+  out int bits
+);
+
+ +
Sound.getFormat(
+  type,
+  format,
+  channels,
+  bits
+);
+
+ +
+
type OutOpt
+
Type of sound. (FMOD_SOUND_TYPE)
+
format OutOpt
+
Format of the sound. (FMOD_SOUND_FORMAT)
+
channels OutOpt
+
Number of channels.
+
bits OutOpt
+
Number of bits per sample, corresponding to format.
+
+

Sound::getLength

+

Retrieves the length using the specified time unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getLength(
+  unsigned int *length,
+  FMOD_TIMEUNIT lengthtype
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetLength(
+  FMOD_SOUND *sound,
+  unsigned int *length,
+  FMOD_TIMEUNIT lengthtype
+);
+
+ +
RESULT Sound.getLength(
+  out uint length,
+  TIMEUNIT lengthtype
+);
+
+ +
Sound.getLength(
+  length,
+  lengthtype
+);
+
+ +
+
length Out
+
Sound length in units specified by lengthtype.
+
lengthtype
+
Time unit type to retrieve into length. (FMOD_TIMEUNIT)
+
+

lengthtype must be valid for the file format. For example, an MP3 file does not support FMOD_TIMEUNIT_MODORDER.

+

A length of 0xFFFFFFFF means it is of unlimited length, such as an internet radio stream or MOD/S3M/XM/IT file which may loop forever.

+

Note: Using a VBR (Variable Bit Rate) source that does not have metadata containing its accurate length (such as un-tagged MP3 or MOD/S3M/XM/IT) may return inaccurate length values.
+For these formats, use FMOD_ACCURATETIME when creating the sound. This will cause a slight delay and memory increase, as FMOD will scan the whole during creation to find the correct length. This flag also creates a seek table to enable sample accurate seeking.

+

See Also: System::createSound

+

Sound::getLoopCount

+

Retrieves the sound's loop count.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getLoopCount(
+  int *loopcount
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetLoopCount(
+  FMOD_SOUND *sound,
+  int *loopcount
+);
+
+ +
RESULT Sound.getLoopCount(
+  out int loopcount
+);
+
+ +
Sound.getLoopCount(
+  loopcount
+);
+
+ +
+
loopcount Out
+
+

Number of times to loop before final playback where -1 is always loop. 0 means no loop.

+
    +
  • Range: [-1, inf)
  • +
  • Default: -1
  • +
+
+
+

Unlike the Channel loop count function, this function simply returns the value set with Sound::setLoopCount. It does not decrement as it plays (especially seeing as one sound can be played multiple times).

+

See Also: Sound::setLoopCount, Channel::setLoopCount

+

Sound::getLoopPoints

+

Retrieves the loop points for a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getLoopPoints(
+  unsigned int *loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int *loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetLoopPoints(
+  FMOD_SOUND *sound,
+  unsigned int *loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int *loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
RESULT Sound.getLoopPoints(
+  out uint loopstart,
+  TIMEUNIT loopstarttype,
+  out uint loopend,
+  TIMEUNIT loopendtype
+);
+
+ +
Sound.getLoopPoints(
+  loopstart,
+  loopstarttype,
+  loopend,
+  loopendtype
+);
+
+ +
+
loopstart OutOpt
+
Loop start point.
+
loopstarttype
+
Time format of loopstart. (FMOD_TIMEUNIT)
+
loopend OutOpt
+
Loop end point.
+
loopendtype
+
Time format of loopend. (FMOD_TIMEUNIT)
+
+

The values from loopstart and loopend are inclusive, which means these positions will be played.

+

See Also: Sound::setLoopPoints

+

Sound::getMode

+

Retrieves the mode of a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getMode(
+  FMOD_MODE *mode
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetMode(
+  FMOD_SOUND *sound,
+  FMOD_MODE *mode
+);
+
+ +
RESULT Sound.getMode(
+  out MODE mode
+);
+
+ +
Sound.getMode(
+  mode
+);
+
+ +
+
mode Out
+
Current mode. (FMOD_MODE)
+
+

The mode will be dependent on the mode set by a call to System::createSound, System::createStream or Sound::setMode.

+

See Also: ChannelControl::setMode, ChannelControl::getMode

+

Sound::getMusicChannelVolume

+

Retrieves the volume of a MOD/S3M/XM/IT/MIDI music channel volume.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getMusicChannelVolume(
+  int channel,
+  float *volume
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetMusicChannelVolume(
+  FMOD_SOUND *sound,
+  int channel,
+  float *volume
+);
+
+ +
RESULT Sound.getMusicChannelVolume(
+  int channel,
+  out float volume
+);
+
+ +
Sound.getMusicChannelVolume(
+  channel,
+  volume
+);
+
+ +
+
channel
+
MOD/S3M/XM/IT/MIDI music subchannel to retrieve the volume for.
+
volume Out
+
+

Volume of the channel.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

See Also: Sound::setMusicChannelVolume

+

Sound::getMusicNumChannels

+

Gets the number of music channels inside a MOD/S3M/XM/IT/MIDI file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getMusicNumChannels(
+  int *numchannels
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetMusicNumChannels(
+  FMOD_SOUND *sound,
+  int *numchannels
+);
+
+ +
RESULT Sound.getMusicNumChannels(
+  out int numchannels
+);
+
+ +
Sound.getMusicNumChannels(
+  numchannels
+);
+
+ +
+
numchannels Out
+
Number of music channels used in the song.
+
+

See Also: Sound::setMusicChannelVolume, Sound::getMusicChannelVolume

+

Sound::getMusicSpeed

+

Gets the relative speed of MOD/S3M/XM/IT/MIDI music.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getMusicSpeed(
+  float *speed
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetMusicSpeed(
+  FMOD_SOUND *sound,
+  float *speed
+);
+
+ +
RESULT Sound.getMusicSpeed(
+  out float speed
+);
+
+ +
Sound.getMusicSpeed(
+  speed
+);
+
+ +
+
speed Out
+
Speed of the song.
+
+

See Also: Sound::setMusicSpeed

+

Sound::getName

+

Retrieves the name of a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getName(
+  char *name,
+  int namelen
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetName(
+  FMOD_SOUND *sound,
+  char *name,
+  int namelen
+);
+
+ +
RESULT Sound.getName(
+  out string name,
+  int namelen
+);
+
+ +
Sound.getName(
+  name
+);
+
+ +
+
name Out
+
Name of the sound. (UTF-8 string)
+
namelen
+
+

Length of buffer to receive name.

+
    +
  • Units: Bytes
  • +
+
+
+

if FMOD_LOWMEM has been specified in System::createSound, this function will return "(null)".

+

Sound::getNumSubSounds

+

Retrieves the number of subsounds stored within a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getNumSubSounds(
+  int *numsubsounds
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetNumSubSounds(
+  FMOD_SOUND *sound,
+  int *numsubsounds
+);
+
+ +
RESULT Sound.getNumSubSounds(
+  out int numsubsounds
+);
+
+ +
Sound.getNumSubSounds(
+  numsubsounds
+);
+
+ +
+
numsubsounds Out
+
Number of subsounds.
+
+

A format that has subsounds is a container format, such as FSB, DLS, MOD, S3M, XM, IT.

+

See Also: Sound::getSubSound

+

Sound::getNumSyncPoints

+

Retrieves the number of sync points stored within a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getNumSyncPoints(
+  int *numsyncpoints
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetNumSyncPoints(
+  FMOD_SOUND *sound,
+  int *numsyncpoints
+);
+
+ +
RESULT Sound.getNumSyncPoints(
+  out int numsyncpoints
+);
+
+ +
Sound.getNumSyncPoints(
+  numsyncpoints
+);
+
+ +
+
numsyncpoints Out
+
Number of sync points.
+
+

For for more information on sync points see Sync Points.

+

See Also: Sound::getSyncPoint, Sound::getSyncPointInfo, Sound::addSyncPoint, Sound::deleteSyncPoint

+

Sound::getNumTags

+

Retrieves the number of metadata tags.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getNumTags(
+  int *numtags,
+  int *numtagsupdated
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetNumTags(
+  FMOD_SOUND *sound,
+  int *numtags,
+  int *numtagsupdated
+);
+
+ +
RESULT Sound.getNumTags(
+  out int numtags,
+  out int numtagsupdated
+);
+
+ +
Sound.getNumTags(
+  numtags,
+  numtagsupdated
+);
+
+ +
+
numtags OutOpt
+
Number of tags.
+
numtagsupdated OutOpt
+
Number of tags updated since this function was last called.
+
+

'Tags' are metadata stored within a sound file. These can be things like a song's name, composer etc.

+

numtagsupdated could be periodically checked to see if new tags are available in certain circumstances. This might be the case with internet based streams (i.e. shoutcast or icecast) where the name of the song or other attributes might change.

+

See Also: Sound::getTag

+

Sound::getOpenState

+

Retrieves the state a sound is in after being opened with the non blocking flag, or the current state of the streaming buffer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getOpenState(
+  FMOD_OPENSTATE *openstate,
+  unsigned int *percentbuffered,
+  bool *starving,
+  bool *diskbusy
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetOpenState(
+  FMOD_SOUND *sound,
+  FMOD_OPENSTATE *openstate,
+  unsigned int *percentbuffered,
+  FMOD_BOOL *starving,
+  FMOD_BOOL *diskbusy
+);
+
+ +
RESULT Sound.getOpenState(
+  out OPENSTATE openstate,
+  out uint percentbuffered,
+  out bool starving,
+  out bool diskbusy
+);
+
+ +
Sound.getOpenState(
+  openstate,
+  percentbuffered,
+  starving,
+  diskbusy
+);
+
+ +
+
openstate OutOpt
+
Open state of a sound. (FMOD_OPENSTATE)
+
percentbuffered OutOpt
+
+

Filled percentage of a stream's file buffer.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
starving OutOpt
+
+

Starving state. true if a stream has decoded more than the stream file buffer has ready.

+
    +
  • Units: Boolean
  • +
+
+
diskbusy OutOpt
+
+

Disk is currently being accessed for this sound.

+
    +
  • Units: Boolean
  • +
+
+
+

When a sound is opened with FMOD_NONBLOCKING, it is opened and prepared in the background, or asynchronously. This allows the main application to execute without stalling on audio loads.
+This function will describe the state of the asynchronous load routine i.e. whether it has succeeded, failed or is still in progress.

+

If 'starving' is true, then you will most likely hear a stuttering/repeating sound as the decode buffer loops on itself and replays old data.
+With the ability to detect stream starvation, muting the sound with ChannelControl::setMute will keep the stream quiet until it is not starving any more.

+

Note: Always check 'openstate' to determine the state of the sound. Do not assume that if this function returns FMOD_OK then the sound has finished loading.

+

See Also: FMOD_MODE

+

Sound::getSoundGroup

+

Retrieves the sound's current sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getSoundGroup(
+  SoundGroup **soundgroup
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetSoundGroup(
+  FMOD_SOUND *sound,
+  FMOD_SOUNDGROUP **soundgroup
+);
+
+ +
RESULT Sound.getSoundGroup(
+  out SoundGroup soundgroup
+);
+
+ +
Sound.getSoundGroup(
+  soundgroup
+);
+
+ +
+
soundgroup Out
+
Sound's current sound group. (SoundGroup)
+
+

See Also: Sound::setSoundGroup, System::getMasterSoundGroup

+

Sound::getSubSound

+

Retrieves a handle to a Sound object that is contained within the parent sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getSubSound(
+  int index,
+  Sound **subsound
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetSubSound(
+  FMOD_SOUND *sound,
+  int index,
+  FMOD_SOUND **subsound
+);
+
+ +
RESULT Sound.getSubSound(
+  int index,
+  out Sound subsound
+);
+
+ +
Sound.getSubSound(
+  index,
+  subsound
+);
+
+ +
+
index
+
+

Index of the subsound.

+ +
+
subsound Out
+
Subsound object. (Sound)
+
+

If the sound is a stream and FMOD_NONBLOCKING was not used, then this call will perform a blocking seek/flush to the specified subsound.

+

If FMOD_NONBLOCKING was used to open this sound and the sound is a stream, FMOD will do a non blocking seek/flush and set the state of the subsound to FMOD_OPENSTATE_SEEKING.

+

The sound won't be ready to be used when FMOD_NONBLOCKING is used, until the state of the sound becomes FMOD_OPENSTATE_READY or FMOD_OPENSTATE_ERROR.

+

See Also: Sound::getSubSoundParent, System::createSound

+

Sound::getSubSoundParent

+

Retrieves the parent Sound object that contains this subsound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getSubSoundParent(
+  Sound **parentsound
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetSubSoundParent(
+  FMOD_SOUND *sound,
+  FMOD_SOUND **parentsound
+);
+
+ +
RESULT Sound.getSubSoundParent(
+  out Sound parentsound
+);
+
+ +
Sound.getSubSoundParent(
+  parentsound
+);
+
+ +
+
parentsound Out
+
Parent sound object. (Sound)
+
+

If the sound is not a subsound, the parentsound will be null.

+

See Also: Sound::getNumSubSounds, Sound::getSubSound

+

Sound::getSyncPoint

+

Retrieve a sync point.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getSyncPoint(
+  int index,
+  FMOD_SYNCPOINT **point
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetSyncPoint(
+  FMOD_SOUND *sound,
+  int index,
+  FMOD_SYNCPOINT **point
+);
+
+ +
RESULT Sound.getSyncPoint(
+  int index,
+  out IntPtr point
+);
+
+ +
Sound.getSyncPoint(
+  index,
+  point
+);
+
+ +
+
index
+
+

Index of the sync point.

+ +
+
point Out
+
Sync point. (FMOD_SYNCPOINT)
+
+

For for more information on sync points see Sync Points.

+

See Also: Sound::getNumSyncPoints, Sound::getSyncPointInfo, Sound::addSyncPoint, Sound::deleteSyncPoint

+

Sound::getSyncPointInfo

+

Retrieves information on an embedded sync point.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getSyncPointInfo(
+  FMOD_SYNCPOINT *point,
+  char *name,
+  int namelen,
+  unsigned int *offset,
+  FMOD_TIMEUNIT offsettype
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetSyncPointInfo(
+  FMOD_SOUND *sound,
+  FMOD_SYNCPOINT *point,
+  char *name,
+  int namelen,
+  unsigned int *offset,
+  FMOD_TIMEUNIT offsettype
+);
+
+ +
RESULT Sound.getSyncPointInfo(
+  IntPtr point,
+  out string name,
+  int namelen,
+  out uint offset,
+  TIMEUNIT offsettype
+);
+
+ +
Sound.getSyncPointInfo(
+  point,
+  name,
+  namelen,
+  offset,
+  offsettype
+);
+
+ +
+
point
+
Sync point. (FMOD_SYNCPOINT)
+
name OutOpt
+
Name of the syncpoint. (UTF-8 string)
+
namelen
+
+

Size of name.

+
    +
  • Units: Bytes
  • +
+
+
offset OutOpt
+
Offset of the syncpoint.
+
offsettype
+
Format of offset. (FMOD_TIMEUNIT)
+
+

For for more information on sync points see Sync Points.

+

See Also: Sound::getNumSyncPoints, Sound::getSyncPoint, Sound::addSyncPoint, Sound::deleteSyncPoint

+

Sound::getSystemObject

+

Retrieves the parent System object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getSystemObject(
+  System **system
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetSystemObject(
+  FMOD_SOUND *sound,
+  FMOD_SYSTEM **system
+);
+
+ +
RESULT Sound.getSystemObject(
+  out System system
+);
+
+ +
Sound.getSystemObject(
+  system
+);
+
+ +
+
system Out
+
System object. (System)
+
+

See Also: System::createSound

+

Sound::getTag

+

Retrieves a metadata tag.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getTag(
+  const char *name,
+  int index,
+  FMOD_TAG *tag
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetTag(
+  FMOD_SOUND *sound,
+  const char *name,
+  int index,
+  FMOD_TAG *tag
+);
+
+ +
RESULT Sound.getTag(
+  string name,
+  int index,
+  out TAG tag
+);
+
+ +
Sound.getTag(
+  name,
+  index,
+  tag
+);
+
+ +
+
name
+
Name of a type of tag to retrieve. (UTF-8 string). Specify null to retrieve all types of tags.
+
index Opt
+
+

Index into the tag list as restricted by name.

+ +
+
tag Out
+
Tag info structure. (FMOD_TAG)
+
+

'Tags' are metadata stored within a sound file. These can be things like a song's name, composer etc.

+

The number of tags available can be found with Sound::getNumTags.

+

The way to display or retrieve tags can be done in 3 different ways:

+
    +
  • All tags can be continuously retrieved by looping from 0 to the numtags value in Sound::getNumTags - 1. Updated tags will refresh automatically, and the 'updated' member of the FMOD_TAG structure will be set to true if a tag has been updated, due to something like a netstream changing the song name for example.
  • +
  • Tags can be retrieved by specifying -1 as the index and only updating tags that are returned. If all tags are retrieved and this function is called the function will return an error of FMOD_ERR_TAGNOTFOUND.
  • +
  • Specific tags can be retrieved by specifying a name parameter. The index can be 0 based or -1 in the same fashion as described previously.
  • +
+

Note with netstreams an important consideration must be made between songs, a tag may occur that changes the playback rate of the song. It is up to the user to catch this and reset the playback rate with Channel::setFrequency.
+A sample rate change will be signalled with a tag of type FMOD_TAGTYPE_FMOD.

+
  FMOD_TAG tag;
+  while (FMOD_Sound_GetTag(sound, 0, -1, &tag) == FMOD_OK)
+  {
+    if (tag.type == FMOD_TAGTYPE_FMOD)
+    {
+        /* When a song changes, the sample rate may also change, so compensate here. */
+        if (!strcmp(tag.name, "Sample Rate Change") && channel)
+        {
+            float frequency = *((float *)tag.data);
+
+            result = FMOD_Channel_SetFrequency(channel, frequency);
+            ERRCHECK(result);
+        }
+    }
+  }
+
+ +
  FMOD_TAG tag;
+  while (sound->getTag(0, -1, &tag) == FMOD_OK)
+  {
+    if (tag.type == FMOD_TAGTYPE_FMOD)
+    {
+        /* When a song changes, the sample rate may also change, so compensate here. */
+        if (!strcmp(tag.name, "Sample Rate Change") && channel)
+        {
+            float frequency = *((float *)tag.data);
+
+            result = channel->setFrequency(frequency);
+            ERRCHECK(result);
+        }
+    }
+  }
+
+ +

Sound::getUserData

+

Retrieves a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Sound_GetUserData(
+  FMOD_SOUND *sound,
+  void **userdata
+);
+
+ +
RESULT Sound.getUserData(
+  out IntPtr userdata
+);
+
+ +
Sound.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling Sound::setUserData
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

Sound::lock

+

Gives access to a portion or all the sample data of a sound for direct manipulation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::lock(
+  unsigned int offset,
+  unsigned int length,
+  void **ptr1,
+  void **ptr2,
+  unsigned int *len1,
+  unsigned int *len2
+);
+
+ +
FMOD_RESULT FMOD_Sound_Lock(
+  FMOD_SOUND *sound,
+  unsigned int offset,
+  unsigned int length,
+  void **ptr1,
+  void **ptr2,
+  unsigned int *len1,
+  unsigned int *len2
+);
+
+ +
RESULT Sound.lock(
+  uint offset,
+  uint length,
+  out IntPtr ptr1,
+  out IntPtr ptr2,
+  out uint len1,
+  out uint len2
+);
+
+ +
Sound.lock(
+  offset,
+  length,
+  ptr1,
+  ptr2,
+  len1,
+  len2
+);
+
+ +
+
offset
+
+

Offset into the sound's buffer to be retrieved.

+
    +
  • Units: Bytes
  • +
+
+
length
+
+

Length of the data required to be retrieved. If offset + length exceeds the length of the sample buffer, ptr2 and len2 will be valid.

+
    +
  • Units: Bytes
  • +
+
+
ptr1 Out
+
+

First part of the locked data.

+ +
+
ptr2 Out
+
+

Second part of the locked data if the offset + length has exceeded the length of the sample buffer.

+ +
+
len1 Out
+
+

Length of ptr1.

+
    +
  • Units: Bytes
  • +
+
+
len2 Out
+
+

Length of ptr2

+
    +
  • Units: Bytes
  • +
+
+
+

You must always unlock the data again after you have finished with it, using Sound::unlock.

+

With this function you get access to the raw audio data. If the data is 8, 16, 24 or 32bit PCM data, mono or stereo data, you must take this into consideration when processing the data. See Sample Data for more information.

+

If the sound is created with FMOD_CREATECOMPRESSEDSAMPLE the data retrieved will be the compressed bitstream.

+

It is not possible to lock the following:

+ +

The names 'lock'/'unlock' are a legacy reference to older Operating System APIs that used to cause a mutex lock on the data, so that it could not be written to while the 'lock' was in place. This is no longer the case with FMOD and data can be 'locked' multiple times from different places/threads at once.

+

See Also: System::createSound

+

FMOD_SOUND_NONBLOCK_CALLBACK

+

Callback to be called when a sound has finished loading, or a non blocking seek is occuring.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_SOUND_NONBLOCK_CALLBACK(
+  FMOD_SOUND *sound,
+  FMOD_RESULT result
+);
+
+ +
delegate RESULT SOUND_NONBLOCKCALLBACK(
+  IntPtr sound,
+  RESULT result
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
sound
+
Sound. (Sound)
+
result
+
Error code. (FMOD_RESULT)
+
+

Invoked by:

+ +

Return code currently ignored.

+

Note that for non blocking streams a seek could occur when restarting the sound after the first playthrough. This will result in a callback being triggered again.

+

Since this callback can occur from the async thread, there are restrictions about what functions can be called during the callback. All Sound functions are safe to call, except for Sound::setSoundGroup and Sound::release. It is also safe to call System::getUserData. The rest of the Core API and the Studio API is not allowed. Calling a non-allowed function will return FMOD_ERR_INVALID_THREAD.

+
+

sound can be cast to Sound *.

+
+

See Also: FMOD_CREATESOUNDEXINFO

+

FMOD_SOUND_PCMREAD_CALLBACK

+

Read callback used for user created sounds or to intercept FMOD's decoder during a normal sound open.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_SOUND_PCMREAD_CALLBACK(
+  FMOD_SOUND *sound,
+  void *data,
+  unsigned int datalen
+);
+
+ +
delegate RESULT SOUND_PCMREADCALLBACK(
+  IntPtr sound,
+  IntPtr data,
+  uint datalen
+);
+
+ +
function FMOD_SOUND_PCMREAD_CALLBACK(
+  sound,
+  data,
+  datalen
+)
+
+ +
+
sound
+
Sound. (Sound)
+
data
+
PCM data that the user can either read or write to.
+
+ +
+
datalen
+
+

Length of the data.

+
    +
  • Units: Bytes
  • +
+
+
+

Invoked by:

+ +

Use cases:

+
    +
  • A FMOD_OPENUSER sound. The callback is used to write PCM data to a user created sound when requested.
  • +
  • During a normal System::createsound or System::createStream, the read callback will be issued with decoded pcm data, allowing it to be manipulated or copied somewhere else. The return value is ignored.
  • +
+

The format of the sound can be retrieved with Sound::getFormat from this callback. This will allow the user to determine what type of pointer to use if they are not sure what format the sound is.

+
+

sound can be cast to Sound *.

+
+

See Also: FMOD_SOUND_PCMSETPOS_CALLBACK, FMOD_CREATESOUNDEXINFO

+

FMOD_SOUND_PCMSETPOS_CALLBACK

+

Set position callback for user created sounds or to intercept FMOD's decoder during an API setPositon call.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_SOUND_PCMSETPOS_CALLBACK(
+  FMOD_SOUND *sound,
+  int subsound,
+  unsigned int position,
+  FMOD_TIMEUNIT postype
+);
+
+ +
delegate RESULT SOUND_PCMSETPOSCALLBACK(
+  IntPtr sound,
+  int subsound,
+  uint position,
+  TIMEUNIT postype
+);
+
+ +
function FMOD_SOUND_PCMSETPOS_CALLBACK(
+  sound,
+  subsound,
+  position,
+  postype
+)
+
+ +
+
sound
+
Sound. (Sound)
+
subsound
+
In a multi subsound type sound (ie .FSB or .DLS), this will contain the index into the list of sounds.
+
position
+
Requested seek position.
+
postype
+
+

position type, or FMOD_ERR_FORMAT if the sound is a user created sound and the seek type is unsupported. (FMOD_TIMEUNIT)

+ +
+
+

Invoked by:

+ +

Use cases:

+ +
+

sound can be cast to Sound *.

+
+

See Also: FMOD_SOUND_PCMREAD_CALLBACK, FMOD_CREATESOUNDEXINFO

+

Sound::readData

+

Reads data from an opened sound to a specified buffer, using FMOD's internal codecs.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::readData(
+  void *buffer,
+  unsigned int length,
+  unsigned int *read
+);
+
+ +
FMOD_RESULT FMOD_Sound_ReadData(
+  FMOD_SOUND *sound,
+  void *buffer,
+  unsigned int length,
+  unsigned int *read
+);
+
+ +
RESULT Sound.readData(
+  byte[] buffer
+);
+RESULT Sound.readData(
+  byte[] buffer,
+  out uint read
+);
+
+ +
Sound.readData(
+  buffer,
+  length,
+  read
+);
+
+ +
+
buffer
+
+

Buffer to read decoded data into.

+ +
+
length
+
+

Amount of data to read into buffer.

+
    +
  • Units: Bytes
  • +
+
+
read OutOpt
+
+

Actual amount of data read. May differ to length.

+
    +
  • Units: Bytes
  • +
+
+
+

This can be used for decoding data offline in small pieces (or big pieces), rather than playing and capturing it, or loading the whole file at once and having to Sound::lock / Sound::unlock the data.

+

If too much data is read, it is possible FMOD_ERR_FILE_EOF will be returned, meaning it is out of data. The 'read' parameter will reflect this by returning a smaller number of bytes read than was requested.

+

As a non streaming sound reads and decodes the whole file then closes it upon calling System::createSound, Sound::readData will then not work because the file handle is closed. Use FMOD_OPENONLY to stop FMOD reading/decoding the file.
+If FMOD_OPENONLY flag is used when opening a sound, it will leave the file handle open, and FMOD will not read/decode any data internally, so the read cursor will stay at position 0. This will allow the user to read the data from the start.

+

For streams, the streaming engine will decode a small chunk of data and this will advance the read cursor. You need to either use FMOD_OPENONLY to stop the stream pre-buffering or call Sound::seekData to reset the read cursor back to the start of the file, otherwise it will appear as if the start of the stream is missing.
+Channel::setPosition will have the same result. These functions will flush the stream buffer and read in a chunk of audio internally. This is why if you want to read from an absolute position you should use Sound::seekData and not the previously mentioned functions.

+

If you are calling Sound::readData and Sound::seekData on a stream, information functions such as Channel::getPosition may give misleading results. Calling Channel::setPosition will cause the streaming engine to reset and flush the stream, leading to the time values returning to their correct position.

+

NOTE! Thread safety. If you call this from another stream callback, or any other thread besides the main thread, make sure to mutex the callback with Sound::release in case the sound is still being read from while releasing.

+

This function is thread safe to call from a stream callback or different thread as long as it doesnt conflict with a call to Sound::release.

+

See Also: Extracting PCM Data from a Sound, Sound::lock, Sound::unlock

+

Sound::release

+

Frees a sound object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::release();
+
+ +
FMOD_RESULT FMOD_Sound_Release(FMOD_SOUND *sound);
+
+ +
RESULT Sound.release();
+
+ +
Sound.release();
+
+ +

This will stop any instances of this sound, and free the sound object and its children if it is a multi-sound object.

+

If the sound was opened with FMOD_NONBLOCKING and hasn't finished opening yet, it will block. Additionally, if the sound is still playing or has recently been stopped, the release may stall, as the mixer may still be using the sound. Using Sound::getOpenState and checking the open state for FMOD_OPENSTATE_READY and FMOD_OPENSTATE_ERROR is a good way to avoid stalls.

+

See Also: System::createSound, Sound::getSubSound

+

Sound::seekData

+

Seeks a sound for use with data reading, using FMOD's internal codecs.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::seekData(
+  unsigned int pcm
+);
+
+ +
FMOD_RESULT FMOD_Sound_SeekData(
+  FMOD_SOUND *sound,
+  unsigned int pcm
+);
+
+ +
RESULT Sound.seekData(
+  uint pcm
+);
+
+ +
Sound.seekData(
+  pcm
+);
+
+ +
+
pcm
+
+

Seek Offset.

+
    +
  • Units: Samples
  • +
+
+
+

For use in conjunction with Sound::readData and FMOD_OPENONLY.

+

For streaming sounds, if this function is called, it will advance the internal file pointer but not update the streaming engine. This can lead to de-synchronization of position information for the stream and audible playback.

+

A stream can reset its stream buffer and position synchronization by calling Channel::setPosition. This causes reset and flush of the stream buffer.

+

Sound::set3DConeSettings

+

Sets the angles and attenuation levels of a 3D cone shape, for simulated occlusion which is based on direction.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::set3DConeSettings(
+  float insideconeangle,
+  float outsideconeangle,
+  float outsidevolume
+);
+
+ +
FMOD_RESULT FMOD_Sound_Set3DConeSettings(
+  FMOD_SOUND *sound,
+  float insideconeangle,
+  float outsideconeangle,
+  float outsidevolume
+);
+
+ +
RESULT Sound.set3DConeSettings(
+  float insideconeangle,
+  float outsideconeangle,
+  float outsidevolume
+);
+
+ +
Sound.set3DConeSettings(
+  insideconeangle,
+  outsideconeangle,
+  outsidevolume
+);
+
+ +
+
insideconeangle
+
+

Inside cone angle. This is the angle spread within which the sound is unattenuated.

+
    +
  • Units: Degrees
  • +
  • Range: [0, outsideconeangle]
  • +
  • Default: 360
  • +
+
+
outsideconeangle
+
+

Outside cone angle. This is the angle spread outside of which the sound is attenuated to its outsidevolume.

+
    +
  • Units: Degrees
  • +
  • Range: [insideconeangle, 360]
  • +
  • Default: 360
  • +
+
+
outsidevolume
+
+

Cone outside volume.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

When ChannelControl::set3DConeOrientation is used and a 3D 'cone' is set up, attenuation will automatically occur for a sound based on the relative angle of the direction the cone is facing, vs the angle between the sound and the listener.

+
    +
  • If the relative angle is within the insideconeangle, the sound will not have any attenuation applied.
  • +
  • If the relative angle is between the insideconeangle and outsideconeangle, linear volume attenuation (between 1 and outsidevolume) is applied between the two angles until it reaches the outsideconeangle.
  • +
  • If the relative angle is outside of the outsideconeangle the volume does not attenuate any further.
  • +
+

See Also: Sound::get3DConeSettings, ChannelControl::set3DConeSettings

+

Sound::set3DCustomRolloff

+

Sets a custom roll-off shape for 3D distance attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::set3DCustomRolloff(
+  FMOD_VECTOR *points,
+  int numpoints
+);
+
+ +
FMOD_RESULT FMOD_Sound_Set3DCustomRolloff(
+  FMOD_SOUND *sound,
+  FMOD_VECTOR *points,
+  int numpoints
+);
+
+ +
RESULT Sound.set3DCustomRolloff(
+  ref VECTOR points,
+  int numpoints
+);
+
+ +
Sound.set3DCustomRolloff(
+  points,
+  numpoints
+);
+
+ +
+
points
+
Array of points sorted by distance, where x = distance and y = volume from 0 to 1. z should be set to 0. Pass null or equivalent to disable custom roll-off. (FMOD_VECTOR)
+
numpoints
+
Number of points.
+
+

Must be used in conjunction with FMOD_3D_CUSTOMROLLOFF flag to be activated.

+

This function does not duplicate the memory for the points internally. The memory you pass to FMOD must remain valid while in use.

+

If FMOD_3D_CUSTOMROLLOFF is set and the roll-off shape is not set, FMOD will revert to FMOD_3D_INVERSEROLLOFF roll-off mode.

+

When a custom roll-off is specified a sound's 3D 'minimum' and 'maximum' distances are ignored.

+

The distance in-between point values is linearly interpolated until the final point where the last value is held.

+

If the points are not sorted by distance, an error will result.

+
// Defining a custom array of points
+FMOD_VECTOR curve[3] =
+{
+    { 0.0f,  1.0f, 0.0f },
+    { 2.0f,  0.2f, 0.0f },
+    { 20.0f, 0.0f, 0.0f }
+};
+
+ +

See Also: Sound::get3DCustomRolloff, ChannelControl::set3DCustomRolloff

+

Sound::set3DMinMaxDistance

+

Sets the minimum and maximum audible distance for a 3D sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::set3DMinMaxDistance(
+  float min,
+  float max
+);
+
+ +
FMOD_RESULT FMOD_Sound_Set3DMinMaxDistance(
+  FMOD_SOUND *sound,
+  float min,
+  float max
+);
+
+ +
RESULT Sound.set3DMinMaxDistance(
+  float min,
+  float max
+);
+
+ +
Sound.set3DMinMaxDistance(
+  min,
+  max
+);
+
+ +
+
min
+
+

The sound's minimum volume distance, or the distance that the sound has no attenuation due to 3d positioning.

+ +
+
max
+
+

The sound's maximum volume distance, or the distance that no additional attenuation will occur. See below for notes on different maxdistance behaviors.

+ +
+
+

The distances are meant to simulate the 'size' of a sound. Reducing the min distance will mean the sound appears smaller in the world, and in some modes makes the volume attenuate faster as the listener moves away from the sound.
+Increasing the min distance simulates a larger sound in the world, and in some modes makes the volume attenuate slower as the listener moves away from the sound.

+

max will affect attenuation differently based on roll-off mode set in the mode parameter of System::createSound, System::createStream, Sound::setMode or ChannelControl::setMode.

+

For these modes the volume will attenuate to 0 volume (silence), when the distance from the sound is equal to or further than the max distance:

+ +

For these modes the volume will stop attenuating at the point of the max distance, without affecting the rate of attenuation:

+ +

For this mode the max distance is ignored:

+ +

See Also: Sound::get3DMinMaxDistance, ChannelControl::set3DMinMaxDistance, ChannelControl::get3DMinMaxDistance, System::set3DSettings

+

Sound::setDefaults

+

Sets a sound's default playback attributes.

+

When the Sound is played it will use these values without having to specify them later on a per Channel basis.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setDefaults(
+  float frequency,
+  int priority
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetDefaults(
+  FMOD_SOUND *sound,
+  float frequency,
+  int priority
+);
+
+ +
RESULT Sound.setDefaults(
+  float frequency,
+  int priority
+);
+
+ +
Sound.setDefaults(
+  frequency,
+  priority
+);
+
+ +
+
frequency
+
+

Default playback frequency.

+
    +
  • Units: Hertz
  • +
  • Default: 48000
  • +
+
+
priority
+
+

Default priority where 0 is the highest priority.

+
    +
  • Range: [0, 256]
  • +
  • Default: 128
  • +
+
+
+

See Also: Sound::getDefaults, System::playSound, System::createSound

+

Sound::setLoopCount

+

Sets the sound to loop a specified number of times before stopping if the playback mode is set to looping.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setLoopCount(
+  int loopcount
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetLoopCount(
+  FMOD_SOUND *sound,
+  int loopcount
+);
+
+ +
RESULT Sound.setLoopCount(
+  int loopcount
+);
+
+ +
Sound.setLoopCount(
+  loopcount
+);
+
+ +
+
loopcount
+
+

Number of times to loop before final playback where -1 is always loop. 0 means no loop.

+
    +
  • Range: [-1, inf)
  • +
  • Default: -1
  • +
+
+
+

Changing loop count on an already buffered stream may not produced desired output. See Streaming Issues.

+

See Also: Sound::setLoopPoints, Sound::getLoopCount

+

Sound::setLoopPoints

+

Sets the loop points within a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setLoopPoints(
+  unsigned int loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetLoopPoints(
+  FMOD_SOUND *sound,
+  unsigned int loopstart,
+  FMOD_TIMEUNIT loopstarttype,
+  unsigned int loopend,
+  FMOD_TIMEUNIT loopendtype
+);
+
+ +
RESULT Sound.setLoopPoints(
+  uint loopstart,
+  TIMEUNIT loopstarttype,
+  uint loopend,
+  TIMEUNIT loopendtype
+);
+
+ +
Sound.setLoopPoints(
+  loopstart,
+  loopstarttype,
+  loopend,
+  loopendtype
+);
+
+ +
+
loopstart
+
+

Loop start point.

+
    +
  • Range: [0, loopend)
  • +
+
+
loopstarttype
+
Time format of loopstart. (FMOD_TIMEUNIT)
+
loopend
+
+

Loop end point.

+
    +
  • Range: [loopstart, Sound::getLength)
  • +
+
+
loopendtype
+
Time format of loopend. (FMOD_TIMEUNIT)
+
+

The values used for loopstart and loopend are inclusive, which means these positions will be played.

+

If a loopend is smaller or equal to loopstart an error will be returned. The same will happen for any values that are equal or greater than the length of the sound.

+

Changing loop points on an already buffered stream may not produced desired output. See Streaming Issues.

+

The Sound's mode must be set to FMOD_LOOP_NORMAL or FMOD_LOOP_BIDI for loop points to affect playback.

+

See Also: Sound::getLoopPoints, Sound::setLoopCount, Sound::setMode

+

Sound::setMode

+

Sets or alters the mode of a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setMode(
+  FMOD_MODE mode
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetMode(
+  FMOD_SOUND *sound,
+  FMOD_MODE mode
+);
+
+ +
RESULT Sound.setMode(
+  MODE mode
+);
+
+ +
Sound.setMode(
+  mode
+);
+
+ +
+
mode
+
+

Mode bits to set. (FMOD_MODE)

+ +
+
+

When calling this function, note that it will only take effect when the sound is played again with System::playSound.
+This is the default for when the sound next plays, not a mode that will suddenly change all currently playing instances of this sound.

+

Flags supported:

+ +

If FMOD_3D_IGNOREGEOMETRY is not specified, the flag will be cleared if it was specified previously.

+

Changing mode on an already buffered stream may not produced desired output. See Streaming Issues.

+

See Also: Streaming Issues, Sound::getMode, Sound::setLoopPoints, System::playSound

+

Sound::setMusicChannelVolume

+

Sets the volume of a MOD/S3M/XM/IT/MIDI music channel volume.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setMusicChannelVolume(
+  int channel,
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetMusicChannelVolume(
+  FMOD_SOUND *sound,
+  int channel,
+  float volume
+);
+
+ +
RESULT Sound.setMusicChannelVolume(
+  int channel,
+  float volume
+);
+
+ +
Sound.setMusicChannelVolume(
+  channel,
+  volume
+);
+
+ +
+
channel
+
MOD/S3M/XM/IT/MIDI music subchannel to set a linear volume for.
+
volume
+
+

Volume of the channel.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

See Also: Sound::getMusicNumChannels, Sound::getMusicChannelVolume

+

Sound::setMusicSpeed

+

Sets the relative speed of MOD/S3M/XM/IT/MIDI music.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setMusicSpeed(
+  float speed
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetMusicSpeed(
+  FMOD_SOUND *sound,
+  float speed
+);
+
+ +
RESULT Sound.setMusicSpeed(
+  float speed
+);
+
+ +
Sound.setMusicSpeed(
+  speed
+);
+
+ +
+
speed
+
+

Speed of the song.

+
    +
  • Units: Linear
  • +
  • Range: [0.01, 100]
  • +
  • Default: 1
  • +
+
+
+

See Also: Sound::getMusicSpeed

+

Sound::setSoundGroup

+

Moves the sound from its existing SoundGroup to the specified sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setSoundGroup(
+  SoundGroup *soundgroup
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetSoundGroup(
+  FMOD_SOUND *sound,
+  FMOD_SOUNDGROUP *soundgroup
+);
+
+ +
RESULT Sound.setSoundGroup(
+  SoundGroup soundgroup
+);
+
+ +
Sound.setSoundGroup(
+  soundgroup
+);
+
+ +
+
soundgroup
+
Sound group to move the sound to. (SoundGroup)
+
+

By default, a sound is located in the 'master sound group'. This can be retrieved with System::getMasterSoundGroup.

+

See Also: Sound::getSoundGroup, System::createSoundGroup, SoundGroup::setMaxAudible

+

Sound::setUserData

+

Sets a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Sound_SetUserData(
+  FMOD_SOUND *sound,
+  void *userdata
+);
+
+ +
RESULT Sound.setUserData(
+  IntPtr userdata
+);
+
+ +
Sound.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
Value stored on this object.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Sound::getUserData

+

FMOD_SOUND_TYPE

+

Recognized audio formats that can be loaded into a Sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_SOUND_TYPE {
+  FMOD_SOUND_TYPE_UNKNOWN,
+  FMOD_SOUND_TYPE_AIFF,
+  FMOD_SOUND_TYPE_ASF,
+  FMOD_SOUND_TYPE_DLS,
+  FMOD_SOUND_TYPE_FLAC,
+  FMOD_SOUND_TYPE_FSB,
+  FMOD_SOUND_TYPE_IT,
+  FMOD_SOUND_TYPE_MIDI,
+  FMOD_SOUND_TYPE_MOD,
+  FMOD_SOUND_TYPE_MPEG,
+  FMOD_SOUND_TYPE_OGGVORBIS,
+  FMOD_SOUND_TYPE_PLAYLIST,
+  FMOD_SOUND_TYPE_RAW,
+  FMOD_SOUND_TYPE_S3M,
+  FMOD_SOUND_TYPE_USER,
+  FMOD_SOUND_TYPE_WAV,
+  FMOD_SOUND_TYPE_XM,
+  FMOD_SOUND_TYPE_XMA,
+  FMOD_SOUND_TYPE_AUDIOQUEUE,
+  FMOD_SOUND_TYPE_AT9,
+  FMOD_SOUND_TYPE_VORBIS,
+  FMOD_SOUND_TYPE_MEDIA_FOUNDATION,
+  FMOD_SOUND_TYPE_MEDIACODEC,
+  FMOD_SOUND_TYPE_FADPCM,
+  FMOD_SOUND_TYPE_OPUS,
+  FMOD_SOUND_TYPE_MAX
+} FMOD_SOUND_TYPE;
+
+ +
enum SOUND_TYPE
+{
+  UNKNOWN,
+  AIFF,
+  ASF,
+  DLS,
+  FLAC,
+  FSB,
+  IT,
+  MIDI,
+  MOD,
+  MPEG,
+  OGGVORBIS,
+  PLAYLIST,
+  RAW,
+  S3M,
+  USER,
+  WAV,
+  XM,
+  XMA,
+  AUDIOQUEUE,
+  AT9,
+  VORBIS,
+  MEDIA_FOUNDATION,
+  MEDIACODEC,
+  FADPCM,
+  OPUS,
+  MAX,
+}
+
+ +
FMOD.SOUND_TYPE_UNKNOWN
+FMOD.SOUND_TYPE_AIFF
+FMOD.SOUND_TYPE_ASF
+FMOD.SOUND_TYPE_DLS
+FMOD.SOUND_TYPE_FLAC
+FMOD.SOUND_TYPE_FSB
+FMOD.SOUND_TYPE_IT
+FMOD.SOUND_TYPE_MIDI
+FMOD.SOUND_TYPE_MOD
+FMOD.SOUND_TYPE_MPEG
+FMOD.SOUND_TYPE_OGGVORBIS
+FMOD.SOUND_TYPE_PLAYLIST
+FMOD.SOUND_TYPE_RAW
+FMOD.SOUND_TYPE_S3M
+FMOD.SOUND_TYPE_USER
+FMOD.SOUND_TYPE_WAV
+FMOD.SOUND_TYPE_XM
+FMOD.SOUND_TYPE_XMA
+FMOD.SOUND_TYPE_AUDIOQUEUE
+FMOD.SOUND_TYPE_AT9
+FMOD.SOUND_TYPE_VORBIS
+FMOD.SOUND_TYPE_MEDIA_FOUNDATION
+FMOD.SOUND_TYPE_MEDIACODEC
+FMOD.SOUND_TYPE_FADPCM
+FMOD.SOUND_TYPE_OPUS
+FMOD.SOUND_TYPE_MAX
+
+ +
+
FMOD_SOUND_TYPE_UNKNOWN
+
Unknown or custom codec plug-in.
+
FMOD_SOUND_TYPE_AIFF
+
Audio Interchange File Format (.aif, .aiff). Uncompressed integer formats only.
+
FMOD_SOUND_TYPE_ASF
+
Microsoft Advanced Systems Format (.asf, .wma, .wmv). Platform provided decoder, available only on Windows.
+
FMOD_SOUND_TYPE_DLS
+
Downloadable Sound (.dls). Multi-sound bank format used by MIDI (.mid).
+
FMOD_SOUND_TYPE_FLAC
+
Free Lossless Audio Codec (.flac).
+
FMOD_SOUND_TYPE_FSB
+
FMOD Sample Bank (.fsb). Proprietary multi-sound bank format. Supported encodings: PCM16, FADPCM, Vorbis, AT9, XMA, Opus.
+
FMOD_SOUND_TYPE_IT
+
Impulse Tracker (.it).
+
FMOD_SOUND_TYPE_MIDI
+
Musical Instrument Digital Interface (.mid).
+
FMOD_SOUND_TYPE_MOD
+
Protracker / Fasttracker Module File (.mod).
+
FMOD_SOUND_TYPE_MPEG
+
Moving Picture Experts Group (.mp2, .mp3). Also supports .wav (RIFF) container format.
+
FMOD_SOUND_TYPE_OGGVORBIS
+
Ogg Vorbis (.ogg).
+
FMOD_SOUND_TYPE_PLAYLIST
+
Play list information container (.asx, .pls, .m3u, .wax). No audio, tags only.
+
FMOD_SOUND_TYPE_RAW
+
Raw uncompressed PCM data (.raw).
+
FMOD_SOUND_TYPE_S3M
+
ScreamTracker 3 Module (.s3m).
+
FMOD_SOUND_TYPE_USER
+
User created sound.
+
FMOD_SOUND_TYPE_WAV
+
Microsoft Waveform Audio File Format (.wav). Supported encodings: Uncompressed PCM, IMA ADPCM. Platform provided ACM decoder extensions, available only on Windows.
+
FMOD_SOUND_TYPE_XM
+
FastTracker 2 Extended Module (.xm).
+
FMOD_SOUND_TYPE_XMA
+
Microsoft XMA bit-stream supported by FSB (.fsb) container format. Platform provided decoder, available only on Xbox.
+
FMOD_SOUND_TYPE_AUDIOQUEUE
+
Apple Audio Queue decoder (.mp4, .m4a, .mp3). Supported encodings: AAC, ALAC, MP3. Platform provided decoder, available only on iOS / tvOS devices.
+
FMOD_SOUND_TYPE_AT9
+
Sony ATRAC9 bit-stream supported by FSB (.fsb) container format. Platform provided decoder, available only on PlayStation.
+
FMOD_SOUND_TYPE_VORBIS
+
Vorbis bit-stream supported by FSB (.fsb) container format.
+
FMOD_SOUND_TYPE_MEDIA_FOUNDATION
+
Microsoft Media Foundation decoder (.asf, .wma, .wmv, .mp4, .m4a). Platform provided decoder, available only on UWP.
+
FMOD_SOUND_TYPE_MEDIACODEC
+
Google Media Codec decoder (.m4a, .mp4). Platform provided decoder, available only on Android.
+
FMOD_SOUND_TYPE_FADPCM
+
FMOD Adaptive Differential Pulse Code Modulation bit-stream supported by FSB (.fsb) container format.
+
FMOD_SOUND_TYPE_OPUS
+
Opus bit-stream supported by FSB (.fsb) container format. Platform provided decoder, available only on Xbox Series X|S, PS5, and Switch.
+
FMOD_SOUND_TYPE_MAX
+
Maximum number of sound types supported.
+
+

See Also: Sound::getFormat

+

Sound::unlock

+

Finalizes a previous sample data lock and submits it back to the Sound object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Sound::unlock(
+  void *ptr1,
+  void *ptr2,
+  unsigned int len1,
+  unsigned int len2
+);
+
+ +
FMOD_RESULT FMOD_Sound_Unlock(
+  FMOD_SOUND *sound,
+  void *ptr1,
+  void *ptr2,
+  unsigned int len1,
+  unsigned int len2
+);
+
+ +
RESULT Sound.unlock(
+  IntPtr ptr1,
+  IntPtr ptr2,
+  uint len1,
+  uint len2
+);
+
+ +
Sound.unlock(
+  ptr1,
+  ptr2,
+  len1,
+  len2
+);
+
+ +
+
ptr1
+
+

First part of the locked data.

+ +
+
ptr2
+
+

Second part of the locked data.

+ +
+
len1
+
+

Length of ptr1.

+
    +
  • Units: Bytes
  • +
+
+
len2
+
+

Length of ptr2

+
    +
  • Units: Bytes
  • +
+
+
+

The data being 'unlocked' must first have been locked with Sound::lock.

+

If an unlock is not performed on PCM data, then sample loops may produce audible clicks.

+

The names 'lock'/'unlock' are a legacy reference to older Operating System APIs that used to cause a mutex lock on the data, so that it could not be written to while the 'lock' was in place. This is no longer the case with FMOD and data can be 'locked' multiple times from different places/threads at once.

+

See Also: Sound::lock

+

FMOD_TAG

+

Tag data / metadata description.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_TAG {
+  FMOD_TAGTYPE       type;
+  FMOD_TAGDATATYPE   datatype;
+  char              *name;
+  void              *data;
+  unsigned int       datalen;
+  FMOD_BOOL          updated;
+} FMOD_TAG;
+
+ +
struct TAG
+{
+  TAGTYPE           type;
+  TAGDATATYPE       datatype;
+  StringWrapper     name;
+  IntPtr            data;
+  uint              datalen;
+  bool              updated;
+}
+
+ +
FMOD_TAG
+{
+  type,
+  datatype,
+  data,
+  datalen,
+  updated,
+};
+
+ +
+
type R/O
+
Tag type. (FMOD_TAGTYPE)
+
datatype R/O
+
Tag data type. (FMOD_TAGDATATYPE)
+
name R/O
+
Name.
+
data R/O
+
Tag data.
+
datalen R/O
+
Size of data. +* Units: Bytes
+
updated R/O
+
+

True if this tag has been updated since last being accessed with Sound::getTag

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Sound::getTag

+

FMOD_TAGDATATYPE

+

List of tag data / metadata types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_TAGDATATYPE {
+  FMOD_TAGDATATYPE_BINARY,
+  FMOD_TAGDATATYPE_INT,
+  FMOD_TAGDATATYPE_FLOAT,
+  FMOD_TAGDATATYPE_STRING,
+  FMOD_TAGDATATYPE_STRING_UTF16,
+  FMOD_TAGDATATYPE_STRING_UTF16BE,
+  FMOD_TAGDATATYPE_STRING_UTF8,
+  FMOD_TAGDATATYPE_MAX
+} FMOD_TAGDATATYPE;
+
+ +
enum TAGDATATYPE : int
+{
+  BINARY,
+  INT,
+  FLOAT,
+  STRING,
+  STRING_UTF16,
+  STRING_UTF16BE,
+  STRING_UTF8,
+  MAX
+}
+
+ +
FMOD.TAGDATATYPE_BINARY
+FMOD.TAGDATATYPE_INT
+FMOD.TAGDATATYPE_FLOAT
+FMOD.TAGDATATYPE_STRING
+FMOD.TAGDATATYPE_STRING_UTF16
+FMOD.TAGDATATYPE_STRING_UTF16BE
+FMOD.TAGDATATYPE_STRING_UTF8
+FMOD.TAGDATATYPE_MAX
+
+ +
+
FMOD_TAGDATATYPE_BINARY
+
Raw binary data. see FMOD_TAG structure for length of data in bytes.
+
FMOD_TAGDATATYPE_INT
+
Integer - Note this integer could be 8bit / 16bit / 32bit / 64bit. See FMOD_TAG structure for integer size (1 vs 2 vs 4 vs 8 bytes).
+
FMOD_TAGDATATYPE_FLOAT
+
IEEE floating point number. See FMOD_TAG structure to confirm if the float data is 32bit or 64bit (4 vs 8 bytes).
+
FMOD_TAGDATATYPE_STRING
+
8bit ASCII char string. See FMOD_TAG structure for string length in bytes.
+
FMOD_TAGDATATYPE_STRING_UTF16
+
16bit UTF string. Assume little endian byte order. See FMOD_TAG structure for string length in bytes.
+
FMOD_TAGDATATYPE_STRING_UTF16BE
+
16bit UTF string Big endian byte order. See FMOD_TAG structure for string length in bytes.
+
FMOD_TAGDATATYPE_STRING_UTF8
+
8 bit UTF string. See FMOD_TAG structure for string length in bytes.
+
FMOD_TAGDATATYPE_MAX
+
Maximum number of tag datatypes supported.
+
+

See FMOD_TAG structure for tag length in bytes.

+

See Also: Sound::getTag, FMOD_TAGTYPE, FMOD_TAG

+

FMOD_TAGTYPE

+

List of tag data / metadata types that could be stored within a sound. These include id3 tags, metadata from netstreams and vorbis/asf data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_TAGTYPE {
+  FMOD_TAGTYPE_UNKNOWN,
+  FMOD_TAGTYPE_ID3V1,
+  FMOD_TAGTYPE_ID3V2,
+  FMOD_TAGTYPE_VORBISCOMMENT,
+  FMOD_TAGTYPE_SHOUTCAST,
+  FMOD_TAGTYPE_ICECAST,
+  FMOD_TAGTYPE_ASF,
+  FMOD_TAGTYPE_MIDI,
+  FMOD_TAGTYPE_PLAYLIST,
+  FMOD_TAGTYPE_FMOD,
+  FMOD_TAGTYPE_USER,
+  FMOD_TAGTYPE_MAX
+} FMOD_TAGTYPE;
+
+ +
enum TAGTYPE
+{
+  UNKNOWN,
+  ID3V1,
+  ID3V2,
+  VORBISCOMMENT,
+  SHOUTCAST,
+  ICECAST,
+  ASF,
+  MIDI,
+  PLAYLIST,
+  FMOD,
+  USER,
+  MAX
+}
+
+ +
FMOD.TAGTYPE_UNKNOWN
+FMOD.TAGTYPE_ID3V1
+FMOD.TAGTYPE_ID3V2
+FMOD.TAGTYPE_VORBISCOMMENT
+FMOD.TAGTYPE_SHOUTCAST
+FMOD.TAGTYPE_ICECAST
+FMOD.TAGTYPE_ASF
+FMOD.TAGTYPE_MIDI
+FMOD.TAGTYPE_PLAYLIST
+FMOD.TAGTYPE_FMOD
+FMOD.TAGTYPE_USER
+FMOD.TAGTYPE_MAX
+
+ +
+
FMOD_TAGTYPE_UNKNOWN
+
Tag type that is not recognized by FMOD
+
FMOD_TAGTYPE_ID3V1
+
MP3 ID3 Tag 1.0. Typically 1 tag stored 128 bytes from end of an MP3 file.
+
FMOD_TAGTYPE_ID3V2
+
MP3 ID3 Tag 2.0. Variable length tags with more than 1 possible.
+
FMOD_TAGTYPE_VORBISCOMMENT
+
Metadata container used in Vorbis, FLAC, Theora, Speex and Opus file formats.
+
FMOD_TAGTYPE_SHOUTCAST
+
SHOUTcast internet stream metadata which can be issued during playback.
+
FMOD_TAGTYPE_ICECAST
+
Icecast internet stream metadata which can be issued during playback.
+
FMOD_TAGTYPE_ASF
+
Advanced Systems Format metadata typically associated with Windows Media formats such as WMA.
+
FMOD_TAGTYPE_MIDI
+
Metadata stored inside a MIDI file.
+
FMOD_TAGTYPE_PLAYLIST
+
Playlist files such as PLS,M3U,ASX and WAX will populate playlist information through this tag type.
+
FMOD_TAGTYPE_FMOD
+
Tag type used by FMOD's MIDI, MOD, S3M, XM, IT format support, and netstreams to notify of internet stream events like a sample rate change.
+
FMOD_TAGTYPE_USER
+
For codec developers, this tag type can be used with FMOD_CODEC_METADATA_FUNC to generate custom metadata.
+
FMOD_TAGTYPE_MAX
+
Maximum number of tag types supported.
+
+

FMOD_TAGTYPE_MIDI remarks. A midi file contains 16 channels. Not all of them are used, or in order. Use the tag 'Channel mask' and 'Number of channels' to find the channels used, to use with Sound::setMusicChannelVolume / Sound::getMusicChannelVolume. For example if the mask is 1001b, there are 2 channels, and channel 0 and channel 3 are the 2 channels used with the above functions.

+

See Also: Sound::getTag, FMOD_TAGDATATYPE, FMOD_TAG

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-soundgroup.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-soundgroup.html new file mode 100644 index 0000000..cf7b03a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-soundgroup.html @@ -0,0 +1,774 @@ + + +Core API Reference | SoundGroup + + + + +
+ +
+

7. Core API Reference | SoundGroup

+

An interface that manages Sound Groups

+

Group Functions:

+ +
+ +

Sound Functions:

+ +

General:

+ +

FMOD_SOUNDGROUP_BEHAVIOR

+

Values specifying behavior when a sound group's max audible value is exceeded.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_SOUNDGROUP_BEHAVIOR {
+  FMOD_SOUNDGROUP_BEHAVIOR_FAIL,
+  FMOD_SOUNDGROUP_BEHAVIOR_MUTE,
+  FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST,
+  FMOD_SOUNDGROUP_BEHAVIOR_MAX
+} FMOD_SOUNDGROUP_BEHAVIOR;
+
+ +
enum SOUNDGROUP_BEHAVIOR
+{
+    BEHAVIOR_FAIL,
+    BEHAVIOR_MUTE,
+    BEHAVIOR_STEALLOWEST,
+    MAX,
+}
+
+ +
FMOD.SOUNDGROUP_BEHAVIOR_FAIL
+FMOD.SOUNDGROUP_BEHAVIOR_MUTE
+FMOD.SOUNDGROUP_BEHAVIOR_STEALLOWEST
+FMOD.SOUNDGROUP_BEHAVIOR_MAX
+
+ +
+
FMOD_SOUNDGROUP_BEHAVIOR_FAIL
+
Excess sounds will fail when calling System::playSound.
+
FMOD_SOUNDGROUP_BEHAVIOR_MUTE
+
Excess sounds will begin mute and will become audible when sufficient sounds are stopped.
+
FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST
+
Excess sounds will steal from the quietest Sound playing in the group.
+
FMOD_SOUNDGROUP_BEHAVIOR_MAX
+
Maximum number of SoundGroup behaviors.
+
+

When using FMOD_SOUNDGROUP_BEHAVIOR_MUTE, SoundGroup::setMuteFadeSpeed can be used to stop a sudden transition.
+Instead, the time specified will be used to cross fade between the sounds that go silent and the ones that become audible.

+

See Also: SoundGroup::setMaxAudibleBehavior, SoundGroup::getMaxAudibleBehavior, SoundGroup::setMaxAudible, SoundGroup::getMaxAudible, SoundGroup::setMuteFadeSpeed, SoundGroup::getMuteFadeSpeed

+

SoundGroup::getMaxAudible

+

Retrieves the maximum number of playbacks to be audible at once in a sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getMaxAudible(
+  int *maxaudible
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetMaxAudible(
+  FMOD_SOUNDGROUP *soundgroup,
+  int *maxaudible
+);
+
+ +
RESULT SoundGroup.getMaxAudible(
+  out int maxaudible
+);
+
+ +
SoundGroup.getMaxAudible(
+  maxaudible
+);
+
+ +
+
maxaudible Out
+
+

Maximum number of playbacks to be audible at once.

+
    +
  • Range: [-1, inf)
  • +
  • Default: -1
  • +
+
+
+

See Also: SoundGroup::setMaxAudible

+

SoundGroup::getMaxAudibleBehavior

+

Retrieves the current max audible behavior.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getMaxAudibleBehavior(
+  FMOD_SOUNDGROUP_BEHAVIOR *behavior
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetMaxAudibleBehavior(
+  FMOD_SOUNDGROUP *soundgroup,
+  FMOD_SOUNDGROUP_BEHAVIOR *behavior
+);
+
+ +
RESULT SoundGroup.getMaxAudibleBehavior(
+  out SOUNDGROUP_BEHAVIOR behavior
+);
+
+ +
SoundGroup.getMaxAudibleBehavior(
+  behavior
+);
+
+ +
+
behavior Out
+
+

SoundGroup max playbacks behavior. (FMOD_SOUNDGROUP_BEHAVIOR)

+ +
+
+

See Also: SoundGroup::setMaxAudibleBehavior

+

SoundGroup::getMuteFadeSpeed

+

Retrieves the current mute fade time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getMuteFadeSpeed(
+  float *speed
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetMuteFadeSpeed(
+  FMOD_SOUNDGROUP *soundgroup,
+  float *speed
+);
+
+ +
RESULT SoundGroup.getMuteFadeSpeed(
+  out float speed
+);
+
+ +
SoundGroup.getMuteFadeSpeed(
+  speed
+);
+
+ +
+
speed Out
+
+

Fade time. 0 = no fading.

+
    +
  • Units: Seconds
  • +
  • Range: [0, inf)
  • +
  • Default: 0
  • +
+
+
+

See Also: SoundGroup::setMuteFadeSpeed

+

SoundGroup::getName

+

Retrieves the name of the sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getName(
+  char *name,
+  int namelen
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetName(
+  FMOD_SOUNDGROUP *soundgroup,
+  char *name,
+  int namelen
+);
+
+ +
RESULT SoundGroup.getName(
+  out string name,
+  int namelen
+);
+
+ +
SoundGroup.getName(
+  name
+);
+
+ +
+
name Out
+
Name of the SoundGroup. (UTF-8 string)
+
namelen
+
+

Length of name.

+
    +
  • Units: Bytes
  • +
+
+
+

See Also: System::createSoundGroup

+

SoundGroup::getNumPlaying

+

Retrieves the number of currently playing Channels for the SoundGroup.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getNumPlaying(
+  int *numplaying
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetNumPlaying(
+  FMOD_SOUNDGROUP *soundgroup,
+  int *numplaying
+);
+
+ +
RESULT SoundGroup.getNumPlaying(
+  out int numplaying
+);
+
+ +
SoundGroup.getNumPlaying(
+  numplaying
+);
+
+ +
+
numplaying Out
+
Number of actively playing Channels from sounds in this SoundGroup.
+
+

This routine returns the number of Channels playing. If the SoundGroup only has one Sound, and that Sound is playing twice, the figure returned will be two.

+

See Also: System::createSoundGroup, System::getMasterSoundGroup

+

SoundGroup::getNumSounds

+

Retrieves the current number of sounds in this sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getNumSounds(
+  int *numsounds
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetNumSounds(
+  FMOD_SOUNDGROUP *soundgroup,
+  int *numsounds
+);
+
+ +
RESULT SoundGroup.getNumSounds(
+  out int numsounds
+);
+
+ +
SoundGroup.getNumSounds(
+  numsounds
+);
+
+ +
+
numsounds Out
+
Number of Sounds in this SoundGroup.
+
+

See Also: SoundGroup::getSound

+

SoundGroup::getSound

+

Retrieves a sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getSound(
+  int index,
+  Sound **sound
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetSound(
+  FMOD_SOUNDGROUP *soundgroup,
+  int index,
+  FMOD_SOUND **sound
+);
+
+ +
RESULT SoundGroup.getSound(
+  int index,
+  out Sound sound
+);
+
+ +
SoundGroup.getSound(
+  index,
+  sound
+);
+
+ +
+
index
+
Index of the sound.
+
sound Out
+
Sound object. (Sound)
+
+

Use SoundGroup::getNumSounds in conjunction with this function to enumerate all sounds in a SoundGroup.

+

See Also: System::createSound

+

SoundGroup::getSystemObject

+

Retrieves the parent System object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getSystemObject(
+  System **system
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetSystemObject(
+  FMOD_SOUNDGROUP *soundgroup,
+  FMOD_SYSTEM **system
+);
+
+ +
RESULT SoundGroup.getSystemObject(
+  out System system
+);
+
+ +
SoundGroup.getSystemObject(
+  system
+);
+
+ +
+
system Out
+
System object. (System)
+
+

See Also: System::createSoundGroup, System::getMasterSoundGroup

+

SoundGroup::getUserData

+

Retrieves a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetUserData(
+  FMOD_SOUNDGROUP *soundgroup,
+  void **userdata
+);
+
+ +
RESULT SoundGroup.getUserData(
+  out IntPtr userdata
+);
+
+ +
SoundGroup.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling SoundGroup::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

SoundGroup::getVolume

+

Retrieves the volume of the sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::getVolume(
+  float *volume
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_GetVolume(
+  FMOD_SOUNDGROUP *soundgroup,
+  float *volume
+);
+
+ +
RESULT SoundGroup.getVolume(
+  out float volume
+);
+
+ +
SoundGroup.getVolume(
+  volume
+);
+
+ +
+
volume Out
+
+

Volume level.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

See Also: SoundGroup::setVolume

+

SoundGroup::release

+

Releases a soundgroup object and returns all sounds back to the master sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::release();
+
+ +
FMOD_RESULT FMOD_SoundGroup_Release(FMOD_SOUNDGROUP *soundgroup);
+
+ +
RESULT SoundGroup.release();
+
+ +
SoundGroup.release();
+
+ +

You cannot release the master SoundGroup.

+

See Also: System::createSoundGroup, System::getMasterSoundGroup

+

SoundGroup::setMaxAudible

+

Sets the maximum number of playbacks to be audible at once in a sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::setMaxAudible(
+  int maxaudible
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_SetMaxAudible(
+  FMOD_SOUNDGROUP *soundgroup,
+  int maxaudible
+);
+
+ +
RESULT SoundGroup.setMaxAudible(
+  int maxaudible
+);
+
+ +
SoundGroup.setMaxAudible(
+  maxaudible
+);
+
+ +
+
maxaudible
+
+

Maximum number of playbacks to be audible at once. -1 denotes unlimited.

+
    +
  • Range: [-1, inf)
  • +
  • Default: -1
  • +
+
+
+

If playing instances of sounds in this group equal or exceed number specified here, attepts to play more of the sounds with be met with FMOD_ERR_MAXAUDIBLE by default.
+Use SoundGroup::setMaxAudibleBehavior to change the way the sound playback behaves when too many sounds are playing. Muting, failing and stealing behaviors can be specified. See FMOD_SOUNDGROUP_BEHAVIOR.

+

SoundGroup::getNumPlaying can be used to determine how many instances of the sounds in the SoundGroup are currently playing.

+

See Also: SoundGroup::getMaxAudible, SoundGroup::setMaxAudibleBehavior, SoundGroup::getMaxAudibleBehavior

+

SoundGroup::setMaxAudibleBehavior

+

This function changes the way the sound playback behaves when too many sounds are playing in a soundgroup.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::setMaxAudibleBehavior(
+  FMOD_SOUNDGROUP_BEHAVIOR behavior
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_SetMaxAudibleBehavior(
+  FMOD_SOUNDGROUP *soundgroup,
+  FMOD_SOUNDGROUP_BEHAVIOR behavior
+);
+
+ +
RESULT SoundGroup.setMaxAudibleBehavior(
+  SOUNDGROUP_BEHAVIOR behavior
+);
+
+ +
SoundGroup.setMaxAudibleBehavior(
+  behavior
+);
+
+ +
+
behavior
+
+

SoundGroup max playbacks behavior. (FMOD_SOUNDGROUP_BEHAVIOR)

+ +
+
+

See Also: SoundGroup::getMaxAudibleBehavior, SoundGroup::setMaxAudible, SoundGroup::getMaxAudible

+

SoundGroup::setMuteFadeSpeed

+

Sets a mute fade time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::setMuteFadeSpeed(
+  float speed
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_SetMuteFadeSpeed(
+  FMOD_SOUNDGROUP *soundgroup,
+  float speed
+);
+
+ +
RESULT SoundGroup.setMuteFadeSpeed(
+  float speed
+);
+
+ +
SoundGroup.setMuteFadeSpeed(
+  speed
+);
+
+ +
+
speed
+
+

Fade time. 0 = no fading.

+
    +
  • Units: Seconds
  • +
  • Range: [0, inf)
  • +
  • Default: 0
  • +
+
+
+

If a mode besides FMOD_SOUNDGROUP_BEHAVIOR_MUTE is used, the fade speed is ignored.

+

When more sounds are playing in a SoundGroup than are specified with SoundGroup::setMaxAudible, the least important Sound (ie lowest priority / lowest audible volume due to 3D position, volume etc) will fade to silence if FMOD_SOUNDGROUP_BEHAVIOR_MUTE is used, and any previous sounds that were silent because of this rule will fade in if they are more important.

+

See Also: SoundGroup::getMuteFadeSpeed

+

SoundGroup::setUserData

+

Sets a user value associated with this object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_SetUserData(
+  FMOD_SOUNDGROUP *soundgroup,
+  void *userdata
+);
+
+ +
RESULT SoundGroup.setUserData(
+  IntPtr userdata
+);
+
+ +
SoundGroup.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
Value stored on this object.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: SoundGroup::getUserData

+

SoundGroup::setVolume

+

Sets the volume of the sound group.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::setVolume(
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_SoundGroup_SetVolume(
+  FMOD_SOUNDGROUP *soundgroup,
+  float volume
+);
+
+ +
RESULT SoundGroup.setVolume(
+  float volume
+);
+
+ +
SoundGroup.setVolume(
+  volume
+);
+
+ +
+
volume
+
+

Volume level.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

Scales the volume of all Channels playing Sounds in this SoundGroup.

+

See Also: SoundGroup::getVolume

+

SoundGroup::stop

+

Stops all sounds within this soundgroup.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT SoundGroup::stop();
+
+ +
FMOD_RESULT FMOD_SoundGroup_Stop(FMOD_SOUNDGROUP *soundgroup);
+
+ +
RESULT SoundGroup.stop();
+
+ +
SoundGroup.stop();
+
+ +

See Also: System::playSound

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-system.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-system.html new file mode 100644 index 0000000..91571c1 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api-system.html @@ -0,0 +1,7019 @@ + + +Core API Reference | System + + + + +
+ +
+

7. Core API Reference | System

+

Management object from which all resources are created and played.

+

Create with System_Create.

+

Lifetime management:

+
    +
  • System_Create Creates an instance of the FMOD system.
  • +
  • System::init Initialize the system object and prepare FMOD for playback.
  • +
  • System::close Close the connection to the output and return to an uninitialized state without releasing the object.
  • +
  • System::release Closes and frees this object and its resources.
  • +
  • System::update Updates the FMOD system.
  • +
  • System::mixerSuspend Suspend mixer thread and relinquish usage of audio hardware while maintaining internal state.
  • +
  • System::mixerResume Resume mixer thread and reacquire access to audio hardware.
  • +
+
+
    +
  • FMOD_INITFLAGS Configuration flags used when initializing the System object.
  • +
+

Device selection:

+
    +
  • System::setOutput Sets the type of output interface used to run the mixer.
  • +
  • System::getOutput Retrieves the type of output interface used to run the mixer.
  • +
  • System::getNumDrivers Retrieves the number of output drivers available for the selected output type.
  • +
  • System::getDriverInfo Retrieves identification information about a sound device specified by its index, and specific to the selected output mode.
  • +
  • System::setDriver Sets the output driver for the selected output type.
  • +
  • System::getDriver Retrieves the output driver for the selected output type.
  • +
+
+
    +
  • FMOD_OUTPUTTYPE Built-in output types that can be used to run the mixer.
  • +
+

Setup:

+ +
+ +
+ +

File system setup:

+ +
+ +

Plug-in support:

+ +
+
    +
  • FMOD_PLUGINLIST Used to support lists of plug-ins within the one dynamic library.
  • +
+
+ +

Network configuration:

+ +

Information:

+ +

Creation and retrieval:

+ +
+ +

Runtime control:

+ +
+ +
+
    +
  • FMOD_PORT_INDEX Output type specific index for when there are multiple instances or destinations for a port type.
  • +
  • FMOD_PORT_TYPE Port types available for routing audio.
  • +
  • FMOD_REVERB_MAXINSTANCES The maximum number of global reverb instances.
  • +
  • FMOD_REVERB_PRESETS Predefined reverb configurations. To simplify usage, and avoid manually selecting reverb parameters, a table of common presets is supplied for ease of use.
  • +
+

Recording:

+
    +
  • System::getRecordNumDrivers Retrieves the number of recording devices available for this output mode. Use this to enumerate all recording devices possible so that the user can select one.
  • +
  • System::getRecordDriverInfo Retrieves identification information about an audio device specified by its index, and specific to the output mode.
  • +
  • System::getRecordPosition Retrieves the current recording position of the record buffer in PCM samples.
  • +
  • System::recordStart Starts the recording engine recording to a pre-created Sound object.
  • +
  • System::recordStop Stops the recording engine from recording to a pre-created Sound object.
  • +
  • System::isRecording Retrieves the state of the FMOD recording API, ie if it is currently recording or not.
  • +
+
+
    +
  • FMOD_DRIVER_STATE Flags that provide additional information about a particular driver.
  • +
+

Geometry management:

+ +

General:

+ +
+ +
+ +

FMOD_3D_ROLLOFF_CALLBACK

+

Callback to allow custom calculation of distance attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
float F_CALL FMOD_3D_ROLLOFF_CALLBACK(
+  FMOD_CHANNELCONTROL *channelcontrol,
+  float distance
+);
+
+ +
delegate float CB_3D_ROLLOFFCALLBACK(
+  IntPtr channelcontrol,
+  float distance
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
channelcontrol
+
Channel being evaluated. (ChannelControl)
+
distance
+
+

Distance from the listener.

+ +
+
+
+

channelcontrol can be cast to Channel *.

+
+

See Also: System::set3DRolloffCallback, System::set3DListenerAttributes, System::get3DListenerAttributes

+

FMOD_ADVANCEDSETTINGS

+

Advanced configuration settings.

+

Structure to allow configuration of lesser used system level settings. These tweaks generally allow the user to set resource limits and customize settings to better fit their application.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_ADVANCEDSETTINGS {
+  int                  cbSize;
+  int                  maxMPEGCodecs;
+  int                  maxADPCMCodecs;
+  int                  maxXMACodecs;
+  int                  maxVorbisCodecs;
+  int                  maxAT9Codecs;
+  int                  maxFADPCMCodecs;
+  int                  maxOpusCodecs;
+  int                  ASIONumChannels;
+  char               **ASIOChannelList;
+  FMOD_SPEAKER        *ASIOSpeakerList;
+  float                vol0virtualvol;
+  unsigned int         defaultDecodeBufferSize;
+  unsigned short       profilePort;
+  unsigned int         geometryMaxFadeTime;
+  float                distanceFilterCenterFreq;
+  int                  reverb3Dinstance;
+  int                  DSPBufferPoolSize;
+  FMOD_DSP_RESAMPLER   resamplerMethod;
+  unsigned int         randomSeed;
+  int                  maxConvolutionThreads;
+  int                  maxSpatialObjects;
+} FMOD_ADVANCEDSETTINGS;
+
+ +
struct ADVANCEDSETTINGS
+{
+  int           cbSize;
+  int           maxMPEGCodecs;
+  int           maxADPCMCodecs;
+  int           maxXMACodecs;
+  int           maxVorbisCodecs;
+  int           maxAT9Codecs;
+  int           maxFADPCMCodecs;
+  int           maxOpusCodecs;
+  int           ASIONumChannels;
+  IntPtr        ASIOChannelList;
+  IntPtr        ASIOSpeakerList;
+  float         vol0virtualvol;
+  uint          defaultDecodeBufferSize;
+  ushort        profilePort;
+  uint          geometryMaxFadeTime;
+  float         distanceFilterCenterFreq;
+  int           reverb3Dinstance;
+  int           DSPBufferPoolSize;
+  DSP_RESAMPLER resamplerMethod;
+  uint          randomSeed;
+  int           maxConvolutionThreads;
+  int           maxSpatialObjects;
+}
+
+ +
ADVANCEDSETTINGS
+{
+  maxMPEGCodecs,
+  maxADPCMCodecs,
+  maxXMACodecs,
+  maxVorbisCodecs,
+  maxAT9Codecs,
+  maxFADPCMCodecs,
+  maxOpusCodecs,
+  ASIONumChannels,
+  vol0virtualvol,
+  defaultDecodeBufferSize,
+  profilePort,
+  geometryMaxFadeTime,
+  distanceFilterCenterFreq,
+  reverb3Dinstance,
+  DSPBufferPoolSize,
+  resamplerMethod,
+  randomSeed,
+  maxConvolutionThreads,
+  maxSpatialObjects,
+};
+
+ +
+
cbSize
+
Size of this structure. Must be set to sizeof(FMOD_ADVANCEDSETTINGS) before calling System::setAdvancedSettings or System::getAdvancedSettings.
+
maxMPEGCodecs Opt
+
+

Maximum MPEG Sounds created as FMOD_CREATECOMPRESSEDSAMPLE.

+
    +
  • Default: 32
  • +
  • Range: [0, 256]
  • +
+
+
maxADPCMCodecs Opt
+
+

Maximum IMA-ADPCM Sounds created as FMOD_CREATECOMPRESSEDSAMPLE.

+
    +
  • Default: 32
  • +
  • Range: [0, 256]
  • +
+
+
maxXMACodecs Opt
+
+

Maximum XMA Sounds created as FMOD_CREATECOMPRESSEDSAMPLE.

+
    +
  • Default: 32
  • +
  • Range: [0, 256]
  • +
+
+
maxVorbisCodecs Opt
+
+

Maximum Vorbis Sounds created as FMOD_CREATECOMPRESSEDSAMPLE.

+
    +
  • Default: 32
  • +
  • Range: [0, 256]
  • +
+
+
maxAT9Codecs Opt
+
+

Maximum AT9 Sounds created as FMOD_CREATECOMPRESSEDSAMPLE.

+
    +
  • Default: 32
  • +
  • Range: [0, 256]
  • +
+
+
maxFADPCMCodecs Opt
+
+

Maximum FADPCM Sounds created as FMOD_CREATECOMPRESSEDSAMPLE.

+
    +
  • Default: 32
  • +
  • Range: [0, 256]
  • +
+
+
maxOpusCodecs Opt
+
+

Maximum Opus Sounds created as FMOD_CREATECOMPRESSEDSAMPLE.

+
    +
  • Default: 32
  • +
  • Range: [0, 256]
  • +
+
+
ASIONumChannels Opt
+
+

Number of elements in ASIOSpeakerList on input, number of elements in ASIOChannelList on output.

+ +
+
ASIOChannelList R/O
+
Read only list of strings representing ASIO channel names (UTF-8 string), count is defined by ASIONumChannels. Only valid after System::init.
+
ASIOSpeakerList Opt
+
List of speakers that represent each ASIO channel used for remapping, count is defined by ASIONumChannels. Use FMOD_SPEAKER_NONE to indicate no output for a given speaker. (FMOD_SPEAKER)
+
vol0virtualvol Opt
+
+

For use with FMOD_INIT_VOL0_BECOMES_VIRTUAL, Channels with audibility below this will become virtual. See the Virtual Voices guide for more information.

+
    +
  • Units: Linear
  • +
  • Default: 0
  • +
+
+
defaultDecodeBufferSize Opt
+
+

For use with Streams, the default size of the double buffer.

+
    +
  • Units: Milliseconds
  • +
  • Default: 400
  • +
  • Range: [0, 30000]
  • +
+
+
profilePort Opt
+
+

For use with FMOD_INIT_PROFILE_ENABLE, specify the port to listen on for connections by FMOD Studio or FMOD Profiler.

+
    +
  • Default: 9264
  • +
+
+
geometryMaxFadeTime Opt
+
+

For use with Geometry, the maximum time it takes for a Channel to fade to the new volume level when its occlusion changes.

+
    +
  • Units: Milliseconds
  • +
  • Default: 500
  • +
+
+
distanceFilterCenterFreq Opt
+
+

For use with FMOD_INIT_CHANNEL_DISTANCEFILTER, the default center frequency for the distance filter.

+
    +
  • Units: Hertz
  • +
  • Default: 1500
  • +
  • Range: [10, 22050]
  • +
+
+
reverb3Dinstance Opt
+
+

For use with Reverb3D, selects which global reverb instance to use.

+
    +
  • Range: [0, FMOD_REVERB_MAXINSTANCES)
  • +
+
+
DSPBufferPoolSize Opt
+
+

Number of intermediate mixing buffers in the DSP buffer pool. Each buffer in bytes is bufferlength (See System::getDSPBufferSize) * sizeof(float) * output mode speaker count (See FMOD_SPEAKERMODE). ie 7.1 @ 1024 DSP block size = 1024 * 4 * 8 = 32KB.

+
    +
  • Default: 8
  • +
+
+
resamplerMethod Opt
+
Resampling method used by Channels. (FMOD_DSP_RESAMPLER)
+
randomSeed Opt
+
Seed value to initialize the internal random number generator.
+
maxConvolutionThreads Opt
+
+

Maximum number of CPU threads to use for FMOD_DSP_TYPE_CONVOLUTIONREVERB effect. 1 = effect is entirely processed inside the FMOD_THREAD_TYPE_MIXER thread. 2 and 3 offloads different parts of the convolution processing into different threads (FMOD_THREAD_TYPE_CONVOLUTION1 and FMOD_THREAD_TYPE_CONVOLUTION2 to increase throughput.

+
    +
  • Default: 3
  • +
  • Range: [0, 3]
  • +
+
+
maxSpatialObjects Opt
+
+

Maximum Spatial Objects that can be reserved per FMOD system. FMOD_OUTPUTTYPE_AUDIO3D is a special case where multiple FMOD systems are not allowed. See the Object based approach section of the Spatial Audio white paper. A value of -1 means no Spatial Objects will be reserved. A value of 0 means all available Spatial Objects will be reserved. Any other value means it will reserve that many Spatial Objects.

+
    +
  • Default: 0
  • +
  • Range: [-1, 65535]
  • +
+
+
+

All members have a default of 0 except for cbSize, so clearing the whole structure to zeroes first then setting cbSize is a common use pattern.

+

Specifying one of the codec maximums will help determine the maximum CPU usage of playing FMOD_CREATECOMPRESSEDSAMPLE Sounds of that type as well as the memory requirements. Memory will be allocated for 'up front' (during System::init) if these values are specified as non zero. If any are zero, it allocates memory for the codec whenever a file of the type in question is loaded. So if maxMPEGCodecs is 0 for example, it will allocate memory for the MPEG codecs the first time an MP3 is loaded or an MP3 based .FSB file is loaded.

+

Setting DSPBufferPoolSize pre-allocates memory for the FMOD DSP graph. See the DSP architecture guide. By default, eight buffers are created up front. A large graph might require more if the aim is to avoid real-time allocations from the FMOD mixer thread.

+

See Also: System::setAdvancedSettings, System::getAdvancedSettings

+

FMOD_ASYNCREADINFO

+

Information about a single asynchronous file operation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_ASYNCREADINFO {
+  void                      *handle;
+  unsigned int               offset;
+  unsigned int               sizebytes;
+  int                        priority;
+  void                      *userdata;
+  void                      *buffer;
+  unsigned int               bytesread;
+  FMOD_FILE_ASYNCDONE_FUNC   done;
+} FMOD_ASYNCREADINFO;
+
+ +
struct ASYNCREADINFO
+{
+  IntPtr                      handle;
+  uint                        offset;
+  uint                        sizebytes;
+  int                         priority;
+  IntPtr                      userdata;
+  IntPtr                      buffer;
+  uint                        bytesread;
+  FILE_ASYNCDONE_FUNC         done;
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
handle R/O
+
File handle that was returned in FMOD_FILE_OPEN_CALLBACK.
+
offset R/O
+
Offset within the file where the read operation should occur.
+
+
    +
  • Units: Bytes
  • +
+
+
sizebytes R/O
+
Number of bytes to read.
+
+
    +
  • Units: Bytes
  • +
+
+
priority R/O
+
Priority hint for how quickly this operation should be serviced where 0 represents low importance and 100 represents extreme importance. This could be used to prioritize the read order of a file job queue for example. FMOD decides the importance of the read based on if it could degrade audio or not.
+
userdata Opt
+
User value associated with this async operation, passed to FMOD_FILE_ASYNCCANCEL_CALLBACK.
+
buffer
+
Buffer to read data into.
+
bytesread
+
Number of bytes read into buffer.
+
+
    +
  • Units: Bytes
  • +
+
+
done R/O
+
Completion function to signal the async read is done. (FMOD_FILE_ASYNCDONE_FUNC)
+
+

When servicing the async read operation, read from handle at the given offset for sizebytes into buffer. Write the number of bytes read into bytesread then call done with the FMOD_RESULT that matches the success of the operation.

+

See Also: FMOD_FILE_ASYNCREAD_CALLBACK

+

FMOD_CREATESOUNDEXINFO

+

Additional options for creating a Sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_CREATESOUNDEXINFO {
+  int                              cbsize;
+  unsigned int                     length;
+  unsigned int                     fileoffset;
+  int                              numchannels;
+  int                              defaultfrequency;
+  FMOD_SOUND_FORMAT                format;
+  unsigned int                     decodebuffersize;
+  int                              initialsubsound;
+  int                              numsubsounds;
+  int                             *inclusionlist;
+  int                              inclusionlistnum;
+  FMOD_SOUND_PCMREAD_CALLBACK      pcmreadcallback;
+  FMOD_SOUND_PCMSETPOS_CALLBACK    pcmsetposcallback;
+  FMOD_SOUND_NONBLOCK_CALLBACK     nonblockcallback;
+  const char                      *dlsname;
+  const char                      *encryptionkey;
+  int                              maxpolyphony;
+  void                            *userdata;
+  FMOD_SOUND_TYPE                  suggestedsoundtype;
+  FMOD_FILE_OPEN_CALLBACK          fileuseropen;
+  FMOD_FILE_CLOSE_CALLBACK         fileuserclose;
+  FMOD_FILE_READ_CALLBACK          fileuserread;
+  FMOD_FILE_SEEK_CALLBACK          fileuserseek;
+  FMOD_FILE_ASYNCREAD_CALLBACK     fileuserasyncread;
+  FMOD_FILE_ASYNCCANCEL_CALLBACK   fileuserasynccancel;
+  void                            *fileuserdata;
+  int                              filebuffersize;
+  FMOD_CHANNELORDER                channelorder;
+  FMOD_SOUNDGROUP                 *initialsoundgroup;
+  unsigned int                     initialseekposition;
+  FMOD_TIMEUNIT                    initialseekpostype;
+  int                              ignoresetfilesystem;
+  unsigned int                     audioqueuepolicy;
+  unsigned int                     minmidigranularity;
+  int                              nonblockthreadid;
+  FMOD_GUID                       *fsbguid;
+} FMOD_CREATESOUNDEXINFO;
+
+ +
struct CREATESOUNDEXINFO
+{
+  int                      cbsize;
+  uint                     length;
+  uint                     fileoffset;
+  int                      numchannels;
+  int                      defaultfrequency;
+  SOUND_FORMAT             format;
+  uint                     decodebuffersize;
+  int                      initialsubsound;
+  int                      numsubsounds;
+  IntPtr                   inclusionlist;
+  int                      inclusionlistnum;
+  SOUND_PCMREADCALLBACK    pcmreadcallback;
+  SOUND_PCMSETPOSCALLBACK  pcmsetposcallback;
+  SOUND_NONBLOCKCALLBACK   nonblockcallback;
+  IntPtr                   dlsname;
+  IntPtr                   encryptionkey;
+  int                      maxpolyphony;
+  IntPtr                   userdata;
+  SOUND_TYPE               suggestedsoundtype;
+  FILE_OPENCALLBACK        fileuseropen;
+  FILE_CLOSECALLBACK       fileuserclose;
+  FILE_READCALLBACK        fileuserread;
+  FILE_SEEKCALLBACK        fileuserseek;
+  FILE_ASYNCREADCALLBACK   fileuserasyncread;
+  FILE_ASYNCCANCELCALLBACK fileuserasynccancel;
+  IntPtr                   fileuserdata;
+  int                      filebuffersize;
+  CHANNELORDER             channelorder;
+  IntPtr                   initialsoundgroup;
+  uint                     initialseekposition;
+  TIMEUNIT                 initialseekpostype;
+  int                      ignoresetfilesystem;
+  uint                     audioqueuepolicy;
+  uint                     minmidigranularity;
+  int                      nonblockthreadid;
+  IntPtr                   fsbguid;
+}
+
+ +
CREATESOUNDEXINFO
+{
+  length,
+  fileoffset,
+  numchannels,
+  defaultfrequency,
+  format,
+  decodebuffersize,
+  initialsubsound,
+  numsubsounds,
+  inclusionlist,
+  inclusionlistnum,
+  pcmreadcallback,
+  pcmsetposcallback,
+  nonblockcallback,
+  dlsname,
+  encryptionkey,
+  maxpolyphony,
+  userdata,
+  suggestedsoundtype,
+  fileuseropen,
+  fileuserclose,
+  fileuserread,
+  fileuserseek,
+  fileuserasyncread,
+  fileuserasynccancel,
+  fileuserdata,
+  filebuffersize,
+  channelorder,
+  initialsoundgroup,
+  initialseekposition,
+  initialseekpostype,
+  ignoresetfilesystem,
+  audioqueuepolicy,
+  minmidigranularity,
+  nonblockthreadid,
+};
+
+ +
+
cbsize
+
Size of this structure. Must be set to sizeof(FMOD_CREATESOUNDEXINFO) before calling System::createSound or System::createStream.
+
length Opt
+
+

Bytes to read starting at fileoffset, or length of Sound to create for FMOD_OPENUSER, or length of name_or_data for FMOD_OPENMEMORY / FMOD_OPENMEMORY_POINT.

+
    +
  • Units: Bytes
  • +
+
+
fileoffset Opt
+
+

File offset to start reading from.

+
    +
  • Units: Bytes
  • +
+
+
numchannels Opt
+
+

Number of channels in sound data for FMOD_OPENUSER / FMOD_OPENRAW.

+ +
+
defaultfrequency Opt
+
+

Default frequency of sound data for FMOD_OPENUSER / FMOD_OPENRAW.

+
    +
  • Units: Hertz
  • +
+
+
format Opt
+
Format of sound data for FMOD_OPENUSER / FMOD_OPENRAW. (FMOD_SOUND_FORMAT)
+
decodebuffersize Opt
+
+

Size of the decoded buffer for FMOD_CREATESTREAM, or the block size used with pcmreadcallback for FMOD_OPENUSER.

+ +
+
initialsubsound Opt
+
Initial subsound to seek to for FMOD_CREATESTREAM.
+
numsubsounds Opt
+
Number of subsounds available for FMOD_OPENUSER, or maximum subsounds to load from file.
+
inclusionlist Opt
+
List of subsound indices to load from file.
+
inclusionlistnum Opt
+
Number of items in inclusionlist.
+
pcmreadcallback Opt
+
Callback to provide audio for FMOD_OPENUSER, or capture audio as it is decoded. (FMOD_SOUND_PCMREAD_CALLBACK)
+
pcmsetposcallback Opt
+
Callback to perform seeking for FMOD_OPENUSER, or capture seek requests. (FMOD_SOUND_PCMSETPOS_CALLBACK)
+
nonblockcallback Opt
+
Callback to notify completion for FMOD_NONBLOCKING, occurs during creation and seeking / restarting streams. (FMOD_SOUND_NONBLOCK_CALLBACK)
+
dlsname Opt
+
File path for a FMOD_SOUND_TYPE_DLS sample set to use when loading a FMOD_SOUND_TYPE_MIDI file, see below for defaults.
+
encryptionkey Opt
+
Key for encrypted FMOD_SOUND_TYPE_FSB file, cannot be used in conjunction with FMOD_OPENMEMORY_POINT.
+
maxpolyphony Opt
+
+

Maximum voice count for FMOD_SOUND_TYPE_MIDI / FMOD_SOUND_TYPE_IT.

+
    +
  • Default: 64
  • +
+
+
userdata Opt
+
User data to be attached to the Sound during creation, access via Sound::getUserData.
+
suggestedsoundtype Opt
+
Attempt to load using the specified type first instead of loading in codec priority order. (FMOD_SOUND_TYPE)
+
fileuseropen Opt
+
Callback for opening this file. (FMOD_FILE_OPEN_CALLBACK)
+
fileuserclose Opt
+
Callback for closing this file. (FMOD_FILE_CLOSE_CALLBACK)
+
fileuserread Opt
+
Callback for reading from this file. (FMOD_FILE_READ_CALLBACK)
+
fileuserseek Opt
+
Callback for seeking within this file. (FMOD_FILE_SEEK_CALLBACK)
+
fileuserasyncread Opt
+
Callback for seeking within this file. (FMOD_FILE_ASYNCREAD_CALLBACK)
+
fileuserasynccancel Opt
+
Callback for seeking within this file. (FMOD_FILE_ASYNCCANCEL_CALLBACK)
+
fileuserdata Opt
+
User data to be passed into the file callbacks.
+
filebuffersize Opt
+
Buffer size for reading the file, -1 to disable buffering.
+
channelorder Opt
+
Custom ordering of speakers for this sound data. (FMOD_CHANNELORDER)
+
initialsoundgroup Opt
+
SoundGroup to place this Sound in once created. (SoundGroup)
+
initialseekposition Opt
+
Initial position to seek to for FMOD_CREATESTREAM.
+
initialseekpostype Opt
+
Time units for initialseekposition. (FMOD_TIMEUNIT)
+
ignoresetfilesystem Opt
+
Ignore System::setFileSystem and FMOD_CREATESOUNDEXINFO file callbacks.
+
audioqueuepolicy Opt
+
Hardware / software decoding policy for FMOD_SOUND_TYPE_AUDIOQUEUE, see FMOD_AUDIOQUEUE_CODECPOLICY.
+
minmidigranularity Opt
+
+

Mixer granularity for FMOD_SOUND_TYPE_MIDI sounds, smaller numbers give a more accurate reproduction at the cost of higher CPU usage.

+
    +
  • Units: Samples
  • +
  • Default: 512
  • +
+
+
nonblockthreadid Opt
+
+

Thread index to execute FMOD_NONBLOCKING loads on for parallel Sound loading.

+
    +
  • Range: [0, 4]
  • +
+
+
fsbguid Opt
+
On input, GUID of already loaded FMOD_SOUND_TYPE_FSB file to reduce disk access, on output, GUID of loaded FSB. (FMOD_GUID)
+
+

Loading a file from memory:

+
    +
  • Create the sound using the FMOD_OPENMEMORY flag.
  • +
  • Specify length for the size of the memory block in bytes.
  • +
+

Loading a file from within another larger (possibly wad/pak) file, by giving the loader an offset and length:

+
    +
  • Specify fileoffset and length.
  • +
+

Create a user created / non-file based sound:

+
    +
  • Create the sound using the FMOD_OPENUSER flag.
  • +
  • Specify defaultfrequency, numchannels and format.
  • +
+

Load an FSB stream seeking to a specific subsound in one file operation:

+ +

Load a subset of the Sounds in an FSB saving memory:

+
    +
  • Specify inclusionlist and inclusionlistnum.
  • +
  • Optionally set numsubsounds to match 'inclusionlistnum', saves memory and causes Sound::getSubSound to index into inclusionlist.
  • +
+

Capture sound data as it is decoded:

+
    +
  • Specify pcmreadcallback and pcmseekcallback.
  • +
+

Provide a custom DLS for MIDI playback:

+
    +
  • Specify dlsname.
  • +
+

Setting the decodebuffersize is for CPU intensive codecs that may be causing stuttering, not file intensive codecs (i.e. those from CD or net streams) which are normally altered with System::setStreamBufferSize. As an example of CPU intensive codecs, an MP3 file will take more CPU to decode than a PCM wav file.

+

If you hear stuttering, then the codec is using more CPU than the decode buffer playback rate can keep up with. Increasing the decodebuffersize is likely to solve this problem.

+

FSB codec. If inclusionlist and numsubsounds are used together, this will trigger a special mode where subsounds are shuffled down to save memory (useful for large FSB files where you only want to load 1 sound). There will be no gaps, ie no null subsounds. As an example, if there are 10,000 subsounds and there is an inclusionlist with only 1 entry, and numsubsounds = 1, then subsound 0 will be that entry, and there will only be the memory allocated for 1 subsound. Previously there would still be 10,000 subsound pointers and other associated codec entries allocated along with it multiplied by 10,000.

+

See Also: Callback Behavior, System::createSound

+

FMOD_DRIVER_STATE

+

Flags that provide additional information about a particular driver.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_DRIVER_STATE_CONNECTED   0x00000001
+#define FMOD_DRIVER_STATE_DEFAULT     0x00000002
+
+ +
[Flags]
+enum DRIVER_STATE : uint
+{
+  CONNECTED = 0x00000001,
+  DEFAULT   = 0x00000002,
+}
+
+ +
DRIVER_STATE_CONNECTED = 0x00000001
+DRIVER_STATE_DEFAULT   = 0x00000002
+
+ +
+
FMOD_DRIVER_STATE_CONNECTED
+
Device is currently plugged in.
+
FMOD_DRIVER_STATE_DEFAULT
+
Device is the users preferred choice.
+
+

See Also: System::getRecordDriverInfo

+

FMOD_DSP_RESAMPLER

+

List of interpolation types used for resampling.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_RESAMPLER {
+  FMOD_DSP_RESAMPLER_DEFAULT,
+  FMOD_DSP_RESAMPLER_NOINTERP,
+  FMOD_DSP_RESAMPLER_LINEAR,
+  FMOD_DSP_RESAMPLER_CUBIC,
+  FMOD_DSP_RESAMPLER_SPLINE,
+  FMOD_DSP_RESAMPLER_MAX
+} FMOD_DSP_RESAMPLER;
+
+ +
enum DSP_RESAMPLER : int
+{
+  DEFAULT,
+  NOINTERP,
+  LINEAR,
+  CUBIC,
+  SPLINE,
+  MAX
+}
+
+ +
DSP_RESAMPLER_DEFAULT
+DSP_RESAMPLER_NOINTERP
+DSP_RESAMPLER_LINEAR
+DSP_RESAMPLER_CUBIC
+DSP_RESAMPLER_SPLINE
+DSP_RESAMPLER_MAX
+
+ +
+
FMOD_DSP_RESAMPLER_DEFAULT
+
Default interpolation method, same as FMOD_DSP_RESAMPLER_LINEAR.
+
FMOD_DSP_RESAMPLER_NOINTERP
+
No interpolation. High frequency aliasing hiss will be audible depending on the sample rate of the sound.
+
FMOD_DSP_RESAMPLER_LINEAR
+
Linear interpolation (default method). Fast and good quality, causes very slight lowpass effect on low frequency sounds.
+
FMOD_DSP_RESAMPLER_CUBIC
+
Cubic interpolation. Slower than linear interpolation but better quality.
+
FMOD_DSP_RESAMPLER_SPLINE
+
5 point spline interpolation. Slowest resampling method but best quality.
+
FMOD_DSP_RESAMPLER_MAX
+
Maximum number of resample methods supported.
+
+

Use System::setAdvancedSettings and FMOD_ADVANCEDSETTINGS::resamplerMethod to configure the resampling quality you require for sample rate conversion during sound playback.

+

FMOD_ERRORCALLBACK_INFO

+

Information describing an error that has occurred.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_ERRORCALLBACK_INFO {
+  FMOD_RESULT                       result;
+  FMOD_ERRORCALLBACK_INSTANCETYPE   instancetype;
+  void                             *instance;
+  const char                       *functionname;
+  const char                       *functionparams;
+} FMOD_ERRORCALLBACK_INFO;
+
+ +
struct ERRORCALLBACK_INFO
+{
+  RESULT                      result;
+  ERRORCALLBACK_INSTANCETYPE  instancetype;
+  IntPtr                      instance;
+  StringWrapper               functionname;
+  StringWrapper               functionparams;
+}
+
+ +
ERRORCALLBACK_INFO
+{
+  result,
+  instancetype,
+  instance,
+  functionname,
+  functionparams,
+};
+
+ +
+
result
+
Error code result. (FMOD_RESULT)
+
instancetype
+
Type of instance the error occurred on. (FMOD_ERRORCALLBACK_INSTANCETYPE)
+
instance
+
Instance pointer.
+
functionname
+
Function that the error occurred on. (UTF-8 string)
+
functionparams
+
Function parameters that the error ocurred on. (UTF-8 string)
+
+

The instance pointer will be a type corresponding to the instanceType enum.

+

See Also: FMOD_SYSTEM_CALLBACK, FMOD_SYSTEM_CALLBACK_ERROR

+

FMOD_ERRORCALLBACK_INSTANCETYPE

+

Identifier used to represent the different types of instance in the error callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_ERRORCALLBACK_INSTANCETYPE {
+  FMOD_ERRORCALLBACK_INSTANCETYPE_NONE,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_DSP,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK,
+  FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY
+} FMOD_ERRORCALLBACK_INSTANCETYPE;
+
+ +
enum ERRORCALLBACK_INSTANCETYPE
+{
+  NONE,
+  SYSTEM,
+  CHANNEL,
+  CHANNELGROUP,
+  CHANNELCONTROL,
+  SOUND,
+  SOUNDGROUP,
+  DSP,
+  DSPCONNECTION,
+  GEOMETRY,
+  REVERB3D,
+  STUDIO_SYSTEM,
+  STUDIO_EVENTDESCRIPTION,
+  STUDIO_EVENTINSTANCE,
+  STUDIO_PARAMETERINSTANCE,
+  STUDIO_BUS,
+  STUDIO_VCA,
+  STUDIO_BANK,
+  STUDIO_COMMANDREPLAY
+}
+
+ +
ERRORCALLBACK_INSTANCETYPE_NONE
+ERRORCALLBACK_INSTANCETYPE_SYSTEM
+ERRORCALLBACK_INSTANCETYPE_CHANNEL
+ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP
+ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL
+ERRORCALLBACK_INSTANCETYPE_SOUND
+ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP
+ERRORCALLBACK_INSTANCETYPE_DSP
+ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION
+ERRORCALLBACK_INSTANCETYPE_GEOMETRY
+ERRORCALLBACK_INSTANCETYPE_REVERB3D
+ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM
+ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION
+ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE
+ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE
+ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS
+ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA
+ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK
+ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY
+
+ +
+
FMOD_ERRORCALLBACK_INSTANCETYPE_NONE
+
Type representing no known instance type.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM
+
Type representing System.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL
+
Type representing Channel.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP
+
Type representing ChannelGroup.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL
+
Type representing ChannelControl.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND
+
Type representing Sound.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP
+
Type representing SoundGroup.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_DSP
+
Type representing DSP.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION
+
Type representing DSPConnection.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY
+
Type representing Geometry.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D
+
Type representing Reverb3D.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM
+
Type representing Studio::System.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION
+
Type representing Studio::EventDescription.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE
+
Type representing Studio::EventInstance.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE
+
Deprecated.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS
+
Type representing Studio::Bus.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA
+
Type representing Studio::VCA.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK
+
Type representing Studio::Bank.
+
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY
+
Type representing Studio::CommandReplay.
+
+

See Also: FMOD_ERRORCALLBACK_INFO, FMOD_SYSTEM_CALLBACK, FMOD_SYSTEM_CALLBACK_ERROR

+

FMOD_FILE_ASYNCCANCEL_CALLBACK

+

Callback for cancelling a pending asynchronous read.

+

This callback is called to stop/release or shut down the resource that is holding the file, for example: releasing a Sound stream.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_FILE_ASYNCCANCEL_CALLBACK(
+  FMOD_ASYNCREADINFO *info,
+  void *userdata
+);
+
+ +
delegate RESULT FILE_ASYNCCANCELCALLBACK(
+  IntPtr info,
+  IntPtr userdata
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
info
+
Information describing the asynchronous read operation to cancel. (FMOD_ASYNCREADINFO)
+
userdata Opt
+
User value set by FMOD_CREATESOUNDEXINFO::fileuserdata or FMOD_STUDIO_BANK_INFO::userData.
+
+

Before returning from this callback the implementation must ensure that all references to info are relinquished.

+

See Also: System::setFileSystem, FMOD_FILE_OPEN_CALLBACK, FMOD_FILE_CLOSE_CALLBACK, FMOD_FILE_READ_CALLBACK, FMOD_FILE_SEEK_CALLBACK, FMOD_FILE_ASYNCREAD_CALLBACK

+

FMOD_FILE_ASYNCDONE_FUNC

+

Function to be called when asynchronous reading is finished.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
void F_CALL FMOD_FILE_ASYNCDONE_FUNC(
+  FMOD_ASYNCREADINFO *info,
+  FMOD_RESULT result
+);
+
+ +
delegate void FILE_ASYNCDONE_FUNC(
+  IntPtr info,
+  RESULT result
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
info
+
Async info for the completed operation. (FMOD_ASYNCREADINFO)
+
result
+
The result of the read operation. (FMOD_RESULT)
+
+

Relevant result codes to use with this function include:

+ +

FMOD_FILE_ASYNCREAD_CALLBACK

+

Callback for reading from a file asynchronously.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_FILE_ASYNCREAD_CALLBACK(
+  FMOD_ASYNCREADINFO *info,
+  void *userdata
+);
+
+ +
delegate RESULT FILE_ASYNCREADCALLBACK(
+  IntPtr info,
+  IntPtr userdata
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
info
+
Information describing the requested asynchronous read operation. (FMOD_ASYNCREADINFO)
+
userdata Opt
+
User value set by FMOD_CREATESOUNDEXINFO::fileuserdata or FMOD_STUDIO_BANK_INFO::userData.
+
+

This callback allows you to accept a file I/O request without servicing it immediately. The callback can queue or store the FMOD_ASYNCREADINFO structure pointer, so that a 'servicing routine' can read the data and mark the job as done.

+

Marking an asynchronous job as 'done' outside of this callback can be done by calling the FMOD_ASYNCREADINFO::done function pointer with the file read result as a parameter.

+

If the servicing routine is processed in the same thread as the thread that invokes this callback (for example the thread that calls System::createSound or System::createStream), a deadlock will occur because while System::createSound or System::createStream waits for the file data, the servicing routine in the main thread won't be able to execute.

+

This typically means an outside servicing routine should typically be run in a separate thread.

+

The read request can be queued or stored and this callback can return immediately with FMOD_OK. Returning an error at this point will cause FMOD to stop what it was doing and return back to the caller. If it is from FMOD's stream thread, the stream will typically stop.

+

See Also: System::setFileSystem, FMOD_FILE_OPEN_CALLBACK, FMOD_FILE_CLOSE_CALLBACK, FMOD_FILE_READ_CALLBACK, FMOD_FILE_SEEK_CALLBACK, FMOD_FILE_ASYNCCANCEL_CALLBACK

+

FMOD_FILE_CLOSE_CALLBACK

+

Calback for closing a file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_FILE_CLOSE_CALLBACK(
+  void *handle,
+  void *userdata
+);
+
+ +
delegate RESULT FILE_CLOSECALLBACK(
+  IntPtr handle,
+  IntPtr userdata
+);
+
+ +
function FMOD_FILE_CLOSE_CALLBACK(
+  handle,
+  userdata
+)
+
+ +
+
handle
+
File handle that was returned in FMOD_FILE_OPEN_CALLBACK.
+
userdata
+
User value set by FMOD_CREATESOUNDEXINFO::fileuserdata or FMOD_STUDIO_BANK_INFO::userData.
+
+

Close any user created file handle and perform any cleanup necessary for the file here. If the callback is from System::attachFileSystem, then the return value is ignored.

+

See Also: System::setFileSystem, FMOD_FILE_OPEN_CALLBACK, FMOD_FILE_READ_CALLBACK, FMOD_FILE_SEEK_CALLBACK, FMOD_FILE_ASYNCREAD_CALLBACK, FMOD_FILE_ASYNCCANCEL_CALLBACK

+

FMOD_FILE_OPEN_CALLBACK

+

Callback for opening a file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_FILE_OPEN_CALLBACK(
+  const char *name,
+  unsigned int *filesize,
+  void **handle,
+  void *userdata
+);
+
+ +
delegate RESULT FILE_OPENCALLBACK(
+  IntPtr name,
+  ref uint filesize,
+  ref IntPtr handle,
+  IntPtr userdata
+);
+
+ +
function FMOD_FILE_OPEN_CALLBACK(
+  name,
+  filesize,
+  handle,
+  userdata
+)
+
+ +
+
name
+
File name or identifier. (UTF-8 string)
+
filesize Out
+
+

Size of the file.

+
    +
  • Units: Bytes
  • +
+
+
handle Out
+
Handle to identify this file in future file callbacks.
+
userdata
+
User value set by FMOD_CREATESOUNDEXINFO::fileuserdata or FMOD_STUDIO_BANK_INFO::userData.
+
+

Return the appropriate error code such as FMOD_ERR_FILE_NOTFOUND if the file fails to open. If the callback is from System::attachFileSystem, then the return value is ignored.

+
+

The 'name' argument can be used via StringWrapper by using FMOD.StringWrapper nameStr = new FMOD.StringWrapper(name);

+
+

See Also: System::setFileSystem, FMOD_FILE_CLOSE_CALLBACK, FMOD_FILE_READ_CALLBACK, FMOD_FILE_SEEK_CALLBACK, FMOD_FILE_ASYNCREAD_CALLBACK, FMOD_FILE_ASYNCCANCEL_CALLBACK

+

FMOD_FILE_READ_CALLBACK

+

Callback for reading from a file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_FILE_READ_CALLBACK(
+  void *handle,
+  void *buffer,
+  unsigned int sizebytes,
+  unsigned int *bytesread,
+  void *userdata
+);
+
+ +
delegate RESULT FILE_READCALLBACK(
+  IntPtr handle,
+  IntPtr buffer,
+  uint sizebytes,
+  ref uint bytesread,
+  IntPtr userdata
+);
+
+ +
function FMOD_FILE_READ_CALLBACK(
+  handle,
+  buffer,
+  sizebytes,
+  bytesread,
+  userdata
+)
+
+ +
+
handle
+
File handle that was returned in FMOD_FILE_OPEN_CALLBACK.
+
buffer Out
+
Buffer to read data into.
+
sizebytes
+
+

Number of bytes to read into buffer.

+
    +
  • Units: Bytes
  • +
+
+
bytesread Out
+
+

Number of bytes read into buffer.

+
    +
  • Units: Bytes
  • +
+
+
userdata
+
User value set by FMOD_CREATESOUNDEXINFO::fileuserdata or FMOD_STUDIO_BANK_INFO::userData.
+
+

If the callback is from System::attachFileSystem, then the return value is ignored.

+

If there is not enough data to read the requested number of bytes, return fewer bytes in the bytesread parameter and and return FMOD_ERR_FILE_EOF.

+

See Also: System::setFileSystem, FMOD_FILE_OPEN_CALLBACK, FMOD_FILE_CLOSE_CALLBACK, FMOD_FILE_SEEK_CALLBACK, FMOD_FILE_ASYNCREAD_CALLBACK, FMOD_FILE_ASYNCCANCEL_CALLBACK

+

FMOD_FILE_SEEK_CALLBACK

+

Callback for seeking within a file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_FILE_SEEK_CALLBACK(
+  void *handle,
+  unsigned int pos,
+  void *userdata
+);
+
+ +
delegate RESULT FILE_SEEKCALLBACK(
+  IntPtr handle,
+  uint pos,
+  IntPtr userdata
+);
+
+ +
function FMOD_FILE_SEEK_CALLBACK(
+  handle,
+  pos,
+  userdata
+)
+
+ +
+
handle
+
File handle that returned in FMOD_FILE_OPEN_CALLBACK.
+
pos
+
+

Absolute position to seek to in file.

+
    +
  • Units: Bytes
  • +
+
+
userdata
+
User value set by FMOD_CREATESOUNDEXINFO::fileuserdata or FMOD_STUDIO_BANK_INFO::userData.
+
+

If the callback is from System::attachFileSystem, then the return value is ignored.

+

See Also: System::setFileSystem, FMOD_FILE_OPEN_CALLBACK, FMOD_FILE_CLOSE_CALLBACK, FMOD_FILE_READ_CALLBACK, FMOD_FILE_ASYNCREAD_CALLBACK, FMOD_FILE_ASYNCCANCEL_CALLBACK

+

FMOD_INITFLAGS

+

Configuration flags used when initializing the System object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_INIT_NORMAL                     0x00000000
+#define FMOD_INIT_STREAM_FROM_UPDATE         0x00000001
+#define FMOD_INIT_MIX_FROM_UPDATE            0x00000002
+#define FMOD_INIT_3D_RIGHTHANDED             0x00000004
+#define FMOD_INIT_CLIP_OUTPUT                0x00000008
+#define FMOD_INIT_CHANNEL_LOWPASS            0x00000100
+#define FMOD_INIT_CHANNEL_DISTANCEFILTER     0x00000200
+#define FMOD_INIT_PROFILE_ENABLE             0x00010000
+#define FMOD_INIT_VOL0_BECOMES_VIRTUAL       0x00020000
+#define FMOD_INIT_GEOMETRY_USECLOSEST        0x00040000
+#define FMOD_INIT_PREFER_DOLBY_DOWNMIX       0x00080000
+#define FMOD_INIT_THREAD_UNSAFE              0x00100000
+#define FMOD_INIT_PROFILE_METER_ALL          0x00200000
+#define FMOD_INIT_MEMORY_TRACKING            0x00400000
+
+ +
[Flags]
+enum INITFLAGS : uint
+{
+  NORMAL                     = 0x00000000,
+  STREAM_FROM_UPDATE         = 0x00000001,
+  MIX_FROM_UPDATE            = 0x00000002,
+  _3D_RIGHTHANDED            = 0x00000004,
+  CLIP_OUTPUT                = 0x00000008,
+  CHANNEL_LOWPASS            = 0x00000100,
+  CHANNEL_DISTANCEFILTER     = 0x00000200,
+  PROFILE_ENABLE             = 0x00010000,
+  VOL0_BECOMES_VIRTUAL       = 0x00020000,
+  GEOMETRY_USECLOSEST        = 0x00040000,
+  PREFER_DOLBY_DOWNMIX       = 0x00080000,
+  THREAD_UNSAFE              = 0x00100000,
+  PROFILE_METER_ALL          = 0x00200000,
+  MEMORY_TRACKING            = 0x00400000,
+}
+
+ +
INIT_NORMAL                 = 0x00000000
+INIT_STREAM_FROM_UPDATE     = 0x00000001
+INIT_MIX_FROM_UPDATE        = 0x00000002
+INIT_3D_RIGHTHANDED         = 0x00000004
+INIT_CLIP_OUTPUT            = 0x00000008
+INIT_CHANNEL_LOWPASS        = 0x00000100
+INIT_CHANNEL_DISTANCEFILTER = 0x00000200
+INIT_PROFILE_ENABLE         = 0x00010000
+INIT_VOL0_BECOMES_VIRTUAL   = 0x00020000
+INIT_GEOMETRY_USECLOSEST    = 0x00040000
+INIT_PREFER_DOLBY_DOWNMIX   = 0x00080000
+INIT_THREAD_UNSAFE          = 0x00100000
+INIT_PROFILE_METER_ALL      = 0x00200000
+INIT_MEMORY_TRACKING        = 0x00400000
+
+ +
+
FMOD_INIT_NORMAL
+
Initialize normally
+
FMOD_INIT_STREAM_FROM_UPDATE
+
No stream thread is created internally. Streams are driven from System::update. Mainly used with non-realtime outputs.
+
FMOD_INIT_MIX_FROM_UPDATE
+
No mixer thread is created internally. Mixing is driven from System::update. Only applies to polling based output modes such as FMOD_OUTPUTTYPE_NOSOUND, FMOD_OUTPUTTYPE_WAVWRITER.
+
FMOD_INIT_3D_RIGHTHANDED
+
3D calculations will be performed in right-handed coordinates, instead of the default of left-handed coordinates. See the Handedness section of the Glossary for more information.
+
FMOD_INIT_CLIP_OUTPUT
+
Enables hard clipping of output values greater than 1.0f or less than -1.0f.
+
FMOD_INIT_CHANNEL_LOWPASS
+
Enables usage of ChannelControl::setLowPassGain, ChannelControl::set3DOcclusion, or automatic usage by the Geometry API. All voices will add a software lowpass filter effect into the DSP chain which is idle unless one of the previous functions/features are used.
+
FMOD_INIT_CHANNEL_DISTANCEFILTER
+
All FMOD_3D based voices add a software low pass and highpass filter effect into the DSP chain, which acts as a distance-automated bandpass filter. Use System::setAdvancedSettings to adjust the center frequency.
+
FMOD_INIT_PROFILE_ENABLE
+
Enable TCP/IP based host which allows FMOD Studio or FMOD Profiler to connect to it, and view memory, CPU and the DSP graph in real-time.
+
FMOD_INIT_VOL0_BECOMES_VIRTUAL
+
Any sounds that are 0 volume will go virtual and not be processed except for having their positions updated virtually. Use System::setAdvancedSettings to adjust what volume besides zero to switch to virtual at.
+
FMOD_INIT_GEOMETRY_USECLOSEST
+
With the geometry engine, only process the closest polygon rather than accumulating all polygons the sound to listener line intersects.
+
FMOD_INIT_PREFER_DOLBY_DOWNMIX
+
When using FMOD_SPEAKERMODE_5POINT1 with a stereo output device, use the Dolby Pro Logic II downmix algorithm instead of the default stereo downmix algorithm.
+
FMOD_INIT_THREAD_UNSAFE
+
Disables thread safety for API calls. Only use this if FMOD is being called from a single thread, and if Studio API is not being used!
+
FMOD_INIT_PROFILE_METER_ALL
+
Slower, but adds level metering for every single DSP unit in the graph. Use DSP::setMeteringEnabled to turn meters off individually. Setting this flag implies FMOD_INIT_PROFILE_ENABLE.
+
FMOD_INIT_MEMORY_TRACKING
+
Enables memory allocation tracking. Currently this is only useful when using the Studio API. Increases memory footprint and reduces performance. This flag is implied by FMOD_STUDIO_INIT_MEMORY_TRACKING.
+
+

See Also: System::init

+

FMOD_OUTPUTTYPE

+

Built-in output types that can be used to run the mixer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_OUTPUTTYPE {
+  FMOD_OUTPUTTYPE_AUTODETECT,
+  FMOD_OUTPUTTYPE_UNKNOWN,
+  FMOD_OUTPUTTYPE_NOSOUND,
+  FMOD_OUTPUTTYPE_WAVWRITER,
+  FMOD_OUTPUTTYPE_NOSOUND_NRT,
+  FMOD_OUTPUTTYPE_WAVWRITER_NRT,
+  FMOD_OUTPUTTYPE_WASAPI,
+  FMOD_OUTPUTTYPE_ASIO,
+  FMOD_OUTPUTTYPE_PULSEAUDIO,
+  FMOD_OUTPUTTYPE_ALSA,
+  FMOD_OUTPUTTYPE_COREAUDIO,
+  FMOD_OUTPUTTYPE_AUDIOTRACK,
+  FMOD_OUTPUTTYPE_OPENSL,
+  FMOD_OUTPUTTYPE_AUDIOOUT,
+  FMOD_OUTPUTTYPE_AUDIO3D,
+  FMOD_OUTPUTTYPE_WEBAUDIO,
+  FMOD_OUTPUTTYPE_NNAUDIO,
+  FMOD_OUTPUTTYPE_WINSONIC,
+  FMOD_OUTPUTTYPE_AAUDIO,
+  FMOD_OUTPUTTYPE_AUDIOWORKLET,
+  FMOD_OUTPUTTYPE_PHASE,
+  FMOD_OUTPUTTYPE_OHAUDIO,
+  FMOD_OUTPUTTYPE_MAX
+} FMOD_OUTPUTTYPE;
+
+ +
enum OUTPUTTYPE : int
+{
+  AUTODETECT,
+  UNKNOWN,
+  NOSOUND,
+  WAVWRITER,
+  NOSOUND_NRT,
+  WAVWRITER_NRT,
+  WASAPI,
+  ASIO,
+  PULSEAUDIO,
+  ALSA,
+  COREAUDIO,
+  AUDIOTRACK,
+  OPENSL,
+  AUDIOOUT,
+  AUDIO3D,
+  WEBAUDIO,
+  NNAUDIO,
+  WINSONIC,
+  AAUDIO,
+  AUDIOWORKLET,
+  PHASE,
+  OHAUDIO,
+  MAX,
+}
+
+ +
OUTPUTTYPE_AUTODETECT
+OUTPUTTYPE_UNKNOWN
+OUTPUTTYPE_NOSOUND
+OUTPUTTYPE_WAVWRITER
+OUTPUTTYPE_NOSOUND_NRT
+OUTPUTTYPE_WAVWRITER_NRT
+OUTPUTTYPE_WASAPI
+OUTPUTTYPE_ASIO
+OUTPUTTYPE_PULSEAUDIO
+OUTPUTTYPE_ALSA
+OUTPUTTYPE_COREAUDIO
+OUTPUTTYPE_AUDIOTRACK
+OUTPUTTYPE_OPENSL
+OUTPUTTYPE_AUDIOOUT
+OUTPUTTYPE_AUDIO3D
+OUTPUTTYPE_WEBAUDIO
+OUTPUTTYPE_NNAUDIO
+OUTPUTTYPE_WINSONIC
+OUTPUTTYPE_AAUDIO
+OUTPUTTYPE_AUDIOWORKLET
+OUTPUTTYPE_PHASE
+OUTPUTTYPE_OHAUDIO
+OUTPUTTYPE_MAX
+
+ +
+
FMOD_OUTPUTTYPE_AUTODETECT
+
Picks the best output mode for the platform. This is the default.
+
FMOD_OUTPUTTYPE_UNKNOWN
+
All - 3rd party plug-in, unknown. This is for use with System::getOutput only.
+
FMOD_OUTPUTTYPE_NOSOUND
+
All - Perform all mixing but discard the final output.
+
FMOD_OUTPUTTYPE_WAVWRITER
+
All - Writes output to a .wav file.
+
FMOD_OUTPUTTYPE_NOSOUND_NRT
+
All - Non-realtime version of FMOD_OUTPUTTYPE_NOSOUND, one mix per System::update.
+
FMOD_OUTPUTTYPE_WAVWRITER_NRT
+
All - Non-realtime version of FMOD_OUTPUTTYPE_WAVWRITER, one mix per System::update.
+
FMOD_OUTPUTTYPE_WASAPI
+
Win / UWP / Xbox One / Game Core - Windows Audio Session API. (Default on Windows, Xbox One, Game Core and UWP)
+
FMOD_OUTPUTTYPE_ASIO
+
Win - Low latency ASIO 2.0.
+
FMOD_OUTPUTTYPE_PULSEAUDIO
+
Linux - Pulse Audio. (Default on Linux if available)
+
FMOD_OUTPUTTYPE_ALSA
+
Linux - Advanced Linux Sound Architecture. (Default on Linux if PulseAudio isn't available)
+
FMOD_OUTPUTTYPE_COREAUDIO
+
Mac / iOS - Core Audio. (Default on Mac and iOS)
+
FMOD_OUTPUTTYPE_AUDIOTRACK
+
Android - Java Audio Track. (Default on Android 2.2 and below)
+
FMOD_OUTPUTTYPE_OPENSL
+
Android - OpenSL ES. (Default on Android 2.3 up to 7.1)
+
FMOD_OUTPUTTYPE_AUDIOOUT
+
PS4 / PS5 - Audio Out. (Default on PS4, PS5)
+
FMOD_OUTPUTTYPE_AUDIO3D
+
PS4 - Audio3D.
+
FMOD_OUTPUTTYPE_WEBAUDIO
+
HTML5 - Web Audio ScriptProcessorNode output. (Default on HTML5 if AudioWorkletNode isn't available)
+
FMOD_OUTPUTTYPE_NNAUDIO
+
Switch - nn::audio. (Default on Switch)
+
FMOD_OUTPUTTYPE_WINSONIC
+
Win10 / Xbox One / Game Core - Windows Sonic.
+
FMOD_OUTPUTTYPE_AAUDIO
+
Android - AAudio. (Default on Android 8.1 and above)
+
FMOD_OUTPUTTYPE_AUDIOWORKLET
+
HTML5 - Web Audio AudioWorkletNode output. (Default on HTML5 if available)
+
FMOD_OUTPUTTYPE_PHASE
+
iOS - PHASE framework. (Disabled)
+
FMOD_OUTPUTTYPE_OHAUDIO
+
OpenHarmony - OHAudio.
+
FMOD_OUTPUTTYPE_MAX
+
Maximum number of output types supported.
+
+

To pass information to the driver when initializing use the extradriverdata parameter in System::init for the following reasons:

+ +

Currently these are the only FMOD drivers that take extra information. Other unknown plug-ins may have different requirements.

+

If FMOD_OUTPUTTYPE_WAVWRITER_NRT or FMOD_OUTPUTTYPE_NOSOUND_NRT are used, and if the System::update function is being called very quickly (ie for a non realtime decode) it may be being called too quickly for the FMOD streamer thread to respond to. The result will be a skipping/stuttering output in the captured audio. To remedy this, disable the FMOD streamer thread, and use FMOD_INIT_STREAM_FROM_UPDATE to avoid skipping in the output stream, as it will lock the mixer and the streamer together in the same thread.

+

See Also: System::setOutput, System::getOutput

+

FMOD_PLUGINLIST

+

Used to support lists of plug-ins within the one dynamic library.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_PLUGINLIST {
+  FMOD_PLUGINTYPE  type;
+  void            *description;
+} FMOD_PLUGINLIST;
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
type R/O
+
Plug-in type. (FMOD_PLUGINTYPE)
+
description R/O
+
One of the plug-in description structures. (FMOD_DSP_DESCRIPTION) (FMOD_OUTPUT_DESCRIPTION) (FMOD_CODEC_DESCRIPTION).
+
+

This structure is returned from a plugin as a pointer to a list where the last entry has FMOD_PLUGINTYPE_MAX and a NULL description.

+

See Also: System::getNumNestedPlugins, System::getNestedPlugin

+

FMOD_PLUGINTYPE

+

Types of plug-in used to extend functionality.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_PLUGINTYPE {
+  FMOD_PLUGINTYPE_OUTPUT,
+  FMOD_PLUGINTYPE_CODEC,
+  FMOD_PLUGINTYPE_DSP,
+  FMOD_PLUGINTYPE_MAX
+} FMOD_PLUGINTYPE;
+
+ +
enum PLUGINTYPE : int
+{
+  OUTPUT,
+  CODEC,
+  DSP,
+  MAX
+}
+
+ +
PLUGINTYPE_OUTPUT
+PLUGINTYPE_CODEC
+PLUGINTYPE_DSP
+PLUGINTYPE_MAX
+
+ +
+
FMOD_PLUGINTYPE_OUTPUT
+
Audio output interface plug-in represented with FMOD_OUTPUT_DESCRIPTION.
+
FMOD_PLUGINTYPE_CODEC
+
File format codec plug-in represented with FMOD_CODEC_DESCRIPTION.
+
FMOD_PLUGINTYPE_DSP
+
DSP unit plug-in represented with FMOD_DSP_DESCRIPTION.
+
FMOD_PLUGINTYPE_MAX
+
Maximum number of plug-in types supported.
+
+

See Also: System::getNumPlugins, System::getPluginInfo, System::unloadPlugin

+

FMOD_PORT_INDEX

+

Output type specific index for when there are multiple instances or destinations for a port type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_PORT_INDEX_NONE 0xFFFFFFFFFFFFFFFF
+
+ +
struct PORT_INDEX
+{
+  const ulong NONE = 0xFFFFFFFFFFFFFFFF;
+}
+
+ +
PORT_INDEX_NONE = 0xFFFFFFFFFFFFFFFF
+
+ +
+
FMOD_PORT_INDEX_NONE
+
Use when a port index is not required
+
+

See Also: System::attachChannelGroupToPort, FMOD_PORT_TYPE

+

FMOD_PORT_TYPE

+

Port types available for routing audio.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_PORT_TYPE
+{
+    FMOD_PORT_TYPE_MUSIC,
+    FMOD_PORT_TYPE_COPYRIGHT_MUSIC,
+    FMOD_PORT_TYPE_VOICE,
+    FMOD_PORT_TYPE_CONTROLLER,
+    FMOD_PORT_TYPE_PERSONAL,
+    FMOD_PORT_TYPE_VIBRATION,
+    FMOD_PORT_TYPE_AUX,
+    FMOD_PORT_TYPE_PASSTHROUGH,
+    FMOD_PORT_TYPE_VR_VIBRATION,
+    FMOD_PORT_TYPE_MAX
+} FMOD_PORT_TYPE;
+
+ +
enum PORT_TYPE : int
+{
+    MUSIC,
+    COPYRIGHT_MUSIC,
+    VOICE,
+    CONTROLLER,
+    PERSONAL,
+    VIBRATION,
+    AUX,
+    PASSTHROUGH,
+    VR_VIBRATION,
+    MAX
+}
+
+ +
PORT_TYPE_MUSIC
+PORT_TYPE_COPYRIGHT_MUSIC
+PORT_TYPE_VOICE
+PORT_TYPE_CONTROLLER
+PORT_TYPE_PERSONAL
+PORT_TYPE_VIBRATION
+PORT_TYPE_AUX
+PORT_TYPE_PASSTHROUGH
+PORT_TYPE_VR_VIBRATION
+PORT_TYPE_MAX
+
+ +
+
FMOD_PORT_TYPE_MUSIC
+
Background music, pass FMOD_PORT_INDEX_NONE as port index.
+ +
Copyright background music, pass FMOD_PORT_INDEX_NONE as port index.
+
FMOD_PORT_TYPE_VOICE
+
Voice chat, pass platform specific user ID of desired user as port index.
+
FMOD_PORT_TYPE_CONTROLLER
+
Controller speaker, pass platform specific user ID of desired user as port index.
+
FMOD_PORT_TYPE_PERSONAL
+
Personal audio device, pass platform specific user ID of desired user as port index.
+
FMOD_PORT_TYPE_VIBRATION
+
Controller vibration, pass platform specific user ID of desired user as port index.
+
FMOD_PORT_TYPE_AUX
+
Auxiliary output port, pass FMOD_PORT_INDEX_NONE as port index.
+
FMOD_PORT_TYPE_PASSTHROUGH
+
Passthrough output port, pass FMOD_PORT_INDEX_NONE as port index.
+
FMOD_PORT_TYPE_VR_VIBRATION
+
VR Controller vibration, pass platform specific user ID of desired user as port index.
+
FMOD_PORT_TYPE_MAX
+
Maximum number of port types supported.
+
+

Not all platforms support all port types. See platform specific guides for a list of supported port types on each platform.

+

See Also: System::attachChannelGroupToPort

+

FMOD_REVERB_MAXINSTANCES

+

The maximum number of global reverb instances.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_REVERB_MAXINSTANCES 4
+
+ +
class CONSTANTS
+{
+  const int REVERB_MAXINSTANCES = 4;
+}
+
+ +
REVERB_MAXINSTANCES = 4
+
+ +
+
FMOD_REVERB_MAXINSTANCES
+
Maximum instances available.
+
+

Each instance of a reverb is an instance of an FMOD_DSP_SFXREVERB DSP in the DSP graph. This is unrelated to the number of possible Reverb3D objects, which is unlimited.

+

See Also: ChannelControl::setReverbProperties, ChannelControl::setReverbProperties, System::setReverbProperties, System::getReverbProperties

+

FMOD_REVERB_PRESETS

+

Predefined reverb configurations. To simplify usage, and avoid manually selecting reverb parameters, a table of common presets is supplied for ease of use.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_PRESET_OFF                {  1000,    7,  11, 5000, 100, 100, 100, 250, 0,    20,  96, -80.0f }
+#define FMOD_PRESET_GENERIC            {  1500,    7,  11, 5000,  83, 100, 100, 250, 0, 14500,  96,  -8.0f }
+#define FMOD_PRESET_PADDEDCELL         {   170,    1,   2, 5000,  10, 100, 100, 250, 0,   160,  84,  -7.8f }
+#define FMOD_PRESET_ROOM               {   400,    2,   3, 5000,  83, 100, 100, 250, 0,  6050,  88,  -9.4f }
+#define FMOD_PRESET_BATHROOM           {  1500,    7,  11, 5000,  54, 100,  60, 250, 0,  2900,  83,   0.5f }
+#define FMOD_PRESET_LIVINGROOM         {   500,    3,   4, 5000,  10, 100, 100, 250, 0,   160,  58, -19.0f }
+#define FMOD_PRESET_STONEROOM          {  2300,   12,  17, 5000,  64, 100, 100, 250, 0,  7800,  71,  -8.5f }
+#define FMOD_PRESET_AUDITORIUM         {  4300,   20,  30, 5000,  59, 100, 100, 250, 0,  5850,  64, -11.7f }
+#define FMOD_PRESET_CONCERTHALL        {  3900,   20,  29, 5000,  70, 100, 100, 250, 0,  5650,  80,  -9.8f }
+#define FMOD_PRESET_CAVE               {  2900,   15,  22, 5000, 100, 100, 100, 250, 0, 20000,  59, -11.3f }
+#define FMOD_PRESET_ARENA              {  7200,   20,  30, 5000,  33, 100, 100, 250, 0,  4500,  80,  -9.6f }
+#define FMOD_PRESET_HANGAR             { 10000,   20,  30, 5000,  23, 100, 100, 250, 0,  3400,  72,  -7.4f }
+#define FMOD_PRESET_CARPETTEDHALLWAY   {   300,    2,  30, 5000,  10, 100, 100, 250, 0,   500,  56, -24.0f }
+#define FMOD_PRESET_HALLWAY            {  1500,    7,  11, 5000,  59, 100, 100, 250, 0,  7800,  87,  -5.5f }
+#define FMOD_PRESET_STONECORRIDOR      {   270,   13,  20, 5000,  79, 100, 100, 250, 0,  9000,  86,  -6.0f }
+#define FMOD_PRESET_ALLEY              {  1500,    7,  11, 5000,  86, 100, 100, 250, 0,  8300,  80,  -9.8f }
+#define FMOD_PRESET_FOREST             {  1500,  162,  88, 5000,  54,  79, 100, 250, 0,   760,  94, -12.3f }
+#define FMOD_PRESET_CITY               {  1500,    7,  11, 5000,  67,  50, 100, 250, 0,  4050,  66, -26.0f }
+#define FMOD_PRESET_MOUNTAINS          {  1500,  300, 100, 5000,  21,  27, 100, 250, 0,  1220,  82, -24.0f }
+#define FMOD_PRESET_QUARRY             {  1500,   61,  25, 5000,  83, 100, 100, 250, 0,  3400, 100,  -5.0f }
+#define FMOD_PRESET_PLAIN              {  1500,  179, 100, 5000,  50,  21, 100, 250, 0,  1670,  65, -28.0f }
+#define FMOD_PRESET_PARKINGLOT         {  1700,    8,  12, 5000, 100, 100, 100, 250, 0, 20000,  56, -19.5f }
+#define FMOD_PRESET_SEWERPIPE          {  2800,   14,  21, 5000,  14,  80,  60, 250, 0,  3400,  66,   1.2f }
+#define FMOD_PRESET_UNDERWATER         {  1500,    7,  11, 5000,  10, 100, 100, 250, 0,   500,  92,   7.0f }
+
+ +
class PRESET
+{
+  REVERB_PROPERTIES OFF
+  REVERB_PROPERTIES GENERIC
+  REVERB_PROPERTIES PADDEDCELL
+  REVERB_PROPERTIES ROOM
+  REVERB_PROPERTIES BATHROOM
+  REVERB_PROPERTIES LIVINGROOM
+  REVERB_PROPERTIES STONEROOM
+  REVERB_PROPERTIES AUDITORIUM
+  REVERB_PROPERTIES CONCERTHALL
+  REVERB_PROPERTIES CAVE
+  REVERB_PROPERTIES ARENA
+  REVERB_PROPERTIES HANGAR
+  REVERB_PROPERTIES CARPETTEDHALLWAY
+  REVERB_PROPERTIES HALLWAY
+  REVERB_PROPERTIES STONECORRIDOR
+  REVERB_PROPERTIES ALLEY
+  REVERB_PROPERTIES FOREST
+  REVERB_PROPERTIES CITY
+  REVERB_PROPERTIES MOUNTAINS
+  REVERB_PROPERTIES QUARRY
+  REVERB_PROPERTIES PLAIN
+  REVERB_PROPERTIES PARKINGLOT
+  REVERB_PROPERTIES SEWERPIPE
+  REVERB_PROPERTIES UNDERWATER
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
FMOD_PRESET_OFF
+
Off / disabled
+
FMOD_PRESET_GENERIC
+
Generic / default
+
FMOD_PRESET_PADDEDCELL
+
Padded cell
+
FMOD_PRESET_ROOM
+
Room
+
FMOD_PRESET_BATHROOM
+
Bathroom
+
FMOD_PRESET_LIVINGROOM
+
Living room
+
FMOD_PRESET_STONEROOM
+
Stone room
+
FMOD_PRESET_AUDITORIUM
+
Auditorium
+
FMOD_PRESET_CONCERTHALL
+
Convert hall
+
FMOD_PRESET_CAVE
+
Cave
+
FMOD_PRESET_ARENA
+
Arena
+
FMOD_PRESET_HANGAR
+
Hangar
+
FMOD_PRESET_CARPETTEDHALLWAY
+
Carpeted hallway
+
FMOD_PRESET_HALLWAY
+
Hallway
+
FMOD_PRESET_STONECORRIDOR
+
Stone corridor
+
FMOD_PRESET_ALLEY
+
Alley
+
FMOD_PRESET_FOREST
+
Forest
+
FMOD_PRESET_CITY
+
City
+
FMOD_PRESET_MOUNTAINS
+
Mountains
+
FMOD_PRESET_QUARRY
+
Quarry
+
FMOD_PRESET_PLAIN
+
Plain
+
FMOD_PRESET_PARKINGLOT
+
Parking lot
+
FMOD_PRESET_SEWERPIPE
+
Sewer pipe
+
FMOD_PRESET_UNDERWATER
+
Underwater
+
+

Sets of predefined reverb properties used to initialize an FMOD_REVERB_PROPERTIES structure statically.
+For example:

+
FMOD_REVERB_PROPERTIES prop = FMOD_PRESET_GENERIC;
+
+

See Also: System::setReverbProperties, System::getReverbProperties

+

FMOD_REVERB_PROPERTIES

+

Structure defining a reverb environment.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_REVERB_PROPERTIES {
+  float   DecayTime;
+  float   EarlyDelay;
+  float   LateDelay;
+  float   HFReference;
+  float   HFDecayRatio;
+  float   Diffusion;
+  float   Density;
+  float   LowShelfFrequency;
+  float   LowShelfGain;
+  float   HighCut;
+  float   EarlyLateMix;
+  float   WetLevel;
+} FMOD_REVERB_PROPERTIES;
+
+ +
struct REVERB_PROPERTIES
+{
+    float DecayTime;
+    float EarlyDelay;
+    float LateDelay;
+    float HFReference;
+    float HFDecayRatio;
+    float Diffusion;
+    float Density;
+    float LowShelfFrequency;
+    float LowShelfGain;
+    float HighCut;
+    float EarlyLateMix;
+    float WetLevel;
+}
+
+ +
REVERB_PROPERTIES
+{
+  DecayTime,
+  EarlyDelay,
+  LateDelay,
+  HFReference,
+  HFDecayRatio,
+  Diffusion,
+  Density,
+  LowShelfFrequency,
+  LowShelfGain,
+  HighCut,
+  EarlyLateMix,
+  WetLevel,
+};
+
+ +
+
DecayTime
+
+

Reverberation decay time.

+
    +
  • Units: Milliseconds
  • +
  • Default: 1500
  • +
  • Range: [0, 20000]
  • +
+
+
EarlyDelay
+
+

Initial reflection delay time.

+
    +
  • Units: Milliseconds
  • +
  • Default: 7
  • +
  • Range: [0, 300]
  • +
+
+
LateDelay
+
+

Late reverberation delay time relative to initial reflection.

+
    +
  • Units: Milliseconds
  • +
  • Default: 11
  • +
  • Range: [0, 100]
  • +
+
+
HFReference
+
+

Reference high frequency.

+
    +
  • Units: Hertz
  • +
  • Default: 5000
  • +
  • Range: [20, 20000]
  • +
+
+
HFDecayRatio
+
+

High-frequency to mid-frequency decay time ratio.

+
    +
  • Units: Percent
  • +
  • Default: 50
  • +
  • Range: [10, 100]
  • +
+
+
Diffusion
+
+

Value that controls the echo density in the late reverberation decay.

+
    +
  • Units: Percent
  • +
  • Default: 50
  • +
  • Range: [10, 100]
  • +
+
+
Density
+
+

Value that controls the modal density in the late reverberation decay.

+
    +
  • Units: Percent
  • +
  • Default: 100
  • +
  • Range: [0, 100]
  • +
+
+
LowShelfFrequency
+
+

Reference low frequency

+
    +
  • Units: Hertz
  • +
  • Default: 250
  • +
  • Range: [20, 1000]
  • +
+
+
LowShelfGain
+
+

Relative room effect level at low frequencies.

+
    +
  • Units: Decibels
  • +
  • Default: 0
  • +
  • Range: [-36, 12]
  • +
+
+
HighCut
+
+

Relative room effect level at high frequencies.

+
    +
  • Units: Hertz
  • +
  • Default: 200000
  • +
  • Range: [0, 20000]
  • +
+
+
EarlyLateMix
+
+

Early reflections level relative to room effect.

+
    +
  • Units: Percent
  • +
  • Default: 50
  • +
  • Range: [0, 100]
  • +
+
+
WetLevel
+
+

Room effect level at mid frequencies.

+
    +
  • Units: Decibels
  • +
  • Default: -6
  • +
  • Range: [-80, 20]
  • +
+
+
+

Note the default reverb properties are the same as the FMOD_PRESET_GENERIC preset.

+

See Also: System::setReverbProperties, System::getReverbProperties, FMOD_REVERB_PRESETS

+

System::attachChannelGroupToPort

+

Connect the output of the specified ChannelGroup to an audio port on the output driver.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::attachChannelGroupToPort(
+  FMOD_PORT_TYPE portType,
+  FMOD_PORT_INDEX portIndex,
+  ChannelGroup *channelgroup,
+  bool passThru = false
+);
+
+ +
FMOD_RESULT FMOD_System_AttachChannelGroupToPort(
+  FMOD_SYSTEM *system,
+  FMOD_PORT_TYPE portType,
+  FMOD_PORT_INDEX portIndex,
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL passThru
+);
+
+ +
RESULT System.attachChannelGroupToPort(
+  uint portType,
+  ulong portIndex,
+  ChannelGroup channelgroup,
+  bool passThru = false
+);
+
+ +
System.attachChannelGroupToPort(
+  portType,
+  portIndex,
+  channelgroup,
+  passThru
+);
+
+ +
+
portType
+
Port type (output mode specific). (FMOD_PORT_TYPE)
+
portIndex
+
Index to specify which instance of the specified portType to use (output mode specific) (FMOD_PORT_INDEX)
+
channelgroup
+
Group to attach the port to. (ChannelGroup)
+
passThru
+
+

Whether the signal should additionally route to the existing ChannelGroup output.

+
    +
  • Units: Boolean
  • +
+
+
+

Ports are additional outputs supported by some FMOD_OUTPUTTYPE plug-ins and can include things like controller headsets or dedicated background music streams. See the Port Support section (where applicable) of each platform's getting started guide found in the platform details chapter.

+

See Also: System::detachChannelGroupFromPort

+

System::attachFileSystem

+

'Piggyback' on FMOD file reading routines to capture data as it's read.

+

This allows users to capture data as FMOD reads it, which may be useful for extracting the raw data that FMOD reads for hard to support sources (for example internet streams).

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::attachFileSystem(
+  FMOD_FILE_OPEN_CALLBACK useropen,
+  FMOD_FILE_CLOSE_CALLBACK userclose,
+  FMOD_FILE_READ_CALLBACK userread,
+  FMOD_FILE_SEEK_CALLBACK userseek
+);
+
+ +
FMOD_RESULT FMOD_System_AttachFileSystem(
+  FMOD_SYSTEM *system,
+  FMOD_FILE_OPEN_CALLBACK useropen,
+  FMOD_FILE_CLOSE_CALLBACK userclose,
+  FMOD_FILE_READ_CALLBACK userread,
+  FMOD_FILE_SEEK_CALLBACK userseek
+);
+
+ +
RESULT System.attachFileSystem(
+  FILE_OPENCALLBACK useropen,
+  FILE_CLOSECALLBACK userclose,
+  FILE_READCALLBACK userread,
+  FILE_SEEKCALLBACK userseek
+);
+
+ +
System.attachFileSystem(
+  useropen,
+  userclose,
+  userread,
+  userseek
+);
+
+ +
+
useropen Opt
+
Callback for after a file is opened. (FMOD_FILE_OPEN_CALLBACK)
+
userclose Opt
+
Callback for after a file is closed. (FMOD_FILE_CLOSE_CALLBACK)
+
userread Opt
+
Callback for after a read operation. (FMOD_FILE_READ_CALLBACK)
+
userseek Opt
+
Callback for after a seek operation. (FMOD_FILE_SEEK_CALLBACK)
+
+

To detach, pass null or equivalent as the callback parameters.

+

Note: This function is not to replace FMOD's file system. For this functionality, see System::setFileSystem.

+

See Also: Callback Behavior

+

FMOD_SYSTEM_CALLBACK

+

Callback for System notifications.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_SYSTEM_CALLBACK(
+  FMOD_SYSTEM *system,
+  FMOD_SYSTEM_CALLBACK_TYPE type,
+  void *commanddata1,
+  void *commanddata2,
+  void *userdata
+);
+
+ +
delegate RESULT SYSTEM_CALLBACK(
+  IntPtr system,
+  SYSTEM_CALLBACK_TYPE type,
+  IntPtr commanddata1,
+  IntPtr commanddata2,
+  IntPtr userdata
+);
+
+ +
function FMOD_SYSTEM_CALLBACK(
+  system,
+  type,
+  commanddata1,
+  commanddata2,
+  userdata
+)
+
+ +
+
system Opt
+
System handle. (System)
+
type
+
Type of callback. (FMOD_SYSTEM_CALLBACK_TYPE)
+
commanddata1 Opt
+
First callback parameter, see FMOD_SYSTEM_CALLBACK_TYPE for details.
+
commanddata2 Opt
+
Second callback parameter, see FMOD_SYSTEM_CALLBACK_TYPE for details.
+
userdata Opt
+
User data associated with system or the last value set with any call to System::setUserData for global callbacks.
+
+
+

The 'system' argument can be cast to FMOD::System *.

+
+
+

The 'system' argument can be used via System by using FMOD.System coreSystem = new FMOD.System(system);

+
+

See Also: Callback Behavior, User Data, System::setCallback

+

FMOD_SYSTEM_CALLBACK_TYPE

+

Types of callbacks called by the System.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED        0x00000001
+#define FMOD_SYSTEM_CALLBACK_DEVICELOST               0x00000002
+#define FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED   0x00000004
+#define FMOD_SYSTEM_CALLBACK_THREADCREATED            0x00000008
+#define FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION         0x00000010
+#define FMOD_SYSTEM_CALLBACK_PREMIX                   0x00000020
+#define FMOD_SYSTEM_CALLBACK_POSTMIX                  0x00000040
+#define FMOD_SYSTEM_CALLBACK_ERROR                    0x00000080
+#define FMOD_SYSTEM_CALLBACK_THREADDESTROYED          0x00000100
+#define FMOD_SYSTEM_CALLBACK_PREUPDATE                0x00000200
+#define FMOD_SYSTEM_CALLBACK_POSTUPDATE               0x00000400
+#define FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED        0x00000800
+#define FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX            0x00001000
+#define FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE       0x00002000
+#define FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN           0x00004000
+#define FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED    0x00008000
+#define FMOD_SYSTEM_CALLBACK_ALL                      0xFFFFFFFF
+
+ +
[Flags]
+enum SYSTEM_CALLBACK_TYPE : uint
+{
+  DEVICELISTCHANGED      = 0x00000001,
+  DEVICELOST             = 0x00000002,
+  MEMORYALLOCATIONFAILED = 0x00000004,
+  THREADCREATED          = 0x00000008,
+  BADDSPCONNECTION       = 0x00000010,
+  PREMIX                 = 0x00000020,
+  POSTMIX                = 0x00000040,
+  ERROR                  = 0x00000080,
+  THREADDESTROYED        = 0x00000100,
+  PREUPDATE              = 0x00000200,
+  POSTUPDATE             = 0x00000400,
+  RECORDLISTCHANGED      = 0x00000800,
+  BUFFEREDNOMIX          = 0x00001000,
+  DEVICEREINITIALIZE     = 0x00002000,
+  OUTPUTUNDERRUN         = 0x00004000,
+  RECORDPOSITIONCHANGED  = 0x00008000,
+  ALL                    = 0xFFFFFFFF,
+}
+
+ +
SYSTEM_CALLBACK_DEVICELISTCHANGED      = 0x00000001
+SYSTEM_CALLBACK_DEVICELOST             = 0x00000002
+SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED = 0x00000004
+SYSTEM_CALLBACK_THREADCREATED          = 0x00000008
+SYSTEM_CALLBACK_BADDSPCONNECTION       = 0x00000010
+SYSTEM_CALLBACK_PREMIX                 = 0x00000020
+SYSTEM_CALLBACK_POSTMIX                = 0x00000040
+SYSTEM_CALLBACK_ERROR                  = 0x00000080
+SYSTEM_CALLBACK_THREADDESTROYED        = 0x00000100
+SYSTEM_CALLBACK_PREUPDATE              = 0x00000200
+SYSTEM_CALLBACK_POSTUPDATE             = 0x00000400
+SYSTEM_CALLBACK_RECORDLISTCHANGED      = 0x00000800
+SYSTEM_CALLBACK_BUFFEREDNOMIX          = 0x00001000
+SYSTEM_CALLBACK_DEVICEREINITIALIZE     = 0x00002000
+SYSTEM_CALLBACK_OUTPUTUNDERRUN         = 0x00004000
+SYSTEM_CALLBACK_RECORDPOSITIONCHANGED  = 0x00008000
+SYSTEM_CALLBACK_ALL                    = 0xFFFFFFFF
+
+ +
+
FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED
+
Called from System::update when the enumerated list of devices has changed. Called from the main (calling) thread when set from the Core API or Studio API in synchronous mode, and from the Studio Update Thread when in default / async mode.
+
FMOD_SYSTEM_CALLBACK_DEVICELOST
+
Deprecated.
+
FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED
+
Called directly when a memory allocation fails.
+
FMOD_SYSTEM_CALLBACK_THREADCREATED
+
Called from the game thread when a thread is created.
+
FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION
+
Deprecated.
+
FMOD_SYSTEM_CALLBACK_PREMIX
+
Called from the mixer thread before it starts the next block.
+
FMOD_SYSTEM_CALLBACK_POSTMIX
+
Called from the mixer thread after it finishes a block.
+
FMOD_SYSTEM_CALLBACK_ERROR
+
Called directly when an API function returns an error, including delayed async functions.
+
FMOD_SYSTEM_CALLBACK_THREADDESTROYED
+
Called from the game thread when a thread is destroyed.
+
FMOD_SYSTEM_CALLBACK_PREUPDATE
+
Called at start of System::update from the main (calling) thread when set from the Core API or Studio API in synchronous mode, and from the Studio Update Thread when in default / async mode.
+
FMOD_SYSTEM_CALLBACK_POSTUPDATE
+
Called at end of System::update from the main (calling) thread when set from the Core API or Studio API in synchronous mode, and from the Studio Update Thread when in default / async mode.
+
FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED
+
Called from System::update when the enumerated list of recording devices has changed. Called from the main (calling) thread when set from the Core API or Studio API in synchronous mode, and from the Studio Update Thread when in default / async mode.
+
FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX
+
Called from the feeder thread after audio was consumed from the ring buffer, but not enough to allow another mix to run.
+
FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE
+
Called from System::update when an output device is re-initialized. Called from the main (calling) thread when set from the Core API or Studio API in synchronous mode, and from the Studio Update Thread when in default / async mode.
+
FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN
+
Called from the mixer thread when the device output attempts to read more samples than are available in the output buffer.
+
FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED
+
Called from the mixer thread when the System record position changed.
+
FMOD_SYSTEM_CALLBACK_ALL
+
Mask representing all callback types.
+
+

For each callback type unless specified below it is assumed commanddata1 and commanddata2 are unused and userdata matches the value set with System::setUserData.

+

FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED
+commanddata1: (const char *) representing the file and line of the failure.
+commanddata2: (int) representing the size of the requested allocation

+

FMOD_SYSTEM_CALLBACK_ERROR
+commanddata1: (FMOD_ERRORCALLBACK_INFO *) with extra information about the error.
+commanddata2: Unused.

+

FMOD_SYSTEM_CALLBACK_THREADCREATED / FMOD_SYSTEM_CALLBACK_THREADDESTROYED
+commanddata1: Handle of the thread, see notes below for thread handle types.
+commanddata2: (const char *) representing the name of the thread.

+

FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE
+commanddata1: (FMOD_OUTPUTTYPE) of the output device.
+commanddata2: (int) selected driver index.

+

FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED
+commanddata1: (Sound) that is being recorded to.
+commanddata2: (int) The new record position.

+

Thread handle types per platform:

+
    +
  • Mac, Linux, iOS, Android: pthread_t
  • +
  • PS4, PS5: ScePthread
  • +
  • Win, GameCore: HANDLE
  • +
+

Using FMOD_SYSTEM_CALLBACK_ALL or FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED will disable any automated device ejection/insertion handling. Use this callback to control the behavior yourself.
+Using FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED (Mac only) requires the application to be running an event loop which will allow external changes to device list to be detected.

+

See Also: Callback Behavior, System::setCallback, FMOD_SYSTEM_CALLBACK

+

System::close

+

Close the connection to the output and return to an uninitialized state without releasing the object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::close();
+
+ +
FMOD_RESULT FMOD_System_Close(FMOD_SYSTEM *system);
+
+ +
RESULT System.close();
+
+ +
System.close();
+
+ +

Closing renders objects created with this System invalid. Make sure any Sound, ChannelGroup, Geometry and DSP objects are released before calling this.

+

All pre-initialize configuration settings will remain and the System can be reinitialized as needed.

+

See Also: System::init, System::release

+

System_Create

+

Creates an instance of the FMOD system.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System_Create(
+  System **system,
+  unsigned int headerversion = FMOD_VERSION
+);
+
+ +
FMOD_RESULT FMOD_System_Create(
+  FMOD_SYSTEM **system,
+  unsigned int headerversion
+);
+
+ +
static RESULT Factory.System_Create(
+  out System system
+);
+
+ +
System_Create(
+  system
+);
+
+ +
+
system Out
+
Newly created object. (System)
+
headerversion
+
Expected FMOD Engine version.
+
+

Pass FMOD_VERSION in headerversion to ensure the library and header versions being used match.

+

This must be called first to create an FMOD System object before any other API calls (except for Memory_Initialize and Debug_Initialize). Use this function to create 1 or multiple instances of FMOD System objects.

+

Use System::release to free a system object.

+
+

Calls to System_Create and System::release are not thread-safe. Do not call these functions simultaneously from multiple threads at once.

+
+

See Also: System::init

+

System::createChannelGroup

+

Create a ChannelGroup object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createChannelGroup(
+  const char *name,
+  ChannelGroup **channelgroup
+);
+
+ +
FMOD_RESULT FMOD_System_CreateChannelGroup(
+  FMOD_SYSTEM *system,
+  const char *name,
+  FMOD_CHANNELGROUP **channelgroup
+);
+
+ +
RESULT System.createChannelGroup(
+  string name,
+  out ChannelGroup channelgroup
+);
+
+ +
System.createChannelGroup(
+  name,
+  channelgroup
+);
+
+ +
+
name Opt
+
Label for identification purposes. (UTF-8 string)
+
channelgroup Out
+
Newly created group. (ChannelGroup)
+
+

ChannelGroups can be used to assign / group Channels, for things such as volume scaling. ChannelGroups are also used for sub-mixing. Any Channels that are assigned to a ChannelGroup get submixed into that ChannelGroup's 'tail' DSP. See FMOD_CHANNELCONTROL_DSP_TAIL.

+

If a ChannelGroup has an effect added to it, the effect is processed post-mix from the Channels and ChannelGroups below it in the mix hierarchy. See the DSP architecture guide for more information.

+

All ChannelGroups will initially output directly to the master ChannelGroup (See System::getMasterChannelGroup). ChannelGroups can be re-parented this with ChannelGroup::addGroup.

+

See Also: ChannelGroup::release

+

System::createDSP

+

Create a DSP unit given a plug-in description structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createDSP(
+  const FMOD_DSP_DESCRIPTION *description,
+  DSP **dsp
+);
+
+ +
FMOD_RESULT FMOD_System_CreateDSP(
+  FMOD_SYSTEM *system,
+  const FMOD_DSP_DESCRIPTION *description,
+  FMOD_DSP **dsp
+);
+
+ +
RESULT System.createDSP(
+  ref DSP_DESCRIPTION description,
+  out DSP dsp
+);
+
+ +
System.createDSP(
+  description,
+  dsp
+);
+
+ +
+
description
+
Structure describing the DSP to create. (FMOD_DSP_DESCRIPTION)
+
dsp Out
+
Newly created unit. (DSP)
+
+

A DSP unit is a module that can be inserted into the DSP graph to allow sound filtering or sound generation. See the DSP architecture guide for more information.

+

DSPs must be attached to the DSP graph before they become active, either via ChannelControl::addDSP or DSP::addInput.

+

See Also: System::createDSPByType, System::createDSPByPlugin

+

System::createDSPByPlugin

+

Create a DSP unit with a specified plug-in handle.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createDSPByPlugin(
+  unsigned int handle,
+  DSP **dsp
+);
+
+ +
FMOD_RESULT FMOD_System_CreateDSPByPlugin(
+  FMOD_SYSTEM *system,
+  unsigned int handle,
+  FMOD_DSP **dsp
+);
+
+ +
RESULT System.createDSPByPlugin(
+  uint handle,
+  out DSP dsp
+);
+
+ +
System.createDSPByPlugin(
+  handle,
+  dsp
+);
+
+ +
+
handle
+
Handle to an already loaded DSP plug-in.
+
dsp Out
+
Newly created unit. (DSP)
+
+

A DSP object is a module that can be inserted into the DSP graph to allow sound filtering or sound generation. See the DSP architecture guide for more information.

+

A handle can come from a newly loaded plug-in with System::loadPlugin or an existing plug-in with System::getPluginHandle.

+

DSPs must be attached to the DSP graph before they become active, either via ChannelControl::addDSP or DSP::addInput.

+

See Also: System::createDSP, System::createDSPByType

+

System::createDSPByType

+

Create a DSP unit with a specified built-in type index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createDSPByType(
+  FMOD_DSP_TYPE type,
+  DSP **dsp
+);
+
+ +
FMOD_RESULT FMOD_System_CreateDSPByType(
+  FMOD_SYSTEM *system,
+  FMOD_DSP_TYPE type,
+  FMOD_DSP **dsp
+);
+
+ +
RESULT System.createDSPByType(
+  DSP_TYPE type,
+  out DSP dsp
+);
+
+ +
System.createDSPByType(
+  type,
+  dsp
+);
+
+ +
+
type
+
Type of built in unit. (FMOD_DSP_TYPE)
+
dsp Out
+
Newly created unit. (DSP)
+
+

A DSP unit (or "DSP") is a module that can be inserted into the DSP graph to allow sound filtering or sound generation. See the DSP architecture guide for more information.

+

DSPs must be attached to the DSP graph before they become active, either via ChannelControl::addDSP or DSP::addInput.

+

See Also: System::createDSP

+

System::createGeometry

+

Geometry creation function. This function will create a base geometry object which can then have polygons added to it.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createGeometry(
+  int maxpolygons,
+  int maxvertices,
+  Geometry **geometry
+);
+
+ +
FMOD_RESULT FMOD_System_CreateGeometry(
+  FMOD_SYSTEM *system,
+  int maxpolygons,
+  int maxvertices,
+  FMOD_GEOMETRY **geometry
+);
+
+ +
RESULT System.createGeometry(
+  int maxpolygons,
+  int maxvertices,
+  out Geometry geometry
+);
+
+ +
System.createGeometry(
+  maxpolygons,
+  maxvertices,
+  geometry
+);
+
+ +
+
maxpolygons
+
Maximum number of polygons within this object.
+
maxvertices
+
Maximum number of vertices within this object.
+
geometry Out
+
Newly created geometry object. (Geometry)
+
+

Polygons can be added to a geometry object using Geometry::addPolygon. For best efficiency, avoid overlapping of polygons and long thin polygons.

+

A geometry object stores its polygons in a group to allow optimization for line testing, insertion and updating of geometry in real-time.
+Geometry objects also allow for efficient rotation, scaling and translation of groups of polygons.

+

It is important to set the value of maxworldsize to an appropriate value using System::setGeometrySettings.

+

See Also: System::setGeometrySettings, System::loadGeometry, Geometry::addPolygon, Geometry::setPosition, Geometry::setRotation, Geometry::setScale

+

System::createReverb3D

+

Creates a 'virtual reverb' object. This object reacts to 3D location and morphs the reverb environment based on how close it is to the reverb object's center.

+

Multiple reverb objects can be created to achieve a multi-reverb environment. 1 reverb object is used for all 3D reverb objects (slot 0 by default).

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createReverb3D(
+  Reverb3D **reverb
+);
+
+ +
FMOD_RESULT FMOD_System_CreateReverb3D(
+  FMOD_SYSTEM *system,
+  FMOD_REVERB3D **reverb
+);
+
+ +
RESULT System.createReverb3D(
+  out Reverb3D reverb
+);
+
+ +
System.createReverb3D(
+  reverb
+);
+
+ +
+
reverb Out
+
Newly created virtual reverb object. (Reverb3D)
+
+

The 3D reverb object is a sphere having 3D attributes (position, minimum distance, maximum distance) and reverb properties.

+

The properties and 3D attributes of all reverb objects collectively determine, along with the listener's position, the settings of and input gains into a single 3D reverb DSP.

+

When the listener is within the sphere of effect of one or more 3D reverbs, the listener's 3D reverb properties are a weighted combination of such 3D reverbs.

+

When the listener is outside all of the reverbs, no reverb is applied.

+

System::setReverbProperties can be used to create an alternative reverb that can be used for 2D and background global reverb.

+

To avoid this reverb interfering with the reverb slot used by the 3D reverb, 2D reverb should use a different slot id with System::setReverbProperties, otherwise FMOD_ADVANCEDSETTINGS::reverb3Dinstance can also be used to place 3D reverb on a different reverb slot.

+

Use ChannelControl::setReverbProperties to turn off reverb for 2D sounds (ie set wet = 0).

+

Creating multiple reverb objects does not impact performance. This is because these reverb objects are 'virtual reverbs': There is only one reverb DSP unit running at a time, and its parameter values are morphed to those of each virtual reverb as needed.

+

To remove the reverb DSP unit and the associated CPU cost, first make sure all 3D reverb objects are released. Then, call System::setReverbProperties with the 3D reverb's slot ID (0 by default) with a property point of 0 or NULL, to signal that the reverb instance should be deleted.

+

If a 3D reverb is still present, and System::setReverbProperties function is called to free the reverb, the 3D reverb system recreates it upon the next System::update call.

+

The 3D reverb system does not affect Studio events unless it is explicitly enabled by calling Studio::EventInstance::setReverbLevel on each event instance.

+

See Also: Reverb3D::release

+

System::createSound

+

Loads a sound into memory, opens it for streaming or sets it up for callback based sounds.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createSound(
+  const char *name_or_data,
+  FMOD_MODE mode,
+  FMOD_CREATESOUNDEXINFO *exinfo,
+  Sound **sound
+);
+
+ +
FMOD_RESULT FMOD_System_CreateSound(
+  FMOD_SYSTEM *system,
+  const char *name_or_data,
+  FMOD_MODE mode,
+  FMOD_CREATESOUNDEXINFO *exinfo,
+  FMOD_SOUND **sound
+);
+
+ +
RESULT System.createSound(
+  string name,
+  MODE mode,
+  out Sound sound
+);
+RESULT System.createSound(
+  byte[] data,
+  MODE mode,
+  out Sound sound
+);
+RESULT System.createSound(
+  string name,
+  MODE mode,
+  ref CREATESOUNDEXINFO exinfo,
+  out Sound sound
+);
+RESULT System.createSound(
+  IntPtr name_or_data,
+  MODE mode,
+  ref CREATESOUNDEXINFO exinfo,
+  out Sound sound
+);
+
+ +
System.createSound(
+  name_or_data,
+  mode,
+  exinfo,
+  sound
+);
+
+ +
+
name_or_data
+
Name of the file or URL to open (UTF-8 string) or a pointer to a preloaded sound memory block if FMOD_OPENMEMORY / FMOD_OPENMEMORY_POINT is used.
+
mode
+
+

Behavior modifier for opening the sound. (FMOD_MODE)

+ +
+
exinfo Opt
+
Extended information for creating the sound. (FMOD_CREATESOUNDEXINFO)
+
sound Out
+
Newly created Sound object. (Sound)
+
+

FMOD_CREATESAMPLE will try to load and decompress the whole sound into memory, use FMOD_CREATESTREAM to open it as a stream and have it play back in realtime from disk or another medium. FMOD_CREATECOMPRESSEDSAMPLE can also be used for certain formats to play the sound directly in its compressed format from the mixer.

+
    +
  • To open a file or URL as a stream, so that it decompresses / reads at runtime, instead of loading / decompressing into memory all at the time of this call, use the FMOD_CREATESTREAM flag.
  • +
  • To open a file or URL as a compressed sound effect that is not streamed and is not decompressed into memory at load time, use FMOD_CREATECOMPRESSEDSAMPLE. This is supported with MPEG (mp2/mp3), ADPCM/FADPCM, XMA, AT9 and FSB Vorbis files only. This is useful for those who want realtime compressed soundeffects, but not the overhead of disk access.
  • +
  • To open a sound as 2D, so that it is not affected by 3D processing, use the FMOD_2D flag. 3D sound commands will be ignored on these types of sounds.
  • +
  • To open a sound as 3D, so that it is treated as a 3D sound, use the FMOD_3D flag.
  • +
+

Note that FMOD_OPENRAW, FMOD_OPENMEMORY, FMOD_OPENMEMORY_POINT and FMOD_OPENUSER will not work here without the exinfo structure present, as more information is needed.

+

Use FMOD_NONBLOCKING to have the sound open or load in the background. You can use Sound::getOpenState to determine if it has finished loading / opening or not. While it is loading (not ready), sound functions are not accessible for that sound. Do not free memory provided with FMOD_OPENMEMORY if the sound is not in a ready state, as it will most likely lead to a crash.

+

To account for slow media that might cause buffer underrun (skipping / stuttering / repeating blocks of audio) with sounds created with FMOD_CREATESTREAM, use System::setStreamBufferSize to increase read ahead.

+

As using FMOD_OPENUSER causes FMOD to ignore whatever is passed as the first argument name_or_data, recommended practice is to pass null or equivalent.

+

Specifying FMOD_OPENMEMORY_POINT will POINT to your memory rather allocating its own sound buffers and duplicating it internally, this means you cannot free the memory while FMOD is using it, until after Sound::release is called.

+

With FMOD_OPENMEMORY_POINT, only PCM formats and compressed formats using FMOD_CREATECOMPRESSEDSAMPLE are supported.

+
+

Use of FMOD.NON_BLOCKING is currently not supported for JavaScript.

+
+

System::createSoundGroup

+

Creates a SoundGroup object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createSoundGroup(
+  const char *name,
+  SoundGroup **soundgroup
+);
+
+ +
FMOD_RESULT FMOD_System_CreateSoundGroup(
+  FMOD_SYSTEM *system,
+  const char *name,
+  FMOD_SOUNDGROUP **soundgroup
+);
+
+ +
RESULT System.createSoundGroup(
+  string name,
+  out SoundGroup soundgroup
+);
+
+ +
System.createSoundGroup(
+  name,
+  soundgroup
+);
+
+ +
+
name
+
Name of SoundGroup. (UTF-8 string)
+
soundgroup Out
+
Newly created group. (SoundGroup)
+
+

A SoundGroup is a way to address multiple Sounds at once with group level commands, such as:

+ +

Once a SoundGroup is created, Sound::setSoundGroup is used to put a Sound in a SoundGroup.

+

See Also: SoundGroup::release, Sound::setSoundGroup

+

System::createStream

+

Opens a sound for streaming.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::createStream(
+  const char *name_or_data,
+  FMOD_MODE mode,
+  FMOD_CREATESOUNDEXINFO *exinfo,
+  Sound **sound
+);
+
+ +
FMOD_RESULT FMOD_System_CreateStream(
+  FMOD_SYSTEM *system,
+  const char *name_or_data,
+  FMOD_MODE mode,
+  FMOD_CREATESOUNDEXINFO *exinfo,
+  FMOD_SOUND **sound
+);
+
+ +
RESULT System.createStream(
+  string name,
+  MODE mode,
+  out Sound sound
+);
+RESULT System.createStream(
+  string name,
+  MODE mode,
+  ref CREATESOUNDEXINFO exinfo,
+  out Sound sound
+);
+RESULT System.createStream(
+  byte[] data,
+  MODE mode,
+  ref CREATESOUNDEXINFO exinfo,
+  out Sound sound
+);
+RESULT System.createStream(
+  IntPtr name_or_data,
+  MODE mode,
+  ref CREATESOUNDEXINFO exinfo,
+  out Sound sound
+);
+
+ +
System.createStream(
+  name_or_data,
+  mode,
+  exinfo,
+  sound
+);
+
+ +
+
name_or_data
+
Name of the file or URL to open (UTF-8 string) or a pointer to a preloaded sound memory block if FMOD_OPENMEMORY / FMOD_OPENMEMORY_POINT is used.
+
mode
+
+

Behavior modifier for opening the sound. (FMOD_MODE)

+ +
+
exinfo Opt
+
Extended information while playing the sound. (FMOD_CREATESOUNDEXINFO)
+
sound Out
+
Newly created Sound object. (Sound)
+
+

This is a convenience function for System::createSound with the FMOD_CREATESTREAM flag added.

+

A stream only has one decode buffer and file handle, and therefore can only be played once. It cannot play multiple times at once because it cannot share a stream buffer if the stream is playing at different positions. Open multiple streams to have them play concurrently.

+

System::detachChannelGroupFromPort

+

Disconnect the output of the specified ChannelGroup from an audio port on the output driver.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::detachChannelGroupFromPort(
+  ChannelGroup *channelgroup
+);
+
+ +
FMOD_RESULT FMOD_System_DetachChannelGroupFromPort(
+  FMOD_SYSTEM *system,
+  FMOD_CHANNELGROUP *channelgroup
+);
+
+ +
RESULT System.detachChannelGroupFromPort(
+  ChannelGroup channelgroup
+);
+
+ +
System.detachChannelGroupFromPort(
+  channelgroup
+);
+
+ +
+
channelgroup
+
Group to detach the port from. (ChannelGroup)
+
+

Removing a ChannelGroup from a port will reroute the audio back to the main mix.

+

See Also: System::attachChannelGroupToPort

+

System::get3DListenerAttributes

+

Retrieves the position, velocity and orientation of the specified 3D sound listener.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::get3DListenerAttributes(
+  int listener,
+  FMOD_VECTOR *pos,
+  FMOD_VECTOR *vel,
+  FMOD_VECTOR *forward,
+  FMOD_VECTOR *up
+);
+
+ +
FMOD_RESULT FMOD_System_Get3DListenerAttributes(
+  FMOD_SYSTEM *system,
+  int listener,
+  FMOD_VECTOR *pos,
+  FMOD_VECTOR *vel,
+  FMOD_VECTOR *forward,
+  FMOD_VECTOR *up
+);
+
+ +
RESULT System.get3DListenerAttributes(
+  int listener,
+  out VECTOR pos,
+  out VECTOR vel,
+  out VECTOR forward,
+  out VECTOR up
+);
+
+ +
System.get3DListenerAttributes(
+  listener,
+  pos,
+  vel,
+  forward,
+  up
+);
+
+ +
+
listener
+
+

Index of listener to get 3D attributes for. Listeners are indexed from 0, to FMOD_MAX_LISTENERS - 1, in a multi-listener environment.

+ +
+
pos OutOpt
+
+

Position in 3D space used for panning and attenuation. (FMOD_VECTOR)

+ +
+
vel OutOpt
+
+

Velocity in 3D space used for doppler. (FMOD_VECTOR)

+ +
+
forward OutOpt
+
Forwards orientation. (FMOD_VECTOR)
+
up OutOpt
+
Upwards orientation. (FMOD_VECTOR)
+
+

Users of the Studio API should call Studio::System::getListenerAttributes instead of this function.

+

See Also: System::set3DListenerAttributes

+

System::get3DNumListeners

+

Retrieves the number of 3D listeners.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::get3DNumListeners(
+  int *numlisteners
+);
+
+ +
FMOD_RESULT FMOD_System_Get3DNumListeners(
+  FMOD_SYSTEM *system,
+  int *numlisteners
+);
+
+ +
RESULT System.get3DNumListeners(
+  out int numlisteners
+);
+
+ +
System.get3DNumListeners(
+  numlisteners
+);
+
+ +
+
numlisteners Out
+
Number of 3D listeners in the 3D scene.
+
+

Users of the Studio API should call Studio::System::getNumListeners instead of this function.

+

See Also: System::set3DNumListeners

+

System::get3DSettings

+

Retrieves the global doppler scale, distance factor and roll-off scale for all 3D sounds.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::get3DSettings(
+  float *dopplerscale,
+  float *distancefactor,
+  float *rolloffscale
+);
+
+ +
FMOD_RESULT FMOD_System_Get3DSettings(
+  FMOD_SYSTEM *system,
+  float *dopplerscale,
+  float *distancefactor,
+  float *rolloffscale
+);
+
+ +
RESULT System.get3DSettings(
+  out float dopplerscale,
+  out float distancefactor,
+  out float rolloffscale
+);
+
+ +
System.get3DSettings(
+  dopplerscale,
+  distancefactor,
+  rolloffscale
+);
+
+ +
+
dopplerscale OutOpt
+
A scaling factor for doppler shift.
+
distancefactor OutOpt
+
A factor for converting game distance units to FMOD distance units.
+
rolloffscale OutOpt
+
A scaling factor for distance attenuation. When a sound uses a roll-off mode other than FMOD_3D_CUSTOMROLLOFF and the distance is greater than the sound's minimum distance, the distance is scaled by the roll-off scale.
+
+

See Also: System::set3DSettings

+

System::getAdvancedSettings

+

Retrieves the advanced settings for the system object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getAdvancedSettings(
+  FMOD_ADVANCEDSETTINGS *settings
+);
+
+ +
FMOD_RESULT FMOD_System_GetAdvancedSettings(
+  FMOD_SYSTEM *system,
+  FMOD_ADVANCEDSETTINGS *settings
+);
+
+ +
RESULT System.getAdvancedSettings(
+  ref ADVANCEDSETTINGS settings
+);
+
+ +
System.getAdvancedSettings(
+  settings
+);
+
+ +
+
settings Out
+
Advanced settings (FMOD_ADVANCEDSETTINGS)
+
+

See Also: System::setAdvancedSettings

+

System::getChannel

+

Retrieves a handle to a Channel by ID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getChannel(
+  int channelid,
+  Channel **channel
+);
+
+ +
FMOD_RESULT FMOD_System_GetChannel(
+  FMOD_SYSTEM *system,
+  int channelid,
+  FMOD_CHANNEL **channel
+);
+
+ +
RESULT System.getChannel(
+  int channelid,
+  out Channel channel
+);
+
+ +
System.getChannel(
+  channelid,
+  channel
+);
+
+ +
+
channelid
+
Index in the FMOD Channel pool. Specify a Channel number from 0 to the 'maxchannels' value specified in System::init minus 1.
+
channel Out
+
Requested Channel. (Channel)
+
+

This function is mainly for getting handles to existing (playing) Channels and setting their attributes. The only way to 'create' an instance of a Channel for playback is to use System::playSound or [System::playDSP].

+

See Also: System::init

+

System::getChannelsPlaying

+

Retrieves the number of currently playing Channels.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getChannelsPlaying(
+  int *channels,
+  int *realchannels = nullptr
+);
+
+ +
FMOD_RESULT FMOD_System_GetChannelsPlaying(
+  FMOD_SYSTEM *system,
+  int *channels,
+  int *realchannels
+);
+
+ +
RESULT System.getChannelsPlaying(
+  out int channels
+);
+RESULT System.getChannelsPlaying(
+  out int channels,
+  out int realchannels
+);
+
+ +
System.getChannelsPlaying(
+  channels,
+  realchannels
+);
+
+ +
+
channels OptOut
+
Number of playing Channels (both real and virtual).
+
realchannels OptOut
+
Number of playing real (non-virtual) Channels.
+
+

For differences between real and virtual voices see the Virtual Voices guide for more information.

+

See Also: ChannelControl::isPlaying, Channel::isVirtual

+

System::getCPUUsage

+

Retrieves the amount of CPU used for different parts of the Core API.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getCPUUsage(
+  FMOD_CPU_USAGE *usage
+);
+
+ +
FMOD_RESULT FMOD_System_GetCPUUsage(
+  FMOD_SYSTEM *system,
+  FMOD_CPU_USAGE *usage
+);
+
+ +
RESULT System.getCPUUsage(
+  out CPU_USAGE usage
+);
+
+ +
System.getCPUUsage(
+  usage
+);
+
+ +
+
usage Out
+
CPU usage values. (FMOD_CPU_USAGE)
+
+

For readability, the percentage values are smoothed to provide a more stable output.

+

See Also: Studio::System::getCPUUsage, FMOD_STUDIO_CPU_USAGE

+

System::getDefaultMixMatrix

+

Retrieves the default matrix used to convert from one speaker mode to another.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getDefaultMixMatrix(
+  FMOD_SPEAKERMODE sourcespeakermode,
+  FMOD_SPEAKERMODE targetspeakermode,
+  float *matrix,
+  int matrixhop
+);
+
+ +
FMOD_RESULT FMOD_System_GetDefaultMixMatrix(
+  FMOD_SYSTEM *system,
+  FMOD_SPEAKERMODE sourcespeakermode,
+  FMOD_SPEAKERMODE targetspeakermode,
+  float *matrix,
+  int matrixhop
+);
+
+ +
RESULT System.getDefaultMixMatrix(
+  SPEAKERMODE sourcespeakermode,
+  SPEAKERMODE targetspeakermode,
+  float[] matrix,
+  int matrixhop
+);
+
+ +
System.getDefaultMixMatrix(
+  sourcespeakermode,
+  targetspeakermode,
+  matrix,
+  matrixhop
+);
+
+ +
+
sourcespeakermode
+
The speaker mode being converted from. (FMOD_SPEAKERMODE)
+
targetspeakermode
+
The speaker mode being converted to. (FMOD_SPEAKERMODE)
+
matrix Out
+
The output matrix. Its minimum size in number of floats must be the number of source channels multiplied by the number of target channels. Source and target channels cannot exceed FMOD_MAX_CHANNEL_WIDTH.
+
matrixhop Opt
+
The number of source channels in the matrix. If this is 0, the number of source channels will be derived from sourcespeakermode. Maximum of FMOD_MAX_CHANNEL_WIDTH.
+
+

The gain for source channel 's' to target channel 't' is matrix[t * matrixhop + s].

+

If 'sourcespeakermode' or 'targetspeakermode' is FMOD_SPEAKERMODE_RAW, this function will return FMOD_ERR_INVALID_PARAM.

+

See Also: System::getSpeakerModeChannels

+

System::getDriver

+

Retrieves the output driver for the selected output type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getDriver(
+  int *driver
+);
+
+ +
FMOD_RESULT FMOD_System_GetDriver(
+  FMOD_SYSTEM *system,
+  int *driver
+);
+
+ +
RESULT System.getDriver(
+  out int driver
+);
+
+ +
System.getDriver(
+  driver
+);
+
+ +
+
driver Out
+
Driver index where 0 represents the default for the output type.
+
+

See Also: System::setDriver

+

System::getDriverInfo

+

Retrieves identification information about a sound device specified by its index, and specific to the selected output mode.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getDriverInfo(
+  int id,
+  char *name,
+  int namelen,
+  FMOD_GUID *guid,
+  int *systemrate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *speakermodechannels
+);
+
+ +
FMOD_RESULT FMOD_System_GetDriverInfo(
+  FMOD_SYSTEM *system,
+  int id,
+  char *name,
+  int namelen,
+  FMOD_GUID *guid,
+  int *systemrate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *speakermodechannels
+);
+
+ +
RESULT System.getDriverInfo(
+  int id,
+  out string name,
+  int namelen,
+  out Guid guid,
+  out int systemrate,
+  out SPEAKERMODE speakermode,
+  out int speakermodechannels
+);
+
+ +
System.getDriverInfo(
+  id,
+  name,
+  guid,
+  systemrate,
+  speakermode,
+  speakermodechannels
+);
+
+ +
+
id
+
+

Index of the sound driver device.

+ +
+
name OptOut
+
Name of the device. (UTF-8 string)
+
namelen
+
+

Length of name. 256 is sufficient to contain the vast majority of driver names.

+
    +
  • Units: Bytes
  • +
+
+
guid OptOut
+
A GUID that uniquely identifies the device. (FMOD_GUID)
+
systemrate OptOut
+
Sample rate this device operates at.
+
speakermode OptOut
+
Speaker setup this device is currently using. (FMOD_SPEAKERMODE)
+
speakermodechannels OptOut
+
Number of channels in the current speaker setup.
+
+

See Also: System::setOutput

+

System::getDSPBufferSize

+

Retrieves the buffer size settings for the FMOD software mixing engine.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getDSPBufferSize(
+  unsigned int *bufferlength,
+  int *numbuffers
+);
+
+ +
FMOD_RESULT FMOD_System_GetDSPBufferSize(
+  FMOD_SYSTEM *system,
+  unsigned int *bufferlength,
+  int *numbuffers
+);
+
+ +
RESULT System.getDSPBufferSize(
+  out uint bufferlength,
+  out int numbuffers
+);
+
+ +
System.getDSPBufferSize(
+  bufferlength,
+  numbuffers
+);
+
+ +
+
bufferlength OptOut
+
+

Mixer engine block size.

+
    +
  • Units: Samples
  • +
  • Default: 1024
  • +
+
+
numbuffers OptOut
+
+

Mixer engine number of buffers used.

+
    +
  • Default: 4
  • +
+
+
+

To get the bufferlength in milliseconds, divide it by the output rate and multiply the result by 1000. For a bufferlength of 1024 and an output rate of 48khz (see System::SetSoftwareFormat), milliseconds = 1024 / 48000 * 1000 = 21.33ms. This means the mixer updates every 21.33ms.

+

To get the total buffer size multiply the bufferlength by the numbuffers value. By default this would be 4 * 1024 = 4096 samples, or 4 * 21.33ms = 85.33ms. This would generally be the total latency of the software mixer, but in reality due to one of the buffers being written to constantly, and the cursor position of the buffer that is audible, the latency is typically more like the (number of buffers - 1.5) multiplied by the buffer length.

+

To convert from milliseconds back to 'samples', simply multiply the value in milliseconds by the sample rate of the output (ie 48000 if that is what it is set to), then divide by 1000.

+

See Also: System::setDSPBufferSize

+

System::getDSPInfoByPlugin

+

Retrieve the description structure for a pre-existing DSP plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getDSPInfoByPlugin(
+  unsigned int handle,
+  const FMOD_DSP_DESCRIPTION **description
+);
+
+ +
FMOD_RESULT FMOD_System_GetDSPInfoByPlugin(
+  FMOD_SYSTEM *system,
+  unsigned int handle,
+  const FMOD_DSP_DESCRIPTION **description
+);
+
+ +
RESULT System.getDSPInfoByPlugin(
+  uint handle,
+  out IntPtr description
+);
+
+ +
System.getDSPInfoByPlugin(
+  handle,
+  description
+);
+
+ +
+
handle
+
Handle to a pre-existing DSP plug-in, loaded by System::loadPlugin.
+
description Out
+
Description structure for the DSP. (FMOD_DSP_DESCRIPTION)
+
+

See Also: System::loadPlugin

+

System::getDSPInfoByType

+

Retrieve the description structure for a built-in DSP plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getDSPInfoByType(
+  FMOD_DSP_TYPE type,
+  const FMOD_DSP_DESCRIPTION **description
+);
+
+ +
FMOD_RESULT FMOD_System_GetDSPInfoByType(
+  FMOD_SYSTEM *system,
+  FMOD_DSP_TYPE type,
+  const FMOD_DSP_DESCRIPTION **description
+);
+
+ +
RESULT System.getDSPInfoByType(
+  DSP_TYPE type,
+  out IntPtr description
+);
+
+ +
System.getDSPInfoByType(
+  type,
+  description
+);
+
+ +
+
type
+
Type of built in unit. (FMOD_DSP_TYPE)
+
description Out
+
Description structure for the DSP. (FMOD_DSP_DESCRIPTION)
+
+

FMOD_DSP_TYPE_MIXER not supported.

+

See Also: System::getDSPInfoByPlugin

+

System::getFileUsage

+

Retrieves information about file reads.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getFileUsage(
+  long long *sampleBytesRead,
+  long long *streamBytesRead,
+  long long *otherBytesRead
+);
+
+ +
FMOD_RESULT FMOD_System_GetFileUsage(
+  FMOD_SYSTEM *system,
+  long long *sampleBytesRead,
+  long long *streamBytesRead,
+  long long *otherBytesRead
+);
+
+ +
RESULT System.getFileUsage(
+  out Int64 sampleBytesRead,
+  out Int64 streamBytesRead,
+  out Int64 otherBytesRead
+);
+
+ +
System.getFileUsage(
+  sampleBytesRead,
+  streamBytesRead,
+  otherBytesRead
+);
+
+ +
+
sampleBytesRead OptOut
+
+

Total bytes read from file for loading sample data.

+
    +
  • Units: Bytes
  • +
+
+
streamBytesRead OptOut
+
+

Total bytes read from file for streaming sounds.

+
    +
  • Units: Bytes
  • +
+
+
otherBytesRead OptOut
+
+

Total bytes read for non-audio data such as bank files created in FMOD Studio.

+
    +
  • Units: Bytes
  • +
+
+
+

The values returned are running totals that never reset.

+

System::getGeometryOcclusion

+

Calculates geometry occlusion between a listener and a sound source.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getGeometryOcclusion(
+  const FMOD_VECTOR *listener,
+  const FMOD_VECTOR *source,
+  float *direct,
+  float *reverb
+);
+
+ +
FMOD_RESULT FMOD_System_GetGeometryOcclusion(
+  FMOD_SYSTEM *system,
+  const FMOD_VECTOR *listener,
+  const FMOD_VECTOR *source,
+  float *direct,
+  float *reverb
+);
+
+ +
RESULT System.getGeometryOcclusion(
+  ref VECTOR listener,
+  ref VECTOR source,
+  out float direct,
+  out float reverb
+);
+
+ +
System.getGeometryOcclusion(
+  listener,
+  source,
+  direct,
+  reverb
+);
+
+ +
+
listener
+
The listener position. (FMOD_VECTOR)
+
source
+
The source position. (FMOD_VECTOR)
+
direct OptOut
+
Direct occlusion value. 0 = not occluded at all / full volume, 1 = fully occluded / silent.
+
reverb OptOut
+
Reverb occlusion value. 0 = not occluded at all / wet, 1 = fully occluded / dry.
+
+

If single sided polygons have been created, it is important to get the source and listener positions around the right way,
+as the occlusion from point A to point B may not be the same as the occlusion from point B to point A.

+

See Also: System::createGeometry

+

System::getGeometrySettings

+

Retrieves the maximum world size for the geometry engine.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getGeometrySettings(
+  float *maxworldsize
+);
+
+ +
FMOD_RESULT FMOD_System_GetGeometrySettings(
+  FMOD_SYSTEM *system,
+  float *maxworldsize
+);
+
+ +
RESULT System.getGeometrySettings(
+  out float maxworldsize
+);
+
+ +
System.getGeometrySettings(
+  maxworldsize
+);
+
+ +
+
maxworldsize Out
+
Maximum world size.
+
+

FMOD uses an efficient spatial partitioning system to store polygons for ray casting purposes.
+The maximum size of the world should be set to allow processing within a known range.
+Outside of this range, objects and polygons will not be processed as efficiently.
+Excessive world size settings can also cause loss of precision and efficiency.

+

See Also: System::setGeometrySettings

+

System::getMasterChannelGroup

+

Retrieves the master ChannelGroup that all sounds ultimately route to.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getMasterChannelGroup(
+  ChannelGroup **channelgroup
+);
+
+ +
FMOD_RESULT FMOD_System_GetMasterChannelGroup(
+  FMOD_SYSTEM *system,
+  FMOD_CHANNELGROUP **channelgroup
+);
+
+ +
RESULT System.getMasterChannelGroup(
+  out ChannelGroup channelgroup
+);
+
+ +
System.getMasterChannelGroup(
+  channelgroup
+);
+
+ +
+
channelgroup Out
+
Master group. (ChannelGroup)
+
+

This is the default ChannelGroup that Channels play on, unless a different ChannelGroup is specified with System::playSound, System::playDSP or Channel::setChannelGroup.
+A master ChannelGroup can be used to do things like set the 'master volume' for all playing Channels. See ChannelControl::setVolume.

+

See Also: System::createChannelGroup

+

System::getMasterSoundGroup

+

Retrieves the default SoundGroup, where all sounds are placed when they are created.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getMasterSoundGroup(
+  SoundGroup **soundgroup
+);
+
+ +
FMOD_RESULT FMOD_System_GetMasterSoundGroup(
+  FMOD_SYSTEM *system,
+  FMOD_SOUNDGROUP **soundgroup
+);
+
+ +
RESULT System.getMasterSoundGroup(
+  out SoundGroup soundgroup
+);
+
+ +
System.getMasterSoundGroup(
+  soundgroup
+);
+
+ +
+
soundgroup Out
+
Master sound group. (SoundGroup)
+
+

If SoundGroup is released, the Sounds will be put back into this SoundGroup.

+

See Also: SoundGroup::release, Sound::setSoundGroup

+

System::getNestedPlugin

+

Retrieves the handle of a nested plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getNestedPlugin(
+  unsigned int handle,
+  int index,
+  unsigned int *nestedhandle
+);
+
+ +
FMOD_RESULT FMOD_System_GetNestedPlugin(
+  FMOD_SYSTEM *system,
+  unsigned int handle,
+  int index,
+  unsigned int *nestedhandle
+);
+
+ +
RESULT System.getNestedPlugin(
+  uint handle,
+  int index,
+  out uint nestedhandle
+);
+
+ +
System.getNestedPlugin(
+  handle,
+  index,
+  nestedhandle
+);
+
+ +
+
handle
+
Handle obtained from System::loadPlugin.
+
index
+
+

Index into the list of plug-in definitions.

+ +
+
nestedhandle Out
+
Handle used to represent the nested plug-in.
+
+

This function is used to iterate handles for plug-ins that have a list of definitions.

+

Most plug-ins contain a single definition. If this is the case, only index 0 is valid, and the returned handle is the same as the handle passed in.

+

See the DSP Plug-in API guide for more information.

+

System::getNetworkProxy

+

Retrieves the URL of the proxy server used in internet streaming.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getNetworkProxy(
+  char *proxy,
+  int proxylen
+);
+
+ +
FMOD_RESULT FMOD_System_GetNetworkProxy(
+  FMOD_SYSTEM *system,
+  char *proxy,
+  int proxylen
+);
+
+ +
RESULT System.getNetworkProxy(
+  out string proxy,
+  int proxylen
+);
+
+ +
System.getNetworkProxy(
+  proxy
+);
+
+ +
+
proxy Out
+
Proxy server URL. (UTF-8 string)
+
proxylen
+
Length of proxy.
+
+

See Also: System::setNetworkProxy

+

System::getNetworkTimeout

+

Retrieve the timeout value for network streams.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getNetworkTimeout(
+  int *timeout
+);
+
+ +
FMOD_RESULT FMOD_System_GetNetworkTimeout(
+  FMOD_SYSTEM *system,
+  int *timeout
+);
+
+ +
RESULT System.getNetworkTimeout(
+  out int timeout
+);
+
+ +
System.getNetworkTimeout(
+  timeout
+);
+
+ +
+
timeout Out
+
+

Timeout value.

+

Units: Milliseconds

+
+
+

System::getNumDrivers

+

Retrieves the number of output drivers available for the selected output type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getNumDrivers(
+  int *numdrivers
+);
+
+ +
FMOD_RESULT FMOD_System_GetNumDrivers(
+  FMOD_SYSTEM *system,
+  int *numdrivers
+);
+
+ +
RESULT System.getNumDrivers(
+  out int numdrivers
+);
+
+ +
System.getNumDrivers(
+  numdrivers
+);
+
+ +
+
numdrivers Out
+
Number of output drivers.
+
+

If System::setOutput has not been called, this function will return the number of drivers available for the default output type.
+A possible use for this function is to iterate through available sound devices for the current output type, and use System::getDriverInfo to get the device's name and other attributes.

+

See Also: System::getDriver

+

System::getNumNestedPlugins

+

Retrieves the number of nested plug-ins from the selected plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getNumNestedPlugins(
+  unsigned int handle,
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_System_GetNumNestedPlugins(
+  FMOD_SYSTEM *system,
+  unsigned int handle,
+  int *count
+);
+
+ +
RESULT System.getNumNestedPlugins(
+  uint handle,
+  out int count
+);
+
+ +
System.getNumNestedPlugins(
+  handle,
+  count
+);
+
+ +
+
handle
+
Handle obtained from System::loadPlugin.
+
count
+
Returned number of plug-ins.
+
+

Most plug-ins contain a single definition, in which case the count is 1, however some have a list of definitions. This function returns the number of plug-ins that have been defined.

+

See the DSP Plug-in API guide for more information.

+

See Also: System::getNestedPlugin

+

System::getNumPlugins

+

Retrieves the number of loaded plug-ins.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getNumPlugins(
+  FMOD_PLUGINTYPE plugintype,
+  int *numplugins
+);
+
+ +
FMOD_RESULT FMOD_System_GetNumPlugins(
+  FMOD_SYSTEM *system,
+  FMOD_PLUGINTYPE plugintype,
+  int *numplugins
+);
+
+ +
RESULT System.getNumPlugins(
+  PLUGINTYPE plugintype,
+  out int numplugins
+);
+
+ +
System.getNumPlugins(
+  plugintype,
+  numplugins
+);
+
+ +
+
plugintype
+
Plugin type. (FMOD_PLUGINTYPE)
+
numplugins Out
+
Number of loaded plug-ins for the selected plugintype.
+
+

See Also: System::loadPlugin, System::getPluginHandle

+

System::getOutput

+

Retrieves the type of output interface used to run the mixer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getOutput(
+  FMOD_OUTPUTTYPE *output
+);
+
+ +
FMOD_RESULT FMOD_System_GetOutput(
+  FMOD_SYSTEM *system,
+  FMOD_OUTPUTTYPE *output
+);
+
+ +
RESULT System.getOutput(
+  out OUTPUTTYPE output
+);
+
+ +
System.getOutput(
+  output
+);
+
+ +
+
output Out
+
Output type. (FMOD_OUTPUTTYPE)
+
+

See Also: System::setOutput

+

System::getOutputByPlugin

+

Retrieves the plug-in handle for the currently selected output type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getOutputByPlugin(
+  unsigned int *handle
+);
+
+ +
FMOD_RESULT FMOD_System_GetOutputByPlugin(
+  FMOD_SYSTEM *system,
+  unsigned int *handle
+);
+
+ +
RESULT System.getOutputByPlugin(
+  out uint handle
+);
+
+ +
System.getOutputByPlugin(
+  handle
+);
+
+ +
+
handle Out
+
Handle to a pre-existing output plug-in.
+
+

See Also: System::getNumPlugins, System::setOutputByPlugin, System::setOutput

+

System::getOutputHandle

+

Retrieves an output type specific internal native interface.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getOutputHandle(
+  void **handle
+);
+
+ +
FMOD_RESULT FMOD_System_GetOutputHandle(
+  FMOD_SYSTEM *system,
+  void **handle
+);
+
+ +
RESULT System.getOutputHandle(
+  out IntPtr handle
+);
+
+ +
System.getOutputHandle(
+  handle
+);
+
+ +
+
handle Out
+
Internal native handle.
+
+

Reinterpret the returned handle based on the selected output type, not all types return something.

+ +

See Also: FMOD_OUTPUTTYPE, System::setOutput, System::init

+

System::getPluginHandle

+

Retrieves the handle of a plug-in based on its type and relative index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getPluginHandle(
+  FMOD_PLUGINTYPE plugintype,
+  int index,
+  unsigned int *handle
+);
+
+ +
FMOD_RESULT FMOD_System_GetPluginHandle(
+  FMOD_SYSTEM *system,
+  FMOD_PLUGINTYPE plugintype,
+  int index,
+  unsigned int *handle
+);
+
+ +
RESULT System.getPluginHandle(
+  PLUGINTYPE plugintype,
+  int index,
+  out uint handle
+);
+
+ +
System.getPluginHandle(
+  plugintype,
+  index,
+  handle
+);
+
+ +
+
plugintype
+
Plug-in type. (FMOD_PLUGINTYPE)
+
index
+
Index in the list of plug-ins for the given plugintype.
+
handle Out
+
Handle used to represent the plugin.
+
+

All plug-ins, whether built-in or loaded, can be enumerated using this and System::getNumPlugins.

+

See Also: System::loadPlugin

+

System::getPluginInfo

+

Retrieves information for the selected plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getPluginInfo(
+  unsigned int handle,
+  FMOD_PLUGINTYPE *plugintype,
+  char *name,
+  int namelen,
+  unsigned int *version
+);
+
+ +
FMOD_RESULT FMOD_System_GetPluginInfo(
+  FMOD_SYSTEM *system,
+  unsigned int handle,
+  FMOD_PLUGINTYPE *plugintype,
+  char *name,
+  int namelen,
+  unsigned int *version
+);
+
+ +
RESULT System.getPluginInfo(
+  uint handle,
+  out PLUGINTYPE plugintype,
+  out string name,
+  int namelen,
+  out uint version
+);
+
+ +
System.getPluginInfo(
+  handle,
+  plugintype,
+  name,
+  version
+);
+
+ +
+
handle
+
Handle to an already loaded plug-in.
+
plugintype OptOut
+
Plug-in type. (FMOD_PLUGINTYPE)
+
name OptOut
+
Name of the plug-in. (UTF-8 string)
+
namelen
+
+

Length of name.

+
    +
  • Units: Bytes
  • +
+
+
version OptOut
+
Version number of the plug-in.
+
+

See Also: System::getNumPlugins, System::getPluginHandle

+

System::getRecordDriverInfo

+

Retrieves identification information about an audio device specified by its index, and specific to the output mode.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getRecordDriverInfo(
+  int id,
+  char *name,
+  int namelen,
+  FMOD_GUID *guid,
+  int *systemrate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *speakermodechannels,
+  FMOD_DRIVER_STATE *state
+);
+
+ +
FMOD_RESULT FMOD_System_GetRecordDriverInfo(
+  FMOD_SYSTEM *system,
+  int id,
+  char *name,
+  int namelen,
+  FMOD_GUID *guid,
+  int *systemrate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *speakermodechannels,
+  FMOD_DRIVER_STATE *state
+);
+
+ +
RESULT System.getRecordDriverInfo(
+  int id,
+  out string name,
+  int namelen,
+  out Guid guid,
+  out int systemrate,
+  out SPEAKERMODE speakermode,
+  out int speakermodechannels,
+  out DRIVER_STATE state
+);
+
+ +
System.getRecordDriverInfo(
+  id,
+  name,
+  guid,
+  systemrate,
+  speakermode,
+  speakermodechannels,
+  state
+);
+
+ +
+
id
+
+

Index of the recording device.

+ +
+
name OptOut
+
The name of the device. (UTF-8 string)
+
namelen
+
The length of the target buffer receiving the name string.
+
+
    +
  • Units: Bytes
  • +
+
+
guid OptOut
+
A GUID that uniquely identifies the device. (FMOD_GUID)
+
systemrate OptOut
+
The sample rate the device operates at.
+
speakermode OptOut
+
The speaker configuration the device is currently using. (FMOD_SPEAKERMODE)
+
speakermodechannels OptOut
+
The number of channels in the current speaker setup.
+
state OptOut
+
Flags that provide additional information about the driver. (FMOD_DRIVER_STATE)
+
+

See Also: System::setOutput

+

System::getRecordNumDrivers

+

Retrieves the number of recording devices available for this output mode. Use this to enumerate all recording devices possible so that the user can select one.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getRecordNumDrivers(
+  int *numdrivers,
+  int *numconnected
+);
+
+ +
FMOD_RESULT FMOD_System_GetRecordNumDrivers(
+  FMOD_SYSTEM *system,
+  int *numdrivers,
+  int *numconnected
+);
+
+ +
RESULT System.getRecordNumDrivers(
+  out int numdrivers,
+  out int numconnected
+);
+
+ +
System.getRecordNumDrivers(
+  numdrivers,
+  numconnected
+);
+
+ +
+
numdrivers OptOut
+
Number of recording drivers available for this output mode.
+
numconnected OptOut
+
Number of recording driver currently plugged in.
+
+

See Also: System::getRecordDriverInfo

+

System::getRecordPosition

+

Retrieves the current recording position of the record buffer in PCM samples.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getRecordPosition(
+  int id,
+  unsigned int *position
+);
+
+ +
FMOD_RESULT FMOD_System_GetRecordPosition(
+  FMOD_SYSTEM *system,
+  int id,
+  unsigned int *position
+);
+
+ +
RESULT System.getRecordPosition(
+  int id,
+  out uint position
+);
+
+ +
System.getRecordPosition(
+  id,
+  position
+);
+
+ +
+
id
+
+

Index of the recording device.

+ +
+
position Out
+
+

Current recording position.

+

Units: Samples

+
+
+

Will return FMOD_ERR_RECORD_DISCONNECTED if the driver is unplugged.

+

The position will return to 0 when System::recordStop is called or when a non-looping recording reaches the end.

+

PS4 specific note: Record devices are virtual so 'position' will continue to update if the device is unplugged (the OS is generating silence). This function will still report FMOD_ERR_RECORD_DISCONNECTED for your information though.

+

See Also: System::recordStart, System::recordStop

+

System::getReverbProperties

+

Retrieves the current reverb environment for the specified reverb instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getReverbProperties(
+  int instance,
+  FMOD_REVERB_PROPERTIES *prop
+);
+
+ +
FMOD_RESULT FMOD_System_GetReverbProperties(
+  FMOD_SYSTEM *system,
+  int instance,
+  FMOD_REVERB_PROPERTIES *prop
+);
+
+ +
RESULT System.getReverbProperties(
+  int instance,
+  out REVERB_PROPERTIES prop
+);
+
+ +
System.getReverbProperties(
+  instance,
+  prop
+);
+
+ +
+
instance
+
Index of the particular reverb instance to target.
+
prop Out
+
Current reverb environment description. (FMOD_REVERB_PROPERTIES)
+
+

See Also: System::setReverbProperties

+

System::getSoftwareChannels

+

Retrieves the maximum number of software mixed Channels possible.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getSoftwareChannels(
+  int *numsoftwarechannels
+);
+
+ +
FMOD_RESULT FMOD_System_GetSoftwareChannels(
+  FMOD_SYSTEM *system,
+  int *numsoftwarechannels
+);
+
+ +
RESULT System.getSoftwareChannels(
+  out int numsoftwarechannels
+);
+
+ +
System.getSoftwareChannels(
+  numsoftwarechannels
+);
+
+ +
+
numsoftwarechannels Out
+
Current maximum number of real voices (Channels) available.
+
+

Software Channels refers to real voices that will play, with numsoftwarechannels refering to the maximum number of voices before successive voices start becoming virtual. For differences between real and virtual voices see the Virtual Voices guide.

+

See Also: System::setSoftwareChannels

+

System::getSoftwareFormat

+

Retrieves the output format for the software mixer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getSoftwareFormat(
+  int *samplerate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *numrawspeakers
+);
+
+ +
FMOD_RESULT FMOD_System_GetSoftwareFormat(
+  FMOD_SYSTEM *system,
+  int *samplerate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *numrawspeakers
+);
+
+ +
RESULT System.getSoftwareFormat(
+  out int samplerate,
+  out SPEAKERMODE speakermode,
+  out int numrawspeakers
+);
+
+ +
System.getSoftwareFormat(
+  samplerate,
+  speakermode,
+  numrawspeakers
+);
+
+ +
+
samplerate OptOut
+
Sample rate of the mixer.
+
speakermode OptOut
+
Speaker setup of the mixer. (FMOD_SPEAKERMODE)
+
numrawspeakers OptOut
+
Number of speakers for FMOD_SPEAKERMODE_RAW mode.
+
+

See Also: System::setSoftwareFormat

+

System::getSpeakerModeChannels

+

Retrieves the channel count for a given speaker mode.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getSpeakerModeChannels(
+  FMOD_SPEAKERMODE mode,
+  int *channels
+);
+
+ +
FMOD_RESULT FMOD_System_GetSpeakerModeChannels(
+  FMOD_SYSTEM *system,
+  FMOD_SPEAKERMODE mode,
+  int *channels
+);
+
+ +
RESULT System.getSpeakerModeChannels(
+  SPEAKERMODE mode,
+  out int channels
+);
+
+ +
System.getSpeakerModeChannels(
+  mode,
+  channels
+);
+
+ +
+
mode
+
Speaker mode to query. (FMOD_SPEAKERMODE)
+
channels Out
+
Number of channels.
+
+

System::getSpeakerPosition

+

Retrieves the position of the specified speaker for the current speaker mode.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getSpeakerPosition(
+  FMOD_SPEAKER speaker,
+  float *x,
+  float *y,
+  bool *active
+);
+
+ +
FMOD_RESULT FMOD_System_GetSpeakerPosition(
+  FMOD_SYSTEM *system,
+  FMOD_SPEAKER speaker,
+  float *x,
+  float *y,
+  FMOD_BOOL *active
+);
+
+ +
RESULT System.getSpeakerPosition(
+  SPEAKER speaker,
+  out float x,
+  out float y,
+  out bool active
+);
+
+ +
System.getSpeakerPosition(
+  speaker,
+  x,
+  y,
+  active
+);
+
+ +
+
speaker
+
Speaker. (FMOD_SPEAKER)
+
x OptOut
+
+

2D X position relative to the listener. -1 = left, 0 = middle, +1 = right.

+
    +
  • Range: [-1, 1]
  • +
+
+
y OptOut
+
+

2D Y position relative to the listener. -1 = back, 0 = middle, +1 = front.

+
    +
  • Range: [-1, 1]
  • +
+
+
active OptOut
+
+

Active state of a speaker. True = included in 3D calculations, False = ignored.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: System::setSpeakerPosition

+

System::getStreamBufferSize

+

Retrieves the default file buffer size for newly opened streams.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getStreamBufferSize(
+  unsigned int *filebuffersize,
+  FMOD_TIMEUNIT *filebuffersizetype
+);
+
+ +
FMOD_RESULT FMOD_System_GetStreamBufferSize(
+  FMOD_SYSTEM *system,
+  unsigned int *filebuffersize,
+  FMOD_TIMEUNIT *filebuffersizetype
+);
+
+ +
RESULT System.getStreamBufferSize(
+  out uint filebuffersize,
+  out TIMEUNIT filebuffersizetype
+);
+
+ +
System.getStreamBufferSize(
+  filebuffersize,
+  filebuffersizetype
+);
+
+ +
+
filebuffersize OptOut
+
+

Buffer size.

+
    +
  • Default: 16384
  • +
+
+
filebuffersizetype OptOut
+
+

Type of units for filebuffersize. (FMOD_TIMEUNIT)

+ +
+
+

Valid units for filebuffersizetype are:

+ +

See Also: System::setStreamBufferSize

+

System::getUserData

+

Retrieves a user value associated with a System object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_System_GetUserData(
+  FMOD_SYSTEM *system,
+  void **userdata
+);
+
+ +
RESULT System.getUserData(
+  out IntPtr userdata
+);
+
+ +
System.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling System::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

System::getVersion

+

Retrieves the FMOD version and build number.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::getVersion(
+  unsigned int *version,
+  unsigned int *buildnumber = 0
+);
+
+ +
FMOD_RESULT FMOD_System_GetVersion(
+  FMOD_SYSTEM *system,
+  unsigned int *version,
+  unsigned int *buildnumber
+);
+
+ +
RESULT System.getVersion(
+  out uint version
+);
+RESULT System.getVersion(
+  out uint version,
+  out uint buildnumber
+);
+
+ +
System.getVersion(
+  version,
+  buildnumber
+);
+
+ +
+
version OutOpt
+
Version number.
+
buildnumber OutOpt
+
Build number.
+
+

The version is a 32 bit hexadecimal value formatted as 16:8:8, with the upper 16 bits being the product version, the middle 8 bits being the major version and the bottom 8 bits being the minor version. For example a value of 0x00010203 is equal to 1.02.03.

+

Compare against FMOD_VERSION to make sure header and runtime library versions match.

+

See Also: System_Create

+

System::init

+

Initialize the system object and prepare FMOD for playback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::init(
+  int maxchannels,
+  FMOD_INITFLAGS flags,
+  void *extradriverdata
+);
+
+ +
FMOD_RESULT FMOD_System_Init(
+  FMOD_SYSTEM *system,
+  int maxchannels,
+  FMOD_INITFLAGS flags,
+  void *extradriverdata
+);
+
+ +
RESULT System.init(
+  int maxchannels,
+  INITFLAGS flags,
+  IntPtr extradriverdata
+);
+
+ +
System.init(
+  maxchannels,
+  flags,
+  extradriverdata
+);
+
+ +
+
maxchannels
+
+

Maximum number of Channel objects available for playback, also known as virtual voices. Virtual voices will play with minimal overhead, with a subset of 'real' voices that are mixed, and selected based on priority and audibility. See the Virtual Voices guide for more information.

+
    +
  • Range: [0, 4095]
  • +
+
+
flags
+
Initialization flags. More than one mode can be set at once by combining them with the OR operator. (FMOD_INITFLAGS)
+
extradriverdata Opt
+
Additional output specific initialization data. This will be passed to the output plug-in. See FMOD_OUTPUTTYPE for descriptions of data that can be passed in, based on the selected output mode.
+
+

A system object must be created with System_create

+

Most API functions require an initialized System object before they will succeed, otherwise they will return FMOD_ERR_UNINITIALIZED. Some can only be called before initialization. These are:

+ +

System::setOutput / System::setOutputByPlugin can be called before or after System::init on Android, GameCore, UWP, Windows and Mac. Other platforms can only call this before System::init.

+

See Also: System::close, System::release

+

System::isRecording

+

Retrieves the state of the FMOD recording API, ie if it is currently recording or not.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::isRecording(
+  int id,
+  bool *recording
+);
+
+ +
FMOD_RESULT FMOD_System_IsRecording(
+  FMOD_SYSTEM *system,
+  int id,
+  FMOD_BOOL *recording
+);
+
+ +
RESULT System.isRecording(
+  int id,
+  out bool recording
+);
+
+ +
System.isRecording(
+  id,
+  recording
+);
+
+ +
+
id
+
+

Index of the recording device.

+ +
+
recording OptOut
+
+

Recording state. True = system is recording, False = system is not recording.

+
    +
  • Units: Boolean
  • +
+
+
+

Recording can be started with System::recordStart and stopped with System::recordStop.

+

Will return FMOD_ERR_RECORD_DISCONNECTED if the driver is unplugged.

+

PS4 specific note: Record devices are virtual so 'recording' will continue to report true if the device is unplugged (the OS is generating silence). This function will still report FMOD_ERR_RECORD_DISCONNECTED for your information though.

+

See Also: System::getRecordPosition

+

System::loadGeometry

+

Creates a geometry object from a block of memory which contains pre-saved geometry data.

+

This function avoids the need to manually create and add geometry for faster start time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::loadGeometry(
+  const void *data,
+  int datasize,
+  Geometry **geometry
+);
+
+ +
FMOD_RESULT FMOD_System_LoadGeometry(
+  FMOD_SYSTEM *system,
+  const void *data,
+  int datasize,
+  FMOD_GEOMETRY **geometry
+);
+
+ +
RESULT System.loadGeometry(
+  IntPtr data,
+  int datasize,
+  out Geometry geometry
+);
+
+ +
System.loadGeometry(
+  data,
+  datasize,
+  geometry
+);
+
+ +
+
data
+
Pre-saved geometry data from Geometry::save.
+
datasize
+
Size of data.
+
+
    +
  • Units: Bytes
  • +
+
+
geometry Out
+
Newly created geometry object. (Geometry)
+
+

See Also: System::createGeometry

+

System::loadPlugin

+

Loads an FMOD plug-in (DSP, output or codec) from a file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::loadPlugin(
+  const char *filename,
+  unsigned int *handle,
+  unsigned int priority = 0
+);
+
+ +
FMOD_RESULT FMOD_System_LoadPlugin(
+  FMOD_SYSTEM *system,
+  const char *filename,
+  unsigned int *handle,
+  unsigned int priority
+);
+
+ +
RESULT System.loadPlugin(
+  string filename,
+  out uint handle,
+  uint priority = 0
+);
+
+ +
+

Currently not supported for JavaScript.

+
+
+
filename
+
Path to the plug-in file. (UTF-8 string)
+
handle Out
+
Handle used to represent the plug-in.
+
priority Opt
+
Codec load priority where 0 represents most important and higher numbers represent less importance. FMOD_PLUGINTYPE_CODEC only.
+
+

Once loaded, DSP plug-ins can be used via System::createDSPByPlugin, output plug-ins can be used via System::setOutputByPlugin, and codec plug-ins are used automatically.

+

When opening a file each codec tests whether it can support the file format in priority order.

+

The format of the plug-in is dependent on the operating system:

+
    +
  • Windows / UWP / Xbox One: .dll
  • +
  • Linux / Android: .so
  • +
  • Macintosh: .dylib
  • +
  • PS4: .prx
  • +
+

See Also: System::unloadPlugin, System::setPluginPath, System::getNumPlugins, System::getPluginHandle, System::getPluginInfo

+

System::lockDSP

+

Mutual exclusion function to lock the DSP engine (which runs asynchronously in another thread), so that it will not execute.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::lockDSP();
+
+ +
FMOD_RESULT FMOD_System_LockDSP(FMOD_SYSTEM *system);
+
+ +
RESULT System.lockDSP();
+
+ +
System.lockDSP();
+
+ +

If the DSP engine is already executing, this function is blocked until it has completed.

+

The function may be used to synchronize DSP graph operations carried out by your code. For example, you could use this to construct a DSP sub-graph without the DSP engine executing in the background while the sub-graph is still under construction.

+

Once you no longer need the DSP engine to be locked, it can be unlocked with System::unlockDSP.

+

Note that if the DSP engine is locked for a significant amount of time, it may result in audible skipping or stuttering.

+

System::mixerResume

+

Resume mixer thread and reacquire access to audio hardware.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::mixerResume();
+
+ +
FMOD_RESULT FMOD_System_MixerResume(FMOD_SYSTEM *system);
+
+ +
RESULT System.mixerResume();
+
+ +
System.mixerResume();
+
+ +

Used on mobile platforms when entering the foreground after being suspended.

+

All internal state will resume, i.e. created Sound and Channels are still valid and playback will continue.

+

Android specific: Must be called on the same thread as System::mixerSuspend.

+

HTML5 specific: Used to start audio from a user interaction event, like a mouse click or screen touch event. Without this call audio may not start on some browsers.

+

See Also: System::mixerSuspend

+

System::mixerSuspend

+

Suspend mixer thread and relinquish usage of audio hardware while maintaining internal state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::mixerSuspend();
+
+ +
FMOD_RESULT FMOD_System_MixerSuspend(FMOD_SYSTEM *system);
+
+ +
RESULT System.mixerSuspend();
+
+ +
System.mixerSuspend();
+
+ +

Used on mobile platforms when entering a backgrounded state to reduce CPU to 0%.

+

All internal state will be maintained, i.e. created Sound and Channels will stay available in memory.

+

See Also: System::mixerResume

+

System::playDSP

+

Plays a DSP along with any of its inputs on a Channel.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::playDSP(
+  DSP *dsp,
+  ChannelGroup *channelgroup,
+  bool paused,
+  Channel **channel
+);
+
+ +
FMOD_RESULT FMOD_System_PlayDSP(
+  FMOD_SYSTEM *system,
+  FMOD_DSP *dsp,
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL paused,
+  FMOD_CHANNEL **channel
+);
+
+ +
RESULT System.playDSP(
+  DSP dsp,
+  ChannelGroup channelgroup,
+  bool paused,
+  out Channel channel
+);
+
+ +
System.playDSP(
+  dsp,
+  channelgroup,
+  paused,
+  channel
+);
+
+ +
+
dsp
+
Unit to play. (DSP)
+
channelgroup Opt
+
Group to output to instead of the master. (ChannelGroup)
+
paused
+
+

Whether to start in the paused state. Start a Channel paused to allow altering attributes without it being audible, then follow it up with a call to ChannelControl::setPaused with paused = False.

+
    +
  • Units: Boolean
  • +
+
+
channel OptOut
+
Newly playing Channel. (Channel)
+
+

Specifying a channelgroup as part of playDSP is more efficient than using Channel::setChannelGroup after playDSP, and could avoid audible glitches if the playDSP is not in a paused state.

+

Channels are reference counted to handle dead or stolen Channel handles. See the white paper on Channel handles for more information.

+

Playing more Sounds or DSPs than physical Channels allow is handled with virtual voices. See the white paper on Virtual Voices for more information.

+

See Also: System::createDSP, System::createDSPByType, System::createDSPByPlugin

+

System::playSound

+

Plays a Sound on a Channel.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::playSound(
+  Sound *sound,
+  ChannelGroup *channelgroup,
+  bool paused,
+  Channel **channel
+);
+
+ +
FMOD_RESULT FMOD_System_PlaySound(
+  FMOD_SYSTEM *system,
+  FMOD_SOUND *sound,
+  FMOD_CHANNELGROUP *channelgroup,
+  FMOD_BOOL paused,
+  FMOD_CHANNEL **channel
+);
+
+ +
RESULT System.playSound(
+  Sound sound,
+  ChannelGroup channelgroup,
+  bool paused,
+  out Channel channel
+);
+
+ +
System.playSound(
+  sound,
+  channelgroup,
+  paused,
+  channel
+);
+
+ +
+
sound
+
Sound to play. (Sound)
+
channelgroup Opt
+
Group to output to instead of the master. (ChannelGroup)
+
paused
+
+

Whether to start in the paused state. Start a Channel paused to allow altering attributes without it being audible, then follow it up with a call to ChannelControl::setPaused with paused = False.

+
    +
  • Units: Boolean
  • +
+
+
channel OptOut
+
Newly playing Channel. (Channel)
+
+

When a sound is played, it will use the sound's default frequency and priority. See Sound::setDefaults.

+

A sound defined as FMOD_3D will by default play at the 3D position of the listener. To set the 3D position of the Channel before the sound is audible, start the Channel paused by setting the paused parameter to true, and call ChannelControl::set3DAttributes.

+

Specifying a channelgroup as part of playSound is more efficient than using Channel::setChannelGroup after playSound, and could avoid audible glitches if the playSound is not in a paused state.

+

Channels are reference counted to handle dead or stolen Channel handles. See the white paper on Channel handles for more information.

+

Playing more Sounds than physical Channels allow is handled with virtual voices. See the white paper on Virtual Voices for more information.

+

See Also: System::createSound, System::createStream

+

System::recordStart

+

Starts the recording engine recording to a pre-created Sound object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::recordStart(
+  int id,
+  Sound *sound,
+  bool loop
+);
+
+ +
FMOD_RESULT FMOD_System_RecordStart(
+  FMOD_SYSTEM *system,
+  int id,
+  FMOD_SOUND *sound,
+  FMOD_BOOL loop
+);
+
+ +
RESULT System.recordStart(
+  int id,
+  Sound sound,
+  bool loop
+);
+
+ +
System.recordStart(
+  id,
+  sound,
+  loop
+);
+
+ +
+
id
+
+

Index of the recording device.

+ +
+
sound
+
User created sound for the user to record to. (Sound)
+
loop
+
+

Flag to tell the recording engine whether to continue recording to the provided sound from the start again, after it has reached the end. If this is set to true the data will be continually be overwritten once every loop.

+
    +
  • Units: Boolean
  • +
+
+
+

Will return FMOD_ERR_RECORD_DISCONNECTED if the driver is unplugged.

+

Sound must be created as FMOD_CREATESAMPLE. Raw PCM data can be accessed with Sound::lock, Sound::unlock and System::getRecordPosition.

+

Recording from the same driver a second time will stop the first recording.

+

For lowest latency set the FMOD::Sound sample rate to the rate returned by System::getRecordDriverInfo, otherwise a resampler will be allocated to handle the difference in frequencies, which adds latency.

+

See Also: System::recordStop

+

System::recordStop

+

Stops the recording engine from recording to a pre-created Sound object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::recordStop(
+  int id
+);
+
+ +
FMOD_RESULT FMOD_System_RecordStop(
+  FMOD_SYSTEM *system,
+  int id
+);
+
+ +
RESULT System.recordStop(
+  int id
+);
+
+ +
System.recordStop(
+  id
+);
+
+ +
+
id
+
+

Index of the recording device.

+ +
+
+

Returns no error if unplugged or already stopped.

+

See Also: System::recordStart

+

System::registerCodec

+

Register a Codec plug-in description structure for later use.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::registerCodec(
+  FMOD_CODEC_DESCRIPTION *description,
+  unsigned int *handle,
+  unsigned int priority = 0
+);
+
+ +
FMOD_RESULT FMOD_System_RegisterCodec(
+  FMOD_SYSTEM *system,
+  FMOD_CODEC_DESCRIPTION *description,
+  unsigned int *handle,
+  unsigned int priority
+);
+
+ +
System.registerCodec(
+  description,
+  handle,
+  priority
+);
+
+ +
+

Currently not supported for C#.

+
+
+
description
+
Structure describing the Codec to register. (FMOD_CODEC_DESCRIPTION)
+
handle Out
+
Handle used to represent the plug-in.
+
priority Opt
+
Codec load priority where 0 represents most important and higher numbers represent less importance.
+
+

To create an instances of this plug-in use System::createSound and System::createStream.

+

When opening a file each Codec tests whether it can support the file format in priority order. The priority for each FMOD_SOUND_TYPE are as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FMOD_SOUND_TYPEPriority
FMOD_SOUND_TYPE_FSB250
FMOD_SOUND_TYPE_XMA250
FMOD_SOUND_TYPE_AT9250
FMOD_SOUND_TYPE_VORBIS250
FMOD_SOUND_TYPE_OPUS250
FMOD_SOUND_TYPE_FADPCM250
FMOD_SOUND_TYPE_WAV600
FMOD_SOUND_TYPE_OGGVORBIS800
FMOD_SOUND_TYPE_AIFF1000
FMOD_SOUND_TYPE_FLAC1100
FMOD_SOUND_TYPE_MOD1200
FMOD_SOUND_TYPE_S3M1300
FMOD_SOUND_TYPE_XM1400
FMOD_SOUND_TYPE_IT1500
FMOD_SOUND_TYPE_MIDI1600
FMOD_SOUND_TYPE_DLS1700
FMOD_SOUND_TYPE_ASF1900
FMOD_SOUND_TYPE_AUDIOQUEUE2200
FMOD_SOUND_TYPE_MEDIACODEC2250
FMOD_SOUND_TYPE_MPEG2400
FMOD_SOUND_TYPE_PLAYLIST2450
FMOD_SOUND_TYPE_RAW2500
FMOD_SOUND_TYPE_USER2600
FMOD_SOUND_TYPE_MEDIA_FOUNDATION2600
+

XMA, AT9, Vorbis, Opus and FADPCM are supported through the FSB format, and therefore have the same priority as FSB.

+

Media Foundation is supported through the User codec, and therefore has the same priority as User.

+

Raw and User are only accesible if FMOD_OPENRAW or FMOD_OPENUSER is specified as the mode in System::createSound.

+

System::registerDSP

+

Register a DSP plug-in description structure for later use.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::registerDSP(
+  const FMOD_DSP_DESCRIPTION *description,
+  unsigned int *handle
+);
+
+ +
FMOD_RESULT FMOD_System_RegisterDSP(
+  FMOD_SYSTEM *system,
+  const FMOD_DSP_DESCRIPTION *description,
+  unsigned int *handle
+);
+
+ +
RESULT System.registerDSP(
+  ref DSP_DESCRIPTION description,
+  out uint handle
+);
+
+ +
System.registerDSP(
+  description,
+  handle
+);
+
+ +
+
description
+
Structure describing the DSP to register. (FMOD_DSP_DESCRIPTION)
+
handle Out
+
Handle used to represent the plug-in.
+
+

To create an instance of this plug-in, use System::createDSPByPlugin.

+

System::registerOutput

+

Register an Output plug-in description structure for later use.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::registerOutput(
+  const FMOD_OUTPUT_DESCRIPTION *description,
+  unsigned int *handle
+);
+
+ +
FMOD_RESULT FMOD_System_RegisterOutput(
+  FMOD_SYSTEM *system,
+  const FMOD_OUTPUT_DESCRIPTION *description,
+  unsigned int *handle
+);
+
+ +
System.registerOutput(
+  description,
+  handle
+);
+
+ +
+

Not supported for C#.

+
+
+
description
+
Structure describing the Output to register. (FMOD_OUTPUT_DESCRIPTION)
+
handle Out
+
Handle used to represent the plug-in.
+
+

To select this plug-in for output use, use System::setOutputByPlugin.

+

System::release

+

Closes and frees this object and its resources.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::release();
+
+ +
FMOD_RESULT FMOD_System_Release(FMOD_SYSTEM *system);
+
+ +
RESULT System.release();
+
+ +
System.release();
+
+ +

This will internally call System::close, so calling System::close before this function is not necessary.

+
+

Calls to System_Create and System::release are not thread-safe. Do not call these functions simultaneously from multiple threads at once.

+
+

See Also: System::init

+

System::set3DListenerAttributes

+

Sets the position, velocity and orientation of the specified 3D sound listener.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::set3DListenerAttributes(
+  int listener,
+  const FMOD_VECTOR *pos,
+  const FMOD_VECTOR *vel,
+  const FMOD_VECTOR *forward,
+  const FMOD_VECTOR *up
+);
+
+ +
FMOD_RESULT FMOD_System_Set3DListenerAttributes(
+  FMOD_SYSTEM *system,
+  int listener,
+  const FMOD_VECTOR *pos,
+  const FMOD_VECTOR *vel,
+  const FMOD_VECTOR *forward,
+  const FMOD_VECTOR *up
+);
+
+ +
RESULT System.set3DListenerAttributes(
+  int listener,
+  ref VECTOR pos,
+  ref VECTOR vel,
+  ref VECTOR forward,
+  ref VECTOR up
+);
+
+ +
System.set3DListenerAttributes(
+  listener,
+  pos,
+  vel,
+  forward,
+  up
+);
+
+ +
+
listener
+
+

Index of listener to set 3D attributes on. Listeners are indexed from 0, to FMOD_MAX_LISTENERS - 1, in a multi-listener environment.

+ +
+
pos Opt
+
+

Position in 3D world space used for panning and attenuation. (FMOD_VECTOR)

+ +
+
vel Opt
+
+

Velocity in 3D space used for doppler. (FMOD_VECTOR)

+ +
+
forward Opt
+
Forwards orientation. (FMOD_VECTOR)
+
up Opt
+
Upwards orientation. (FMOD_VECTOR)
+
+

The forward and up vectors must be perpendicular and be of unit length (magnitude of each vector should be 1).

+

Vectors must be provided in the correct handedness.

+

For velocity, remember to use units per second, and not units per frame. This is a common mistake and will make the doppler effect sound wrong if velocity is based on movement per frame rather than a fixed time period.
+If velocity per frame is calculated, it can be converted to velocity per second by dividing it by the time taken between frames as a fraction of a second.
+i.e.

+
velocity_units_per_second = (position_currentframe - position_lastframe) / time_taken_since_last_frame_in_seconds.
+
+

At 60fps the formula would look like velocity_units_per_second = (position_currentframe - position_lastframe) / 0.0166667.

+

Users of the Studio API should call Studio::System::setListenerAttributes instead of this function.

+

See Also: System::get3DListenerAttributes, System::set3DSettings, System::get3DSettings

+

System::set3DNumListeners

+

Sets the number of 3D 'listeners' in the 3D sound scene.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::set3DNumListeners(
+  int numlisteners
+);
+
+ +
FMOD_RESULT FMOD_System_Set3DNumListeners(
+  FMOD_SYSTEM *system,
+  int numlisteners
+);
+
+ +
RESULT System.set3DNumListeners(
+  int numlisteners
+);
+
+ +
System.set3DNumListeners(
+  numlisteners
+);
+
+ +
+
numlisteners Out
+
+

Number of listeners in the scene.

+ +
+
+

This function is useful mainly for split-screen game purposes.

+

If the number of listeners is set to more than 1, then panning and doppler are turned off. All sound effects will be mono. FMOD uses a 'closest sound to the listener' method to determine what should be heard in this case.

+

Users of the Studio API should call Studio::System::setNumListeners instead of this function.

+

See Also: System::get3DNumListeners, System::set3DListenerAttributes

+

System::set3DRolloffCallback

+

Sets a callback to allow custom calculation of distance attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::set3DRolloffCallback(
+  FMOD_3D_ROLLOFF_CALLBACK callback
+);
+
+ +
FMOD_RESULT FMOD_System_Set3DRolloffCallback(
+  FMOD_SYSTEM *system,
+  FMOD_3D_ROLLOFF_CALLBACK callback
+);
+
+ +
RESULT System.set3DRolloffCallback(
+  CB_3D_ROLLOFFCALLBACK callback
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
callback
+
Custom callback. Set to 0 or null to return control of distance attenuation to FMOD. (FMOD_3D_ROLLOFF_CALLBACK)
+
+

This function overrides FMOD_3D_INVERSEROLLOFF, FMOD_3D_LINEARROLLOFF, FMOD_3D_LINEARSQUAREROLLOFF, FMOD_3D_INVERSETAPEREDROLLOFF and FMOD_3D_CUSTOMROLLOFF.

+

See Also: Callback Behavior

+

System::set3DSettings

+

Sets the global doppler scale, distance factor and log roll-off scale for all 3D sound in FMOD.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::set3DSettings(
+  float dopplerscale,
+  float distancefactor,
+  float rolloffscale
+);
+
+ +
FMOD_RESULT FMOD_System_Set3DSettings(
+  FMOD_SYSTEM *system,
+  float dopplerscale,
+  float distancefactor,
+  float rolloffscale
+);
+
+ +
RESULT System.set3DSettings(
+  float dopplerscale,
+  float distancefactor,
+  float rolloffscale
+);
+
+ +
System.set3DSettings(
+  dopplerscale,
+  distancefactor,
+  rolloffscale
+);
+
+ +
+
dopplerscale
+
+

A scaling factor for doppler shift.

+
    +
  • Default: 1
  • +
+
+
distancefactor
+
+

A factor for converting game distance units to FMOD distance units.

+
    +
  • Default: 1
  • +
+
+
rolloffscale
+
+

A scaling factor for distance attenuation. When a sound uses a roll-off mode other than FMOD_3D_CUSTOMROLLOFF and the distance is greater than the sound's minimum distance, the distance is scaled by the roll-off scale.

+
    +
  • Default: 1
  • +
+
+
+

The dopplerscale is a general scaling factor for how much the pitch varies due to doppler shifting in 3D sound. Doppler is the pitch bending effect when a sound comes towards the listener or moves away from it, much like the effect you hear when a train goes past you with its horn sounding. With "dopplerscale" you can exaggerate or diminish the effect. FMOD's effective speed of sound at a doppler factor of 1.0 is 340 m/s.

+

The distancefactor is the FMOD 3D engine relative distance factor, compared to 1.0 meters. Another way to put it is that it equates to "how many units per meter does your engine have". For example, if you are using feet then "scale" would equal 3.28.
+This only affects doppler. If you keep your min/max distance, custom roll-off curves, and positions in scale relative to each other, the volume roll-off will not change. If you set this, the mindistance of a sound will automatically set itself to this value when it is created in case the user forgets to set the mindistance to match the new distancefactor.

+

The rolloffscale is a global factor applied to the roll-off of sounds using roll-off modes other than FMOD_3D_CUSTOMROLLOFF. When a sound uses a roll-off mode other than FMOD_3D_CUSTOMROLLOFF and the distance is greater than the sound's minimum distance, the distance for the purposes of distance attenuation is calculated according to the formula distance = (distance - minDistance) * rolloffscale + minDistance.

+

See Also: System::get3DSettings, Sound::set3DMinMaxDistance, Sound::get3DMinMaxDistance, ChannelControl::set3DAttributes

+

System::setAdvancedSettings

+

Sets advanced settings for the system object, typically to allow adjusting of settings related to resource usage or audio quality.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setAdvancedSettings(
+  FMOD_ADVANCEDSETTINGS *settings
+);
+
+ +
FMOD_RESULT FMOD_System_SetAdvancedSettings(
+  FMOD_SYSTEM *system,
+  FMOD_ADVANCEDSETTINGS *settings
+);
+
+ +
RESULT System.setAdvancedSettings(
+  ref ADVANCEDSETTINGS settings
+);
+
+ +
System.setAdvancedSettings(
+  settings
+);
+
+ +
+
settings
+
Advanced settings (FMOD_ADVANCEDSETTINGS)
+
+

To use, clear the FMOD_ADVANCEDSETTINGS structure to zeroes first, then set the cbSize member to the size in bytes of the FMOD_ADVANCEDSETTINGS structure. From here settings can be set one at a time, as all defaults are null or 0 for all members.

+

See Also: System::getAdvancedSettings

+

System::setCallback

+

Sets the callback for System level notifications.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setCallback(
+  FMOD_SYSTEM_CALLBACK callback,
+  FMOD_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_SYSTEM_CALLBACK_ALL
+);
+
+ +
FMOD_RESULT FMOD_System_SetCallback(
+  FMOD_SYSTEM *system,
+  FMOD_SYSTEM_CALLBACK callback,
+  FMOD_SYSTEM_CALLBACK_TYPE callbackmask
+);
+
+ +
RESULT System.setCallback(
+  SYSTEM_CALLBACK callback,
+  SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL
+);
+
+ +
System.setCallback(
+  callback,
+  callbackmask
+);
+
+ +
+
callback
+
Callback to invoke when system notification happens. (FMOD_SYSTEM_CALLBACK)
+
callbackmask
+
Bitfield specifying which callback types are required, to filter out unwanted callbacks. (FMOD_SYSTEM_CALLBACK_TYPE)
+
+

System callbacks can be called by a variety of FMOD threads, so make sure any code executed inside the callback is thread safe.

+

See Also: Callback Behavior

+

System::setDriver

+

Sets the output driver for the selected output type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setDriver(
+  int driver
+);
+
+ +
FMOD_RESULT FMOD_System_SetDriver(
+  FMOD_SYSTEM *system,
+  int driver
+);
+
+ +
RESULT System.setDriver(
+  int driver
+);
+
+ +
System.setDriver(
+  driver
+);
+
+ +
+
driver
+
+

Driver index where 0 represents the default for the output type.

+ +
+
+

When an output type has more than one driver available, this function can be used to select between them.

+

If this function is called after System::init, the current driver will be shutdown and the newly selected driver will be initialized / started.

+

See Also: System::getDriver, System::getDriverInfo, System::setOutput

+

System::setDSPBufferSize

+

Sets the buffer size for the FMOD software mixing engine.

+

This function is used if you need to control mixer latency or granularity. Smaller buffersizes lead to smaller latency, but can lead to stuttering/skipping/unstable sound on slower machines or soundcards with bad drivers.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setDSPBufferSize(
+  unsigned int bufferlength,
+  int numbuffers
+);
+
+ +
FMOD_RESULT FMOD_System_SetDSPBufferSize(
+  FMOD_SYSTEM *system,
+  unsigned int bufferlength,
+  int numbuffers
+);
+
+ +
RESULT System.setDSPBufferSize(
+  uint bufferlength,
+  int numbuffers
+);
+
+ +
System.setDSPBufferSize(
+  bufferlength,
+  numbuffers
+);
+
+ +
+
bufferlength
+
+

The mixer engine block size. Use this to adjust mixer update granularity. See below for more information on buffer length vs latency.

+
    +
  • Units: Samples
  • +
  • Default: 1024
  • +
+
+
numbuffers
+
+

The mixer engine number of buffers used. Use this to adjust mixer latency. See below for more information on number of buffers vs latency.

+
    +
  • Default: 4
  • +
+
+
+

To get the bufferlength in milliseconds, divide it by the output rate and multiply the result by 1000. For a bufferlength of 1024 and an output rate of 48khz (see System::SetSoftwareFormat), milliseconds = 1024 / 48000 * 1000 = 21.33ms. This means the mixer updates every 21.33ms.

+

To get the total buffer size multiply the bufferlength by the numbuffers value. By default this would be 4 * 1024 = 4096 samples, or 4 * 21.33ms = 85.33ms. This would generally be the total latency of the software mixer, but in reality due to one of the buffers being written to constantly, and the cursor position of the buffer that is audible, the latency is typically more like the (number of buffers - 1.5) multiplied by the buffer length.

+

To convert from milliseconds back to 'samples', simply multiply the value in milliseconds by the sample rate of the output (ie 48000 if that is what it is set to), then divide by 1000.

+

The FMOD software mixer mixes to a ringbuffer. The size of this ringbuffer is determined here. It mixes a block of sound data every 'bufferlength' number of samples, and there are 'numbuffers' number of these blocks that make up the entire ringbuffer. Adjusting these values can lead to extremely low latency performance (smaller values), or greater stability in sound output (larger values).

+

Warning! The 'buffersize' is generally best left alone. Making the granularity smaller will just increase CPU usage (cache misses and DSP graph overhead). Making it larger affects how often you hear commands update such as volume/pitch/pan changes. Anything above 20ms will be noticeable and sound parameter changes will be obvious instead of smooth.

+

FMOD chooses the most optimal size by default for best stability, depending on the output type. It is not recommended changing this value unless you really need to. You may get worse performance than the default settings chosen by FMOD. If you do set the size manually, the bufferlength argument must be a multiple of four, typically 256, 480, 512, 1024 or 2048 depedning on your latency requirements.

+

The values in milliseconds and average latency expected from the settings can be calculated using the following code:

+
FMOD_RESULT result;
+unsigned int blocksize;
+int numblocks;
+float ms;
+
+result = system->getDSPBufferSize(&blocksize, &numblocks);
+result = system->getSoftwareFormat(&frequency, 0, 0);
+
+ms = (float)blocksize * 1000.0f / (float)frequency;
+
+printf("Mixer blocksize        = %.02f ms\n", ms);
+printf("Mixer Total buffersize = %.02f ms\n", ms * numblocks);
+printf("Mixer Average Latency  = %.02f ms\n", ms * ((float)numblocks - 1.5f));
+
+ + +

See Also: System::getDSPBufferSize, System::getSoftwareFormat, System::init, System::close

+

System::setFileSystem

+

Set callbacks to implement all file I/O instead of using the platform native method.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setFileSystem(
+  FMOD_FILE_OPEN_CALLBACK useropen,
+  FMOD_FILE_CLOSE_CALLBACK userclose,
+  FMOD_FILE_READ_CALLBACK userread,
+  FMOD_FILE_SEEK_CALLBACK userseek,
+  FMOD_FILE_ASYNCREAD_CALLBACK userasyncread,
+  FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel,
+  int blockalign
+);
+
+ +
FMOD_RESULT FMOD_System_SetFileSystem(
+  FMOD_SYSTEM *system,
+  FMOD_FILE_OPEN_CALLBACK useropen,
+  FMOD_FILE_CLOSE_CALLBACK userclose,
+  FMOD_FILE_READ_CALLBACK userread,
+  FMOD_FILE_SEEK_CALLBACK userseek,
+  FMOD_FILE_ASYNCREAD_CALLBACK userasyncread,
+  FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel,
+  int blockalign
+);
+
+ +
RESULT System.setFileSystem(
+  FILE_OPENCALLBACK useropen,
+  FILE_CLOSECALLBACK userclose,
+  FILE_READCALLBACK userread,
+  FILE_SEEKCALLBACK userseek,
+  FILE_ASYNCREADCALLBACK userasyncread,
+  FILE_ASYNCCANCELCALLBACK userasynccancel,
+  int blockalign
+);
+
+ +
System.setFileSystem(
+  useropen,
+  userclose,
+  userread,
+  userseek,
+  userasyncread,
+  userasynccancel,
+  blockalign
+);
+
+ +
+
useropen Opt
+
Callback for opening a file. (FMOD_FILE_OPEN_CALLBACK)
+
userclose Opt
+
Callback for closing a file. (FMOD_FILE_CLOSE_CALLBACK)
+
userread Opt
+
Callback for reading from a file, instead of userasyncread and userasynccancel. (FMOD_FILE_READ_CALLBACK)
+
userseek Opt
+
Callback for seeking within a file, instead of userasyncread and userasynccancel. (FMOD_FILE_SEEK_CALLBACK)
+
userasyncread Opt
+
Callback for reading and seeking asynchronously, instead of userread and userseek. (FMOD_FILE_ASYNCREAD_CALLBACK)
+
userasynccancel Opt
+
Callback for cancelling a previous userasyncread call. (FMOD_FILE_ASYNCCANCEL_CALLBACK)
+
blockalign Opt
+
+

File buffering chunk size, specify -1 to keep system default or previously set value. 0 = disable buffering, see notes below for more on this.

+
    +
  • Default: 2048
  • +
  • Units: Bytes
  • +
+
+
+

Setting these callbacks have no effect on sounds loaded with FMOD_OPENMEMORY or FMOD_OPENUSER.

+

There are three valid configurations for this function:

+
    +
  1. Set useropen, userclose, userread, userseek and optionally blockalign for blocking file I/O.
  2. +
  3. Set useropen, userclose, userasyncread, userasynccancel and optionally blockalign for asynchronous file I/O.
  4. +
  5. Set blockalign by itself with everything else null, to change platform native file I/O buffering.
  6. +
+

Setting blockalign to 0 will disable file buffering and cause every read to invoke the relevant callback (not recommended), current default is tuned for memory usage vs performance. Be mindful of the I/O capabilities of the platform before increasing this default.

+

Asynchronous file access via userasyncread / userasynccanel.

+
    +
  • it is recommended to consult the 'asyncio' example for reference implementation. There is also a tutorial on the subject, Asynchronous I/O.
  • +
  • userasyncread allows the user to return immediately before the data is ready. FMOD will either wait internally (see note below about thread safety), or continuously check in the streamer until data arrives. It is the user's responsibility to provide data in time in the stream case, or the stream may stutter. Data starvation can be detected with Sound::getOpenState.
  • +
  • Important: If userasyncread is processed in the main thread, then it will hang the application, because FMOD will wait internally until data is ready, and the main thread will not be able to supply the data. For this reason the user's file access should normally be from a separate thread.
  • +
  • A userasynccancel must either service or prevent an async read issued previously via userasyncread before returning.
  • +
+

Implementation tips to avoid hangs / crashes.

+
    +
  • All Callbacks must be thread safe.
  • +
  • FMOD_ERR_FILE_EOF must be returned if the number of bytes read is smaller than requested.
  • +
+
+

userasyncread and userasynccancel are not supported for JavaScript.

+
+

See Also: Callback Behavior, System::attachFileSystem

+

System::setGeometrySettings

+

Sets the maximum world size for the geometry engine for performance / precision reasons.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setGeometrySettings(
+  float maxworldsize
+);
+
+ +
FMOD_RESULT FMOD_System_SetGeometrySettings(
+  FMOD_SYSTEM *system,
+  float maxworldsize
+);
+
+ +
RESULT System.setGeometrySettings(
+  float maxworldsize
+);
+
+ +
System.setGeometrySettings(
+  maxworldsize
+);
+
+ +
+
maxworldsize
+
Maximum size of the world from the centerpoint to the edge using the same units used in other 3D functions.
+
+

FMOD uses an efficient spatial partitioning system to store polygons for ray casting purposes.
+The maximum size of the world should (maxworldsize) be set to allow processing within a known range.
+Outside of this range, objects and polygons will not be processed as efficiently.
+Excessive world size settings can also cause loss of precision and efficiency.

+

Setting maxworldsize should be done first before creating any geometry. It can be done any time afterwards but may be slow in this case.

+

See Also: System::createGeometry, System::getGeometrySettings, System::set3DSettings

+

System::setNetworkProxy

+

Set a proxy server to use for all subsequent internet connections.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setNetworkProxy(
+  const char *proxy
+);
+
+ +
FMOD_RESULT FMOD_System_SetNetworkProxy(
+  FMOD_SYSTEM *system,
+  const char *proxy
+);
+
+ +
RESULT System.setNetworkProxy(
+  string proxy
+);
+
+ +
System.setNetworkProxy(
+  proxy
+);
+
+ +
+
proxy
+
Proxy server URL. (UTF-8 string)
+
+

Specify the proxy in host:port format e.g. www.fmod.com:8888 (defaults to port 80 if no port is specified).

+

Basic authentication is supported using user:password@host:port format e.g. bob:sekrit123@www.fmod.com:8888

+

See Also: System::getNetworkProxy

+

System::setNetworkTimeout

+

Set the timeout for network streams.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setNetworkTimeout(
+  int timeout
+);
+
+ +
FMOD_RESULT FMOD_System_SetNetworkTimeout(
+  FMOD_SYSTEM *system,
+  int timeout
+);
+
+ +
RESULT System.setNetworkTimeout(
+  int timeout
+);
+
+ +
System.setNetworkTimeout(
+  timeout
+);
+
+ +
+
timeout
+
+

Timeout value.

+
    +
  • Units: Milliseconds
  • +
  • Default: 5000
  • +
+
+
+

See Also: System::getNetworkTimeout

+

System::setOutput

+

Sets the type of output interface used to run the mixer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setOutput(
+  FMOD_OUTPUTTYPE output
+);
+
+ +
FMOD_RESULT FMOD_System_SetOutput(
+  FMOD_SYSTEM *system,
+  FMOD_OUTPUTTYPE output
+);
+
+ +
RESULT System.setOutput(
+  OUTPUTTYPE output
+);
+
+ +
System.setOutput(
+  output
+);
+
+ +
+
output
+
Output type. (FMOD_OUTPUTTYPE)
+
+

This function is typically used to select between different OS specific audio APIs which may have different features.

+

It is only necessary to call this function if you want to specifically switch away from the default output mode for the operating system. The most optimal mode is selected by default for the operating system.

+

(Windows, UWP, GameCore, Android, MacOS, iOS, Linux Only) This function can be called after System::init to perform special handling of driver disconnections, see FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED.

+

When using the Studio API, switching to an NRT (non-realtime) output type after FMOD is already initialized will not behave correctly unless the Studio API was initialized with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE.

+

See Also: System::getOutput

+

System::setOutputByPlugin

+

Selects an output type given a plug-in handle.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setOutputByPlugin(
+  unsigned int handle
+);
+
+ +
FMOD_RESULT FMOD_System_SetOutputByPlugin(
+  FMOD_SYSTEM *system,
+  unsigned int handle
+);
+
+ +
RESULT System.setOutputByPlugin(
+  uint handle
+);
+
+ +
System.setOutputByPlugin(
+  handle
+);
+
+ +
+
handle
+
Handle to an already loaded output plug-in.
+
+

(Windows Only) This function can be called after FMOD is already initialized. You can use it to change the output mode at runtime. If FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED is specified use the setOutput call to change to FMOD_OUTPUTTYPE_NOSOUND if no more sound card drivers exist.

+

See Also: System::getNumPlugins, System::getOutputByPlugin, System::setOutput

+

System::setPluginPath

+

Specify a base search path for plug-ins so they can be placed somewhere else than the directory of the main executable.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setPluginPath(
+  const char *path
+);
+
+ +
FMOD_RESULT FMOD_System_SetPluginPath(
+  FMOD_SYSTEM *system,
+  const char *path
+);
+
+ +
RESULT System.setPluginPath(
+  string path
+);
+
+ +
System.setPluginPath(
+  path
+);
+
+ +
+
path
+
A character string containing a correctly formatted path to load plug-ins from. (UTF-8 string)
+
+

See Also: System::loadPlugin

+

System::setReverbProperties

+

Sets parameters for the global reverb environment.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setReverbProperties(
+  int instance,
+  const FMOD_REVERB_PROPERTIES *prop
+);
+
+ +
FMOD_RESULT FMOD_System_SetReverbProperties(
+  FMOD_SYSTEM *system,
+  int instance,
+  const FMOD_REVERB_PROPERTIES *prop
+);
+
+ +
RESULT System.setReverbProperties(
+  int instance,
+  ref REVERB_PROPERTIES prop
+);
+
+ +
System.setReverbProperties(
+  instance,
+  prop
+);
+
+ +
+
instance
+
+

Index of the particular reverb instance to target.

+ +
+
prop
+
Reverb environment description. Passing 0 or NULL to this function will delete the reverb. (FMOD_REVERB_PROPERTIES)
+
+

To assist in defining reverb properties there are several presets available, see FMOD_REVERB_PRESETS

+

When using each instance for the first time, FMOD will create an SFX reverb DSP unit that takes up several hundred kilobytes of memory and some CPU.

+

See Also: System::getReverbProperties, ChannelControl::setReverbProperties, ChannelControl::getReverbProperties, Effects Reference: SFX Reverb

+

System::setSoftwareChannels

+

Sets the maximum number of software mixed Channels possible.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setSoftwareChannels(
+  int numsoftwarechannels
+);
+
+ +
FMOD_RESULT FMOD_System_SetSoftwareChannels(
+  FMOD_SYSTEM *system,
+  int numsoftwarechannels
+);
+
+ +
RESULT System.setSoftwareChannels(
+  int numsoftwarechannels
+);
+
+ +
System.setSoftwareChannels(
+  numsoftwarechannels
+);
+
+ +
+
numsoftwarechannels
+
+

The maximum number of real Channels to be allocated by FMOD.

+
    +
  • Default: 64
  • +
+
+
+

This function cannot be called after FMOD is already activated, it must be called before System::init, or after System::close.
+'Software Channels' refers to real Channels that will play, with numsoftwarechannels refering to the maximum number of Channels before successive Channels start becoming virtual. For differences between real and virtual Channels see the Virtual Voices guide.

+

See Also: System::getSoftwareChannels, System::init, System::close

+

System::setSoftwareFormat

+

Sets the output format for the software mixer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setSoftwareFormat(
+  int samplerate,
+  FMOD_SPEAKERMODE speakermode,
+  int numrawspeakers
+);
+
+ +
FMOD_RESULT FMOD_System_SetSoftwareFormat(
+  FMOD_SYSTEM *system,
+  int samplerate,
+  FMOD_SPEAKERMODE speakermode,
+  int numrawspeakers
+);
+
+ +
RESULT System.setSoftwareFormat(
+  int samplerate,
+  SPEAKERMODE speakermode,
+  int numrawspeakers
+);
+
+ +
System.setSoftwareFormat(
+  samplerate,
+  speakermode,
+  numrawspeakers
+);
+
+ +
+
samplerate Opt
+
+

Sample rate of the mixer.

+
    +
  • Range: [8000, 192000]
  • +
  • Units: Hertz
  • +
  • Default: 48000
  • +
+
+
speakermode Opt
+
Speaker setup of the mixer. (FMOD_SPEAKERMODE)
+
numrawspeakers Opt
+
+

Number of speakers for FMOD_SPEAKERMODE_RAW mode.

+ +
+
+

If loading banks made in FMOD Studio, this must be called with speakermode corresponding to the project output format if there is a possibility of the output audio device not matching the project format. Any differences between the project format and speakermode will cause the mix to sound wrong.

+

By default speakermode will assume the setup the OS / output prefers.

+

Altering the samplerate from the OS / output preferred rate may incur extra latency. Altering the speakermode from the OS / output preferred mode may cause an upmix/downmix which can alter the sound.

+

On lower power platforms such as mobile samplerate will default to 24 kHz to reduce CPU cost.

+

This function must be called before System::init, or after System::close.

+

See Also: System::getSoftwareFormat

+

System::setSpeakerPosition

+

Sets the position of the specified speaker for the current speaker mode.

+

This function allows the user to specify the position of their speaker to account for non standard setups.
+It also allows the user to disable speakers from 3D consideration in a game.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setSpeakerPosition(
+  FMOD_SPEAKER speaker,
+  float x,
+  float y,
+  bool active
+);
+
+ +
FMOD_RESULT FMOD_System_SetSpeakerPosition(
+  FMOD_SYSTEM *system,
+  FMOD_SPEAKER speaker,
+  float x,
+  float y,
+  FMOD_BOOL active
+);
+
+ +
RESULT System.setSpeakerPosition(
+  SPEAKER speaker,
+  float x,
+  float y,
+  bool active
+);
+
+ +
System.setSpeakerPosition(
+  speaker,
+  x,
+  y,
+  active
+);
+
+ +
+
speaker
+
Speaker. (FMOD_SPEAKER)
+
x
+
+

2D X position relative to the listener. -1 = left, 0 = middle, +1 = right.

+
    +
  • Range: [-1, 1]
  • +
+
+
y
+
+

2D Y position relative to the listener. -1 = back, 0 = middle, +1 = front.

+
    +
  • Range: [-1, 1]
  • +
+
+
active
+
+

Active state of a speaker. True = included in 3D calculations, False = ignored.

+
    +
  • Units: Boolean
  • +
+
+
+

This allows you to customize the position of the speakers for the current FMOD_SPEAKERMODE by giving X (left to right) and Y (front to back) coordinates.
+When disabling a speaker, 3D spatialization is redistributed around the missing speaker so that signal isn't lost.

+

Stereo setup would look like this:

+
FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_FRONT_LEFT, -1.0f,  0.0f, 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_FRONT_RIGHT, 1.0f,  0.0f, 1);
+
+ +
system->setSpeakerPosition(FMOD_SPEAKER_FRONT_LEFT, -1.0f,  0.0f, true);
+system->setSpeakerPosition(FMOD_SPEAKER_FRONT_RIGHT, 1.0f,  0.0f, true);
+
+ +

7.1 setup would look like this:

+
FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_FRONT_LEFT,     sin(degtorad( -30)), cos(degtorad( -30)), 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_FRONT_RIGHT,    sin(degtorad(  30)), cos(degtorad(  30)), 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_FRONT_CENTER,   sin(degtorad(   0)), cos(degtorad(   0)), 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_LOW_FREQUENCY,  sin(degtorad(   0)), cos(degtorad(   0)), 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_SURROUND_LEFT,  sin(degtorad( -90)), cos(degtorad( -90)), 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_SURROUND_RIGHT, sin(degtorad(  90)), cos(degtorad(  90)), 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_BACK_LEFT,      sin(degtorad(-150)), cos(degtorad(-150)), 1);
+FMOD_System_SetSpeakerPosition(system, FMOD_SPEAKER_BACK_RIGHT,     sin(degtorad( 150)), cos(degtorad( 150)), 1);
+
+ +
system->setSpeakerPosition(FMOD_SPEAKER_FRONT_LEFT,     sin(degtorad( -30)), cos(degtorad( -30)), true);
+system->setSpeakerPosition(FMOD_SPEAKER_FRONT_RIGHT,    sin(degtorad(  30)), cos(degtorad(  30)), true);
+system->setSpeakerPosition(FMOD_SPEAKER_FRONT_CENTER,   sin(degtorad(   0)), cos(degtorad(   0)), true);
+system->setSpeakerPosition(FMOD_SPEAKER_LOW_FREQUENCY,  sin(degtorad(   0)), cos(degtorad(   0)), true);
+system->setSpeakerPosition(FMOD_SPEAKER_SURROUND_LEFT,  sin(degtorad( -90)), cos(degtorad( -90)), true);
+system->setSpeakerPosition(FMOD_SPEAKER_SURROUND_RIGHT, sin(degtorad(  90)), cos(degtorad(  90)), true);
+system->setSpeakerPosition(FMOD_SPEAKER_BACK_LEFT,      sin(degtorad(-150)), cos(degtorad(-150)), true);
+system->setSpeakerPosition(FMOD_SPEAKER_BACK_RIGHT,     sin(degtorad( 150)), cos(degtorad( 150)), true);
+
+ +

Calling System::setSoftwareFormat will override any customization made with this function.

+

Users of the Studio API should be aware this function does not affect the speaker positions used by the spatializer DSPs such as the pan and object panner DSPs. It is purely for Core API spatialization via ChannelControl::set3DAttributes.

+

See Also: System::getSpeakerPosition

+

System::setStreamBufferSize

+

Sets the default file buffer size for newly opened streams.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setStreamBufferSize(
+  unsigned int filebuffersize,
+  FMOD_TIMEUNIT filebuffersizetype
+);
+
+ +
FMOD_RESULT FMOD_System_SetStreamBufferSize(
+  FMOD_SYSTEM *system,
+  unsigned int filebuffersize,
+  FMOD_TIMEUNIT filebuffersizetype
+);
+
+ +
RESULT System.setStreamBufferSize(
+  uint filebuffersize,
+  TIMEUNIT filebuffersizetype
+);
+
+ +
System.setStreamBufferSize(
+  filebuffersize,
+  filebuffersizetype
+);
+
+ +
+
filebuffersize
+
+

Buffer size.

+
    +
  • Default: 16384
  • +
+
+
filebuffersizetype
+
+

Type of units for filebuffersize. (FMOD_TIMEUNIT)

+ +
+
+

Valid units for filebuffersizetype are:

+ +

Larger values will consume more memory, whereas smaller values may cause buffer under-run / starvation / stuttering caused by large delays in disk access (ie netstream), or CPU usage in slow machines, or by trying to play too many streams at once.

+

Does not affect streams created with FMOD_OPENUSER, as the buffer size is specified in System::createSound.

+

Does not affect latency of playback. All streams are pre-buffered (unless opened with FMOD_OPENONLY), so they will always start immediately.

+

Seek and Play operations can sometimes cause a reflush of this buffer.

+

If FMOD_TIMEUNIT_RAWBYTES is used, the memory allocated is two times the size passed in, because fmod allocates a double buffer.

+

If FMOD_TIMEUNIT_MS, FMOD_TIMEUNIT_PCM or FMOD_TIMEUNIT_PCMBYTES is used, and the stream is infinite (such as a shoutcast netstream), or VBR, then FMOD cannot calculate an accurate compression ratio to work with when the file is opened. This means it will then base the buffersize on FMOD_TIMEUNIT_PCMBYTES, or in other words the number of PCM bytes, but this will be incorrect for some compressed formats. Use FMOD_TIMEUNIT_RAWBYTES for these type (infinite / undetermined length) of streams for more accurate read sizes.

+

To determine the actual memory usage of a stream, including sound buffer and other overhead, use Memory_GetStats before and after creating a sound.

+

Stream may still stutter if the codec uses a large amount of cpu time, which impacts the smaller, internal 'decode' buffer. The decode buffer size is changeable via FMOD_CREATESOUNDEXINFO.

+

See Also: System::getStreamBufferSize, Sound::getOpenState

+

System::setUserData

+

Sets a user value associated with a System object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_System_SetUserData(
+  FMOD_SYSTEM *system,
+  void *userdata
+);
+
+ +
RESULT System.setUserData(
+  IntPtr userdata
+);
+
+ +
System.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
User specified data to be stored within the System object.
+
+

This function allows arbitrary user data to be attached to this object, which wll be passed through the userdata parameter in any FMOD_SYSTEM_CALLBACKs. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: System::getUserData, System::setCallback

+

System::unloadPlugin

+

Unloads an FMOD (DSP, Output or Codec) plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::unloadPlugin(
+  unsigned int handle
+);
+
+ +
FMOD_RESULT FMOD_System_UnloadPlugin(
+  FMOD_SYSTEM *system,
+  unsigned int handle
+);
+
+ +
RESULT System.unloadPlugin(
+  uint handle
+);
+
+ +
System.unloadPlugin(
+  handle
+);
+
+ +
+
handle
+
Handle to an already loaded plug-in.
+
+

See Also: System::loadPlugin

+

System::unlockDSP

+

Mutual exclusion function to unlock the DSP engine (which runs asynchronously in another thread) and let it continue executing.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::unlockDSP();
+
+ +
FMOD_RESULT FMOD_System_UnlockDSP(FMOD_SYSTEM *system);
+
+ +
RESULT System.unlockDSP();
+
+ +
System.unlockDSP();
+
+ +

The DSP engine must be locked with System::lockDSP before this function is called.

+

System::update

+

Updates the FMOD system.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT System::update();
+
+ +
FMOD_RESULT FMOD_System_Update(FMOD_SYSTEM *system);
+
+ +
RESULT System.update();
+
+ +
System.update();
+
+ +

Should be called once per 'game' tick, or once per frame in your application to perform actions such as:

+
    +
  • Panning and reverb from 3D attributes changes.
  • +
  • Virtualization of Channels based on their audibility.
  • +
  • Mixing for non-realtime output types. See comment below.
  • +
  • Streaming if using FMOD_INIT_STREAM_FROM_UPDATE.
  • +
  • Mixing if using FMOD_INIT_MIX_FROM_UPDATE
  • +
  • Firing callbacks that are deferred until Update.
  • +
  • DSP cleanup.
  • +
+

If FMOD_OUTPUTTYPE_NOSOUND_NRT or FMOD_OUTPUTTYPE_WAVWRITER_NRT output modes are used, this function also drives the software / DSP engine, instead of it running asynchronously in a thread as is the default behavior.
+This can be used for faster than realtime updates to the decoding or DSP engine which might be useful if the output is the wav writer for example.

+

If FMOD_INIT_STREAM_FROM_UPDATE is used, this function will update the stream engine. Combining this with the non realtime output will mean smoother captured output.

+

See Also: System::init, FMOD_INITFLAGS, FMOD_OUTPUTTYPE, FMOD_MODE

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api.html new file mode 100644 index 0000000..d6d8346 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-api.html @@ -0,0 +1,48 @@ + + +Core API Reference + + + + + diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-guide.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-guide.html new file mode 100644 index 0000000..4143340 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/core-guide.html @@ -0,0 +1,1328 @@ + + +Core API Guide + + + + +
+
+

FMOD Engine User Manual 2.03

+ +
+
+

3. Core API Guide

+

3.1 What is the Core API

+

The Core API is a programmer API that is intended to cover the basics/primitives of sound. This includes concepts such as 'Channels', 'Sounds', 'DSPs', 'ChannelGroups', 'Sound Groups', 'Recording' and concepts for 3D Sound and occlusion.

+

As a programmer, you can implement all these features in code, without needing sound designer tools.

+

3.2 Linking Plug-ins

+

You can extend the functionality of FMOD through the use of plug-ins. Each plug-in type (codec, DSP and output) has its own API you can use. Whether you have developed the plug-in yourself or you are using one from a third party, there are two ways to integrate it into FMOD.

+

3.2.1 Static

+

When the plug-in is available to you as source code, you can hook it up to FMOD by including the source file and using one of the plug-in registration APIs System::registerCodec, System::registerDSP or System::registerOutput. Each of these functions accept the relevant description structure that provides the functionality of the plug-in. By convention plug-in developers will create a function that returns this description structure for you, for example FMOD_AudioGaming_AudioMotors_GetDSPDescription is the name used by one of our parter plug-ins (it follows the form of "FMOD_[CompanyName]_[ProductName]_Get[PluginType]Description"). Alternatively, if you don't have source code, but you do have a static library (such as .lib or .a) it's almost the same process, link the static library with your project, then call the description function passing the value into the registration function.

+

3.2.2 Dynamic

+

Another way plug-in code is distributed is via a prebuilt dynamic library (such as .so, .dll or .dylib), these are even easier to integrate with FMOD than static libraries. First ensure the plug-in file is in the working directory of your application, this is often the same location as the application executable. In your code call System::loadPlugin passing in the name of the library and that's all there is to it. Under the hood FMOD will open the library searching for well known functions similar to the description functions mentioned above, once found the plug-in will be registered ready for use.

+

3.3 API Features

+

This section will give a broad overview of the Core API's features.

+

3.3.1 Initialization - Simple start up with no configuration necessary

+

The Core API has an automatic configuration feature, which makes it simple to start.

+

At the most basic level, all that is needed to configure the Core API is creating the System object and calling System::init on it. A more detailed description of initialization can be found in the Core API Getting Started white paper.

+

The sound card can be manually selected, using the System::setDriver function. More settings can be configured, such as the mixing rate of the FMOD system, the resampling method, or the speaker mode with System::setSoftwareFormat. When modifying the mixer settings, this only adjusts the internal mixing format. At the end, the audio stream is always converted to the settings that are set by the user (ie the settings in the control panel in Windows, or the standard 7.1/48khz output mode on Xbox One or PS4).

+

3.3.2 Audio devices - Automatic detection of device insertion / removal

+

The Core API has automatic sound card detection and recovery during playback. If a new device is inserted after initialization, FMOD will seamlessly jump to it, assuming it is the higher priority device. An example of this would be a USB headset being plugged in.

+

If the device that is being played on is removed (such as a USB audio device), it will automatically jump to the device considered next most important (ie on Windows, it would be the new 'default' device).

+

If a device is inserted, then removed, it will jump to the device it was originally playing on.

+

The programmer can override the sound card detection behavior, with a custom callback. This is the FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED callback.

+

3.3.3 Audio devices - support for plug-ins

+

The Core API has support for user-created output plug-ins. A developer can create a plug-in to take FMOD audio output to a custom target. This could be a hardware device, or a non standard file/memory/network based system.

+

An output mode can run in real-time, or non real-time which allows the developer to run FMOD's mixer/streamer/system at faster or slower than real-time rates.

+

See System::registerOutput documentation for more.

+

Plug-ins can be created inline with the application, or compiled as a stand-alone dynamic library (ie .dll or .so)

+

3.3.4 File formats - Support for over 20 audio formats built in

+

The Core API has native/built in code to support many file formats out of the box. WAV, MP3 and Ogg Vorbis are supported by default, but many more obscure formats like AIFF, FLAC and others. Sequenced formats that are played back in realtime with a real time sequencer, are included. MIDI/MOD/S3M/XM/IT are examples of these.

+

A more comprehensive list can be found in the FMOD_SOUND_TYPE list.

+

3.3.5 File formats - Support for the most optimal format for games (FSB)

+

FMOD also supports an optimal format for games, called FSB (FMOD Sound Bank).

+

Many audio file formats are not well suited to games. They are not efficient, and can lead to lots of random file access, large memory overhead, and slow load times.

+

FSB format benefits are:

+

No-seek loading. FSB loading can be 3 continuous file reads. 1. Main header read. 2. Sub-sound metadata. 3. Raw audio data.

+

'Memory point' feature. An FSB can be loaded into memory by the user, and simply 'pointed to' so that FMOD uses the memory where it is, and does not allocate extra memory. See FMOD_OPENMEMORY_POINT.

+

Low memory overhead. A lot of file formats contain 'fluff' such as tags, and metadata. FSB stores information in compressed, bit packed formats for efficiency.

+

Multiple sounds in 1 file. Thousands of sounds can be stored inside 1 file, and selected by the API function Sound::getSubSound.

+

Efficient Ogg Vorbis. FSB strips out the 'Ogg' and keeps the 'Vorbis'. 1 codebook can be shared between all sounds, saving megabytes of memory (compared to loading .ogg files individually).

+

FADPCM codec support. FMOD supports a very efficient, ADPCM variant called FADPCM which is many times faster than a standard ADPCM decoder (no branching), and is therefore very efficient on mobile devices. The quality is also far superior than most ADPCM variants, and lacks the 'hiss' notable in those formats.

+

3.3.6 File formats - Support for plug-ins

+

The Core API has support for user created file format plug-ins. A developer can create callbacks for FMOD to call when System::createSound or System::createStream is executed by the user, or when the decoding engine is asking for data.

+

Plug-ins can be created inline with the application, or compiled as a stand-alone dynamic library (ie .dll or .so)

+

See the System::registerCodec documentation for more.

+

3.3.7 Just play a simple sound - createSound and playSound

+

The simplest way to get started, and to learn the most basic functionality of the Core API, is to initialize the FMOD system, load an audio file, and play it. That's it!

+

For more information on how to initialize the FMOD Engine and play audio with the Core API, see to the Getting Started white paper.

+

Look at the play_sound example to refer to sample code for the simple playback of an audio file.

+

3.3.8 High quality / efficient streaming and compressed samples

+

The Core API benefits from over 15 years of use, in millions of end user devices, causing the evolution of a highly stable and low latency mixing/streaming engine.

+

3.3.9 Streaming

+

Streaming is the ability to take a large audio asset, and read/play it in real time in small chunks at a time, avoiding the need to load the entire asset into memory.

+

Whether an asset should be streamed is a question of resource availability and allocation. Each currently-playing streaming asset requires constant file I/O (which is to say, access to the disk) and a very small amount of memory for the stream's ring buffer; whereas assets using other loading modes require much more memory but only require file I/O when they’re first loaded, and only require these resources once, no matter how many instances of the asset are playing.

+

File I/O is a very limited resource on many platforms, and is needed for many things other than audio. Fortunately, most games load much of their content into memory up-front at the start of new levels and areas, and many users do not run applications that constantly access the disk in the background. This means that there are usually periods when the player’s device is not otherwise loading content from disk, meaning that streaming assets that play in those periods can enjoy uncontested and uninterrupted file I/O. By contrast, a streaming asset that plays while the disk is being accessed regularly by anything else may not be able to access to disk frequently enough to refresh its ring buffer, and so may suffer from buffer starvation. Buffer starvation of a streaming asset manifests as the sound stuttering or stopping entirely.

+

The streaming loading mode is therefore best used for assets that meet the following conditions:

+
    +
  • The asset would take up an inconveniently large amount of memory if fully loaded.
  • +
  • Few instances of the asset ever need to be playing at the same time.
  • +
  • Few or no other streaming assets ever need to be playing at the same time as the asset.
  • +
  • The asset only plays at times when the game does not need to read or write much to the drive on which the asset or its bank file is stored.
  • +
+

Accordingly, streaming is typically reserved for:

+
    +
  • Music
  • +
  • Voice overs and dialogue
  • +
  • Long ambiance tracks
  • +
+

To play a Sound as a stream, add the FMOD_CREATESTREAM flag to the System::createSound function, or use the System::createStream function. These options both equate to the same end behavior.

+

3.3.10 Internet streaming

+

FMOD streaming supports internet addresses. Supplying http or https in the filename will switch FMOD to streaming using native http, shoutcast or icecast.

+

Playlist files (such as ASX/PLS/M3U/WAX formats) are supported, including redirection.

+

Proxy specification and authentication are supported, as well as real-time shoutcast stream switching, metadata retrieval and packet loss notification.

+

3.3.11 Streaming settings

+

Streaming behavior can be adjusted in several ways. As streaming a file takes 2 threads, one for file reading, and one for codec decoding/decompression. File buffer sizes can be adjusted with System::setStreamBufferSize and codec decoding buffer size can be adjusted with FMOD_CREATESOUNDEXINFO decodeBufferSize member, or FMOD_ADVANCEDSETTINGS::defaultDecodeBufferSize.

+

3.3.12 Compressed sample playback

+

For shorter sounds, rather than decompressing the audio file into memory, the user may wish to play the audio file in memory, as is.

+

This is more efficient than a stream, as it does not require disk access, or extra threads to read or decode. A stream has a limit of 1 Sound at a time, but a compressed sample does not. It can be played multiple times simultaneously.

+

If a platform supports a hardware format like AT9 on PS4, or XMA on Xbox One, then it is the best solution to use these codecs, as the decoding of the data is handled by separate media chips, taking the majority of the processing off the CPU.

+

Refer to the Getting Started white paper on how to use the FMOD_CREATECOMPRESSEDSAMPLE flag and configuration of codec memory.

+

See the relevant Platform Details section for details on platform specific audio formats.

+

3.3.13 Decompressed samples

+

Loading a Sound with System::createSound will by default, cause audio data to be decompressed into memory, and played back as PCM format.

+

PCM data is just raw uncompressed audio data, for more information see Sample Data.

+

Decompressed / uncompressed samples uses little to no CPU time to process. PCM data is the same format that the FMOD mixing engine uses, and the audio device itself. This may be desirable, if you have enough memory, on a mobile device with limited CPU cycles.

+

Decompressed PCM data uses a lot more memory than Vorbis encoded FSB for example. It could be up to 10x more.

+

A typical use case for mobile developers: Compress the audio data heavily for distribution (to reduce the download size), then decompress it at start-up/load time, to save CPU time, rather than playing it compressed.

+

3.3.14 Voices / Channels - 'Virtual Voices' - play thousands of sounds at once

+

The Core API includes a 'virtual voice system.' This system allows you to play hundreds or even thousands of Channels at once, but to only have a small number of them actually producing sound and consuming resources. The others are 'virtual,' emulated with a simple position and audibility update, and so are not heard and don't consume CPU time. For example: A dungeon may have 200 torches burning on the walls in various places, but at any given time only the loudest of these torches are really audible.

+

FMOD dynamically makes Channels 'virtual' or 'real' depending on real time audibility calculations (based on distance/volume/priority/occlusion). A Channel which is playing far away or with a low volume becomes virtual, and may change back into a real Channel when it comes closer or louder due to Channel or ChannelGroup API calls.

+

For more information about the virtual voice system, see the Virtual Voice white paper.

+

3.3.15 Channels / Grouping - 'Channel Groups' and hierarchical sub-mixing (buses)

+

While it is possible to add the same effect to multiple channels, creating a submix of those channels and adding the effect to that submix requires only a single instance of the effect, and thus consumes fewer resources. This reduces CPU usage greatly.

+

The primary tool for achieving this in FMOD Studio and the Studio API is the "bus"; in the Core API, it is the "channel group." If multiple channels are routed into the same bus or channel group, the it creates a sub-mix of those signals. If an effect is added to that bus or ChannelGroup, the effect only processes that sub-mix, rather than processing every individual Channel that contributed to it.

+

The volume of a ChannelGroup can be altered, which allows for master volume groups. The volume is scaled based on a fader DSP inside a ChannelGroup. All Channels and ChannelGroups have a fader DSP by default.

+

ChannelGroups are hierarchical. ChannelGroups can contain ChannelGroups, which can contain other ChannelGroups and Channels.

+

Many attributes can be applied to a ChannelGroup, including things like speaker mix, and 3D position. A whole group of Channels, and the ChannelGroups below them, can be positioned in 3D with 1 call, rather than trying to position all of them individually.

+

'Master Volume', 'SFX Volume' and 'Music Volume' are typical settings in a game. Setting up an 'SFX' ChannelGroup, and a 'Music' ChannelGroup, and having them children of the master ChannelGroup (see System::getMasterChannelGroup)

+

3.3.16 3D sound and spatialization

+

The Core API has a variety of features that allow Sounds to be placed in 3D space, so that they move around the listener as part of an environment. These features include panning, pitch shifting with doppler, attenuating with volume scaling, and special filtering.

+

FMOD 3D spatialization features:

+
    +
  1. Multiple attenuation roll-off models. Roll-off is the behavior of the volume of the Sound as it gets closer to the listener or further away. Choose between linear, inverse, linear square, inverse tapered and custom roll-off modes. Custom roll-off allows a FMOD_3D_ROLLOFF_CALLBACK to be set to allow the user to calculate how the volume roll-off happens. If a callback is not convenient, FMOD also allows an array of points that are linearly interpolated between, to denote a 'curve', using ChannelControl::set3DCustomRolloff.
  2. +
  3. Doppler pitch shifting. Accurate pitch shifting, controlled by the user velocity setting of the listener and the Channel or ChannelGroup, is calculated and set on the fly by the FMOD 3D spatialization system.
  4. +
  5. Vector Based Amplitude Panning (VBAP). This system pans the Sound in the user's speakers in real time, supporting mono, stereo, up to 5.1 and 7.1 surround speaker setups.
  6. +
  7. Occlusion. A Sound's underlying Channels or ChannelGroups can have lowpass filtering applied to them to simulate sound going through walls or being muffled by large objects.
  8. +
  9. 3D Reverb Zones for reverb panning. See more about this in the 3D Reverb section. Reverb can also be occluded to not go through walls or objects.
  10. +
  11. Polygon based geometry occlusion. Add polygon data to FMOD's geometry engine, and FMOD will automatically occlude sound in realtime using raycasting. See more about this in the 3D Polygon based geometry occlusion section.
  12. +
  13. Multiple listeners. In a split screen mode game, FMOD can support a listener for each player, so that 3D Sound attenuate correctly.
  14. +
  15. Morphing between 2D and 3D with multi-channel audio formats. Sounds can be a point source, or be morphed by the user into 2D audio, which is great for distance based envelopment. The closer a Sound is, the more it can spread into the other speakers, rather than flipping from one side to the other as it pans from one side to the other. See ChannelControl::set3DLevel for the function that lets the user change this mix.
  16. +
  17. Stereo and multi-channel audio formats can be used for 3D audio. Typically a mono audio format is used for 3D audio. Multi-channel audio formats can be used to give extra impact. By default multi-channel sample data is collapsed into a mono point source. To 'spread' the multiple channels use ChannelControl::set3DSpread. This can give a more spatial effect for a sound that is coming from a certain direction. A subtle spread of sound in the distance may give the impression of being more effectively spatialized as if it were reflecting off nearby surfaces, or being 'big' and emitting different parts of the sound in different directions.
  18. +
  19. Spatialization plug-in support. 3rd party VR audio plug-ins can be used to give more realistic panning over headphones.
  20. +
+

To load a Sound as 3D simply add the FMOD_3D flag to the System::createSound function, or the System::createStream function.

+

The next 3 important things to do are:

+
    +
  1. Set the 'listener' position, orientation and velocity once per frame with System::set3DListenerAttributes.
  2. +
  3. Set the Channel 3D attributes for handle that was returned from System::playSound, with ChannelControl::set3DAttributes. If 3D positioning of a group of Channels, or a ChannelGroup is required, set the ChannelGroup to be 3D once with ChannelControl::setMode, then call ChannelControl::set3DAttributes instead.
  4. +
  5. Call System::update once per frame so the 3D calculations can update based on the positions and other attributes.
  6. +
+

Read more about 3D sound in the 3D Sound white paper or the Spatial Audio white paper.

+

3.3.17 3D polygon-based geometry occlusion

+

The Core API supports the supply of polygon mesh data that can be processed in real time to create the effect of occlusion in a 3D world. In real world terms, you can stop sounds from traveling through walls, or even confine reverb inside a geometric volume so that it doesn't leak out into other areas.

+

To use the FMOD Geometry Engine, create a mesh object with System::createGeometry. Then add polygons to each mesh with Geometry::addPolygon. Each object can be translated, rotated and scaled to fit your environment.

+

3.3.18 Recording - Record to a sound from microphone or line in

+

The Core API has the ability to record directly from an input into a Sound object. This Sound can then be played back after it has been recorded, or the raw data can be retrieved with Sound::lock and Sound::unlock functions.

+

The Sound can also be played while it is recording, to allow realtime effects. A simple technique to achieve this is to start recording, then wait a small amount of time (for example, 50 ms), then play the Sound. This keeps the play cursor just behind the record cursor. For information on how to do this and an example of source code, see the "record" example in the /core/examples/bin folder of the FMOD Engine distribution.

+

3.3.19 DSP Effects - Support for over 30 special effects built in

+

The Core API has native/built in code to support many special effects out of the box, such as low-pass, compressor, reverb and multiband EQ. A more comprehensive list can be found in the FMOD_DSP_TYPE list.

+

An effect can be created with System::createDSPByType and added to a Channel or ChannelGroup with ChannelControl::addDSP.

+

3.3.20 DSP Effects - Reverb types and 3D reverb zones

+

The Core API has two types of reverb available, and a virtual 3D reverb system which can be used to simulate hundreds of environments or more, with only 1 reverb.

+

Standard Reverb

+

A built-in high quality I3DL2 standard compliant reverb, which is used for a fast, configurable environment simulation, and is used for the 3D reverb zone system, described below.

+

To set an environment simply, use System::setReverbProperties. This lets you set a global environment, or up to 4 different environments, which all Channels are affected by.

+

Each Channel can have a different reverb wet mix by setting the level in ChannelControl::setReverbProperties.

+

Read more about the I3DL2 configuration in the Reverb Notes section of the documentation. To avoid confusion when starting out, simply play with the pre-set list of environments in FMOD_REVERB_PRESETS.

+

Convolution Reverb

+

There is also an even higher quality Convolution Reverb which allows a user to import an impulse response file (a recording of an impulse in an environment which is used to convolve the signal playing at the time), and have the environment sound like it is in the space the impulse was recorded in.

+

This is an expensive-to-process effect, so FMOD supports GPU acceleration to offload the processing to the graphics card. This greatly reduces the overhead of the effect, making it almost negligible. GPU acceleration is supported on Xbox One and PS4 platforms. Also hardware acceleration is supported on the PS5 and Xbox Scarlett platforms.

+

Convolution reverb can be created with System::createDSPByType with FMOD_DSP_TYPE_CONVOLUTIONREVERB and added to a ChannelGroup with ChannelControl::addDSP. It is recommended to only implement one or a limited number of these effects and place them on a sub-mix/group bus (a ChannelGroup), and not per Channel.

+

Virtual 3D Reverb System

+

A Virtual 3D reverb zone system is supported, using the main built-in system I3DL2 reverb.

+

Virtual '3D reverb spheres' can be created and placed around a 3D world, in unlimited numbers, causing no extra CPU expense.

+

As the listener travels through these spheres, FMOD will automatically morph and attenuate the levels of the system reverb to make it sound like you are in different environments as you move around the world.

+

Spheres can be overlapped and based on where the listener is within each sphere. FMOD will morph the reverb to the appropriate mix of environments.

+

3D Reverb

+

A 3D reverb sphere can be created with System::createReverb3D and the position set with Reverb3D::set3DAttributes. To set a sphere's reverb properties, Reverb3D::setProperties can be used.

+

For more information on the 3D reverb zone system, and implementation information, read the 3D Reverb white paper.

+

3.3.21 DSP Effects - Support for plug-ins

+

The Core API has support for user-created DSP plug-ins. A developer can either load a pre-existing plug-in, or create one inside the application, using 'callbacks'.

+

Callbacks can be specified by the user, for example when System::createDSP is called, or when the DSP runs and wants to process PCM data inside FMOD's mixer.

+

Plug-ins can be developed inline with the application, or compiled as a stand-alone dynamic library (ie .dll or .so)

+

To load a pre-existing plug-in executable, use the System::loadPlugin function.

+

To implement callbacks directly in a program, System::registerDSP can be used.

+

To create a stand alone dynamic library, use the same callbacks, but export the symbols through a the FMOD_DSP_DESCRIPTION struct, via the exported FMODGetDSPDescription function.

+

See the DSP Plug-in API white paper on how to make a plug-in, and /examples/fmod_gain.cpp in the FMOD Engine distribution as a working example.

+

3.3.22 DSP Engine - Flexible, programmable soft-synth architecture

+

The Core API runs on a modular synth architecture, which allows connections of signal processing nodes (the 'FMOD DSP' concept).

+

A directed graph processing tree allows the signal to flow from 'generators' at the tail node (a Sound playing through from System::playSound, or a DSP creating sound from System::playDSP for example), to other nodes, mixing together until they reach the head node, where the final result is sent to the sound card.

+

DSP Graph example

+

A visual representation taken directly from the FMOD Profiler.

+

FMOD typically processes the Sound in the graph, in blocks of 512 samples (10ms) on some platforms, or 1024 on other platforms (21ms). This is the granularity of the system, and affects how smooth parameter changes, such as pitch or volume will heard.

+

FMOD pre-built DSP effects can be inserted into the graph with functions like DSP::addInput and DSP::disconnectFrom.

+

For detailed information read the DSP Architecture and Usage white paper.

+

3.3.23 Non blocking loads, threads and thread safety

+

Core API commands are thread safe and queued. They get processed either immediately, or in background threads, depending on the command.

+

By default, things like initialization and loading a Sound are processed on the main thread.

+

Mixing, streaming, geometry processing, file reading and file loading are or can be done in the background, in background threads. Every effort is made to avoid blocking the main application's loop unexpectedly.

+

One of the slowest operations is loading a Sound. To place a Sound load into the background so that it doesn't affect processing in the main application thread, the user can use the FMOD_NONBLOCKING flag in System::createSound or System::createStream.

+

Thread affinity is configurable on some platforms.

+

For detailed information about FMOD and threads please refer to the Threads and Thread Safety white paper.

+

3.3.24 Performance

+

The Core API has evolved over the years to have a comprehensive suite of effects and codecs with minimal overhead for memory and CPU.

+

All platforms come with performance saving features. For example vector optimized floating point math is used heavily. Some of the technologies used include SSE, NEON, AVX, VMX, and VFP assembler.

+

Typically the most expensive part of Sound playback is real-time compressed sample playback.

+

The Core API allows you to configure how many Channels should be audible at once to reduce CPU overhead. As mentioned in the Compressed sample playback section of this document, this is configurable using the System::setAdvancedSettings function.

+

Adjusting the sample rate quality, resampling quality, number of mixed Channels and decoded Channels is configurable to get the best scalability for your application.

+

To find out more about configuring FMOD to save CPU time, refer to the CPU Performance white paper, or to get an idea about Core performance figures on various platforms, refer to the Performance Reference section of the documentation.

+

3.4 Configuration - memory and file systems

+

The Core API caters to the needs of applications and their memory and file systems. A file system can be 'plugged in' so that FMOD uses it, and not its own system, as well as memory allocation.

+

To set up a custom file system is a simple process of calling System::setFileSystem.

+

The file system handles the normal cases of open, read, seek, close, but adds an extra feature which is useful for prioritized/delayed file systems, FMOD supports the FMOD_FILE_ASYNCREAD_CALLBACK callback, for deferred, prioritized loading and reading, which is a common feature in advanced game streaming engines.

+

An async read callback can immediately return without supplying data, then when the application supplies data at a later time, even in a different thread, it can set the 'done' flag in the FMOD_ASYNCREADINFO structure to get FMOD to consume it. Consideration has to be made to not wait too long or increase stream buffer sizes, so that streams don't audibly stutter/skip.

+

To set up a custom memory allocator is done by calling Memory_Initialize. This is not an FMOD class member function because it needs to be called before any FMOD objects are created, including the System object.

+

To read more about setting up memory pools or memory environments, refer to the Memory Management white paper.

+

3.5 Controlling a Spatializer DSP

+

Controlling a spatializer DSP using the Core API requires setting the data parameter associated with 3D attributes, this will be a data parameter of type: FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES or FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI. The Studio::System sets this parameter automatically if an Studio::EventInstance position changes, however if using the core System you must set this DSP parameter explicitly.

+

This will work with our pan DSP, the object panner DSP, the resonance source / soundfield spatializers and any other third party plug-ins that make use of the FMOD spatializers.

+

Attributes must use a coordinate system with the positive Y axis being up and the positive X axis being right (left-handed coordinate system). FMOD will convert passed in coordinates from right-handed to left-handed for the plug-in if the System was initialized with the FMOD_INIT_3D_RIGHTHANDED flag.

+

The absolute data for the FMOD_DSP_PARAMETER_3DATTRIBUTES is straight forward, however the relative part requires some work to calculate.

+
/*
+    This code supposes the availability of a maths library with basic support for 3D and 4D vectors and 4x4 matrices:
+
+    // 3D vector
+    class Vec3f
+    {
+    public:
+        float x, y, z;
+
+        // Initialize x, y & z from the corresponding elements of FMOD_VECTOR
+        Vec3f(const FMOD_VECTOR &v);
+    };
+
+    // 4D vector
+    class Vec4f
+    {
+    public:
+        float x, y, z, w;
+
+        Vec4f(const Vec3f &v, float w);
+
+        // Initialize x, y & z from the corresponding elements of FMOD_VECTOR
+        Vec4f(const FMOD_VECTOR &v, float w);
+
+        // Copy x, y & z to the corresponding elements of FMOD_VECTOR
+        void toFMOD(FMOD_VECTOR &v);
+    };
+
+    // 4x4 matrix
+    class Matrix44f
+    {
+    public:
+        Vec4f X, Y, Z, W;
+    };
+
+    // 3D Vector cross product
+    Vec3f crossProduct(const Vec3f &a, const Vec3f &b);
+
+    // 4D Vector addition
+    Vec4f operator+(const Vec4f &a, const Vec4f &b);
+
+    // 4D Vector subtraction
+    Vec4f operator-(const Vec4f& a, const Vec4f& b);
+
+    // Matrix multiplication m * v
+    Vec4f operator*(const Matrix44f &m, const Vec4f &v);
+
+    // 4x4 Matrix inverse
+    Matrix44f inverse(const Matrix44f &m);
+*/
+
+void calculatePannerAttributes(const FMOD_3D_ATTRIBUTES &listenerAttributes, const FMOD_3D_ATTRIBUTES &emitterAttributes, FMOD_DSP_PARAMETER_3DATTRIBUTES &pannerAttributes)
+{
+    // pannerAttributes.relative is the emitter position and orientation transformed into the listener's space:
+
+    // First we need the 3D transformation for the listener.
+    Vec3f right = crossProduct(listenerAttributes.up, listenerAttributes.forward);
+
+    Matrix44f listenerTransform;
+    listenerTransform.X = Vec4f(right, 0.0f);
+    listenerTransform.Y = Vec4f(listenerAttributes.up, 0.0f);
+    listenerTransform.Z = Vec4f(listenerAttributes.forward, 0.0f);
+    listenerTransform.W = Vec4f(listenerAttributes.position, 1.0f);
+
+    // Now we use the inverse of the listener's 3D transformation to transform the emitter attributes into the listener's space:
+    Matrix44f invListenerTransform = inverse(listenerTransform);
+
+    Vec4f position = invListenerTransform * Vec4f(emitterAttributes.position, 1.0f);
+
+    // Setting the w component of the 4D vector to zero means the matrix multiplication will only rotate the vector.
+    Vec4f forward = invListenerTransform * Vec4f(emitterAttributes.forward, 0.0f);
+    Vec4f up = invListenerTransform * Vec4f(emitterAttributes.up, 0.0f);
+    Vec4f velocity = invListenerTransform * (Vec4f(emitterAttributes.velocity, 0.0f) - Vec4f(listenerAttributes.velocity, 0.0f));
+
+    // We are now done computing the relative attributes.
+    position.toFMOD(pannerAttributes.relative.position);
+    forward.toFMOD(pannerAttributes.relative.forward);
+    up.toFMOD(pannerAttributes.relative.up);
+    velocity.toFMOD(pannerAttributes.relative.velocity);
+
+    // pannerAttributes.absolute is simply the emitter position and orientation:
+    pannerAttributes.absolute = emitterAttributes;
+}
+
+ +

When using FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI, you will need to call calculatePannerAttributes for each listener filling in the appropriate listener attributes.

+

Set this on the DSP by using DSP::setParameterData with the index of the FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES, you will need to check with the author of the DSP for the structure index. Pass the data into the DSP using DSP::setParameterData with the index of the 3D Attributes, FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES or FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI.

+

3.6 Upmix/Downmix Behavior

+

FMOD handles downmixing using mix matrices. Below you can find the various mix matrix layouts, with each table representing a separate output format. In each table, speakers in the "Output" column are assigned levels from the incoming speaker formulas in the relevant row, according to the incoming speaker layout. Different mix matrix layouts can be set using ChannelControl::setMixMatrix. See FMOD_SPEAKER and FMOD_SPEAKERMODE for more details on existing speaker layouts.
+For an improved result when using 5.1 on a stereo output device,the Dolby Pro Logic II downmix algorithm can be chosen by specifying FMOD_INIT_PREFER_DOLBY_DOWNMIX as an init flag when calling System::init.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
MMono
LLeft
RRight
FLFront Left
FRFront Right
CCenter
LFELow Frequency Effects
SLSurround Left
SRSurround Right
BLBack Left
BRBack Right
TFLTop Front Left
TFRTop Front Right
TBLTop Back Left
TBRTop Back Right
+

3.6.1 FMOD_SPEAKERMODE_MONO

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
OutputMonoStereoQuad5.05.17.17.1.4
MML x 0.707 + R x 0.707FL x 0.500 + FR x 0.500 + SL x 0.500 + SR x 0.500FL x 0.447 + FR x 0.447 + C x 0.447 + BL x 0.447 + BR x 0.447FL x 0.447 + FR x 0.447 + C x 0.447 + BL x 0.447 + BR x 0.447FL x 0.378 + FR x 0.378 + C x 0.378 + SL x 0.378 + SR x 0.378 + BL x 0.378 + BR x 0.378FL x 0.378 + FR x 0.378 + C x 0.378 + SL x 0.378 + SR x 0.378 + BL x 0.378 + BR x 0.378
+
+

3.6.2 FMOD_SPEAKERMODE_STEREO

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OutputMonoStereoQuad5.05.17.17.1.4
LM x 0.707LFL + SL x 0.707FL + C x 0.707 + BL x 0.707FL + C x 0.707 + BL x 0.707FL + C x 0.707 + SL x 0.707 + BL x 0.596FL + C x 0.707 + SL x 0.707 + BL x 0.596
RM x 0.707RFR + SR x 0.707FR + C x 0.707 + BR x 0.707FR + C x 0.707 + BR x 0.707FR + C x 0.707 + SR x 0.707 + BR x 0.596FR + C x 0.707 + SR x 0.707 + BR x 0.596
+
+

3.6.3 FMOD_SPEAKERMODE_QUAD

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OutputMonoStereoQuad5.05.17.17.1.4
FLM x 0.707LFLFL + C x 0.707FL + C x 0.707FL x 0.965 + FR x 0.258 + C x 0.707 + SL x 0.707FL x 0.965 + FR x 0.258 + C x 0.707 + SL x 0.707
FRM x 0.707RFRFR + C x 0.707FR + C x 0.707FL x 0.258 + FR x 0.965 + C x 0.707 + SR x 0.707FL x 0.258 + FR x 0.965 + C x 0.707 + SR x 0.707
SLSLBLBLSL x 0.707 + BL x 0.965 + BR x 0.258SL x 0.707 + BL x 0.965 + BR x 0.258
SRSRBRBRSR x 0.707 + BL x 0.258 + BR x 0.965SR x 0.707 + BL x 0.258 + BR x 0.965
+
+

3.6.4 FMOD_SPEAKERMODE_SURROUND

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OutputMonoStereoQuad5.05.17.17.1.4
FLM x 0.707LFL x 0.961FLFLFL + SL x 0.367FL + SL x 0.367
FRM x 0.707RFR x 0.961FRFRFR + SR x 0.367FR + SR x 0.367
CCCCC
BLFL x 0.274 + SL x 0.960 + SR x 0.422BLBLSL x 0.930 + BL x 0.700 + BR x 0.460SL x 0.930 + BL x 0.700 + BR x 0.460
BRFR x 0.274 + SL x 0.422 + SR x 0.960BRBRSR x 0.930 + BL x 0.460 + BR x 0.700SR x 0.930 + BL x 0.460 + BR x 0.700
+
+

3.6.5 FMOD_SPEAKERMODE_5POINT1

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OutputMonoStereoQuad5.05.17.17.1.4
FLM x 0.707LFL x 0.961FLFLFL + SL x 0.367FL + SL x 0.367
FRM x 0.707RFR x 0.961FRFRFR + SR x 0.367FR + SR x 0.367
CCCCC
LFELFELFELFE
BLFL x 0.274 + SL x 0.960 + SR x 0.422BLBLSL x 0.930 + BL x 0.700 + BR x 0.460SL x 0.930 + BL x 0.700 + BR x 0.460
BRFR x 0.274 + SL x 0.422 + SR x 0.960BRBRSR x 0.930 + BL x 0.460 + BR x 0.700SR x 0.930 + BL x 0.460 + BR x 0.700
+
+

3.6.6 FMOD_SPEAKERMODE_7POINT1

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OutputMonoStereoQuad5.05.17.17.1.4
FLM x 0.707LFL x 0.939FLFLFLFL
FRM x 0.707RFR x 0.939FRFRFRFR
CCCCC
LFELFELFELFE
SLFL x 0.344 + SL x 0.344BL x 0.883BL x 0.883SLSL
SRFR x 0.344 + SR x 0.344BR x 0.883BR x 0.883SRSR
BLSL x 0.939BL x 0.470BL x 0.470BLBL
BRSR x 0.939BR x 0.470BR x 0.470BRBR
+
+

3.6.7 FMOD_SPEAKERMODE_7POINT1POINT4

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OutputMonoStereoQuad5.05.17.17.1.4
FLM x 0.707LFL x 0.939FLFLFLFL
FRM x 0.707RFR x 0.939FRFRFRFR
CCCCC
LFELFELFELFE
SLFL x 0.344 + SL x 0.344BL x 0.883BL x 0.883SLSL
SRFR x 0.344 + SR x 0.344BR x 0.883BR x 0.883SRSR
BLSL x 0.939BL x 0.470BL x 0.470BLBL
BRSR x 0.939BR x 0.470BR x 0.470BRBR
TFLTFL
TFRTFR
TBLTBL
TBRTBR
+
+

3.7 Advanced Sound Creation

+

FMOD has a number of FMOD_MODE modes for Sound creation that require the use of FMOD_CREATESOUNDEXINFO to specify various properties of the sound, such as the data format, frequency, length, callbacks, and so on. The following details how to use these modes, and provides basic examples of creating a sound using each mode.

+

3.7.1 Creating a Sound from memory

+

FMOD_OPENMEMORY

+

FMOD_OPENMEMORY causes FMOD to interpret the first argument of System::createSound or System::createStream as a pointer to memory instead of a filename. FMOD_CREATESOUNDEXINFO::length is used to specify the length of the sound, specifically the amount of memory in bytes the sound's data occupies. This data is copied into FMOD's buffers and can be freed after the sound is created. If using FMOD_CREATESTREAM, the data is instead streamed from the buffer pointed to by the pointer you passed in, so you should ensure that the memory isn't freed until you have finished with and released the stream.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD::Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+void *buffer = 0;
+int length = 0;
+
+//
+// Load your audio data to the "buffer" pointer here
+//
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);     // Size of the struct.
+exinfo.length = length;                             // Length of sound - PCM data in bytes
+
+system->createSound((const char *)buffer, FMOD_OPENMEMORY, &exinfo, &sound);
+// The audio data pointed to by "buffer" has been duplicated into FMOD's buffers, and can now be freed
+// However, if loading as a stream with FMOD_CREATESTREAM or System::createStream, the memory must stay active, so do not free it!
+
+ +
FMOD_Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+void *buffer = 0;
+int length = 0;
+
+//
+// Load your audio data to the "buffer" pointer here
+//
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);     // Size of the struct.
+exinfo.length = length;                             // Length of sound - PCM data in bytes
+
+FMOD_System_CreateSound(system, (const char *)buffer, FMOD_OPENMEMORY, &exinfo, &sound);
+// The audio data pointed to by "buffer" has been duplicated into FMOD's buffers, and can now be freed
+// However, if loading as a stream with FMOD_CREATESTREAM or System::createStream, the memory must stay active, so do not free it!
+
+ +
FMOD.Sound sound;
+FMOD.CREATESOUNDEXINFO exinfo;
+byte[] buffer;
+
+//
+// Load your audio data to the "buffer" array here
+//
+
+// Create extended sound info struct
+exinfo = new FMOD.CREATESOUNDEXINFO();
+exinfo.cbsize = Marshal.SizeOf(typeof(FMOD.CREATESOUNDEXINFO));
+exinfo.length = (uint)bytes.Length;
+
+system.createSound(buffer, FMOD.MODE.OPENMEMORY, ref exinfo, out sound);
+// The audio data stored by the "buffer" array has been duplicated into FMOD's buffers, and can now be freed
+// However, if loading as a stream with FMOD_CREATESTREAM or System::createStream, you must pin "buffer" with GCHandle so that it stays active
+
+ +
var sound = {};
+var outval = {};
+var buffer;
+
+//
+// Load your audio data to a Uint8Array and assign it to "buffer" var here 
+//
+
+// Create extended sound info struct
+// No need to define cbsize, the struct already knows its own size in JS
+var exinfo = FMOD.CREATESOUNDEXINFO();
+exinfo.length = buffer.length;            // Length of sound - PCM data in bytes
+
+system.createSound(buffer.buffer, FMOD.OPENMEMORY, exinfo, outval);
+sound = outval.val;
+// The audio data stored in the "buffer" var has been duplicated into FMOD's buffers, and can now be freed
+// However, if loading as a stream with FMOD_CREATESTREAM or System::createStream, the memory must stay active, so do not free it!
+
+ +

FMOD_OPENMEMORY_POINT

+

FMOD_OPENMEMORY_POINT also causes FMOD to interpret the first argument of System::createSound or System::createStream as a pointer to memory instead of a filename. However, unlike FMOD_OPENMEMORY, FMOD will use the memory as is instead of copying it to its own buffers. As a result, you may only free the memory after Sound::release is called. FMOD_CREATESOUNDEXINFO::length is used to specify the length of the sound, specifically the amount of memory in bytes the sound's data occupies.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD::Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+void *buffer = 0;
+int length = 0;
+
+//
+// Load your audio data to the "buffer" pointer here
+//
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);     // Size of the struct
+exinfo.length = length;                             // Length of sound - PCM data in bytes
+
+system->createSound((const char *)buffer, FMOD_OPENMEMORY_POINT, &exinfo, &sound);
+// As FMOD is using the data stored at the buffer pointer as is, without copying it into its own buffers, the memory cannot be freed until after Sound::release is called
+
+ +
FMOD_Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+void *buffer = 0;
+int length = 0;
+
+//
+// Load your audio data to the "buffer" pointer here
+//
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);     // Size of the struct
+exinfo.length = length;                             // Length of sound - PCM data in bytes
+
+FMOD_System_CreateSound(system, (const char *)buffer, FMOD_OPENMEMORY_POINT, &exinfo, &sound);
+// As FMOD is using the data stored at the buffer pointer as is, without copying it into its own buffers, the memory cannot be freed until after Sound::release is called
+
+ +
FMOD.Sound sound
+FMOD.CREATESOUNDEXINFO exinfo;
+byte[] buffer;
+GCHandle gch;
+
+//
+// Load your audio data to the "buffer" array here
+//
+
+// Pin data in memory so a pointer to it can be passed to FMOD's unmanaged code
+gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
+
+// Create extended sound info struct
+exinfo = new FMOD.CREATESOUNDEXINFO();
+exinfo.cbsize = Marshal.SizeOf(typeof(FMOD.CREATESOUNDEXINFO)); // Size of the struct
+exinfo.length = (uint)bytes.Length;                             // Length of sound - PCM data in bytes
+
+system.createSound(gch.AddrOfPinnedObject(), FMOD.MODE.OPENMEMORY_POINT, ref exinfo, out sound);
+// As FMOD is using the data stored at the buffer pointer as is, without copying it into its own buffers, the memory must stay active and pinned
+// Unpin memory with gch.Free() after Sound::release has been called
+
+ +
+

Not supported for JavaScript.

+
+

3.7.2 Creating a Sound from PCM data

+

FMOD_OPENRAW

+

FMOD_OPENRAW causes FMOD to ignore the format of the provided audio file, and instead treat it as raw PCM data. Use FMOD_CREATESOUNDEXINFO to specify the frequency, number of channels, and data format of the file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD::Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize           = sizeof(FMOD_CREATESOUNDEXINFO);   // Size of the struct
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Playback rate of sound
+exinfo.format           = FMOD_SOUND_FORMAT_PCM16;          // Data format of sound
+
+system->createSound("./Your/File/Path/Here.raw", FMOD_OPENRAW, &exinfo, &sound);
+
+ +
FMOD_Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize           = sizeof(FMOD_CREATESOUNDEXINFO);   // Size of the struct
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Default playback rate of sound
+exinfo.format           = FMOD_SOUND_FORMAT_PCM16;          // Data format of sound
+
+FMOD_System_CreateSound(system, "./Your/File/Path/Here.raw", FMOD_OPENRAW, &exinfo, &sound);
+
+ +
FMOD.Sound sound
+FMOD.CREATESOUNDEXINFO exinfo;
+
+// Create extended sound info struct
+exinfo = new FMOD.CREATESOUNDEXINFO();
+exinfo.cbsize           = Marshal.SizeOf(typeof(FMOD.CREATESOUNDEXINFO));  // Size of the struct
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Default playback rate of sound
+exinfo.format           = FMOD.SOUND_FORMAT.PCM16;          // Data format of sound
+
+system.createSound("./Your/File/Path/Here.raw", FMOD.MODE.OPENRAW, ref exinfo, out sound);
+
+ +
var sound = {};
+var outval = {};
+var exinfo = FMOD.CREATESOUNDEXINFO();
+
+// Create extended sound info struct
+// No need to define cbsize, the struct already knows its own size in JS
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Default playback rate of sound
+exinfo.format           = FMOD.SOUND_FORMAT.PCM16;          // Data format of sound
+
+system.createSound("./Your/File/Path/Here.raw", FMOD.OPENRAW, exinfo, outval);
+sound = outval.val;
+
+ +

3.7.3 Creating a Sound by manually providing sample data

+

FMOD_OPENUSER

+

FMOD_OPENUSER causes FMOD to ignore the first argument of System::createSound or System::createStream, and instead create a static sample or stream to which you must manually provide audio data. Use FMOD_CREATESOUNDEXINFO to specify the frequency, number of channels, and data format. You can optionally provide a read callback, which is used to place your own audio data into FMOD's buffers. If no read callback is provided, the sample will be empty, so Sound::lock and Sound::unlock must be used to provide audio data instead.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD::Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize           = sizeof(FMOD_CREATESOUNDEXINFO);   // Size of the struct
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Default playback rate of sound
+exinfo.length           = exinfo.defaultfrequency * exinfo.numchannels * sizeof(signed short) * 5;   // Length of sound - PCM data in bytes. 5 = seconds
+exinfo.format           = FMOD_SOUND_FORMAT_PCM16;          // Data format of sound
+exinfo.pcmreadcallback  = MyReadCallbackFunction;           // To read sound data, you must specify a read callback using the pcmreadcallback field
+// Alternatively, use Sound::lock and Sound::unlock to submit sample data to the sound when playing it back
+
+// As sample data is being loaded via callback or Sound::lock and Sound::unlock, pass null or equivalent as first argument
+system->createSound(0, FMOD_OPENUSER, &exinfo, &sound);
+
+ +
FMOD_Sound *sound;
+FMOD_CREATESOUNDEXINFO exinfo;
+
+// Create extended sound info struct
+memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
+exinfo.cbsize           = sizeof(FMOD_CREATESOUNDEXINFO);   // Size of the struct
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Default playback rate of sound
+exinfo.length           = exinfo.defaultfrequency * exinfo.numchannels * sizeof(signed short) * 5;   // Length of sound - PCM data in bytes. 5 = seconds
+exinfo.format           = FMOD_SOUND_FORMAT_PCM16;          // Data format of sound
+exinfo.pcmreadcallback  = MyReadCallbackFunction;           // To read sound data, you must specify a read callback using the pcmreadcallback field
+// Alternatively, use Sound::lock and Sound::unlock to submit sample data to the sound when playing it back
+
+// As sample data is being loaded via callback or Sound::lock and Sound::unlock, pass null or equivalent as second argument
+FMOD_System_CreateSound(system, NULL, FMOD_OPENUSER, &exinfo, &sound);
+
+ +
FMOD.Sound sound
+FMOD.CREATESOUNDEXINFO exinfo;
+
+// Create extended sound info struct
+exinfo = new FMOD.CREATESOUNDEXINFO();
+exinfo.cbsize           = Marshal.SizeOf(typeof(FMOD.CREATESOUNDEXINFO));  // Size of the struct
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Default playback rate of sound
+exinfo.length           = exinfo.defaultfrequency * exinfo.numchannels * sizeof(short) * 5;   // Length of sound - PCM data in bytes. 5 = seconds
+exinfo.format           = FMOD.SOUND_FORMAT.PCM16;          // Data format of sound
+exinfo.pcmreadcallback  = MyReadCallbackFunction;           // To read sound data, you must specify a read callback using the pcmreadcallback field
+// Alternatively, use Sound::lock and Sound::unlock to submit sample data to the sound when playing it back
+
+// As sample data is being loaded via callback or Sound::lock and Sound::unlock, pass null or equivalent as first argument
+system.createSound("", FMOD.MODE.OPENUSER, ref exinfo, out sound);
+
+ +
var sound = {};
+var outval = {};
+var exinfo = FMOD.CREATESOUNDEXINFO();
+
+// Create extended sound info struct
+// No need to define cbsize, the struct already knows its own size in JS
+exinfo.numchannels      = 2;                                // Number of channels in the sound
+exinfo.defaultfrequency = 44100;                            // Default playback rate of sound
+exinfo.length           = exinfo.defaultfrequency * exinfo.numchannels * 2 * 5;      // Length of sound - PCM data in bytes. 2 = sizeof(short) and 5 = seconds
+exinfo.format           = FMOD.SOUND_FORMAT.PCM16;          // Data format of sound
+exinfo.pcmreadcallback  = MyReadCallbackFunction;           // To read sound data, you must specify a read callback using the pcmreadcallback field
+// Alternatively, use Sound::lock and Sound::unlock to submit sample data to the sound when playing it back
+
+// As sample data is being loaded via callback or Sound::lock and Sound::unlock, pass null or equivalent as first argument
+system.createSound("", FMOD.OPENUSER, exinfo, outval);
+sound = outval.val;
+
+ +

3.8 Extracting PCM Data From a Sound

+

The following demonstrates how to extract PCM data from a Sound and place it into a buffer using Sound::readData. FMOD_OPENONLY must be used for the mode argument of System::createSound to ensure that file handle remains open for reading, as other modes will automatically read the entire file's data and close the file handle. Additionally, Sound::seekData can be used to seek within the Sound's data before reading into a buffer.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD::Sound *sound;
+unsigned int length;
+char *buffer;
+
+system->createSound("drumloop.wav", FMOD_OPENONLY, nullptr, &sound);
+sound->getLength(&length, FMOD_TIMEUNIT_RAWBYTES);
+
+buffer = new char[length];
+sound->readData(buffer, length, nullptr);
+
+delete[] buffer;
+
+ +
FMOD_SOUND *sound;
+unsigned int length;
+char *buffer;
+
+FMOD_System_CreateSound(system, "drumloop.wav", FMOD_OPENONLY, 0, &sound);
+FMOD_Sound_GetLength(sound, &length, FMOD_TIMEUNIT_RAWBYTES);
+
+buffer = (char *)malloc(length);
+FMOD_Sound_ReadData(sound, (void *)buffer, length, 0);
+
+free(buffer);
+
+ +
FMOD.Sound sound;
+uint length;
+byte[] buffer;
+
+system.createSound("drumloop.wav", FMOD.MODE.OPENONLY, out sound);
+sound.getLength(out length, FMOD.TIMEUNIT.RAWBYTES);
+
+buffer = new byte[(int)length];
+sound.readData(buffer);
+
+ +
var sound = {};
+var length = {};
+var buffer = {};
+
+system.createSound("drumloop.wav", FMOD.OPENONLY, null, sound);
+sound = sound.val;
+
+sound.getLength(length, FMOD.TIMEUNIT_RAWBYTES);
+length = length.val;
+
+sound.readData(buffer, length, null);
+buffer = buffer.val;
+
+ +

See Also: FMOD_TIMEUNIT, FMOD_MODE, Sound::getLength, System::createSound. Sound::seekData

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/effects-reference.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/effects-reference.html new file mode 100644 index 0000000..cc170fc --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/effects-reference.html @@ -0,0 +1,1047 @@ + + +Effects Reference + + + + +
+
+

FMOD Engine User Manual 2.03

+ +
+
+

10. Effects Reference

+

This chapter describes the suite of effects built in to the FMOD Engine, as well as their purposes, performance characteristics, and implementation details.

+

10.1 Current Effects

+

This section contains high level descriptions of currently supported built in effects.

+

Effects are categorized in each description for performance as:

+
    +
  • low overhead - Can be used freely without much CPU impact.
  • +
  • medium overhead - Use carefully with a medium CPU impact.
  • +
  • high overhead - Use sparingly with a higher CPU impact.
  • +
+

These categories are only broad guidelines, however, and cannot account for every project's unique requirements and resource budget. For a more accurate measurement of the performance impact of the effects in your project, use the FMOD Studio profiler or Core API profiler tool.

+

10.1.1 Channel Mix

+

The channel mix effect allows you to group, manipulate and route the individual channels of the signal.

+

Larger channel count multi-channel audio formats benefit the most from this effect, as mono and stereo signals are usually easily manipulated with a simple pan or volume setting. With larger multi-channel audio formats, the channels in the signal can be routed to any speaker that is required, and each volume level of each channel can be individually set.

+

Example: 8 stereo streams being interleaved into a single 16 channel stream. Normally FMOD would not know how to pan this type of signal. The grouping feature would let you describe it as 'all stereo' to allow the signal to pan correctly as 8 pairs of stereo signals. There are a variety of grouping modes to choose from.

+

The channel mix effect provides the following features:

+
    +
  • Per Channel Gain (up to 32 channels). For each channel in a signal, each input gain level can be individually.
    +Per channel gain
    +In this example, gain levels have been set on a 5.1 signal. Setting gain for a channel applies to all samples in the signal.
  • +
  • Output Channel Grouping. A multi-channel input signal can be described to play as a group of lower channel count speaker formats. By default, the channel mix effect passes the input channel format to the output without changing it.
    +Per channel gain
    +In this example, a multi-channel input signal is being described as multiple stereo signals out using the 'All Stereo' setting.
  • +
  • Input to output channel routing. The output speaker for each input channel of a signal can be set individually. By default, the routing for each input channels maps directly to the output equivalent.
    +Input to output channel routing
    +In this example, a multi-channel input signal has its 6 channels of audio routed to custom speakers on the output.
  • +
+

The channel mix effect is controllable by the parameters:

+
    +
  • Per channel gain - This has a range of -80 dB to +10 dB with a default of 0 dB. This can be set using the FMOD_DSP_CHANNELMIX_GAIN_CH0 through to FMOD_DSP_CHANNELMIX_GAIN_CH31 parameters.
  • +
  • Output channel grouping - This is configurable via group modes such as 'all lfe', 'all mono', 'all stereo', and in-between speaker modes up to 'all 7.4.1', with a default of speaker mode in = speaker mode out. This can be set using the FMOD_DSP_CHANNELMIX_OUTPUT parameter.
  • +
  • Per channel speaker mapping - This allows for each input channel to specify an output speaker number for complex routing flexibility. Channel mapping for each channel can be set using the FMOD_DSP_CHANNELMIX_OUTPUT_CH0 through to FMOD_DSP_CHANNELMIX_OUTPUT_CH31 parameters.
  • +
+

See Also: FMOD_DSP_TYPE_CHANNELMIX

+

Performance

+

Channel mix is a low overhead effect.

+

To avoid the bandwidth overhead of many streams playing at once, many streams can be interleaved into one using an external tool. The resulting file can then be streamed as a single sound, and the grouping feature can describe the sound as many lower channel count sounds.

+
+

10.1.2 Chorus

+

The chorus effect is often used in music, generated by interference of the source signal with delayed copies of the original that modulate their delay offsets over time. The effect works best on sounds which are sustaining in nature, and has a full / shimmering characteristic.

+

The chorus effect is characterized by a single delay line per channel of the signal, where each delay line oscillates its time offset in a sinusoidal manner, at a rate and range specified by the user.

+

Input to output channel routing
+A signal (black) having a copy (grey) added to itself, at a delay that oscillates back and forth in time with a speed of chorus rate, to a maximum delay of chorus depth. The original and copy of itself are gain balanced so that the signal does not get louder.

+

In multi-channel signals each subsequent channel has its delay incremented by 90 degrees in the sinusoidal cycle, and wrapping around back to a 90 degree offset each time. i.e.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Speaker Configuration
StereoL = 90degR = 180deg
Surround 5.1FL = 90degFR = 180degC = 270degLFE = 90degSL = 180degSR = 270deg
+

The chorus effect is controllable by the parameters:

+
    +
  • Depth - Delay used to achieve the effect. Has a range of 0 to 100ms with a default of 3 ms. Set with the FMOD_DSP_CHORUS_DEPTH parameter.
  • +
  • Rate - Speed of oscillation. Has a range of 0 to 20 Hz with a default of 0.8 Hz. Set with the FMOD_DSP_CHORUS_RATE parameter.
  • +
  • Mix - Percentage of effect applied to the input signal. The mix is a scale between the wet and the dry signal per channel, so that the loudness of the output stays consistent. Has a range of 0 to 100% with a default of 50%. Set with the FMOD_DSP_CHORUS_MIX parameter.
  • +
+

See Also: FMOD_DSP_TYPE_CHORUS

+

Performance

+

Chorus is a medium overhead effect.

+

Chorus is a comb filter which means it uses extra memory to buffer audio.

+
+

10.1.3 Compressor

+

The compressor effect reduces the volume of loud sounds above a certain threshold, reducing or compressing an audio signal's dynamic range.

+

The compressor reacts to the signal exceeding the 'threshold', which is a dB setting set by the user. If the signal exceeds this threshold a gain envelope is applied to the signal to reduce the signal by an amount specified as the 'ratio'.

+

The ratio is the fraction of the input level that is above the threshold, that the signal is reduced to in dB. If a ratio is set to 2, for every 2 dB above the threshold, the compressor only allows 1 dB above the threshold through. If a ratio is set to 4, for every 4 dB above the threshold, the compressor only allows 1 dB above the threshold through. The higher the ratio, the more audible and agressive it will be while a low ratio will provide gentler compression.

+

The reduction is controlled by a timed envelope which modifies the gain. The envelope has an attack and release period. The start of the attack happens when the threshold is exceeded. This can be set in milliseconds. Once the input signal level is below the threshold, the release stage starts will return the gain back to the starting value.

+

Compressor
+A signal suddenly exceeding the threshold is aggressively gain reduced with a high ratio. Attack and release states of an envelope control the timing of the reduction and the return to the original level after the signal drops back below the threshold.*

+

Characteristics of the compressor effect:

+
    +
  • Uniform across the whole spectrum, so all frequencies are affected equally.
  • +
  • Analysis of the input signal to compare against threshold is 'peak sensing' and not 'RMS sensing'.
  • +
  • Envelope transitions are 'hard knee' which is the shape of the envelope when the attack and release phase start and stop.
  • +
+

The compressor effect is controllable by the parameters:

+
    +
  • Threshold - The threshold level has a range of -80 dB to 0 dB and has a default of 0 dB. Set with FMOD_DSP_COMPRESSOR_THRESHOLD.
  • +
  • Ratio - The ratio has a range of 1 to 50 and has a default of 2.5. The higher the ratio the more aggressive the compression. Set with FMOD_DSP_COMPRESSOR_RATIO.
  • +
  • Linked mode - Multi-channel, so each individual channel reacts independently of each other. Linked Mode is also available which mixes all channels into a mono signal before processing. Set with FMOD_DSP_COMPRESSOR_LINKED.
  • +
  • Side chain - Side chaining is available to allow an outside signal to control the level rather than the incoming signal. Set with FMOD_DSP_COMPRESSOR_USESIDECHAIN. To connect a sidechain to the compressor, the DSP API is used to add another DSP using DSP::addInput and FMOD_DSPCONNECTION_TYPE_SIDECHAIN.
  • +
  • Attack speed - Attack speed of the gain envelope is available, having a range of 0.1 ms to 1000 ms with a default of 20 ms. Set with FMOD_DSP_COMPRESSOR_ATTACK.
  • +
  • Release speed - Release speed of the gain envelope is available, having a range of 10 ms to 5000 ms with a default of 100 ms. Set with FMOD_DSP_COMPRESSOR_RELEASE.
  • +
  • Gain make-up - Gain make-up allows a constant gain to be applied at the output having a range of 0 dB to 30dB, with a default of 0 dB. Set with FMOD_DSP_COMPRESSOR_GAINMAKEUP.
  • +
+
+

In a real-time audio engine, the compressor is not guaranteed to catch every peak above the threshold level, because it cannot apply gain reduction instantaneously. The time delay is determined by the attack time. However setting the attack time too short will distort the sound, so it is a compromise. High level peaks can be avoided by using a short attack time - but not too short, and setting the threshold a few decibels below the critical level.

+
+

See Also: FMOD_DSP_TYPE_COMPRESSOR

+

Performance

+

Compressor is a medium overhead effect.

+
+

10.1.4 Convolution Reverb

+

The convolution reverb effect is used to simulate an environment by processing audio with a recording of a real world location (the 'impulse response'), in order to reproduce the reverberation characteristics of that environment.

+

Convolution reverb differs to FMOD's SFX Reverb, in that it is not controlled by a set of parameters, but instead is set by an impulse response file, which has been previously recorded and supplied to the effect.

+

This has the advantage of reproducing a space's reverberation characteristics very faithfully, but has the disadvantage of not being flexible. The convolution reverb environment cannot be easily morphed into a different environment,
+compared to the SFX Reverb effect which can set different tuning parameters to get the desired result in realtime. A workaround for this might be to have more than 1 convolution reverb running and cross fade between them, but it will use more CPU power to do so.

+

Convolution reverb is a relatively expensive effect, due to it being processed in the frequency domain which includes costly spectral to time domain conversions and vice versa, as well as the process of convolving the input signal with the impulse response in real-time.

+

The convolution effect is controllable by the parameters:

+ +

The output channel count of the DSP is the channel count of the impulse response source.

+

Creation of an impulse response for use with the convolution reverb effect

+

For Impulse response data, you can purchase/download professionally recorded space data and feed it straight into the FMOD convolution reverb effect, or you can make your own.

+

Impulse response
+A typical impulse starts with an exciter, such as a burst of noise, and then the resulting sound contains the reverberation of the exciter from the surrounding environment.

+

To make your own requires recording an 'impulse' (a burst of white noise or a longer sine wave sweep sound) in the space, and the idea is to record the resulting reverberation from the surroundings.

+

An impulse needs both power and full spectrum to capture the room’s full response. An ideal impulse cannot exist in reality, so an approximation is used, for example the popping of a balloon or a shot from a starter pistol.

+

The next step after this is to deconvolve the recording to produce an impulse response. 3rd party tools exist for this. When saving a response, for a 3D real-time environment it is best to use a monophonic (1 channel) impulse, as you do not want directionality baked into the impulse itself. FMOD's 3D engine will position sounds in 3D an pan them in any speakers, and because of the nature of reverb, any directionality is generally lost in the real world.

+

See Also: FMOD_DSP_TYPE_CONVOLUTIONREVERB

+

Performance

+

Convolution reverb is a high overhead effect.

+

Although it is a high overhead effect in nature, FMOD's convolution engine has been highly optimized to use platform specific vector processing, as well as multiple CPU threads to reduce impact on the main DSP mixing thread.

+

To save CPU time and memory, the shorter an impulse response is, the faster it will be. Longer impulses use larger amounts of CPU time.

+
+

10.1.5 Delay

+

The delay effect is used to delay individual channels of a signal. It is simpler than an echo, and is used to manipulate the timing of multi-channel signals with greater control.

+

The delay effect is achieved by storing the signal for each channel then playing it back after periods of time specified by the user.

+

Delay
+A stereo signal having its left and right channel delayed into the mix with different delay lengths.

+

The delay effect is controllable by the parameters:

+
    +
  • Per channel delay. Each channel can have its own delay, up to 16 channels, with a range of 0 to 10 seconds and a default of 0. Set with the FMOD_DSP_DELAY_CH0 to FMOD_DSP_DELAY_CH15 parameters.
  • +
  • Maximum delay. Because delay requires buffering of audio signals, a maximum delay can be set to control memory usage. Per channel delay must be smaller or equal to this value. Set with FMOD_DSP_DELAY_MAXDELAY parameter.
  • +
+

See Also: FMOD_DSP_TYPE_DELAY

+

Performance

+

Delay is a low overhead effect.

+

Delay is a stores a history which means it uses more memory due to the buffering of audio signals. Control maximum delay lengths with FMOD_DSP_DELAY_MAXDELAY.

+
+

10.1.6 Distortion

+

The distortion effect is used to alter the shape of a signal to make it 'noisier'. Among other things, distortion may be used to simulate low quality equipment or a low quality communications channel.

+

The effect is achieved by amplifying then clipping the signal at levels controlled by the user. The loudness characteristic of the distortion is not levelled, and may need an additional fader to compensate for the increased loudness.

+

Distortion
+A signal being distorted with some compensation afterwards to bring the loudness of the output into line with the input.

+

The distortion effect is controllable by the parameters:

+
    +
  • Distortion level - The amount of distortion is controlled by with one parameter with a range between 0 (none) and 1 (full) and a default of 0.5. Set with FMOD_DSP_DISTORTION_LEVEL.
  • +
+

See Also: FMOD_DSP_TYPE_DISTORTION

+

Performance

+

Distortion is a low overhead effect.

+
+

10.1.7 Echo

+

The echo effect simulates the reflection of a sound that arrives with a delay after the initial sound is heard. With feedback, it can then continue to be heard at a diminished volume level until the sound fully attenuates. This effect is a cheaper, simple way to simulate an environment and its early / harsher reflections than a full reverb effect.

+

Echo is achieved by mixing the incoming signal into an echo buffer at an offset determined by the delay time, and then mixing that buffer back into the original input signal with a volume level determined by the feedback.

+

Distortion
+A short sound playing (black) and its delayed copy playing back, then continuing to feed itself back in with the same delay each time, but with diminished power.

+

The echo effect is controllable by the parameters:

+
    +
  • Delay - The time taken to hear an echo of the original signal is specified with the 'delay' parameter, which ranges between 10ms and 5000ms and has a default of 500ms. Set with FMOD_DSP_ECHO_DELAY.
  • +
  • Feedback - The amount of the signal fed back into the echo buffer after the initial delay is specified with the 'feedback' parameter, which is defined as a percentage between 0% and 100%, with a default of 50%. Set with FMOD_DSP_ECHO_FEEDBACK.
  • +
  • Wet Mix and Dry Mix - Wet and dry mix of the echo effect can be set separately, which both have a range of -80 dB to +10 dB and a default of 0 dB. Set with FMOD_DSP_ECHO_DRYLEVEL and FMOD_DSP_ECHO_WETLEVEL.
  • +
  • Delay Change Mode - The method used to smooth delay changes. Ramp will fade-in the new delay value and fade-out the old delay value. Lerp will use linear interpolation to approach the new delay target. None will disable value smoothing between delay changes. Set with FMOD_DSP_ECHO_DELAYCHANGEMODE.
  • +
+

The outgoing channel count of the echo effect is always be the same as the number coming in.
+Due to the initial delay tap having no attenuation, simulating attenuation from the first tap onwards can be done by scaling the whole effect with the FMOD_DSP_ECHO_WETLEVEL parameter.

+

See Also: FMOD_DSP_TYPE_ECHO

+

Performance

+

Echo is a medium overhead effect.

+

Echo is a comb filter which means it uses extra memory to buffer audio.

+
+

10.1.8 Fader

+

The fader effect is used to scale the volume of a signal. Its DSP is used commonly, both by Channels and ChannelGroups as their main source of volume control and by FMOD Studio's gain effect.

+

The fader effect is controllable by the parameters:

+
    +
  • Gain - The fader can attenuate the signal, potentially even to silence, or amplify it. This gain value has a range of -80 dB to +10 dB with a default of 0 dB. Set with FMOD_DSP_FADER_GAIN.
  • +
  • Overall gain - The fader can be used as a source of information to query the overall attenuation of the signal. Get with FMOD_DSP_FADER_OVERALL_GAIN.
  • +
+

See Also: FMOD_DSP_TYPE_FADER

+

Performance

+

Fader is a low overhead effect.

+
+

10.1.9 FFT

+

The FFT (Fast Fourier Transform) effect analyzes the signal and provides information about its frequency spectrum. This can be used to provide information about the dominant pitch of a sound (for pitch detection), or for display or measurement of the power of different parts of the spectrum at the same time.

+

The FFT DSP is a process that converts a time domain signal to a frequency domain representation in real time.

+

FFT
+A sine wave playing at 20hz in the time domain (top) and a spectrum representation (bottom) of the same wave after an FFT has processed it.

+

The FFT effect is controllable by the parameters:

+
    +
  • Block Size - The FFT analyzes the signal in blocks of samples. The block size is a power of 2 between 128 and 16384, with a default setting of 2048. The size has a trade-off of accuracy vs cpu expense and latency. Smaller blocks are more efficient and have lower latency, but have less results, so are coarser in their accuracy. Larger blocks are less efficient and have higher latency, but have more data and are better in their accuracy. Set with FMOD_DSP_FFT_WINDOWSIZE.
  • +
  • Windowing - Each time a block is processed, the FFT must taper the start and end to avoid unwanted spectral leakage or transient signals interfering with the analysis. This is done by applying a window to the data before processing it. The default window type is the 'Hamming' type. Set with FMOD_DSP_FFT_WINDOW.
  • +
  • Analysis band - The effect calculates RMS and spectral centroid values for frequencies within the analysis band. Set with FMOD_DSP_FFT_BAND_START_FREQ and FMOD_DSP_FFT_BAND_STOP_FREQ.
  • +
  • Multichannel signals - The effect can analyze all channels of the signal independently, just analyze a single channel, or downmix to a single channel before analysis. Set with FMOD_DSP_FFT_DOWNMIX and FMOD_DSP_FFT_CHANNEL.
  • +
  • Spectrum data - The spectrum data can be retrieved as an array of signal power values, one for each frequency interval. Get with FMOD_DSP_FFT_SPECTRUMDATA.
  • +
  • RMS - This is a single representative value, calculated as the sum of the signal power values within the analysis band. Get with FMOD_DSP_FFT_RMS.
  • +
  • Spectral centroid - This is a single representative value, calculated as a weighted average of the frequency components within the analysis band. Useful for simple pitch detection. Get with FMOD_DSP_FFT_SPECTRAL_CENTROID.
  • +
  • Immediate mode - Use this to control how the data is processed. When set to true, data requests will have no delay on first time use, and no hardware acceleration will be used. When set to false, data requests will have a delay on first time use and hardware acceleration, if available, will be used. Set with FMOD_DSP_FFT_IMMEDIATE_MODE.
  • +
+

Cyclic signals such as a sine wave that repeat their cycle in a multiple of the window size do not need windowing. I.e. If the sine wave repeats every 1024, 512, 256 etc samples and the FMOD FFT window is 1024, then the signal would not need windowing. Not windowing is represented by FMOD_DSP_FFT_WINDOW_RECT.

+

For more natural sounds, and more complex sounds, different window shapes can be used which are supported by this effect. See FMOD_DSP_FFT_WINDOW_TYPE for a list of window types and examples of their shapes.

+

See Also: FMOD_DSP_TYPE_FFT

+

Performance

+

FFT is a high overhead effect.

+
+

10.1.10 Flange

+

The flange effect is generated by interference of the signal with a single delayed copy of that signal that slowly modulates its delay offset over time. This produces a wooshing, sweeping effect. Typically used in music, it can also be used to create an otherworldly repetitive effect for atmosphere.

+

In this effect a copy of the incoming signal is delayed and mixed back in at a varying offset that cycles on a sinusoidal shape. The delay has a maximum depth of 10ms. As there are 2 versions of the same signal, by default each signal is given 50% mix, so that the total loudness is generally not louder than the original signal.

+

Flange
+A sound being fed in (black) and the gain reduced version (grey) being added to a copy (grey) at a delay that changes over time, according to a sinusoidal shape. The delay has an adjustable rate and depth.

+

The flange effect is controllable by the parameters:

+
    +
  • Depth - This can be set between 0.01 and 1, with a default of 1. A value of 1 represents around 10 ms shift from the original signal. Anything above 10ms is not considered flange because to the ear it begins to 'echo' so 10ms is the highest value possible. Set with FMOD_DSP_FLANGE_DEPTH.
  • +
  • Rate - Flange rate is measured in Hz and has a range of 0 to 20 Hz, with a default of 0.1 Hz. Set with FMOD_DSP_FLANGE_RATE.
  • +
  • Mix - Flange balance is the mix between the original signal and the delayed copy, with a range of 0% to 100%, with a default to 50%. Set with FMOD_DSP_FLANGE_MIX.
  • +
+

See Also: FMOD_DSP_TYPE_FLANGE

+

Performance

+

Flange is a medium overhead effect.

+

Flange is a comb filter which means it uses extra memory to buffer audio.

+
+

10.1.11 IT Echo

+

The IT echo effect is a variation of the original echo effect, which simulates the reflection of a sound that arrives with a delay after the initial sound is heard. With feedback it can then continue to be heard at a diminished volume level until the sound fully attenuates.

+

This version of echo is stereo only, but has a variable delay per channel, and allows bouncing the echo from left to right speakers and vice versa. It was originally introduced to support the type of echo used in .IT music files.

+

This echo variation originated to support .IT music files. The effect emulates in software, the Microsoft Direct X echo which is the employed by the Mod Plug Tracker program.

+

The IT echo effect is controllable by the parameters:

+
    +
  • Left / right delay - As this is a stereo filter made intended for .IT playback, it is targeted for stereo signals. With mono signals only the left delay is used. For multi-channel signals (>2) there is no echo on the extra channels. Set with FMOD_DSP_ITECHO_LEFTDELAY and FMOD_DSP_ITECHO_RIGHTDELAY.
  • +
  • Pan Delay - Panning of the stereo delays can be set to ping-pong left and right with each successive echo. Set with FMOD_DSP_ITECHO_PANDELAY.
  • +
  • Feedback level - Amount of output signal that is passed back in as an input signal in successive updates. Set with FMOD_DSP_ITECHO_FEEDBACK
  • +
  • Wet / Dry mix - Percentage of input signal vs processed signal that is sent to output. By default the percentage is set to 50 for an even mix, with 0 being no effect passed to output, with 100 being no original dry signal passed to the output. Set with FMOD_DSP_ITECHO_WETDRYMIX
  • +
+

See Also: FMOD_DSP_TYPE_ITECHO

+
+

This echo does not have interpolation between changes in delay, which means every time the delay is changed the echo buffer is cleared and a period of silence will occur.

+
+

Performance

+

IT Echo is a medium overhead effect.

+

Echo is a comb filter which means it uses extra memory to buffer audio.

+
+

10.1.12 IT Low Pass

+

The IT low pass effect is used to attenuate or remove high frequencies in a signal, controlled with a cutoff frequency that is specified by the user. The resonance attribute or 'Q' value of the filter can also be specified, to affect the gain of the signal at the cutoff frequency, to further alter the characteristics of the sound.

+

This low pass variation originated to support .IT music files. The effect emulates low pass filter effect employed by the Impulse Tracker program.

+

Characteristics of the IT low pass effect:

+
    +
  • This is different to the default Low Pass, Multi Band Equalizer or Low Pass Simple effects in that it uses a different quality algorithm and is the filter used to produce the correct sounding playback in .IT files.
  • +
  • This filter actually has a limited cutoff frequency below the specified maximum, due to its limited design (8060hz), so for a more open range filter use Low Pass, Multi Band Equalizer or for a filter with no resonance control, Low Pass Simple.
  • +
+

The IT low pass effect is controllable by the parameters:

+
    +
  • Cutoff frequency - The frequency for the low pass filter ranges between 1 Hz and 22 kHz with a default of 5 kHz. Set with FMOD_DSP_ITLOWPASS_CUTOFF.
  • +
  • Resonance - The low pass resonance or Q value is a linear value that ranges between 0 and 127 with a default of 1. Set with FMOD_DSP_ITLOWPASS_RESONANCE.
  • +
+

See Also: FMOD_DSP_TYPE_ITLOWPASS

+

Performance

+

IT low pass is a low overhead effect.

+
+

10.1.13 Limiter

+

The limiter effect prevents the signal from exceeding a certain amplitude. Originally limiters were used to quickly avoid audio from overworking electronics and damaging them. Now they are used to control dynamics and avoid noisy clipping.

+

Limiter in action
+When the input signal exceeds a threshold (the ceiling), it immediately reduces the gain to avoid clipping or excessive loudness. When the input signal returns to a level underneath the ceiling, the gain is not immediately returned to normal, it is ramped back with a release envelope.

+

The Limiter effect is controllable by the parameters:

+
    +
  • Ceiling - The FMOD limiter is a hard limiter, which detects peaks and immediately limits them by scaling the whole signal to stay within the ceiling. The ceiling has a range of -12 dB to 0 dB and has a default of 0 dB. Set with FMOD_DSP_LIMITER_CEILING.
  • +
  • When peaks drop below the desired ceiling setting, the scale applied downwards to the signal is gradually reduced or released over the time specified in the release. The release time has a range of 1 ms to 1000 ms with a default of 10ms. Set with FMOD_DSP_LIMITER_RELEASETIME.
  • +
  • Linked mode - The processing mode for the effect can be 'linked' which means all channels in a signal are summed together and treated as mono first (no per channel processing), or 'unlinked' which is the default and is individual processing per channel. The default setting is unlinked. Set with FMOD_DSP_LIMITER_MODE.
  • +
  • Maximizer gain - The input signal can have a gain applied to it which is overridden by the ceiling, making the signal louder but reducing dynamic range. The maximizer gain has a range of 0 dB to +12 dB with a default of 0 dB. Set with FMOD_DSP_LIMITER_MAXIMIZERGAIN.
  • +
+

See Also: FMOD_DSP_TYPE_LIMITER

+

Performance

+

Limiter is a low overhead effect.

+
+

10.1.14 Multiband Dynamics

+

Three band dynamic processor. This effect is used to dynamically attenuate and amplify frequencies within each band based on the envelope of the signal.

+

The multiband dynamics effect processes each channel of the incoming signal by splitting it into one of three frequency bands, applying dynamic processing to each band individually, and combining the resulting bands back together.

+

The available dynamic processing operations are:

+
    +
  • Downward Compression: Attenuates the signal when it is above a defined threshold, by a factor determined by the ratio.
    +Downward Compression
    +Dynamic response shown in red, depicting the output signal decreasing in response to input values above the threshold.
    + This is the mode that the existing FMOD Compressor uses, and is useful for bringing down harsh percussive sounds, such as plosives and sibilance in the upper frequency range.
    + Select with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_DOWN.
  • +
  • Upward Compression: Amplifies the signal when it is below a defined threshold, by a factor determined by the ratio.
    +Upward Compression
    +Dynamic response shown in red, depicting the output signal increasing in response to input values below the threshold.
    + Upward Compression can be useful for bringing out quieter details in sounds, such as breath in the middle frequency range of vocals, or fret noise in the upper frequency range of a guitar.
    + Select with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_UP.
  • +
  • Downward Expansion: Attenuates the signal when it is below a defined threshold, by a factor determined by the ratio.
    +Downward Expansion
    +Dynamic response shown in red, depicting the output signal decreasing in response to input values below the threshold.
    + Downward Epansion be useful for removing noise in the signal, such as bird chirps in the upper frequency range, or room tone in the lower frequency range.
    + Select with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_DOWN.
  • +
  • Upward Expansion: Amplifies the signal when it is above a defined threshold, by a factor determined by the ratio.
    +Upward Expansion
    +Dynamic response shown in red, depicting the output signal increasing in response to input values above the threshold.
    + Upward Expansion can easily cause clipping, so use with caution, but can be useful for bringing percussive sounds forward, such as snares in the upper frequency range or explosions in the lower frequency range.
    + Select with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_UP.
  • +
+

See Also: FMOD_DSP_TYPE_MULTIBAND_DYNAMICS

+

Performance

+

Multiband Dynamics is a medium overhead effect. When a band is collpased it will not be processed, reducing CPU overhead of the effect.

+
+

10.1.15 Multiband Equalizer

+

A flexible five band parametric equalizer. This effect is used to attenuate and accentuate frequencies for greater control over frequency shaping within a signal.

+

The multiband equalizer effect processes each channel of the incoming signal by passing it through up to 5 selectable filter types in series (one after another) from A to E.

+

Multiband EQ curves
+Frequency response curve shown in red (phase response in gray) with three enabled filter types. (A) 12dB high-pass filter set at 70Hz. (B) Peaking filter set at 1kHz. (C) 24dB low-pass filter set at 10kHz.

+

The different filter types selectable are:

+ + +

See Also: FMOD_DSP_TYPE_MULTIBAND_EQ

+

Performance

+

Multiband EQ is a low overhead to medium overhead effect.

+

Each band of the effect is a separate filter that carries the same CPU cost regardless of fundamental type (except 24dB / 48dB variations - see below). Performance scales linearly as each band is enabled, i.e. running the effect with two enabled filters costs twice the CPU performance of running with a single filter enabled. If the signal has multiple channels performance scales approximately linearly with the channel count with some reductions due to multi-channel optimizations.

+

Some filter types have 12, 24 or 48 dB (decibel) variations, these variations indicate the filter is run once (12dB), twice (24dB) or four times (48dB) to achieve steeper roll off curves. As with all the provided filter types, performance scales linearly with the number of times the filter is run, therefore a 48dB filter (which runs four times) has approximately four times the CPU cost as a single 12dB filter with some reduction due to optimizations. The 6dB variation runs once like the 12dB version, but is slightly faster.

+
+

10.1.16 Normalize

+

Normalize amplifies the sound based on the maximum peaks within the signal. This is used to increase the loudness of a signal to a uniform maximum level.

+

The normalize filter analyzes the signal in realtime and scales the output based on maximum peaks detected. The lower limit of peak detection, and upper scale multiplier can be controlled by the user.

+

The normalize effect is controllable by the parameters:

+
    +
  • Fade time - To avoid reacting too quickly to sudden changes, the process occurs over a longer time to avoid pops and sudden bursts of noise. The duration is controlled with the normalize 'fade time' parameter which has a range of 0 to 20,000 ms, with a default of 5000 ms. Set with FMOD_DSP_NORMALIZE_FADETIME.
  • +
  • Threshold - Below certain signal levels, normalization is not desired. A low level signal that is normalized by its small peaks may cause excessive amplification of things like background hiss so a threshold setting can be used. The Threshold setting ranges from 0 to 1 as a linear value, with a default of 0.1. Set with FMOD_DSP_NORMALIZE_THRESHOLD.
  • +
  • Maximum Amplification - To avoid excessive amplification, a limit can be set on the maximum amplification factor. Maximum amplification has a range of 1 to 100,000 with a default of 20. Set with FMOD_DSP_NORMALIZE_MAXAMP.
  • +
+

By default the normalizer takes the highest peak value and scale it to 0 dB, scaling the rest of the signal by the same scale factor.

+

Normalize in action
+A signal with low gain having its gain slowly increased until it reaches a ceiling level.

+

See Also: FMOD_DSP_TYPE_NORMALIZE

+

Performance

+

Normalize is a low overhead effect.

+
+

10.1.17 Object Panner

+

The object panner effect is specifically designed to work with 3D platform-specific technologies such as Windows Sonic, PlayStation VR, and Dolby Atmos. It functions by routing the signal and the event's 3D positional information directly to a hardware device, instead of through the ChannelGroups and DSPs into which the signal is nominally routed.

+
+

FMOD Studio and the FMOD Studio User Manual refer to this effect as an 'Object Spatializer'.

+
+

As a result of the signal bypassing the mixer, the signal does not encounter any effects or sends "downstream" of the object panner. Unlike the Pan effect or built in Core API panning, the object panner does not automatically up-mix the signal to your project's surround speaker mode.

+

Signals processed by this effect are sent to the global object mixer (effectively a send), any DSP connected after this will receive silence.

+

Object panner bypassing mixer
+The signal flow above shows that the object panner sends the signal to the final output, bypassing the mixing engine.

+

For best results this effect should be used with Win Sonic or Audio 3D to get height panning. Playback with any other output results in fallback panning.

+
+

For a description of the parameters for an Object Panner, see the Panner effect reference as it shares a subset of the same parameters.

+
+

See Also: FMOD_DSP_TYPE_OBJECTPAN

+

Performance

+

Object Panner is a low overhead effect.

+
+

10.1.18 Oscillator

+

The Oscillator effect is a pure tone generator. It can be used to generate a variety of wave form shapes such as sine, saw, square and noise. Using a tone generator is an efficient way to create sound without using any memory.

+

The oscillator is a generator effect. This means it ignores incoming signals and writes out audio as a mono output signal. There are 5 different types of oscillator shape.

+

Oscillator wave shapes
+The different wave shapes that the oscillator effect supports.

+

The oscillator effect is controllable by the parameters:

+

Wave Shape - wave shape such as sine, square, triangle, saw, noise. Set with FMOD_DSP_OSCILLATOR_TYPE.
+Rate - The rate in Hz at which the audio is generated for different pitched tones. Set with FMOD_DSP_OSCILLATOR_RATE.

+

See Also: FMOD_DSP_TYPE_OSCILLATOR

+

Performance

+

Oscillator is a low overhead effect.

+
+

10.1.19 Pan

+

The pan effect is a multi channel, multi speaker signal distribution effect with 2D and 3D panning controls. Pan control allows you to specify which speakers the signal should be audible in, and can be used to convey a sense of movement by changing the panning of a sound in real time.

+
+

FMOD Studio and the FMOD Studio User Manual refers to this effect as a 'spatializer' when using its 3D functionality.

+
+

The pan effect can pan a signal based on a 3D emitter/listener position, or on a 2D basis where the speakers are panned to directly as if they were laid out on a stereo X axis or on a surround sound circle, where in both cases the listener is situated in the middle.
+There are several options for panning, so the guide below lists the different cases and features and how they are implemented.

+

The panner can be used in a purely 2D mode, or 3D mode, or a mixture of the two by utilizing the pan blend parameter.

+

The parameters for the pan effect are listed as topics below to elaborate on their functionality:

+

2D Stereo Output Mode

+

When the FMOD_DSP_PAN_MODE_TYPE is FMOD_DSP_PAN_MODE_STEREO, a simple position control can be used to pan a sound between left and right speakers, where a value of -100 is full left, 0 is in the middle and +100 is full right.

+

2D Stereo Output Mode
+The audible position of a sound in between stereo speakers can be set with a single stereo position value.

+
+

API reference. Positioning sound between left and right in a stereo speaker mode can be done with the FMOD_DSP_PAN_2D_STEREO_POSITION parameter.

+
+

The channels of a source signal are interpreted in different ways when panned to a stereo output:

+
    +
  • A mono signal is distributed with a constant power level with different left/right contributions based on the position value.
  • +
  • Stereo and above channel counts have their channels faded in and out in their matching left or right speaker, rather than moved between speakers as a mono signal would.
  • +
+

2D Surround Output Mode

+

When the FMOD_DSP_PAN_MODE_TYPE is FMOD_DSP_PAN_MODE_SURROUND (more than stereo, for example quad / 4.1 or 7.1), the source signal is distributed through the output speaker mode using a relevant up mix or down mix algorithm.

+

When panning any type of signal in a surround output mode, the distribution is described as a proportion of a set of speakers laid out on a circle. This is described by:

+
    +
  • Direction. Relative angle to the front facing position from the center point (or listener position) of a circle.
  • +
  • Extent. Amount of distribution on a circle relative to the direction.
  • +
+

2D Surround Output Mode
+A default direction of 0 (front center) and an extent of 360 (black circle), in a 7.1 speaker mode. The source signal's channels are distributed between all speakers in their default positions. The dot is a virtual representation of an equivalent x,y position of a signal in the circle.

+

2D Surround Output Mode: Extent

+

The extent is the size of the arc in the output speaker circle that has sound distributed to it. An extent of 360 means the source signal channels are distributed as they natively do to the whole speaker circle. An extent of 0 means the source signal channels are scaled within a single point on the circle.

+

2D Surround Output Mode: Extent 360
+A pan with a 30 degree direction, and an extent (the black arc), that changes from 360 degrees with distribution in all speakers, down to a 10 degree extent that makes the audio focus on front right speaker only. The dot is a virtual representation of an equivalent x,y position of a signal in the circle.

+

The channel mapping of a source signal is scaled into the extent angle.

+

2D Surround Output Mode: Extent 5ch
+A pan with a 30 degree direction, a 60 degree extent, and the channels of a 5 channel source signal being scaled within the extent.

+
+

API reference. Setting the extent value can be done with the FMOD_DSP_PAN_2D_EXTENT parameter.

+
+

2D Surround Output Mode: Direction

+

The direction is the orientation of the arc (extent) in the output speaker circle that has sound distributed to it. A direction of 0 means audio is distributed towards the front of the listener. A direction of -90 is to the left, +90 is to the right, with -180 and +180 being behind the listener.

+

2D Surround Output Mode: Direction
+A pan with a 60 degree extent (the black arc) with a direction that starts at 30 degrees then does a full rotation around the speaker circle to end up where it started.

+

The channel mapping of a source signal maintains its original orientation regardless of the direction setting. As an example a 5.1 signal that has a direction of 90 degrees does not rotate this signal's channels, but concentrates the signal towards the direction depending on now narrow the extent is.

+
+

API reference. Setting the direction value can be done with the FMOD_DSP_PAN_2D_DIRECTION parameter.

+
+

2D Surround Output Mode: Rotation

+

For a multi-channel source signal, the channels inside the signal can be rotated from their original mapping, contained within the extent.

+

2D Surround Output Mode: Rotation
+A pan with a fixed 30 degree direction and 60 degree extent, with a 5 channel source signal having its channels rotated over time inside the extent.

+
+

API reference. Setting the rotation value can be done with the FMOD_DSP_PAN_2D_ROTATION parameter.

+
+

2D Surround Output Mode: LFE Level

+

The LFE (Low Frequency Effects) channel of a signal is not positionable, but its level can be set independently. This is only available for surround output speaker modes.

+

The LFE level can be set to -80 dB for full attenuation up to +20 dB for amplification.

+
+

API reference. Setting the LFE value can be done with the FMOD_DSP_PAN_2D_LFE_LEVEL parameter.

+
+

2D Surround Output Mode: Stereo Source Discrete Panning

+

A stereo source signal is by default treated the same as other multi-channel source signals, with the left and right channels scaled within the extent (half of the extent dedicated to the left channel, half to the right).

+

Stereo source signals have an extra mode for discrete left/right panning in a circle, to give more focused distribution. The pan behavior for stereo source signals can be altered by setting the pan effect's 2D stereo mode parameter from 'Distributed' to 'Discrete'.

+
+

API reference. Switching stereo signal pan behavior from distributed to discrete can be set with the FMOD_DSP_PAN_2D_STEREO_MODE parameter.

+
+

In discrete mode, the left and right channels are not evenly distributed over an extent range, they are rather audibly located to the extreme left and right of that range, with no distribution of the signal to speakers in-between.

+

Distributed mode continues to use extent and direction parameters to control distribution, whereas 'Discrete' mode uses 2 different parameters called 'Separation' and 'Axis'.

+

2D Surround Output Mode: Stereo Axis

+

For a stereo sound in discrete mode, the orientation is denoted by an angle inside the circle pointing to the outside of the circle, called 'Axis' parameter. This can be set between -180 for behind in the left direction, and +180 degrees for behind in the right direction.

+

2D Surround Output Mode: Discrete Axis
+A pan of a stereo signal with a rotating axis and 60 degree separation.

+

As compared to distributed mode, in discrete mode the stereo axis setting rotates the mapping of the source signal channels around the circle, so that at +/- 180 degrees position the L and R source channels are reversed in the output speakers.

+
+

API reference. Setting the Stereo axis value can be done with the FMOD_DSP_PAN_2D_STEREO_AXIS parameter.

+
+

2D Surround Output Mode: Stereo Separation

+

For a stereo sound in discrete mode, The width of the pan distribution is known as 'Separation' and is represented by an angle with a range of -180 to +180 degrees, and a default of 60 degrees.

+

A default of 60 degrees with an axis of 0 degrees puts left in the front left speaker, and right in the front right speaker. Setting it to 0 puts the left and right in the same position and when it is negative the left and right source signal positions are swapped around.

+

2D Surround Output Mode: Stereo Separation
+A discrete mode pan of a stereo signal with a 0 degree axis and a separation that starts at 60 degrees then shrinks to 10 degrees, then flips the left and right by moving to a -60 degree separation value.

+
+

API reference. Setting the Stereo Separation value can be done with the FMOD_DSP_PAN_2D_STEREO_SEPARATION parameter.

+
+

2D Surround Output Mode: Height

+

In a speaker setup with height speakers, the pan can be blended between the standard ground level speaker circle and its pan distribution, with the

+

When the input or FMOD_DSP_PAN_SURROUND_SPEAKER_MODE has height speakers, control the blend between ground and height. -1.0 (push top speakers to ground), 0.0 (preserve top / ground separation), 1.0 (push ground speakers to top).

+

2D Surround Output Mode: Height Top
+A 7.1.4 speaker layout, viewed from the top. The 'T' (Top) based speakers are located in the ceiling of the listener's room.

+

2D Surround Output Mode: Height Side Mono
+A side view of a 7.1.4 speaker layout, with a mono signal (dot) adjusting its height from the ground level (0) to the ceiling level (1).

+

With a signal containing no height speakers of its own (ie all standard ground based speaker layouts of mono to 7.1), any height value below 0 is capped to 0. Negative height values are reserved for signals with height speakers.

+

The height value behaves differently for 7.1.4 source signals.

+ + + + + + + + + + + + + + + + + + + + + +
Height value7.1.4 signal behavior
0Default position, leaving ground and ceiling level signal channels in their relative ground and ceiling level output speaker locations.
0 to 1Affects height of ground level signal channels. Leaves the ceiling signal channels alone. Has the effect of raising up the source signal's ground channels the higher the number is.
0 to -1Affects height of ceiling level signal channels. Leaves the ground signal channels alone. Has the effect of lowering the ceiling channels the lower the number is.
+

2D Surround Output Mode: Height Side 7.1.4 Up
+A side view of a 7.1.4 speaker layout, with a 7.1.4 signal (multiple dots) adjusting its ground level channels from the ground level (0) to the ceiling level (1).

+

2D Surround Output Mode: Height Side 7.1.4 Down
+A side view of a 7.1.4 speaker layout, with a 7.1.4 signal (multiple dots) adjusting its ceiling level channels from the ceiling level (0) to the ground level (-1).

+
+

API reference. Setting the Stereo Separation value can be done with the FMOD_DSP_PAN_2D_HEIGHT_BLEND parameter.

+
+

3D Surround Output Mode: 3D Pan Blend

+

As the pan effect can simultaneously utilise 2D commands and 3D commands to achieve the desired signal distribution among the output speakers, to hear the result of 2D commands only or 3D commands only or a mixture of both, the Pan Blend setting can be used.

+

The setting has a linear range of 0 to 1 and a default of 0, which is the equivalent of all 2D output only. The opposite value is 1, and the equivalent of 3D output only. Values in-between allow for a mixture of the two, which allows for 2D to 3D pan morphing or vice versa.

+
+

API reference. Setting the 3D Pan Blend can be done with the FMOD_DSP_PAN_3D_PAN_BLEND parameter.

+
+

See Also: 2D vs 3D

+

3D Surround Output Mode: Position

+

For positioning of audio in speakers, setting the 3D position of objects is the key step to correct panning. Panning is based in 3D mode based on the position and orientation of a virtual 'listener' (ie the player / the camera position) vs the sound (or in this case the pan DSP).

+

The pan effect allows more than 1 listener, which is most useful for split screen type scenarios.

+

3D Surround Output Mode: Position
+2 sounds playing in a 3D space (X/Z plane only) with 2 listeners active. The output takes both listeners into account to produce the current gain and pan for a sound.

+
+

API reference. Setting the 3D Position can be done with the FMOD_DSP_PAN_3D_POSITION parameter.

+
+

3D Surround Output Mode: Roll-off

+

Roll-off is the simulation of distance between the listener and the sound source, which translates to gain or in some cases gain of certain frequencies. The further a sound source is from a listener, the quieter it will be. The Roll-off is based on an attenuation curve which is configurable, depending on requirements.

+

Below is a list of the various roll-off modes supported, with a description of its features below. A common control for each roll-off mode is the Minimum Distance and Maximum Distance. These controls help simulate the size of the sound and the space that it is in.

+

Linear Roll-off:
+3D Surround Output Mode: Roll Off Linear
+Linear roll-off keeps the volume unattenuated below the min distance, then attenuates to silence using a linear gradient to silence at the max distance.

+

Linear Squared Roll-off (Default setting):
+3D Surround Output Mode: Roll Off Linear Squared
+Linear Squared roll-off keeps the volume unattenuated below the min distance, then attenuates to silence using a linear squared gradient to silence at the max distance. This gives it a faster roll-off near the min distance, and a slower roll-off nearer to the max distance than linear mode.

+

Inverse Roll-off:
+3D Surround Output Mode: Roll Off Inverse
+Inverse roll-off keeps the volume unattenuated below the min distance, then attenuates at a rate using min distance / distance as the gradient until it reaches max distance where it stops attenuating.

+

Inverse Tapered Roll-off:
+3D Surround Output Mode: Roll Off Inverse Tapered
+Inverse tapered is a combination of Inverse Roll-off and Linear Squared Roll-off. From min distance onwards Inverse is used, then if the gain is lower with Linear Squared, it will switch to that to ensure the gain hits silence at the max distance.

+

Custom Roll-off:
+3D Surround Output Mode: Custom Roll-off
+Custom roll-off can be defined by the programmer setting volume manually. Attenuation in the pan DSP is turned off in this mode.

+
+

API reference. Setting the 3D Roll-off can be done with the FMOD_DSP_PAN_3D_ROLLOFF parameter.

+
+

3D Surround Output Mode: Min Distance

+

The minimum distance, in all roll-off modes is the distance from the listener that the gain starts attenuating.

+

In Custom roll-off mode the Min Distance is ignored.

+
+

API reference. Setting the 3D Min Distance can be done with the FMOD_DSP_PAN_3D_MIN_DISTANCE parameter.

+
+

3D Surround Output Mode: Max Distance

+

The maximum distance, is the distance from the listener that the gain stops attenuating (Inverse roll-off mode), or attenuates to silence (Linear, Linear Squared and Inverse Tapered roll-off modes).

+

In Custom roll-off mode the Max Distance is ignored.

+
+

API reference. Setting the 3D Max Distance can be done with the FMOD_DSP_PAN_3D_MAX_DISTANCE parameter.

+
+

3D Surround Output Mode: Extent Mode

+

In 3D, the speaker distribution method as described in 2D Extent is controlled via a combination of 3D Minimum Extent and and 3D Sound Size.
+Both are controlled manually, automatically, or they can be disabled. In 3D the direction is determined automatically based on 3D positioning.

+

Automatic Mode:
+In Automatic Mode the 3D Sound Size is automatically controlled based on sound source distance from listener (closer = bigger) and works off a base of 2 times the Minimum Distance. 3D Minimum Extent is set to 0.
+3D Surround Output Mode: Extent Auto
+In automatic mode, the signal distribution arc gets smaller as the sound source gets further away from the listener. As it approaches the listener, it gets bigger to distribute the signal throughout more speakers. This alleviates the source signal instantly flipping from one speaker to another if it crosses through the position of the listener.

+

Off Mode:
+In Off Mode the 3D Sound Size is set to 0, and 3D Minimum Extent is set to 0.
+3D Surround Output Mode: Extent Off
+In off mode, the signal distribution arc becomes a point which pinpoints the distribution of the signal into one location, regardless of the sound source distance from the listener.

+

User Mode:
+In User Mode, the 3D Minimum Extent and 3D Sound Size are set by the user using the parameters provided.

+
+

API reference. Setting the 3D Extent Mode can be done with the FMOD_DSP_PAN_3D_EXTENT_MODE parameter.

+
+

3D Surround Output Mode: Sound Size

+

The sound size parameter has an affect on the panner's extent, based on how 'large' the sound is. A very small sound is be concentrated more into a point source (a small extent) and a large sound is spread around the speakers more to convey a sense of envelopment (a large extent).

+

3D Surround Output Mode: Sound Size
+A source signal that is located near a speaker and does not move, but the apparent 'size' of the source changes from small to large, affecting the extent of the pan distribution around the circle.

+

This parameter is only available to be set in 'User' Extent Mode. In 'Automatic' and 'Off' mode, the sound size parameter is set automatically.

+

The sound size's affect on the extent can be clamped to a minimum angle, set with Min Extent.

+
+

API reference. Setting the 3D Sound Size can be done with the FMOD_DSP_PAN_3D_SOUND_SIZE parameter.

+
+

3D Surround Output Mode: Min Extent

+

The min extent parameter has an affect on the panner's extent, by acting as a clamp against the sound size's affect on it. If a sound size becomes small which can reduce the distribution of pan to a point source, the min extent parameter can set an angle to guarantee that the panner does not distribute the signal below this value.

+

3D Surround Output Mode: Min Extent
+A source signal that is located near a speaker and does not move, with the sound size changing from largest to smallest size, but the extent being clamped by at the minimum extent angle, which in this case is set to 180 degrees.

+

This parameter is only available to be set in 'User' Extent Mode. In 'Automatic' and 'Off' mode, the min extent parameter is set to 0.

+
+

API reference. Setting the 3D Min Extent can be done with the FMOD_DSP_PAN_3D_MIN_EXTENT parameter.

+
+

General settings: Enabled Speakers

+

Speakers for target distribution of a source signal can be turned on or off to mute sound in a speaker and have the distribution shifted to other speakers.

+

General settings: Enabled Speakers
+Speakers arbitrarily being turned off and on which alters the distribution of the source signal to the other speakers.

+

Note that signal does not disappear if its location was intended for a particular speaker, it just gets reassigned to other speakers. In a 7.1 speaker layout, if all speakers except for front left / front right were disabled, then sounds that are supposed to play in the back speakers would be mixed down to the front speakers like they would be in a typical stereo speaker output mode.

+
+

API reference. Setting the Enabled Speakers can be done with the FMOD_DSP_PAN_ENABLED_SPEAKERS parameter.

+
+

General settings: LFE Up-mix Enabled

+

LFE Up-mix Enabled determines whether non-LFE source channels should mix to the LFE or not. Default is off, so only an LFE source channel is audible in an LFE output speaker.

+
+

API reference. Setting the LFE Up-mix enabled can be done with the FMOD_DSP_PAN_LFE_UPMIX_ENABLED parameter.

+
+

General settings: Overall Gain

+

A read only parameter that allows the user to query the gain of the Panner based on all of the attenuation calculations.

+

Two values are returned, a linear gain value that represents the volume of the default audible output path of the DSP, and an additive linear gain value that represents the volume of the signal that is sent to other DSPs but not audible from the output of the DSP. This could be a send path to another DSP (See Send) or a send path to a hardware device (See Object Panner).

+
+

API reference. Getting the Overall Gain can be done with the FMOD_DSP_PAN_OVERALL_GAIN parameter.

+
+

General settings: Surround Speaker Mode

+

The surround speaker mode is the output speaker format for the panner. By default it is the same as the speaker mode selected for the user or by the user after the System's initialization.

+
+

API reference. Setting the Surround Speaker Mode can be done with the FMOD_DSP_PAN_SURROUND_SPEAKER_MODE parameter.

+
+

See Also: FMOD_DSP_TYPE_PAN

+

Performance

+

Pan is a low overhead effect.

+
+

10.1.20 Pitch Shifter

+

A pitch shifter can be used to change the pitch of a sound without affecting the duration of playback.

+

The pitch shifter uses a transform algorithm (FFT) to convert the signal from the time domain to the frequency domain. The signal is manipulated to shift sinusoidal bands by the specified amount, then the signal is re-synthesized back into the time domain into a standard PCM signal.

+

This effect can also be used for time stretching or scaling, by shifting the pitch then altering the playback frequency in the other direction proportionally. As an example if the pitch was doubled, and the frequency of the sound was halved, the pitch of the sound would sound correct but it would be twice as slow.

+

This pitch shifter is based on the pitch shifter code at http://www.dspdimension.com, written by Stephan M. Bernsee. The original code is COPYRIGHT 1999-2003 Stephan M. Bernsee - smb@dspdimension.com under the Wide Open License (WOL).

+

The pitch shifter effect is controllable by the parameters:

+
    +
  • Pitch - The pitch can be set with a single linear value, which ranges from 0.5 octaves to 2.0 octaves, with a default of 1 which equals no pitch change. Set with FMOD_DSP_PITCHSHIFT_PITCH.
  • +
  • FFT size - Quality can be altered with the FFT window size which ranges from 256 to 4096 with a default of 1024. Set with FMOD_DSP_PITCHSHIFT_FFTSIZE.
  • +
  • Max channels - For performance reasons the maximum signal channel count support is pre-set to the channel count equal to the output speaker mode's channel count. On a Channel object it may be desirable to set it to a higher count if the sound playing on the channel has a higher channel count than the speaker mode. Set with FMOD_DSP_PITCHSHIFT_MAXCHANNELS.
  • +
+

See Also: FMOD_DSP_TYPE_PITCHSHIFT

+

Performance

+

Pitch Shifter is a high overhead effect.

+

This filter is computationally expensive. Reducing the signal from stereo to mono halves the cpu usage. FFT Window size also improves performance at smaller sizes. Reducing window size lowers audio quality, but which settings to use are largely dependant on the sound being played. A noisy polyphonic signal needs a larger fft size compared to a speaking voice for example.

+
+

10.1.21 Return

+

The use of a return effect is to receive a routed audio signal from a different location than its standard input inside the DSP graph.

+

A return effect receives routed audio from its partner DSP, the Send effect.

+

Return
+A DSP graph showing a send and return deviating the signal from its normal signal flow, sending a copy of the signal (visible as gray dashed arrow) from the send, and receiving it on the return.

+

The return effect is controllable by the parameters:

+
    +
  • Speaker mode - The speaker mode of the receiving buffer can be set to a known speaker mode, or it can be left to automatically select, which is the default. Set with FMOD_DSP_RETURN_INPUT_SPEAKER_MODE.
  • +
+

The return effect can query the parameters:

+
    +
  • Return ID - The index that the Send effect will use for the 'Return ID' destination parameter. Get with FMOD_DSP_RETURN_ID.
  • +
+

Note that upon receiving the signal, it is buffered and therefore will incur one mix block of latency.

+

See Also: FMOD_DSP_TYPE_RETURN

+

Performance

+

Return is a low overhead effect.

+
+

10.1.22 Send

+

The use of a send effect is to route an audio signal to a different location than its standard output inside the DSP graph.

+

A send effect routes its audio to a partner DSP, the return effect.
+Return
+A DSP graph showing a send and return deviating the signal from its normal signal flow, sending the signal (visible as grey dashed arrow) from the send, and receiving it on the return.

+

The send effect is controllable by the parameters:

+ +

Note that upon receiving the signal on the return side, it is buffered and therefore will incur one mix block of latency.

+

See Also: FMOD_DSP_TYPE_SEND

+

Performance

+

Send is a low overhead effect.

+
+

10.1.23 SFX Reverb

+

The SFX reverb effect is a high quality I3DL2 based reverb to simulate an acoustic space. It is highly configurable so the many parameters can be altered to simulate small and wide open spaces.

+

SFX Reverb is a time domain low CPU cost with high quality and flexibility. Because it is parametric, there is great control over the characteristics of the reverb, and it also means that reverb can change or morph over time from one preset to another.

+

SFX Reverb
+A diagram of the layout of time domain reverb. There is the original signal (direct) followed by some early reflected copies of the original signal (early reflections) then a diffused version of the original which decays over time (late reflections/reverb) to silence.

+

The SFX reverb effect is controllable by the parameters:

+ +

The reverb can be controlled with simple to understand presets. The current preset list is:

+
    +
  • Off
  • +
  • Generic
  • +
  • Padded Cell
  • +
  • Room
  • +
  • Bath room
  • +
  • Living room
  • +
  • Stone room
  • +
  • Auditorium
  • +
  • Concert Hall
  • +
  • Cave
  • +
  • Arena
  • +
  • Hangar
  • +
  • Stone Corridor
  • +
  • Alley
  • +
  • Forest
  • +
  • City
  • +
  • Mountains
  • +
  • Quarry
  • +
  • Plain
  • +
  • Parking Lot
  • +
  • Sewer Pipe
  • +
  • Under Water
  • +
+
+

API reference. Reverb presets can be set with FMOD_REVERB_PRESETS.

+
+

See Also: FMOD_DSP_TYPE_SFXREVERB

+

Performance

+

SFX Reverb is a medium overhead effect.

+
+

10.1.24 Three EQ

+

The three EQ effect is a three band equalizer. It splits the signal into lows, mids and highs, and allows each band to be attenuated (potentially all the way down to silence) or boosted.

+

For each band, the frequencies can be modified with the low/mid crossover frequency and the mid/high crossover frequency controls. The shape of the cross-over slow can also be changed for the bands, with 12 dB, 24 dB and 48 dB options available.

+

Three EQ curves
+The Three EQ and the (L)ow / (M)id / (H)igh frequency bands each at 0 dB attenuation, with their cross over points displayed as the dotted lines and slope set to 12 dB. Alternate crossover slopes are shown in a lighter tone for 24 and 48 dB.

+

The three EQ effect is controllable by the parameters:

+ +

See Also: FMOD_DSP_TYPE_THREE_EQ

+

Performance

+

Three EQ is a low overhead effect.

+

With the 12, 24 or 48 dB variations, this indicates whether the filter is run once (12dB), twice (24dB) or four times (48dB) to achieve steeper roll off curves. Performance scales linearly with the number of times the filter is run, therefore a 48dB filter (which runs four times) has approximately four times the CPU cost as a single 12dB filter with some reduction due to optimizations.

+
+

10.1.25 Transceiver

+

Like the Send and Return effects, the transceiver effect has the same capability bundled into one effect, with the extra capability to route an audio signal to up to 32 'stations' which any other transceiver could receive audio from. This means one transmitting transceiver's signal could be received by an unlimited number of transceivers in 'receive' mode, making that signal audible in multiple different parts of the DSP graph. In a 3D world, this could be 1 expensive emitter (i.e.: a stream) being broadcast to different 3D locations around the world simultaneously, at low CPU cost.

+

The transceiver transmits and receives to a global array of 32 channels. The transceiver can be set to receiver mode (like a return) and can receive the signal at a variable gain. The transceiver can also be set to transmit to a channel (like a send) and can transmit the signal with a variable gain.

+

Transceiver
+Sounds being transmitted by 2 transceivers in transmit mode, one sound transmitting to channel 0, and the other to channel 1. There is then a 3D scene with 5 transceivers tuned to either channel 0 or 1, which lets then broadcast the transmitted signal from different locations simultaneously.

+

Characteristics of the transceiver effect:

+
    +
  • Upon receiving the signal on the receive side, it is buffered and therefore will incur one mix block of latency.
  • +
  • Multiple transmitters sending to the same channel are mixed together.
  • +
+

The transceiver effect is controllable by the parameters:

+
    +
  • Transmit mode - The transceiver can be set to 'transmitter' mode, or 'receiver' mode. Set with FMOD_DSP_TRANSCEIVER_TRANSMIT parameter.
  • +
  • Transmit or receive gain - Set with a range of -80 dB to +10 dB and a default of 0dB. Set with FMOD_DSP_TRANSCEIVER_GAIN parameter.
  • +
  • Transmit speaker mode - This can be set to either mono, stereo or surround. Surround is the speaker mode of the System. If in receive mode, the speaker mode has no effect. Set with the FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE.
  • +
+

Transmitting different speaker modes to the same channel: Each transmitter can transmit in its preferred speaker mode of mono, stereo or surround. At the receive end, if there are multiple signals of different speaker modes in the same channel, it mixes them all together into the highest speaker format and use that.

+

See Also: FMOD_DSP_TYPE_TRANSCEIVER

+

Performance

+

To reduce memory overhead, aim to use the same transmit speaker mode for 1 channel.

+

Transceiver is a low overhead effect.

+
+

10.1.26 Tremolo

+

The tremolo effect varies the amplitude of a sound with a low frequency oscillator, which results in periodic volume changes. Depending on the settings, this unit can produce a tremolo, chopper, or auto-pan effect.

+

The tremolo effect is controllable by the parameters:

+
    +
  • Shape - The shape of the LFO (Low Frequency Oscillator) can set to sine, triangle and sawtooth waves by adjusting the this parameter. Set with FMOD_DSP_TREMOLO_SHAPE.
  • +
  • Skew - The time skewing of the LFO (Low Frequency Oscillator) cycle can be set with a linear value between 0 and 1, with a default of 0.5. Set with FMOD_DSP_TREMOLO_SHAPE and FMOD_DSP_TREMOLO_SKEW parameters.
  • +
  • Frequency - The speed of the LFO can be set in Hz, with a range of 0.1 Hz to 20 Hz and a default of 5 Hz. Set with FMOD_DSP_TREMOLO_FREQUENCY.
  • +
  • Depth - The depth of the LFO can be set with a linear value from 0 to 1 where 0 is no tremolo and 1 is full. Default is 1. Set with FMOD_DSP_TREMOLO_DEPTH.
  • +
  • Duty / Square - Duty and Square attributes are useful for a chopper-type effect where the first controls the on-time duration and second controls the flatness of the envelope. Set with FMOD_DSP_TREMOLO_DUTY and FMOD_DSP_TREMOLO_SQUARE parameters.
  • +
  • Spread - The Spread attribute varies the LFO phase between channels to get an auto-pan effect. This works best with a sine shape LFO. Set with FMOD_DSP_TREMOLO_SPREAD.
  • +
  • Phase - The LFO can be synchronized using the phase parameter which sets its instantaneous phase. Set with FMOD_DSP_TREMOLO_PHASE.
  • +
+

See Also: FMOD_DSP_TYPE_TREMOLO

+

Performance

+

Tremolo is a low overhead effect.

+
+

10.2 Legacy Effects

+

High-level descriptions of built effects that are superseded by newer improved effects.

+

10.2.1 High Pass

+

Resonant high pass filter effect.

+
+

Development Status. Deprecated and will be removed in a future release

+
+

Use Multiband Equalizer as a replacement.

+

See Also: FMOD_DSP_TYPE_HIGHPASS

+

Performance

+

High Pass is a low overhead effect.

+
+

10.2.2 High Pass Simple

+

This is a very simple single-order high pass filter. The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.

+
+

Development Status. Deprecated and will be removed in a future release

+
+

Use Multiband Equalizer as a replacement.

+

See Also: FMOD_DSP_TYPE_HIGHPASS_SIMPLE

+

Performance

+

High Pass Simple is a low overhead effect.

+
+

10.2.3 Low Pass

+

A resonant low pass filter effect.

+
+

Development Status. Deprecated and will be removed in a future release

+
+

Use Multiband Equalizer as a replacement.

+

See Also: FMOD_DSP_TYPE_LOWPASS

+

Performance

+

Low Pass is a medium overhead effect.

+
+

10.2.4 Low Pass Simple

+

This is a very simple low pass filter effect, based on two single-pole RC time-constant modules.

+

The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.

+
+

Development Status. Deprecated and will be removed in a future release

+
+

Use Multiband Equalizer as a replacement.

+

See Also: FMOD_DSP_TYPE_LOWPASS_SIMPLE

+

Performance

+

Low Pass Simple is a low overhead effect.

+
+

10.2.5 Parametric EQ

+

Parametric EQ is a single band peaking EQ filter effect that attenuates or amplifies a selected frequency and its neighboring frequencies.

+

When a frequency has its gain set to 1.0, the sound is unaffected and represents the original signal exactly.

+
+

Development Status. Deprecated and will be removed in a future release

+
+

Use Multiband Equalizer as a replacement.

+

See Also: FMOD_DSP_TYPE_PARAMEQ

+

Performance

+

Parametric EQ is a medium overhead effect.

+
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/fsbank-api.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/fsbank-api.html new file mode 100644 index 0000000..d07f8a1 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/fsbank-api.html @@ -0,0 +1,709 @@ + + +FSBank API Reference + + + + +
+ +
+

8. FSBank API Reference

+ +

8.1 FSBank_Init

+

Initialize the FSBank system.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_Init(
+  FSBANK_FSBVERSION version,
+  FSBANK_INITFLAGS flags,
+  unsigned int numSimultaneousJobs,
+  const char *cacheDirectory
+);
+
+ +
+
version
+
FSB version, currently only FSBANK_FSBVERSION_FSB5 is supported. (FSBANK_FSBVERSION)
+
flags
+
Initialization flags which control how the system behaves. (FSBANK_INITFLAGS)
+
numSimultaneousJobs
+
The maximum number of threads to create for parallel encoding. Set this to your number of CPU 'cores' for best performance.
+
cacheDirectory Opt
+
Location to store the temporary cache files, default is a directory off the current working directory.
+
+

See Also: FSBank_Release

+

8.2 FSBank_Build

+

Begin the building process for the provided subsound descriptions.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_Build(
+  const FSBANK_SUBSOUND *subSounds,
+  unsigned int numSubSounds,
+  FSBANK_FORMAT encodeFormat,
+  FSBANK_BUILDFLAGS buildFlags,
+  unsigned int quality,
+  const char *encryptKey,
+  const char *outputFileName
+);
+
+ +
+
subSounds
+
Array of subsound descriptions each defining one subsound for the FSB. (FSBANK_SUBSOUND)
+
numSubSounds
+
Number of elements in subSounds.
+
encodeFormat
+
FSB encoding format. (FSBANK_FORMAT)
+
buildFlags
+
Building flags which control how the sample data is encoded. (FSBANK_BUILDFLAGS)
+
quality
+
Controls the post compression quality level. From 1 (high compression / low quality) to 100 (high quality / low compression), use 0 for default quality. See remarks for format specific usage.
+
encryptKey Opt
+
Key used to encrypt the FSB. Same key is required at runtime for decryption.
+
outputFileName Out
+
Path of the FSB to produce.
+
+

Format specific quality interpretation:

+
    +
  • AT9 - Bitrate (Kbps) depends on channel count, quality [1 to 100] maps linearly to the available options
  • +
  • 1ch = [36, 48, 60, 72, 84, 96]
  • +
  • 2ch = [72, 96, 120, 144, 168, 192]
  • +
  • MPEG - Bitrate (Kbps) = FMOD quality * 3.2
  • +
  • Vorbis - Vorbis quality [-0.1 to 1.0] maps linearly to FMOD quality [1 to 100] based on: Vorbis_Quality = ((FMOD_Quality - 1) / 90.0f) - 0.1f
  • +
  • XMA - XMA quality = FMOD quality
  • +
  • Opus - Opus per-channel bitrate (Kbps) [0.8 to 64] maps linearly to FMOD quality [1 to 80], then bitrate [67.2 to 128] to quality [81 to 100]
  • +
+

Build function will block until complete.

+

8.3 FSBank_BuildCancel

+

Halt the build in progress.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_BuildCancel();
+
+ +

Must be called from a different thread to FSBank_Build

+

See Also: FSBank_Build

+

8.4 FSBank_Release

+

Release the FSBank system, clean up used resources.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_Release();
+
+ +

All progress items retrieved with FSBank_FetchNextProgressItem will be released by this function.

+

See Also: FSBank_Init, FSBank_FetchNextProgressItem

+

8.5 FSBank_ReleaseProgressItem

+

Release memory associated with a progress item.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_ReleaseProgressItem(
+  const FSBANK_PROGRESSITEM *progressItem
+);
+
+ +
+
progressItem
+
One status update about the progress of a particular subsound. (FSBANK_PROGRESSITEM)
+
+

See Also: FSBank_FetchNextProgressItem

+

8.6 FSBank_MemoryGetStats

+

Query the current and maximum memory usage of the FSBank system.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_MemoryGetStats(
+  unsigned int *currentAllocated,
+  unsigned int *maximumAllocated
+);
+
+ +
+
currentAllocated
+
Address of a variable that receives the currently allocated memory at time of call. Optional. Specify 0 or NULL to ignore.
+
maximumAllocated
+
Address of a variable that receives the maximum allocated memory since FSBank_Init. Optional. Specify 0 or NULL to ignore.
+
+

8.7 FSBank_MemoryInit

+

Specifies a method for FSBank to allocate memory through callbacks.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_MemoryInit(
+  FSBANK_MEMORY_ALLOC_CALLBACK userAlloc,
+  FSBANK_MEMORY_REALLOC_CALLBACK userRealloc,
+  FSBANK_MEMORY_FREE_CALLBACK userFree
+);
+
+ +
+
userAlloc
+
Overrides the internal calls to alloc. Compatible with ANSI malloc(). (FSBANK_MEMORY_ALLOC_CALLBACK)
+
userRealloc
+
Overrides the internal calls to realloc. Compatible with ANSI realloc(). (FSBANK_MEMORY_REALLOC_CALLBACK)
+
userFree
+
Overrides the internal calls to free. Compatible with ANSI free(). (FSBANK_MEMORY_FREE_CALLBACK)
+
+

8.8 FSBank_FetchFSBMemory

+

Fetch the built FSB data from memory.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_FetchFSBMemory(
+  const void **data,
+  unsigned int *length
+);
+
+ +
+
data
+
Built FSB data.
+
length
+
+

Length of 'data'.

+
    +
  • Units: Bytes
  • +
+
+
+

Requires FSBank_Build to be called with outputFileName is set to NULL.

+

The memory allocated as part of FSBank_Build will be freed automatically by the next FSBank_Build or FSBank_Release.

+

See Also: FSBank_Build, FSBank_Release

+

8.9 FSBank_FetchNextProgressItem

+

Fetch build progress items that describe the current state of the build.

+

+

+
C
+
+

+
FSBANK_RESULT FSBank_FetchNextProgressItem(
+  const FSBANK_PROGRESSITEM **progressItem
+);
+
+ +
+
progressItem
+
One status update about the progress of a particular subsound. (FSBANK_PROGRESSITEM)
+
+

Can be called while the build is in progress to get realtime updates or after the build for a report. Call FSBank_ReleaseProgressItem to free allocated memory.

+

8.10 FSBANK_MEMORY_ALLOC_CALLBACK

+

Callback to allocate a block of memory.

+

+

+
C
+
+

+
void * FSBANK_CALLBACK FSBANK_MEMORY_ALLOC_CALLBACK(
+  unsigned int size,
+  unsigned int type,
+  const char *sourceStr
+);
+
+ +
+
size
+
Size in bytes of the memory block to be allocated and returned.
+
type
+
Type of memory allocation.
+
sourceStr
+
Only valid (not null) in logging versions of FMOD. Gives a string with the fmod source code filename and line number in it, for better resource tracking.
+
+

Returning an aligned pointer, of 16 byte alignment is recommended for speed purposes.

+

See Also: FSBank_MemoryInit, FSBANK_MEMORY_REALLOC_CALLBACK, FSBANK_MEMORY_FREE_CALLBACK

+

8.11 FSBANK_MEMORY_FREE_CALLBACK

+

Callback to free a block of memory.

+

+

+
C
+
+

+
void FSBANK_CALLBACK FSBANK_MEMORY_FREE_CALLBACK(
+  void *ptr,
+  unsigned int type,
+  const char *sourceStr
+);
+
+ +
+
ptr
+
Pointer to a pre-existing block of memory to be freed.
+
type
+
Type of memory to be freed.
+
sourceStr
+
Only valid (not null) in logging versions of FMOD. Gives a string with the fmod source code filename and line number in it, for better resource tracking.
+
+

See Also: FSBank_MemoryInit, FSBANK_MEMORY_ALLOC_CALLBACK, FSBANK_MEMORY_REALLOC_CALLBACK

+

8.12 FSBANK_MEMORY_REALLOC_CALLBACK

+

Callback to re-allocate a block of memory to a different size.

+

+

+
C
+
+

+
void * FSBANK_CALLBACK FSBANK_MEMORY_REALLOC_CALLBACK(
+  void *ptr,
+  unsigned int size,
+  unsigned int type,
+  const char *sourceStr
+);
+
+ +
+
ptr
+
Pointer to a block of memory to be resized. If this is NULL then a new block of memory is simply allocated.
+
size
+
Size of the memory to be reallocated. The original memory must be preserved.
+
type
+
Type of memory allocation.
+
sourceStr
+
Only valid (not null) in logging versions of FMOD. Gives a string with the fmod source code filename and line number in it, for better resource tracking.
+
+

Returning an aligned pointer, of 16 byte alignment is recommended for speed purposes.

+

See Also: FSBank_MemoryInit, FSBANK_MEMORY_ALLOC_CALLBACK, FSBANK_MEMORY_FREE_CALLBACK

+

8.13 FSBANK_INITFLAGS

+

Bit fields to control the general operation of the library.

+

+

+
C
+
+

+
#define FSBANK_INIT_NORMAL                  0x00000000
+#define FSBANK_INIT_IGNOREERRORS            0x00000001
+#define FSBANK_INIT_WARNINGSASERRORS        0x00000002
+#define FSBANK_INIT_CREATEINCLUDEHEADER     0x00000004
+#define FSBANK_INIT_DONTLOADCACHEFILES      0x00000008
+#define FSBANK_INIT_GENERATEPROGRESSITEMS   0x00000010
+
+ +
+
FSBANK_INIT_NORMAL
+
Initialize normally.
+
FSBANK_INIT_IGNOREERRORS
+
Ignore individual subsound build errors, continue building for as long as possible.
+
FSBANK_INIT_WARNINGSASERRORS
+
Treat any warnings issued as errors.
+
FSBANK_INIT_CREATEINCLUDEHEADER
+
Create C header files with #defines defining indices for each member of the FSB.
+
FSBANK_INIT_DONTLOADCACHEFILES
+
Ignore existing cache files.
+
FSBANK_INIT_GENERATEPROGRESSITEMS
+
Generate status items that can be queried by another thread to monitor the build progress and give detailed error messages.
+
+

See Also: FSBank_Init

+

8.14 FSBANK_BUILDFLAGS

+

Bit fields to control how subsounds are encoded.

+

+

+
C
+
+

+
#define FSBANK_BUILD_DEFAULT                 0x00000000
+#define FSBANK_BUILD_DISABLESYNCPOINTS       0x00000001
+#define FSBANK_BUILD_DONTLOOP                0x00000002
+#define FSBANK_BUILD_FILTERHIGHFREQ          0x00000004
+#define FSBANK_BUILD_DISABLESEEKING          0x00000008
+#define FSBANK_BUILD_OPTIMIZESAMPLERATE      0x00000010
+#define FSBANK_BUILD_FSB5_DONTWRITENAMES     0x00000080
+#define FSBANK_BUILD_NOGUID                  0x00000100
+#define FSBANK_BUILD_WRITEPEAKVOLUME         0x00000200
+#define FSBANK_BUILD_ALIGN4K                 0x00000400
+#define FSBANK_BUILD_OVERRIDE_MASK           (FSBANK_BUILD_DISABLESYNCPOINTS | FSBANK_BUILD_DONTLOOP | FSBANK_BUILD_FILTERHIGHFREQ | FSBANK_BUILD_DISABLESEEKING | FSBANK_BUILD_OPTIMIZESAMPLERATE | FSBANK_BUILD_WRITEPEAKVOLUME)
+#define FSBANK_BUILD_CACHE_VALIDATION_MASK   (FSBANK_BUILD_DONTLOOP | FSBANK_BUILD_FILTERHIGHFREQ | FSBANK_BUILD_OPTIMIZESAMPLERATE)
+
+ +
+
FSBANK_BUILD_DEFAULT
+
Build with default settings.
+
FSBANK_BUILD_DISABLESYNCPOINTS
+
Disable the storing of syncpoints in the output
+
FSBANK_BUILD_DONTLOOP
+
Disable perfect loop encoding and sound stretching. Removes chirps from the start of oneshot MP2, MP3 and IMAADPCM sounds.
+
FSBANK_BUILD_FILTERHIGHFREQ
+
XMA only. Enable high frequency filtering.
+
FSBANK_BUILD_DISABLESEEKING
+
XMA only. Disable seek tables to save memory.
+
FSBANK_BUILD_OPTIMIZESAMPLERATE
+
Attempt to optimize the sample rate down. Ignored if format is MP2, MP3 or if FSB4 basic headers flag is used.
+
FSBANK_BUILD_FSB5_DONTWRITENAMES
+
Do not write out a names chunk to the FSB to reduce file size.
+
FSBANK_BUILD_NOGUID
+
Write out a null GUID for the FSB header. The engine will not use header caching for these FSB files.
+
FSBANK_BUILD_WRITEPEAKVOLUME
+
Write peak volume for all subsounds.
+
FSBANK_BUILD_ALIGN4K
+
Opus, Vorbis and FADPCM only. Align large sample data to a 4KB boundary to improve binary patching in distribution systems that operate in 4KB blocks (Microsoft).
+
FSBANK_BUILD_OVERRIDE_MASK
+
Build flag mask that specifies which settings can be overridden per subsound.
+
FSBANK_BUILD_CACHE_VALIDATION_MASK
+
Build flag mask that specifies which settings (when changed) invalidate a cache file.
+
+

See Also: FSBank_Init, FSBANK_SUBSOUND

+

8.15 FSBANK_FORMAT

+

Compression formats available for encoding

+

+

+
C
+
+

+
typedef enum FSBANK_FORMAT {
+  FSBANK_FORMAT_PCM,
+  FSBANK_FORMAT_XMA,
+  FSBANK_FORMAT_AT9,
+  FSBANK_FORMAT_VORBIS,
+  FSBANK_FORMAT_FADPCM,
+  FSBANK_FORMAT_OPUS,
+  FSBANK_FORMAT_MAX
+} FSBANK_FORMAT;
+
+ +
+
FSBANK_FORMAT_PCM
+
PCM (1:1) All platforms.
+
FSBANK_FORMAT_XMA
+
XMA (VBR) XboxOne and Xbox Series X|S only (hardware). Depends on xmaencoder.
+
FSBANK_FORMAT_AT9
+
ATRAC9 (CBR) PS4 and PS5 only (hardware). Depends on libatrac9.
+
FSBANK_FORMAT_VORBIS
+
Vorbis (VBR) All platforms. Depends on libvorbis.
+
FSBANK_FORMAT_FADPCM
+
FMOD ADPCM (3.5:1) All platforms.
+
FSBANK_FORMAT_OPUS
+
Opus (VBR) Xbox Series X|S, PS5, and Switch. Depends on opus.
+
FSBANK_FORMAT_MAX
+
Upper bound for this enumeration, for use with validation.
+
+

See Also: FSBank_Build

+

8.16 FSBANK_FSBVERSION

+

Version of FSB to write out.

+

+

+
C
+
+

+
typedef enum FSBANK_FSBVERSION {
+  FSBANK_FSBVERSION_FSB5,
+  FSBANK_FSBVERSION_MAX
+} FSBANK_FSBVERSION;
+
+ +
+
FSBANK_FSBVERSION_FSB5
+
Produce FSB version 5 files.
+
FSBANK_FSBVERSION_MAX
+
Upper bound for this enumeration, for use with validation.
+
+

See Also: FSBank_Init

+

8.17 FSBANK_PROGRESSITEM

+

Status information describing the progress of a build.

+

+

+
C
+
+

+
typedef struct FSBANK_PROGRESSITEM {
+  int            subSoundIndex;
+  int            threadIndex;
+  FSBANK_STATE   state;
+  const void    *stateData;
+} FSBANK_PROGRESSITEM;
+
+ +
+
subSoundIndex
+
Index into the subsound list passed to FSBank_Build that this update relates to (-1 indicates no specific subsound).
+
threadIndex
+
Which thread index is serving this update (-1 indicates FSBank_Build / main thread).
+
state
+
Progress through the encoding process. (FSBANK_STATE)
+
stateData
+
Cast to state specific data structure for extra information.
+
+

See Also: FSBank_Build, FSBank_FetchNextProgressItem, FSBank_ReleaseProgressItem, FSBANK_STATE

+

8.18 FSBANK_RESULT

+

Error codes returned from every function.

+

+

+
C
+
+

+
typedef enum FSBANK_RESULT {
+  FSBANK_OK,
+  FSBANK_ERR_CACHE_CHUNKNOTFOUND,
+  FSBANK_ERR_CANCELLED,
+  FSBANK_ERR_CANNOT_CONTINUE,
+  FSBANK_ERR_ENCODER,
+  FSBANK_ERR_ENCODER_INIT,
+  FSBANK_ERR_ENCODER_NOTSUPPORTED,
+  FSBANK_ERR_FILE_OS,
+  FSBANK_ERR_FILE_NOTFOUND,
+  FSBANK_ERR_FMOD,
+  FSBANK_ERR_INITIALIZED,
+  FSBANK_ERR_INVALID_FORMAT,
+  FSBANK_ERR_INVALID_PARAM,
+  FSBANK_ERR_MEMORY,
+  FSBANK_ERR_UNINITIALIZED,
+  FSBANK_ERR_WRITER_FORMAT,
+  FSBANK_WARN_CANNOTLOOP,
+  FSBANK_WARN_IGNORED_FILTERHIGHFREQ,
+  FSBANK_WARN_IGNORED_DISABLESEEKING,
+  FSBANK_WARN_FORCED_DONTWRITENAMES,
+  FSBANK_ERR_ENCODER_FILE_NOTFOUND,
+  FSBANK_ERR_ENCODER_FILE_BAD,
+  FSBANK_WARN_IGNORED_ALIGN4K,
+} FSBANK_RESULT;
+
+ +
+
FSBANK_OK
+
No errors.
+
FSBANK_ERR_CACHE_CHUNKNOTFOUND
+
An expected chunk is missing from the cache, perhaps try deleting cache files.
+
FSBANK_ERR_CANCELLED
+
The build process was cancelled during compilation by the user.
+
FSBANK_ERR_CANNOT_CONTINUE
+
The build process cannot continue due to previously ignored errors.
+
FSBANK_ERR_ENCODER
+
Encoder for chosen format has encountered an unexpected error.
+
FSBANK_ERR_ENCODER_INIT
+
Encoder initialization failed.
+
FSBANK_ERR_ENCODER_NOTSUPPORTED
+
Encoder for chosen format is not supported on this platform.
+
FSBANK_ERR_FILE_OS
+
An operating system based file error was encountered.
+
FSBANK_ERR_FILE_NOTFOUND
+
A specified file could not be found.
+
FSBANK_ERR_FMOD
+
Internal error from FMOD sub-system.
+
FSBANK_ERR_INITIALIZED
+
Already initialized.
+
FSBANK_ERR_INVALID_FORMAT
+
The format of the source file is invalid.
+
FSBANK_ERR_INVALID_PARAM
+
An invalid parameter has been passed to this function.
+
FSBANK_ERR_MEMORY
+
Ran out of memory.
+
FSBANK_ERR_UNINITIALIZED
+
Not initialized yet.
+
FSBANK_ERR_WRITER_FORMAT
+
Chosen encode format is not supported by this FSB version.
+
FSBANK_WARN_CANNOTLOOP
+
Source file is too short for seamless looping. Looping disabled.
+
FSBANK_WARN_IGNORED_FILTERHIGHFREQ
+
FSBANK_BUILD_FILTERHIGHFREQ flag ignored: feature only supported by XMA format.
+
FSBANK_WARN_IGNORED_DISABLESEEKING
+
FSBANK_BUILD_DISABLESEEKING flag ignored: feature only supported by XMA format.
+
FSBANK_WARN_FORCED_DONTWRITENAMES
+
FSBANK_BUILD_FSB5_DONTWRITENAMES flag forced: cannot write names when source is from memory.
+
FSBANK_ERR_ENCODER_FILE_NOTFOUND
+
External encoder dynamic library not found
+
FSBANK_ERR_ENCODER_FILE_BAD
+
External encoder dynamic library could not be loaded, possibly incorrect binary format, incorrect architecture, file corruption
+
FSBANK_WARN_IGNORED_ALIGN4K
+
FSBANK_BUILD_ALIGN4K flag ignored: feature only supported by Opus, Vorbis, and FADPCM formats.
+
+

8.19 FSBANK_STATE

+

Current state during the build process.

+

+

+
C
+
+

+
typedef enum FSBANK_STATE {
+  FSBANK_STATE_DECODING,
+  FSBANK_STATE_ANALYSING,
+  FSBANK_STATE_PREPROCESSING,
+  FSBANK_STATE_ENCODING,
+  FSBANK_STATE_WRITING,
+  FSBANK_STATE_FINISHED,
+  FSBANK_STATE_FAILED,
+  FSBANK_STATE_WARNING
+} FSBANK_STATE;
+
+ +
+
FSBANK_STATE_DECODING
+
Decode a file to usable raw sample data.
+
FSBANK_STATE_ANALYSING
+
Scan sound data for details (such as optimized sample rate).
+
FSBANK_STATE_PREPROCESSING
+
Prepares sound data for encoder.
+
FSBANK_STATE_ENCODING
+
Pass the sample data to the chosen encoder.
+
FSBANK_STATE_WRITING
+
Write encoded data into an FSB.
+
FSBANK_STATE_FINISHED
+
Process complete.
+
FSBANK_STATE_FAILED
+
An error has occurred, check data (as FSBANK_STATEDATA_FAILED) for details.
+
FSBANK_STATE_WARNING
+
A warning has been issued, check data (as FSBANK_STATEDATA_WARNING) for details.
+
+

See Also: FSBANK_PROGRESSITEM

+

8.20 FSBANK_STATEDATA_FAILED

+

Extra failed state data.

+

+

+
C
+
+

+
typedef struct FSBANK_STATEDATA_FAILED {
+  FSBANK_RESULT   errorCode;
+  char            errorString[256];
+} FSBANK_STATEDATA_FAILED;
+
+ +
+
errorCode
+
Error result code. (FSBANK_RESULT)
+
errorString
+
Description for error code.
+
+

Cast stateData in FSBANK_PROGRESSITEM to this struct if the state is FSBANK_STATE_FAILED

+

8.21 FSBANK_STATEDATA_WARNING

+

Extra warning state data.

+

+

+
C
+
+

+
typedef struct FSBANK_STATEDATA_WARNING {
+  FSBANK_RESULT   warnCode;
+  char            warningString[256];
+} FSBANK_STATEDATA_WARNING;
+
+ +
+
warnCode
+
Warning result code. (FSBANK_RESULT)
+
warningString
+
Description for warning code.
+
+

Cast stateData in FSBANK_PROGRESSITEM to this struct if the state is FSBANK_STATE_WARNING

+

8.22 FSBANK_SUBSOUND

+

Representation of how to encode a single subsound in the final FSB.

+

+

+
C
+
+

+
typedef struct FSBANK_SUBSOUND {
+  const char* const   *fileNames;
+  const void* const   *fileData;
+  const unsigned int   *fileDataLengths;
+  unsigned int         numFiles;
+  FSBANK_BUILDFLAGS    overrideFlags;
+  unsigned int         overrideQuality;
+  float                desiredSampleRate;
+  float                percentOptimizedRate;
+} FSBANK_SUBSOUND;
+
+ +
+
fileNames
+
List of file names (instead of FSBANK_SUBSOUND::fileData) used to produce an interleaved sound. (UTF-8 string)
+
fileData
+
List of file data pointers (instead of FSBANK_SUBSOUND::fileNames) used to produce an interleaved sound.
+
fileDataLengths
+
List of file data lengths corresponding to the items in the FSBANK_SUBSOUND::fileData list.
+
numFiles
+
Number of items in either FSBANK_SUBSOUND::fileData / FSBANK_SUBSOUND::fileDataLengths or FSBANK_SUBSOUND::fileNames.
+
overrideFlags
+
Flags that will reverse the equivalent flags passed to FSBank_Build. (FSBANK_BUILDFLAGS)
+
overrideQuality
+
Override the quality setting passed to FSBank_Build.
+
desiredSampleRate
+
Resample to this sample rate (ignores optimize sample rate setting), up to 192000Hz.
+
percentOptimizedRate
+
If using FSBANK_BUILD_OPTIMIZESAMPLERATE, this is the percentage of that rate to be used, up to 100.0%.
+
+

See Also: FSBank_Build, FSBANK_BUILD_OPTIMIZESAMPLERATE, FSBANK_BUILDFLAGS

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/glossary.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/glossary.html new file mode 100644 index 0000000..9059b6b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/glossary.html @@ -0,0 +1,685 @@ + + +Glossary + + + + +
+ +
+

12. Glossary

+

12.1 2D vs 3D

+

A 3D sound source is a Channel that has a position and a velocity in space. When a 3D Channel is playing, its volume, speaker placement and pitch will be affected automatically based on the relation to the listener.

+

A listener is typically the location of the player or the game camera. It has a position and velocity like a sound source, but it also has an orientation.

+

3D Sound behaviour:

+
    +
  • Volume is affected by the relative distance of the listener and the source.
  • +
  • Pitch is affected by the relative velocity of the listener and the source (This causes the doppler effect).
  • +
  • Pan is affected by the relative orientation of the listener to the position of the source.
  • +
+

2D Sound behaviour:

+ +

Note: You can blend between a 3D mix and a 2D mix with ChannelControl::set3DLevel.

+

For a more detailed description of 3D sound behaviour, read the tutorial on the topic.

+

12.2 Asset

+

An audio asset is a prerecorded sound that could potentially be used in a game. Assets can be loose audio files, or can be built into bank files or FSBs.

+

12.3 Audio channel

+

An audio channel is a monoaural signal generally associated with a particular speaker. For example, a stereo signal contains two channels, left and right. This is unrelated to the FMOD Channel class.

+

12.4 Automatic Parameter

+

An automatic parameter (also known in FMOD Studio as a built-in parameter) is any parameter whose value is automatically set based on the event instance's 3D attributes whenever the FMOD Studio system is updated.

+

Types of automatic parameter include:

+
    +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE
  • +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE
  • +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION
  • +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION
  • +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION
  • +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION
  • +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED
  • +
  • FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE
  • +
+

For more information about these parameter types, see the FMOD_STUDIO_PARAMETER_TYPE section of the Studio API Reference chapter.

+

12.5 Bank File

+

A bank file, or "bank," is a collection of content created in an FMOD Studio project, formatted and compressed for use with the version of the FMOD Engine integrated into in your game.

+

Bank files usually contain both metadata and sample data. However, it is also possible to create split banks whose sample data and metadata are in separate bank files. Splitting banks in this fashion slightly increases overhead at run time, but can help keep patch size low if it is ever necessary to release a patched version of your game that includes changes to the audio metadata but not the sample data.

+

Bank files are compatible with any version of the FMOD Engine with the same major and product version numbers as the version of FMOD Studio used to create them. For example, a bank built in FMOD Studio version 2.00.03 is compatible with FMOD Engine versions 2.00.03, 2.00.00, and 2.00.10, but not with versions 1.10.14, 1.00.03, and 2.01.03.

+

At least one bank in any FMOD Studio project is a master bank. A master bank contains data relevant to your entire FMOD Studio project, and so at least one master bank must be loaded into memory before any event in any bank may be used by your game. Most games have a single master bank that is kept loaded into memory at all times.

+

Bank files (.bank) should not be confused with FMOD Sample Bank files (.fsb). They are two different formats.

+

For more information about using bank files in the FMOD Engine, see the Bank Layout, Bank Loading, and Bank Unload sections of the Studio API Guide chapter, as well as the Studio::Bank subchapter of the Studio API Reference chapter.

+

12.6 Callback Behavior

+

Only one callback is stored for each System/Studio::System/Studio::EventInstance/ChannelControl/DSP. Therefore, any registered callback should handle all required callback types and indicate those types via the callback type mask.

+

All calls to callbacks are issued per type. This means that if, for example, you use System::setCallback with FMOD_SYSTEM_CALLBACK_ALL, when the callback is called, only one type will be passed for the type argument. Multiple types will not be combined for a single call.

+

C/C++ behavior. Casting your own function type to an FMOD callback could cause a crash or corruption. For callback declaration always use F_CALL between the return type and the function name, and use the correct C types for all callback parameters.

+

12.7 Channel Group

+

A channel group allows attributes to be set on a group of channels collectively. A channel group also allows you to operate on a the final mixed signal of the output of its channels and child channel groups. This is known as a 'sub mix'.

+

A channel group can be created with System::createChannelGroup, which returns a ChannelGroup object.

+

The sub mix buffer can be processed with effects (see ChannelControl::addDSP), saving CPU time compared to applying the same effect to multiple channels individually.

+

The signal processing of a channel group persists even when a channel has stopped.

+

A channel group can contain many children channel groups, but can only have one parent channel group. See ChannelGroup::addGroup and ChannelGroup::getParentGroup.

+

12.8 Channel

+

A Channel is a playing instance of a Sound. This is unrelated to an audio channel.

+

After loading or creating a Sound, it is playable via the System::playSound command which returns a Channel object for run-time manipulation of its properties.

+

FMOD automatically selects a Channel for the sound to play on, you do not have to manage your own Channels.

+

Set the maximum number of Channels playable with System::init. For more information on Channels and how they can be real or virtual, go to the Virtual Voices white paper.

+

12.9 Compressed Sample

+

Parent topic : Sound

+

Compressed Samples are suited for small sounds that need to be played more than once at a time, for example sound effects.

+

Only certain file formats are supported with this type of sound. File formats such as .MP2, .MP3, and .FSB (using FADPCM, Vorbis, AT9 and XMA codecs).
+This type of sound is stored in memory in its native compressed format, and decodes in real-time while playing.

+

Use FMOD_CREATECOMPRESSEDSAMPLE to create a Sound object in this mode.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Compressed Sample attributesComparison
Keeps sound compressed into memory.Can use less memory than a sample, large sounds can use more than a stream.
Higher CPU overhead during playback.Uses more CPU than a sample, slightly less than a stream.
Fast to load.Faster than a sample, possibly slower than a stream with very large sounds.
Can play more than 1 at a time.Better polyphony than a stream.
+

Note: Compressed samples have a context allocated for each instance of playback. This requires a fixed start up memory overhead. See FMOD_ADVANCEDSETTINGS to control codec maximums.

+

12.10 Documentation Conventions

+

12.10.1 Parameter Tokens

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TokenMeaning
OutThe API function will fill in information in this parameter.
OptThis parameter is optional, specify null or zero to ignore.
R/OThis token applies to members of various structures which FMOD passes to user callbacks. User callbacks must not modify the values of these members. Modifying the values of these members will cause undefined behavior.
C#This is only available in C#.
JSThis is only available in Javascript.
+

12.11 Core API Profiler Tool

+

The core API profiler tool, also known as the FMOD Profiler or FMOD Profiler.exe, is a tool for profiling your game's DSP graph and performance. It can be found in the /bin directory of the FMOD Engine distribution.

+

To profile your game with the core API profiler tool, you must specify FMOD_INIT_PROFILE_ENABLE when initializing the Core API. For more information about initialization flags, see the FMOD_INITFLAGS section of the Core API Reference chapter.

+

12.12 Core API

+

The Core API is a programmer API that allows the manipulation of low-level audio primitives, and is the backbone of the FMOD Engine.

+

Unlike the Studio API, the Core API is a standalone solution that allows you to implement every part of your game's audio using only code, and does not require the use of FMOD Studio to design audio content. However, while it is more powerful than the Studio API, it includes fewer convenience functions, and so is best used in games that require more flexibility than the Studio API can provide.

+

The Core API and Studio API together comprise the FMOD Engine.

+

For more information about the Core API, see the Core API Guide and Core API Reference chapters.

+

12.13 Distance Units

+

The unit of measurement for distances for 3D calculations. By default 1 disance unit is equivalent to 1 meter. To use your game's distance units specify the scale of your game's distance units to meters using System::set3DSettings.

+

12.14 Down Mixing

+

When the source signal channel count is higher than the destination, it will distribute its higher channel information into the lower speaker mode's channels.
+This example is a table of the speakers in a stereo output with the input speakers of a 7.1 signal. Values in table represent attenuation. 0dB = full volume, - = silence.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Output speakerFront left inFront right inCenter inLFE inSurround left inSurround right inBack left inBack right in
Left0dB--3dB--3dB--6dB-
Right-0dB-3dB---3dB--6dB
+

Example of a higher 7.1 speaker mode signal being down mixed to a stereo output. When more than one input channel contributes to the output speaker, the inputs are summed/mixed together.

+

12.15 DSP Chain

+

A DSP chain is a type of DSP sub-graph in which multiple DSP units are connected together in a linear fashion. Each Channel and ChannelGroup contains a DSP chain.

+

A DSP is capable of multiple inputs, but in a DSP chain each DSP is connected to the next with one input, all the way from the tail to the head. See FMOD_CHANNELCONTROL_DSP_INDEX for special named offsets for 'head' and 'tail' and 'fader' units.

+

DSP Chain

+

A typical Channel is represented above, with a node at the 'head' (of type FMOD_DSP_TYPE_FADER to allow volume control and panning), which is fed by an echo effect (of type FMOD_DSP_TYPE_ECHO) which is in turn fed by a PCM wavetable unit (of type that is internal to FMOD) at the 'tail'. The signal feeds from right to left to the DSP chain's head, before continuing to the next connected DSP (not pictured).

+

12.16 DSP Clock

+

Each DSP unit has an associated DSP clock. The speed of this clock affects any time-based behavior the DSP has, such that a DSP with a faster DSP clock will change the way it processes the signal more rapidly than one with a slower clock.

+

By default, all DSP clocks run at the same speed, helping ensure that different channels and channel groups remain synchronized. However, if a channel or channel group is subject to pitch adjustment, the DSP clocks associated with that channel or channel group may run at a faster or slower rate in order to account for the time stretching inherent to pitch changes.

+

DSP clocks are used for scheduling various time-based behaviors, including those of ChannelControl::setDelay in the Core API and modulators in FMOD Studio.

+

12.17 DSP Effect

+

A DSP effect is an effect that makes use of a DSP unit.

+

12.18 DSP Engine

+

The DSP engine is the portion of the FMOD Engine that traverses, executes, and mixes the DSP graph.

+

For more information about the DSP engine, see the DSP Architecture and Usage white paper.

+

12.19 DSP Graph

+

The DSP graph is made of DSP units linked together into a network by DSPConnections. Audio signals originate and flow through the DSP graph, being processed by the DSP units they pass through and combined into a submix whenever multiple DSPConnections target the same DSP unit, until they arrive at an output. The DSP graph allows audio to be dynamically processed and mixed, and so is the foundation of all dynamic game audio in FMOD.

+

Normally, an FMOD project has one DSP graph. Sections of a DSP graph may be referred to as sub-graphs for the purpose of easy discussion.

+

An FMOD project's DSP graph may be viewed by using the FMOD Profiler, as long as you specify FMOD_INIT_PROFILE_ENABLE when initializing the Core API.

+

For more information about DSP graphs, see the DSP Architecture and Usage white paper.

+

12.20 DSP Sub-graph

+

A DSP sub-graph is an arbitrary subset of the DSP units and DSPConnections in a DSP graph. They are not represented in code; rather, they are a useful abstraction when discussing a project's DSP interactions, as they are easier to conceptualize of than the entire DSP graph.

+

12.21 DSP

+

DSP stands for "Digital Signal Processing", and usually relates to processing raw PCM samples to alter the sound. A DSP unit (or just "a DSP") is a modular node in the DSP graph that's capable of a specific kind of digital signal processing. Many DSPs are used in effects, or to process audio in other situations.

+

DSPs can be added to an FMOD Channel, or ChannelGroup with the ChannelControl::addDSP function.

+

FMOD provides a suite of DSPs that can alter sounds in interesting ways, such as better simulating real-world sound behavior or exaggerating sounds. Examples of such DSPs include the echo, SFX reverb, IT low pass, flange, and chorus DSPs.

+

You can also write your own DSPs by using System::createDSP. For more information about writing DSPs, see the DSP subchapter of the Plug-in API Reference chapter.

+

12.22 Effect

+

In the FMOD Engine, an effect is a modular unit that manipulates a signal in some way. Most effects are DSP effects, which is to say, they use digital signal processing units to alter the signal.

+

The effects included in the FMOD Engine are detailed in the Effects Reference chapter.
+Many FMOD Engine effects also exist as FMOD Studio effects, though not all.

+

12.23 FMOD Engine

+

The FMOD Engine is a runtime library for playing adaptive audio in games. It consists of two APIs: The Studio API, and the Core API. Content created in FMOD Studio can be built as .bank files, which can then be loaded and played in the FMOD Engine using the Studio API. The Core API allows audio programmers to create audio content without using FMOD Studio, and to interact with the FMOD Engine's underlying mechanisms.

+

For more information about the FMOD Engine, see the FMOD Engine User Manual. You're reading it right now.

+

12.24 FMOD Studio

+

FMOD Studio is an application that allows sound designers and composers to create adaptive audio content for games. Content created in FMOD Studio can be built as .bank files, which can then be loaded and played in the FMOD Engine using the Studio API.

+

For more information about FMOD Studio, see the FMOD Studio User Manual.

+

12.25 FSB

+

.fsb files (also known as "FMOD Soundbanks" or "FSBs") are a proprietary file format that acts as a container for encoded and compressed sample data. They are built using FSBank API or the FMOD Soundbank Generator tool that comes packaged with the FMOD Engine, and their content can be loaded and played using the Core API.

+

.fsb files should not be confused with the .bank files built in FMOD Studio. Unlike FMOD Studio's .bank files, .fsb files cannot contain event or mixer metadata, but their sampledata can be loaded and played using the Core API without needing the Studio API. In most cases, if your game uses the Studio API, you should use .bank files; whereas if your game uses only the Core API, you should use .fsb files.

+

The FMOD Engine is compatible with all .fsb files built using the FSBank API and the FMOD Soundbank Generator tool that comes packaged with the FMOD Engine. .fsb files that were instead built using older tools (such as FMOD Designer, FMOD Ex, or versions of the FMOD Soundbank Generator tool distributed with FMOD Ex) use older, deprecated codecs, and so are not compatible with the FMOD Engine.

+

12.26 GUID

+

A GUID is a unique string used to identify a digital object, and stands for Globally Unique Identifier. In the FMOD Engine, GUIDs are commonly used to invoke and define relationships between the various elements of a project. For example, every event, asset, bus, parameter, snapshot, effect, bank, and instrument in an FMOD Studio project has a GUID, and each such object's metadata includes the GUIDs of other objects that it references or is referenced by.

+

Certain APIs allow you to specify which object to affect by GUID. For example, Studio::System::getEventByID gets the eventDescription of an event with a specified GUID.

+

GUIDs are a form of metadata. The GUID structure used by the FMOD Engine is defined by FMOD_GUID.

+

12.27 Handedness

+

Handedness is an innate property of 3D cartesian coordinate systems. The handedness of the coordinate system specifies the relative direction of the Z axis along the line perpendicular to the X and Y axes, and the direction of positive rotations when an axis is directed towards the point of view.

+

When the X axis is directed to the right, and the Y axis is directed upwards:

+
    +
  • A left-handed coordinate system's Z is directed away from the point of view, and rotations in the positive direction are clockwise.
  • +
  • A right-handed coordinate system's Z axis is directed towards the point of view, and rotations in the positive direction are counter-clockwise.
  • +
+

For 3D spatialization to behave intuitively, it is important that FMOD is configured to use the same orientation as your game's coordinate system. By default FMOD uses a left-handed coordinate system, but FMOD may also be configured to use a right-handed coordinate system by passing FMOD_INIT_3D_RIGHTHANDED to System::init.

+

12.28 Loading Mode

+

The loading mode of an asset is the way in which that asset's sample data is loaded into memory so that it can be played. There are three possible loading modes:

+
    +
  • Compressed. In this mode, the asset's sample data is loaded into memory in a compressed format in advance of its being played. This sample data is then decompressed in real time whenever an instance of the asset is played. This mode requires less memory than decompressed loading mode, but requires more CPU to play the loaded asset.
  • +
  • Decompressed. In this mode, the asset's sample data is loaded into memory in a decompressed format in advance of being played. This mode requires more memory than compressed loading mode, but does not require as much CPU to play the loaded asset.
  • +
  • Streaming. In this mode, each playing instance of the asset requires a separate stream. Each stream is a ring buffer; the asset associated with a stream is loaded piecemeal from disk into the buffer, and each piece is played as soon as it is loaded then immediately overwritten by the next piece. Because only a small part of the asset is loaded into memory at any given time, streaming assets require only a small amount of memory compared to the other loading modes. However, because each instance of a streaming asset requires a separate buffer that loads the asset independently, each contemporaneously playing instance of an asset with this loading mode requires constant file I/O.
  • +
+

For more information about loading assets in the FMOD Engine, see the Sample Data Loading section of the Studio API Guide chapter. For more information about the streaming loading mode specifically, see the Streaming section of the Core API Guide chapter.

+

12.29 Metadata

+

Metadata is data that describes other data. In FMOD Studio and the FMOD Engine, "metadata" usually means the data that describes how sample data is to be used in a game, i.e.: the data that defines an FMOD Studio project's events, mixer, and other non-sample data content. This kind of metadata is packaged into bank files whenever a project is built in FMOD Studio.

+

12.30 Mixer

+

See DSP graph.

+

12.31 Reading Sound Data

+

The following shows how to read sound data to a buffer using Sound::readData.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD::Sound *sound;
+unsigned int length;
+char *buffer;
+
+system->createSound("drumloop.wav", FMOD_DEFAULT | FMOD_OPENONLY, nullptr, &sound);
+sound->getLength(&length, FMOD_TIMEUNIT_RAWBYTES);
+
+buffer = new char[length];
+sound->readData(buffer, length, nullptr);
+
+delete[] buffer;
+
+ +
FMOD_SOUND *sound;
+unsigned int length;
+char *buffer;
+
+FMOD_System_CreateSound(system, "drumloop.wav", FMOD_DEFAULT | FMOD_OPENONLY, 0, &sound);
+FMOD_Sound_GetLength(sound, &length, FMOD_TIMEUNIT_RAWBYTES);
+
+buffer = (char *)malloc(length);
+FMOD_Sound_ReadData(sound, (void *)buffer, length, 0);
+
+free(buffer);
+
+ +
FMOD.Sound sound;
+uint length;
+byte[] buffer;
+
+system.createSound("drumloop.wav", FMOD.MODE.DEFAULT | FMOD.MODE.OPENONLY, out sound);
+sound.getLength(out length, FMOD.TIMEUNIT.RAWBYTES);
+
+buffer = new byte[(int)length];
+sound.readData(buffer);
+
+ +
var sound = {};
+var length = {};
+var buffer = {};
+
+system.createSound("drumloop.wav", FMOD.DEFAULT | FMOD.OPENONLY, null, sound);
+sound = sound.val;
+
+sound.getLength(length, FMOD.TIMEUNIT_RAWBYTES);
+length = length.val;
+
+sound.readData(buffer, length, null);
+buffer = buffer.val;
+
+ +

See Also: FMOD_TIMEUNIT, FMOD_MODE, Sound::getLength, System::createSound

+

12.32 Sample Data

+

Sample data is raw (PCM) or a compressed audio signal, stored as a sound. Multi-channel PCM sample data (stereo and above) is interleaved, so a 5.1 signal for example has 6 values stored together per sample.

+

12.32.1 Endianness

+

When accessing raw data in a sound, it will be in the native endianness of the platform. See Sound::lock, Sound::unlock.
+When a sound file is loaded, FMOD will convert the endian to match the native endian of the platform.

+

12.32.2 Sample Formats

+

Sample data can come in a variety of PCM bit depths (8,16,24,32) and types (integer, float), or as a compressed bitstream. See FMOD_SOUND_FORMAT.

+

12.32.3 Samples vs Bytes vs Milliseconds

+

Within FMOD functions you will see references to PCM samples, bytes and milliseconds.

+

To understand what the difference is a diagram has been provided to show how raw PCM sample data is stored in FMOD buffers.

+

Samples vs Bytes vs Milliseconds

+

In this diagram you will see that a stereo sound has its left/right data interleaved one after the other.
+A left/right pair (a sound with 2 channels) is called a sample.
+Because this is made up of 16bit data, 1 sample = 4 bytes.
+If the sample rate, or playback rate is 44.1khz, or 44100 samples per second, then 1 sample is 1/44100th of a second, or 1/44th of a millisecond. Therefore 44100 samples = 1 second or 1000ms worth of data.
+To convert between the different terminologies, the following formulas can be used:

+
    +
  • ms = samples * 1000 / samplerate.
  • +
  • samples = ms * samplerate / 1000.
  • +
  • samplerate = samples * 1000 / ms.
  • +
  • bytes = samples * bits * channels / 8.
  • +
  • samples = bytes * 8 / bits / channels.
  • +
+

Some functions like Sound::getLength provide the length in milliseconds, bytes and samples to avoid needing to do these calculations.

+

12.33 Sample

+

Parent topic : Sound

+

Samples (also referred to as 'decompress into memory' type sounds), are suited for small sounds that need to be played more than once at a time, for example sound effects.

+

Use FMOD_CREATESAMPLE to create a Sound object in this mode.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Sample attributesComparison
Decompresses whole sound into memory.Can use more memory than a compressed sample or stream.
Low CPU overhead during playback.Uses less CPU than a compressed sample or stream.
Slower to load.Can take longer to load on large sounds than a compressed sample or stream.
Can play more than 1 at a time.Better polyphony than a stream.
+

Mobile Developers: A common use for this format is to store files compressed on disk (for faster download speed), then decompress into memory at load time, for lower cpu overhead at run-time.

+

12.34 Signal

+

The signal is an abstraction of the audio sample data flowing through an FMOD project. Understanding how signals flow through a project is necessary to understand how the DSP graph and mixing work.

+

In most cases, signals originate from channels, which route their output signals into channel groups. Each channel group creates a submix of all the signals flowing into it. Channels and channel groups may feature DSPs that process the signal before passing it to the next DSP in the graph associated with that channel group; when there are no DSPs left in the channel group, the signal is routed from that channel group to that channel group's routing destination. All signals should eventually flow to the master channel group or an audio port supplied by an FMOD_OUTPUTTYPE plug-in.

+

12.35 Sound

+

A sound is an instance of sample data which can be loaded from media, or created from memory.

+

When a sound is loaded, it is either decompressed as a static sample into memory as PCM (sample), loaded into memory in its native format and decompressed at runtime (compressed sample), or streamed and decoded in realtime (in chunks) from an external media such as a disk or internet (stream).

+

For more detail see:

+ +

A sound can be created with System::createSound or System::createStream which returns a Sound object. A Sound object can be played with System::playSound.

+

12.36 Streaming Sample Data

+

Streaming sample data is sample data formatted for the streaming loading mode. The distinction between streaming sample data and non-streaming sample data is only extant when using the Studio API to play content from bank files, as the loading mode of assets in a bank file is encoded into that bank file along with those assets. When using the Core API, the loading mode of a sound is specified at run time.

+

When using the Core API, the loading mode of a sound is specified at run time.

+

For more information about streaming, see the Streaming section of the Core API Guide chapter.

+

12.37 Stream

+

Parent topic : Sound

+

A stream is good for a sound that is too large to fit into memory. A stream reads from disk or other media like the internet as it plays.

+

Typically suited to larger sounds like music, long ambiences, or voice.

+

Use FMOD_CREATESTREAM to create a Sound object in this mode.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
'Stream' attributesComparison
Uses a small buffer in memory.Uses less memory than a sample or compressed sample on large sounds.
Higher CPU overhead during playback.Uses more CPU than sample, slightly more than a compressed sample due to simultaneous reading from medium.
Fast to load.Faster than a sample on large sounds, possibly faster than a compressed sample with very large sounds.
Can only be played once at a time.Worse polyphony than a sample or compressed sample.
+

Note: A very small sound may use more memory than a sample or compressed sample when created as a stream, due to the stream file/decode buffer overhead being bigger than the size of the sound.

+

12.37.1 Streaming Issues

+

Bandwidth

+

Streaming audio from a medium should be kept to a limited number of instances, to avoid starvation of data leading to skipping / stuttering audio.

+

Increasing stream memory buffer sizes can help to mitigate this problem. See System::setStreamBufferSize and FMOD_ADVANCEDSETTINGS::defaultDecodeBufferSize.

+

Speed of commands using streams

+

System::createStream, Channel::setPosition and Sound::getSubSound when using a stream can take longer than an in memory sample, as they have to initialize internal buffers and flush them from disk.

+

Use FMOD_NONBLOCKING command to remove the cost from the main thread and put the overhead into a background thread.

+

Setting loop counts or points of a playing stream

+

Issues with looping streaming sounds may arise when changing the loop count or loop points of a playing stream.

+

Sounds created with System::createStream or FMOD_CREATESTREAM may have executed loop logic and buffered sample data before API calls to change their looping properties. If issues occur after changing loop properties you may need to call Channel::setPosition to force a flush of the stream buffer.

+

Note this will usually only happen if you have sounds or loop regions which are smaller than the stream decode buffer. See FMOD_CREATESOUNDEXINFO.

+

12.38 String Format

+

All FMOD Public APIs and structures use UTF-8 strings.

+

As C# uses UTF-16 strings by default, the FMOD C# api function parameters will automatically convert between UTF-16 and UTF-8 strings in any api using the C# "string" type or FMOD's "StringWrapper" type. However, any API that uses strings via an IntPtr will not automatically convert from UTF-16, and will instead expect a UTF-8 string to be used.

+

12.39 Studio API

+

The Studio API is a programmer API that allows your game to interact with data-driven projects created in FMOD Studio at run time. The Studio API and Core API together comprise the FMOD Engine.

+

The Studio API is built on top of the Core API, and extends its functionality. FMOD Studio and the Studio API are flexible and powerful enough to suit the audio needs of the vast majority of games. However, if a specific game requires more flexibility than the Studio API provides, we recommend using the Core API instead.

+

For more information about the Studio API, see the Studio API Guide and Studio API Reference chapters.

+

12.40 Studio GUIDs and Paths

+

Many functions in the Studio API allow you to identify an object within an FMOD Studio project by the object's globally unique identifier, or GUID. These API functions will accept the GUID in binary format (mostly useful when an object's GUID has been looked up programmatically by name), or as a string formatted as 32 digits separated by hyphens and enclosed in braces: {00000000-0000-0000-0000-000000000000}.

+

Many functions in the Studio API allow you to identify an object within an FMOD Studio project by the object's path. Objects can only be identified by path if the project's strings bank is loaded.

+

See the FMOD Studio User Manual for more information.

+

12.41 Studio Strings Bank

+

When building a master bank, FMOD Studio also writes out a strings bank for the project. The strings bank contains a string table which the Studio API can use to resolve GUIDs from paths. Studio API functions which accept paths require the project's strings bank to be loaded in order to function correctly.

+

12.42 Studio Update Thread

+

A thread created by the Studio System to perform asynchronous processing of API commands and manage scheduling and playback logic for events. This thread is triggered from the core mixer thread at the period specified in the FMOD_STUDIO_ADVANCEDSETTINGS. If the studio system is initialized with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE then no studio update thread is created.

+

12.43 Sync Points

+

A sync point can be used to trigger a callback during playback. See FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT.
+These points can be user generated via the API or can come from a .wav file with embedded markers.

+

Markers can be added to a wave file in a sound editor usually by clicking on a waveform or timeline and inserting a 'marker' or 'region'.

+

Any RIFF based format will support sync points.

+

Sync points can be manipulated with:

+ +

12.44 Up Mixing

+

When the source signal channel count is lower than the destination, it will distribute its lower channel information into the higher speaker mode's channels.
+This example is a table of the different source signal speaker modes, mapping to a 7.1 output. Values in table represent attenuation. 0dB = full volume, - = silence.

+
Key: M = Mono, L = Left, R = Right, FL = Front Left, FR = Front Right, C = Center, LFE = Low Frequency Emitter, SL = Surround Left, SR = Surround Right, BL = Back Left, BR = Back Right
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Output SpeakerMono sourceStereo sourceQuad source5.0 source5.1 source7.1 source
Front leftM = -3dBL = 0dBFL = 0dBFL = 0dBFL = 0dBFL = 0dB
Front rightM = -3dBR = 0dBFR = 0dBFR = 0dBFR = 0dBFR = 0dB
Center---C = 0dBC = 0dBC = 0dB
LFE----LFE = 0dBLFE = 0dB
Surround left--SL = 0dBSL = 0dBSL = 0dBSL = 0dB
Surround right--SR = 0dBSR = 0dBSR = 0dBSR = 0dB
Back left-----BL = 0dB
Back right-----BR = 0dB
+

Example of lower and equal speaker modes up mixing to a target speaker mode = 7.1

+

12.45 User Data

+

User data is arbitrary data that can be attached to various FMOD objects. User data is stored without a type, in the form of a void * in C/C++, IntPtr in C# or an object in javascript. User data can then be retrieved and cast back to the original type. The following shows how to set and get user data on a Sound, but can be likewise applied to any object with a getUserData or setUserData method.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
{
+    const char *userData = "Hello User Data!";
+    void *pointer = (void *)userData;
+    sound->setUserData(pointer);
+}
+{
+    void *pointer;
+    sound->getUserData(&pointer);
+    const char *userData = (const char *)pointer;
+}
+
+ +
{
+    const char *userData = "Hello User Data!";
+    void *pointer = (void *)userData;
+    FMOD_Sound_SetUserData(object, pointer);
+}
+{
+    void *pointer;
+    FMOD_Sound_GetUserData(object, &pointer);
+    const char *userData = (const char *)pointer;
+}
+
+ +
{
+    string userData = "Hello User Data!";
+    GCHandle handle = GCHandle.Alloc(userData);
+    IntPtr pointer = GCHandle.ToIntPtr(handle);
+    sound.setUserData(pointer);
+}
+{
+    IntPtr pointer;
+    sound.getUserData(out pointer);
+    GCHandle handle = GCHandle.FromIntPtr(pointer);
+    string userData = handle.Target as string;
+}
+
+ +
{
+    var userData = "Hello User Data!";
+    sound.setUserData(userData);
+}
+{
+    var outval = {};
+    sound.getUserData(outval);
+    var userData = outval.val;
+}
+
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-reverb.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-reverb.png new file mode 100644 index 0000000..821b21e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-reverb.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-1.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-1.png new file mode 100644 index 0000000..3bb173e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-1.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-2.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-2.png new file mode 100644 index 0000000..bb2e517 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-2.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-3.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-3.png new file mode 100644 index 0000000..6d5f201 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/3d-studio-3.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-chain.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-chain.png new file mode 100644 index 0000000..7a302c3 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-chain.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-grouping.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-grouping.svg new file mode 100644 index 0000000..e58c354 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-grouping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-levels.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-levels.svg new file mode 100644 index 0000000..a94b774 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-levels.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-routing.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-routing.svg new file mode 100644 index 0000000..b57f3f1 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-channelmix-routing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-chorus-wave.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-chorus-wave.svg new file mode 100644 index 0000000..c88e35d --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-chorus-wave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-compressor.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-compressor.svg new file mode 100644 index 0000000..4cfd95c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-compressor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-convolution-impulse.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-convolution-impulse.svg new file mode 100644 index 0000000..66c12aa --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-convolution-impulse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-delay-wave.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-delay-wave.svg new file mode 100644 index 0000000..9c14744 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-delay-wave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-distortion-wave.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-distortion-wave.svg new file mode 100644 index 0000000..8c6c4ed --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-distortion-wave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-echo-wave.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-echo-wave.svg new file mode 100644 index 0000000..d676c7e --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-echo-wave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-blackman.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-blackman.png new file mode 100644 index 0000000..4264896 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-blackman.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-blackmanharris.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-blackmanharris.png new file mode 100644 index 0000000..a40b36b Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-blackmanharris.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-hamming.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-hamming.png new file mode 100644 index 0000000..7c658ce Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-hamming.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-hanning.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-hanning.png new file mode 100644 index 0000000..c89691e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-hanning.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-process.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-process.png new file mode 100644 index 0000000..46216b2 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-process.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-process.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-process.svg new file mode 100644 index 0000000..a88db07 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-process.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-rectangle.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-rectangle.png new file mode 100644 index 0000000..88f2c6c Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-rectangle.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-triangle.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-triangle.png new file mode 100644 index 0000000..4264896 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-fft-triangle.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-flange-wave.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-flange-wave.svg new file mode 100644 index 0000000..a09adf9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-flange-wave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-limiter-signals.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-limiter-signals.svg new file mode 100644 index 0000000..0f9bd42 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-limiter-signals.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-multibandeq-bands.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-multibandeq-bands.svg new file mode 100644 index 0000000..a80f3fa --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-multibandeq-bands.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-normalize-signals.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-normalize-signals.svg new file mode 100644 index 0000000..e246995 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-normalize-signals.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-objectpanner-diagram.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-objectpanner-diagram.svg new file mode 100644 index 0000000..01624d9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-objectpanner-diagram.svg @@ -0,0 +1,4 @@ + + + +
TRACK SIGNAL CHAIN
TRACK SIGNAL CHAIN
OBJECT PANNER



Sends signal to object mixer
OBJECT PANNER...
PANNER AND OTHER BUSES
PANNER AND OTHER...
MASTER BUS
MASTER BUS
Signal
Signal
Signal
Signal
Signal
Signal
OBJECT MIXER
OBJECT MIXER
Signal
Signal
SIGNAL ROUTED DIRECTLY TO OBJECT MIXER
SIGNAL ROUTED DIRECTLY TO OBJECT MIXER
AUDIO OUTPUT
AUDIO OUTPUT
Signal
Signal
Text is not SVG - cannot display
\ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-oscillator-waves.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-oscillator-waves.svg new file mode 100644 index 0000000..6aa45b2 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-oscillator-waves.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-height-side.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-height-side.svg new file mode 100644 index 0000000..8e3f3b9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-height-side.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-height.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-height.svg new file mode 100644 index 0000000..79317c4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-height.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-stereo-anim.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-stereo-anim.gif new file mode 100644 index 0000000..58f82c2 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-stereo-anim.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-stereo.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-stereo.svg new file mode 100644 index 0000000..daa86a3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-stereo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-anim.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-anim.gif new file mode 100644 index 0000000..9eae1cf Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-anim.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-direction-anim.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-direction-anim.gif new file mode 100644 index 0000000..078fc41 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-direction-anim.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-discrete-anim.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-discrete-anim.gif new file mode 100644 index 0000000..901ef42 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-discrete-anim.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-discretesep-anim.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-discretesep-anim.gif new file mode 100644 index 0000000..f8e7863 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-discretesep-anim.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-extent-5ch.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-extent-5ch.png new file mode 100644 index 0000000..83e9714 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-extent-5ch.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height-714down.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height-714down.gif new file mode 100644 index 0000000..6933538 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height-714down.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height-714up.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height-714up.gif new file mode 100644 index 0000000..9837ede Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height-714up.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height.gif new file mode 100644 index 0000000..e74aacb Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-height.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-rotate-anim.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-rotate-anim.gif new file mode 100644 index 0000000..1fc00f4 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d-surround-rotate-anim.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d.png new file mode 100644 index 0000000..f4e6d38 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d.svg new file mode 100644 index 0000000..27be22f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-2d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-extent-off.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-extent-off.gif new file mode 100644 index 0000000..52706d9 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-extent-off.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-position.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-position.svg new file mode 100644 index 0000000..fb4dd11 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-position.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-custom.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-custom.svg new file mode 100644 index 0000000..adea834 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-custom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-inverse.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-inverse.svg new file mode 100644 index 0000000..1781280 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-invtaper.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-invtaper.svg new file mode 100644 index 0000000..5122c51 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-invtaper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-linear.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-linear.svg new file mode 100644 index 0000000..09c3e9e --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-linear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-linsquared.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-linsquared.svg new file mode 100644 index 0000000..68b68b4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-rolloff-linsquared.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-surround-minextent.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-surround-minextent.gif new file mode 100644 index 0000000..b58c056 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-surround-minextent.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-surround-soundsize.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-surround-soundsize.gif new file mode 100644 index 0000000..24fa164 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-3d-surround-soundsize.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-general-enabledspeakers.gif b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-general-enabledspeakers.gif new file mode 100644 index 0000000..5e11ed1 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-pan-general-enabledspeakers.gif differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-send-return.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-send-return.svg new file mode 100644 index 0000000..ec4d856 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-send-return.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-sfxreverb.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-sfxreverb.svg new file mode 100644 index 0000000..dfb728d --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-sfxreverb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-threeeq.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-threeeq.svg new file mode 100644 index 0000000..048f157 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-threeeq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-transceiver.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-transceiver.svg new file mode 100644 index 0000000..68e5371 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dsp-transceiver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img001.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img001.png new file mode 100644 index 0000000..f0a0be0 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img001.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img002.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img002.png new file mode 100644 index 0000000..a8d3754 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img002.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img003.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img003.png new file mode 100644 index 0000000..3f4b1fa Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img003.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img004.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img004.png new file mode 100644 index 0000000..e9a5eca Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img004.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img005.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img005.png new file mode 100644 index 0000000..d48fcc9 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img005.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img006.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img006.png new file mode 100644 index 0000000..30a70f0 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img006.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img007.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img007.png new file mode 100644 index 0000000..efea4c8 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img007.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img008.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img008.png new file mode 100644 index 0000000..df67a60 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img008.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img009.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img009.png new file mode 100644 index 0000000..0961029 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img009.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img010.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img010.png new file mode 100644 index 0000000..86e6d74 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img010.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img011.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img011.png new file mode 100644 index 0000000..597a743 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img011.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img012.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img012.png new file mode 100644 index 0000000..414dad9 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img012.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img013.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img013.png new file mode 100644 index 0000000..ab47847 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img013.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img014.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img014.png new file mode 100644 index 0000000..a951e21 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img014.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img015.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img015.png new file mode 100644 index 0000000..05a9ee9 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dspnet-img015.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-compress-down.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-compress-down.svg new file mode 100644 index 0000000..157f2a9 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-compress-down.svg @@ -0,0 +1 @@ +InputOutputThresholdRatio \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-compress-up.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-compress-up.svg new file mode 100644 index 0000000..1744892 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-compress-up.svg @@ -0,0 +1 @@ +InputOutputThresholdRatio \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-expand-down.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-expand-down.svg new file mode 100644 index 0000000..ec8b5b0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-expand-down.svg @@ -0,0 +1 @@ +InputOutputThresholdRatio \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-expand-up.svg b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-expand-up.svg new file mode 100644 index 0000000..28a5db4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/dynamic-response-expand-up.svg @@ -0,0 +1 @@ +InputOutputThresholdRatio \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/mpeg-frames.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/mpeg-frames.png new file mode 100644 index 0000000..cee5965 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/mpeg-frames.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/multi-channel-mpeg.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/multi-channel-mpeg.png new file mode 100644 index 0000000..048ade4 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/multi-channel-mpeg.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/object_spatializer_effect_diagram.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/object_spatializer_effect_diagram.png new file mode 100644 index 0000000..c7ed554 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/object_spatializer_effect_diagram.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/samples-bytes-milliseconds.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/samples-bytes-milliseconds.png new file mode 100644 index 0000000..d656d3e Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/samples-bytes-milliseconds.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-bank-layout.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-bank-layout.png new file mode 100644 index 0000000..609bed9 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-bank-layout.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-thread-async.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-thread-async.png new file mode 100644 index 0000000..3ab9412 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-thread-async.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-thread-sync.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-thread-sync.png new file mode 100644 index 0000000..15a7651 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/studio-thread-sync.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/virtual-dspgraph.png b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/virtual-dspgraph.png new file mode 100644 index 0000000..f3c7e21 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/images/virtual-dspgraph.png differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-android.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-android.html new file mode 100644 index 0000000..c098ccb --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-android.html @@ -0,0 +1,283 @@ + + +Platform Details | Android + + + + +
+ +
+

4. Platform Details | Android

+ +

Android Specific Starter Guide

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • NDK - version r26b targeting android-21 (32bit and 64bit).
  • +
  • SDK - platform version 34.
  • +
+

Compatibility

+

FMOD supports devices of the below ABIs back to API level 21 (Android 5.0, Lollipop).

+
    +
  • armeabi-v7a - supported and optimized with VFPv2 (and NEON if detected at runtime).
  • +
  • arm64-v8a - supported and optimized with NEON.
  • +
  • x86 - supported and optimized with SSE3.
  • +
  • x86_64 - supported and optimized with SSE3.
  • +
  • mips - unsupported due to limited demand.
  • +
  • mips64 - unsupported due to limited demand.
  • +
  • armeabi - unsupported from FMOD 2.2 due to NDK deprecation.
  • +
+

Libraries

+

Substitute $ABI with your desired ABI from the 'Compatibility' list above.

+

Core API library

+
    +
  • /api/core/lib/$ABI/libfmod.so - Release binary for production code.
  • +
  • /api/core/lib/$ABI/libfmodL.so - Release binary with logging enabled for development.
  • +
+

Studio API library (used in conjunction with the core API library)

+
    +
  • /api/studio/lib/$ABI/libfmodstudio.so - Release binary for production code.
  • +
  • /api/studio/lib/$ABI/libfmodstudioL.so - Release binary with logging enabled for development.
  • +
+

Java

+

FMOD is primarily a native C/C++ library implementation but does have a Java component that is invoked from native code. To ensure the Java component is properly operating please make sure you reference the fmod.jar in your project. This means telling the IDE or build system where to find the fmod.jar file so it's included in the application.

+

It is also highly recommended that you initialize the FMOD Java component, this will allow loading assets from the APK and automatic configuration for lowest latency. This should be done before System_Create or Studio::System::create, and should be closed after System::release or Studio::System::release.

+

A basic example is listed below, for more details please check the provided examples.

+
public class MainActivity extends Activity
+{
+    @Override
+    protected void onCreate(Bundle savedInstanceState)
+    {
+        org.fmod.FMOD.init(this);
+    }
+
+    @Override
+    protected void onDestroy()
+    {
+        org.fmod.FMOD.close();
+    }
+}
+
+static
+{
+    System.loadLibrary("fmod");
+}
+
+ +

If you do not have a Java activity class, you can use FMOD_Android_JNI_Init to perform the org.fmod.FMOD.init and System.loadLibrary initialization actions natively. You can likewise use FMOD_Android_JNI_Close to perform the org.fmod.FMOD.close cleanup. For example:

+
void android_main(struct android_app* app)
+{
+    jniEnv = NULL;
+    app->activity->vm->AttachCurrentThread(&jniEnv, NULL);
+    FMOD_Android_JNI_Init(app->activity->vm, app->activity->clazz);
+
+    // ... game loop
+
+    FMOD_Android_JNI_Close();
+    app->activity->vm->DetachCurrentThread();
+}
+
+ +

Examples

+

FMOD examples are shipped as Android Studio projects using the Gradle build system with the Android Gradle plug-in. Examples are provided for using both CMake and ndk-build to perform the external native build:

+
    +
  • /api/(core|studio)/examples/androidstudio/cmake - Examples using CMake to perform the external native build.
  • +
  • /api/(core|studio)/examples/androidstudio/ndkbuild - Examples using ndk-build to perform the external native build.
  • +
+

Linking FMOD to your code

+

To link FMOD into your native code refer to the Android documentation relevant to the build tools you are using. You may also find it helpful to refer to the Android.mk files or the CMakeLists.txt files from the FMOD examples.

+

Audio Latency

+

Reducing the amount of audio latency between calling an API function and hearing its effect is generally controlled via System::setDSPBufferSize. However it should be noted that on this platform there is significantly more OS latency (which is out of the control of developers). It is currently not mandatory for device manufactures to adhere to audio latency guidelines (section 5.3 Audio Latency of the Android CDD). Devices which report FEATURE_AUDIO_LOW_LATENCY will be able to achieve lower latency playback. This is handled internally by FMOD and requires no additional configuration. Latency test results for specific devices can be found on the Superpowered Latency Table.

+

Pairing with a BlueTooth speaker or headset will incur significant extra latency, 120ms in some tests. This is currently unavoidable due to the OS taking extra buffering beyond developer control.

+

Asset Manager

+

To load files from the APK using the Asset Manager (for files stored in the asset directory at build time) you need to use a special syntax. FMOD will recognize any path that is prefixed with file:///android_asset/ as an asset, so passing a path of file:///android_asset/drumloop.wav will load the file drumloop.wav which was stored in the asset directory at build time. For this functionality to work your device must be running Gingerbread or newer and have called org.fmod.FMOD.init from Java.

+

Native Threads

+

If you call FMOD from a native thread (not Java) you will need to ensure the thread is attached to the Java runtime environment JavaVM::AttachCurrentThread. It's recommended you remain attached for the life of the thread but you may call JavaVM::DetachCurrentThread after the invocation of FMOD if you prefer.

+

FMOD often makes calls to Java code contained within fmod.jar and therefore requires the thread to be attached. All internal FMOD threads are attached when they are created so this only concerns user threads.

+

Suspend in Background

+

FMOD native threads will continue running when your application transitions to the background, this will continue to use resources. To completely stop FMOD without losing your current setup you can call System::mixerSuspend as part of your backgrounding process. When you return to the foreground, use System::mixerResume to reactivate FMOD. It is extremely important to ensure no FMOD APIs are called in-between suspend and resume as they run the risk of causing a deadlock. You must also call suspend and resume pairs on the same thread.

+

Suspending Recording

+

Input streams are not guaranteed to be released when closing the application. If you are using audio input features such as System::recordStart and System::recordStop, calling System::mixerSuspend during backrounding is recommended to avoid leaking stream resources.

+

AAudio Device Selection

+

If you are targeting API 23 and above, you will be able to access all valid input and output devices when using FMOD_OUTPUTTYPE_AAUDIO. Some of these devices may require special permissions, feature sets, or API handling that are not available on all devices, and it is your responsibility to meet these prerequisites if you want to target that device type.
+The device id can be retrieved from the Data1 value stored in the FMOD_GUID returned from System::getDriverInfo or System::getRecordDriverInfo, and the device type will be stored in the Data3 value. The device type can be compared to the corresponding Android AudioDeviceInfo type constants, and any special handling for that device type will need to be implemented before calling System::setDriver or System::recordStart with that device.

+

Input Devices

+

If you are targeting API 28 and above, each AAudio input device will have a corresponding device containing a "(Voice)" suffix in its name, and a Data2 value of true stored in the FMOD_GUID returned from System::getRecordDriverInfo. These input devices use the same physical device as their non "(Voice)" counterpart, but will have hardware echo cancellation enabled as well.

+

Permissions

+

Some functionality inside of FMOD will require you set relevant permissions in your AndroidManifest.xml file.

+ +

Thread Affinity

+

All threads will default to FMOD_THREAD_AFFINITY_CORE_ALL, this is recommended due to the wide variety of devices available but can be customized with Thread_SetAttributes.

+

Thread Priority

+

The relationship between FMOD platform agnostic thread priority and the platform specific values is as follows:

+ +

Known Issues

+
    +
  • The Audio Track output mode currently does not support recording, please use the OpenSL output mode for this.
  • +
  • The Snapdragon Profiler created by Qualcomm has a bug when displaying system trace information. The trace will indicate that the "AudioTrack" thread executes for several milliseconds when in fact it does not. The "AudioTrack" thread is created by the OpenSL output plug-in and is responsible for calling into FMOD to fetch audio. FMOD services this request efficiently with lock free data structures and returns in microseconds to avoid any audio glitches. To verify the behavior of this thread use the Android System Trace viewer instead of the Snapdragon Profiler.
  • +
+

Application Lifecycle Management

+

FMOD will happily continue to operate when your device is in the background, for media playback applications this may be desirable. For the vast majority of use cases though, you want FMOD to be quiet and use no CPU. You can achieve this goal by using System::mixerSuspend and System::mixerResume, often it is convenient to implement these in the activity onStart and onStop overrides. To avoid issues when shutting down ensure you resume the mixer before releasing, it is recommended you perform this in the onDestroy override.

+

Example Java code

+
@Override
+protected void onStart()
+{
+    super.onStart();
+    setStateStart();
+}
+
+@Override
+protected void onStop()
+{
+    setStateStop();
+    super.onStop();
+}
+
+@Override
+protected void onDestroy()
+{
+    setStateDestroy();
+    super.onDestroy();
+}
+
+private native void setStateStart();
+private native void setStateStop();
+private native void setStateDestroy();
+
+ +

Example C++ code

+
void Java_org_fmod_example_MainActivity_setStateStart(JNIEnv *env, jobject thiz)
+{
+    gSystem->mixerResume();
+}
+
+void Java_org_fmod_example_MainActivity_setStateStop(JNIEnv *env, jobject thiz)
+{
+    gSystem->mixerSuspend();
+}
+
+void Java_org_fmod_example_MainActivity_setStateDestroy(JNIEnv *env, jobject thiz)
+{
+    gSystem->mixerResume();
+}
+
+ +

The result of using this API will be the halt of the audio hardware and a complete lock of all FMOD threads. It is important that you do not call any FMOD API functions after System::mixerSuspend other than System::mixerResume, even if you intend to shutdown FMOD as you may cause a deadlock.

+

Performance Reference

+

This section is a companion for the CPU Performance white paper and serves as a quick reference of facts targeting this platform.

+

Format Choice

+

Each compression format provided in FMOD has a reason for being included, the below list will detail our recommendations for this platform. Formats listed as primary are considering the best choice, secondary formats should only be considered if the primary doesn't satisfy your requirements.

+
    +
  • FADPCM: Primary format for all sounds.
  • +
  • Vorbis: Secondary format for long streams if FADPCM compression is too low.
  • +
  • PCM: Secondary format for short sounds if FADPCM cost is too high.
  • +
  • XMA: Unavailable.
  • +
  • AT9: Unavailable.
  • +
+

Channel Count

+

To give developers an idea about the costs of a particular format we provide synthetic benchmark results. These results are based on simple usage of the Studio API using recommended configuration settings.

+

Due to the CPU governor that controls the power saving features of the device, getting accurate CPU numbers requires rooting the device and setting the CPU frequency to maximum.

+

Settings

+
    +
  • Real channel count: 32
  • +
  • Sample rate: 24 kHz
  • +
  • Speaker mode: Stereo
  • +
  • DSP block size: 512 samples
  • +
+

Test Device: A

+
    +
  • CPU: SHIELD Android TV
  • +
  • OS: Android 9
  • +
+

Results: A

+
    +
  • DSP with Vorbis: 8.66% (+/- 1.28%)
  • +
  • DSP with FADPCM: 2.64% (+/- 0.21%)
  • +
  • DSP with PCM: 1.98% (+/- 0.22%)
  • +
  • Update at 60 FPS: 1.48% (+/- 6.86%)
  • +
+

Test Device: B

+
    +
  • CPU: Redmi 5A
  • +
  • OS: Android 8.1.0
  • +
+

Results: B

+
    +
  • DSP with Vorbis: 21.29% (+/- 5.11%)
  • +
  • DSP with FADPCM: 5.45% (+/- 0.72%)
  • +
  • DSP with PCM: 4.63% (+/- 0.69%)
  • +
  • Update at 60 FPS: 3.72% (+/- 2.93%)
  • +
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-html5.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-html5.html new file mode 100644 index 0000000..c11aab0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-html5.html @@ -0,0 +1,634 @@ + + +Platform Details | HTML5 + + + + +
+ +
+

4. Platform Details | HTML5

+ +

HTML5 Specific Starter Guide

+

Running FMOD as HTML5 on the web is made possible by having a web server host and deliver the JavaScript content to the client web browser. In a production environment this would be hosted using a professional web server such as Apache, but during development we recommend an easy to set up local server such as Web Server for Chrome

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • Emscripten - 3.1.67
  • +
+

Compatibility

+

FMOD supports the following minimum browser versions.

+
    +
  • Firefox: 79
  • +
  • Safari: 14.1.0
  • +
  • Chrome: 85
  • +
+

Limitations

+

The web presents a unique set of challenges that make this implementation less than perfect when compared to other platforms supported by the FMOD Engine.

+

Multi-threading

+

One significant disadvantage is the lack of multi-threading, or more specifically, limited browser support of features such as SharedArrayBuffer that prevent our toolchain from implementing pthread support. This limitation means we must run mixing, streaming and loading all in the game thread requiring added latency to hide the additional CPU cost.

+

Networking

+

Another disadvantage of the web platform is the lack of networking sockets. There are alternatives provided by our toolchain, however they require additional servers running as a proxy. This limitation means we cannot implement Live Update and Profiling features between the running code and FMOD Studio. Additionally this means we cannot support internet streaming of audio (netstreams).

+

Performance

+

Many platforms benefit from targeted instruction level optimization known as SIMD (single instruction multiple data), these optimizations allow FMOD to perform several times faster than with standard C code instructions alone. Unfortunately development of SIMD for the web is an ongoing process and not ready for us to consume. This coupled with the fact the native FMOD C code has been converted to run in a browser means you will experience worse performance than the equivalent application running natively (outside the browser).

+

Libraries

+

There are a large number of binaries for HTML5 covering different runtime formats and compatibility.

+

The folder structure we use represents the choices you must make following this pattern: /api/{fmod-api}/lib/{binary-format}/*

+
    +
  • {fmod-api} Select either core or studio depending on which API you wish to use. For HTML5 (unlike other platforms) studio already contains the core library so including the core library separately is not necessary.
  • +
  • {binary-format} Select wasm for the most performant feature-rich version targeting modern browsers or js for compatibility with older browsers.
      +
    • If you are developing in HTML / Javascript your choices are: +
    • +
    • If you are developing in C / C++ your choices are: +
    • +
    +
  • +
+

To include FMOD using JavaScript in a html file, refer to the following example in your HTML. Filename will vary based on what HTML technology or logging/reduced variant you might be using.

+

Core API Only:

+
<script type="text/javascript" src="fmod.js"></script>
+
+ +

Studio API:

+
<script type="text/javascript" src="fmodstudio.js"></script>
+
+ +

Technology choice

+

Select from below for your technology choice, and refer to the table for the folder the FMOD libraries are located in, and any accompanying files that must be copied in with them to your project folder.

+
+

WASM

+

Faster (approximately 30%) and uses half the memory of Javascript, but requires the web browser to support the WASM technology, and also a web server that understands the .wasm 'application/wasm' mime type.

+

Core API libraries - Located in /api/core/lib/wasm/

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Core API fileCompanion file (put in same folder)Description
fmod.jsfmod.wasmRelease library for production code
fmodL.jsfmodL.wasmRelease library with logging output, use for debugging
fmod_reduced.jsfmod_reduced.wasmSmaller release library for production code, with reduced features
+

Studio API libraries - Located in /api/studio/lib/wasm/. The Studio API files already contain the Core API, so you do not need to include the Core API files as well.

+ + + + + + + + + + + + + + + + + + + + +
Studio API fileCompanion file (put in same folder)Description
fmodstudio.jsfmodstudio.wasmRelease library for production code. Includes fmod_reduced.js
fmodstudioL.jsfmodstudioL.wasmRelease library with logging output, use for debugging
+
+

JS

+

Older Javascript compiled. Slower and uses more memory, but best for compatibility.

+

Core API libraries - Located in /api/core/lib/js/

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Core API fileCompanion file (put in same folder)Description
fmod.jsfmod.js.memRelease library for production code
fmodL.jsfmodL.js.memRelease library with logging output, use for debugging
fmod_reduced.jsfmod_reduced.js.memSmaller release library for production code, with reduced features
+

Studio API libraries - Located in /api/studio/lib/js/. The Studio API files already contain the Core API, so you do not need to include the Core API files as well.

+ + + + + + + + + + + + + + + + + + + + +
Studio API fileCompanion file (put in same folder)Description
fmodstudio.jsfmodstudio.js.memRelease library for production code. Contains fmod_reduced.js
fmodstudioL.jsfmodstudioL.js.memRelease library with logging output, use for debugging. Contains fmodL.js
+
+

W32

+

For using Emscripten with your own C/C++ code to convert to JavaScript. W32 is an intermediate format.

+

Core API libraries - Located in /api/core/lib/w32/

+ + + + + + + + + + + + + + + + + + + + + +
Core API fileDescription
fmod.aRelease binary for production code
fmodL.aRelease binary with logging enabled for development
fmod_reduced.aSmaller release binary with reduced features, for production code.
+

Studio API libraries - Located in /api/studio/lib/w32/. The Studio API files already contain the Core API, so you do not need to include the Core API files as well.

+ + + + + + + + + + + + + + + + + +
Studio API fileDescription
fmodstudio.aRelease binary for production code. Contains fmod_reduced.a
fmodstudioL.aRelease binary with logging enabled for development. Contains fmodL.a
+

Note: The fmodstudio versions of the library include the fmod_reduced version of the core, so accessing things like .ogg/.mp3 (see reduced ) through Studio::System::getCoreSystem are not supported. Use the fmodstudioL version to get full access to all features.

+

Building a C/C++ program that uses FMOD libraries

+

If you have a C/C++ program that uses FMOD and are converting it to JavaScript using Emscripten, you will need to link the relevant FMOD binaries as per the Emscripten Documentation, and ensure the following flag is added in your Emscripten compilation arguments:

+
-s EXPORTED_RUNTIME_METHODS=ccall,cwrap,setValue,getValue
+
+ +

Browser Compatibility

+
    +
  • FMOD requires a browser to support web-audio to be compatible, this is supported by all current browsers, see details here.
  • +
  • For using the WASM version of FMOD there are additional restrictions, however most mainstream browsers have support, see details here.
  • +
  • Browser support for 5.1 / surround sound is supported but maybe limited to certain browsers, and was adopted early by Mozilla Firefox verified in version 50.1.0.
  • +
  • Modern browsers require user interaction to initiate audio, see "Essential Startup Information" below for details.
  • +
  • Browsers that support AudioWorkletNode will automatically use FMOD_OUTPUTTYPE_AUDIOWORKLET for this functionality.
  • +
  • If AudioWorkletNode is supported, a fast code path using SharedArrayBuffer can be set from the server header, using "Cross-Origin-Opener-Policy: same-origin" and "Cross-Origin-Embedder-Policy: require-corp" policies. Please follow this guide for further information on how this is done.
  • +
  • Presently there is a bug where AudioWorkletNode functionality will not download from the web if your website uses http but https works correctly. If it fails to download FMOD will default to FMOD_OUTPUTTYPE_WEBAUDIO.
  • +
+

Output Modes

+

The FMOD engine supports two FMOD_OUTPUTTYPE modes for Web Audio.

+ +

Essential Startup Information

+

Start up code

+

To start with FMOD in a JavaScript environment you must initialize a global FMOD object, which you can then call FMOD functions with.

+

This involves declaring a variable (ie 'FMOD') then calling a constructor function on it ( 'ie FMODModule(FMOD); )

+

Before this constructor is called, some optional user callbacks can be set for pre / post emscripten initialization, as well as the FMOD memory block size for ASM.JS users.

+
var FMOD = {};                          // FMOD global object which must be declared to enable 'main' and 'preRun' and then call the constructor function.
+FMOD['preRun'] = prerun;                // Will be called before FMOD runs, but after the Emscripten runtime has initialized
+FMOD['onRuntimeInitialized'] = main;    // Called when the Emscripten runtime has initialized
+FMOD['INITIAL_MEMORY'] = 64*1024*1024;  // (ASM.JS ONLY) FMOD Heap defaults to 16mb which is enough for this demo, but set it differently here for demonstration (64mb)
+FMODModule(FMOD);                       // Calling the constructor function with our object
+
+ +

User interaction requirement

+

Most browsers have a user interaction requirement, or audio will not be audible.
+This was implemented to stop unscrupulous websites from auto playing audio in things like advertisements.

+

FMOD output will become audible upon detecting a user interaction.

+

Reduced Feature build

+

fmod_reduced.js and fmodstudio.js feature removal

+

Overview

+

The fmod_reduced library is a smaller subset of features. The following is a list of what is removed.

+

fmodstudio.js includes fmod_reduced.js by default. To get the full feature set use fmodstudioL.js instead.

+

Codec Support

+

The following are removed in favour of .FSB only. .FSB support includes vorbis, FADPCM and pcm compression formats.

+
    +
  • AIFF file format support
  • +
  • DLS file format support
  • +
  • FLAC file format support
  • +
  • WAV file format support
  • +
  • MOD file format support
  • +
  • S3M file format support
  • +
  • XM file format support
  • +
  • IT file format support
  • +
  • MID/MIDI file format support
  • +
  • MP2/MP3 file format support
  • +
  • OGG file format support
  • +
  • PLS/M3U file format support
  • +
  • DLS file format support
  • +
+

DSP Effect support

+

The following are removed due to relative expensiveness of the effect and usage rates being below other types of effects.

+
    +
  • Envelope follower DSP support
  • +
  • Cubic / Spline and 'none' interpolation support. Linear interpolation only.
  • +
+

Speaker mode support

+ +

Feature support

+

The following features have been removed

+
    +
  • 3D Geometry occlusion processing (via polygons).
  • +
+

API - JavaScript port of a C/C++ API. Differences.

+

Setting and getting.

+

This is an important section if coming from knowledge of a C/C++ background of the FMOD API.

+

Javascript parameters are passed by value, therefore when you pass one to a function, it makes the concept of a 'getter' function difficult.
+The variable's value cannot be changed by the function from the caller's perspective, but it can add a new member to the variable, which is the mechanism FMOD always uses when 'getting' data from a function.

+

In C the variable can be altered as it would be passed by reference (using pointers).
+In FMOD for JavaScript, the variable you pass in gets a new member called val which contains the new data.
+i.e.

+
var outval;    // generic variable to reuse and be passed to FMOD functions.
+var name;      // to store name of sound.
+
+sound.getName(outval);
+name = outval.val;  // 'val' contains the data.  Pass it to the variable we want to keep.
+
+console.log(name);
+
+ +

All FMOD functions that produce data in a variable after calling a function return data this way.

+

Constants that started with FMOD_ in C/C++

+

In FMOD for JavaScript the enumerated values are members of the object declared at the top of the file.
+As this would normally be a variable called 'FMOD' it would be redundant to keep the FMOD_ as part of the constant name, so it is removed to avoid duplication.
+For example, instead of

+
FMOD.FMOD_OK
+
+ +

in FMOD for HTML5 it becomes:

+
FMOD.OK
+
+ +

similarly

+
FMOD_INIT_NORMAL
+FMOD_DEFAULT
+FMOD_ERR_FILE_NOTFOUND
+FMOD_GUID
+FMOD_3D_ATTRIBUTES
+etc
+
+ +

becomes

+
FMOD.INIT_NORMAL
+FMOD.DEFAULT
+FMOD.ERR_FILE_NOTFOUND
+FMOD.GUID()
+etc
+
+ +

Not that for attributes that start with a number after the FMOD namespace, it has to start with an underscore.
+For example.

+
FMOD._3D
+FMOD._2D
+FMOD._3D_ATTRIBUTES()
+
+ +

Using structures

+

In the above example you may notice that () is used to 'construct' a javascript object which represents a C structure in the FMOD API.
+When using a structure to pass information to FMOD, a helper/constuctor function must be called to create the structure before using it/filling in its members, so that FMOD can understand what is being passed to it.
+If these constructor functions are not used, the function it is being passed to will probably result in a 'binding' error (in the browser debug/log console/window).

+
var guid = FMOD.GUID();
+var info = FMOD.STUDIO_BANK_INFO();
+
+ +

API differences

+

Some API constructs are redundant for JavaScript, so are removed from the API.

+

Examples are 'cbsize' inside a struct. The JavaScript version of a struct already knows its own size, so it is removed/redundant here.

+

Structures like FMOD_CREATESOUNDEXINFO, FMOD_ADVANCEDSETTINGS and FMOD_STUDIO_ADVANCEDSETTINGS have these members, it can just be left out.

+

File Access

+

FMOD lets you load data from the host in a few different ways, depending on your setup.

+

Direct from host, via FMOD's filesystem

+

FMOD exposes an emscripten mechanism to mount/pre-load files in the 'prerun()' function, that is described above in the "Essential Startup Information" section of this document.
+Call FMOD.FS_createPreloadedFile to register your files so that FMOD can use filenames in file related functions. See Emscripten docs for more on this function.
+For example the playsound example

+
// Will be called before FMOD runs, but after the Emscripten runtime has initialized
+// Call FMOD file preloading functions here to mount local files.  Otherwise load custom data from memory or use own file system.
+function prerun()
+{
+    var fileUrl = "/public/js/";
+    var fileName;
+    var folderName = "/";
+    var canRead = true;
+    var canWrite = false;
+
+    fileName = [
+        "dog.wav",
+        "lion.wav",
+        "wave.mp3"
+    ];
+
+    for (var count = 0; count < fileName.length; count++)
+    {
+        FMOD.FS_createPreloadedFile(folderName, fileName[count], fileUrl + fileName[count], canRead, canWrite);
+    }
+}
+
+ +

Then later in your app you can simply reference a file by path/filename.

+
result = gSystem.createSound("/lion.wav", FMOD.LOOP_OFF, null, outval);
+CHECK_RESULT(result);
+
+ +

Via memory

+

If you have raw data in memory that you want to pass to FMOD , you can. Warning though, javascript passes data by value, so the memory usage will temporarily double for the sound data when it is passed to fmod.
+The load_from_memory has an example of this

+
var chars  = new Uint8Array(e.target.result);
+var outval = {};
+var result;
+var exinfo = FMOD.CREATESOUNDEXINFO();
+exinfo.length = chars.length;
+
+result = gSystem.createStream(chars.buffer, FMOD.LOOP_OFF | FMOD.OPENMEMORY, exinfo, outval);
+CHECK_RESULT(result);
+
+ +

Via callbacks

+

If you have a file system you can use file callbacks to load data into FMOD. See System::setFileSystem, or Studio::System::loadBankCustom
+In load_bank example, there is a demonstration of this

+
var info = new FMOD.STUDIO_BANK_INFO();
+
+info.opencallback = customFileOpen;
+info.closecallback = customFileClose;
+info.readcallback = customFileRead;
+info.seekcallback = customFileSeek;
+info.userdata = filename;
+
+result = gSystem.loadBankCustom(info, FMOD.STUDIO_LOAD_BANK_NONBLOCKING, outval);
+CHECK_RESULT(result);
+
+ +

In this case the filename is passed as userdata to let the callback get information for what file to load.
+Here is the customFileOpen callback getting the filename and opening a file handle.
+The file is opened in this case with a special FMOD provided file API. Replace this with your own API.

+
function customFileOpen(name, filesize, handle, userdata)
+{
+    var filesize_outval = {};
+    var handle_outval = {}
+
+    // We pass the filename into our callbacks via userdata in the custom info struct
+    var filename = userdata;
+
+    var result = FMOD.file_open(gSystemLowLevel, filename, filesize_outval, handle_outval)
+    if (result == FMOD.OK)
+    {
+        filesize.val = filesize_outval.val;
+        handle.val = handle_outval.val;
+    }
+
+    return result;
+}
+
+ +

To read data in the callback, into the buffer that FMOD has provided, FMOD has used a special technique where it passes the memory address, instead of a javascript buffer.
+This means to write data to FMOD's buffer you must use FMOD.setValue using the buffer address, writing the data in a loop, a byte at a time. This could be optimized somewhat by using i32 to write 4 bytes at a time.

+
function customFileRead(handle, buffer, sizebytes, bytesread, userdata)
+{
+    var bytesread_outval = {};
+    var buffer_outval = {};
+
+    // Read from the file into a new buffer.  This part can be swapped for your own file system.
+    var result = FMOD.file_read(handle, buffer_outval, sizebytes, bytesread_outval)   // read produces a new array with data.
+    if (result == FMOD.OK)
+    {
+        bytesread.val = bytesread_outval.val;
+    }
+
+    // Copy the new buffer contents into the buffer that is passed into the callback.  'buffer' is a memory address, so we can only write to it with FMOD.setValue
+    for (count = 0; count < bytesread.val; count++)
+    {
+        FMOD.setValue(buffer + count, buffer_outval.val[count], 'i8');      // See https://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html#accessing-memory for docs on setValue.
+    }
+
+    return result;
+}
+
+ +

JavaScript specific functions for FMOD

+

Helper functions

+

FMOD comes with some functions to aid with reading file data and writing to memory buffers.
+Here is the list of functions that are provided.

+

System

+
FMOD['preRun'] = callback                // Variable to assign a function callback to.  Will be called before FMOD runs, but after the Emscripten runtime has initialized
+FMOD['onRuntimeInitialized'] = callback  // Assign a function to this member of FMOD, pre Called when the Emscripten runtime has initialized **
+FMODModule(fmodobject)                   // Constructor function to set up FMOD object before use.  fmodobject = the main FMOD object you will use throughout the application lifetime.
+
+FMOD.FS_createPreloadedFile              // Mounts a local file so that FMOD can recognize it when calling a function that uses a filename (ie loadBank/createSound).  See https://emscripten.org/docs/api_reference/Filesystem-API.html#FS.createPreloadedFile for more on this function.
+FMOD.System_Create                       // Only exported in FMOD.JS or FMODL.JS (Only use this function if using pure Core API).  See docs for System_Create
+FMOD.Studio_System_Create                // Only exported in FMODSTUDIO.JS or FMODSTUDIOL.JS (Only use this function if using Studio API). See docs for Studio::System_Create
+FMOD.ReadFile                            // Read the entire contents of a file into a memory variable, as preloaded by FMOD.FS_createPreloadedFile.  Call FMOD.Memory_Free on the variable after using it.  NOTE: output variable has 'val' and 'length' as the JS members to use as parameters to System::loadBankMemory.
+FMOD.Memory_Free                         // Free memory allocated by FMOD internally in FMOD.ReadFile
+
+ +

File

+
FMOD.file_open
+FMOD.file_close
+FMOD.file_read
+FMOD.file_seek
+
+ +

Misc

+
FMOD.setValue                           // See https://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html#accessing-memory for docs on setValue.
+
+ +

Linking FMOD for HTML5 in a C program that is to be converted via emscripten

+

You should be able to port existing C code with no special HTML5 related functionality. Link the fmod.bc file or the fmodstudio.bc file (not both!) into your application to get it to link.
+As mentioned previously FMOD_NONBLOCKING will not be needed, so your program might hang if System::update is not processed during any logic that waits on a getState function.

+

Performance and Memory

+

CPU Overhead

+

By default FMOD mixes at 48000hz. If the browser is not running at that rate, it will introduce a resampler to convert the rate, which consumes CPU time and adds a DSP block worth of latency.
+This can be solved by querying the hardware's rate before System::init, and calling System::setSoftwareFormat to the same rate as the output. Here is an example (from the PlaySound example):

+
var outval = {};
+result = gSystem.getDriverInfo(0, null, null, outval, null, null);
+CHECK_RESULT(result);
+result = gSystem.setSoftwareFormat(outval.val, FMOD.SPEAKERMODE_DEFAULT, 0)
+CHECK_RESULT(result);
+
+ +

Audio Stability (Stuttering)

+

Some devices cannot handle the default buffer size of 4 blocks of 1024 samples (4096 samples) without stuttering, so to avoid this set the buffer size in your application to 2 blocks of 2048.
+Here is an example

+
result = gSystem.setDSPBufferSize(2048, 2);
+CHECK_RESULT(result);
+
+ +

Threads

+

As stated in the introduction, FMOD for HTML5 does not have access to any threads so any loading/mixing/decoding/streaming/dsp has to be run in a blocking mode, from the main application loop.

+

Keep this in mind when loading sounds, or implementing DSP that may take a large time slice. If the application pre-loads sounds, and has a fast enough framerate that the FMOD mixing can execute in the same frame (with time left over) then there should be no audible glitching or frame rate glitching.

+

'Heap' Memory

+

FMOD defaults to 16mb of memory to load sounds with and create FMOD objects with. Use the following global before calling the main FMOD constructor object, to control how much memory to use.

+
FMOD['INITIAL_MEMORY'] = 64*1024*1024;    // (ASM.JS ONLY) FMOD Heap defaults to 16mb which is enough for this demo, but set it differently here for demonstration (64mb)
+
+ +

For WASM support, FMOD uses ALLOW_MEMORY_GROWTH, which will allow memory to grow dynamically from INITIAL_MEMORY up to a maximum of 2GB.

+

Limitations

+

Non-blocking loading

+

FMOD_NONBLOCKING and FMOD_STUDIO_LOAD_BANK_NONBLOCKING do not allow sound to load in the background, but it will process loading from the update loop instead.

+

Streaming is executed from the main thread. This may impact performance, so pre-loading sounds is preferred.

+

Streaming infers that the source is being loaded from 'disk' which is not usually done with HTML5, because data is usually pre-packaged with the javascript file, or streamed over http (from an external URL) so loading sounds into memory might make more sense here.

+

Known Issues

+

The following functions are not supported.
+Some have no place in JavaScript (ie loadPlugin) but others are incomplete at this point and can be added in a later point release.

+ +

The following callbacks remain unimplemented at this point, so they will not work.

+
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-ios.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-ios.html new file mode 100644 index 0000000..cf8a8ee --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-ios.html @@ -0,0 +1,334 @@ + + +Platform Details | iOS + + + + +
+ +
+

4. Platform Details | iOS

+ +

iOS Specific Starter Guide

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • Xcode - version 15.2 targeting SDK 17.2 for iOS/tvOS and SDK 1.0 for visionOS.
  • +
+

Compatibility

+

FMOD supports devices of the below architectures back to iOS/tvOS 12.0. Please note that armv6, armv7, armv7s and x86 are no longer supported by Xcode and thus are no longer supported by FMOD.

+
    +
  • iOS: arm64, arm64e
  • +
  • tvOS: arm64, arm64e
  • +
  • visionOS: arm64, arm64e
  • +
  • iOS simulator: x86_64, arm64
  • +
  • tvOS simulator: x86_64, arm64
  • +
  • visionOS simulator: x86_64, arm64
  • +
+

Libraries

+

Each lib is a universal binary containing the relevant architectures from the 'Compatibility' list above.

+

Core API library

+
    +
  • /api/core/lib/libfmod_iphoneos.a - Release iOS device binary for production code.
  • +
  • /api/core/lib/libfmodL_iphoneos.a - Release iOS device binary with logging enabled for development.
  • +
  • /api/core/lib/libfmod_iphonesimulator.a - Release iOS simulator binary for production code.
  • +
  • /api/core/lib/libfmodL_iphonesimulator.a - Release iOS simulator binary with logging enabled for development.
  • +
  • /api/core/lib/libfmod_appletvos.a - Release tvOS device binary for production code.
  • +
  • /api/core/lib/libfmodL_appletvos.a - Release tvOS device binary with logging enabled for development.
  • +
  • /api/core/lib/libfmod_appletvsimulator.a - Release tvOS simulator binary for production code.
  • +
  • /api/core/lib/libfmodL_appletvsimulator.a - Release tvOS simulator binary with logging enabled for development.
  • +
  • /api/core/lib/libfmod_xros.a - Release visionOS device binary for production code.
  • +
  • /api/core/lib/libfmodL_xros.a - Release visionOS device binary with logging enabled for development.
  • +
  • /api/core/lib/libfmod_xrsimulator.a - Release visionOS simulator binary for production code.
  • +
  • /api/core/lib/libfmodL_xrsimulator.a - Release visionOS simulator binary with logging enabled for development.
  • +
+

Studio API library (used in conjunction with Core API library)

+
    +
  • /api/studio/lib/libfmodstudio_iphoneos.a - Release iOS device binary for production code.
  • +
  • /api/studio/lib/libfmodstudioL_iphoneos.a - Release iOS device binary with logging enabled for development.
  • +
  • /api/studio/lib/libfmodstudio_iphonesimulator.a - Release iOS simulator binary for production code.
  • +
  • /api/studio/lib/libfmodstudioL_iphonesimulator.a - Release iOS simulator binary with logging enabled for development.
  • +
  • /api/studio/lib/libfmodstudio_appletvos.a - Release tvOS device binary for production code.
  • +
  • /api/studio/lib/libfmodstudioL_appletvos.a - Release tvOS device binary with logging enabled for development.
  • +
  • /api/studio/lib/libfmodstudio_appletvsimulator.a - Release tvOS simulator binary for production code.
  • +
  • /api/studio/lib/libfmodstudioL_appletvsimulator.a - Release tvOS simulator binary with logging enabled for development.
  • +
  • /api/studio/lib/libfmodstudio_xros.a - Release visionOS device binary for production code.
  • +
  • /api/studio/lib/libfmodstudioL_xros.a - Release visionOS device binary with logging enabled for development.
  • +
  • /api/studio/lib/libfmodstudio_xrsimulator.a - Release visionOS simulator binary for production code.
  • +
  • /api/studio/lib/libfmodstudioL_xrsimulator.a - Release visionOS simulator binary with logging enabled for development.
  • +
+

Apple libraries (required for the Core API and Studio API libraries)

+
    +
  • AudioToolbox.framework - Audio output.
  • +
  • AVFoundation.framework - Audio Session query.
  • +
+

Hardware Decoding

+

Via the AudioQueue codec FMOD supports decoding AAC, ALAC and MP3. At present iOS devices only have support for decoding one sound with hardware at a time (which may be consumed by playing the iPod). At the cost of extra CPU, all iOS devices have access to software codecs to support more than one sound of these formats. By default FMOD will try to use hardware, if it is in use a software codec will be used. If you want explicit control over whether hardware or software is chosen you can use the FMOD_AUDIOQUEUE_CODECPOLICY enumeration provided in fmod_ios.h. This is set with FMOD_CREATESOUNDEXINFO::audioqueuepolicy via System::createSound.

+

When playing MP3s using the AudioQueue codec, seeking is generally slow for the first time each position is visited. If you need fast random access to a file you can create the sound using the FMOD_ACCURATETIME flag. This will scan the file at load time to determine its accurate length, which has the benefit of creating a seek table to aid in seeking. This is a one-time upfront cost for fast seeking vs paying the cost at runtime for each unique position.

+

All decoding performed by the AudioQueue codec is done on standalone files such as .mp3, .m4a, etc. There is no support for using AudioQueue with FSB or bank compressed audio. Any MP3 decoding for FSB files is performed by the standard cross-platform FMOD decoder.

+

Handling Interruptions

+

Unlike in previous versions of FMOD, it is now the responsibility of the developer to interact with the AudioSession APIs native to this platform. To assist in this matter we provide two functions you can use when you need to handle interruptions, System::mixerSuspend and System::mixerResume. For more information about interruptions please check the Apple documentation.

+
bool gIsSuspended = false;
+bool gNeedsReset = false;
+// Substitute 'coreSystem' below wth you FMOD:System pointer.
+
+[[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionInterruptionNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
+{
+    AVAudioSessionInterruptionType type = (AVAudioSessionInterruptionType)[[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
+    if (type == AVAudioSessionInterruptionTypeBegan)
+    {
+        // Ignore deprecated warnings regarding AVAudioSessionInterruptionReasonAppWasSuspended and
+        // AVAudioSessionInterruptionWasSuspendedKey, we protect usage for the versions where they are available
+        #pragma clang diagnostic push
+        #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
+        // If the audio session was deactivated while the app was in the background, the app receives the
+        // notification when relaunched. Identify this reason for interruption and ignore it.
+        if (@available(iOS 16.0, tvOS 14.5, *))
+        {
+            // Delayed suspend-in-background notifications no longer exist, this must be a real interruption
+        }
+        #if !TARGET_OS_TV // tvOS never supported "AVAudioSessionInterruptionReasonAppWasSuspended"
+        else if (@available(iOS 14.5, *))
+        {
+            if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionReasonKey] intValue] == AVAudioSessionInterruptionReasonAppWasSuspended)
+            {
+                return; // Ignore delayed suspend-in-background notification
+            }
+        }
+        #endif
+        else
+        {
+            if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionWasSuspendedKey] boolValue])
+            {
+                return; // Ignore delayed suspend-in-background notification
+            }
+        }
+
+        coreSystem->mixerSuspend();
+        gIsSuspended = true;
+
+        #pragma clang diagnostic pop
+    }
+    else if (type == AVAudioSessionInterruptionTypeEnded)
+    {
+        NSError *errorMessage = nullptr;
+        if (![[AVAudioSession sharedInstance] setActive:TRUE error:&errorMessage])
+        {
+            // Interruption like Siri can prevent session activation, wait for did-become-active notification
+            return;
+        }
+
+        coreSystem->mixerResume();
+        gIsSuspended = false;
+    }
+}];
+
+[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
+{
+    if (gNeedsReset)
+    {
+        coreSystem->mixerSuspend();
+        gIsSuspended = true;
+    }
+
+    NSError *errorMessage = nullptr;
+    if (![[AVAudioSession sharedInstance] setActive:TRUE error:&errorMessage])
+    {
+        if ([errorMessage code] == AVAudioSessionErrorCodeCannotStartPlaying)
+        {
+            // Interruption like Screen Time can prevent session activation, but will not trigger an interruption-ended notification.
+            // There is no other callback or trigger to hook into after this point, we are not in the background and there is no other audio playing.
+            // Our only option is to have a sleep loop until the Audio Session can be activated again.
+            while (![[AVAudioSession sharedInstance] setActive:TRUE error:nil])
+            {
+                usleep(20000);
+            }
+        }
+        else
+        {
+            // Interruption like Siri can prevent session activation, wait for interruption-ended notification.
+            return;
+        }
+    }
+
+    // It's possible the system missed sending us an interruption end, so recover here
+    if (gIsSuspended)
+    {
+        coreSystem->mixerResume();
+        gNeedsReset = false;
+        gIsSuspended = false;
+    }
+}];
+
+[[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionMediaServicesWereResetNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
+{
+    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || gIsSuspended)
+    {
+        // Received the reset notification while in the background, need to reset the AudioUnit when we come back to foreground.
+        gNeedsReset = true;
+    }
+    else
+    {
+        // In the foregound but something chopped the media services, need to do a reset.
+        coreSystem->mixerSuspend();
+        coreSystem->mixerResume();
+    }
+}];
+
+ +

Lock Screen & Background Audio

+

There is no special configuration inside FMOD required to enable the playback of audio from the lock screen or the background, there are two things you must configure outside of FMOD to do this though.

+
    +
  1. Choose an AudioSession category that supports background / lock screen audio, see audio session basics for more details.
  2. +
  3. Enable background audio functionality in your info.plist with the UIBackgroundModes key, see the iOS key reference for more details.
  4. +
+

When playing audio on the lock screen (or during the fade out transition to silence when locking) it is important to ensure your buffering is configured correctly to allow low power audio playback. Please consult the latency section of this doc for further details.

+

Recording

+

Much like lock screen and background audio, recording requires a particular AudioSession category to be active at the time of System::recordStart (and must remain active until the recording finishes). The required category is called 'play and record' and can be read about in the audio session basics documentation. Note that FMOD is always 'playing' audio (even silence) so it is not sufficient to simply use the 'recording' category unless you are running the 'No Sound' or 'Wav Writer' output mode.

+

Some devices may take some time to switch AudioSession category so it is recommended to set this category at application start time to avoid any hiccups in audio playback.

+

You will also need to add a "Privacy - Microphone Usage Description" (NSMicrophoneUsageDescription) key to the built project's Info.plist file, with a string value explaining to the user how your application will use their recorded data.

+

Latency

+

The default latency introduced by FMOD for this platform is 4 blocks of 512 samples at a sample rate of 24 kHz, which equates to approximately 85 ms. You are free to change this using two APIs, System::setDSPBufferSize and System::setSoftwareFormat but there are some important considerations.

+

If you have configured background or lock screen audio when locking the device the OS will conserve power by requesting audio from FMOD less frequently. If you desire this functionality please ensure your DSP buffer size is sufficiently large to cover the request. The iOS operating system will expect 4096 samples to be available, so configure FMOD as 8 blocks of 512 samples or 4 blocks of 1024 samples to satisfy the request (otherwise silence will be produced and a warning issued on the TTY).

+

If you are worried about latency and do not want automatic low power mode you can configure the Audio Session buffer and sample rate to match FMOD for best results. Assuming an FMOD block size of 512 samples and 24 kHz sample rate you should configure the OS with the following:

+
AVAudioSession *session = [AVAudioSession sharedInstance];
+double rate = 24000.0; // This should match System::setSoftwareFormat 'samplerate' which defaults to 24000
+int blockSize = 512; // This should match System::setDSPBufferSize 'bufferlength' which defaults to 512
+
+BOOL success = [session setPreferredSampleRate:rate error:nil];
+assert(success);
+
+success = [session setPreferredIOBufferDuration:blockSize / rate error:nil];
+assert(success);
+
+success = [session setActive:TRUE error:nil];
+assert(success);
+
+ +

Multi-channel Output

+

For hardware that supports greater than stereo output you can configure the device to operate with that channel count using the AudioSession API.

+

Here is a code snippet that demonstrates using as many channels as available:

+
AVAudioSession *session = [AVAudioSession sharedInstance];
+long maxChannels = [session maximumOutputNumberOfChannels];
+
+BOOL success = [session setPreferredOutputNumberOfChannels:maxChannels error:nil];
+assert(success);
+
+success = [session setActive:TRUE error:nil];
+assert(success);
+
+ +

Suspend in Background

+

FMOD native threads will continue running when your application transitions to the background, this will continue to use resources. To completely stop FMOD without losing your current setup you can call System::mixerSuspend as part of your backgrounding process. When you return to the foreground, use System::mixerResume to reactivate FMOD. It is extremely important to ensure no FMOD APIs are called in-between suspend and resume as they run the risk of causing a deadlock. You must also call suspend and resume pairs on the same thread.

+

Thread Affinity

+

All threads will default to FMOD_THREAD_AFFINITY_CORE_ALL, it is not currently possible to override this with Thread_SetAttributes.

+

Thread Priority

+

The relationship between FMOD platform agnostic thread priority and the platform specific values is as follows:

+ +

For FMOD to detect the channel count you must use setPreferredOutputNumberOfChannels and activate your AudioSession before calling System::init.

+

Performance Reference

+

This section is a companion for the CPU Performance white paper and serves as a quick reference of facts targeting this platform.

+

Format Choice

+

Each compression format provided in FMOD has a reason for being included, the below list will detail our recommendations for this platform. Formats listed as primary are considering the best choice, secondary formats should only be considered if the primary doesn't satisfy your requirements.

+
    +
  • FADPCM: Primary format for all sounds.
  • +
  • Vorbis: Secondary format for long streams if FADPCM compression is too low.
  • +
  • PCM: Secondary format for short sounds if FADPCM cost is too high.
  • +
  • AAC: Special format for long streams, single hardware assisted codec available for .MP4 / .M4A files.
  • +
  • XMA: Unavailable.
  • +
  • AT9: Unavailable.
  • +
+

Channel Count

+

To give developers an idea about the costs of a particular format we provide synthetic benchmark results. These results are based on simple usage of the Studio API using recommended configuration settings.

+

Settings

+
    +
  • Real channel count: 32
  • +
  • Sample rate: 24 kHz
  • +
  • Speaker mode: Stereo
  • +
  • DSP block size: 1024 samples
  • +
+

Test Device: A

+
    +
  • CPU: Apple A7 @ 1.3 GHz (iPhone 5S)
  • +
  • OS: 12.5.1
  • +
+

Results: A

+
    +
  • DSP with Vorbis: 5.27% (+/- 0.76%)
  • +
  • DSP with FADPCM: 2.21% (+/- 0.30%)
  • +
  • DSP with PCM: 1.36% (+/- 0.23%)
  • +
  • Update at 60 FPS: 0.89% (+/- 0.52%)
  • +
+

Test Device: B

+
    +
  • CPU: Apple A8 @ 1.5 GHz (iPad mini 4)
  • +
  • OS: 14.4.1
  • +
+

Results: B

+
    +
  • DSP with Vorbis: 4.16% (+/- 0.76%)
  • +
  • DSP with FADPCM: 1.68% (+/- 0.50%)
  • +
  • DSP with PCM: 0.97% (+/- 0.42%)
  • +
  • Update at 60 FPS: 0.82% (+/- 1.01%)
  • +
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-linux.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-linux.html new file mode 100644 index 0000000..0c42264 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-linux.html @@ -0,0 +1,133 @@ + + +Platform Details | Linux + + + + +
+ +
+

4. Platform Details | Linux

+ +

Linux Specific Starter Guide

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • LLVM/Clang - version 10.
  • +
+

Compatibility

+

FMOD supports systems that provide ALSA v0.9.0rc4 or newer for the following architectures:

+
    +
  • x86 - requires SSE2, optimized with SSE3 if detected at runtime, minimum GNU C library GLIBC_2.2, minimum GNU C++ library CXXABI_1_3, GLIBCXX_3.4.
  • +
  • x86_64 - requires SSE2 (implied by x86_64), optimized with SSE3 or AVX if detected at runtime, minimum GNU C library GLIBC_2.2.5, minimum GNU C++ library CXXABI_1_3, GLIBCXX_3.4.
  • +
  • arm - requires armv7 or newer with NEON, hard float ABI (gnueabihf), minimum GCC library GCC_3.5, minimum GNU C library GLIBC_2.4, minimum GNU C++ library CXXABI_1_3, GLIBCXX_3.4.
  • +
  • arm64 - requires armv8, minimum GCC library GCC_3.5, minimum GNU C library GLIBC_2.17, minimum GNU C++ library CXXABI_1_3, GLIBCXX_3.4.
  • +
+

Libraries

+

Substitute $ARCH with your desired architecture from the 'Compatibility' list above.

+

Core API library

+
    +
  • /api/core/lib/$ARCH/libfmod.so - Release binary for production code.
  • +
  • /api/core/lib/$ARCH/libfmodL.so - Release binary with logging enabled for development.
  • +
+

Studio API library (used in conjunction with the Core API library)

+
    +
  • /api/studio/lib/$ARCH/libfmodstudio.so - Release binary for production code.
  • +
  • /api/studio/lib/$ARCH/libfmodstudioL.so - Release binary with logging enabled for development.
  • +
+

Device Selection

+

FMOD defaults to using PulseAudio if available if no device is specified via System::setOutput. The environment variable FMOD_ALSA_DEVICE can be used to override this behavior, causing FMOD to use ALSA by default. It will also select the device specified by the variable value, if found, by default. Device names are as specified by the output of aplay -L.

+

Depending on the configuration of ALSA, a device that otherwise functions correctly may not be listed in the output of aplay -L, and as a result won't be available to FMOD. If this is the case, you may need to either add a namehint to the device's .asoundrc configuration file, or set defaults.namehint.showall to on in your ALSA configuration file /usr/share/alsa/alsa.conf.

+

Thread Affinity

+

All threads will default to FMOD_THREAD_AFFINITY_CORE_ALL, it is not currently possible to override this with Thread_SetAttributes.

+

Thread Priority

+

The relationship between FMOD platform agnostic thread priority and the platform specific values is as follows:

+ +

Troubleshooting

+

System::init returns FMOD_ERR_PLUGIN_MISSING:
+This can happen if your machine is missing the ALSA library libasound.so.2 for the desired architecture, almost any version of it will be sufficient. Please note that if you are on an x86_64 platform running an x86 application using FMOD you will need the x86 version of ALSA installed also.

+

Performance Reference

+

This section is a companion for the CPU Performance white paper and serves as a quick reference of facts targeting this platform.

+

Format Choice

+

Each compression format provided in FMOD has a reason for being included, the below list will detail our recommendations for this platform. Formats listed as primary are considering the best choice, secondary formats should only be considered if the primary doesn't satisfy your requirements.

+
    +
  • Vorbis: Primary format for all sounds.
  • +
  • FADPCM: Secondary format if Vorbis CPU usage is too high for low spec machines.
  • +
  • PCM: Not recommended.
  • +
  • XMA: Unavailable.
  • +
  • AT9: Unavailable.
  • +
+

Channel Count

+

To give developers an idea about the costs of a particular format we provide synthetic benchmark results. These results are based on simple usage of the Studio API using recommended configuration settings.

+

Settings

+
    +
  • Real channel count: 64
  • +
  • Sample rate: 48 kHz
  • +
  • Speaker mode: Stereo
  • +
  • DSP block size: 1024 samples
  • +
+

Test Device

+
    +
  • CPU: Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
  • +
  • OS: Ubuntu 20.10
  • +
+

Results

+
    +
  • DSP with Vorbis: 15.41% (+/- 3.01%)
  • +
  • DSP with FADPCM: 6.31% (+/- 0.25%)
  • +
  • DSP with PCM: 2.65% (+/- 0.17%)
  • +
  • Update at 60 FPS: 1.61% (+/- 0.16%)
  • +
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-mac.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-mac.html new file mode 100644 index 0000000..86116ae --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-mac.html @@ -0,0 +1,136 @@ + + +Platform Details | Mac + + + + +
+ +
+

4. Platform Details | Mac

+ +

macOS Specific Starter Guide

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • Xcode - version 15.0.1 targeting macOS 14.0.
  • +
+

Compatibility

+

FMOD supports x86_64 and arm64 back to macOS 10.13. Please note that both x86 and PPC are not accepted for submission to the Mac App Store and thus are no longer supported by FMOD.

+

Libraries

+

Core API library

+
    +
  • /api/core/lib/libfmod.dylib - Release binary for production code.
  • +
  • /api/core/lib/libfmodL.dylib - Release binary with logging enabled for development.
  • +
+

Studio API library (used in conjunction with the Core API library)

+
    +
  • /api/studio/lib/libfmodstudio.dylib - Release binary for production code.
  • +
  • /api/studio/lib/libfmodstudioL.dylib - Release binary with logging enabled for development.
  • +
+

Latency

+

The default latency introduced by FMOD for this platform is 4 blocks of 512 samples at a sample rate of 48 kHz, which equates to approximately 43 ms. You are free to change this using two APIs, System::setDSPBufferSize and System::setSoftwareFormat but there are some important considerations.

+

All audio devices have a number of samples they prefer to operate in, on Mac this is almost always 512, which makes our default a natural fit. If you use System::setDSPBufferSize to reduce FMODs granularity (to 256 samples for instance), be aware the audio device will still operate at its native block of 512 samples. If you would like to reduce the block size of the audio device (to 256 samples), after you have set the FMOD granularity and initialized the System object use the following code:

+
AudioUnit audioUnit;
+gSystem->getOutputHandle((void **)&audioUnit);
+
+AudioDeviceID audioDeviceID;
+UInt32 audioDeviceIDSize = sizeof(audioDeviceID);
+AudioUnitGetProperty(audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &audioDeviceID, &audioDeviceIDSize);
+
+UInt32 bufferFrameSize = 256;
+AudioDeviceSetProperty(audioDeviceID, NULL, 0, FALSE, kAudioDevicePropertyBufferFrameSize, sizeof(bufferFrameSize), &bufferFrameSize);
+
+ +

Suspend in Background

+

FMOD native threads will continue running when your application transitions to the background, this will continue to use resources. To completely stop FMOD without losing your current setup you can call System::mixerSuspend as part of your backgrounding process. When you return to the foreground, use System::mixerResume to reactivate FMOD. It is extremely important to ensure no FMOD APIs are called in-between suspend and resume as they run the risk of causing a deadlock. You must also call suspend and resume pairs on the same thread.

+

Thread Affinity

+

All threads will default to FMOD_THREAD_AFFINITY_CORE_ALL, it is not currently possible to override this with Thread_SetAttributes.

+

Thread Priority

+

The relationship between FMOD platform agnostic thread priority and the platform specific values is as follows:

+ +

Performance Reference

+

This section is a companion for the CPU Performance white paper and serves as a quick reference of facts targeting this platform.

+

Format Choice

+

Each compression format provided in FMOD has a reason for being included, the below list will detail our recommendations for this platform. Formats listed as primary are considering the best choice, secondary formats should only be considered if the primary doesn't satisfy your requirements.

+
    +
  • Vorbis: Primary format for all sounds.
  • +
  • FADPCM: Secondary format if Vorbis CPU usage is too high for low spec machines.
  • +
  • PCM: Not recommended.
  • +
  • XMA: Unavailable.
  • +
  • AT9: Unavailable.
  • +
+

Channel Count

+

To give developers an idea about the costs of a particular format we provide synthetic benchmark results. These results are based on simple usage of the Studio API using recommended configuration settings.

+

Settings

+
    +
  • Real channel count: 64
  • +
  • Sample rate: 48 kHz
  • +
  • Speaker mode: Stereo
  • +
  • DSP block size: 512 samples
  • +
+

Test Device

+
    +
  • CPU: Intel(R) Core(TM) i5-4278U CPU @ 2.60GHz
  • +
  • OS: macOS 10.15.7 (19H2)
  • +
+

Results

+
    +
  • DSP with Vorbis: 7.78% (+/- 0.95%)
  • +
  • DSP with FADPCM: 4.90% (+/- 0.61%)
  • +
  • DSP with PCM: 2.93% (+/- 0.58%)
  • +
  • Update at 60 FPS: 1.81% (+/- 0.35%)
  • +
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-openharmony.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-openharmony.html new file mode 100644 index 0000000..6c0d644 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-openharmony.html @@ -0,0 +1,137 @@ + + +Platform Details | Open Harmony + + + + +
+ +
+

4. Platform Details | Open Harmony

+ +

Open Harmony Specific Starter Guide

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • SDK - version 4.0.10.13 targeting API 10.
  • +
+

Compatibility

+

FMOD supports devices of the below ABIs back to API 10.

+
    +
  • armeabi-v7a - supported and optimized with NEON.
  • +
  • arm64-v8a - supported and optimized with NEON.
  • +
  • x86_64 - supported and optimized with SSE3.
  • +
+

Libraries

+

Substitute $ABI with your desired ABI from the 'Compatibility' list above.

+

Core API library

+
    +
  • /api/core/lib/$ABI/libfmod.so - Release binary for production code.
  • +
  • /api/core/lib/$ABI/libfmodL.so - Release binary with logging enabled for development.
  • +
+

Studio API library (used in conjunction with the Core API library)

+
    +
  • /api/studio/lib/$ABI/libfmodstudio.so - Release binary for production code.
  • +
  • /api/studio/lib/$ABI/libfmodstudioL.so - Release binary with logging enabled for development.
  • +
+

JavaScript

+

FMOD is primarily a native C/C++ library implementation but does provide a limited JavaScript interface to provide necessary data to the engine.

+

It is also highly recommended that you initialize the FMOD JavaScript interface, as this will allow loading assets from the App package. This should be done before System_Create or Studio::System::create, and should be closed after System::release or Studio::System::release.

+

To access the JavaScript interface you must create index.d.ts in src\main\cpp\types\libfmod with the following:

+
export const init: (ability: UIAbility) => void;
+export const close: () => void; 
+
+ +

Create an oh-package.json5 in src\main\cpp\types\libfmod with the following:

+
{
+  "name": "libfmod.so",
+  "types": "./index.d.ts",
+  "version": "",
+  "description": "FMOD Core Library."
+}
+
+ +

Reference the .d.ts in oh-package.json5 for the target (not application), which goes in devDependencies:

+
"devDependencies": {
+  "@types/libfmod.so": "file:./src/main/cpp/types/libfmod"
+},
+
+ +

To call FMOD JavaScript functions you need to edit your Ability.ts and add the following import:

+
import fmod from 'libfmod.so';
+
+ +

In your Ability onCreate function add:

+
fmod.init(this);
+
+ +

In your Ability onDestroy function add:

+
fmod.close();
+
+ +

It is expected that the API for FMOD is called from your existing native code in C++. It is important when initializing FMOD to not call the init function too early otherwise the audio device will fail. Make sure you call FMOD after the WindowStage ACTIVE event occurs, for example, you can edit your Ability.ts, and edit onWindowStageCreate to include the following:

+
windowStage.on('windowStageEvent', (data) => {
+  if (data == window.WindowStageEventType.ACTIVE) {
+    // Call you JS entry point for FMOD creation here
+  }
+  else if (data == window.WindowStageEventType.INACTIVE) {
+    // Call you JS entry point for FMOD destruction here
+  }
+});
+
+ +

Thread Affinity

+

All threads will default to FMOD_THREAD_AFFINITY_CORE_ALL, this is recommended due to the wide variety of devices available but can be customized with Thread_SetAttributes.

+

Thread Priority

+

The relationship between FMOD platform agnostic thread priority and the platform specific values is as follows:

+ +

Resume Audio on Return From Background

+

The system will pause FMOD when your app goes into the background, however it will not resume it when returning to the foreground. To handle this, call System::mixerSuspend from your UIAbility onBackground callback and call System::mixerResume from your UIAbility onForeground callback.

+

Latency

+

For SDK 10 devices, the hardware latency is fixed at ~90ms, for FMOD to operate in this high latency environment you must increase the FMOD buffer size to handle the latency. We recommend calling System::setDSPBufferSize with 2048 as the buffer length and 4 as the number of buffers.

+

For SDK 11 and newer devices, the hardware latency is internally configured to match the FMOD buffer length. If you do not call System::setDSPBufferSize, the default of 1024 buffer length and 4 buffers will be used, which the hardware can use without stuttering. If you want to set the buffer length lower than the default 1024, we recommend using FAST mode.

+

FAST mode is available on all devices and can be selected by calling System::setDriver with 1 before System::init (the default of 0 represents normal mode). With FAST mode activated you should be able to set the FMOD buffer length down to 512, with 4 buffers and achieve glitch free playback. However, please note some development boards cannot handle FAST mode and will result in a crash, thankfully we have seen no such crash in any consumer devices.

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-uwp.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-uwp.html new file mode 100644 index 0000000..2f857bc --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-uwp.html @@ -0,0 +1,183 @@ + + +Platform Details | Universal Windows Platform + + + + +
+ +
+

4. Platform Details | Universal Windows Platform

+ +

UWP Specific Starter Guide

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • Visual Studio - version 2017 targeting platform toolset v141
  • +
+

Compatibility

+

FMOD supports devices of the below architectures running Windows 10.

+
    +
  • x86 - optimized with SSE3.
  • +
  • x64 - optimized with SSE3 (and AVX if detected at runtime).
  • +
  • arm - optimized with VFPv2 (and NEON if detected at runtime).
  • +
+

Libraries

+

The provided libs are import libraries which require the corresponding DLL to be present at runtime. Substitute $ARCH your desired architecture from the 'Compatibility' list above.

+

Core API library

+
    +
  • /api/core/lib/$ARCH/fmod.lib - Release binary for production code (requires fmod.dll at runtime).
  • +
  • /api/core/lib/$ARCH/fmodL.lib - Release binary with logging enabled for development (requires fmodL.dll at runtime).
  • +
+

Studio API library (used in conjunction with the Core API library)

+
    +
  • /api/studio/lib/$ARCH/fmodstudio.lib - Release binary for production code (requires fmodstudio.dll at runtime).
  • +
  • /api/studio/lib/$ARCH/fmodstudioL.lib - Release binary with logging enabled for development (requires fmodstudioL.dll at runtime).
  • +
+

Plug-ins

+

FMOD includes a media foundation plug-in codec that can optionally be included in your game.

+
    +
  • /api/plugins/media_foundation/lib/$ARCH/media_foundation.dll
  • +
+

This has been separated in order to support Windows N by default - the media foundation plug-in is NOT compatible with Windows N unless the user installs the appropriate Media Feature Pack for Windows.

+

If included, FMOD can use the codec to support WMA, ASF, WMV, M4A and MP4 files.

+

Permissions

+

Some functionality inside of FMOD will require you set relevant capabilities in your manifest file.

+
    +
  • Microphone - to make use of the System::recordStart API, see Known Issues for further notes about recording.
  • +
  • Internet (Client) - to stream audio from the internet.
  • +
  • Private Networks (Client & Server) - to use FMOD profiler or FMOD Studio live update. See Known Issue for further notes about connecting.
  • +
+

Thread Affinity

+

All threads will default to FMOD_THREAD_AFFINITY_CORE_ALL, this is recommended due to the wide variety of PC hardware but can be customized with Thread_SetAttributes.

+

Thread Priority

+

The relationship between FMOD platform agnostic thread priority and the platform specific values is as follows:

+ +

Port Support

+

UWP supports the following port types when using FMOD_OUTPUTTYPE_WINSONIC:

+ +

Background Music

+

The background music will bypass the operating system's virtual speaker processing.

+

Below is a usage demonstration with error checking omitted for brevity:

+
FMOD::ChannelGroup *bgm;
+system->createChannelGroup("BGM", &bgm);
+system->attachChannelGroupToPort(FMOD_PORT_TYPE_MUSIC, FMOD_PORT_INDEX_NONE, bgm);
+
+FMOD::Channel* channel;
+system->playSound(music, bgm, false, &channel);
+
+ +

Pass Through

+

Use this port to bypass the operating system's virtual speaker processing for non-diegetic sounds.

+

Below is a usage demonstration with error checking omitted for brevity:

+
FMOD::ChannelGroup *passthrough;
+system->createChannelGroup("PASSTHROUGH", &passthrough);
+system->attachChannelGroupToPort(FMOD_PORT_TYPE_PASSTHROUGH, FMOD_PORT_INDEX_NONE, passthrough);
+
+FMOD::Channel *channel;
+system->playSound(your_non_diegetic_sound, passthrough, false, &channel);
+
+ +

Known Issues

+
    +
  • +

    Even after adding support for audio recording to your application manifest, you must still make sure to call System::recordStart in the UI thread so the system can display a warning to the user. Calling from any other thread will return FMOD_ERR_OUTPUT_INIT.

    +
  • +
  • +

    FMOD Studio will not be able to connect to the engine if they are both running on the same machine. This is a restriction imposed by the Windows Universal Application environment.

    +
  • +
+

Performance Reference

+

This section is a companion for the CPU Performance white paper and serves as a quick reference of facts targeting this platform.

+

Format Choice

+

Each compression format provided in FMOD has a reason for being included, the below list will detail our recommendations for this platform. Formats listed as primary are considering the best choice, secondary formats should only be considered if the primary doesn't satisfy your requirements.

+
    +
  • Vorbis: Primary format for all sounds.
  • +
  • FADPCM: Secondary format if Vorbis CPU usage is too high for low spec machines.
  • +
  • PCM: Not recommended.
  • +
  • XMA: Unavailable.
  • +
  • AT9: Unavailable.
  • +
+

Channel Count

+

To give developers an idea about the costs of a particular format we provide synthetic benchmark results. These results are based on simple usage of the Studio API using recommended configuration settings.

+

Settings

+
    +
  • Real channel count: 64
  • +
  • Sample rate: 48 kHz
  • +
  • Speaker mode: Stereo
  • +
  • DSP block size: 1024 samples
  • +
+

Test Device

+
    +
  • CPU: Intel(R) Core(TM) i5-6400T CPU @ 2.20GHz
  • +
  • OS: Microsoft Windows [Version 10.0.19042.867]
  • +
+

Results

+
    +
  • DSP with Vorbis: 6.45% (+/- 0.66%)
  • +
  • DSP with FADPCM: 3.00% (+/- 0.34%)
  • +
  • DSP with PCM: 1.33% (+/- 0.22%)
  • +
  • Update at 60 FPS: 0.77% (+/- 0.19%)
  • +
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-win.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-win.html new file mode 100644 index 0000000..203c3ca --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms-win.html @@ -0,0 +1,217 @@ + + +Platform Details | Windows + + + + +
+ +
+

4. Platform Details | Windows

+ +

Windows Specific Starter Guide

+

SDK Version

+

FMOD is compiled using the following tools.

+
    +
  • Visual Studio 2019 - version 16.11.0 targeting platform toolset v142.
  • +
+

Compatibility

+

FMOD supports the below architectures back to Windows 7.

+
    +
  • x86 - optimized with SSE3.
  • +
  • x64 - optimized with SSE3 (and AVX if detected at runtime).
  • +
  • ARM64 - optimized with NEON.
  • +
+

Libraries

+

The provided libs are import libraries which require the corresponding DLL to be present at runtime. Substitute $ARCH your desired architecture from the 'Compatibility' list above.

+

The C API of the supplied libraries are compatible with MinGW (C++ ABI not supported). The 64 bit dll can be linked directly. You will need to use the import library libfmod.a and libfmodstudio.a in order to link the 32 bit dlls.

+

If you encounter issues linking fmod with MinGW, ensure that you are following the GCC linker ordering requirements and the MinGW library search order.

+

Core API library

+
    +
  • /api/core/lib/$ARCH/fmod_vc.lib - Release binary for production code (requires fmod.dll at runtime).
  • +
  • /api/core/lib/$ARCH/fmodL_vc.lib - Release binary with logging enabled for development (requires fmodL.dll at runtime).
  • +
+

Studio API library (used in conjunction with the Core API library)

+
    +
  • /api/studio/lib/$ARCH/fmodstudio_vc.lib - Release binary for production code (requires fmodstudio.dll at runtime).
  • +
  • /api/studio/lib/$ARCH/fmodstudioL_vc.lib - Release binary with logging enabled for development (requires fmodstudioL.dll at runtime).
  • +
+

COM

+

Before calling any FMOD functions it is important to ensure COM is initialized. You can achieve this by calling CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED) on each thread that will interact with the FMOD Engine. This is balanced with a call to CoUninitialize() when you are completely finished with all calls to FMOD.

+

If you fail to initialize COM, FMOD will perform this on-demand for you issuing a warning. FMOD will not uninitialize COM in this case so it will be considered a memory leak.

+

To ensure correct behavior FMOD assumes when using the WASAPI output mode (default for Windows Vista and newer) that you call System::getNumDrivers, System::getDriverInfo and System::init from your UI thread. This ensures that any platform specific dialogs that need to be presented can do so. This recommendation comes from the IAudioClient interface docs on MSDN which state:

+
+

In Windows 8, the first use of IAudioClient to access the audio device should be on the STA thread. Calls from an MTA thread may result in undefined behavior.

+
+

ASIO and C#

+

If using FMOD_OUTPUTTYPE_ASIO with the C# wrapper, FMOD will need to be running on the STA thread to ensure COM is intialized correctly. This can be achieved by adding the STAThreadAttribute to the main method:

+
[STAThread]
+static void Main(string[] args)
+{
+    Factory.System_Create(out FMOD.System system);
+    system.setOutput(OUTPUTTYPE.ASIO);
+    system.init(32, INITFLAGS.NORMAL, IntPtr.Zero);
+}
+
+ +

ARM64

+

Building for ARM64 requires Visual Studio 2019 with toolset v142 and supports NEON.

+

Codec Support

+

The following are not supported:

+
    +
  • WMA file format support
  • +
+

DSP Effect Support

+

The following are not supported:

+
    +
  • VST format plug-ins
  • +
+

Output Mode Support

+

The following are not supported:

+
    +
  • ASIO output mode
  • +
+

Thread Affinity

+

All threads will default to FMOD_THREAD_AFFINITY_CORE_ALL, this is recommended due to the wide variety of PC hardware but can be customized with Thread_SetAttributes.

+

Thread Priority

+

The relationship between FMOD platform agnostic thread priority and the platform specific values is as follows:

+ +

Port Support

+

Windows supports the following port types when using FMOD_OUTPUTTYPE_WINSONIC:

+ +

Background Music

+

The background music will bypass the operating system's virtual speaker processing.

+

Below is a usage demonstration with error checking omitted for brevity:

+
FMOD::ChannelGroup *bgm;
+system->createChannelGroup("BGM", &bgm);
+system->attachChannelGroupToPort(FMOD_PORT_TYPE_MUSIC, FMOD_PORT_INDEX_NONE, bgm);
+
+FMOD::Channel* channel;
+system->playSound(music, bgm, false, &channel);
+
+ +

Pass Through

+

Use this port to bypass the operating system's virtual speaker processing for non-diegetic sounds.

+

Below is a usage demonstration with error checking omitted for brevity:

+
FMOD::ChannelGroup *passthrough;
+system->createChannelGroup("PASSTHROUGH", &passthrough);
+system->attachChannelGroupToPort(FMOD_PORT_TYPE_PASSTHROUGH, FMOD_PORT_INDEX_NONE, passthrough);
+
+FMOD::Channel *channel;
+system->playSound(your_non_diegetic_sound, passthrough, false, &channel);
+
+ +

Object Spatialization for 3D Audio (Windows Sonic)

+

Platform-specific object spatialization technologies can potentially offer more accurate spatialization than the FMOD spatializer effect. To take advantage of Windows Sonic to spatialize your events, you can use an FMOD object spatializer effect instead of an FMOD spatializer. Doing so bypasses any subsequent effects or sends, instead routing the event's audio from the FMOD object spatializer directly to Windows Sonic for object spatialization.

+

Most platforms can only handle a limited number of object-spatialized sounds, so the FMOD object spatializer effect is best reserved for use with important events.

+

Your machine must be configured to enable Windows Sonic. To enable Windows Sonic on Windows:

+
    +
  • Ensure that you are running Windows 10 Creators Update or later.
  • +
  • Open the control panel, and click on the sound icon. (If the sound icon does not appear, click on the hardware and sound category.)
  • +
  • In the playback tab of the sound window, right-click on your default audio device to open the context menu, then select "properties."
  • +
  • In the spatial sound tab of the properties window for your default audio device, open the spatial sound format dropdown menu and select "Windows Sonic" or "Windows Sonic for Headphones."
  • +
  • Click the OK button or the apply button to confirm the change.
  • +
+

For more information about object spatialization, see the Spatialization Options and Auditioning Object Spatialization and Height Panning sections of the FMOD Studio User Manual and the Spatial Audio White Paper section of the FMOD Engine User Manual.

+

Performance Reference

+

This section is a companion for the CPU Performance white paper and serves as a quick reference of facts targeting this platform.

+

Format Choice

+

Each compression format provided in FMOD has a reason for being included, the below list will detail our recommendations for this platform. Formats listed as primary are considering the best choice, secondary formats should only be considered if the primary doesn't satisfy your requirements.

+
    +
  • Vorbis: Primary format for all sounds.
  • +
  • FADPCM: Secondary format if Vorbis CPU usage is too high for low spec machines.
  • +
  • PCM: Not recommended.
  • +
  • XMA: Unavailable.
  • +
  • AT9: Unavailable.
  • +
+

Channel Count

+

To give developers an idea about the costs of a particular format we provide synthetic benchmark results. These results are based on simple usage of the Studio API using recommended configuration settings.

+

Settings

+
    +
  • Real channel count: 64
  • +
  • Sample rate: 48 kHz
  • +
  • Speaker mode: Stereo
  • +
  • DSP block size: 1024 samples
  • +
+

Test Device

+
    +
  • CPU: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz
  • +
  • OS: Microsoft Windows [Version 6.1.7601]
  • +
+

Results

+
    +
  • DSP with Vorbis: 6.88% (+/- 0.52%)
  • +
  • DSP with FADPCM: 3.10% (+/- 0.20%)
  • +
  • DSP with PCM: 1.59% (+/- 0.24%)
  • +
  • Update at 60 FPS: 0.82% (+/- 0.05%)
  • +
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms.html new file mode 100644 index 0000000..9767879 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/platforms.html @@ -0,0 +1,42 @@ + + +Platform Details + + + + + diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-codec.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-codec.html new file mode 100644 index 0000000..8eab5b4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-codec.html @@ -0,0 +1,1040 @@ + + +Plug-in API Reference | Codec + + + + +
+ +
+

9. Plug-in API Reference | Codec

+

An interface that manages codec plug-ins.

+

General:

+ +
+ +
+ +
+ +

FMOD_CODEC_ALLOC_FUNC

+

Codec allocate memory function.

+

+

+
C
+
C++
+
JS
+
+

+
void * F_CALL FMOD_CODEC_ALLOC_FUNC(
+  unsigned int size,
+  unsigned int align,
+  const char *file,
+  int line
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
size
+
+

Allocation size.

+
    +
  • Units: Bytes
  • +
+
+
align
+
+

Memory alignment.

+
    +
  • Units: Bytes
  • +
+
+
file
+
Source code file name where the allocation was requested.
+
line
+
Line of allocation in file.
+
+

See Also: FMOD_CODEC_STATE

+

FMOD_CODEC_CLOSE_CALLBACK

+

Codec close callback.

+

This callback is called to shut down and release memory for the codec instance.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_CLOSE_CALLBACK(
+  FMOD_CODEC_STATE *codec_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
+

Invoked by:

+ +

See Also: FMOD_CODEC_DESCRIPTION, FMOD_CODEC_OPEN_CALLBACK, FMOD_CODEC_SOUNDCREATE_CALLBACK

+

FMOD_CODEC_DESCRIPTION

+

Codec description.

+

This description structure allows the plug-in writer to define all functionality required for a user-defined codec.

+

+

+
C
+
C++
+
JS
+
+

+
typedef struct FMOD_CODEC_DESCRIPTION {
+  unsigned int                        apiversion;
+  const char                         *name;
+  unsigned int                        version;
+  int                                 defaultasstream;
+  FMOD_TIMEUNIT                       timeunits;
+  FMOD_CODEC_OPEN_CALLBACK            open;
+  FMOD_CODEC_CLOSE_CALLBACK           close;
+  FMOD_CODEC_READ_CALLBACK            read;
+  FMOD_CODEC_GETLENGTH_CALLBACK       getlength;
+  FMOD_CODEC_SETPOSITION_CALLBACK     setposition;
+  FMOD_CODEC_GETPOSITION_CALLBACK     getposition;
+  FMOD_CODEC_SOUNDCREATE_CALLBACK     soundcreate;
+  FMOD_CODEC_GETWAVEFORMAT_CALLBACK   getwaveformat;
+} FMOD_CODEC_DESCRIPTION;
+
+ +
FMOD_CODEC_DESCRIPTION
+{
+  apiversion,
+  name,
+  version,
+  defaultasstream,
+  timeunits,
+  open,
+  close,
+  read,
+  getlength,
+  setposition,
+  getposition,
+  soundcreate,
+  getwaveformat,
+};
+
+ +
+

Currently not supported for C#.

+
+
+
apiversion
+
The codec plug-in API version this plug-in is built for. Set to this to FMOD_CODEC_PLUGIN_VERSION.
+
name
+
Name of the codec.
+
version
+
Plug-in's version number.
+
defaultasstream
+
Defaults as stream.
+
timeunits
+
Time units used with setposition codec. (FMOD_TIMEUNIT)
+
open
+
Open callback. (FMOD_CODEC_OPEN_CALLBACK)
+
close
+
Close callback. (FMOD_CODEC_CLOSE_CALLBACK)
+
read
+
Read callback. (FMOD_CODEC_READ_CALLBACK)
+
getlength
+
Get length callback. (FMOD_CODEC_GETLENGTH_CALLBACK)
+
setposition
+
Seek callback. (FMOD_CODEC_SETPOSITION_CALLBACK)
+
getposition
+
Get position callback. (FMOD_CODEC_GETPOSITION_CALLBACK)
+
soundcreate
+
Sound creation callback. (FMOD_CODEC_SOUNDCREATE_CALLBACK)
+
getwaveformat
+
Get wave format callback. (FMOD_CODEC_GETWAVEFORMAT_CALLBACK)
+
+

See Also: FMOD_CODEC_STATE, FMOD_CODEC_WAVEFORMAT

+

FMOD_CODEC_FILE_READ_FUNC

+

Codec file read function.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_FILE_READ_FUNC(
+  FMOD_CODEC_STATE *codec_state,
+  void *buffer,
+  unsigned int sizebytes,
+  unsigned int *bytesread
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
buffer Out
+
Buffer to read data into.
+
sizebytes
+
+

Number of bytes to read into buffer.

+
    +
  • Units: Bytes
  • +
+
+
bytesread Out
+
+

Number of bytes read into buffer.

+
    +
  • Units: Bytes
  • +
+
+
+

If there is not enough data to read the requested number of bytes, return fewer bytes in the bytesread parameter and and return FMOD_ERR_FILE_EOF.

+

See Also: FMOD_CODEC_FILE_SEEK_FUNC, FMOD_CODEC_FILE_TELL_FUNC, FMOD_CODEC_FILE_SIZE_FUNC

+

FMOD_CODEC_FILE_SEEK_FUNC

+

Codec file seek function.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_FILE_SEEK_FUNC(
+  FMOD_CODEC_STATE *codec_state,
+  unsigned int pos,
+  FMOD_CODEC_SEEK_METHOD method
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
pos
+
+

Absolute position to seek to in file with respect to the seek method.

+
    +
  • Units: Bytes
  • +
+
+
method
+
Method of seeking. (FMOD_CODEC_SEEK_METHOD)
+
+

See Also: FMOD_CODEC_FILE_READ_FUNC, FMOD_CODEC_FILE_TELL_FUNC, FMOD_CODEC_FILE_SIZE_FUNC

+

FMOD_CODEC_FILE_SIZE_FUNC

+

Codec file size function.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_FILE_SIZE_FUNC(
+  FMOD_CODEC_STATE *codec_state,
+  unsigned int *size
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
size Out
+
+

Size of the file.

+
    +
  • Units: Bytes
  • +
+
+
+

See Also: FMOD_CODEC_FILE_READ_FUNC, FMOD_CODEC_FILE_SEEK_FUNC, FMOD_CODEC_FILE_TELL_FUNC

+

FMOD_CODEC_FILE_TELL_FUNC

+

Codec file function to retrieve the current file position.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_FILE_TELL_FUNC(
+  FMOD_CODEC_STATE *codec_state,
+  unsigned int *pos
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
pos Out
+
+

Current absolute position in file.

+
    +
  • Units: Bytes
  • +
+
+
+

See Also: FMOD_CODEC_FILE_READ_FUNC, FMOD_CODEC_FILE_SEEK_FUNC, FMOD_CODEC_FILE_SIZE_FUNC

+

FMOD_CODEC_FREE_FUNC

+

Codec free memory function.

+

+

+
C
+
C++
+
JS
+
+

+
void F_CALL FMOD_CODEC_FREE_FUNC(
+  void *ptr,
+  const char *file,
+  int line
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
ptr
+
Allocation pointer.
+
file
+
Source code file name where the allocation is freed.
+
line
+
Line of free call in file.
+
+

See Also: FMOD_CODEC_STATE

+

FMOD_CODEC_GETLENGTH_CALLBACK

+

Codec get length callback.

+

This callback is called to retrieve the length of the audio file of this codec type.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_GETLENGTH_CALLBACK(
+  FMOD_CODEC_STATE *codec_state,
+  unsigned int *length,
+  FMOD_TIMEUNIT lengthtype
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
length Out
+
Length of the sound in units determined by lengthtype.
+
lengthtype
+
Timeunit type of length. (FMOD_TIMEUNIT)
+
+

Invoked by:

+ +

See Also: FMOD_CODEC_DESCRIPTION

+

FMOD_CODEC_GETPOSITION_CALLBACK

+

Codec get position callback.

+

This callback is called to retrieve the current read position of the audio file of this codec type.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_GETPOSITION_CALLBACK(
+  FMOD_CODEC_STATE *codec_state,
+  unsigned int *position,
+  FMOD_TIMEUNIT postype
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
position Out
+
Codec position in units determined by postype.
+
postype
+
Time units for position. This will be one of the timeunits supplied by the codec author in the FMOD_CODEC_DESCRIPTION structure. (FMOD_TIMEUNIT)
+
+

Invoked by:

+ +

See Also: FMOD_CODEC_DESCRIPTION

+

FMOD_CODEC_GETWAVEFORMAT_CALLBACK

+

Codec get wave format callback.

+

This callback is called to allow FMOD to retrieve the format of the file the codec instance represents.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_GETWAVEFORMAT_CALLBACK(
+  FMOD_CODEC_STATE *codec_state,
+  int index,
+  FMOD_CODEC_WAVEFORMAT *waveformat
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
index
+
Subsound index. This is only used in file formats which can store multiple sounds within them, otherwise it will be 0.
+
waveformat Out
+
Wave format of the sound object. (FMOD_CODEC_WAVEFORMAT)
+
+

Useful to reduce memory usage by limiting the number of FMOD_CODEC_WAVEFORMAT structures.

+

FMOD_CODEC_LOG_FUNC

+

Codec log function.

+

Call this function in an codec plug-in context to utilize FMOD's debugging system.

+

+

+
C
+
C++
+
JS
+
+

+
void F_CALL FMOD_CODEC_LOG_FUNC(
+  FMOD_DEBUG_FLAGS level,
+  const char *file,
+  int line,
+  const char *function,
+  const char *string,
+  ...
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
level
+
Log type or level. (FMOD_DEBUG_FLAGS)
+
file
+
Source code file name from where the log is called. (UTF-8 string)
+
line
+
Line of log call in file.
+
function
+
Name of the logging function. (UTF-8 string)
+
string
+
Log codec string. (UTF-8 string)
+
+

See Also: FMOD_CODEC_STATE

+

FMOD_CODEC_METADATA_FUNC

+

Codec metadata function.

+

This function is to be called when a codec's metadata is updated.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_METADATA_FUNC(
+  FMOD_CODEC_STATE *codec_state,
+  FMOD_TAGTYPE tagtype,
+  char *name,
+  void *data,
+  unsigned int datalen,
+  FMOD_TAGDATATYPE datatype,
+  int unique
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
tagtype
+
Source type of tag being updated. (FMOD_TAGTYPE)
+
name
+
Name of the tag being updated.
+
data
+
Contents of tag.
+
datalen
+
+

Data length of the tag data in bytes.

+
    +
  • Units: Bytes
  • +
+
+
datatype
+
Data type of tag. (FMOD_TAGDATATYPE)
+
unique
+
Unique state. If this is true / non zero, then the tag (determined by the name) being updated is the only one of its type. If it is zero then there are multiple versions of this tag with the same name.
+
+

Codec metadata can be retrieved by the user with Sound::getTag

+

Codec metadata can be added during creation, or during playback. A common case for play time metadata is internet based streams.

+

See Also: FMOD_CODEC_DESCRIPTION

+

FMOD_CODEC_OPEN_CALLBACK

+

Codec open callback.

+

This callback is called to initialize a codec instance using the codec's file handle to verify if the file is of the type of the codec, and to do any file reading required for initialization of the codec.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_OPEN_CALLBACK(
+  FMOD_CODEC_STATE *codec_state,
+  FMOD_MODE usermode,
+  FMOD_CREATESOUNDEXINFO *userexinfo
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. Use this to access codec specific variables, the FMOD file system for reading/seeking, and codec user data. (FMOD_CODEC_STATE)
+
usermode Opt
+
+

Mode that the user supplied via System::createSound or System::createStream. (FMOD_MODE)

+ +
+
userexinfo Opt
+
Extra info structure that the user supplied via System::createSound or System::createStream. (FMOD_CREATESOUNDEXINFO)
+
+

Invoked by:

+ +

Implementation detail:

+

This callback is where the file format check is done, memory is allocated, and the codec is initialized.

+

The usermode and userexinfo parameters tell the codec what was passed in by the user. Generally these can be ignored, as the file format usually determines the format and frequency of the sound. If you have a flexible format codec (ie you don't mind what output format your codec writes to), you might want to use the parameter that was passed in by the user to specify the output sound format / frequency.

+

Read and seek within the file using the fileread and fileseek members of the FMOD_CODEC_STATE structure that is passed in.

+

Note!: Do not use your own filesystem.

+

The reasons for this are:

+
    +
  • The user may have set their own file system via user filesystem callbacks.
  • +
  • FMOD allows file reading via disk, memory and TCP/IP. If you use your own file routines you will lose this ability.
  • +
+

Important! FMOD will ping all codecs trying to find the right one for the file the user has passed in. Make sure the first line of your codec open is a FAST format check. Ie it reads an identifying string, checks it and returns an error FMOD_ERR_FORMAT if it is not found.

+

See Also: FMOD_CODEC_DESCRIPTION, FMOD_CODEC_CLOSE_CALLBACK, FMOD_CODEC_SOUNDCREATE_CALLBACK

+

FMOD_CODEC_PLUGIN_VERSION

+

The codec plug-in API version the plug-in was built with.

+

+

+
C
+
C++
+
JS
+
+

+
#define FMOD_CODEC_PLUGIN_VERSION   1
+
+ +
FMOD.CODEC_PLUGIN_VERSION
+
+ +
+

Currently not supported for C#.

+
+

See Also: FMOD_CODEC_DESCRIPTION

+

FMOD_CODEC_READ_CALLBACK

+

Codec read callback.

+

This callback is called to read PCM data from the codec instance.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_READ_CALLBACK(
+  FMOD_CODEC_STATE *codec_state,
+  void *buffer,
+  unsigned int samples_in,
+  unsigned int *samples_out
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
buffer
+
+

Target PCM data buffer. Note that the format of this data is the format described in FMOD_CODEC_WAVEFORMAT.

+ +
+
samples_in
+
+

Number of PCM samples to decode

+
    +
  • Units: Samples
  • +
+
+
samples_out
+
+

Number of PCM samples decoded

+
    +
  • Units: Samples
  • +
+
+
+

This callback is issued when FMOD tries to read some data from the file to the destination format (the format specified in the FMOD_CODEC_OPEN_CALLBACK).

+

Implementation detail:

+

If you cannot read number of samples requested, simply return FMOD_OK and give samples_out the number of samples you decoded.

+

Read and seek within the file using the fileread and fileseek members of the FMOD_CODEC_STATE structure that is passed in.

+

Note!: Do not use your own filesystem.

+

The reasons for this are:

+
    +
  • The user may have set their own file system via user filesystem callbacks.
  • +
  • FMOD allows file reading via disk, memory and TCP/IP. If you use your own file routines you will lose this ability.
  • +
+

See Also: FMOD_CODEC_DESCRIPTION

+

FMOD_CODEC_SEEK_METHOD

+

File seek methods.

+

+

+
C
+
C++
+
JS
+
+

+
#define FMOD_CODEC_SEEK_METHOD_SET     0
+#define FMOD_CODEC_SEEK_METHOD_CURRENT 1
+#define FMOD_CODEC_SEEK_METHOD_END     2
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
FMOD_CODEC_SEEK_METHOD_SET
+
Seeks from the beginning.
+
FMOD_CODEC_SEEK_METHOD_CURRENT
+
Seeks from the current position.
+
FMOD_CODEC_SEEK_METHOD_END
+
Seeks from the end.
+
+

See Also: FMOD_CODEC_FILE_SEEK_FUNC

+

FMOD_CODEC_SETPOSITION_CALLBACK

+

Codec set position callback.

+

This callback is called to set the audible position of a codec instance.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_SETPOSITION_CALLBACK(
+  FMOD_CODEC_STATE *codec_state,
+  int subsound,
+  unsigned int position,
+  FMOD_TIMEUNIT postype
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
subsound
+
Subsound within which to seek. This is only used in file formats which can store multiple sounds within them, otherwise it will be 0.
+
position
+
Seek position in units determined by postype.
+
postype
+
Time units for position. This will be one of the timeunits supplied by the codec author in the FMOD_CODEC_DESCRIPTION structure. (FMOD_TIMEUNIT)
+
+

Invoked by:

+ +

Implementation detail:

+

Read and seek within the file using the fileread and fileseek members of the FMOD_CODEC_STATE structure that is passed in.

+

Note!: Do not use your own filesystem.

+

The reasons for this are:

+
    +
  • The user may have set their own file system via user filesystem callbacks.
  • +
  • FMOD allows file reading via disk, memory and TCP/IP. If you use your own file routines you will lose this ability.
  • +
+

See Also: Channel::getPosition, FMOD_CODEC_READ_CALLBACK, FMOD_CODEC_GETLENGTH_CALLBACK, FMOD_CODEC_GETPOSITION_CALLBACK

+

FMOD_CODEC_SOUNDCREATE_CALLBACK

+

Codec sound create callback.

+

This callback is called after a Sound is created.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_CODEC_SOUNDCREATE_CALLBACK(
+  FMOD_CODEC_STATE *codec_state,
+  int subsound,
+  FMOD_SOUND *sound
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
codec_state
+
Codec state. (FMOD_CODEC_STATE)
+
subsound
+
Subsound index being created. This is only used in file formats which can store multiple sounds within them, otherwise it will be 0.
+
sound Out
+
Newly created Sound object. (Sound)
+
+

Invoked by:

+ +

Useful so the codec can set more parameters for the related created sound.

+

See Also: System::createSound, System::createStream

+

FMOD_CODEC_STATE

+

Codec state structure that is passed into each callback.

+

+

+
C
+
C++
+
JS
+
+

+
typedef struct FMOD_CODEC_STATE {
+  void                          *plugindata;
+  FMOD_CODEC_WAVEFORMAT         *waveformat;
+  FMOD_CODEC_STATE_FUNCTIONS    *functions;
+  int                            numsubsounds;
+} FMOD_CODEC_STATE;
+
+ +
FMOD_CODEC_STATE
+{
+  plugindata;
+  waveformat;
+  functions;
+  numsubsounds,
+};
+
+ +
+

Not supported for C#.

+
+
+
plugindata
+
Data that the plugin writer wants to attach to this object.
+
waveformat Opt
+
Array of format structures containing information about each sound. (FMOD_CODEC_WAVEFORMAT)
+
functions R/O
+
Struct containing functions to give plug-in developers the ability to query system state, access system level functionality and helpers. (FMOD_CODEC_STATE_FUNCTIONS)
+
numsubsounds
+
Number of 'subsounds' in this sound. Anything other than 0 makes it a 'container' format.
+
+

'numsubsounds' should be 1+ if the file is a container format, and does not contain wav data itself. Examples of these types would be FSB (contains multiple sounds), DLS (contain instruments).

+

The waveformat value should point to an array of information based on how many subsounds are in the format. If the number of subsounds is 0 then it should point to 1 waveformat, the same as if the number of subsounds was 1. If subsounds was 100 for example, there should be a pointer to an array of 100 waveformat structures.

+

When a sound has 1 or more subsounds, the caller must play the individual sounds specified by first obtaining the subsound with Sound::getSubSound.

+

FMOD_CODEC_STATE_FUNCTIONS

+

Struct containing functions to give plug-in developers the ability to query system state and access system level functionality and helpers.

+

+

+
C
+
C++
+
JS
+
+

+
typedef struct FMOD_CODEC_STATE_FUNCTIONS {
+    FMOD_CODEC_METADATA_FUNC     metadata;
+    FMOD_CODEC_ALLOC_FUNC        alloc;
+    FMOD_CODEC_FREE_FUNC         free;
+    FMOD_CODEC_LOG_FUNC          log;
+    FMOD_CODEC_FILE_READ_FUNC    read;
+    FMOD_CODEC_FILE_SEEK_FUNC    seek;
+    FMOD_CODEC_FILE_TELL_FUNC    tell;
+    FMOD_CODEC_FILE_SIZE_FUNC    size;
+} FMOD_CODEC_STATE_FUNCTIONS;
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
metadata R/O
+
This will return a callable FMOD metadata function to use from codec. (FMOD_CODEC_METADATA_FUNC)
+
alloc R/O
+
Function to allocate memory using the FMOD memory system. (FMOD_CODEC_ALLOC_FUNC)
+
free R/O
+
Function to free memory allocated with FMOD_CODEC_ALLOC_FUNC. (FMOD_CODEC_FREE_FUNC)
+
log R/O
+
Function to write to the FMOD logging system. (FMOD_CODEC_LOG_FUNC)
+
read R/O
+
Function to read using a file handle. (FMOD_CODEC_FILE_READ_FUNC)
+
seek R/O
+
Function to seek using a file handle. (FMOD_CODEC_FILE_SEEK_FUNC)
+
tell R/O
+
Function to get the current read cursor position of a file handle. (FMOD_CODEC_FILE_TELL_FUNC)
+
size R/O
+
Function to get the size using a file handle. (FMOD_CODEC_FILE_SIZE_FUNC)
+
+

See Also: FMOD_CODEC_STATE

+

FMOD_CODEC_WAVEFORMAT

+

Codec wave format.

+

This structure defines the attributes of a sound, and determines the format of the Sound object when it is created with System::createSound or System::createStream

+

+

+
C
+
C++
+
JS
+
+

+
typedef struct FMOD_CODEC_WAVEFORMAT {
+  const char*         name;
+  FMOD_SOUND_FORMAT   format;
+  int                 channels;
+  int                 frequency;
+  unsigned int        lengthbytes;
+  unsigned int        lengthpcm;
+  unsigned int        pcmblocksize;
+  int                 loopstart;
+  int                 loopend;
+  FMOD_MODE           mode;
+  FMOD_CHANNELMASK    channelmask;
+  FMOD_CHANNELORDER   channelorder;
+  float               peakvolume;
+} FMOD_CODEC_WAVEFORMAT;
+
+ +
FMOD_CODEC_WAVEFORMAT
+{
+  name,
+  format,
+  channels,
+  frequency,
+  lengthbytes,
+  lengthpcm,
+  pcmblocksize,
+  loopstart,
+  loopend,
+  mode,
+  channelmask,
+  channelorder,
+  peakvolume,
+};
+
+ +
+

Currently not supported for C#.

+
+
+
name Opt
+
Name of sound. The codec must own the lifetime of the string memory until the codec is destroyed. (UTF-8 string)
+
format
+
Format for codec output. (FMOD_SOUND_FORMAT)
+
channels
+
Number of channels.
+
frequency
+
+

Default frequency of the codec.

+
    +
  • Units: Hertz
  • +
+
+
lengthbytes Opt
+
+

Length of the source data. Used for FMOD_TIMEUNIT_RAWBYTES.

+
    +
  • Units: Bytes
  • +
+
+
lengthpcm
+
+

Length of the file. Used for Sound::getLength and for memory allocation of static decompressed sample data.

+
    +
  • Units: Samples
  • +
+
+
pcmblocksize Opt
+
Minimum, optimal number of decompressed PCM samples codec can handle.
+
loopstart Opt
+
+

Loop start position.

+
    +
  • Units: Samples
  • +
+
+
loopend Opt
+
+

Loop end position.

+
    +
  • Units: Samples
  • +
+
+
mode Opt
+
+

Default sound loading mode. (FMOD_MODE)

+ +
+
channelmask Opt
+
Channel bitmask to describe which speakers the channels in the codec map to, in order of channel count. (FMOD_CHANNELMASK)
+
channelorder Opt
+
Channel order type that describes where each audio channel should pan for the number of channels specified. (FMOD_CHANNELORDER)
+
peakvolume Opt
+
Peak volume of sound.
+
+

The format, channels, frequency and lengthpcm tell FMOD what sort of sound buffer to create when you initialize your code.

+

If you wrote an MP3 codec that decoded to stereo 16bit integer PCM for a 44khz sound, you would specify FMOD_SOUND_FORMAT_PCM16, and channels would be equal to 2, and frequency would be 44100.

+

1.07 Note. 'blockalign' member which was in bytes has been removed. 'pcmblocksize' is now the replacement, and is measured in PCM samples only, not bytes. This is purely to support buffering
+internal to FMOD for codecs that are not sample accurate.

+

Note: When registering a codec, format, channels, frequency and lengthpcm must be supplied, otherwise there will be an error.

+

This structure is optional if FMOD_CODEC_GETWAVEFORMAT_CALLBACK is specified.

+

An array of these structures may be needed if FMOD_CODEC_STATE::numsubsounds is larger than 1.

+

See Also: FMOD_CODEC_STATE, FMOD_CODEC_DESCRIPTION

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-dsp.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-dsp.html new file mode 100644 index 0000000..6330c15 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-dsp.html @@ -0,0 +1,2413 @@ + + +Plug-in API Reference | DSP + + + + +
+ +
+

9. Plug-in API Reference | DSP

+

An interface that manages DSP plug-ins.

+

System:

+ +

Parameter API:

+ +
+ +
+ +
+ +

General:

+ +
+ +
+ +
+
    +
  • FMOD_DSP_STATE_DFT_FUNCTIONS Struct containing DFT functions to enable a plug-in to perform optimized time-frequency domain conversion.
  • +
  • FMOD_DSP_STATE_FUNCTIONS Struct containing functions to give plug-in developers the ability to query system state and access system level functionality and helpers.
  • +
  • FMOD_DSP_STATE_PAN_FUNCTIONS Struct containing panning helper functions for spatialization plug-ins.
  • +
+
+ +

FMOD_COMPLEX

+

Complex number structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_COMPLEX {
+  float   real;
+  float   imag;
+} FMOD_COMPLEX;
+
+ +
struct COMPLEX
+{
+  float real;
+  float imag;
+}
+
+ +
FMOD_COMPLEX
+{
+  real,
+  imag,
+};
+
+ +
+
real
+
Real component
+
imag
+
Imaginary component
+
+

See Also: FMOD_DSP_STATE_FUNCTIONS, FMOD_DSP_STATE_DFT_FUNCTIONS

+

FMOD_DSP_BUFFER_ARRAY

+

Structure for input and output buffers.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_BUFFER_ARRAY {
+  int                numbuffers;
+  int               *buffernumchannels;
+  FMOD_CHANNELMASK   *bufferchannelmask;
+  float            **buffers;
+  FMOD_SPEAKERMODE   speakermode;
+} FMOD_DSP_BUFFER_ARRAY;
+
+ +
struct DSP_BUFFER_ARRAY
+{
+  int           numbuffers;
+  int[]         buffernumchannels;
+  CHANNELMASK[] bufferchannelmask;
+  IntPtr[]      buffers;
+  SPEAKERMODE   speakermode;
+  int           numchannels;
+  IntPtr        buffer;
+}
+
+ +
FMOD_DSP_BUFFER_ARRAY
+{
+  numbuffers,
+  speakermode,
+};
+
+ +
+
numbuffers
+
Array size of buffers.
+
buffernumchannels
+
Array of number of channels for each buffer.
+
bufferchannelmask
+
Deprecated. (FMOD_CHANNELMASK)
+
buffers
+
Array of buffers.
+
speakermode
+
speaker mode for all buffers in the array. (FMOD_SPEAKERMODE)
+
numchannels C#
+
Number of channels for the buffer.
+
buffer C#
+
Memory for the buffer.
+
+

See Also: FMOD_DSP_DESCRIPTION

+

FMOD_DSP_CREATE_CALLBACK

+

DSP create callback.

+

This callback is called when you create a DSP unit instance of this type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_CREATE_CALLBACK(
+  FMOD_DSP_STATE *dsp_state
+);
+
+ +
delegate RESULT DSP_CREATE_CALLBACK(
+    ref DSP_STATE dsp_state
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
+

Invoked by:

+ +

Implementation detail:

+

This callback is typically where memory is allocated and DSP specific variables are initialized.

+

If a user re-uses a DSP unit instead of releasing it and creating a new one, it may be useful to implement FMOD_DSP_RESET_CALLBACK to reset any variables or buffers when the user calls DSP::reset.

+

See Also: FMOD_DSP_DESCRIPTION, System::createDSP, System::createDSPByType, System::createDSPByPlugin, FMOD_DSP_RESET_CALLBACK

+

FMOD_DSP_DESCRIPTION

+

DSP description.

+

This description structure allows you to define all functionality required for a DSP unit when writing a DSP plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_DESCRIPTION {
+  unsigned int                          pluginsdkversion;
+  char                                  name[32];
+  unsigned int                          version;
+  int                                   numinputbuffers;
+  int                                   numoutputbuffers;
+  FMOD_DSP_CREATE_CALLBACK              create;
+  FMOD_DSP_RELEASE_CALLBACK             release;
+  FMOD_DSP_RESET_CALLBACK               reset;
+  FMOD_DSP_READ_CALLBACK                read;
+  FMOD_DSP_PROCESS_CALLBACK             process;
+  FMOD_DSP_SETPOSITION_CALLBACK         setposition;
+  int                                   numparameters;
+  FMOD_DSP_PARAMETER_DESC             **paramdesc;
+  FMOD_DSP_SETPARAM_FLOAT_CALLBACK      setparameterfloat;
+  FMOD_DSP_SETPARAM_INT_CALLBACK        setparameterint;
+  FMOD_DSP_SETPARAM_BOOL_CALLBACK       setparameterbool;
+  FMOD_DSP_SETPARAM_DATA_CALLBACK       setparameterdata;
+  FMOD_DSP_GETPARAM_FLOAT_CALLBACK      getparameterfloat;
+  FMOD_DSP_GETPARAM_INT_CALLBACK        getparameterint;
+  FMOD_DSP_GETPARAM_BOOL_CALLBACK       getparameterbool;
+  FMOD_DSP_GETPARAM_DATA_CALLBACK       getparameterdata;
+  FMOD_DSP_SHOULDIPROCESS_CALLBACK      shouldiprocess;
+  void                                 *userdata;
+  FMOD_DSP_SYSTEM_REGISTER_CALLBACK     sys_register;
+  FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK   sys_deregister;
+  FMOD_DSP_SYSTEM_MIX_CALLBACK          sys_mix;
+} FMOD_DSP_DESCRIPTION;
+
+ +
struct DSP_DESCRIPTION
+{
+  uint                           pluginsdkversion;
+  char[]                         name;
+  uint                           version;
+  int                            numinputbuffers;
+  int                            numoutputbuffers;
+  DSP_CREATE_CALLBACK            create;
+  DSP_RELEASE_CALLBACK           release;
+  DSP_RESET_CALLBACK             reset;
+  DSP_READ_CALLBACK              read;
+  DSP_PROCESS_CALLBACK           process;
+  DSP_SETPOSITION_CALLBACK       setposition;
+  int                            numparameters;
+  IntPtr                         paramdesc;
+  DSP_SETPARAM_FLOAT_CALLBACK    setparameterfloat;
+  DSP_SETPARAM_INT_CALLBACK      setparameterint;
+  DSP_SETPARAM_BOOL_CALLBACK     setparameterbool;
+  DSP_SETPARAM_DATA_CALLBACK     setparameterdata;
+  DSP_GETPARAM_FLOAT_CALLBACK    getparameterfloat;
+  DSP_GETPARAM_INT_CALLBACK      getparameterint;
+  DSP_GETPARAM_BOOL_CALLBACK     getparameterbool;
+  DSP_GETPARAM_DATA_CALLBACK     getparameterdata;
+  DSP_SHOULDIPROCESS_CALLBACK    shouldiprocess;
+  IntPtr                         userdata;
+  DSP_SYSTEM_REGISTER_CALLBACK   sys_register;
+  DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister;
+  DSP_SYSTEM_MIX_CALLBACK        sys_mix;
+}
+
+ +
FMOD_DSP_DESCRIPTION
+{
+  pluginsdkversion,
+  name,
+  version,
+  numinputbuffers,
+  numoutputbuffers,
+  create,
+  release,
+  reset,
+  read,
+  process,
+  setposition,
+  numparameters,
+  paramdesc,
+  setparameterfloat,
+  setparameterint,
+  setparameterbool,
+  setparameterdata,
+  getparameterfloat,
+  getparameterint,
+  getparameterbool,
+  getparameterdata,
+  shouldiprocess,
+  userdata,
+  sys_register,
+  sys_deregister,
+  sys_mix,
+};
+
+ +
+
pluginsdkversion
+
The plug-in SDK version this plug-in is built for. Set this to (FMOD_PLUGIN_SDK_VERSION).
+
name
+
DSP name.
+
version
+
Plug-in's version number.
+
numinputbuffers
+
Number of input buffers to process. Use 0 for DSPs that only generate sound and 1 for effects that process incoming sound.
+
numoutputbuffers
+
Number of audio output buffers. Only one output buffer is currently supported.
+
create Opt
+
Create callback. This is called when DSP unit is created. Set callback invoked by (FMOD_DSP_CREATE_CALLBACK)
+
release Opt
+
Release callback. This is called just before the unit is freed so the user can do any cleanup needed for the unit. Set callback invoked by (FMOD_DSP_RELEASE_CALLBACK)
+
reset
+
Reset callback. This is called by the user to reset any history buffers that may need resetting for a filter, when it is to be used or re-used for the first time to its initial clean state. Use to avoid clicks or artifacts. (FMOD_DSP_RESET_CALLBACK)
+
read Opt
+
Read callback. Processing is done here. Set callback invoked by (FMOD_DSP_READ_CALLBACK)
+
process Opt
+
Process callback. Can be specified instead of the read callback if any channel format changes occur between input and output. This also replaces shouldiprocess and should return an error if the effect is to be bypassed. Set callback invoked by (FMOD_DSP_PROCESS_CALLBACK)
+
setposition Opt
+
Set position callback. This is called if the unit wants to update its position info but not process data, or reset a cursor position internally if it is reading data from a certain source. Set callback invoked by (FMOD_DSP_SETPOSITION_CALLBACK)
+
numparameters
+
Number of parameters used in this filter. The user finds this with DSP::getNumParameters
+
paramdesc
+
Variable number of parameter structures. (FMOD_DSP_PARAMETER_DESC)
+
setparameterfloat Opt
+
Set callback invoked by DSP::setParameterFloat.(FMOD_DSP_SETPARAM_FLOAT_CALLBACK)
+
setparameterint Opt
+
Set callback invoked by DSP::setParameterInt.(FMOD_DSP_SETPARAM_INT_CALLBACK)
+
setparameterbool Opt
+
Set callback invoked by DSP::setParameterBool. (FMOD_DSP_SETPARAM_BOOL_CALLBACK)
+
setparameterdata Opt
+
Set callback invoked by DSP::setParameterData. (FMOD_DSP_SETPARAM_DATA_CALLBACK)
+
getparameterfloat Opt
+
Set callback invoked by DSP::getParameterFloat. (FMOD_DSP_GETPARAM_FLOAT_CALLBACK)
+
getparameterint Opt
+
Set callback invoked by DSP::getParameterInt. (FMOD_DSP_GETPARAM_INT_CALLBACK)
+
getparameterbool Opt
+
Set callback invoked by DSP::getParameterBool. (FMOD_DSP_GETPARAM_BOOL_CALLBACK)
+
getparameterdata Opt
+
Set callback invoked by DSP::getParameterData. (FMOD_DSP_GETPARAM_DATA_CALLBACK)
+
shouldiprocess
+
This is called before processing. You can detect if inputs are idle and return FMOD_OK to process, or any other error code to avoid processing the effect. Use a count down timer to allow effect tails to process before idling! (FMOD_DSP_SHOULDIPROCESS_CALLBACK)
+
userdata Opt
+
User data.
+
sys_register Opt
+
Register callback. This is called when DSP unit is loaded/registered. Useful for 'global'/per system object init for plug-in. Set callback invoked by (FMOD_DSP_SYSTEM_REGISTER_CALLBACK)
+
sys_deregister Opt
+
Deregister callback. This is called when DSP unit is unloaded/deregistered. Useful as 'global'/per system object shutdown for plug-in. Set callback invoked by (FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK)
+
sys_mix Opt
+
System mix stage callback. This is called when the mixer starts to execute or is just finishing executing. Useful for 'global'/per system object once a mix update calls for a plug-in. Set callback invoked by (FMOD_DSP_SYSTEM_MIX_CALLBACK)
+
+

There are 2 different ways to change a parameter in this architecture.

+

One is to use DSP::setParameterFloat / DSP::setParameterInt / DSP::setParameterBool / DSP::setParameterData. This is platform independant and is dynamic, so new unknown plug-ins can have their parameters enumerated and used.

+

The other is to use DSP::showConfigDialog. This is platform specific and requires a GUI, and will display a dialog box to configure the plug-in.

+

See Also: System::createDSP, DSP::setParameterFloat, DSP::setParameterInt, DSP::setParameterBool, DSP::setParameterData, FMOD_DSP_STATE, FMOD_DSP_CREATE_CALLBACK, FMOD_DSP_RELEASE_CALLBACK, FMOD_DSP_RESET_CALLBACK, FMOD_DSP_READ_CALLBACK, FMOD_DSP_PROCESS_CALLBACK, FMOD_DSP_SETPOSITION_CALLBACK, FMOD_DSP_PARAMETER_DESC, FMOD_DSP_SETPARAM_FLOAT_CALLBACK, FMOD_DSP_SETPARAM_INT_CALLBACK, FMOD_DSP_SETPARAM_BOOL_CALLBACK, FMOD_DSP_SETPARAM_DATA_CALLBACK, FMOD_DSP_GETPARAM_FLOAT_CALLBACK, FMOD_DSP_GETPARAM_INT_CALLBACK, FMOD_DSP_GETPARAM_BOOL_CALLBACK, FMOD_DSP_GETPARAM_DATA_CALLBACK, FMOD_DSP_SHOULDIPROCESS_CALLBACK, FMOD_DSP_SYSTEM_REGISTER_CALLBACK, FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK, FMOD_DSP_SYSTEM_MIX_CALLBACK

+

FMOD_DSP_GETPARAM_BOOL_CALLBACK

+

Get boolean parameter callback.

+

This callback is called when the user wants to get a boolean parameter value from a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_GETPARAM_BOOL_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  FMOD_BOOL *value,
+  char *valuestr
+);
+
+ +
delegate RESULT DSP_GETPARAM_BOOL_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  ref bool value,
+  IntPtr valuestr
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP Plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
value Out
+
+

Parameter value.

+
    +
  • Units: Boolean
  • +
+
+
valuestr OutOpt
+
String value of the parameter. Can be used to display an alternate representation of the number. For example "ON" or "OFF" instead of 1.0 and 0.0. The length of the buffer being passed in is always a maximum of FMOD_DSP_GETPARAM_VALUESTR_LENGTH bytes. (UTF-8 string)
+
+

Invoked by:

+ +
+

The 'valuestr' argument can be used via StringWrapper by using FMOD.StringWrapper valueStr = new FMOD.StringWrapper(valuestr);

+
+

See Also: FMOD_DSP_DESCRIPTION, FMOD_DSP_SETPARAM_BOOL_CALLBACK

+

FMOD_DSP_GETPARAM_DATA_CALLBACK

+

Get data parameter callback.

+

This callback is called when the user wants to get a data parameter value from a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_GETPARAM_DATA_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  void **data,
+  unsigned int *length,
+  char *valuestr
+);
+
+ +
delegate RESULT DSP_GETPARAM_DATA_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  IntPtr data,
+  ref uint length,
+  IntPtr valuestr
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
data Out
+
Parameter data.
+
length Out
+
Length of data.
+
valuestr OutOpt
+
String value of the parameter. Can be used to display an alternate representation of the number. For example "ON" or "OFF" instead of values values inside the binary data. The length of the buffer being passed in is always a maximum of FMOD_DSP_GETPARAM_VALUESTR_LENGTH bytes. (UTF-8 string)
+
+

Invoked by:

+ +
+

The 'valuestr' argument can be used via StringWrapper by using FMOD.StringWrapper valueStr = new FMOD.StringWrapper(valuestr);

+
+

See Also: DSP::setParameterData, FMOD_DSP_DESCRIPTION, FMOD_DSP_SETPARAM_DATA_CALLBACK

+

FMOD_DSP_GETPARAM_FLOAT_CALLBACK

+

Get float parameter callback.

+

This callback is called when the user wants to get a floating point parameter value from a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_GETPARAM_FLOAT_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  float *value,
+  char *valuestr
+);
+
+ +
delegate RESULT DSP_GETPARAM_FLOAT_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  ref float value,
+  IntPtr valuestr
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
value Out
+
Parameter value.
+
valuestr OutOpt
+
String value of the parameter. Can be used to display an alternate representation of the number. For example "ON" or "OFF" instead of 1.0 and 0.0. The length of the buffer being passed in is always a maximum of FMOD_DSP_GETPARAM_VALUESTR_LENGTH bytes. (UTF-8 string)
+
+

Invoked by:

+ +
+

The 'valuestr' argument can be used via StringWrapper by using FMOD.StringWrapper valueStr = new FMOD.StringWrapper(valuestr);

+
+

See Also: FMOD_DSP_DESCRIPTION, FMOD_DSP_SETPARAM_FLOAT_CALLBACK

+

FMOD_DSP_GETPARAM_INT_CALLBACK

+

Get integer parameter callback.

+

This callback is called when the user wants to get an integer parameter value from a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_GETPARAM_INT_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  int *value,
+  char *valuestr
+);
+
+ +
delegate RESULT DSP_GETPARAM_INT_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  ref int value,
+  IntPtr valuestr
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
value Out
+
Parameter value.
+
valuestr OutOpt
+
String value of the parameter. Can be used to display an alternate representation of the number. For example "ON" or "OFF" instead of 1 and 0. The length of the buffer being passed in is always a maximum of FMOD_DSP_GETPARAM_VALUESTR_LENGTH bytes.
+
+

Invoked by:

+ +
+

The 'valuestr' argument can be used via StringWrapper by using FMOD.StringWrapper valueStr = new FMOD.StringWrapper(valuestr);

+
+

See Also: DSP::setParameterInt, FMOD_DSP_DESCRIPTION, FMOD_DSP_SETPARAM_INT_CALLBACK

+

FMOD_DSP_GETPARAM_VALUESTR_LENGTH

+

Length in bytes of the buffer pointed to by the valuestr argument of FMOD_DSP_GETPARAM_XXXX_CALLBACK functions.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_DSP_GETPARAM_VALUESTR_LENGTH   32
+
+ +
FMOD.DSP_GETPARAM_VALUESTR_LENGTH
+
+ +
+

Currently not supported for C#.

+
+

See Also: FMOD_DSP_GETPARAM_FLOAT_CALLBACK, FMOD_DSP_GETPARAM_INT_CALLBACK, FMOD_DSP_GETPARAM_BOOL_CALLBACK, FMOD_DSP_GETPARAM_DATA_CALLBACK

+

FMOD_DSP_METERING_INFO

+

DSP metering info.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_METERING_INFO {
+  int     numsamples;
+  float   peaklevel[32];
+  float   rmslevel[32];
+  short   numchannels;
+} FMOD_DSP_METERING_INFO;
+
+ +
struct DSP_METERING_INFO
+{
+  int     numsamples;
+  float[] peaklevel;
+  float[] rmslevel;
+  short   numchannels;
+}
+
+ +
FMOD_DSP_METERING_INFO
+{
+  numsamples,
+  peaklevel,
+  rmslevel,
+  numchannels,
+};
+
+ +
+
numsamples R/O
+
Number of samples considered for this metering info.
+
peaklevel R/O
+
+

Peak level per channel.

+
    +
  • Units: Linear
  • +
+
+
rmslevel R/O
+
+

Rms level per channel.

+
    +
  • Units: Linear
  • +
+
+
numchannels R/O
+
Number of channels.
+
+

See Also: FMOD_SPEAKER, DSP::getMeteringInfo

+

FMOD_DSP_PAN_SURROUND_FLAGS

+

Flags for the FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC function.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PAN_SURROUND_FLAGS {
+  FMOD_DSP_PAN_SURROUND_DEFAULT,
+  FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED
+} FMOD_DSP_PAN_SURROUND_FLAGS;
+
+ +
enum DSP_PAN_SURROUND_FLAGS
+{
+  DEFAULT,
+  ROTATION_NOT_BIASED,
+}
+
+ +
FMOD.DSP_PAN_SURROUND_DEFAULT
+FMOD.DSP_PAN_SURROUND_ROTATION_NOT_BIASED
+
+ +
+
FMOD_DSP_PAN_SURROUND_DEFAULT
+
TBD.
+
FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED
+
TBD.
+
+

See Also: FMOD_DSP_STATE_PAN_FUNCTIONS

+

FMOD_DSP_PARAMETER_3DATTRIBUTES

+

3D attributes data structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES {
+  FMOD_3D_ATTRIBUTES   relative;
+  FMOD_3D_ATTRIBUTES   absolute;
+} FMOD_DSP_PARAMETER_3DATTRIBUTES;
+
+ +
struct DSP_PARAMETER_3DATTRIBUTES
+{
+  _3D_ATTRIBUTES relative;
+  _3D_ATTRIBUTES absolute;
+}
+
+ +
FMOD_DSP_PARAMETER_3DATTRIBUTES
+{
+  relative,
+  absolute,
+}
+
+ +
+
relative
+
Position of the sound relative to the listener. (FMOD_3D_ATTRIBUTES)
+
absolute
+
Position of the sound in world coordinates. (FMOD_3D_ATTRIBUTES)
+
+

The FMOD::Studio::System sets this parameter automatically when an FMOD::Studio::EventInstance position changes. However, if you are using the core FMOD::System and not the FMOD::Studio::System, you must set this DSP parameter explicitly.

+

Attributes must use a coordinate system with the positive Y axis being up and the positive X axis being right. The FMOD Engine converts passed-in coordinates to left-handed for the plug-in if the system was initialized with the FMOD_INIT_3D_RIGHTHANDED flag.

+

When using a listener attenuation position, the direction of the relative attributes will be relative to the listener position and the length will be the distance to the attenuation position.

+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC, Studio::System::setListenerAttributes, Controlling a Spatializer DSP

+

FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI

+

3D attributes data structure for multiple listeners.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI {
+  int                  numlisteners;
+  FMOD_3D_ATTRIBUTES   relative[FMOD_MAX_LISTENERS];
+  float                weight[FMOD_MAX_LISTENERS];
+  FMOD_3D_ATTRIBUTES   absolute;
+} FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI;
+
+ +
struct DSP_PARAMETER_3DATTRIBUTES_MULTI
+{
+  int               numlisteners;
+  _3D_ATTRIBUTES[]  relative;
+  float[]           weight;
+  _3D_ATTRIBUTES    absolute;
+}
+
+ +
FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI
+{
+  numlisteners,
+};
+
+ +
+
numlisteners
+
Number of listeners.
+
relative
+
Position of the sound relative to the listeners. (FMOD_3D_ATTRIBUTES)
+
weight
+
Weighting of the listeners where 0 means listener has no contribution and 1 means full contribution.
+
absolute
+
Position of the sound in world coordinates. (FMOD_3D_ATTRIBUTES)
+
+

The FMOD::Studio::System sets this parameter automatically when an FMOD::Studio::EventInstance position changes. However, if you are using the core API's FMOD::System and not the FMOD::Studio::System, you must set this DSP parameter explicitly.

+

Attributes must use a coordinate system with the positive Y axis being up and the positive X axis being right. The FMOD Engine converts passed in coordinates to left-handed for the plug-in if the System was initialized with the FMOD_INIT_3D_RIGHTHANDED flag.

+

When using a listener attenuation position, the direction of the relative attributes will be relative to the listener position and the length will be the distance to the attenuation position.

+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC, Studio::System::setListenerAttributes, Controlling a Spatializer DSP

+

FMOD_DSP_PARAMETER_ATTENUATION_RANGE

+

Attenuation range parameter data structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_ATTENUATION_RANGE {
+  float   min;
+  float   max;
+} FMOD_DSP_PARAMETER_ATTENUATION_RANGE;
+
+ +
struct DSP_PARAMETER_ATTENUATION_RANGE
+{
+  float min;
+  float max;
+}
+
+ +
FMOD_DSP_PARAMETER_ATTENUATION_RANGE
+{
+  min,
+  max,
+};
+
+ +
+
min R/O
+
Minimum distance for attenuation.
+
max R/O
+
Maximum distance for attenuation.
+
+

The FMOD::Studio::System will set this parameter automatically if an FMOD::Studio::EventInstance min or max distance changes.

+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_PARAMETER_DATA_TYPE

+

Data parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PARAMETER_DATA_TYPE {
+  FMOD_DSP_PARAMETER_DATA_TYPE_USER = 0,
+  FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1,
+  FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2,
+  FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3,
+  FMOD_DSP_PARAMETER_DATA_TYPE_FFT = -4,
+  FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5,
+  FMOD_DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6,
+  FMOD_DSP_PARAMETER_DATA_TYPE_DYNAMIC_RESPONSE = -7
+} FMOD_DSP_PARAMETER_DATA_TYPE;
+
+ +
enum DSP_PARAMETER_DATA_TYPE
+{
+  DSP_PARAMETER_DATA_TYPE_USER = 0,
+  DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1,
+  DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2,
+  DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3,
+  DSP_PARAMETER_DATA_TYPE_FFT = -4,
+  DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5,
+  DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6,
+  DSP_PARAMETER_DATA_TYPE_DYNAMIC_RESPONSE = -7
+}
+
+ +
FMOD.DSP_PARAMETER_DATA_TYPE_USER = 0
+FMOD.DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1
+FMOD.DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2
+FMOD.DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3
+FMOD.DSP_PARAMETER_DATA_TYPE_FFT = -4
+FMOD.DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5
+FMOD.DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6,
+FMOD.DSP_PARAMETER_DATA_TYPE_DYNAMIC_RESPONSE = -7
+
+ +
+
FMOD_DSP_PARAMETER_DATA_TYPE_USER
+
Default data type. All user data types should be 0 or above.
+
FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN
+
Data type for FMOD_DSP_PARAMETER_OVERALLGAIN parameters. There should be a maximum of one per DSP.
+
FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES
+
Data type for FMOD_DSP_PARAMETER_3DATTRIBUTES parameters. There should be a maximum of one per DSP.
+
FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN
+
Data type for FMOD_DSP_PARAMETER_SIDECHAIN parameters. There should be a maximum of one per DSP.
+
FMOD_DSP_PARAMETER_DATA_TYPE_FFT
+
Data type for FMOD_DSP_PARAMETER_FFT parameters. There should be a maximum of one per DSP.
+
FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI
+
Data type for FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI parameters. There should be a maximum of one per DSP.
+
FMOD_DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE
+
Data type for FMOD_DSP_PARAMETER_ATTENUATION_RANGE parameters. There should be a maximum of one per DSP.
+
FMOD_DSP_PARAMETER_DATA_TYPE_DYNAMIC_RESPONSE
+
Data type for FMOD_DSP_PARAMETER_DYNAMIC_RESPONSE parameters. There should be a maximum of one per DSP.
+
+

See Also: FMOD_DSP_PARAMETER_DESC_DATA, DSP::getParameterData, DSP::setParameterData

+

FMOD_DSP_PARAMETER_DESC

+

Base structure for DSP parameter descriptions.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_DESC {
+  FMOD_DSP_PARAMETER_TYPE         type;
+  char                            name[16];
+  char                            label[16];
+  const char                     *description;
+  union
+  {
+      FMOD_DSP_PARAMETER_DESC_FLOAT   floatdesc;
+      FMOD_DSP_PARAMETER_DESC_INT     intdesc;
+      FMOD_DSP_PARAMETER_DESC_BOOL    booldesc;
+      FMOD_DSP_PARAMETER_DESC_DATA    datadesc;
+  }
+} FMOD_DSP_PARAMETER_DESC;
+
+ +
struct DSP_PARAMETER_DESC
+{
+  DSP_PARAMETER_TYPE         type;
+  char[]                     name;
+  char[]                     label;
+  string                     description;
+  DSP_PARAMETER_DESC_UNION   desc;
+}
+
+ +
FMOD_DSP_PARAMETER_DESC
+{
+  type,
+  name,
+  label,
+  description,
+};
+
+ +
+
type
+
Parameter type. (FMOD_DSP_PARAMETER_TYPE)
+
name
+
Parameter Name.
+
label
+
Unit type label.
+
description
+
Description of the parameter.
+
floatdesc
+
Floating point format description used when type is FMOD_DSP_PARAMETER_TYPE_FLOAT. (FMOD_DSP_PARAMETER_DESC_FLOAT)
+
intdesc
+
Integer format description used when type is FMOD_DSP_PARAMETER_TYPE_INT. (FMOD_DSP_PARAMETER_DESC_INT)
+
booldesc
+
Boolean format description used when type is FMOD_DSP_PARAMETER_TYPE_BOOL. (FMOD_DSP_PARAMETER_DESC_BOOL)
+
datadesc
+
Data format description used when type is FMOD_DSP_PARAMETER_TYPE_DATA. (FMOD_DSP_PARAMETER_DESC_DATA)
+
+

See Also: System::createDSP, DSP::setParameterFloat, DSP::getParameterFloat, DSP::setParameterInt, DSP::getParameterInt, DSP::setParameterBool, DSP::getParameterBool, DSP::setParameterData, DSP::getParameterData, FMOD_DSP_PARAMETER_DESC_FLOAT, FMOD_DSP_PARAMETER_DESC_INT, FMOD_DSP_PARAMETER_DESC_BOOL, FMOD_DSP_PARAMETER_DESC_DATA, FMOD_DSP_PARAMETER_DATA_TYPE

+

FMOD_DSP_PARAMETER_DESC_BOOL

+

Boolean parameter description.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_DESC_BOOL {
+  FMOD_BOOL            defaultval;
+  const char* const*   valuenames;
+} FMOD_DSP_PARAMETER_DESC_BOOL;
+
+ +
struct DSP_PARAMETER_DESC_BOOL
+{
+  bool      defaultval;
+  IntPtr    valuenames;
+}
+
+ +
FMOD_DSP_PARAMETER_DESC_BOOL
+{
+  defaultval,
+};
+
+ +
+
defaultval
+
+

Default parameter value.

+
    +
  • Units: Boolean
  • +
+
+
valuenames Opt
+
Names for false and true, respectively (UTF-8 string). There should be two strings.
+
+

See Also: System::createDSP, DSP::setParameterBool, DSP::getParameterBool, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_PARAMETER_DESC_DATA

+

Data parameter description.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_DESC_DATA {
+  int   datatype;
+} FMOD_DSP_PARAMETER_DESC_DATA;
+
+ +
struct DSP_PARAMETER_DESC_DATA
+{
+  int   datatype;
+}
+
+ +
FMOD_DSP_PARAMETER_DESC_DATA
+{
+  datatype,
+};
+
+ +
+
datatype
+
Type of data.
+
+

See Also: System::createDSP, DSP::setParameterData, DSP::getParameterData, FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_PARAMETER_DESC_FLOAT

+

Float parameter description.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_DESC_FLOAT {
+  float                              min;
+  float                              max;
+  float                              defaultval;
+  FMOD_DSP_PARAMETER_FLOAT_MAPPING   mapping;
+} FMOD_DSP_PARAMETER_DESC_FLOAT;
+
+ +
struct DSP_PARAMETER_DESC_FLOAT
+{
+  float                       min;
+  float                       max;
+  float                       defaultval;
+  DSP_PARAMETER_FLOAT_MAPPING mapping;
+}
+
+ +
FMOD_DSP_PARAMETER_DESC_FLOAT
+{
+  min,
+  max,
+  defaultval,
+};
+
+ +
+
min
+
Minimum value.
+
max
+
Maximum value.
+
defaultval
+
Default value.
+
mapping
+
How the values are distributed across dials and automation curves. (FMOD_DSP_PARAMETER_FLOAT_MAPPING)
+
+

See Also: System::createDSP, DSP::setParameterFloat, DSP::getParameterFloat, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_PARAMETER_DESC_INT

+

Integer parameter description.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_DESC_INT {
+  int                  min;
+  int                  max;
+  int                  defaultval;
+  FMOD_BOOL            goestoinf;
+  const char* const*   valuenames;
+} FMOD_DSP_PARAMETER_DESC_INT;
+
+ +
struct DSP_PARAMETER_DESC_INT
+{
+  int    min;
+  int    max;
+  int    defaultval;
+  bool   goestoinf;
+  IntPtr valuenames;
+}
+
+ +
FMOD_DSP_PARAMETER_DESC_INT
+{
+  min,
+  max,
+  defaultval,
+  goestoinf,
+};
+
+ +
+
min
+
Minimum value.
+
max
+
Maximum value.
+
defaultval
+
Default value.
+
goestoinf
+
+

Whether the last value represents infiniy.

+
    +
  • Units: Boolean
  • +
+
+
valuenames Opt
+
Names for each value (UTF-8 string). There should be as many strings as there are possible values (max - min + 1).
+
+

See Also: System::createDSP, DSP::setParameterInt, DSP::getParameterInt, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_PARAMETER_DYNAMIC_RESPONSE

+

Dynamic response data structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_DYNAMIC_RESPONSE {
+  int     numchannels;
+  float   rms[32];
+} FMOD_DSP_PARAMETER_DYNAMIC_RESPONSE;
+
+ +
struct DSP_PARAMETER_DYNAMIC_RESPONSE
+{
+  int numchannels;
+  float[] rms;
+}
+
+ +
DSP_PARAMETER_DYNAMIC_RESPONSE
+{
+  numchannels,
+  rms,
+}
+
+ +
+
numchannels R/O
+
The number of channels recorded in the rms array.
+
rms R/O
+
+

The RMS (Root Mean Square) averaged gain factor applied per channel for the last processed block of audio.

+
    +
  • Units: Linear
  • +
+
+
+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC, FMOD_DSP_PARAMETER_DATA_TYPE_DYNAMIC_RESPONSE

+

FMOD_DSP_PARAMETER_FFT

+

FFT parameter data structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_FFT {
+  int     length;
+  int     numchannels;
+  float   *spectrum[32];
+} FMOD_DSP_PARAMETER_FFT;
+
+ +
struct DSP_PARAMETER_FFT
+{
+  int       length;
+  int       numchannels;
+  float[][] spectrum;
+  void getSpectrum(ref float[][] buffer);
+  void getSpectrum(int channel, ref float[] buffer);
+}
+
+ +
FMOD_DSP_PARAMETER_FFT
+{
+  length,
+  numchannels,
+  spectrum
+};
+
+ +
+
length R/O
+
Number of entries in this spectrum window. Divide this by the output rate to get the hz per entry.
+
numchannels R/O
+
Number of channels in spectrum.
+
spectrum R/O
+
Per channel spectrum arrays. See remarks for more.
+
getSpectrum C#
+
Fill the provided buffer with the spectrum data to avoid garbage collection.
+
getSpectrum C#
+
Fill the provided buffer with the spectrum data for the specified channel to avoid garbage collection.
+
+

Notes on the spectrum data member. Values inside the float buffer are typically between 0 and 1.0.

+

Each top level array represents one PCM channel of data.

+

Address data as spectrum[channel][bin]. A bin is 1 fft window entry.

+

Only read/display half of the buffer typically for analysis as the 2nd half is usually the same data reversed due to the nature of the way FFT works.

+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC, FMOD_DSP_PARAMETER_DATA_TYPE_FFT, FMOD_DSP_TYPE, FMOD_DSP_FFT

+

FMOD_DSP_PARAMETER_FLOAT_MAPPING

+

Structure to define a mapping for a DSP unit's float parameter.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING {
+  FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE               type;
+  FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR   piecewiselinearmapping;
+} FMOD_DSP_PARAMETER_FLOAT_MAPPING;
+
+ +
struct DSP_PARAMETER_FLOAT_MAPPING
+{
+  DSP_PARAMETER_FLOAT_MAPPING_TYPE type;
+  DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping;
+}
+
+ +
FMOD_DSP_PARAMETER_FLOAT_MAPPING
+{
+  type,
+  piecewiselinearmapping
+};
+
+ +
+
type
+
Mapping type (FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE)
+
piecewiselinearmapping
+
Piecewise linear mapping type. (FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR)
+
+

See Also: FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE, FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR, FMOD_DSP_PARAMETER_DESC_FLOAT

+

FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR

+

Structure to define a piecewise linear mapping.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR {
+  int     numpoints;
+  float   *pointparamvalues;
+  float   *pointpositions;
+} FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR;
+
+ +
struct DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR
+{
+  int numpoints;
+  IntPtr pointparamvalues;
+  IntPtr pointpositions;
+}
+
+ +
FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR
+{
+  numpoints,
+};
+
+ +
+
numpoints
+
Number of pairs in the piecewise mapping (at least 2).
+
pointparamvalues
+
Values in the parameter's units for each point
+
pointpositions
+
Positions along the control's scale (e.g. dial angle) corresponding to each parameter value. The range of this scale is arbitrary and all positions will be relative to the minimum and maximum values (e.g. [0,1,3] is equivalent to [1,2,4] and [2,4,8]). If this array is zero, pointparamvalues will be distributed with equal spacing.
+
+

See Also: FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE, FMOD_DSP_PARAMETER_FLOAT_MAPPING

+

FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE

+

DSP float parameter mappings. These determine how values are mapped across dials and automation curves.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE {
+  FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR,
+  FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO,
+  FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR
+} FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE;
+
+ +
enum DSP_PARAMETER_FLOAT_MAPPING_TYPE
+{
+  DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR = 0,
+  DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO,
+  DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR,
+}
+
+ +
FMOD.DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR
+FMOD.DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO
+FMOD.DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR
+
+ +
+
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR
+
Values mapped linearly across range.
+
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO
+
A mapping is automatically chosen based on range and units. See remarks.
+
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR
+
Values mapped in a piecewise linear fashion defined by FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR.
+
+

FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO generates a mapping based on range and units. For example, if the units are in Hertz and the range is with-in the audio spectrum, a Bark scale will be chosen. Logarithmic scales may also be generated for ranges above zero spanning several orders of magnitude.

+

See Also: FMOD_DSP_PARAMETER_FLOAT_MAPPING

+

FMOD_DSP_PARAMETER_OVERALLGAIN

+

Overall gain parameter data structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_OVERALLGAIN {
+  float   linear_gain;
+  float   linear_gain_additive;
+} FMOD_DSP_PARAMETER_OVERALLGAIN;
+
+ +
struct DSP_PARAMETER_OVERALLGAIN
+{
+  float linear_gain;
+  float linear_gain_additive;
+}
+
+ +
FMOD_DSP_PARAMETER_OVERALLGAIN
+{
+  linear_gain,
+  linear_gain_additive,
+};
+
+ +
+
linear_gain R/O
+
Overall linear gain of the effect on the direct signal path.
+
linear_gain_additive R/O
+
Additive gain for parallel signal paths.
+
+

This parameter is read by the system to determine the effect's gain for voice virtualization.

+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC, Virtual Voice System

+

FMOD_DSP_PARAMETER_SIDECHAIN

+

Side chain parameter data structure.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_PARAMETER_SIDECHAIN {
+  FMOD_BOOL   sidechainenable;
+} FMOD_DSP_PARAMETER_SIDECHAIN;
+
+ +
struct DSP_PARAMETER_SIDECHAIN
+{
+  int sidechainenable;
+}
+
+ +
FMOD_DSP_PARAMETER_SIDECHAIN
+{
+  sidechainenable,
+};
+
+ +
+
sidechainenable
+
+

Whether sidechains are enabled.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: FMOD_DSP_PARAMETER_DATA_TYPE, FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_PARAMETER_TYPE

+

DSP parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PARAMETER_TYPE {
+  FMOD_DSP_PARAMETER_TYPE_FLOAT,
+  FMOD_DSP_PARAMETER_TYPE_INT,
+  FMOD_DSP_PARAMETER_TYPE_BOOL,
+  FMOD_DSP_PARAMETER_TYPE_DATA,
+  FMOD_DSP_PARAMETER_TYPE_MAX
+} FMOD_DSP_PARAMETER_TYPE;
+
+ +
enum DSP_PARAMETER_TYPE
+{
+  FLOAT = 0,
+  INT,
+  BOOL,
+  DATA,
+  MAX
+}
+
+ +
FMOD.DSP_PARAMETER_TYPE_FLOAT
+FMOD.DSP_PARAMETER_TYPE_INT
+FMOD.DSP_PARAMETER_TYPE_BOOL
+FMOD.DSP_PARAMETER_TYPE_DATA
+FMOD.DSP_PARAMETER_TYPE_MAX
+
+ +
+
FMOD_DSP_PARAMETER_TYPE_FLOAT
+
FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_FLOAT.
+
FMOD_DSP_PARAMETER_TYPE_INT
+
FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_INT.
+
FMOD_DSP_PARAMETER_TYPE_BOOL
+
FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_BOOL.
+
FMOD_DSP_PARAMETER_TYPE_DATA
+
FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_DATA.
+
FMOD_DSP_PARAMETER_TYPE_MAX
+
Maximum number of DSP parameter types.
+
+

See Also: FMOD_DSP_PARAMETER_DESC

+

FMOD_DSP_PROCESS_CALLBACK

+

Process callback.

+

This callback receives an input signal, and allows the user to filter or process the data and write it to the output. This is an alternative to the FMOD_DSP_READ_CALLBACK and FMOD_DSP_SHOULDIPROCESS_CALLBACK.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_PROCESS_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  unsigned int length,
+  const FMOD_DSP_BUFFER_ARRAY *inbufferarray,
+  FMOD_DSP_BUFFER_ARRAY *outbufferarray,
+  FMOD_BOOL inputsidle,
+  FMOD_DSP_PROCESS_OPERATION op
+);
+
+ +
delegate RESULT DSP_PROCESS_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  uint length,
+  ref DSP_BUFFER_ARRAY inbufferarray,
+  ref DSP_BUFFER_ARRAY outbufferarray,
+  bool inputsidle,
+  DSP_PROCESS_OPERATION op
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
length
+
+

Length of the incoming and outgoing buffer.

+
    +
  • Units: Samples
  • +
+
+
inbufferarray
+
Description of the incoming signal. (FMOD_DSP_BUFFER_ARRAY)
+
outbufferarray
+
Description of the outgoing signal. (FMOD_DSP_BUFFER_ARRAY)
+
inputsidle
+
+

This is true if no audio is being fed to this unit.

+
    +
  • Units: Boolean
  • +
+
+
op
+
Operation type. (FMOD_DSP_PROCESS_OPERATION)
+
+

Invoked by:

+
    +
  • FMOD mixer. The callback is called automatically and periodically when the DSP engine updates. This callback is called back regularly after the unit has been created, inserted to the DSP graph, and set to active by the user.
  • +
+

For a process update to be called it would have to be enabled, and this is done with DSP::setActive. If ChannelControl::addDSP is used the unit is automatically set to active.

+

Implementation detail:

+

This callback can be used to specify the output channel format at runtime rather than create time, and also supports multiple input/output buffers.

+

This callback will be called twice per mix as it has a dual purpose. Once will be with op = FMOD_DSP_PROCESS_QUERY, and then depending on the return value of the query, if it is FMOD_OK it will call it again with FMOD_DSP_PROCESS_PERFORM.

+

Return FMOD_ERR_DSP_SILENCE if the effect is generating silence, so FMOD's mixer can optimize the signal path and not process it any more.

+

See Also: FMOD_DSP_READ_CALLBACK, FMOD_DSP_SHOULDIPROCESS_CALLBACK, FMOD_DSP_DESCRIPTION

+

FMOD_DSP_PROCESS_OPERATION

+

Process operation type.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_DSP_PROCESS_OPERATION {
+  FMOD_DSP_PROCESS_PERFORM,
+  FMOD_DSP_PROCESS_QUERY
+} FMOD_DSP_PROCESS_OPERATION;
+
+ +
enum DSP_PROCESS_OPERATION
+{
+  PROCESS_PERFORM = 0,
+  PROCESS_QUERY
+}
+
+ +
FMOD.DSP_PROCESS_PERFORM
+FMOD.DSP_PROCESS_QUERY
+
+ +
+
FMOD_DSP_PROCESS_PERFORM
+
Process the incoming audio in 'inbufferarray' and output to 'outbufferarray'.
+
FMOD_DSP_PROCESS_QUERY
+
The DSP is being queried for the expected output format and whether it needs to process audio or should be bypassed. The function should return FMOD_OK, or FMOD_ERR_DSP_DONTPROCESS or FMOD_ERR_DSP_SILENCE if audio can pass through unprocessed. See remarks for more. If audio is to be processed, 'outbufferarray' must be filled with the expected output format, channel count and mask.
+
+

A process callback will be called twice per mix for a DSP unit. Once with the FMOD_DSP_PROCESS_QUERY command, then conditionally, FMOD_DSP_PROCESS_PERFORM.

+

FMOD_DSP_PROCESS_QUERY is to be handled only by filling out the outputarray information, and returning a relevant return code.

+

It should not really do any logic besides checking and returning one of the following codes:

+ +

If audio is to be processed, 'outbufferarray' must be filled with the expected output format, channel count and mask. Mask can be 0.

+

FMOD_DSP_PROCESS_PERFORM is to be handled by reading the data from the input, processing it, and writing it to the output. Always write to the output buffer and fill it fully to avoid unpredictable audio output.

+

Always return FMOD_OK, the return value is ignored from the process stage.

+

See Also: FMOD_DSP_PROCESS_CALLBACK, FMOD_DSP_DESCRIPTION

+

FMOD_DSP_READ_CALLBACK

+

DSP read callback.

+

This callback receives an input signal and allows the user of the plug-in to filter or process the data and write it to the output.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_READ_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  float *inbuffer,
+  float *outbuffer,
+  unsigned int length,
+  int inchannels,
+  int *outchannels
+);
+
+ +
delegate RESULT DSP_READ_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  IntPtr inbuffer,
+  IntPtr outbuffer,
+  uint length,
+  int inchannels,
+  ref int outchannels
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
inbuffer
+
Incoming floating point -1.0 to +1.0 ranged data. Data will be interleaved if inchannels is greater than 1.
+
outbuffer
+
Outgoing floating point -1.0 to +1.0 ranged data. The DSP writer must write to this pointer else there will be silence. Data must be interleaved if outchannels is greater than 1.
+
length
+
+

Length of the incoming and outgoing buffers.

+
    +
  • Units: Samples
  • +
+
+
inchannels
+
Number of channels of interleaved PCM data in the inbuffer parameter. Example: 1 = mono, 2 = stereo, 6 = 5.1.
+
outchannels
+
Number of channels of interleaved PCM data in the outbuffer parameter. Example: 1 = mono, 2 = stereo, 6 = 5.1.
+
+

Invoked by:

+
    +
  • FMOD mixer. The callback is called automatically and periodically when the DSP engine updates. This callback is called regularly after the unit has been created, inserted into the DSP graph, and set to active by the user.
  • +
+

For a read update to be called it would have to be enabled, and this is done with DSP::setActive. If ChannelControl::addDSP is used the unit is automatically set to active.

+

Implementation detail:

+

The range of -1 to 1 is a soft limit. In the case of the inbuffer it is not guaranteed to be in that range, and in the case of the outbuffer FMOD will accept values outside that range. However all values will be clamped to the range of -1 to 1 in the final mix.

+

This callback will not be called if the preceeding FMOD_DSP_SHOULDIPROCESS_CALLBACK is returning FMOD_ERR_DSP_DONTPROCESS. Return FMOD_ERR_DSP_SILENCE if the effect is generating silence, so FMOD's mixer can optimize the signal path and not process it any more.

+

NOTE: Effects that no not stop processing via FMOD_DSP_SHOULDIPROCESS_CALLBACK may keep the signal chain alive when it is not desirable to do so. FMOD Studio events may return that they are still playing when they should be stopped.

+

See Also: FMOD_DSP_SHOULDIPROCESS_CALLBACK, FMOD_DSP_DESCRIPTION, DSP::setActive, FMOD_RESULT

+

FMOD_DSP_RELEASE_CALLBACK

+

DSP release callback.

+

This callback is called when the user of the plug-in releases a DSP unit instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_RELEASE_CALLBACK(
+  FMOD_DSP_STATE *dsp_state
+);
+
+ +
delegate RESULT DSP_RELEASE_CALLBACK
+(
+  ref DSP_STATE dsp_state
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
+

Invoked by:

+ +

Implementation detail:

+

This callback is typically used to free any resources allocated during the course of the lifetime of the DSP instance or perform any shut down code needed to clean up the DSP unit.

+

See Also: FMOD_DSP_DESCRIPTION

+

FMOD_DSP_RESET_CALLBACK

+

DSP reset callback.

+

This callback function is called to allow a DSP effect to reset its internal state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_RESET_CALLBACK(
+  FMOD_DSP_STATE *dsp_state
+);
+
+ +
delegate RESULT DSP_RESET_CALLBACK
+(
+  ref DSP_STATE dsp_state
+)
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
+

Invoked by:

+ +

This callback is called on all plug-ins inside an event whenever the event is started (for example by Studio::EventInstance::start).

+

It is also useful if (for example) an effect is still holding audio data for a sound that has stopped, and is being relocated to a new sound. Resetting the unit would clear any buffers and get it ready for new sound data.

+

Note that this callback should not change any public parameters that are exposed via FMOD_DSP_DESCRIPTION::paramdesc, but should instead reset the internal state to match the public parameter values.

+

See Also: FMOD_DSP_DESCRIPTION

+

FMOD_DSP_SETPARAM_BOOL_CALLBACK

+

Set boolean parameter callback.

+

This callback is called when the user of the plug-in wants to set a boolean parameter for a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SETPARAM_BOOL_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  FMOD_BOOL value
+);
+
+ +
delegate RESULT DSP_SETPARAM_BOOL_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  bool value
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
value
+
+

Parameter value.

+
    +
  • Units: Boolean
  • +
+
+
+

Invoked by:

+ +

See Also: DSP::getParameterBool, FMOD_DSP_DESCRIPTION, FMOD_DSP_GETPARAM_BOOL_CALLBACK

+

FMOD_DSP_SETPARAM_DATA_CALLBACK

+

Set data parameter callback.

+

This callback is called when the user of the plug-in wants to set a binary data parameter for a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SETPARAM_DATA_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  void *data,
+  unsigned int length
+);
+
+ +
delegate RESULT DSP_SETPARAM_DATA_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  IntPtr data,
+  uint length
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
data
+
Parameter data. Binary data the size of length parameter.
+
length Opt
+
+

Size of the binary data parameter.

+
    +
  • Units: Bytes
  • +
+
+
+

Certain data types are predefined by the system and can be specified via the FMOD_DSP_PARAMETER_DESC_DATA, see FMOD_DSP_PARAMETER_DATA_TYPE

+

Invoked by:

+ +

See Also: DSP::getParameterData, FMOD_DSP_DESCRIPTION, FMOD_DSP_GETPARAM_DATA_CALLBACK

+

FMOD_DSP_SETPARAM_FLOAT_CALLBACK

+

Set float parameter callback.

+

This callback is called when the user wants to set a float parameter for a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SETPARAM_FLOAT_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  float value
+);
+
+ +
delegate RESULT DSP_SETPARAM_FLOAT_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  ref float value
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
value
+
Parameter value.
+
+

Invoked by:

+ +

Range checking is not needed. FMOD will clamp the incoming value to the specified min/max.

+

See Also: DSP::getParameterFloat, FMOD_DSP_DESCRIPTION, FMOD_DSP_GETPARAM_FLOAT_CALLBACK

+

FMOD_DSP_SETPARAM_INT_CALLBACK

+

Set integer parameter callback.

+

This callback is called when the user of the plug-in wants to set an integer parameter for a DSP unit.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SETPARAM_INT_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int index,
+  int value
+);
+
+ +
delegate RESULT DSP_SETPARAM_INT_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int index,
+  int value
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
index
+
Parameter index.
+
value
+
Parameter value.
+
+

Invoked by:

+ +

Range checking is not needed. FMOD will clamp the incoming value to the specified min/max.

+

See Also: DSP::setParameterInt, FMOD_DSP_DESCRIPTION, FMOD_DSP_GETPARAM_INT_CALLBACK

+

FMOD_DSP_SETPOSITION_CALLBACK

+

DSP set position callback.

+

This callback is called when the user of the plug-in wants to set a PCM position for a DSP.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SETPOSITION_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  unsigned int pos
+);
+
+ +
delegate RESULT DSP_SETPOSITION_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  uint pos
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
pos
+
+

Target position in channel stream. (FMOD_TIMEUNIT_PCM).

+
    +
  • Units: Samples
  • +
+
+
+

Invoked by:

+ +

This callback is typically used for DSP units that behave as an audio stream with a relative position. This type of callback is only called if the DSP has been played with System::playDSP.

+

See Also: FMOD_DSP_DESCRIPTION

+

FMOD_DSP_SHOULDIPROCESS_CALLBACK

+

DSP 'should I process?' callback.

+

This callback is called to allow you to tell the FMOD mixer whether the FMOD_DSP_READ_CALLBACK callback should be called or not. This can be used as an optimization to reduce CPU overhead.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SHOULDIPROCESS_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  FMOD_BOOL inputsidle,
+  unsigned int length,
+  FMOD_CHANNELMASK inmask,
+  int inchannels,
+  FMOD_SPEAKERMODE speakermode
+);
+
+ +
delegate RESULT DSP_SHOULDIPROCESS_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  bool inputsidle,
+  uint length,
+  CHANNELMASK inmask,
+  int inchannels,
+  SPEAKERMODE speakermode
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
inputsidle
+
+

This is true if no audio is being fed to this unit.

+
    +
  • Units: Boolean
  • +
+
+
length
+
+

Length of the incoming and outgoing buffer.

+
    +
  • Units: Samples
  • +
+
+
inmask
+
Deprecated. (FMOD_CHANNELMASK)
+
inchannels
+
Number of input channels.
+
speakermode
+
Speakermode that corresponds to the channel count and channel mask. (FMOD_SPEAKERMODE)
+
+

Invoked by:

+
    +
  • FMOD mixer. The callback is called automatically and periodically when the DSP engine updates.
  • +
+

Implementation detail:

+

An example of an effect that would continue processing silence would be an echo or reverb effect that needs to play a tail sound until it fades out to silence. At that point it could return FMOD_ERR_DSP_SILENCE as well.

+

Typically inmask and speakermode parameters are not important to a plug-in unless it cares about speaker positioning. If it processes any data regardless of channel format coming in, it can safely ignore these two parameters.

+

If the effect produces silence such as when it is receiving no signal, then FMOD_ERR_DSP_SILENCE can be returned in the FMOD_DSP_SHOULDIPROCESS_CALLBACK callback. If the effect does not modify the sound in any way with the current effect parameter settings, then FMOD_ERR_DSP_DONTPROCESS can be returned.
+Either of these return values will cause FMOD's mixer to skip the FMOD_DSP_READ_CALLBACK callback.

+

NOTE: Effects that do not stop processing may keep the signal chain alive when it is not desirable. In the case of FMOD Studio, it may result in events that keep playing indefinitely.

+

The following code can be used for DSP effects that have no tail:

+
static FMOD_RESULT F_CALL shouldIProcess(FMOD_DSP_STATE *dsp_state, bool inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode)
+{
+    if (inputsidle)
+    {
+        return FMOD_ERR_DSP_SILENCE;
+    }
+    return FMOD_OK;
+}
+
+ +

See Also: FMOD_DSP_READ_CALLBACK, FMOD_DSP_DESCRIPTION, FMOD_RESULT

+

FMOD_DSP_STATE

+

DSP plug-in structure that is passed into each callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_STATE {
+  void                      *instance;
+  void                      *plugindata;
+  FMOD_CHANNELMASK           channelmask;
+  FMOD_SPEAKERMODE           source_speakermode;
+  float                     *sidechaindata;
+  int                        sidechainchannels;
+  FMOD_DSP_STATE_FUNCTIONS   *functions;
+  int                        systemobject;
+} FMOD_DSP_STATE;
+
+ +
struct DSP_STATE
+{
+  IntPtr     instance;
+  IntPtr     plugindata;
+  uint       channelmask;
+  int        source_speakermode;
+  IntPtr     sidechaindata;
+  int        sidechainchannels;
+  IntPtr     functions;
+  int        systemobject;
+}
+
+ +
FMOD_DSP_STATE
+{
+  instance,
+  plugindata,
+  channelmask,
+  source_speakermode,
+  sidechaindata,
+  sidechainchannels,
+  functions,
+  systemobject,
+};
+
+ +
+
instance R/O
+
Internal instance pointer.
+
plugindata
+
Data that the plugin writer wants to attach to this object.
+
channelmask R/O
+
Specifies which speakers the DSP effect is active on. (FMOD_CHANNELMASK)
+
source_speakermode R/O
+
Specifies which speaker mode the signal originated. (FMOD_SPEAKERMODE)
+
sidechaindata R/O
+
Sidechain mix result.
+
sidechainchannels R/O
+
Number of channels in the sidechain buffer.
+
functions R/O
+
Struct containing functions to give plug-in developers the ability to query system state and access system level functionality and helpers. (FMOD_DSP_STATE_FUNCTIONS)
+
systemobject R/O
+
FMOD::System object index, relating to the System object that created this DSP.
+
+

'systemobject' is an integer associated with the system object that created the DSP or registered the DSP plug-in. If there is only one system object, this integer is always 0. If the DSP was created or registered by a second system object, the integer would be 1, and so on.
+FMOD_DSP_STATE_FUNCTIONS::getsamplerate/getblocksize/getspeakermode could return different results, so it could be relevant to plug-in developers who want to monitor which object is being used.

+

See Also: FMOD_DSP_DESCRIPTION, FMOD_DSP_STATE_FUNCTIONS

+

FMOD_DSP_STATE_DFT_FUNCTIONS

+

Struct containing DFT functions to enable a plug-in to perform optimized time-frequency domain conversion.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_STATE_DFT_FUNCTIONS {
+  FMOD_DSP_DFT_FFTREAL_FUNC    fftreal;
+  FMOD_DSP_DFT_IFFTREAL_FUNC   inversefftreal;
+} FMOD_DSP_STATE_DFT_FUNCTIONS;
+
+ +
struct DSP_STATE_DFT_FUNCTIONS
+{
+  DSP_DFT_FFTREAL_FUNC  fftreal;
+  DSP_DFT_IFFTREAL_FUNC inversefftreal;
+}
+
+ +
FMOD_DSP_STATE_DFT_FUNCTIONS
+{
+};
+
+ +
+
fftreal R/O
+
Function for performing an FFT on a real signal. (FMOD_DSP_DFT_FFTREAL_FUNC)
+
inversefftreal R/O
+
Function for performing an inverse FFT to get a real signal. (FMOD_DSP_DFT_IFFTREAL_FUNC)
+
+

See Also: FMOD_DSP_STATE_FUNCTIONS

+

FMOD_DSP_STATE_FUNCTIONS

+

Struct containing functions to give plug-in developers the ability to query system state and access system level functionality and helpers.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_STATE_FUNCTIONS {
+  FMOD_DSP_ALLOC_FUNC                   alloc;
+  FMOD_DSP_REALLOC_FUNC                 realloc;
+  FMOD_DSP_FREE_FUNC                    free;
+  FMOD_DSP_GETSAMPLERATE_FUNC           getsamplerate;
+  FMOD_DSP_GETBLOCKSIZE_FUNC            getblocksize;
+  FMOD_DSP_STATE_DFT_FUNCTIONS         *dft;
+  FMOD_DSP_STATE_PAN_FUNCTIONS         *pan;
+  FMOD_DSP_GETSPEAKERMODE_FUNC          getspeakermode;
+  FMOD_DSP_GETCLOCK_FUNC                getclock;
+  FMOD_DSP_GETLISTENERATTRIBUTES_FUNC   getlistenerattributes;
+  FMOD_DSP_LOG_FUNC                     log;
+  FMOD_DSP_GETUSERDATA_FUNC             getuserdata;
+} FMOD_DSP_STATE_FUNCTIONS;
+
+ +
struct DSP_STATE_FUNCTIONS
+{
+  DSP_ALLOC_FUNC                  alloc;
+  DSP_REALLOC_FUNC                realloc;
+  DSP_FREE_FUNC                   free;
+  DSP_GETSAMPLERATE_FUNC          getsamplerate;
+  DSP_GETBLOCKSIZE_FUNC           getblocksize;
+  IntPtr                          dft;
+  IntPtr                          pan;
+  DSP_GETSPEAKERMODE_FUNC         getspeakermode;
+  DSP_GETCLOCK_FUNC               getclock;
+  DSP_GETLISTENERATTRIBUTES_FUNC  getlistenerattributes;
+  DSP_LOG_FUNC                    log;
+  DSP_GETUSERDATA_FUNC            getuserdata;
+}
+
+ +
DSP_STATE_FUNCTIONS
+{
+};
+
+ +
+
alloc R/O
+
Function to allocate memory using the FMOD memory system. (FMOD_DSP_ALLOC_FUNC)
+
realloc R/O
+
Function to reallocate memory using the FMOD memory system. (FMOD_DSP_REALLOC_FUNC)
+
free R/O
+
Function to free memory allocated with FMOD_DSP_ALLOC_FUNC. (FMOD_DSP_FREE_FUNC)
+
getsamplerate R/O
+
Function to query the system sample rate. (FMOD_DSP_GETSAMPLERATE_FUNC)
+
getblocksize R/O
+
Function to query the system block size. DSPs are requested to process blocks of varying length up to this size. (FMOD_DSP_GETBLOCKSIZE_FUNC)
+
dft R/O
+
Struct containing DFT functions to enable a plug-in to perform optimized time-frequency domain conversion. (FMOD_DSP_STATE_DFT_FUNCTIONS)
+
pan R/O
+
Struct containing panning helper functions for spatialization plug-ins. (FMOD_DSP_STATE_PAN_FUNCTIONS)
+
getspeakermode R/O
+
Function to query the system speaker modes. One is the mixer's default speaker mode, the other is the output mode the system is downmixing or upmixing to. (FMOD_DSP_GETSPEAKERMODE_FUNC)
+
getclock R/O
+
Function to get the clock of the current DSP, as well as the subset of the input buffer that contains the signal. (FMOD_DSP_GETCLOCK_FUNC)
+
getlistenerattributes R/O
+
Callback for getting the absolute listener attributes set via the API (returned as left-handed coordinates). (FMOD_DSP_GETLISTENERATTRIBUTES_FUNC)
+
log R/O
+
Function to write to the FMOD logging system. (FMOD_DSP_LOG_FUNC)
+
getuserdata R/O
+
Function to get the user data attached to this DSP. See FMOD_DSP_DESCRIPTION::userdata. (FMOD_DSP_GETUSERDATA_FUNC)
+
+

See Also: FMOD_DSP_STATE, FMOD_DSP_STATE_DFT_FUNCTIONS, FMOD_DSP_STATE_PAN_FUNCTIONS

+

FMOD_DSP_STATE_PAN_FUNCTIONS

+

Struct containing panning helper functions for spatialization plug-ins.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_DSP_STATE_PAN_FUNCTIONS {
+  FMOD_DSP_PAN_SUMMONOMATRIX_FUNC               summonomatrix;
+  FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC             sumstereomatrix;
+  FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC           sumsurroundmatrix;
+  FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC     summonotosurroundmatrix;
+  FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC   sumstereotosurroundmatrix;
+  FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC              getrolloffgain;
+} FMOD_DSP_STATE_PAN_FUNCTIONS;
+
+ +
struct DSP_STATE_PAN_FUNCTIONS
+{
+  DSP_PAN_SUMMONOMATRIX_FUNC             summonomatrix;
+  DSP_PAN_SUMSTEREOMATRIX_FUNC           sumstereomatrix;
+  DSP_PAN_SUMSURROUNDMATRIX_FUNC         sumsurroundmatrix;
+  DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC   summonotosurroundmatrix;
+  DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix;
+  DSP_PAN_GETROLLOFFGAIN_FUNC            getrolloffgain;
+}
+
+ +
FMOD_DSP_STATE_PAN_FUNCTIONS
+{
+};
+
+ +
+
summonomatrix R/O
+
TBD. (FMOD_DSP_PAN_SUMMONOMATRIX_FUNC)
+
sumstereomatrix R/O
+
TBD. (FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC)
+
sumsurroundmatrix R/O
+
TBD. (FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC)
+
summonotosurroundmatrix R/O
+
TBD. (FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC)
+
sumstereotosurroundmatrix R/O
+
TBD. (FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC)
+
getrolloffgain R/O
+
TBD. (FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC)
+
+

See Also: FMOD_DSP_STATE_FUNCTIONS, FMOD_DSP_PAN_SURROUND_FLAGS

+

FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK

+

System level DSP type deregister callback.

+

The callback is called as a one time deregistration of a DSP plug-in type, rather than of an individual DSP instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK(
+  FMOD_DSP_STATE *dsp_state
+);
+
+ +
delegate RESULT DSP_SYSTEM_DEREGISTER_CALLBACK
+(
+  ref DSP_STATE dsp_state
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
+

Invoked by:

+ +

This callback is called after all instances of the plug-in type have been released.

+

The callback is not associated with any DSP instance, so the instance member of FMOD_DSP_STATE will be 0 / NULL. Only 'systemobject' and 'callbacks' are valid for use.

+

See Also: FMOD_DSP_DESCRIPTION

+

FMOD_DSP_SYSTEM_MIX_CALLBACK

+

System level DSP type mix callback.

+

The function can be used as a global pre/mid/post mix function for this type of DSP, rather than of an individual DSP instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SYSTEM_MIX_CALLBACK(
+  FMOD_DSP_STATE *dsp_state,
+  int stage
+);
+
+ +
delegate RESULT DSP_SYSTEM_MIX_CALLBACK
+(
+  ref DSP_STATE dsp_state,
+  int stage
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
stage
+
0 = premix, or before the mixer has executed. 1 = postmix, or after the mix has been executed. 2 = midmix, after clocks calculation before the main mix has occurred.
+
+

Invoked by:

+
    +
  • FMOD mixer. The callback is called automatically and periodically when the DSP engine updates.
  • +
+

The callback is not associated with any DSP instance, so the instance member of FMOD_DSP_STATE will be 0 / NULL. Only 'systemobject' and 'callbacks' are valid for use.
+The callback is triggered automatically by the mixer and is not triggered by any API function.

+

See Also: FMOD_DSP_DESCRIPTION

+

FMOD_DSP_SYSTEM_REGISTER_CALLBACK

+

System level DSP type registration callback.

+

The callback is called as a one time initialization to set up the DSP plug-in type, rather than of an individual DSP instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_DSP_SYSTEM_REGISTER_CALLBACK(
+  FMOD_DSP_STATE *dsp_state
+);
+
+ +
delegate RESULT DSP_SYSTEM_REGISTER_CALLBACK
+(
+  ref DSP_STATE dsp_state
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
dsp_state
+
DSP plug-in state. (FMOD_DSP_STATE)
+
+

Invoked by:

+ +

This callback is called before any instances of the plug-in type have been created.

+

The callback is not associated with any DSP instance, so the instance member of FMOD_DSP_STATE will be 0 / NULL. Only 'systemobject' and 'callbacks' are valid for use.

+

See Also: FMOD_DSP_DESCRIPTION

+

FMOD_PLUGIN_SDK_VERSION

+

The plug-in SDK version.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_PLUGIN_SDK_VERSION   110
+
+ +
FMOD.PLUGIN_SDK_VERSION
+
+ +
+

Currently not supported for C#.

+
+

See Also: FMOD_DSP_DESCRIPTION

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-output.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-output.html new file mode 100644 index 0000000..d86e4fa --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api-output.html @@ -0,0 +1,1164 @@ + + +Plug-in API Reference | Output + + + + +
+ +
+

9. Plug-in API Reference | Output

+

An interface that manages output plug-ins.

+

Object 3D:

+ +
+ +

General:

+ +
+ +
+ +
+ +

FMOD_OUTPUT_ALLOC_FUNC

+

Output allocate memory function.

+

+

+
C
+
C++
+
JS
+
+

+
void * F_CALL FMOD_OUTPUT_ALLOC_FUNC(
+  unsigned int size,
+  unsigned int align,
+  const char *file,
+  int line
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
size
+
+

Allocation size.

+
    +
  • Units: Bytes
  • +
+
+
align
+
+

Memory alignment.

+
    +
  • Units: Bytes
  • +
+
+
file
+
Source code file name where the allocation was requested.
+
line
+
Line of allocation in file.
+
+

See Also: FMOD_OUTPUT_STATE

+

FMOD_OUTPUT_CLOSEPORT_CALLBACK

+

Output close port callback.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_CLOSEPORT_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  int portId
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
portId
+
Port ID.
+
+

Main thread callback to close an auxiliary output port on the device.

+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_CLOSE_CALLBACK

+

Output close callback.

+

This callback is called to shut down and release the output driver's audio interface.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_CLOSE_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
+

Invoked by:

+ +

To stop the output stream, rather than closing and shutting it down, FMOD_OUTPUT_STOP_CALLBACK would be used.

+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_COPYPORT_FUNC

+

Output copy port function.

+

Function to copy the output from the mixer for the given auxiliary port.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_COPYPORT_FUNC(
+  FMOD_OUTPUT_STATE *output_state,
+  int portId,
+  void *buffer,
+  unsigned int length
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
portId
+
Auxiliary port.
+
buffer
+
Output buffer.
+
length
+
Length of buffer
+
+

See Also: FMOD_OUTPUT_STATE

+

FMOD_OUTPUT_DESCRIPTION

+

Output description.

+

This description structure allows the plug-in writer to define all functionality required for a user-defined output device.

+

+

+
C
+
C++
+
JS
+
+

+
typedef struct FMOD_OUTPUT_DESCRIPTION {
+  unsigned int                           apiversion;
+  const char                            *name;
+  unsigned int                           version;
+  FMOD_OUTPUT_METHOD                     method;
+  FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK     getnumdrivers;
+  FMOD_OUTPUT_GETDRIVERINFO_CALLBACK     getdriverinfo;
+  FMOD_OUTPUT_INIT_CALLBACK              init;
+  FMOD_OUTPUT_START_CALLBACK             start;
+  FMOD_OUTPUT_STOP_CALLBACK              stop;
+  FMOD_OUTPUT_CLOSE_CALLBACK             close;
+  FMOD_OUTPUT_UPDATE_CALLBACK            update;
+  FMOD_OUTPUT_GETHANDLE_CALLBACK         gethandle;
+  FMOD_OUTPUT_MIXER_CALLBACK             mixer;
+  FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK   object3dgetinfo;
+  FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK     object3dalloc;
+  FMOD_OUTPUT_OBJECT3DFREE_CALLBACK      object3dfree;
+  FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK    object3dupdate;
+  FMOD_OUTPUT_OPENPORT_CALLBACK          openport;
+  FMOD_OUTPUT_CLOSEPORT_CALLBACK         closeport;
+  FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK devicelistchanged;
+} FMOD_OUTPUT_DESCRIPTION;
+
+ +
FMOD_OUTPUT_DESCRIPTION
+{
+  apiversion,
+  name,
+  version,
+  method,
+  getnumdrivers,
+  getdriverinfo,
+  init,
+  start,
+  stop,
+  close,
+  update,
+  gethandle,
+  mixer,
+  object3dgetinfo,
+  object3dalloc,
+  object3dfree,
+  object3dupdate,
+  openport,
+  closeport,
+  devicelistchanged
+};
+
+ +
+

Not supported for C#.

+
+
+
apiversion
+
The output plug-in API version this plug-in is built for. Set to this to FMOD_OUTPUT_PLUGIN_VERSION.
+
name
+
The name of the output plug-in, encoded as a UTF-8 string.
+
version
+
The version of the output plug-in.
+
method
+
The method by which the mixer is executed and buffered. (FMOD_OUTPUT_METHOD)
+
getnumdrivers
+
A user thread callback to provide the number of attached sound devices. Called from System::getNumDrivers. (FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK)
+
getdriverinfo
+
A user thread callback to provide information about a particular sound device. Called from System::getDriverInfo. (FMOD_OUTPUT_GETDRIVERINFO_CALLBACK)
+
init
+
A user thread callback to allocate resources and provide information about hardware capabilities. Called from System::init. (FMOD_OUTPUT_INIT_CALLBACK)
+
start Opt
+
A user thread callback just before mixing should begin, calls to FMOD_OUTPUT_MIXER_CALLBACK will start, you may call FMOD_OUTPUT_READFROMMIXER_FUNC after this point. Called from System::init. (FMOD_OUTPUT_START_CALLBACK)
+
stop Opt
+
A user thread callback just after mixing has finished, calls to FMOD_OUTPUT_MIXER_CALLBACK have stopped, you may not call FMOD_OUTPUT_READFROMMIXER_FUNC after this point. Called from System::close. (FMOD_OUTPUT_STOP_CALLBACK)
+
close Opt
+
A user thread callback to clean up resources allocated during FMOD_OUTPUT_INIT_CALLBACK. Called from System::init and System::close. (FMOD_OUTPUT_CLOSE_CALLBACK)
+
update Opt
+
A user thread callback once per frame to update internal state. Called from System::update. (FMOD_OUTPUT_UPDATE_CALLBACK)
+
gethandle Opt
+
A user thread callback to provide a pointer to the internal device object used to share with other audio systems. Called from System::getOutputHandle. (FMOD_OUTPUT_GETHANDLE_CALLBACK)
+
mixer Opt
+
A mixer thread callback called repeatedly to give a thread for waiting on an audio hardware synchronization primitive (see remarks for details). Ensure you have a reasonable timeout (~200ms) on your synchronization primitive and allow this callback to return once per wakeup to avoid deadlocks. (FMOD_OUTPUT_MIXER_CALLBACK)
+
object3dgetinfo Opt
+
A mixer thread callback to provide information about the capabilities of 3D object hardware. Called during a mix. (FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK)
+
object3dalloc Opt
+
A mixer thread callback to reserve a hardware resources for a single 3D object. Called during a mix. (FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK)
+
object3dfree Opt
+
A mixer thread callback to release a hardware resource previously acquired with FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK. Called during a mix. (FMOD_OUTPUT_OBJECT3DFREE_CALLBACK)
+
object3dupdate Opt
+
A mixer thread callback once for every acquired 3D object every mix to provide 3D information and buffered audio. Called during a mix. (FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK)
+
openport Opt
+
A main thread callback to open an auxiliary output port on the device. (FMOD_OUTPUT_OPENPORT_CALLBACK)
+
closeport Opt
+
A main thread callback to close an auxiliary output port on the device. (FMOD_OUTPUT_CLOSEPORT_CALLBACK)
+
devicelistchanged Opt
+
A main thread callback to notify that a change to the device list may have occurred. (FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK)
+
+

Pass this structure to System::registerOutput to create a new output type, or if defining a dynamically loadable plug-in, return it in a function called FMODGetOutputDescription. FMOD's plug-in loader will look for this function in a dynamic library.

+
/*
+    Plug-in setup example
+*/
+extern "C" FMOD_OUTPUT_DESCRIPTION* F_CALL FMODGetOutputDescription()
+{
+    static FMOD_OUTPUT_DESCRIPTION desc;
+
+    /*
+        Fill members of structure
+    */
+
+    return &desc;
+}
+
+ +

There are several methods for driving the FMOD mixer to service the audio hardware.

+ +

Callbacks marked with 'user thread' will be called in response to the user of the Core API. In the case of the Studio API, the user is the Studio update thread.

+

See Also: FMOD_OUTPUT_STATE

+

FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK

+

Output device list change callback.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_FREE_FUNC

+

Output free memory function.

+

+

+
C
+
C++
+
JS
+
+

+
void F_CALL FMOD_OUTPUT_FREE_FUNC(
+  void *ptr,
+  const char *file,
+  int line
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
ptr
+
Allocation pointer.
+
file
+
Source code file name where the allocation is freed.
+
line
+
Line of free call in file.
+
+

See Also: FMOD_OUTPUT_STATE

+

FMOD_OUTPUT_GETDRIVERINFO_CALLBACK

+

Output get driver info callback.

+

This callback is called to provide the user with information about the selected audio driver.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_GETDRIVERINFO_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  int id,
+  char *name,
+  int namelen,
+  FMOD_GUID *guid,
+  int *systemrate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *speakermodechannels
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
id
+
The index into the total number of outputs possible, provided by the FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK callback.
+
name
+
The driver name relevant to the index passed in. Fill this in. (UTF-8 string)
+
namelen
+
+

The length of name buffer being passed in by the user.

+
    +
  • Units: Bytes
  • +
+
+
guid
+
The GUID structure. (FMOD_GUID)
+
systemrate Opt
+
+

The rate the output device prefers. Leave 0 to remain flexible.

+
    +
  • Units: Hertz
  • +
+
+
speakermode Opt
+
The speaker mode the output device prefers. Leave FMOD_SPEAKERMODE_DEFAULT to remain flexible. (FMOD_SPEAKERMODE)
+
speakermodechannels Opt
+
The speaker mode associated channels the output device prefers. Leave at 0 to remain flexible. Only used for FMOD_SPEAKERMODE_RAW.
+
+

Invoked by:

+ +

See Also: System::getNumDrivers, FMOD_OUTPUT_DESCRIPTION, System::getNumDrivers, FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK

+

FMOD_OUTPUT_GETHANDLE_CALLBACK

+

Output get output handle callback.

+

This callback is called to provide the user with a low level audio interface handle that may be used to pass to other middleware.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_GETHANDLE_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  void **handle
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
handle Out
+
Plug-in's output 'handle'.
+
+

Invoked by:

+ +

This callback is only needed if the plug-in writer wants to allow the user access to the main handle behind the plug-in (for example the file handle in a file writer plug-in). The plug-in writer needs to document and publish the type of the handle, as is done in the documentation for System::getOutputHandle.

+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK

+

Output get number of drivers callback.

+

This callback is called to provide the user with the number of devices usable for the output mode.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  int *numdrivers
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
numdrivers
+
Number of output drivers in your plug-in.
+
+

Invoked by:

+ +

Optional. FMOD will assume 0 if this is not specified.

+

See Also: FMOD_OUTPUT_DESCRIPTION, System::getDriverInfo, FMOD_OUTPUT_GETDRIVERINFO_CALLBACK

+

FMOD_OUTPUT_INIT_CALLBACK

+

Output initialization callback.

+

This callback is called to allow initialization of the output stream for mixing.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_INIT_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  int selecteddriver,
+  FMOD_INITFLAGS flags,
+  int *outputrate,
+  FMOD_SPEAKERMODE *speakermode,
+  int *speakermodechannels,
+  FMOD_SOUND_FORMAT *outputformat,
+  int dspbufferlength,
+  int *dspnumbuffers,
+  int *dspnumadditionalbuffers,
+  void *extradriverdata
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
selecteddriver
+
Selected driver id that the user chose from calling System::setDriver.
+
flags
+
Initialization flags passed in by the user. (FMOD_INITFLAGS)
+
outputrate
+
+

Output rate selected by the user. If not possible, change the rate to the closest match. FMOD will resample from the rate requested to your rate if they do not match.

+
    +
  • Units: Hertz
  • +
+
+
speakermode
+
Speaker mode selected by the user. If not possible, change the speaker mode to the closest match. FMOD will upmix or downmix to the requested speaker mode if they do not match. (FMOD_SPEAKERMODE)
+
speakermodechannels
+
Speaker mode channel count selected by the user. For example 1 = mono output. 2 = stereo output. Needed if supporting FMOD_SPEAKERMODE_RAW, otherwise it is informational.
+
outputformat
+
Sound format supported by output mode. For example, FMOD_SOUND_FORMAT_PCM16 would be normal. FMOD will convert from FMOD_SOUND_FORMAT_PCMFLOAT (the mixer buffer format) to whatever you specify. (FMOD_SOUND_FORMAT)
+
dspbufferlength
+
+

Size of the buffer fmod will mix to in one mix update.

+
    +
  • Units: Samples
  • +
+
+
dspnumbuffers
+
The number of buffers the FMOD Engine mixes the signal to in a circular fashion. Multiply this by dspbufferlength to get the total size of the output sound buffer to allocate. This can be set by the plug-in when FMOD_OUTPUT_DESCRIPTION::method is set to FMOD_OUTPUT_METHOD_MIX_BUFFERED.
+
dspnumadditionalbuffers Out
+
Number of additional buffers that a plug-in with FMOD_OUTPUT_DESCRIPTION::method set to FMOD_OUTPUT_METHOD_MIX_BUFFERED requires. These will be allocated up front to allow the number of used buffers to grow when an internal buffer starvation is detected.
+
extradriverdata
+
Data passed in by the user specific to this driver.
+
+

Invoked by:

+ +

See Also: FMOD_OUTPUT_DESCRIPTION, System::setDriver

+

FMOD_OUTPUT_LOG_FUNC

+

Output log function.

+

Call this function in an output plug-in context to utilize the FMOD Engine's debugging system.

+

+

+
C
+
C++
+
JS
+
+

+
void F_CALL FMOD_OUTPUT_LOG_FUNC(
+  FMOD_DEBUG_FLAGS level,
+  const char *file,
+  int line,
+  const char *function,
+  const char *string,
+  ...
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
level
+
Log type or level. (FMOD_DEBUG_FLAGS)
+
file
+
Source code file name from where the log is called. (UTF-8 string)
+
line
+
Line of log call in file.
+
function
+
Name of the logging function. (UTF-8 string)
+
string
+
Log output string. (UTF-8 string)
+
+

See Also: FMOD_OUTPUT_STATE

+

FMOD_OUTPUT_METHOD

+

Output method used to interact with the mixer.

+

+

+
C
+
C++
+
JS
+
+

+
#define FMOD_OUTPUT_METHOD_MIX_DIRECT    0
+#define FMOD_OUTPUT_METHOD_MIX_BUFFERED  2
+
+ +
OUTPUT_METHOD_MIX_DIRECT    = 0
+OUTPUT_METHOD_MIX_BUFFERED  = 1
+
+ +
+

Not supported for C#.

+
+
+
FMOD_OUTPUT_METHOD_MIX_DIRECT
+
When calling FMOD_OUTPUT_READFROMMIXER_FUNC, the mixer executes directly. Buffering must be performed by plug-in code.
+
FMOD_OUTPUT_METHOD_MIX_BUFFERED
+
Mixer will execute and buffer automatically (on a separate thread) and can be read from with FMOD_OUTPUT_READFROMMIXER_FUNC.
+
+

For hardware that presents a callback that must be filled immediately FMOD_OUTPUT_METHOD_MIX_BUFFERED is recommended as buffering occurs in a separate thread, reading from the mixer is simply a memcpy. Using FMOD_OUTPUT_METHOD_MIX_DIRECT is recommended if you want to take direct control of how and when the mixer runs.

+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_MIXER_CALLBACK

+

Output mixer callback.

+

This callback can be used to stall the FMOD mixer thread until it is ready to call the FMOD mixer directly.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_MIXER_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
+

Invoked by:

+ +

This callback must use the FMOD_OUTPUT_READFROMMIXER_FUNC function to produce the audio stream needed by the output.

+

This callback is optional in FMOD_OUTPUT_METHOD_MIX_DIRECT or FMOD_OUTPUT_METHOD_MIX_BUFFERED mode. An output mode may avoid this callback, and instead use its own timing system to call the FMOD mixer with FMOD_OUTPUT_READFROMMIXER_FUNC.

+

If this callback is used, it will be triggered immediately from the FMOD mixer thread. The callback can then stall with its own synchronization primitive (ie a wait on a semaphore), until something else signals the primitive to execute a mix with FMOD_OUTPUT_READFROMMIXER_FUNC.

+

Ensure you have a reasonable timeout (~200ms) on your synchronization primitive and allow this callback to return regularly, to avoid deadlocks.

+

See Also: FMOD_OUTPUT_DESCRIPTION, FMOD_OUTPUT_STATE

+

FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK

+

Output 3D Object alloc callback.

+

This callback is called to reserve hardware resources for a single 3D object.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  void **object3d
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
object3d
+
3D audio object.
+
+

Invoked by:

+
    +
  • FMOD mixer thread.
  • +
+

This callback is used for 'Object based audio' where sound hardware can receive individual audio streams and position them in 3D space natively, separate from the FMOD mixer. A typical implementation would be something like Dolby Atmos or Playstation VR.

+

See Also: FMOD_OUTPUT_DESCRIPTION, FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK, FMOD_OUTPUT_OBJECT3DFREE_CALLBACK, FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK

+

FMOD_OUTPUT_OBJECT3DFREE_CALLBACK

+

Output 3D Object free callback.

+

This callback is called to release a hardware resource previously acquired with FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_OBJECT3DFREE_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  void *object3d
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
object3d
+
3D audio object.
+
+

Invoked by:

+
    +
  • FMOD mixer thread.
  • +
+

This callback is used for 'Object based audio' where sound hardware can receive individual audio streams and position them in 3D space natively, separate from the FMOD mixer. A typical implementation would be something like Dolby Atmos or Atmos or Playstation VR.

+

See Also: FMOD_OUTPUT_DESCRIPTION, FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK, FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK, FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK

+

FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK

+

Output 3D Object get info callback.

+

Called from the mixer thread to provide information about the capabilities of 3D object hardware.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  int *maxhardwareobjects
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
maxhardwareobjects
+
Maximum number of 3D objects supported.
+
+

Invoked by:

+
    +
  • FMOD mixer thread.
  • +
+

This callback is used for 'Object based audio' where sound hardware can receive individual audio streams and position them in 3D space natively, separate from the FMOD mixer. A typical implementation would be something like Dolby Atmos or Atmos or Playstation VR.

+

See Also: FMOD_OUTPUT_DESCRIPTION, FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK, FMOD_OUTPUT_OBJECT3DFREE_CALLBACK, FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK

+

FMOD_OUTPUT_OBJECT3DINFO

+

Output 3D Object Info.

+

+

+
C
+
C++
+
JS
+
+

+
typedef struct FMOD_OUTPUT_OBJECT3DINFO {
+  float         *buffer;
+  unsigned int   bufferlength;
+  FMOD_VECTOR    position;
+  float          gain;
+  float          spread;
+  float          priority;
+} FMOD_OUTPUT_OBJECT3DINFO;
+
+ +
FMOD_OUTPUT_OBJECT3DINFO
+{
+  buffer,
+  bufferlength,
+  position,
+  gain,
+  spread,
+  priority,
+};
+
+ +
+

Not supported for C#.

+
+
+
buffer R/O
+
Mono PCM floating point buffer. This buffer needs to be scaled by the gain value to get distance attenuation.
+
bufferlength R/O
+
Length in PCM samples of buffer.
+
position R/O
+
Vector relative between object and listener. (FMOD_VECTOR)
+
gain R/O
+
0.0 to 1.0 - 1 = 'buffer' is not attenuated, 0 = 'buffer' is fully attenuated.
+
spread R/O
+
0 - 360 degrees. 0 = point source, 360 = sound is spread around all speakers
+
priority R/O
+
0.0 to 1.0 - 0 = most important, 1 = least important. Based on height and distance (height is more important).
+
+

This callback is used for 'Object mixing' where sound hardware can receive individual audio streams and position them in 3D space natively, separate from the FMOD mixer. A typical implementation would be something like Dolby Atmos or Atmos or Playstation VR.

+

This structure is passed to the plug-in via FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK, so that any object-based panning solution available can position it in the speakers correctly.
+Object based panning is a 3D panning solution that sends a mono-only signal to a hardware device, such as Dolby Atmos or other similar panning solutions.

+

FMOD does not attenuate the buffer, but provides a 'gain' parameter that the user must use to scale the buffer by. Rather than pre-attenuating the buffer, the plug-in developer can access untouched data for other purposes, like reverb sending for example.
+The 'gain' parameter is based on the user's 3D custom roll-off model.

+

See Also: FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK

+

FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK

+

Output 3D Object update callback.

+

Called from the mixer thread once for every acquired 3D object every mix to provide 3D information and buffered audio.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  void *object3d,
+  const FMOD_OUTPUT_OBJECT3DINFO *info
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
object3d
+
3D audio object.
+
info
+
3D object characteristics. (FMOD_OUTPUT_OBJECT3DINFO)
+
+

Invoked by:

+
    +
  • FMOD mixer
  • +
+

This callback is used for 'Object based audio' where sound hardware can receive individual audio streams and position them in 3D space natively, separate from the FMOD mixer. A typical implementation would be something like Dolby Atmos or Atmos or Playstation VR.

+

See Also: FMOD_OUTPUT_DESCRIPTION, FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK, FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK, FMOD_OUTPUT_OBJECT3DFREE_CALLBACK

+

FMOD_OUTPUT_OPENPORT_CALLBACK

+

Output open port callback.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_OPENPORT_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state,
+  FMOD_PORT_TYPE portType,
+  FMOD_PORT_INDEX portIndex,
+  int *portId,
+  int *portRate,
+  int *portChannels,
+  FMOD_SOUND_FORMAT *portFormat
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
portType
+
Port type. (FMOD_PORT_TYPE)
+
portIndex
+
Port index. (FMOD_PORT_INDEX)
+
portId Out
+
Port ID.
+
portRate Out
+
+

Port rate.

+
    +
  • Units: Hertz
  • +
+
+
portChannels Out
+
Number of channels.
+
portFormat
+
Port sound format. (FMOD_SOUND_FORMAT)
+
+

Main thread callback to open an auxiliary output port on the device.

+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_PLUGIN_VERSION

+

The output plug-in API version the plug-in was created with.

+

+

+
C
+
C++
+
JS
+
+

+
#define FMOD_OUTPUT_PLUGIN_VERSION   5
+
+ +
FMOD.OUTPUT_PLUGIN_VERSION
+
+ +
+

Currently not supported for C#.

+
+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_READFROMMIXER_FUNC

+

Output read from mixer function.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_READFROMMIXER_FUNC(
+  FMOD_OUTPUT_STATE *output_state,
+  void *buffer,
+  unsigned int length
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
buffer
+
Memory for the Studio API mixer to write to, provided by the plug-in writer.
+
length
+
Length of the buffer in samples.
+
+

Called by the plug-in. Use this function from your own driver irq/timer to read some data from FMOD's DSP engine. All of the resulting output caused by playing sounds and specifying effects by the user of the plug-in is mixed here and written to the memory provided by you.

+

FMOD_OUTPUT_REQUESTRESET_FUNC

+

Output request reset function.

+

Request the output to shut down and restart.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_REQUESTRESET_FUNC(
+  FMOD_OUTPUT_STATE *output_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
+

If this is issued, the output will not reset immediately, but on the next udpate the output will first shut down with a call to the FMOD_OUTPUT_STOP_CALLBACK then FMOD_OUTPUT_CLOSE_CALLBACK, followed by a restart with FMOD_OUTPUT_INIT_CALLBACK and FMOD_OUTPUT_START_CALLBACK

+

FMOD_OUTPUT_START_CALLBACK

+

Output start callback.

+

Called just before mixing should begin. This callback is called to start the output driver's audio stream.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_START_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
+

Invoked by:

+ +

This function is meant for starting the output audio rather than allocating memory and initializing interfaces like FMOD_OUTPUT_INIT_CALLBACK would.

+

See Also: FMOD_OUTPUT_DESCRIPTION, FMOD_OUTPUT_STOP_CALLBACK

+

FMOD_OUTPUT_STATE

+

Output object state passed into every callback provides access to plug-in developers data and system functionality.

+

+

+
C
+
C++
+
JS
+
+

+
typedef struct FMOD_OUTPUT_STATE {
+  void                            *plugindata;
+  FMOD_OUTPUT_READFROMMIXER_FUNC   readfrommixer;
+  FMOD_OUTPUT_ALLOC_FUNC           alloc;
+  FMOD_OUTPUT_FREE_FUNC            free;
+  FMOD_OUTPUT_LOG_FUNC             log;
+  FMOD_OUTPUT_COPYPORT_FUNC        copyport;
+  FMOD_OUTPUT_REQUESTRESET_FUNC    requestreset;
+} FMOD_OUTPUT_STATE;
+
+ +
FMOD_OUTPUT_STATE
+{
+  plugindata,
+};
+
+ +
+

Not supported for C#.

+
+
+
plugindata
+
Plug-in state data.
+
readfrommixer R/O
+
Function to read a buffer of audio from the mixer. Used to control when the mix occurs manually when FMOD_OUTPUT_DESCRIPTION::method set to FMOD_OUTPUT_METHOD_MIX_DIRECT. (FMOD_OUTPUT_READFROMMIXER_FUNC)
+
alloc R/O
+
Function to allocate memory using the FMOD memory system. (FMOD_OUTPUT_ALLOC_FUNC)
+
free R/O
+
Function to free memory allocated with FMOD_OUTPUT_ALLOC. (FMOD_OUTPUT_FREE_FUNC)
+
log R/O
+
Function to write to the FMOD logging system. (FMOD_OUTPUT_LOG_FUNC)
+
copyport R/O
+
Function to copy the output from the mixer for the given auxiliary port. (FMOD_OUTPUT_COPYPORT_FUNC)
+
requestreset R/O
+
Function to request the output plug-in be shutdown then restarted during the next System::update. (FMOD_OUTPUT_REQUESTRESET_FUNC)
+
+

See Also: FMOD_OUTPUT_DESCRIPTION

+

FMOD_OUTPUT_STOP_CALLBACK

+

Output stop callback.

+

Called just after mixing has ended. This callback is called to stop the output driver's audio stream.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_STOP_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
+

Invoked by:

+ +

This function is meant for stopping the output audio rather than freeing memory and shutting down audio interfaces like FMOD_OUTPUT_CLOSE_CALLBACK would.

+

See Also: FMOD_OUTPUT_DESCRIPTION, FMOD_OUTPUT_START_CALLBACK

+

FMOD_OUTPUT_UPDATE_CALLBACK

+

Output update callback.

+

+

+
C
+
C++
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_OUTPUT_UPDATE_CALLBACK(
+  FMOD_OUTPUT_STATE *output_state
+);
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+
+
output_state
+
Plug-in state. (FMOD_OUTPUT_STATE)
+
+

Invoked by:

+ +

This callback is invoked from the main application update which allows the output to process data in sync with the application, rather than the mixer thread.

+

See Also: FMOD_OUTPUT_DESCRIPTION, System::update

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api.html new file mode 100644 index 0000000..8b8f624 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/plugin-api.html @@ -0,0 +1,37 @@ + + +Plug-in API Reference + + + + +
+ +
+

9. Plug-in API Reference

+
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/scripts/language-selector.js b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/scripts/language-selector.js new file mode 100644 index 0000000..71e752a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/scripts/language-selector.js @@ -0,0 +1,98 @@ +var languageTabs = null; +var languageSpecificElements = null; +var availableLanguages = null; + +// Helper function to iterate over an HTMLCollection or NodeList (https://stackoverflow.com/questions/3871547/js-iterating-over-result-of-getelementsbyclassname-using-array-foreach) +function forEachElement(collection, func) { + Array.prototype.forEach.call(collection, func); +} + +function matchLanguage(el, lang) { + if (lang == "language-all" || el.classList.contains("language-all")) { + return true; + } else if ((lang === "language-c" || lang === "language-cpp") && el.classList.contains("language-c-cpp")) { + return true; + } else { + return el.classList.contains(lang); + } +} + +function setLanguage(lang) { + if (languageSpecificElements == null) { + return; + } + + window.localStorage.setItem("FMOD.Documents.selected-language", lang); + + if (availableLanguages.length > 0 && !availableLanguages.includes(lang)) { + lang = availableLanguages[0]; + } + + forEachElement(languageTabs, function(el) { + var ellang = el.attributes['data-language'].value; + + if (ellang === lang) { + el.classList.add("selected"); + } else { + el.classList.remove("selected"); + } + }); + + forEachElement(languageSpecificElements, function(el) { + if (matchLanguage(el, lang)) { + el.style.display = 'block'; + } else { + el.style.display = 'none'; + } + }); + + window.localStorage.setItem("FMOD.Documents.selected-language", lang); +} + +function init() { + var docsBody = document.querySelector("div.manual-content.api"); + + if (docsBody) { + // API docs + + // Setup language tabs + languageTabs = docsBody.getElementsByClassName("language-tab"); + + forEachElement(languageTabs, function(el) { + el.onclick = function() { setLanguage(this.attributes['data-language'].value); } + }); + + // Cache language specific elements on the page + languageSpecificElements = docsBody.querySelectorAll(".language-c, .language-cpp, .language-c-cpp, .language-csharp, .language-javascript"); + + // Determine languages used on the page + availableLanguages = []; + ["language-c", "language-cpp", "language-c-cpp", "language-csharp", "language-javascript"].forEach(function(lang) { + if (docsBody.querySelector("." + lang) != null) { + availableLanguages.push(lang); + } + }); + + if (availableLanguages.indexOf("language-c-cpp") >=0) { + if (availableLanguages.indexOf("language-c") < 0) availableLanguages.push("language-c"); + if (availableLanguages.indexOf("language-cpp") < 0) availableLanguages.push("language-cpp"); + } + // Set initial language + var lang = window.localStorage.getItem("FMOD.Documents.selected-language"); + + if (lang == null) { + lang = "language-cpp"; + } + + setLanguage(lang); + } +} + +if (typeof module !== 'undefined') { + module.exports = { initLanguageSelector: init }; +} else { + // Call our init function when the document is loaded. (https://plainjs.com/javascript/events/running-code-when-the-document-is-ready-15/) + if (document.readyState != 'loading') init(); + else if (document.addEventListener) document.addEventListener('DOMContentLoaded', init); + else document.attachEvent('onreadystatechange', function() { if (document.readyState == 'complete') init(); }); +} diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-bank.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-bank.html new file mode 100644 index 0000000..8225cd5 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-bank.html @@ -0,0 +1,756 @@ + + +Studio API Reference | Studio::Bank + + + + +
+ +
+

6. Studio API Reference | Studio::Bank

+

Banks made in FMOD Studio contain the metadata and audio sample data required for runtime mixing and playback. Audio sample data may be packed into the same bank as the event metadata which references it, or it may be packed into separate banks.

+

Loading:

+ +

Buses:

+
    +
  • Studio::Bank::getBusCount Retrieves the number of buses in the bank. This is only relevant for master banks, as other banks do not contain buses.
  • +
  • Studio::Bank::getBusList Retrieves a list of the buses in the bank. This is only relevant for master banks, as other banks do not contain buses.
  • +
+

Events:

+ +

String Table:

+ +

VCAs:

+ +

General:

+ +

See Also:

+ +

Studio::Bank::getBusCount

+

Retrieves the number of buses in the bank. This is only relevant for master banks, as other banks do not contain buses.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getBusCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetBusCount(
+  FMOD_STUDIO_BANK *bank,
+  int *count
+);
+
+ +
RESULT Studio.Bank.getBusCount(
+  out int count
+);
+
+ +
Bank.getBusCount(
+  count
+);
+
+ +
+
count Out
+
Bus count.
+
+

May be used in conjunction with Studio::Bank::getBusList to enumerate the buses in the bank.

+

Studio::Bank::getBusList

+

Retrieves a list of the buses in the bank. This is only relevant for master banks, as other banks do not contain buses.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getBusList(
+  Studio::Bus **array,
+  int capacity,
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetBusList(
+  FMOD_STUDIO_BANK *bank,
+  FMOD_STUDIO_BUS **array,
+  int capacity,
+  int *count
+);
+
+ +
RESULT Studio.Bank.getBusList(
+  out Bus[] array
+);
+
+ +
Bank.getBusList(
+  array,
+  capacity,
+  count
+);
+
+ +
+
array Out
+
Array to receive the list. (Studio::Bus)
+
capacity
+
Capacity of array.
+
count OutOpt
+
Number of buses written to array.
+
+

May be used in conjunction with Studio::Bank::getBusCount to enumerate the buses in the bank.

+

This function returns a maximum of capacity buses from the bank. If the bank contains more than capacity buses additional buses will be silently ignored.

+

Studio::Bank::getEventCount

+

Retrieves the number of event descriptions in the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getEventCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetEventCount(
+  FMOD_STUDIO_BANK *bank,
+  int *count
+);
+
+ +
RESULT Studio.Bank.getEventCount(
+  out int count
+);
+
+ +
Bank.getEventCount(
+  count
+);
+
+ +
+
count Out
+
Event description count.
+
+

May be used in conjunction with Studio::Bank::getEventList to enumerate the events in the bank.

+

This function counts the events which were added to the bank by the sound designer. The bank may contain additional events which are referenced by event instruments but were not added to the bank, and those referenced events are not counted.

+

Studio::Bank::getEventList

+

Retrieves a list of the event descriptions in the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getEventList(
+  Studio::EventDescription **array,
+  int capacity,
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetEventList(
+  FMOD_STUDIO_BANK *bank,
+  FMOD_STUDIO_EVENTDESCRIPTION **array,
+  int capacity,
+  int *count
+);
+
+ +
RESULT Studio.Bank.getEventList(
+  out EventDescription[] array
+);
+
+ +
Bank.getEventList(
+  array,
+  capacity,
+  count
+);
+
+ +
+
array Out
+
Array to receive the list. (Studio::EventDescription)
+
capacity
+
Capacity of array.
+
count OutOpt
+
Number of event descriptions written to array.
+
+

This function returns a maximum of capacity events from the bank. If the bank contains more than capacity events then additional events will be silently ignored.

+

May be used in conjunction with Studio::Bank::getEventCount to enumerate the events in the bank.

+

This function retrieves the events which were added to the bank by the sound designer. The bank may contain additional events which are referenced by event instruments but were not added to the bank, and those referenced events are not retrieved.

+

Studio::Bank::getID

+

Retrieves the bank's GUID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getID(
+  FMOD_GUID *id
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetID(
+  FMOD_STUDIO_BANK *bank,
+  FMOD_GUID *id
+);
+
+ +
RESULT Studio.Bank.getID(
+  out Guid id
+);
+
+ +
Bank.getID(
+  id
+);
+
+ +
+
id Out
+
Bank GUID. (FMOD_GUID)
+
+

Studio::Bank::getLoadingState

+

Retrieves the loading state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getLoadingState(
+  FMOD_STUDIO_LOADING_STATE *state
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetLoadingState(
+  FMOD_STUDIO_BANK *bank,
+  FMOD_STUDIO_LOADING_STATE *state
+);
+
+ +
RESULT Studio.Bank.getLoadingState(
+  out LOADING_STATE state
+);
+
+ +
Bank.getLoadingState(
+  state
+);
+
+ +
+
state Out
+
Loading state. (FMOD_STUDIO_LOADING_STATE)
+
+

This function may be used to check the loading state of a bank which has been loaded asynchronously using the FMOD_STUDIO_LOAD_BANK_NONBLOCKING flag, or is pending unload following a call to Studio::Bank::unload.

+

If an asynchronous load failed due to a file error state will contain FMOD_STUDIO_LOADING_STATE_ERROR and the return code from this function will be the error code of the bank load function.

+

See Also: Studio::System::loadBankFile, Studio::System::loadBankMemory, Studio::System::loadBankCustom

+

Studio::Bank::getPath

+

Retrieves the path.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getPath(
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetPath(
+  FMOD_STUDIO_BANK *bank,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.Bank.getPath(
+  out string path
+);
+
+ +
Bank.getPath(
+  path,
+  size,
+  retrieved
+);
+
+ +
+
path OutOpt
+
Buffer to receive the path. (UTF-8 string)
+
size
+
Size of the path buffer in bytes. Must be 0 if path is null.
+
retrieved OutOpt
+
Length of the path in bytes, including the terminating null character.
+
+

The strings bank must be loaded prior to calling this function, otherwise FMOD_ERR_EVENT_NOTFOUND is returned.

+

If the path is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full path

+

Studio::Bank::getSampleLoadingState

+

Retrieves the loading state of the samples in the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getSampleLoadingState(
+  FMOD_STUDIO_LOADING_STATE *state
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetSampleLoadingState(
+  FMOD_STUDIO_BANK *bank,
+  FMOD_STUDIO_LOADING_STATE *state
+);
+
+ +
RESULT Studio.Bank.getSampleLoadingState(
+  out LOADING_STATE state
+);
+
+ +
Bank.getSampleLoadingState(
+  state
+);
+
+ +
+
state Out
+
Loading state. (FMOD_STUDIO_LOADING_STATE)
+
+

May be used for tracking the status of the Studio::Bank::loadSampleData operation.

+

If Studio::Bank::loadSampleData has not been called for the bank then this function will return FMOD_STUDIO_LOADING_STATE_UNLOADED even though sample data may have been loaded by other API calls.

+

See also: Studio::Bank::unloadSampleData, Sample Data Loading

+

Studio::Bank::getStringCount

+

Retrieves the number of string table entries in the bank. This is only relevant for studio string banks, as other banks do not contain string tables.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getStringCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetStringCount(
+  FMOD_STUDIO_BANK *bank,
+  int *count
+);
+
+ +
RESULT Studio.Bank.getStringCount(
+  out int count
+);
+
+ +
Bank.getStringCount(
+  count
+);
+
+ +
+
count Out
+
String table entry count.
+
+

May be used in conjunction with Studio::Bank::getStringInfo to enumerate the string table in a bank.

+

See Also: strings bank

+

Studio::Bank::getStringInfo

+

Retrieves a string table entry. This is only relevant for studio string banks, as other banks do not contain string tables.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getStringInfo(
+  int index,
+  FMOD_GUID *id,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetStringInfo(
+  FMOD_STUDIO_BANK *bank,
+  int index,
+  FMOD_GUID *id,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.Bank.getStringInfo(
+  int index,
+  out Guid id,
+  out string path
+);
+
+ +
Bank.getStringInfo(
+  index,
+  id,
+  path,
+  size,
+  retrieved
+);
+
+ +
+
index
+
String table entry index.
+
id OutOpt
+
GUID. (FMOD_GUID)
+
path OutOpt
+
Path. (UTF-8 string)
+
size
+
Size of the path buffer in bytes. Must be 0 if path is null.
+
retrieved OutOpt
+
Length of the retrieved path in bytes, including the terminating null character.
+
+

May be used in conjunction with Studio::Bank::getStringCount to enumerate the string table in a bank.

+

If the path is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full path

+

See Also: Strings bank, Studio::System::lookupID, Studio::System::lookupPath

+

Studio::Bank::getUserData

+

Retrieves the bank's user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetUserData(
+  FMOD_STUDIO_BANK *bank,
+  void **userdata
+);
+
+ +
RESULT Studio.Bank.getUserData(
+  out IntPtr userdata
+);
+
+ +
Bank.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling Studio::Bank::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. For information about setting a bank's user data, see Studio::Bank::getUserData. For an example of how to get and set user data, see the User Data section of the glossary.

+

Studio::Bank::getVCACount

+

Retrieves the number of VCAs in the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getVCACount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetVCACount(
+  FMOD_STUDIO_BANK *bank,
+  int *count
+);
+
+ +
RESULT Studio.Bank.getVCACount(
+  out int count
+);
+
+ +
Bank.getVCACount(
+  count
+);
+
+ +
+
count Out
+
VCA count.
+
+

May be used in conjunction with Studio::Bank::getVCAList to enumerate the VCAs in a bank.

+

Studio::Bank::getVCAList

+

Retrieves a list of the VCAs in the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::getVCAList(
+  Studio::VCA **array,
+  int capacity,
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_GetVCAList(
+  FMOD_STUDIO_BANK *bank,
+  FMOD_STUDIO_VCA **array,
+  int capacity,
+  int *count
+);
+
+ +
RESULT Studio.Bank.getVCAList(
+  out VCA[] array
+);
+
+ +
Bank.getVCAList(
+  array,
+  capacity,
+  count
+);
+
+ +
+
array Out
+
Array to receive the list. (Studio::VCA)
+
capacity
+
Capacity of array.
+
count OutOpt
+
Number of VCAs written to array.
+
+

May be used in conjunction with Studio::Bank::getVCACount to enumerate the VCAs in a bank.

+

This function returns a maximum of capacity VCAs from the bank. If the bank contains more than capacity VCAs additional VCAs will be silently ignored.

+

Studio::Bank::isValid

+

Checks that the bank reference is valid.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
bool Studio::Bank::isValid()
+
+ +
bool FMOD_Studio_Bank_IsValid(FMOD_STUDIO_BANK *bank)
+
+ +
bool Studio.Bank.isValid()
+
+ +
Studio.Bank.isValid()
+
+ +

Studio::Bank::loadSampleData

+

Loads non-streaming sample data for all events in the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::loadSampleData();
+
+ +
FMOD_RESULT FMOD_Studio_Bank_LoadSampleData(FMOD_STUDIO_BANK *bank);
+
+ +
RESULT Studio.Bank.loadSampleData();
+
+ +
Bank.loadSampleData();
+
+ +

Use this function to preload sample data ahead of time so that the events in the bank can play immediately when started.

+

This function is equivalent to calling Studio::EventDescription::loadSampleData for all events in the bank, including referenced events.

+

See Also: Studio::Bank::getSampleLoadingState, Studio::Bank::unloadSampleData, Sample Data Loading

+

Studio::Bank::setUserData

+

Sets the bank's user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bank_SetUserData(
+  FMOD_STUDIO_BANK *bank,
+  void *userdata
+);
+
+ +
RESULT Studio.Bank.setUserData(
+  IntPtr userdata
+);
+
+ +
Bank.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
User data.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Studio::Bank::getUserData

+

Studio::Bank::unload

+

Unloads the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::unload();
+
+ +
FMOD_RESULT FMOD_Studio_Bank_Unload(FMOD_STUDIO_BANK *bank);
+
+ +
RESULT Studio.Bank.unload();
+
+ +
Bank.unload();
+
+ +

This will destroy all objects created from the bank, unload all sample data inside the bank, and invalidate all API handles referring to the bank.

+

If the bank was loaded from user-managed memory, e.g. by Studio::System::loadBankMemory with the FMOD_STUDIO_LOAD_MEMORY_POINT mode, then the memory must not be freed until the unload has completed. Poll the loading state using Studio::Bank::getLoadingState or use the FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD system callback to determine when it is safe to free the memory.

+

See Also: Studio::System::loadBankFile, Studio::System::loadBankCustom, Studio::System::setCallback

+

Studio::Bank::unloadSampleData

+

Unloads non-streaming sample data for all events in the bank.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bank::unloadSampleData();
+
+ +
FMOD_RESULT FMOD_Studio_Bank_UnloadSampleData(FMOD_STUDIO_BANK *bank);
+
+ +
RESULT Studio.Bank.unloadSampleData();
+
+ +
Bank.unloadSampleData();
+
+ +

Sample data loading is reference counted and the sample data will remain loaded until unload requests corresponding to all load requests are made, or until the bank is unloaded. For more details see Sample Data Loading.

+

See Also: Studio::Bank::loadSampleData

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-bus.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-bus.html new file mode 100644 index 0000000..a562b85 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-bus.html @@ -0,0 +1,711 @@ + + +Studio API Reference | Studio::Bus + + + + +
+ +
+

6. Studio API Reference | Studio::Bus

+

Represents a global mixer bus.

+

Playback Control:

+ +

Playback Properties:

+ +

Core:

+ +

Profiling:

+ +

General:

+ +

Studio::Bus::getChannelGroup

+

Retrieves the core ChannelGroup.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getChannelGroup(
+  ChannelGroup **group
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetChannelGroup(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_CHANNELGROUP **group
+);
+
+ +
RESULT Studio.Bus.getChannelGroup(
+  out FMOD.ChannelGroup group
+);
+
+ +
Bus.getChannelGroup(
+  group
+);
+
+ +
+
group Out
+
Core ChannelGroup. (ChannelGroup)
+
+

By default the ChannelGroup will only exist when it is needed; see Signal Paths for details. If the ChannelGroup does not exist, this function will return FMOD_ERR_STUDIO_NOT_LOADED.

+

See Also: Studio::Bus::lockChannelGroup

+

Studio::Bus::getCPUUsage

+

Retrieves the bus CPU usage data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getCPUUsage(
+  unsigned int *exclusive,
+  unsigned int *inclusive
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetCPUUsage(
+  FMOD_STUDIO_BUS *bus,
+  unsigned int *exclusive,
+  unsigned int *inclusive
+);
+
+ +
RESULT Studio.Bus.getCPUUsage(
+  out uint exclusive,
+  out uint inclusive
+);
+
+ +
Studio.Bus.getCPUUsage(
+    exclusive,
+    inclusive
+);
+
+ +
+
exclusive OutOpt
+
+

CPU time spent processing the events of this bus.

+
    +
  • Units: Microseconds
  • +
+
+
inclusive OutOpt
+
+

CPU time spent processing the events and all input buses of this bus.

+
    +
  • Units: Microseconds
  • +
+
+
+

FMOD_INIT_PROFILE_ENABLE with System::init is required to call this function.

+

Studio::Bus::getID

+

Retrieves the GUID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getID(
+  FMOD_GUID *id
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetID(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_GUID *id
+);
+
+ +
RESULT Studio.Bus.getID(
+  out Guid id
+);
+
+ +
Bus.getID(
+  id
+);
+
+ +
+
id Out
+
GUID. (FMOD_GUID)
+
+

Studio::Bus::getMemoryUsage

+

Retrieves memory usage statistics.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getMemoryUsage(
+  FMOD_STUDIO_MEMORY_USAGE *memoryusage
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetMemoryUsage(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_STUDIO_MEMORY_USAGE *memoryusage
+);
+
+ +
RESULT Studio.Bus.getMemoryUsage(
+  out MEMORY_USAGE memoryusage
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
memoryusage Out
+
Memory usage. (FMOD_STUDIO_MEMORY_USAGE)
+
+

Memory usage statistics are only available in logging builds, in release builds memoryusage will contain zero for all values after calling this function.

+

Studio::Bus::getMute

+

Retrieves the mute state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getMute(
+  bool *mute
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetMute(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_BOOL *mute
+);
+
+ +
RESULT Studio.Bus.getMute(
+  out bool mute
+);
+
+ +
Bus.getMute(
+  mute
+);
+
+ +
+
mute Out
+
+

Mute state. True if the bus is muted.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Studio::Bus::setMute

+

Studio::Bus::getPath

+

Retrieves the path.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getPath(
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetPath(
+  FMOD_STUDIO_BUS *bus,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.Bus.getPath(
+  out string path
+);
+
+ +
Bus.getPath(
+  path,
+  size,
+  retrieved
+);
+
+ +
+
path OutOpt
+
Buffer to receive the path. (UTF-8 string)
+
size
+
Size of the path buffer in bytes. Must be 0 if path is null.
+
retrieved OutOpt
+
Length of the path in bytes, including the terminating null character.
+
+

The strings bank must be loaded prior to calling this function, otherwise FMOD_ERR_EVENT_NOTFOUND is returned.

+

If the path is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full path.

+

Studio::Bus::getPaused

+

Retrieves the pause state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getPaused(
+  bool *paused
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetPaused(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_BOOL *paused
+);
+
+ +
RESULT Studio.Bus.getPaused(
+  out bool paused
+);
+
+ +
Bus.getPaused(
+  paused
+);
+
+ +
+
paused Out
+
+

Pause state. True if the bus is paused.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Studio::Bus::setPaused

+

Studio::Bus::getPortIndex

+

Retrieves the port index assigned to the bus.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getPortIndex(
+  FMOD_PORT_INDEX *index
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetPortIndex(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_PORT_INDEX *index
+);
+
+ +
RESULT Studio.Bus.getPortIndex(
+  out ulong index
+);
+
+ +
Bus.getPortIndex(
+  index
+);
+
+ +
+
index Out
+
The port index assigned to the bus. (FMOD_PORT_INDEX)
+
+

See Also: Studio::Bus::setPortIndex

+

Studio::Bus::getVolume

+

Retrieves the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::getVolume(
+  float *volume,
+  float *finalvolume = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_GetVolume(
+  FMOD_STUDIO_BUS *bus,
+  float *volume,
+  float *finalvolume
+);
+
+ +
RESULT Studio.Bus.getVolume(
+  out float volume
+);
+RESULT Studio.Bus.getVolume(
+  out float volume,
+  out float finalvolume
+);
+
+ +
Bus.getVolume(
+  volume,
+  finalvolume
+);
+
+ +
+
volume OutOpt
+
Volume set via Studio::Bus::setVolume.
+
finalvolume OutOpt
+
Final combined volume.
+
+

The finalvolume value is calculated by combining the volume set via Studio::Bus::setVolume with the bus's default volume and any snapshots or VCAs that affect the bus. Volume changes are processed in the Studio system update, so finalvolume will be the value calculated by the last update.

+

Studio::Bus::isValid

+

Checks that the Bus reference is valid.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
bool Studio::Bus::isValid()
+
+ +
bool FMOD_Studio_Bus_IsValid(FMOD_STUDIO_BUS *bus)
+
+ +
bool Studio.Bus.isValid()
+
+ +
Studio.Bus.isValid()
+
+ +

Studio::Bus::lockChannelGroup

+

Locks the core ChannelGroup.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::lockChannelGroup();
+
+ +
FMOD_RESULT FMOD_Studio_Bus_LockChannelGroup(FMOD_STUDIO_BUS *bus);
+
+ +
RESULT Studio.Bus.lockChannelGroup();
+
+ +
Bus.lockChannelGroup();
+
+ +

This function forces the system to create the ChannelGroup and keep it available until Studio::Bus::unlockChannelGroup is called. See Signal Paths for details.

+
+

The ChannelGroup may not be available immediately after calling this function. When Studio has been initialized in asynchronous mode, the ChannelGroup will not be created until the command has been executed in the async thread. When Studio has been initialized with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE, the ChannelGroup will be created in the next Studio::System::update call.

+

You can call Studio::System::flushCommands to ensure the ChannelGroup has been created. Alternatively you can keep trying to obtain the ChannelGroup via Studio::Bus::getChannelGroup until it is ready.

+
+

Studio::Bus::setMute

+

Sets the mute state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::setMute(
+  bool mute
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_SetMute(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_BOOL mute
+);
+
+ +
RESULT Studio.Bus.setMute(
+  bool mute
+);
+
+ +
Bus.setMute(
+  mute
+);
+
+ +
+
mute
+
+

Mute state. True to mute the bus.

+
    +
  • Units: Boolean
  • +
+
+
+

Mute is an additional control for volume, the effect of which is equivalent to setting the volume to zero.

+

An individual mute state is kept for each bus. Muting a bus will override the mute state of its inputs (meaning they return true from Studio::Bus::getMute), while unmuting a bus will cause its inputs to obey their individual mute state. The mute state is processed in the Studio system update, so Studio::Bus::getMute will return the state as determined by the last update.

+

Studio::Bus::setPaused

+

Sets the pause state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::setPaused(
+  bool paused
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_SetPaused(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_BOOL paused
+);
+
+ +
RESULT Studio.Bus.setPaused(
+  bool paused
+);
+
+ +
Bus.setPaused(
+  paused
+);
+
+ +
+
paused
+
+

Pause state. True to pause the bus.

+
    +
  • Units: Boolean
  • +
+
+
+

This function allows pausing/unpausing of all audio routed into the bus.

+

An individual pause state is kept for each bus. Pausing a bus will override the pause state of its inputs (meaning they return true from Studio::Bus::getPaused), while unpausing a bus will cause its inputs to obey their individual pause state. The pause state is processed in the Studio system update, so Studio::Bus::getPaused will return the state as determined by the last update.

+

Studio::Bus::setPortIndex

+

Sets the port index to use when attaching to an output port.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::setPortIndex(
+  FMOD_PORT_INDEX index
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_SetPortIndex(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_PORT_INDEX index
+);
+
+ +
RESULT Studio.Bus.setPortIndex(
+  ulong index
+);
+
+ +
Bus.setPortIndex(
+  index
+);
+
+ +
+
index
+
Port index to use when attaching to an output port. (FMOD_PORT_INDEX)
+
+

When a bus which is an output port is instantiated it is connected to an output port based on the port type set in FMOD Studio. For some port types, a platform-specific port index is required to connect to the correct output port. For example, if the output port type is a speaker in a controller, then a platform-specific port index may be required to specify which controller the bus is to attach to. In such a case, call this function passing the platform specific port index.

+

There is no need to call this function for port types which do not require an index.

+

This function may be called at any time after a bank containing the bus has been loaded.

+

See Also: Studio::Bus::getPortIndex, FMOD_PORT_TYPE

+

Studio::Bus::setVolume

+

Sets the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::setVolume(
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_SetVolume(
+  FMOD_STUDIO_BUS *bus,
+  float volume
+);
+
+ +
RESULT Studio.Bus.setVolume(
+  float volume
+);
+
+ +
Bus.setVolume(
+  volume
+);
+
+ +
+
volume
+
+

Volume level. Negative level inverts the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
+

This volume is applied as a scaling factor to the volume level set in FMOD Studio.

+

See Also: Studio::Bus::getVolume

+

Studio::Bus::stopAllEvents

+

Stops all event instances that are routed into the bus.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::stopAllEvents(
+  FMOD_STUDIO_STOP_MODE mode
+);
+
+ +
FMOD_RESULT FMOD_Studio_Bus_StopAllEvents(
+  FMOD_STUDIO_BUS *bus,
+  FMOD_STUDIO_STOP_MODE mode
+);
+
+ +
RESULT Studio.Bus.stopAllEvents(
+  STOP_MODE mode
+);
+
+ +
Bus.stopAllEvents(
+  mode
+);
+
+ +
+
mode
+
Stop mode. (FMOD_STUDIO_STOP_MODE)
+
+

See Also: Studio::EventInstance::stop

+

Studio::Bus::unlockChannelGroup

+

Unlocks the core ChannelGroup.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::Bus::unlockChannelGroup();
+
+ +
FMOD_RESULT FMOD_Studio_Bus_UnlockChannelGroup(FMOD_STUDIO_BUS *bus);
+
+ +
RESULT Studio.Bus.unlockChannelGroup();
+
+ +
Bus.unlockChannelGroup();
+
+ +

This function allows the system to destroy the ChannelGroup when it is not needed. See Signal Paths for details.

+

See Also: Studio::Bus::lockChannelGroup

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-commandreplay.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-commandreplay.html new file mode 100644 index 0000000..cd6a62a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-commandreplay.html @@ -0,0 +1,1162 @@ + + +Studio API Reference | Studio::CommandReplay + + + + +
+ +
+

6. Studio API Reference | Studio::CommandReplay

+

The FMOD Studio command replay system allows API calls in a session to be recorded and later played back for debugging and performance purposes.

+

Setup:

+ +
+ +
+ +

Playback:

+ +

Query:

+ +

Lifetime:

+ +

See also:

+ +

FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK

+

Callback for command replay event instance creation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK(
+  FMOD_STUDIO_COMMANDREPLAY *replay,
+  int commandindex,
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_STUDIO_EVENTINSTANCE **instance,
+  void *userdata
+);
+
+ +
delegate RESULT Studio.COMMANDREPLAY_CREATE_INSTANCE_CALLBACK(
+  IntPtr replay,
+  int commandindex,
+  IntPtr eventdescription,
+  out IntPtr instance,
+  IntPtr userdata
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
replay
+
Command replay. (Studio::CommandReplay)
+
commandindex
+
Current playback command index.
+
eventdescription
+
Event description to use. (Studio::EventDescription)
+
instance OutOpt
+
The event instance created by this function. (Studio::EventInstance)
+
userdata
+
The userdata set with Studio::CommandReplay::setUserData
+
+
+

The replay argument can be cast to FMOD::Studio::CommandReplay *.

+

The eventdescription argument can be cast to FMOD::Studio::EventDescription *.

+

The instance argument can be cast to FMOD::Studio::EventInstance *.

+
+
+

The 'replay' argument can be used via CommandReplay by using FMOD.Studio.CommandReplay commandReplay = new FMOD.Studio.CommandReplay(replay);

+

The 'eventdescription' argument can be used via EventDescription by using FMOD.EventDescription description = new FMOD.EventDescription(eventdescription);

+

The 'instance' argument can be used via EventInstance by using FMOD.EventInstance eventInstance = new FMOD.EventInstance(instance);

+
+

See Also: Studio::CommandReplay::setCreateInstanceCallback

+

FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK

+

Callback for when the command replay goes to the next frame.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK(
+  FMOD_STUDIO_COMMANDREPLAY *replay,
+  int commandindex,
+  float currenttime,
+  void *userdata
+);
+
+ +
delegate RESULT Studio.COMMANDREPLAY_FRAME_CALLBACK(
+  IntPtr replay,
+  int commandindex,
+  float currenttime,
+  IntPtr userdata
+);
+
+ +
+

Currently not supported for JavaScript.

+
+
+
replay
+
Command replay. (Studio::CommandReplay)
+
commandindex
+
Current playback command index.
+
currenttime
+
Current playback time.
+
userdata
+
The userdata set with Studio::CommandReplay::setUserData
+
+
+

The replay argument can be cast to FMOD::Studio::CommandReplay *.

+
+
+

The 'replay' argument can be used via CommandReplay by using FMOD.Studio.CommandReplay commandReplay = new FMOD.Studio.CommandReplay(replay);

+
+

See Also: Studio::CommandReplay::setFrameCallback

+

Studio::CommandReplay::getCommandAtTime

+

Retrieves the command index corresponding to the given playback time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getCommandAtTime(
+  float time,
+  int *commandindex
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetCommandAtTime(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  float time,
+  int *commandindex
+);
+
+ +
RESULT Studio.CommandReplay.getCommandAtTime(
+  float time,
+  out int commandindex
+);
+
+ +
Studio.CommandReplay.getCommandAtTime(
+  time,
+  commandindex
+);
+
+ +
+
time
+
The time used to find a command index.
+
commandindex Out
+
Command index.
+
+

This function will return an index for the first command at or after time. If time is greater than the total playback time then FMOD_ERR_EVENT_NOTFOUND is returned.

+

See Also: Studio::CommandReplay::getLength

+

Studio::CommandReplay::getCommandCount

+

Retrieves the number of commands in the replay.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getCommandCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetCommandCount(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  int *count
+);
+
+ +
RESULT Studio.CommandReplay.getCommandCount(
+  out int count
+);
+
+ +
Studio.CommandReplay.getCommandCount(
+  count
+);
+
+ +
+
count Out
+
Number of commands in the replay.
+
+

May be used in conjunction with Studio::CommandReplay::getCommandInfo to enumerate the commands in the replay.

+

Studio::CommandReplay::getCommandInfo

+

Retrieves command information.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getCommandInfo(
+  int commandindex,
+  FMOD_STUDIO_COMMAND_INFO *info
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetCommandInfo(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  int commandindex,
+  FMOD_STUDIO_COMMAND_INFO *info
+);
+
+ +
RESULT Studio.CommandReplay.getCommandInfo(
+  int commandindex,
+  out COMMAND_INFO info
+);
+
+ +
Studio.CommandReplay.getCommandInfo(
+  commandindex,
+  info
+);
+
+ +
+
commandindex
+
The index of the command.
+
info Out
+
Command info structure. (FMOD_STUDIO_COMMAND_INFO)
+
+

May be used in conjunction with Studio::CommandReplay::getCommandCount to enumerate the commands in the replay.

+

Studio::CommandReplay::getCommandString

+

Retrieves the string representation of a command.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getCommandString(
+  int commandindex,
+  char *buffer,
+  int length
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetCommandString(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  int commandindex,
+  char *buffer,
+  int length
+);
+
+ +
RESULT Studio.CommandReplay.getCommandString(
+  int commandindex,
+  out string buffer
+);
+
+ +
Studio.CommandReplay.getCommandString(
+  commandindex,
+  buffer
+);
+
+ +
+
commandindex
+
The index of the command.
+
buffer
+
Buffer to receive the string.
+
length
+
The capacity of the buffer.
+
+

If the string representation of the command is too long to fit in the buffer it will be truncated and this function will return FMOD_ERR_TRUNCATED.

+

Studio::CommandReplay::getCurrentCommand

+

Retrieves the progress through the command replay.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getCurrentCommand(
+  int *commandindex,
+  float *currenttime
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetCurrentCommand(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  int *commandindex,
+  float *currenttime
+);
+
+ +
RESULT Studio.CommandReplay.getCurrentCommand(
+  out int commandindex,
+  out float currenttime
+);
+
+ +
Studio.CommandReplay.getCurrentCommand(
+  commandindex,
+  currenttime
+);
+
+ +
+
commandindex OutOpt
+
The current command index.
+
currenttime OutOpt
+
The current playback time.
+
+

If this function is called before Studio::CommandReplay::start then both commandindex and currenttime will be returned as 0. If this function is called after Studio::CommandReplay::stop then the index and time of the last command which was replayed will be returned.

+

Studio::CommandReplay::getLength

+

Retrieves the total playback time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getLength(
+  float *length
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetLength(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  float *length
+);
+
+ +
RESULT Studio.CommandReplay.getLength(
+  out float length
+);
+
+ +
Studio.CommandReplay.getLength(
+  length
+);
+
+ +
+
length Out
+
The total playback time.
+
+

Studio::CommandReplay::getPaused

+

Retrieves the paused state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getPaused(
+  bool *paused
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetPaused(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  FMOD_BOOL *paused
+);
+
+ +
RESULT Studio.CommandReplay.getPaused(
+  out bool paused
+);
+
+ +
Studio.CommandReplay.getPaused(
+  paused
+);
+
+ +
+
paused
+
+

Paused state.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Studio::CommandReplay::setPaused

+

Studio::CommandReplay::getPlaybackState

+

Retrieves the playback state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getPlaybackState(
+  FMOD_STUDIO_PLAYBACK_STATE *state
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetPlaybackState(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  FMOD_STUDIO_PLAYBACK_STATE *state
+);
+
+ +
RESULT Studio.CommandReplay.getPlaybackState(
+  out PLAYBACK_STATE state
+);
+
+ +
Studio.CommandReplay.getPlaybackState(
+  state
+);
+
+ +
+
state Out
+
Playback state. (FMOD_STUDIO_PLAYBACK_STATE)
+
+

Studio::CommandReplay::getSystem

+

Retrieves the Studio System object associated with this replay object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getSystem(
+  Studio::System **system
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetSystem(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  FMOD_STUDIO_SYSTEM **system
+);
+
+ +
RESULT Studio.CommandReplay.getSystem(
+  out System system
+);
+
+ +
Studio.CommandReplay.getSystem(
+  system
+);
+
+ +
+
system
+
Studio system object. (Studio::System)
+
+

Studio::CommandReplay::getUserData

+

Retrieves user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_GetUserData(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  void **userdata
+);
+
+ +
RESULT Studio.CommandReplay.getUserData(
+  out IntPtr userdata
+);
+
+ +
Studio.CommandReplay.getUserData(
+  userdata
+);
+
+ +
+
userdata
+
User data set by calling Studio::CommandReplay::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

Studio::CommandReplay::isValid

+

Checks that the CommandReplay reference is valid.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
bool Studio::CommandReplay::isValid()
+
+ +
bool FMOD_Studio_CommandReplay_IsValid(FMOD_STUDIO_COMMANDREPLAY *commandreplay)
+
+ +
bool Studio.CommandReplay.isValid()
+
+ +
Studio.CommandReplay.isValid()
+
+ +

FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK

+

Callback for command replay bank loading.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK(
+  FMOD_STUDIO_COMMANDREPLAY *replay,
+  int commandindex,
+  const FMOD_GUID *bankguid,
+  const char *bankfilename,
+  FMOD_STUDIO_LOAD_BANK_FLAGS flags,
+  FMOD_STUDIO_BANK **bank,
+  void *userdata
+);
+
+ +
delegate RESULT Studio.COMMANDREPLAY_LOAD_BANK_CALLBACK(
+  IntPtr replay,
+  int commandindex,
+  ref Guid bankguid,
+  IntPtr bankfilename,
+  LOAD_BANK_FLAGS flags,
+  out IntPtr bank,
+  IntPtr userdata
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
replay
+
Command replay. (Studio::CommandReplay)
+
commandindex
+
The command that invoked this callback.
+
bankguid Opt
+
The GUID of the bank that needs to be loaded. (FMOD_GUID)
+
bankfilename Opt
+
The filename of the bank that needs to be loaded. (UTF-8 string)
+
flags
+
The flags to load the bank with. (FMOD_STUDIO_LOAD_BANK_FLAGS)
+
bank OutOpt
+
The bank loaded by this function. (Studio::Bank)
+
userdata
+
The userdata set with Studio::CommandReplay::setUserData
+
+
+

The replay argument can be cast to FMOD::Studio::CommandReplay *.

+

The bank argument can be cast to FMOD::Studio::Bank *.

+
+
+

The 'replay' argument can be used via CommandReplay by using FMOD.Studio.CommandReplay commandReplay = new FMOD.Studio.CommandReplay(replay);

+

The 'bankfilename' argument can be used via StringWrapper by using FMOD.StringWrapper bankFilename = new FMOD.StringWrapper(bankfilename);

+

The 'bank' argument can be used via CommandReplay by using FMOD.Studio.Bank studioBank = new FMOD.Studio.Bank(bank);

+
+

See Also: Studio::CommandReplay::setLoadBankCallback

+

Studio::CommandReplay::release

+

Releases the command replay.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::release();
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_Release(FMOD_STUDIO_COMMANDREPLAY *commandreplay);
+
+ +
RESULT Studio.CommandReplay.release();
+
+ +
Studio.CommandReplay.release();
+
+ +

Studio::CommandReplay::seekToCommand

+

Seeks the playback position to a command.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::seekToCommand(
+  int commandindex
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SeekToCommand(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  int commandindex
+);
+
+ +
RESULT Studio.CommandReplay.seekToCommand(
+  int commandindex
+);
+
+ +
Studio.CommandReplay.seekToCommand(
+  commandindex
+);
+
+ +
+
commandindex
+
Command index to seek to.
+
+

See Also: Studio::CommandReplay::seekToTime

+

Studio::CommandReplay::seekToTime

+

Seeks the playback position to a time.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::seekToTime(
+  float time
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SeekToTime(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  float time
+);
+
+ +
RESULT Studio.CommandReplay.seekToTime(
+  float time
+);
+
+ +
Studio.CommandReplay.seekToTime(
+  time
+);
+
+ +
+
time
+
Time to seek to.
+
+

This function moves the playback position to the the first command at or after time. If no command exists at or after time then FMOD_ERR_EVENT_NOTFOUND is returned.

+

See Also: Studio::CommandReplay::seekToCommand

+

Studio::CommandReplay::setBankPath

+

Sets a path substition that will be used when loading banks with this replay.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::setBankPath(
+  const char *bankPath
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SetBankPath(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  const char *bankPath
+);
+
+ +
RESULT Studio.CommandReplay.setBankPath(
+  string bankPath
+);
+
+ +
Studio.CommandReplay.setBankPath(
+  bankPath
+);
+
+ +
+
bankPath
+
The path to use when loading banks. (UTF-8 string)
+
+

Studio::System::loadBankFile commands in the replay are redirected to load banks from the specified directory, instead of using the directory recorded in the captured commands.

+

See Also: Studio::CommandReplay::setLoadBankCallback

+

Studio::CommandReplay::setCreateInstanceCallback

+

Sets the create event instance callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::setCreateInstanceCallback(
+  FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SetCreateInstanceCallback(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback
+);
+
+ +
RESULT Studio.CommandReplay.setCreateInstanceCallback(
+  COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
callback
+
Callback function. (FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK)
+
+

The create instance callback is invoked each time a Studio::EventDescription::createInstance command is processed.

+

The callback can either create a new event instance based on the callback parameters or skip creating the instance. If the instance is not created then subsequent commands for the event instance will be ignored in the replay.

+

If this callback is not set then the system will always create an event instance.

+

See Also: Studio::CommandReplay::setUserData

+

Studio::CommandReplay::setFrameCallback

+

Sets a callback that is issued each time the replay reaches a new frame.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::setFrameCallback(
+  FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SetFrameCallback(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback
+);
+
+ +
RESULT Studio.CommandReplay.setFrameCallback(
+  COMMANDREPLAY_FRAME_CALLBACK callback
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
callback
+
Callback function. (FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK)
+
+

See Also: Studio::CommandReplay::setUserData

+

Studio::CommandReplay::setLoadBankCallback

+

Sets the bank loading callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::setLoadBankCallback(
+  FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SetLoadBankCallback(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback
+);
+
+ +
RESULT Studio.CommandReplay.setLoadBankCallback(
+  COMMANDREPLAY_LOAD_BANK_CALLBACK callback
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
callback
+
Callback function. (FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK)
+
+

The load bank callback is invoked whenever any of the Studio load bank functions are reached.

+

This callback is required to be implemented to successfully replay Studio::System::loadBankMemory and Studio::System::loadBankCustom commands.

+

The callback is responsible for loading the bank based on the callback parameters. If the bank is not loaded subsequent commands which reference objects in the bank will fail.

+

If this callback is not set then the system will attempt to load banks from file according to recorded Studio::System::loadBankFile commands and skip other load commands.

+

See Also: Studio::CommandReplay::setUserData

+

Studio::CommandReplay::setPaused

+

Sets the paused state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::setPaused(
+  bool paused
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SetPaused(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  FMOD_BOOL paused
+);
+
+ +
RESULT Studio.CommandReplay.setPaused(
+  bool paused
+);
+
+ +
Studio.CommandReplay.setPaused(
+  paused
+);
+
+ +
+
paused
+
+

Paused state.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Studio::CommandReplay::getPaused

+

Studio::CommandReplay::setUserData

+

Sets user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_SetUserData(
+  FMOD_STUDIO_COMMANDREPLAY *commandreplay,
+  void *userdata
+);
+
+ +
RESULT Studio.CommandReplay.setUserData(
+  IntPtr userdata
+);
+
+ +
Studio.CommandReplay.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
User data.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Studio::CommandReplay::getUserData, Studio::CommandReplay::setCreateInstanceCallback, Studio::CommandReplay::setFrameCallback, Studio::CommandReplay::setLoadBankCallback

+

Studio::CommandReplay::start

+

Begins playback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::start();
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_Start(FMOD_STUDIO_COMMANDREPLAY *commandreplay);
+
+ +
RESULT Studio.CommandReplay.start();
+
+ +
Studio.CommandReplay.start();
+
+ +

If the replay is already running then calling this function will restart replay from the beginning.

+

See Also: Studio::CommandReplay::stop, Studio::CommandReplay::getPlaybackState

+

Studio::CommandReplay::stop

+

Stops playback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::CommandReplay::stop();
+
+ +
FMOD_RESULT FMOD_Studio_CommandReplay_Stop(FMOD_STUDIO_COMMANDREPLAY *commandreplay);
+
+ +
RESULT Studio.CommandReplay.stop();
+
+ +
Studio.CommandReplay.stop();
+
+ +

If the FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP flag has been used then the system state is left as it was at the end of the playback, otherwise all resources that were created as part of the replay will be cleaned up.

+

See Also: Studio::CommandReplay::start, Studio::CommandReplay::getPlaybackState, Studio::System::loadCommandReplay

+

FMOD_STUDIO_COMMAND_INFO

+

Describes a command replay command.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_COMMAND_INFO {
+  const char                *commandname;
+  int                        parentcommandindex;
+  int                        framenumber;
+  float                      frametime;
+  FMOD_STUDIO_INSTANCETYPE   instancetype;
+  FMOD_STUDIO_INSTANCETYPE   outputtype;
+  unsigned int               instancehandle;
+  unsigned int               outputhandle;
+} FMOD_STUDIO_COMMAND_INFO;
+
+ +
struct Studio.COMMAND_INFO
+{
+    StringWrapper commandname;
+    int parentcommandindex;
+    int framenumber;
+    float frametime;
+    INSTANCETYPE instancetype;
+    INSTANCETYPE outputtype;
+    UInt32 instancehandle;
+    UInt32 outputhandle;
+}
+
+ +
FMOD_STUDIO_COMMAND_INFO
+{
+  commandname,
+  parentcommandindex,
+  framenumber,
+  frametime,
+  instancetype,
+  outputtype,
+  instancehandle,
+  outputhandle,
+};
+
+ +
+
commandname
+
Fully qualified C++ name of the API function for this command. (UTF-8 string)
+
parentcommandindex
+
Index of the command that created the instance this command operates on, or -1 if the command does not operate on any instance.
+
framenumber
+
Frame the command belongs to.
+
frametime
+
Playback time at which this command will be executed.
+
instancetype
+
Type of object that this command uses as an instance. (FMOD_STUDIO_INSTANCETYPE)
+
outputtype
+
Type of object that this command outputs. (FMOD_STUDIO_INSTANCETYPE)
+
instancehandle
+
Original handle value of the instance.
+
outputhandle
+
Original handle value of the command output.
+
+

Note that the handle values in the instancehandle and outputhandle are from the recorded session and are not valid handles during playback.

+

See Also: Studio::CommandReplay::getCommandInfo

+

FMOD_STUDIO_INSTANCETYPE

+

Command replay command instance handle types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_INSTANCETYPE {
+  FMOD_STUDIO_INSTANCETYPE_NONE,
+  FMOD_STUDIO_INSTANCETYPE_SYSTEM,
+  FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION,
+  FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE,
+  FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE,
+  FMOD_STUDIO_INSTANCETYPE_BUS,
+  FMOD_STUDIO_INSTANCETYPE_VCA,
+  FMOD_STUDIO_INSTANCETYPE_BANK,
+  FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY
+} FMOD_STUDIO_INSTANCETYPE;
+
+ +
enum Studio.INSTANCETYPE
+{
+    NONE,
+    SYSTEM,
+    EVENTDESCRIPTION,
+    EVENTINSTANCE,
+    PARAMETERINSTANCE,
+    BUS,
+    VCA,
+    BANK,
+    COMMANDREPLAY,
+}
+
+ +
STUDIO_INSTANCETYPE_NONE
+STUDIO_INSTANCETYPE_SYSTEM
+STUDIO_INSTANCETYPE_EVENTDESCRIPTION
+STUDIO_INSTANCETYPE_EVENTINSTANCE
+STUDIO_INSTANCETYPE_PARAMETERINSTANCE
+STUDIO_INSTANCETYPE_BUS
+STUDIO_INSTANCETYPE_VCA
+STUDIO_INSTANCETYPE_BANK
+STUDIO_INSTANCETYPE_COMMANDREPLAY
+
+ +
+
FMOD_STUDIO_INSTANCETYPE_NONE
+
No type, handle is unused.
+
FMOD_STUDIO_INSTANCETYPE_SYSTEM
+
Studio::System.
+
FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION
+
Studio::EventDescription.
+
FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE
+
Studio::EventInstance.
+
FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE
+
Studio::ParameterInstance.
+
FMOD_STUDIO_INSTANCETYPE_BUS
+
Studio::Bus.
+
FMOD_STUDIO_INSTANCETYPE_VCA
+
Studio::VCA.
+
FMOD_STUDIO_INSTANCETYPE_BANK
+
Studio::Bank.
+
FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY
+
Studio::CommandReplay.
+
+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-common.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-common.html new file mode 100644 index 0000000..2d52ab3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-common.html @@ -0,0 +1,466 @@ + + +Studio API Reference | Common + + + + +
+ +
+

6. Studio API Reference | Common

+

Loading State:

+ +

Parameters:

+ +
+ +

Playback State:

+ +

Profiling:

+ +

Utility Functions:

+ +

FMOD_STUDIO_LOADING_STATE

+

Loading state of various objects.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_LOADING_STATE {
+  FMOD_STUDIO_LOADING_STATE_UNLOADING,
+  FMOD_STUDIO_LOADING_STATE_UNLOADED,
+  FMOD_STUDIO_LOADING_STATE_LOADING,
+  FMOD_STUDIO_LOADING_STATE_LOADED,
+  FMOD_STUDIO_LOADING_STATE_ERROR
+} FMOD_STUDIO_LOADING_STATE;
+
+ +
enum Studio.LOADING_STATE
+{
+    UNLOADING,
+    UNLOADED,
+    LOADING,
+    LOADED,
+    ERROR,
+}
+
+ +
STUDIO_LOADING_STATE_UNLOADING
+STUDIO_LOADING_STATE_UNLOADED
+STUDIO_LOADING_STATE_LOADING
+STUDIO_LOADING_STATE_LOADED
+STUDIO_LOADING_STATE_ERROR
+
+ +
+
FMOD_STUDIO_LOADING_STATE_UNLOADING
+
Currently unloading.
+
FMOD_STUDIO_LOADING_STATE_UNLOADED
+
Not loaded.
+
FMOD_STUDIO_LOADING_STATE_LOADING
+
Loading in progress.
+
FMOD_STUDIO_LOADING_STATE_LOADED
+
Loaded and ready to play.
+
FMOD_STUDIO_LOADING_STATE_ERROR
+
Failed to load.
+
+

See Also: Studio::Bank::getLoadingState, Studio::Bank::getSampleLoadingState, Studio::EventDescription::getSampleLoadingState

+

FMOD_STUDIO_MEMORY_USAGE

+

Memory usage statistics.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_MEMORY_USAGE {
+  int exclusive;
+  int inclusive;
+  int sampledata;
+} FMOD_STUDIO_MEMORY_USAGE;
+
+ +
struct Studio.MEMORY_USAGE
+{
+  int exclusive;
+  int inclusive;
+  int sampledata;
+}
+
+ +
+

Not supported for JavaScript.

+
+
+
exclusive
+
Size of memory belonging to the bus or event instance.
+
inclusive
+
Size of memory belonging exclusively to the bus or event plus the inclusive memory sizes of all buses and event instances which route into it.
+
sampledata
+
Size of shared sample memory referenced by the bus or event instance, inclusive of all sample memory referenced by all buses and event instances which route into it.
+
+

Memory usage exclusive and inclusive values do not include sample data loaded in memory because sample data is a shared resource. Streaming sample data is not a shared resource and is included in the exclusive and inclusive values.

+

See Also: FMOD_STUDIO_INIT_MEMORY_TRACKING, Studio::System::getMemoryUsage, Studio::Bus::getMemoryUsage, Studio::EventInstance::getMemoryUsage

+

FMOD_STUDIO_PARAMETER_DESCRIPTION

+

Describes an event parameter.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_PARAMETER_DESCRIPTION {
+  const char                  *name;
+  FMOD_STUDIO_PARAMETER_ID     id;
+  float                        minimum;
+  float                        maximum;
+  float                        defaultvalue;
+  FMOD_STUDIO_PARAMETER_TYPE   type;
+  FMOD_STUDIO_PARAMETER_FLAGS  flags;
+  FMOD_GUID                    guid;
+} FMOD_STUDIO_PARAMETER_DESCRIPTION;
+
+ +
struct PARAMETER_DESCRIPTION
+{
+    StringWrapper name;
+    PARAMETER_ID id;
+    float minimum;
+    float maximum;
+    float defaultvalue;
+    PARAMETER_TYPE type;
+    PARAMETER_FLAGS flags;
+    Guid guid;
+}
+
+ +
FMOD_STUDIO_PARAMETER_DESCRIPTION
+{
+  name,
+  id,
+  minimum,
+  maximum,
+  defaultvalue,
+  type,
+  flags,
+  guid
+};
+
+ +
+
name
+
The parameter's name. (UTF-8 string)
+
id
+
The parameter's id. (FMOD_STUDIO_PARAMETER_ID)
+
minimum
+
The parameter's minimum value.
+
maximum
+
The parameter's maximum value.
+
defaultvalue
+
The parameter's default value.
+
type
+
The parameter's type. (FMOD_STUDIO_PARAMETER_TYPE)
+
flags
+
The parameter's behavior flags. (FMOD_STUDIO_PARAMETER_FLAGS)
+
guid
+
The parameter's GUID. (FMOD_GUID)
+
+

See Also: Studio::System::getParameterDescriptionByName, Studio::System::getParameterDescriptionByID, Studio::EventDescription::getParameterDescriptionByName, Studio::EventDescription::getParameterDescriptionByID

+

FMOD_STUDIO_PARAMETER_FLAGS

+

Flags describing the behavior of a parameter.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_PARAMETER_READONLY              0x00000001
+#define FMOD_STUDIO_PARAMETER_AUTOMATIC             0x00000002
+#define FMOD_STUDIO_PARAMETER_GLOBAL                0x00000004
+#define FMOD_STUDIO_PARAMETER_DISCRETE              0x00000008
+#define FMOD_STUDIO_PARAMETER_LABELED               0x00000010
+
+ +
public enum PARAMETER_FLAGS : uint
+{
+    READONLY  = 0x00000001,
+    AUTOMATIC = 0x00000002,
+    GLOBAL    = 0x00000004,
+    DISCRETE  = 0x00000008,
+    LABELED   = 0x00000010,
+}
+
+ +
STUDIO_PARAMETER_READONLY   0x00000001
+STUDIO_PARAMETER_AUTOMATIC  0x00000002
+STUDIO_PARAMETER_GLOBALS    0x00000004
+STUDIO_PARAMETER_DISCRETE   0x00000008
+STUDIO_PARAMETER_LABELED    0x00000010
+
+ +
+
FMOD_STUDIO_PARAMETER_READONLY
+
Read only.
+
FMOD_STUDIO_PARAMETER_AUTOMATIC
+
Automatic parameter.
+
FMOD_STUDIO_PARAMETER_GLOBAL
+
Global parameter.
+
FMOD_STUDIO_PARAMETER_DISCRETE
+
Discrete parameter that operates on integers (whole numbers) rather than continuous fractional numbers.
+
FMOD_STUDIO_PARAMETER_LABELED
+
Labeled discrete parameter that has a label for each integer value. This flag is never set in banks built with FMOD Studio versions prior to 2.01.10. If this flag is set, FMOD_STUDIO_PARAMETER_DISCRETE is also set.
+
+

See also: FMOD_STUDIO_PARAMETER_DESCRIPTION

+

FMOD_STUDIO_PARAMETER_ID

+

Describes an event parameter identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_PARAMETER_ID
+{
+    unsigned int data1;
+    unsigned int data2;
+} FMOD_STUDIO_PARAMETER_ID;
+
+ +
struct PARAMETER_ID
+{
+    uint data1;
+    uint data2;
+}
+
+ +
FMOD_STUDIO_PARAMETER_ID
+{
+    data1,
+    data2
+};
+
+ +
+
data1
+
First half of the ID.
+
data2
+
Second half of the ID.
+
+

FMOD_STUDIO_PARAMETER_ID can be retrieved from the FMOD_STUDIO_PARAMETER_DESCRIPTION.

+

FMOD_STUDIO_PARAMETER_TYPE

+

Event parameter types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_PARAMETER_TYPE {
+  FMOD_STUDIO_PARAMETER_GAME_CONTROLLED,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE,
+  FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED,
+  FMOD_STUDIO_PARAMETER_MAX
+} FMOD_STUDIO_PARAMETER_TYPE;
+
+ +
enum PARAMETER_TYPE
+{
+    GAME_CONTROLLED,
+    AUTOMATIC_DISTANCE,
+    AUTOMATIC_EVENT_CONE_ANGLE,
+    AUTOMATIC_EVENT_ORIENTATION,
+    AUTOMATIC_DIRECTION,
+    AUTOMATIC_ELEVATION,
+    AUTOMATIC_LISTENER_ORIENTATION,
+    AUTOMATIC_SPEED,
+    AUTOMATIC_SPEED_ABSOLUTE,
+    AUTOMATIC_DISTANCE_NORMALIZED,
+    MAX
+}
+
+ +
STUDIO_PARAMETER_GAME_CONTROLLED
+STUDIO_PARAMETER_AUTOMATIC_DISTANCE
+STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE
+STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION
+STUDIO_PARAMETER_AUTOMATIC_DIRECTION
+STUDIO_PARAMETER_AUTOMATIC_ELEVATION
+STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION
+STUDIO_PARAMETER_AUTOMATIC_SPEED
+STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE
+STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED
+STUDIO_PARAMETER_MAX
+
+ +
+
FMOD_STUDIO_PARAMETER_GAME_CONTROLLED
+
API settable parameter.
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE
+
Distance between the event and the listener.
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE
+
Angle between the event's forward vector and the vector pointing from the event to the listener (0 to 180 degrees).
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION
+
Horizontal angle between the event's forward vector and listener's forward vector (-180 to 180 degrees).
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION
+
Horizontal angle between the listener's forward vector and the vector pointing from the listener to the event (-180 to 180 degrees).
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION
+
Angle between the listener's XZ plane and the vector pointing from the listener to the event (-90 to 90 degrees).
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION
+
Horizontal angle between the listener's forward vector and the global positive Z axis (-180 to 180 degrees).
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED
+
Magnitude of the relative velocity of the event and the listener.
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE
+
Magnitude of the absolute velocity of the event.
+
FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED
+
Distance between the event and the listener in the range min distance - max distance represented as 0 - 1.
+
FMOD_STUDIO_PARAMETER_MAX
+
Maximum number of parameter types supported.
+
+

FMOD_STUDIO_PARAMETER_GAME_CONTROLLED type parameters may have their values set using the API. All other parameter types have their values automatically set by FMOD Studio when the system is updated.

+

The horizontal angle between vectors is found by projecting both vector's onto a plane and taking the angle between the projected vectors. For FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION and FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION type parameters the vectors are projected onto the listener's XZ plane. For FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION type parameters the vectors are projected onto the global XZ plane.

+

See Also: FMOD_STUDIO_PARAMETER_DESCRIPTION

+

Studio::parseID

+

Parses a GUID from a string.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::parseID(
+  const char *idstring,
+  FMOD_GUID *id
+);
+
+ +
FMOD_RESULT FMOD_Studio_ParseID(
+  const char *idstring,
+  FMOD_GUID *id
+);
+
+ +
static RESULT Studio.Util.parseID(
+  string idstring,
+  out Guid id
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
idstring
+
String representation of the GUID. (UTF-8 string)
+
id Out
+
GUID. (FMOD_GUID)
+
+

This function expects the string representation to be formatted as 32 digits separated by hyphens and enclosed in braces: {00000000-0000-0000-0000-000000000000}.

+

FMOD_STUDIO_PLAYBACK_STATE

+

Playback state of various objects.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_PLAYBACK_STATE {
+  FMOD_STUDIO_PLAYBACK_PLAYING,
+  FMOD_STUDIO_PLAYBACK_SUSTAINING,
+  FMOD_STUDIO_PLAYBACK_STOPPED,
+  FMOD_STUDIO_PLAYBACK_STARTING,
+  FMOD_STUDIO_PLAYBACK_STOPPING
+} FMOD_STUDIO_PLAYBACK_STATE;
+
+ +
enum Studio.PLAYBACK_STATE
+{
+    PLAYING,
+    SUSTAINING,
+    STOPPED,
+    STARTING,
+    STOPPING,
+}
+
+ +
STUDIO_PLAYBACK_PLAYING
+STUDIO_PLAYBACK_SUSTAINING
+STUDIO_PLAYBACK_STOPPED
+STUDIO_PLAYBACK_STARTING
+STUDIO_PLAYBACK_STOPPING
+
+ +
+
FMOD_STUDIO_PLAYBACK_PLAYING
+
Playing.
+
FMOD_STUDIO_PLAYBACK_SUSTAINING
+
The timeline cursor is paused on a sustain point. (Studio::EventInstance only.)
+
FMOD_STUDIO_PLAYBACK_STOPPED
+
Stopped.
+
FMOD_STUDIO_PLAYBACK_STARTING
+
Preparing to start.
+
FMOD_STUDIO_PLAYBACK_STOPPING
+
Preparing to stop.
+
+

See Also: Studio::CommandReplay::getPlaybackState, Studio::EventInstance::getPlaybackState

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-eventdescription.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-eventdescription.html new file mode 100644 index 0000000..4e74588 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-eventdescription.html @@ -0,0 +1,1536 @@ + + +Studio API Reference | Studio::EventDescription + + + + +
+ +
+

6. Studio API Reference | Studio::EventDescription

+

The description for an FMOD Studio event.

+

Event descriptions belong to banks, and so an event description can only be queried if the relevant bank is loaded. Event descriptions may be retrieved via path or GUID lookup, or by enumerating all descriptions in a bank.

+

Instances:

+ +

Sample Data:

+ +

Attributes:

+ +

Parameters:

+ +

User Properties:

+ +
+ +
+ +

General:

+ +

See Also:

+ +

Studio::EventDescription::createInstance

+

Creates a playable instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::createInstance(
+  Studio::EventInstance **instance
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_CreateInstance(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_STUDIO_EVENTINSTANCE **instance
+);
+
+ +
RESULT Studio.EventDescription.createInstance(
+  out EventInstance instance
+);
+
+ +
Studio.EventDescription.createInstance(
+  instance
+);
+
+ +
+
instance Out
+
EventInstance object. (Studio::EventInstance)
+
+

When an event instance is created, any required non-streaming sample data is loaded asynchronously.

+

Use Studio::EventDescription::getSampleLoadingState to check the loading status.

+

Sample data can be loaded ahead of time with Studio::EventDescription::loadSampleData or Studio::Bank::loadSampleData. See Sample Data Loading for more information.

+

See Also: Studio::EventInstance::release

+

Studio::EventDescription::getID

+

Retrieves the GUID associated with the event.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getID(
+  FMOD_GUID *id
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetID(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_GUID *id
+);
+
+ +
RESULT Studio.EventDescription.getID(
+  out Guid id
+);
+
+ +
Studio.EventDescription.getID(
+  id
+);
+
+ +
+
id Out
+
Event description GUID. (FMOD_GUID)
+
+

Studio::EventDescription::getInstanceCount

+

Retrieves the number of instances.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getInstanceCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetInstanceCount(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  int *count
+);
+
+ +
RESULT Studio.EventDescription.getInstanceCount(
+  out int count
+);
+
+ +
Studio.EventDescription.getInstanceCount(
+  count
+);
+
+ +
+
count Out
+
Instance count.
+
+

May be used in conjunction with Studio::EventDescription::getInstanceList to enumerate the instances of this event.

+

Studio::EventDescription::getInstanceList

+

Retrieves a list of the instances.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getInstanceList(
+  Studio::EventInstance **array,
+  int capacity,
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetInstanceList(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_STUDIO_EVENTINSTANCE **array,
+  int capacity,
+  int *count
+);
+
+ +
RESULT Studio.EventDescription.getInstanceList(
+  out EventInstance[] array
+);
+
+ +
Studio.EventDescription.getInstanceList(
+  array,
+  capacity,
+  count
+);
+
+ +
+
array Out
+
An array to receive the list. (Studio::EventInstance)
+
capacity
+
Capacity of array.
+
count OutOpt
+
Number of event instances written to array.
+
+

This function returns a maximum of capacity instances. If more than capacity instances have been created then additional instances will be silently ignored.

+

May be used in conjunction with Studio::EventDescription::getInstanceCount to enumerate the instances of this event.

+

Studio::EventDescription::getLength

+

Retrieves the length of the timeline.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getLength(
+  int *length
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetLength(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  int *length
+);
+
+ +
RESULT Studio.EventDescription.getLength(
+  out int length
+);
+
+ +
Studio.EventDescription.getLength(
+  length
+);
+
+ +
+
length Out
+
+

Timeline length.

+
    +
  • Units: Milliseconds
  • +
+
+
+

A timeline's length is the largest of any logic markers, transition leadouts and the end of any trigger boxes on the timeline.

+

See Also: Studio::EventInstance::getTimelinePosition, Studio::EventInstance::setTimelinePosition

+

Studio::EventDescription::getMinMaxDistance

+

Retrieves the minimum and maximum distances for 3D attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getMinMaxDistance(
+  float *min,
+  float *max
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetMinMaxDistance(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  float *min,
+  float *max
+);
+
+ +
RESULT Studio.EventDescription.getMinMaxDistance(
+  out float min,
+  out float max
+);
+
+ +
Studio.EventDescription.getMinMaxDistance(
+  min,
+  max
+);
+
+ +
+
min OutOpt
+
+

Minimum distance.

+ +
+
max OutOpt
+
+

Maximum distance.

+ +
+
+

See Also: Studio::EventInstance::getMinMaxDistance

+

Studio::EventDescription::getParameterDescriptionByID

+

Retrieves an event parameter description by id.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getParameterDescriptionByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByID(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_STUDIO_PARAMETER_ID id,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
RESULT Studio.EventDescription.getParameterDescriptionByID(
+  PARAMETER_ID id,
+  out PARAMETER_DESCRIPTION parameter
+);
+
+ +
Studio.EventDescription.getParameterDescriptionByID(
+  id,
+  parameter
+);
+
+ +
+
id
+
Parameter id. (FMOD_STUDIO_PARAMETER_ID)
+
parameter Out
+
Parameter description. (FMOD_STUDIO_PARAMETER_DESCRIPTION)
+
+

Studio::EventDescription::getParameterDescriptionByIndex

+

Retrieves an event parameter description by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getParameterDescriptionByIndex(
+  int index,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  int index,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
RESULT Studio.EventDescription.getParameterDescriptionByIndex(
+  int index,
+  out PARAMETER_DESCRIPTION parameter
+);
+
+ +
Studio.EventDescription.getParameterDescriptionByIndex(
+  index,
+  parameter
+);
+
+ +
+
index
+
Parameter index.
+
parameter Out
+
Parameter description. (FMOD_STUDIO_PARAMETER_DESCRIPTION)
+
+

May be used in combination with Studio::EventDescription::getParameterDescriptionCount to enumerate event parameters.

+
+

The order of parameters is not necessarily the same as what is shown in the FMOD Studio event editor.

+
+

Studio::EventDescription::getParameterDescriptionByName

+

Retrieves an event parameter description by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getParameterDescriptionByName(
+  const char *name,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByName(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  const char *name,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
RESULT Studio.EventDescription.getParameterDescriptionByName(
+  string name,
+  out PARAMETER_DESCRIPTION parameter
+);
+
+ +
Studio.EventDescription.getParameterDescriptionByName(
+  name,
+  parameter
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
parameter Out
+
Parameter description. (FMOD_STUDIO_PARAMETER_DESCRIPTION)
+
+

Studio::EventDescription::getParameterDescriptionCount

+

Retrieves the number of parameters in the event.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getParameterDescriptionCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetParameterDescriptionCount(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  int *count
+);
+
+ +
RESULT Studio.EventDescription.getParameterDescriptionCount(
+  out int count
+);
+
+ +
Studio.EventDescription.getParameterDescriptionCount(
+  count
+);
+
+ +
+
count Out
+
Parameter count.
+
+

May be used in conjunction with Studio::EventDescription::getParameterDescriptionByIndex to enumerate event parameters.

+

Studio::EventDescription::getParameterLabelByID

+

Retrieves an event parameter label by ID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getParameterLabelByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetParameterLabelByID(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_STUDIO_PARAMETER_ID id,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.EventDescription.getParameterLabelByID(
+  PARAMETER_ID id,
+  int labelindex,
+  out string label
+);
+
+ +
Studio.EventDescription.getParameterLabelByID(
+  id,
+  labelindex,
+  label,
+  size,
+  retrieved
+);
+
+ +
+
id
+
Parameter ID. (FMOD_STUDIO_PARAMETER_ID)
+
labelindex
+
+

Label index to retrieve.

+ +
+
label Out
+
Buffer to receive the label. (UTF-8 string)
+
size
+
Size of the label buffer in bytes. Must be 0 if label is null.
+
retrieved OutOpt
+
Length of the label in bytes, including the terminating null character.
+
+

If the label is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full label.

+

Studio::EventDescription::getParameterLabelByIndex

+

Retrieves an event parameter label by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getParameterLabelByIndex(
+  int index,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetParameterLabelByIndex(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  int index,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.EventDescription.getParameterLabelByIndex(
+  int index,
+  int labelindex,
+  out string label
+);
+
+ +
Studio.EventDescription.getParameterLabelByIndex(
+  index,
+  labelindex,
+  label,
+  size,
+  retrieved
+);
+
+ +
+
index
+
Parameter index.
+
labelindex
+
+

Label index to retrieve.

+ +
+
label Out
+
Buffer to receive the label. (UTF-8 string)
+
size
+
Size of the label buffer in bytes. Must be 0 if label is null.
+
retrieved OutOpt
+
Length of the label in bytes, including the terminating null character.
+
+

If the label is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full label.

+

May be used in combination with Studio::EventDescription::getParameterDescriptionCount to enumerate event parameters.

+
+

The order of parameters is not necessarily the same as what is shown in the FMOD Studio event editor.

+
+

Studio::EventDescription::getParameterLabelByName

+

Retrieves an event parameter label by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getParameterLabelByName(
+  const char *name,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetParameterLabelByName(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  const char *name,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.EventDescription.getParameterLabelByName(
+  string name,
+  int labelindex,
+  out string label
+);
+
+ +
Studio.EventDescription.getParameterLabelByName(
+  name,
+  labelindex,
+  label,
+  size,
+  retrieved
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
labelindex
+
+

Label index to retrieve.

+ +
+
label Out
+
Buffer to receive the label. (UTF-8 string)
+
size
+
Size of the label buffer in bytes. Must be 0 if label is null.
+
retrieved OutOpt
+
Length of the label in bytes, including the terminating null character.
+
+

name can be the short name (such as 'Wind') or the full path (such as 'parameter:/Ambience/Wind'). Path lookups only succeed if the strings bank has been loaded.

+

If the label is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full label.

+

Studio::EventDescription::getPath

+

Retrieves the path.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getPath(
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetPath(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.EventDescription.getPath(
+  out string path
+);
+
+ +
Studio.EventDescription.getPath(
+  path,
+  size,
+  retrieved
+);
+
+ +
+
path OutOpt
+
Buffer to receive the path. (UTF-8 string)
+
size
+
Size of the path buffer in bytes. Must be 0 if path is null.
+
retrieved OutOpt
+
Length of the path in bytes, including the terminating null character.
+
+

The strings bank must be loaded prior to calling this function, otherwise FMOD_ERR_EVENT_NOTFOUND is returned.

+

If the path is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full path.

+

Studio::EventDescription::getSampleLoadingState

+

Retrieves the sample data loading state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getSampleLoadingState(
+  FMOD_STUDIO_LOADING_STATE *state
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetSampleLoadingState(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_STUDIO_LOADING_STATE *state
+);
+
+ +
RESULT Studio.EventDescription.getSampleLoadingState(
+  out LOADING_STATE state
+);
+
+ +
Studio.EventDescription.getSampleLoadingState(
+  state
+);
+
+ +
+
state Out
+
Loading state. (FMOD_STUDIO_LOADING_STATE)
+
+

If the event is invalid, then the state is set to FMOD_STUDIO_LOADING_STATE_UNLOADED and this function returns FMOD_ERR_INVALID_HANDLE.

+

See Also: Studio::EventDescription::loadSampleData, Studio::Bank::loadSampleData, Studio::EventDescription::createInstance, Sample Data Loading

+

Studio::EventDescription::getSoundSize

+

Retrieves the sound size for 3D panning.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getSoundSize(
+  float *size
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetSoundSize(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  float *size
+);
+
+ +
RESULT Studio.EventDescription.getSoundSize(
+  out float size
+);
+
+ +
Studio.EventDescription.getSoundSize(
+  size
+);
+
+ +
+
size Out
+
Sound size.
+
+

Retrieves the largest Sound Size value of all Spatializers and 3D Object Spatializers on the event's master track. Returns zero if there are no Spatializers or 3D Object Spatializers.

+

See Also: Studio::EventDescription::is3D

+

Studio::EventDescription::getUserData

+

Retrieves the event user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetUserData(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  void **userdata
+);
+
+ +
RESULT Studio.EventDescription.getUserData(
+  out IntPtr userdata
+);
+
+ +
Studio.EventDescription.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling Studio::EventDescription::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

Studio::EventDescription::getUserProperty

+

Retrieves a user property by name.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getUserProperty(
+  const char *name,
+  FMOD_STUDIO_USER_PROPERTY *property
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetUserProperty(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  const char *name,
+  FMOD_STUDIO_USER_PROPERTY *property
+);
+
+ +
RESULT Studio.EventDescription.getUserProperty(
+  string name,
+  out USER_PROPERTY property
+);
+
+ +
Studio.EventDescription.getUserProperty(
+  name,
+  property
+);
+
+ +
+
name
+
User property name. (UTF-8 string)
+
property Out
+
User property. (FMOD_STUDIO_USER_PROPERTY)
+
+

See Also: Studio::EventDescription::getUserPropertyCount, Studio::EventDescription::getUserPropertyByIndex

+

Studio::EventDescription::getUserPropertyByIndex

+

Retrieves a user property by index.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getUserPropertyByIndex(
+  int index,
+  FMOD_STUDIO_USER_PROPERTY *property
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetUserPropertyByIndex(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  int index,
+  FMOD_STUDIO_USER_PROPERTY *property
+);
+
+ +
RESULT Studio.EventDescription.getUserPropertyByIndex(
+  int index,
+  out USER_PROPERTY property
+);
+
+ +
Studio.EventDescription.getUserPropertyByIndex(
+  index,
+  property
+);
+
+ +
+
index
+
User property index.
+
property Out
+
User property. (FMOD_STUDIO_USER_PROPERTY)
+
+

May be used in combination with Studio::EventDescription::getUserPropertyCount to enumerate event user properties.

+

See Also: Studio::EventDescription::getUserProperty

+

Studio::EventDescription::getUserPropertyCount

+

Retrieves the number of user properties attached to the event.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::getUserPropertyCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_GetUserPropertyCount(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  int *count
+);
+
+ +
RESULT Studio.EventDescription.getUserPropertyCount(
+  out int count
+);
+
+ +
Studio.EventDescription.getUserPropertyCount(
+  count
+);
+
+ +
+
count Out
+
User property count.
+
+

May be used in combination with Studio::EventDescription::getUserPropertyByIndex to enumerate event user properties.

+

See Also: Studio::EventDescription::getUserProperty

+

Studio::EventDescription::hasSustainPoint

+

Retrieves whether the event has any sustain points.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::hasSustainPoint(
+  bool *sustainPoint
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_HasSustainPoint(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_BOOL *sustainPoint
+);
+
+ +
RESULT Studio.EventDescription.hasSustainPoint(
+  out bool sustainPoint
+);
+
+ +
Studio.EventDescription.hasSustainPoint(
+  sustainPoint
+);
+
+ +
+
sustainPoint Out
+
+

Sustain point status. True if the event has one or more sustain points.

+
    +
  • Units: Boolean
  • +
+
+
+

Studio::EventDescription::is3D

+

Retrieves the event's 3D status.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::is3D(
+  bool *is3d
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_Is3D(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_BOOL *is3d
+);
+
+ +
RESULT Studio.EventDescription.is3D(
+  out bool is3d
+);
+
+ +
Studio.EventDescription.is3D(
+  is3d
+);
+
+ +
+
is3d Out
+
+

3D status. True if the event is 3D.

+
    +
  • Units: Boolean
  • +
+
+
+

An event is considered 3D if any of these conditions are met:

+
    +
  • The event has a Spatializer, 3D Object Spatializer, Scatterer, or a 3rd party spatializer on its master track.
  • +
  • The event contains an automatic parameter that depends on the event's 3D attributes:
      +
    • Distance
    • +
    • Event Cone Angle
    • +
    • Event Orientation
    • +
    • Direction
    • +
    • Elevation
    • +
    • Speed
    • +
    • Speed (Absolute)
    • +
    +
  • +
  • The event contains any nested events which are 3D.
  • +
+

If the event contains any nested event built to a different bank than the parent event using any version of FMOD Studio prior to 2.00.10, and any of the nested events' banks are not loaded, this function may fail to correctly determine the event's 3D status.
+If an event contains a Scatterer, the event is considered 3D regardless of the contents of the Scatterer's playlist. This includes cases where the Scatterer instrument's playlist only contains 2D events.

+

Studio::EventDescription::isDopplerEnabled

+

Retrieves the event's doppler status.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::isDopplerEnabled(
+  bool *doppler
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_IsDopplerEnabled(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_BOOL *doppler
+);
+
+ +
RESULT Studio.EventDescription.isDopplerEnabled(
+  out bool doppler
+);
+
+ +
Studio.EventDescription.isDopplerEnabled(
+  doppler
+);
+
+ +
+
doppler Out
+
+

Doppler status. True if doppler is enabled for the event.

+
    +
  • Units: Boolean
  • +
+
+
+

Note: If the event is in a bank built using any version of FMOD Studio older than 2.01.09, this function returns false regardless of the event's doppler state.

+

Studio::EventDescription::isOneshot

+

Retrieves the event's oneshot status.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::isOneshot(
+  bool *oneshot
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_IsOneshot(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_BOOL *oneshot
+);
+
+ +
RESULT Studio.EventDescription.isOneshot(
+  out bool oneshot
+);
+
+ +
Studio.EventDescription.isOneshot(
+  oneshot
+);
+
+ +
+
oneshot Out
+
+

oneshot status. True if the event is a oneshot event.

+
    +
  • Units: Boolean
  • +
+
+
+

An event is considered oneshot if it is guaranteed to terminate without intervention in bounded time after being started. Instances of such events can be played in a fire-and-forget fashion by calling Studio::EventInstance::start immediately followed by Studio::EventInstance::release.

+

If the event contains any nested event built to a different bank than the parent event, and any of the nested events' banks are not loaded, this function may fail to correctly determine the event's oneshot status.

+

Studio::EventDescription::isSnapshot

+

Retrieves the event's snapshot status.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::isSnapshot(
+  bool *snapshot
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_IsSnapshot(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_BOOL *snapshot
+);
+
+ +
RESULT Studio.EventDescription.isSnapshot(
+  out bool snapshot
+);
+
+ +
Studio.EventDescription.isSnapshot(
+  snapshot
+);
+
+ +
+
snapshot Out
+
+

Snapshot status. True if the event is a snapshot.

+
    +
  • Units: Boolean
  • +
+
+
+

Studio::EventDescription::isStream

+

Retrieves the event's stream status.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::isStream(
+  bool *isStream
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_IsStream(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_BOOL *isStream
+);
+
+ +
RESULT Studio.EventDescription.isStream(
+  out bool isStream
+);
+
+ +
Studio.EventDescription.isStream(
+  isStream
+);
+
+ +
+
isStream Out
+
+

Stream status. True if the event contains one or more streamed sounds.

+
    +
  • Units: Boolean
  • +
+
+
+

If the event contains any nested event built to a different bank than the parent event, and any of the nested events' banks are not loaded, this function may fail to correctly determine the event's stream status.

+

Studio::EventDescription::isValid

+

Checks that the EventDescription reference is valid.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
bool Studio::EventDescription::isValid()
+
+ +
bool FMOD_Studio_EventDescription_IsValid(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription)
+
+ +
bool Studio.EventDescription.isValid()
+
+ +
Studio.EventDescription.isValid()
+
+ +

Studio::EventDescription::loadSampleData

+

Loads non-streaming sample data used by the event.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::loadSampleData();
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_LoadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
+
+ +
RESULT Studio.EventDescription.loadSampleData();
+
+ +
Studio.EventDescription.loadSampleData();
+
+ +

This function will load all non-streaming sample data required by the event and any referenced events.

+

Sample data is loaded asynchronously, Studio::EventDescription::getSampleLoadingState may be used to poll the loading state.

+

See Also: Studio::EventDescription::unloadSampleData, Sample Data Loading

+

Studio::EventDescription::releaseAllInstances

+

Releases all instances.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::releaseAllInstances();
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_ReleaseAllInstances(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
+
+ +
RESULT Studio.EventDescription.releaseAllInstances();
+
+ +
Studio.EventDescription.releaseAllInstances();
+
+ +

This function immediately stops and releases all instances of the event.

+

See Also: Studio::EventInstance::release

+

Studio::EventDescription::setCallback

+

Sets the user callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::setCallback(
+  FMOD_STUDIO_EVENT_CALLBACK callback,
+  FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_SetCallback(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  FMOD_STUDIO_EVENT_CALLBACK callback,
+  FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask
+);
+
+ +
RESULT Studio.EventDescription.setCallback(
+  EVENT_CALLBACK callback,
+  EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL
+);
+
+ +
Studio.EventDescription.setCallback(
+  callback,
+  callbackmask
+);
+
+ +
+
callback
+
User callback. (FMOD_STUDIO_EVENT_CALLBACK)
+
callbackmask
+
Bitfield specifying which callback types are required. (FMOD_STUDIO_EVENT_CALLBACK_TYPE)
+
+

This function sets a user callback which will be assigned to all event instances subsequently created from the event. The callback for individual instances can be set with Studio::EventInstance::setCallback.

+

See Event Callbacks for more information about when callbacks occur.

+

See Also: Callback Behavior

+

Studio::EventDescription::setUserData

+

Sets the event user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_SetUserData(
+  FMOD_STUDIO_EVENTDESCRIPTION *eventdescription,
+  void *userdata
+);
+
+ +
RESULT Studio.EventDescription.setUserData(
+  IntPtr userdata
+);
+
+ +
Studio.EventDescription.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
User data.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Studio::EventDescription::getUserData

+

Studio::EventDescription::unloadSampleData

+

Unloads all non-streaming sample data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventDescription::unloadSampleData();
+
+ +
FMOD_RESULT FMOD_Studio_EventDescription_UnloadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
+
+ +
RESULT Studio.EventDescription.unloadSampleData();
+
+ +
Studio.EventDescription.unloadSampleData();
+
+ +

Sample data will not be unloaded until all instances of the event are released.

+

See Also: Studio::EventDescription::loadSampleData, Sample Data Loading

+

FMOD_STUDIO_USER_PROPERTY

+

Describes a user property.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_USER_PROPERTY {
+  const char                      *name;
+  FMOD_STUDIO_USER_PROPERTY_TYPE   type;
+  union
+  {
+      int                              intvalue;
+      FMOD_BOOL                        boolvalue;
+      float                            floatvalue;
+      const char                      *stringvalue;
+  }
+} FMOD_STUDIO_USER_PROPERTY;
+
+ +
struct USER_PROPERTY
+{
+    StringWrapper name;
+    USER_PROPERTY_TYPE type;
+    int intvalue;
+    bool boolvalue;
+    float floatvalue;
+    string stringvalue;
+}
+
+ +
FMOD_STUDIO_USER_PROPERTY
+{
+  name,
+  type,
+  intvalue,
+  boolvalue,
+  floatvalue,
+  stringvalue,
+};
+
+ +
+
name
+
Property name. (UTF-8 string)
+
type
+
Property type. (FMOD_STUDIO_USER_PROPERTY_TYPE)
+
intvalue
+
Integer value. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER.
+
boolvalue
+
+

Boolean value. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN.

+
    +
  • Units: Boolean
  • +
+
+
floatvalue
+
Floating point value. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT.
+
stringvalue
+
String value. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_STRING.
+
+

See Also: Studio::EventDescription::getUserProperty

+

FMOD_STUDIO_USER_PROPERTY_TYPE

+

User property types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_USER_PROPERTY_TYPE {
+  FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER,
+  FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN,
+  FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT,
+  FMOD_STUDIO_USER_PROPERTY_TYPE_STRING
+} FMOD_STUDIO_USER_PROPERTY_TYPE;
+
+ +
enum USER_PROPERTY_TYPE
+{
+    INTEGER,
+    BOOLEAN,
+    FLOAT,
+    STRING,
+}
+
+ +
STUDIO_USER_PROPERTY_TYPE_INTEGER
+STUDIO_USER_PROPERTY_TYPE_BOOLEAN
+STUDIO_USER_PROPERTY_TYPE_FLOAT
+STUDIO_USER_PROPERTY_TYPE_STRING
+
+ +
+
FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER
+
Integer.
+
FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN
+
Boolean.
+
FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT
+
Floating point number.
+
FMOD_STUDIO_USER_PROPERTY_TYPE_STRING
+
String.
+
+

See Also: FMOD_STUDIO_USER_PROPERTY

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-eventinstance.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-eventinstance.html new file mode 100644 index 0000000..d326375 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-eventinstance.html @@ -0,0 +1,2289 @@ + + +Studio API Reference | Studio::EventInstance + + + + +
+ +
+

6. Studio API Reference | Studio::EventInstance

+

An instance of an FMOD Studio event.

+

Playback Control:

+ +
+ +

Playback Properties:

+ +
+ +

3D Attributes:

+ +

Parameters:

+ +

Core:

+ +

Profiling:

+ +

Callbacks:

+ +
+ +
+ +

General:

+ +

Studio::EventInstance::get3DAttributes

+

Retrieves the 3D attributes.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::get3DAttributes(
+  FMOD_3D_ATTRIBUTES *attributes
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_Get3DAttributes(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_3D_ATTRIBUTES *attributes
+);
+
+ +
RESULT Studio.EventInstance.get3DAttributes(
+  out _3D_ATTRIBUTES attributes
+);
+
+ +
Studio.EventInstance.get3DAttributes(
+  attributes
+);
+
+ +
+
attributes Out
+
3D attributes. (FMOD_3D_ATTRIBUTES)
+
+

See Also: Studio::EventInstance::set3DAttributes

+

Studio::EventInstance::getChannelGroup

+

Retrieves the core ChannelGroup.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getChannelGroup(
+  ChannelGroup **group
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetChannelGroup(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_CHANNELGROUP **group
+);
+
+ +
RESULT Studio.EventInstance.getChannelGroup(
+  out FMOD.ChannelGroup group
+);
+
+ +
Studio.EventInstance.getChannelGroup(
+  group
+);
+
+ +
+
group Out
+
Core ChannelGroup corresponding to the master track. (ChannelGroup)
+
+

Until the event instance has been fully created this function will return FMOD_ERR_STUDIO_NOT_LOADED.

+

Studio::EventInstance::getCPUUsage

+

Retrieves the event CPU usage data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getCPUUsage(
+  unsigned int *exclusive,
+  unsigned int *inclusive
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetCPUUsage(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  unsigned int *exclusive,
+  unsigned int *inclusive
+);
+
+ +
RESULT Studio.EventInstance.getCPUUsage(
+  out uint exclusive,
+  out uint inclusive
+);
+
+ +
Studio.EventInstance.getCPUUsage(
+  exclusive,
+  inclusive
+);
+
+ +
+
exclusive OutOpt
+
+

CPU time spent processing just this unit during the last update.

+
    +
  • Units: Microseconds
  • +
+
+
inclusive OutOpt
+
+

CPU time spent processing this unit and all of its input during the last update.

+
    +
  • Units: Microseconds
  • +
+
+
+

FMOD_INIT_PROFILE_ENABLE with System::init is required to call this function.

+

Studio::EventInstance::getDescription

+

Retrieves the event description.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getDescription(
+  Studio::EventDescription **description
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetDescription(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_EVENTDESCRIPTION **description
+);
+
+ +
RESULT Studio.EventInstance.getDescription(
+  out EventDescription description
+);
+
+ +
Studio.EventInstance.getDescription(
+  description
+);
+
+ +
+
description Out
+
Event description. (Studio::EventDescription)
+
+

Studio::EventInstance::getListenerMask

+

Retrieves the listener mask.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getListenerMask(
+  unsigned int *mask
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetListenerMask(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  unsigned int *mask
+);
+
+ +
RESULT Studio.EventInstance.getListenerMask(
+  out uint mask
+);
+
+ +
Studio.EventInstance.getListenerMask(
+  mask
+);
+
+ +
+
mask Out
+
Listener mask.
+
+

See Also: Studio::EventInstance::setListenerMask

+

Studio::EventInstance::getMemoryUsage

+

Retrieves memory usage statistics.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getMemoryUsage(
+  FMOD_STUDIO_MEMORY_USAGE *memoryusage
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetMemoryUsage(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_MEMORY_USAGE *memoryusage
+);
+
+ +
RESULT Studio.EventInstance.getMemoryUsage(
+  out MEMORY_USAGE memoryusage
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
memoryusage Out
+
Memory usage. (FMOD_STUDIO_MEMORY_USAGE)
+
+

Memory usage statistics are only available in logging builds, in release builds memoryusage will contain zero for all values this function.

+

Studio::EventInstance::getMinMaxDistance

+

Retrieves the minimum and maximum distances for 3D attenuation.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getMinMaxDistance(
+  float *min,
+  float *max
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetMinMaxDistance(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  float *min,
+  float *max
+);
+
+ +
RESULT Studio.EventInstance.getMinMaxDistance(
+  out float min,
+  out float max
+);
+
+ +
Studio.EventInstance.getMinMaxDistance(
+  min,
+  max
+);
+
+ +
+
min OutOpt
+
+

Minimum distance.

+ +
+
max OutOpt
+
+

Maximum distance.

+ +
+
+

See Also: Studio::EventDescription::getMinMaxDistance

+

Studio::EventInstance::getParameterByID

+

Retrieves a parameter value by unique identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getParameterByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  float *value,
+  float *finalvalue = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetParameterByID(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_PARAMETER_ID id,
+  float *value,
+  float *finalvalue
+);
+
+ +
RESULT Studio.EventInstance.getParameterByID(
+  PARAMETER_ID id,
+  out float value
+);
+RESULT Studio.EventInstance.getParameterByID(
+  PARAMETER_ID id,
+  out float value,
+  out float finalvalue
+);
+
+ +
Studio.EventInstance.getParameterByID(
+  id,
+  value,
+  finalvalue
+);
+
+ +
+
id
+
Parameter identifier. (FMOD_STUDIO_PARAMETER_ID)
+
value OutOpt
+
Parameter value as set from the public API.
+
finalvalue OutOpt
+
Final combined parameter value.
+
+

Automatic parameters always return value as 0 since they can never have their value set from the public API.

+

finalvalue is the final value of the parameter after applying adjustments due to automation, modulation, seek speed, and parameter velocity to value. This is calculated asynchronously when the Studio system updates.

+

See Also: Studio::EventInstance::setParameterByID

+

Studio::EventInstance::getParameterByName

+

Retrieves a parameter value by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getParameterByName(
+  const char *name,
+  float *value,
+  float *finalvalue = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetParameterByName(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  const char *name,
+  float *value,
+  float *finalvalue
+);
+
+ +
RESULT Studio.EventInstance.getParameterByName(
+  string name,
+  out float value
+);
+RESULT Studio.EventInstance.getParameterByName(
+  string name,
+  out float value,
+  out float finalvalue
+);
+
+ +
Studio.EventInstance.getParameterByName(
+  name,
+  value,
+  finalvalue
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
value OutOpt
+
Parameter value as set from the public API.
+
finalvalue OutOpt
+
Final combined parameter value.
+
+

Automatic parameters always return value as 0 since they can never have their value set from the public API.

+

finalvalue is the final value of the parameter after applying adjustments due to automation, modulation, seek speed, and parameter velocity to value. This is calculated asynchronously when the Studio system updates.

+

See Also: Studio::EventInstance::setParameterByName

+

Studio::EventInstance::getPaused

+

Retrieves the pause state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getPaused(
+  bool *paused
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetPaused(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_BOOL *paused
+);
+
+ +
RESULT Studio.EventInstance.getPaused(
+  out bool paused
+);
+
+ +
Studio.EventInstance.getPaused(
+  paused
+);
+
+ +
+
paused Out
+
+

Pause state. True if the event instance is paused.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Studio::EventInstance::setPaused

+

Studio::EventInstance::getPitch

+

Retrieves the pitch multiplier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getPitch(
+  float *pitch,
+  float *finalpitch = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetPitch(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  float *pitch,
+  float *finalpitch
+);
+
+ +
RESULT Studio.EventInstance.getPitch(
+  out float pitch
+);
+RESULT Studio.EventInstance.getPitch(
+  out float pitch,
+  out float finalpitch
+);
+
+ +
Studio.EventInstance.getPitch(
+  pitch,
+  finalpitch
+);
+
+ +
+
pitch OutOpt
+
Pitch multiplier as set from the public API.
+
finalpitch OutOpt
+
Final combined pitch.
+
+

The final combined value returned in finalpitch combines the pitch set using Studio::EventInstance::setPitch with the result of any automation or modulation. The final combined pitch is calculated asynchronously when the Studio system updates.

+

Studio::EventInstance::getPlaybackState

+

Retrieves the playback state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getPlaybackState(
+  FMOD_STUDIO_PLAYBACK_STATE *state
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetPlaybackState(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_PLAYBACK_STATE *state
+);
+
+ +
RESULT Studio.EventInstance.getPlaybackState(
+  out PLAYBACK_STATE state
+);
+
+ +
Studio.EventInstance.getPlaybackState(
+  state
+);
+
+ +
+
state Out
+
Playback state. (FMOD_STUDIO_PLAYBACK_STATE)
+
+

You can poll this function to track the playback state of an event instance.

+

If the instance is invalid, then the state will be set to FMOD_STUDIO_PLAYBACK_STOPPED.

+

See Also: Studio::EventInstance::start, Studio::EventInstance::stop, FMOD_STUDIO_EVENT_CALLBACK_TYPE

+

Studio::EventInstance::getProperty

+

Retrieves the value of a built-in property.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getProperty(
+  FMOD_STUDIO_EVENT_PROPERTY index,
+  float *value
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetProperty(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_EVENT_PROPERTY index,
+  float *value
+);
+
+ +
RESULT Studio.EventInstance.getProperty(
+  EVENT_PROPERTY index,
+  out float value
+);
+
+ +
Studio.EventInstance.getProperty(
+  index,
+  value
+);
+
+ +
+
index
+
Property index. (FMOD_STUDIO_EVENT_PROPERTY)
+
value Out
+
Property value set via Studio::EventInstance::setProperty.
+
+

A default FMOD_STUDIO_EVENT_PROPERTY value means that the Instance is using the value set in Studio and it has not been overridden using Studio::EventInstance::setProperty. Access the default property values through the Studio::EventDescription.

+

Studio::EventInstance::getReverbLevel

+

Retrieves the core reverb send level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getReverbLevel(
+  int index,
+  float *level
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetReverbLevel(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  int index,
+  float *level
+);
+
+ +
RESULT Studio.EventInstance.getReverbLevel(
+  int index,
+  out float level
+);
+
+ +
Studio.EventInstance.getReverbLevel(
+  index,
+  level
+);
+
+ +
+
index
+
+

Core reverb instance index.

+
    +
  • Range: [0, 3]
  • +
+
+
level Out
+
Reverb send level.
+
+

See Also: Studio::EventInstance::setReverbLevel

+

Studio::EventInstance::getSystem

+

Retrieves the FMOD Studio System.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getSystem(
+  Studio::System **system
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetSystem(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_SYSTEM **system
+);
+
+ +
RESULT Studio.EventInstance.getSystem(
+  out System system
+);
+
+ +
Studio.EventInstance.getSystem(
+  system
+);
+
+ +
+
system Out
+
Studio System. (Studio::System)
+
+

Studio::EventInstance::getTimelinePosition

+

Retrieves the timeline cursor position.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getTimelinePosition(
+  int *position
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetTimelinePosition(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  int *position
+);
+
+ +
RESULT Studio.EventInstance.getTimelinePosition(
+  out int position
+);
+
+ +
Studio.EventInstance.getTimelinePosition(
+  position
+);
+
+ +
+
position Out
+
Timeline position.
+
+

See Also: Studio::EventInstance::setTimelinePosition

+

Studio::EventInstance::getUserData

+

Retrieves the event instance user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetUserData(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  void **userdata
+);
+
+ +
RESULT Studio.EventInstance.getUserData(
+  out IntPtr userdata
+);
+
+ +
Studio.EventInstance.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling Studio::EventInstance::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

Studio::EventInstance::getVolume

+

Retrieves the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::getVolume(
+  float *volume,
+  float *finalvolume = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_GetVolume(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  float *volume,
+  float *finalvolume
+);
+
+ +
RESULT Studio.EventInstance.getVolume(
+  out float volume
+);
+RESULT Studio.EventInstance.getVolume(
+  out float volume,
+  out float finalvolume
+);
+
+ +
Studio.EventInstance.getVolume(
+  volume,
+  finalvolume
+);
+
+ +
+
volume OutOpt
+
Volume as set from the public API.
+
finalvolume OutOpt
+
Final combined volume.
+
+

The final combined value returned in finalvolume combines the volume set using the public API with the result of any automation or modulation. The final combined volume is calculated asynchronously when the Studio system updates.

+

See Also: Studio::EventInstance::setVolume

+

Studio::EventInstance::isValid

+

Checks that the EventInstance reference is valid.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
bool Studio::EventInstance::isValid()
+
+ +
bool FMOD_Studio_EventInstance_IsValid(FMOD_STUDIO_EVENTINSTANCE *eventinstance)
+
+ +
bool Studio.EventInstance.isValid()
+
+ +
Studio.EventInstance.isValid()
+
+ +

Studio::EventInstance::isVirtual

+

Retrieves the virtualization state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::isVirtual(
+  bool *virtualstate
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_IsVirtual(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_BOOL *virtualstate
+);
+
+ +
RESULT Studio.EventInstance.isVirtual(
+  out bool virtualstate
+);
+
+ +
Studio.EventInstance.isVirtual(
+  virtualstate
+);
+
+ +
+
virtualstate Out
+
+

Virtualization state. True if the event instance has been virtualized.

+
    +
  • Units: Boolean
  • +
+
+
+

This function checks whether an event instance has been virtualized due to the polyphony limit being exceeded. See the Virtual Voice guide for more information.

+

Studio::EventInstance::keyOff

+

Allow an event to continue past a sustain point.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::keyOff();
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_KeyOff(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
+
+ +
RESULT Studio.EventInstance.keyOff();
+
+ +
Studio.EventInstance.keyOff();
+
+ +

Multiple sustain points may be bypassed ahead of time and the key off count will be decremented each time the timeline cursor passes a sustain point.

+

This function returns FMOD_ERR_EVENT_NOTFOUND if the event has no sustain points.

+

See Also: Studio::EventDescription::hasSustainPoint

+

Studio::EventInstance::release

+

Marks the event instance for release.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::release();
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_Release(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
+
+ +
RESULT Studio.EventInstance.release();
+
+ +
Studio.EventInstance.release();
+
+ +

This function marks the event instance to be released. Event instances marked for release are destroyed by the asynchronous update when they are in the stopped state (FMOD_STUDIO_PLAYBACK_STOPPED).

+

Generally it is a best practice to release event instances immediately after calling Studio::EventInstance::start, unless you want to play the event instance multiple times or explicitly stop it and start it again later. It is possible to interact with the instance after falling release(), however if the sound has stopped ERR_INVALID_HANDLE will be returned.

+

See Also: Studio::EventInstance::stop, Studio::EventInstance::getPlaybackState

+

Studio::EventInstance::set3DAttributes

+

Sets the 3D attributes.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::set3DAttributes(
+  const FMOD_3D_ATTRIBUTES *attributes
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_Set3DAttributes(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_3D_ATTRIBUTES *attributes
+);
+
+ +
RESULT Studio.EventInstance.set3DAttributes(
+  _3D_ATTRIBUTES attributes
+);
+
+ +
Studio.EventInstance.set3DAttributes(
+  attributes
+);
+
+ +
+
attributes
+
3D attributes. (FMOD_3D_ATTRIBUTES)
+
+

An event's 3D attributes specify its position, velocity and orientation. The 3D attributes are used to calculate 3D panning, doppler and the values of automatic distance and angle parameters.

+

See Also: Studio::EventInstance::get3DAttributes

+

Studio::EventInstance::setCallback

+

Sets the user callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setCallback(
+  FMOD_STUDIO_EVENT_CALLBACK callback,
+  FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetCallback(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_EVENT_CALLBACK callback,
+  FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask
+);
+
+ +
RESULT Studio.EventInstance.setCallback(
+  EVENT_CALLBACK callback,
+  EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL
+);
+
+ +
Studio.EventInstance.setCallback(
+  callback,
+  callbackmask
+);
+
+ +
+
callback
+
User callback. (FMOD_STUDIO_EVENT_CALLBACK)
+
callbackmask
+
Bitfield specifying which callback types are required. (FMOD_STUDIO_EVENT_CALLBACK_TYPE)
+
+

See Event Callbacks for more information about when callbacks occur.

+

See Also: Callback Behavior, Studio::EventDescription::setCallback

+

Studio::EventInstance::setListenerMask

+

Sets the listener mask.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setListenerMask(
+  unsigned int mask
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetListenerMask(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  unsigned int mask
+);
+
+ +
RESULT Studio.EventInstance.setListenerMask(
+  uint mask
+);
+
+ +
Studio.EventInstance.setListenerMask(
+  mask
+);
+
+ +
+
mask
+
+

Listener mask.

+
    +
  • Default: 0xFFFFFFFF
  • +
+
+
+

The listener mask controls which listeners are considered when calculating 3D panning and the values of listener relative automatic parameters.

+

To create the mask you must perform bitwise OR and shift operations, the basic form is 1 << listener_index ORd together with other required listener indices.
+For example to create a mask for listener index 0 and 2 the calculation would be mask = (1 << 0) | (1 << 2), to include all listeners use the default mask of 0xFFFFFFFF.

+

See Also: Studio::EventInstance::getListenerMask

+

Studio::EventInstance::setParameterByID

+

Sets a parameter value by unique identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setParameterByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetParameterByID(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_PARAMETER_ID id,
+  float value,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.EventInstance.setParameterByID(
+  PARAMETER_ID id,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.EventInstance.setParameterByID(
+  id,
+  value,
+  ignoreseekspeed
+);
+
+ +
+
id
+
Parameter identifier. (FMOD_STUDIO_PARAMETER_ID)
+
value
+
Value for given identifier.
+
ignoreseekspeed
+
+

Specifies whether to ignore the parameter's seek speed and set the value immediately.

+
    +
  • Units: Boolean
  • +
+
+
+

The value will be set instantly regardless of ignoreseekspeed when the Event playback state is FMOD_STUDIO_PLAYBACK_STOPPED.

+

If the specified parameter is read only, is an automatic parameter, or is not of type FMOD_STUDIO_PARAMETER_GAME_CONTROLLED, then FMOD_ERR_INVALID_PARAM is returned.

+

See Also: Studio::EventInstance::setParameterByName, Studio::EventInstance::setParametersByIDs, Studio::EventInstance::getParameterByName, Studio::EventInstance::getParameterByID

+

Studio::EventInstance::setParameterByIDWithLabel

+

Sets a parameter value by unique identifier, looking up the value label.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setParameterByIDWithLabel(
+  FMOD_STUDIO_PARAMETER_ID id,
+  const char *label,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetParameterByIDWithLabel(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_PARAMETER_ID id,
+  const char *label,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.EventInstance.setParameterByIDWithLabel(
+  PARAMETER_ID id,
+  string label,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.EventInstance.setParameterByIDWithLabel(
+  id,
+  label,
+  ignoreseekspeed
+);
+
+ +
+
id
+
Parameter identifier. (FMOD_STUDIO_PARAMETER_ID)
+
label
+
Labeled value for given name.
+
ignoreseekspeed
+
Specifies whether to ignore the parameter's seek speed and set the value immediately.
+
+

The label will be set instantly regardless of ignoreseekspeed when the Event playback state is FMOD_STUDIO_PLAYBACK_STOPPED.

+

If the specified parameter is read only, is an automatic parameter or is not of type FMOD_STUDIO_PARAMETER_GAME_CONTROLLED then FMOD_ERR_INVALID_PARAM is returned.

+

If the specified label is not found, FMOD_ERR_EVENT_NOTFOUND is returned. This lookup is case sensitive.

+

See Also: Studio::EventInstance::setParameterByName, Studio::EventInstance::setParametersByIDs, Studio::EventInstance::getParameterByName, Studio::EventInstance::getParameterByID

+

Studio::EventInstance::setParameterByName

+

Sets a parameter value by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setParameterByName(
+  const char *name,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetParameterByName(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  const char *name,
+  float value,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.EventInstance.setParameterByName(
+  string name,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.EventInstance.setParameterByName(
+  name,
+  value,
+  ignoreseekspeed
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
value
+
Value for given name.
+
ignoreseekspeed
+
+

Specifies whether to ignore the parameter's seek speed and set the value immediately.

+
    +
  • Units: Boolean
  • +
+
+
+

The value will be set instantly regardless of ignoreseekspeed when the Event playback state is FMOD_STUDIO_PLAYBACK_STOPPED.

+

If the specified parameter is read only, is an automatic parameter or is not of type FMOD_STUDIO_PARAMETER_GAME_CONTROLLED then FMOD_ERR_INVALID_PARAM is returned.

+

If the event has no parameter matching name then FMOD_ERR_EVENT_NOTFOUND is returned.

+

See Also: Studio::EventInstance::setParameterByID, Studio::EventInstance::setParametersByIDs, Studio::EventInstance::getParameterByName, Studio::EventInstance::getParameterByID

+

Studio::EventInstance::setParameterByNameWithLabel

+

Sets a parameter value by name, including the path if needed, looking up the value label.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setParameterByNameWithLabel(
+  const char *name,
+  const char *label,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetParameterByNameWithLabel(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  const char *name,
+  const char *label,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.EventInstance.setParameterByNameWithLabel(
+  string name,
+  string label,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.EventInstance.setParameterByNameWithLabel(
+  name,
+  label,
+  ignoreseekspeed
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
label
+
Labeled value for given name.
+
ignoreseekspeed
+
Specifies whether to ignore the parameter's seek speed and set the value immediately.
+
+

The label will be set instantly regardless of ignoreseekspeed when the Event playback state is FMOD_STUDIO_PLAYBACK_STOPPED.

+

If the specified parameter is read only, is an automatic parameter or is not of type FMOD_STUDIO_PARAMETER_GAME_CONTROLLED then FMOD_ERR_INVALID_PARAM is returned.

+

If the event has no parameter matching name then FMOD_ERR_EVENT_NOTFOUND is returned.

+

If the specified label is not found, FMOD_ERR_EVENT_NOTFOUND is returned. This lookup is case sensitive.

+

See Also: Studio::EventInstance::setParameterByID, Studio::EventInstance::setParametersByIDs, Studio::EventInstance::getParameterByName, Studio::EventInstance::getParameterByID

+

Studio::EventInstance::setParametersByIDs

+

Sets multiple parameter values by unique identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setParametersByIDs(
+  const FMOD_STUDIO_PARAMETER_ID *ids,
+  float *values,
+  int count,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetParametersByIDs(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  const FMOD_STUDIO_PARAMETER_ID *ids,
+  float *values,
+  int count,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.EventInstance.setParametersByIDs(
+  PARAMETER_ID[] ids,
+  float[] values,
+  int count,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.EventInstance.setParametersByIDs(
+  ids,
+  values,
+  count,
+  ignoreseekspeed
+);
+
+ +
+
ids
+
Array of parameter identifiers. (FMOD_STUDIO_PARAMETER_ID)
+
values
+
Array of values for each given identifier.
+
count
+
+

Number of items in the given arrays.

+
    +
  • Range: [1, 32]
  • +
+
+
ignoreseekspeed
+
+

Specifies whether to ignore the parameter's seek speed and set the value immediately.

+
    +
  • Units: Boolean
  • +
+
+
+

All values will be set instantly regardless of ignoreseekspeed when the Event playback state is FMOD_STUDIO_PLAYBACK_STOPPED.

+

If any ID is set to all zeroes then the corresponding value will be ignored.

+

See Also: Studio::EventInstance::setParameterByName, Studio::EventInstance::setParameterByID, Studio::EventInstance::getParameterByName, Studio::EventInstance::getParameterByID

+

Studio::EventInstance::setPaused

+

Sets the pause state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setPaused(
+  bool paused
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetPaused(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_BOOL paused
+);
+
+ +
RESULT Studio.EventInstance.setPaused(
+  bool paused
+);
+
+ +
Studio.EventInstance.setPaused(
+  paused
+);
+
+ +
+
paused
+
+

The desired pause state. True = paused, False = unpaused.

+
    +
  • Units: Boolean
  • +
+
+
+

This function allows pausing/unpausing of an event instance.

+

See Also: Studio::EventInstance::getPaused

+

Studio::EventInstance::setPitch

+

Sets the pitch multiplier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setPitch(
+  float pitch
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetPitch(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  float pitch
+);
+
+ +
RESULT Studio.EventInstance.setPitch(
+  float pitch
+);
+
+ +
Studio.EventInstance.setPitch(
+  pitch
+);
+
+ +
+
pitch
+
+

Pitch multiplier.

+
    +
  • Units: Linear
  • +
  • Range: [0, inf)
  • +
  • Default: 1
  • +
+
+
+

The pitch multiplier is used to modulate the event instance's pitch. The pitch multiplier can be set to any value greater than or equal to zero but the final combined pitch is clamped to the range [0, 100] before being applied.

+

See Also: Studio::EventInstance::getPitch

+

Studio::EventInstance::setProperty

+

Sets the value of a built-in property.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setProperty(
+  FMOD_STUDIO_EVENT_PROPERTY index,
+  float value
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetProperty(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_EVENT_PROPERTY index,
+  float value
+);
+
+ +
RESULT Studio.EventInstance.setProperty(
+  EVENT_PROPERTY index,
+  float value
+);
+
+ +
Studio.EventInstance.setProperty(
+  index,
+  value
+);
+
+ +
+
index
+
Property index. (FMOD_STUDIO_EVENT_PROPERTY)
+
value
+
Property value.
+
+

This will override the value set in Studio. Using the default FMOD_STUDIO_EVENT_PROPERTY value will revert back to the default values set in Studio.

+

An FMOD spatializer or object spatializer may override the values set for FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE and FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE.

+

See Also: Studio::EventInstance::getProperty

+

Studio::EventInstance::setReverbLevel

+

Sets the core reverb send level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setReverbLevel(
+  int index,
+  float level
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetReverbLevel(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  int index,
+  float level
+);
+
+ +
RESULT Studio.EventInstance.setReverbLevel(
+  int index,
+  float level
+);
+
+ +
Studio.EventInstance.setReverbLevel(
+  index,
+  level
+);
+
+ +
+
index
+
+

Core reverb instance index.

+
    +
  • Range: [0, 3]
  • +
+
+
level
+
+

Reverb send level.

+
    +
  • Units: Linear
  • +
  • Range: [0, 1]
  • +
  • Default: 0
  • +
+
+
+

This function controls the send level for the signal from the event instance to a core reverb instance.

+

See Also: Studio::EventInstance::getReverbLevel, Working with Reverb

+

Studio::EventInstance::setTimelinePosition

+

Sets the timeline cursor position.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setTimelinePosition(
+  int position
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetTimelinePosition(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  int position
+);
+
+ +
RESULT Studio.EventInstance.setTimelinePosition(
+  int position
+);
+
+ +
Studio.EventInstance.setTimelinePosition(
+  position
+);
+
+ +
+
position
+
+

Timeline position.

+
    +
  • Units: Milliseconds
  • +
  • Range: [0, inf)
  • +
+
+
+

See Also: Studio::EventInstance::getTimelinePosition

+

Studio::EventInstance::setUserData

+

Sets the event instance user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetUserData(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  void *userdata
+);
+
+ +
RESULT Studio.EventInstance.setUserData(
+  IntPtr userdata
+);
+
+ +
Studio.EventInstance.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
User data.
+
+

This function allows arbitrary user data to be attached to this object. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Studio::EventInstance::getUserData

+

Studio::EventInstance::setVolume

+

Sets the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::setVolume(
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_SetVolume(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  float volume
+);
+
+ +
RESULT Studio.EventInstance.setVolume(
+  float volume
+);
+
+ +
Studio.EventInstance.setVolume(
+  volume
+);
+
+ +
+
volume
+
+

Volume.

+
    +
  • Units: Linear
  • +
  • Range: [0, inf)
  • +
  • Default: 1
  • +
+
+
+

This volume is applied as a scaling factor for the event volume. It does not override the volume level set in FMOD Studio, nor any internal volume automation or modulation.

+

See Also: Studio::EventInstance::getVolume

+

Studio::EventInstance::start

+

Starts playback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::start();
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_Start(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
+
+ +
RESULT Studio.EventInstance.start();
+
+ +
Studio.EventInstance.start();
+
+ +

If the instance was already playing then calling this function will restart the event.

+

Generally it is a best practice to call Studio::EventInstance::release on event instances immediately after starting them, unless you want to play the event instance multiple times or explicitly stop it and start it again later.

+

See Also: Studio::EventInstance::stop, Sample Data Loading

+

Studio::EventInstance::stop

+

Stops playback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::EventInstance::stop(
+  FMOD_STUDIO_STOP_MODE mode
+);
+
+ +
FMOD_RESULT FMOD_Studio_EventInstance_Stop(
+  FMOD_STUDIO_EVENTINSTANCE *eventinstance,
+  FMOD_STUDIO_STOP_MODE mode
+);
+
+ +
RESULT Studio.EventInstance.stop(
+  STOP_MODE mode
+);
+
+ +
Studio.EventInstance.stop(
+  mode
+);
+
+ +
+
mode
+
Stop mode. (FMOD_STUDIO_STOP_MODE)
+
+

See Also: Studio::EventInstance::start

+

FMOD_STUDIO_EVENT_CALLBACK

+

Callback that is fired when a Studio::EventInstance changes state.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_STUDIO_EVENT_CALLBACK(
+  FMOD_STUDIO_EVENT_CALLBACK_TYPE type,
+  FMOD_STUDIO_EVENTINSTANCE *event,
+  void *parameters
+);
+
+ +
delegate RESULT Studio.EVENT_CALLBACK(
+  EVENT_CALLBACK_TYPE type,
+  IntPtr event,
+  IntPtr parameters
+);
+
+ +
function FMOD_STUDIO_EVENT_CALLBACK(
+  type,
+  event,
+  parameters
+)
+
+ +
+
type
+
The type of event that has occurred. (FMOD_STUDIO_EVENT_CALLBACK_TYPE)
+
event
+
The event instance that has changed state. (Studio::EventInstance)
+
parameters
+
The callback parameters. The data passed varies based on the callback type.
+
+

The data passed to the callback function in the parameters argument varies based on the callback type. See FMOD_STUDIO_EVENT_CALLBACK_TYPE for more information.

+

Return FMOD_OK from the callback unless you wish to signal that there is an error. Select an appropriate error code from FMOD_RESULT. Returning an error will result in a warning or error message being logged.

+
+

The 'event' argument Can be cast to Studio::EventInstance *.

+
+
+

The 'event' argument can be used via EventInstance by using FMOD.Studio.EventInstance instance = new FMOD.Studio.EventInstance(event);

+
+

See Also: Callback Behavior, Studio::EventInstance::setCallback, Studio::EventDescription::setCallback, Studio::System::getSoundInfo, FMOD_STUDIO_EVENT_CALLBACK_TYPE, FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES

+

FMOD_STUDIO_EVENT_CALLBACK_TYPE

+

Studio event callback types.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_EVENT_CALLBACK_CREATED                  0x00000001
+#define FMOD_STUDIO_EVENT_CALLBACK_DESTROYED                0x00000002
+#define FMOD_STUDIO_EVENT_CALLBACK_STARTING                 0x00000004
+#define FMOD_STUDIO_EVENT_CALLBACK_STARTED                  0x00000008
+#define FMOD_STUDIO_EVENT_CALLBACK_RESTARTED                0x00000010
+#define FMOD_STUDIO_EVENT_CALLBACK_STOPPED                  0x00000020
+#define FMOD_STUDIO_EVENT_CALLBACK_START_FAILED             0x00000040
+#define FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND  0x00000080
+#define FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000100
+#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED           0x00000200
+#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED         0x00000400
+#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER          0x00000800
+#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT            0x00001000
+#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED             0x00002000
+#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED            0x00004000
+#define FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL          0x00008000
+#define FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL          0x00010000
+#define FMOD_STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND      0x00020000
+#define FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT     0x00040000
+#define FMOD_STUDIO_EVENT_CALLBACK_ALL                      0xFFFFFFFF
+
+ +
enum Studio.EVENT_CALLBACK_TYPE : uint
+{
+  CREATED                  = 0x00000001,
+  DESTROYED                = 0x00000002,
+  STARTING                 = 0x00000004,
+  STARTED                  = 0x00000008,
+  RESTARTED                = 0x00000010,
+  STOPPED                  = 0x00000020,
+  START_FAILED             = 0x00000040,
+  CREATE_PROGRAMMER_SOUND  = 0x00000080,
+  DESTROY_PROGRAMMER_SOUND = 0x00000100,
+  PLUGIN_CREATED           = 0x00000200,
+  PLUGIN_DESTROYED         = 0x00000400,
+  TIMELINE_MARKER          = 0x00000800,
+  TIMELINE_BEAT            = 0x00001000,
+  SOUND_PLAYED             = 0x00002000,
+  SOUND_STOPPED            = 0x00004000,
+  REAL_TO_VIRTUAL          = 0x00008000,
+  VIRTUAL_TO_REAL          = 0x00010000,
+  START_EVENT_COMMAND      = 0x00020000,
+  NESTED_TIMELINE_BEAT     = 0x00040000,
+  ALL                      = 0xFFFFFFFF,
+}
+
+ +
STUDIO_EVENT_CALLBACK_CREATED                  0x00000001
+STUDIO_EVENT_CALLBACK_DESTROYED                0x00000002
+STUDIO_EVENT_CALLBACK_STARTING                 0x00000004
+STUDIO_EVENT_CALLBACK_STARTED                  0x00000008
+STUDIO_EVENT_CALLBACK_RESTARTED                0x00000010
+STUDIO_EVENT_CALLBACK_STOPPED                  0x00000020
+STUDIO_EVENT_CALLBACK_START_FAILED             0x00000040
+STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND  0x00000080
+STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000100
+STUDIO_EVENT_CALLBACK_PLUGIN_CREATED           0x00000200
+STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED         0x00000400
+STUDIO_EVENT_CALLBACK_TIMELINE_MARKER          0x00000800
+STUDIO_EVENT_CALLBACK_TIMELINE_BEAT            0x00001000
+STUDIO_EVENT_CALLBACK_SOUND_PLAYED             0x00002000
+STUDIO_EVENT_CALLBACK_SOUND_STOPPED            0x00004000
+STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL          0x00008000
+STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL          0x00010000
+STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND      0x00020000
+STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT     0x00040000
+STUDIO_EVENT_CALLBACK_ALL                      0xFFFFFFFF
+
+ +
+
FMOD_STUDIO_EVENT_CALLBACK_CREATED
+
Called when an instance is fully created. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_DESTROYED
+
Called when an instance is just about to be destroyed. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_STARTING
+
Studio::EventInstance::start has been called on an event which was not already playing. The event will remain in this state until its sample data has been loaded. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_STARTED
+
The event has commenced playing. Normally this callback will be issued immediately after FMOD_STUDIO_EVENT_CALLBACK_STARTING, but may be delayed until sample data has loaded. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_RESTARTED
+
Studio::EventInstance::start has been called on an event which was already playing. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_STOPPED
+
The event has stopped. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_START_FAILED
+
Studio::EventInstance::start has been called but the polyphony settings did not allow the event to start. In this case none of FMOD_STUDIO_EVENT_CALLBACK_STARTING, FMOD_STUDIO_EVENT_CALLBACK_STARTED and FMOD_STUDIO_EVENT_CALLBACK_STOPPED will be called. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND
+
A programmer sound is about to play. FMOD expects the callback to provide an FMOD::Sound object for it to use. Parameters = FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES.
+
FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND
+
A programmer sound has stopped playing. At this point it is safe to release the FMOD::Sound object that was used. Parameters = FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES.
+
FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED
+
Called when a DSP plug-in instance has just been created. Parameters = FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES.
+
FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED
+
Called when a DSP plug-in instance is about to be destroyed. Parameters = FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES.
+
FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER
+
Called when the timeline passes a named marker. Parameters = FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES.
+
FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT
+
Called when the timeline hits a beat in a tempo section. Parameters = FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES.
+
FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED
+
Called when the event plays a sound. Parameters = Sound.
+
FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED
+
Called when the event finishes playing a sound. Parameters = Sound.
+
FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL
+
Called when the event becomes virtual. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL
+
Called when the event becomes real. Parameters = unused.
+
FMOD_STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND
+
Called when a new event is started by a start event command. Parameters = Studio::EventInstance.
+
FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT
+
Called when the timeline hits a beat in a tempo section of a nested event. Parameters = FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES.
+
FMOD_STUDIO_EVENT_CALLBACK_ALL
+
Pass this mask to Studio::EventDescription::setCallback or Studio::EventInstance::setCallback to receive all callback types.
+
+

Callbacks are called from the Studio Update Thread in default / async mode and the main (calling) thread in synchronous mode.
+If using FMOD_STUDIO_INIT_DEFERRED_CALLBACKS, FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER and FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT are instead called from the main thread.

+

See Also: Callback Behavior, Studio::EventDescription::setCallback, Studio::EventInstance::setCallback, FMOD_STUDIO_EVENT_CALLBACK

+

FMOD_STUDIO_EVENT_PROPERTY

+

These definitions describe built-in event properties.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_EVENT_PROPERTY {
+  FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY,
+  FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY,
+  FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD,
+  FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE,
+  FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE,
+  FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN,
+  FMOD_STUDIO_EVENT_PROPERTY_MAX
+} FMOD_STUDIO_EVENT_PROPERTY;
+
+ +
enum Studio.EVENT_PROPERTY
+{
+    CHANNELPRIORITY,
+    SCHEDULE_DELAY,
+    SCHEDULE_LOOKAHEAD,
+    MINIMUM_DISTANCE,
+    MAXIMUM_DISTANCE,
+    COOLDOWN,
+    MAX
+};
+
+ +
STUDIO_EVENT_PROPERTY_CHANNELPRIORITY
+STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY
+STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD
+STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE
+STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE
+STUDIO_EVENT_PROPERTY_COOLDOWN
+STUDIO_EVENT_PROPERTY_MAX
+
+ +
+
FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY
+
+

Priority to set on Core API Channels created by this event instance, or -1 for default.

+
    +
  • Range: [-1, 256]
  • +
  • Default: -1
  • +
+
+
FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY
+
+

Schedule delay in DSP clocks, or -1 for default.

+
    +
  • Range: -1, [0, inf)
  • +
  • Default: -1
  • +
+
+
FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD
+
+

Schedule look-ahead on the timeline in DSP clocks, or -1 for default.

+
    +
  • Range: -1, [0, inf)
  • +
  • Default: -1
  • +
+
+
FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE
+
+

Override the event's 3D minimum distance, or -1 for default.

+ +
+
FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE
+
+

Override the event's 3D maximum distance, or -1 for default.

+ +
+
FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN
+
+

Override the event's cooldown, or -1 for default.

+
    +
  • Range: -1, [0, inf)
  • +
  • Default: -1
  • +
+
+
FMOD_STUDIO_EVENT_PROPERTY_MAX
+
Maximum number of event property types.
+
+

A property that returns a value of -1 from Studio::EventInstance::getProperty means it will use the values set in Studio, use Studio::EventInstance::setProperty to override these values. You can revert the properties value to default by setting it to -1.

+

FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES

+

Describes a DSP plug-in instance.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES {
+  const char   *name;
+  FMOD_DSP    *dsp;
+} FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES;
+
+ +
struct Studio.PLUGIN_INSTANCE_PROPERTIES
+{
+    IntPtr name;
+    IntPtr dsp;
+}
+
+ +
FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES
+{
+  name,
+};
+
+ +
+
name
+
Name of the plug-in effect or sound (set in FMOD Studio).
+
dsp
+
DSP plug-in instance. (DSP)
+
+

This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED or FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED.

+
+

The dsp argument can be cast to FMOD::DSP *.

+
+
+

The 'name' argument can be used via StringWrapper by using FMOD.StringWrapper dspName = new FMOD.StringWrapper(name);

+

The 'dsp' argument can be used via DSP by using FMOD.DSP dspInstance = new FMOD.DSP(dsp);

+
+

See Also: FMOD_STUDIO_EVENT_CALLBACK

+

FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES

+

Describes a programmer sound.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES {
+  const char   *name;
+  FMOD_SOUND   *sound;
+  int          subsoundIndex;
+} FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES;
+
+ +
struct Studio.PROGRAMMER_SOUND_PROPERTIES
+{
+    StringWrapper name;
+    IntPtr sound;
+    int subsoundIndex;
+}
+
+ +
FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES
+{
+  name,
+  sound,
+  subsoundIndex,
+};
+
+ +
+
name
+
Name of the programmer instrument (set in FMOD Studio). (UTF-8 string)
+
sound
+
Programmer-created sound. (Sound)
+
subsoundIndex
+
Subsound index.
+
+

This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND or FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND.

+

When the callback type is FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND the callback should fill in the sound and subsoundIndex fields. The provided sound should be created with the FMOD_LOOP_NORMAL mode bit set. FMOD will set this bit internally if it is not set, possibly incurring a performance penalty. The subsound index should be set to the subsound to play, or -1 if the provided sound should be used directly.

+

When the callback type is FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND the sound in sound should be cleaned up.

+
+

sound can be cast to/from FMOD::Sound *.

+
+

See Also: FMOD_STUDIO_EVENT_CALLBACK

+

FMOD_STUDIO_STOP_MODE

+

Stop modes.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_STOP_MODE {
+  FMOD_STUDIO_STOP_ALLOWFADEOUT,
+  FMOD_STUDIO_STOP_IMMEDIATE
+} FMOD_STUDIO_STOP_MODE;
+
+ +
enum Studio.STOP_MODE
+{
+    ALLOWFADEOUT,
+    IMMEDIATE,
+}
+
+ +
STUDIO_STOP_ALLOWFADEOUT
+STUDIO_STOP_IMMEDIATE
+
+ +
+
FMOD_STUDIO_STOP_ALLOWFADEOUT
+
Allows AHDSR modulators to complete their release, and DSP effect tails to play out.
+
FMOD_STUDIO_STOP_IMMEDIATE
+
Stops the event instance immediately.
+
+

See Also: Studio::EventInstance::stop, Studio::Bus::stopAllEvents

+

FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES

+

Describes a beat on the timeline.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES {
+  int     bar;
+  int     beat;
+  int     position;
+  float   tempo;
+  int     timesignatureupper;
+  int     timesignaturelower;
+} FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES;
+
+ +
struct Studio.TIMELINE_BEAT_PROPERTIES
+{
+  int bar;
+  int beat;
+  int position;
+  float tempo;
+  int timesignatureupper;
+  int timesignaturelower;
+}
+
+ +
FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES
+{
+  bar,
+  beat,
+  position,
+  tempo,
+  timesignatureupper,
+  timesignaturelower,
+};
+
+ +
+
bar
+
Bar number (starting from 1).
+
beat
+
Beat number within bar (starting from 1).
+
position
+
Position of the beat on the timeline in milliseconds.
+
tempo
+
Current tempo in beats per minute.
+
timesignatureupper
+
Current time signature upper number (beats per bar).
+
timesignaturelower
+
Current time signature lower number (beat unit).
+
+

This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT.

+

Nested events do not trigger this callback. Instead, see FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT.

+

See Also: FMOD_STUDIO_EVENT_CALLBACK

+

FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES

+

Describes a marker on the timeline.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES {
+  const char   *name;
+  int          position;
+} FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES;
+
+ +
struct Studio.TIMELINE_MARKER_PROPERTIES
+{
+  IntPtr name;
+  int position;
+}
+
+ +
FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES
+{
+  name,
+  position,
+};
+
+ +
+
name
+
Marker name.
+
position
+
Position of the marker on the timeline in milliseconds.
+
+

This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER.

+

See Also: Studio::EventDescription::setCallback, Studio::EventInstance::setCallback

+

FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES

+

Describes a beat on the timeline from a nested event.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES {
+  FMOD_GUID                             eventid;
+  FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES  properties;
+} FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES;
+
+ +
struct Studio.TIMELINE_NESTED_BEAT_PROPERTIES
+{
+  Guid                      eventid;
+  TIMELINE_BEAT_PROPERTIES  properties;
+}
+
+ +
FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES
+{
+  eventid,
+  properties,
+};
+
+ +
+
eventid
+
Event description GUID. (FMOD_GUID)
+
properties
+
Beat properties. (FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES)
+
+

This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT.

+

See Also: FMOD_STUDIO_EVENT_CALLBACK, FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-system.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-system.html new file mode 100644 index 0000000..1760ffb --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-system.html @@ -0,0 +1,3340 @@ + + +Studio API Reference | Studio::System + + + + +
+ +
+

6. Studio API Reference | Studio::System

+

The main system object for FMOD Studio.

+

Initializing the studio system object also initializes the core System object.

+

Lifetime:

+ +
+ +

Update:

+ +

Banks:

+ +
+ +
+ +

Listeners:

+ +

Buses:

+ +

Events:

+ +

Parameters:

+ +

VCAs:

+ +

Advanced settings:

+ +
+ +

Command capture and replay:

+ +
+ +

Profiling:

+ +
+ +

Plug-ins:

+ +

System callback:

+ +
+ +

Sound table:

+ +
+ +

General:

+ +

FMOD_STUDIO_ADVANCEDSETTINGS

+

Settings for advanced features like configuring memory and cpu usage.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_ADVANCEDSETTINGS {
+  int            cbsize;
+  unsigned int   commandqueuesize;
+  unsigned int   handleinitialsize;
+  int            studioupdateperiod;
+  int            idlesampledatapoolsize;
+  unsigned int   streamingscheduledelay;
+  const char*    encryptionkey;
+} FMOD_STUDIO_ADVANCEDSETTINGS;
+
+ +
struct Studio.ADVANCEDSETTINGS
+{
+  int cbsize;
+  int commandqueuesize;
+  int handleinitialsize;
+  int studioupdateperiod;
+  int idlesampledatapoolsize;
+  int streamingscheduledelay;
+  StringWrapper encryptionkey;
+}
+
+ +
FMOD_STUDIO_ADVANCEDSETTINGS
+{
+  commandqueuesize,
+  handleinitialsize,
+  studioupdateperiod,
+  idlesampledatapoolsize,
+  streamingscheduledelay;
+};
+
+ +
+
cbsize
+
Size of this structure in bytes. Must be set to sizeof(FMOD_STUDIO_ADVANCEDSETTINGS) before calling Studio::System::setAdvancedSettings or Studio::System::getAdvancedSettings.
+
commandqueuesize
+
+

Command queue size for studio async processing.

+
    +
  • Units: Bytes
  • +
  • Default: 32768
  • +
+
+
handleinitialsize
+
+

Initial size to allocate for handles. Memory for handles will grow as needed in pages.

+
    +
  • Units: Bytes
  • +
  • Default: 8192 * sizeof(void*)
  • +
+
+
studioupdateperiod
+
+

Update period of Studio when in async mode, in milliseconds. Will be quantized to the nearest multiple of mixer duration.

+
    +
  • Units: Milliseconds
  • +
  • Default: 20
  • +
+
+
idlesampledatapoolsize
+
+

Size in bytes of sample data to retain in memory when no longer used, to avoid repeated disk I/O. Use -1 to disable.

+
    +
  • Units: Bytes
  • +
  • Default: 262144
  • +
+
+
streamingscheduledelay
+
+

Specify the schedule delay for streams, in samples. Lower values can reduce latency when scheduling events containing streams but may cause scheduling issues if too small.

+
    +
  • Units: Samples
  • +
  • Default: 8192
  • +
+
+
encryptionkey
+
Specify the key for loading sounds from encrypted banks. (UTF-8 string)
+
+

When calling Studio::System::setAdvancedSettings any member other than cbsize may be set to zero to use the default value for that setting.

+

FMOD_STUDIO_BANK_INFO

+

Information for loading a bank using user callbacks.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_BANK_INFO {
+  int                        size;
+  void                      *userdata;
+  int                        userdatalength;
+  FMOD_FILE_OPEN_CALLBACK    opencallback;
+  FMOD_FILE_CLOSE_CALLBACK   closecallback;
+  FMOD_FILE_READ_CALLBACK    readcallback;
+  FMOD_FILE_SEEK_CALLBACK    seekcallback;
+} FMOD_STUDIO_BANK_INFO;
+
+ +
struct Studio.BANK_INFO
+{
+  int size;
+  IntPtr userdata;
+  int userdatalength;
+  FILE_OPENCALLBACK opencallback;
+  FILE_CLOSECALLBACK closecallback;
+  FILE_READCALLBACK readcallback;
+  FILE_SEEKCALLBACK seekcallback;
+}
+
+ +
FMOD_STUDIO_BANK_INFO
+{
+  userdata,
+  userdatalength,
+  opencallback,
+  closecallback,
+  readcallback,
+  seekcallback,
+};
+
+ +
+
size
+
Size of this structure in bytes. Must be set to sizeof(FMOD_STUDIO_BANK_INFO).
+
userdata Opt
+
User data to be passed to the file callbacks. If userdatalength is zero, this must remain valid until the bank has been unloaded and all calls to opencallback have been matched by a call to closecallback.
+
userdatalength
+
Length of user data in bytes. If non-zero the userdata will be copied internally; this copy will be kept until the bank has been unloaded and all calls to opencallback have been matched by a call to closecallback.
+
opencallback
+
Callback for opening the bank file. (FMOD_FILE_OPEN_CALLBACK)
+
closecallback
+
Callback for closing the bank file. (FMOD_FILE_CLOSE_CALLBACK)
+
readcallback
+
Callback for reading from the bank file. (FMOD_FILE_READ_CALLBACK)
+
seekcallback
+
Callback for seeking within the bank file. (FMOD_FILE_SEEK_CALLBACK)
+
+

See Also: Studio::System::loadBankCustom

+

FMOD_STUDIO_BUFFER_INFO

+

Information for a single buffer in FMOD Studio.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_BUFFER_INFO {
+  int     currentusage;
+  int     peakusage;
+  int     capacity;
+  int     stallcount;
+  float   stalltime;
+} FMOD_STUDIO_BUFFER_INFO;
+
+ +
struct Studio.BUFFER_INFO
+{
+    int currentusage;
+    int peakusage;
+    int capacity;
+    int stallcount;
+    float stalltime;
+}
+
+ +
FMOD_STUDIO_BUFFER_INFO
+{
+  currentusage,
+  peakusage,
+  capacity,
+  stallcount,
+  stalltime,
+};
+
+ +
+
currentusage
+
Current buffer usage in bytes.
+
peakusage
+
Peak buffer usage in bytes.
+
capacity
+
Buffer capacity in bytes.
+
stallcount
+
Cumulative number of stalls due to buffer overflow.
+
stalltime
+
Cumulative amount of time stalled due to buffer overflow, in seconds.
+
+

See Also: FMOD_STUDIO_BUFFER_USAGE

+

FMOD_STUDIO_BUFFER_USAGE

+

Information for FMOD Studio buffer usage.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_BUFFER_USAGE {
+  FMOD_STUDIO_BUFFER_INFO   studiocommandqueue;
+  FMOD_STUDIO_BUFFER_INFO   studiohandle;
+} FMOD_STUDIO_BUFFER_USAGE;
+
+ +
struct Studio.BUFFER_USAGE
+{
+  BUFFER_INFO studiocommandqueue;
+  BUFFER_INFO studiohandle;
+}
+
+ +
FMOD_STUDIO_BUFFER_USAGE
+{
+  studiocommandqueue,
+  studiohandle,
+};
+
+ +
+
studiocommandqueue
+
Information for the Studio Async Command buffer. (FMOD_STUDIO_BUFFER_INFO)
+
studiohandle
+
Information for the Studio handle table. (FMOD_STUDIO_BUFFER_INFO)
+
+

See Also: Studio::System::getBufferUsage

+

FMOD_STUDIO_COMMANDCAPTURE_FLAGS

+

Flags controling command capture.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_COMMANDCAPTURE_NORMAL             0x00000000
+#define FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH          0x00000001
+#define FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE 0x00000002
+
+ +
enum Studio.COMMANDCAPTURE_FLAGS : uint
+{
+    NORMAL             = 0x00000000,
+    FILEFLUSH          = 0x00000001,
+    SKIP_INITIAL_STATE = 0x00000002,
+}
+
+ +
STUDIO_COMMANDCAPTURE_NORMAL             0x00000000
+STUDIO_COMMANDCAPTURE_FILEFLUSH          0x00000001
+STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE 0x00000002
+
+ +
+
FMOD_STUDIO_COMMANDCAPTURE_NORMAL
+
Use default options.
+
FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH
+
Call file flush on every command.
+
FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE
+
The initial state of banks and instances is captured, unless this flag is set.
+
+

See Also: Studio::System::startCommandCapture

+

FMOD_STUDIO_COMMANDREPLAY_FLAGS

+

Flags controlling command replay.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_COMMANDREPLAY_NORMAL         0x00000000
+#define FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP   0x00000001
+#define FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD   0x00000002
+#define FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD 0x00000004
+
+ +
enum Studio.COMMANDREPLAY_FLAGS : uint
+{
+  NORMAL         = 0x00000000,
+  SKIP_CLEANUP   = 0x00000001,
+  FAST_FORWARD   = 0x00000002,
+  SKIP_BANK_LOAD = 0x00000004,
+}
+
+ +
STUDIO_COMMANDREPLAY_NORMAL         0x00000000
+STUDIO_COMMANDREPLAY_SKIP_CLEANUP   0x00000001
+STUDIO_COMMANDREPLAY_FAST_FORWARD   0x00000002
+STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD 0x00000004
+
+ +
+
FMOD_STUDIO_COMMANDREPLAY_NORMAL
+
Use default options.
+
FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP
+
Do not free resources at the end of playback.
+
FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD
+
Play back at maximum speed, ignoring the timing of the original replay.
+
FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD
+
Skip commands related to bank loading.
+
+

See Also: Studio::System::loadCommandReplay

+

FMOD_STUDIO_CPU_USAGE

+

Performance information for Studio API functionality.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_CPU_USAGE {
+  float   update;
+} FMOD_STUDIO_CPU_USAGE;
+
+ +
struct Studio.CPU_USAGE
+{
+    float update;
+}
+
+ +
FMOD_STUDIO_CPU_USAGE
+{
+  update
+};
+
+ +
+
update
+
+

Studio::System::update CPU usage. Percentage of main thread, or main thread if FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE flag is used with Studio::System::initialize.

+
    +
  • Units: Percent
  • +
  • Range: [0, 100]
  • +
+
+
+

This structure is filled in with Studio::System::getCPUUsage.

+

See Also: System::getCPUUsage, FMOD_CPU_USAGE

+

FMOD_STUDIO_INITFLAGS

+

Studio System initialization flags.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_INIT_NORMAL                0x00000000
+#define FMOD_STUDIO_INIT_LIVEUPDATE            0x00000001
+#define FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS 0x00000002
+#define FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE    0x00000004
+#define FMOD_STUDIO_INIT_DEFERRED_CALLBACKS    0x00000008
+#define FMOD_STUDIO_INIT_LOAD_FROM_UPDATE      0x00000010
+#define FMOD_STUDIO_INIT_MEMORY_TRACKING       0x00000020
+
+ +
enum Studio.INITFLAGS : uint
+{
+    NORMAL                = 0x00000000
+    LIVEUPDATE            = 0x00000001
+    ALLOW_MISSING_PLUGINS = 0x00000002
+    SYNCHRONOUS_UPDATE    = 0x00000004
+    DEFERRED_CALLBACKS    = 0x00000008
+    LOAD_FROM_UPDATE      = 0x00000010
+    MEMORY_TRACKING       = 0x00000020
+}
+
+ +
STUDIO_INIT_NORMAL                0x00000000
+STUDIO_INIT_LIVEUPDATE            0x00000001
+STUDIO_INIT_ALLOW_MISSING_PLUGINS 0x00000002
+STUDIO_INIT_SYNCHRONOUS_UPDATE    0x00000004
+STUDIO_INIT_DEFERRED_CALLBACKS    0x00000008
+STUDIO_INIT_LOAD_FROM_UPDATE      0x00000010
+STUDIO_INIT_MEMORY_TRACKING       0x00000020
+
+ +
+
FMOD_STUDIO_INIT_NORMAL
+
Use defaults for all initialization options.
+
FMOD_STUDIO_INIT_LIVEUPDATE
+
Enable live update.
+
FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS
+
Load banks even if they reference plug-ins that have not been loaded.
+
FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE
+
Disable asynchronous processing and perform all processing on the calling thread instead.
+
FMOD_STUDIO_INIT_DEFERRED_CALLBACKS
+
Defer timeline callbacks until the main update. See Studio::EventInstance::setCallback for more information.
+
FMOD_STUDIO_INIT_LOAD_FROM_UPDATE
+
No additional threads are created for bank and resource loading. Loading is driven from Studio::System::update.
+
FMOD_STUDIO_INIT_MEMORY_TRACKING
+
Enables detailed memory usage statistics. Increases memory footprint and impacts performance. See Studio::Bus::getMemoryUsage and Studio::EventInstance::getMemoryUsage for more information. Implies FMOD_INIT_MEMORY_TRACKING.
+
+

See Also: Studio::System::initialize

+

FMOD_STUDIO_LOAD_BANK_FLAGS

+

Flags for controlling bank loading.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_LOAD_BANK_NORMAL             0x00000000
+#define FMOD_STUDIO_LOAD_BANK_NONBLOCKING        0x00000001
+#define FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES 0x00000002
+#define FMOD_STUDIO_LOAD_BANK_UNENCRYPTED        0x00000004
+
+ +
enum Studio.LOAD_BANK_FLAGS : uint
+{
+    NORMAL             = 0x00000000,
+    NONBLOCKING        = 0x00000001,
+    DECOMPRESS_SAMPLES = 0x00000002,
+    UNENCRYPTED        = 0x00000004,
+}
+
+ +
STUDIO_LOAD_BANK_NORMAL             0x00000000
+STUDIO_LOAD_BANK_NONBLOCKING        0x00000001
+STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES 0x00000002
+STUDIO_LOAD_BANK_UNENCRYPTED        0x00000004
+
+ +
+
FMOD_STUDIO_LOAD_BANK_NORMAL
+
Standard behavior.
+
FMOD_STUDIO_LOAD_BANK_NONBLOCKING
+
Bank loading occurs asynchronously rather than occurring immediately.
+
FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES
+
Force samples to decompress into memory when they are loaded, rather than staying compressed.
+
FMOD_STUDIO_LOAD_BANK_UNENCRYPTED
+
Ignore the encryption key specified by Studio::System::setAdvancedSettings when loading sounds from this bank (assume the sounds in the bank are not encrypted).
+
+

See Also: Studio::System::loadBankFile, Studio::System::loadBankMemory, Studio::System::loadBankCustom

+

FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT

+

The required memory alignment of banks in user memory.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT   32
+
+ +
+

Not supported for C#.

+
+
+

Not supported for JavaScript.

+
+

See Also: Studio::System::loadBankMemory

+

FMOD_STUDIO_LOAD_MEMORY_MODE

+

Specifies how to use the memory buffer passed to Studio::System::loadBankMemory.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef enum FMOD_STUDIO_LOAD_MEMORY_MODE {
+  FMOD_STUDIO_LOAD_MEMORY,
+  FMOD_STUDIO_LOAD_MEMORY_POINT
+} FMOD_STUDIO_LOAD_MEMORY_MODE;
+
+ +
+

Not supported for C#.

+
+
STUDIO_LOAD_MEMORY       0
+STUDIO_LOAD_MEMORY_POINT 1
+
+ +
+
FMOD_STUDIO_LOAD_MEMORY
+
Memory buffer is copied internally.
+
FMOD_STUDIO_LOAD_MEMORY_POINT
+
Memory buffer is used directly in user memory.
+
+
+

It is not currently possible for the FMOD Engine to use banks loaded into user memory. Only FMOD.STUDIO_LOAD_MEMORY is supported.

+
+

See Also: Studio::System::loadBankMemory

+

FMOD_STUDIO_SOUND_INFO

+

Describes a sound in the audio table.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
typedef struct FMOD_STUDIO_SOUND_INFO {
+  const char              *name_or_data;
+  FMOD_MODE                mode;
+  FMOD_CREATESOUNDEXINFO   exinfo;
+  int                      subsoundindex;
+} FMOD_STUDIO_SOUND_INFO;
+
+ +
class Studio.SOUND_INFO
+{
+  byte[] name_or_data;
+  MODE mode;
+  CREATESOUNDEXINFO exinfo;
+  int subsoundindex;
+  string name { get; }
+}
+
+ +
FMOD_STUDIO_SOUND_INFO
+{
+  name_or_data,
+  mode,
+  exinfo,
+  subsoundindex,
+};
+
+ +
+
name_or_data
+
The filename (UTF-8 string) or memory buffer that contains the sound.
+
mode
+
+

Mode flags required for loading the sound. (FMOD_MODE)

+ +
+
exinfo
+
Extra information required for loading the sound. (FMOD_CREATESOUNDEXINFO)
+
subsoundindex
+
Subsound index for loading the sound.
+
+
+

The name property is a getter for the name_or_data member which will return null if the sound should be loaded from memory.

+
+

See Also: Studio::System::getSoundInfo

+

FMOD_STUDIO_SYSTEM_CALLBACK

+

Callback for Studio system events.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT F_CALL FMOD_STUDIO_SYSTEM_CALLBACK(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type,
+  void *commanddata,
+  void *userdata
+);
+
+ +
delegate RESULT Studio.SYSTEM_CALLBACK(
+  IntPtr system,
+  SYSTEM_CALLBACK_TYPE type,
+  IntPtr commanddata,
+  IntPtr userdata
+);
+
+ +
function FMOD_STUDIO_SYSTEM_CALLBACK(
+  system,
+  type,
+  commanddata,
+  userdata
+)
+
+ +
+
system
+
Studio system. (Studio::System)
+
type
+
Callback type. (FMOD_STUDIO_SYSTEM_CALLBACK_TYPE)
+
commanddata
+
Data specific to callback type.
+
userdata
+
User data set with Studio::System::setUserData.
+
+
+

system can be cast to Studio::System *.

+
+

See Also: Callback Behavior, User Data

+

FMOD_STUDIO_SYSTEM_CALLBACK_TYPE

+

Callback types for the Studio System callback.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
#define FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE               0x00000001
+#define FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE              0x00000002
+#define FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD             0x00000004
+#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED    0x00000008
+#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED 0x00000010
+#define FMOD_STUDIO_SYSTEM_CALLBACK_ALL                     0xFFFFFFFF
+
+ +
enum Studio.SYSTEM_CALLBACK_TYPE : uint
+{
+    PREUPDATE               = 0x00000001,
+    POSTUPDATE              = 0x00000002,
+    BANK_UNLOAD             = 0x00000004,
+    LIVEUPDATE_CONNECTED    = 0x00000008,
+    LIVEUPDATE_DISCONNECTED = 0x00000010,
+    ALL                     = 0xFFFFFFFF,
+}
+
+ +
STUDIO_SYSTEM_CALLBACK_PREUPDATE                0x00000001
+STUDIO_SYSTEM_CALLBACK_POSTUPDATE               0x00000002
+STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD              0x00000004
+STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED     0x00000008
+STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED  0x00000010
+STUDIO_SYSTEM_CALLBACK_ALL                      0xFFFFFFFF
+
+ +
+
FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE
+
Called at the start of the main Studio update. For async mode this will be on its own thread.
+
FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE
+
Called at the end of the main Studio update. For async mode this will be on its own thread.
+
FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD
+
Called directly when a bank has just been unloaded, after all resources are freed. The commanddata argument is the bank handle.
+
FMOD_STUDIO_SYSTEM_CALLBACK_ALL
+
Pass this mask to Studio::System::setCallback to receive all callback types.
+
FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED
+
Called after a live update connection has been established.
+
FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED
+
Called after live update session disconnects.
+
+

Callbacks are called from the Studio Update Thread in default / async mode and the main (calling) thread in synchronous mode.

+

See Also: Callback Behavior, FMOD_STUDIO_SYSTEM_CALLBACK, Studio::System::setCallback

+

Studio::System::create

+

FMOD Studio System creation function.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
static FMOD_RESULT Studio::System::create(
+  Studio::System **system,
+  unsigned int headerversion = FMOD_VERSION
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_Create(
+  FMOD_STUDIO_SYSTEM **system,
+  unsigned int headerversion
+);
+
+ +
static RESULT Studio.System.create(
+  out System system
+);
+
+ +
static Studio_System_Create(
+  system
+);
+
+ +
+
system Out
+
Studio System object. (Studio::System)
+
headerversion
+
Expected Studio API version.
+
+

Pass FMOD_VERSION in headerversion to ensure the library and header versions being used match.

+

Call Studio::System::release to free the Studio System.

+

Studio::System::create and Studio::System::release are not thread-safe. Calling either of these functions concurrently with any Studio API function (including these two functions) may cause undefined behavior. External synchronization must be used if calls to Studio::System::create or Studio::System::release could overlap other Studio API calls. All other Studio API functions are thread safe and may be called freely from any thread unless otherwise documented.

+

See Also: Creating the Studio System

+

Studio::System::flushCommands

+

Block until all pending commands have been executed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::flushCommands();
+
+ +
FMOD_RESULT FMOD_Studio_System_FlushCommands(FMOD_STUDIO_SYSTEM *system);
+
+ +
RESULT Studio.System.flushCommands();
+
+ +
Studio.System.flushCommands();
+
+ +

This function blocks the calling thread until all pending commands have been executed and all non-blocking bank loads have been completed.

+

This is equivalent to calling Studio::System::update and then sleeping until the asynchronous thread has finished executing all pending commands.

+

See Also: Studio::System::initialize, Studio::System::update, Studio::System::flushSampleLoading

+

Studio::System::flushSampleLoading

+

Block until all sample loading and unloading has completed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::flushSampleLoading();
+
+ +
FMOD_RESULT FMOD_Studio_System_FlushSampleLoading(FMOD_STUDIO_SYSTEM *system);
+
+ +
RESULT Studio.System.flushSampleLoading();
+
+ +
Studio.System.flushSampleLoading();
+
+ +
+

This function may stall for a long time if other threads are continuing to issue calls to load and unload sample data, e.g. by creating new event instances.

+
+

See Also: Studio::System::flushCommands, Sample Data Loading

+

Studio::System::getAdvancedSettings

+

Retrieves advanced settings.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getAdvancedSettings(
+  FMOD_STUDIO_ADVANCEDSETTINGS *settings
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetAdvancedSettings(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_ADVANCEDSETTINGS *settings
+);
+
+ +
RESULT Studio.System.getAdvancedSettings(
+  out ADVANCEDSETTINGS settings
+);
+
+ +
Studio.System.getAdvancedSettings(
+  settings
+);
+
+ +
+
settings Out
+
Studio System advanced settings. (FMOD_STUDIO_ADVANCEDSETTINGS)
+
+

See Also: Studio::System::setAdvancedSettings

+

Studio::System::getBank

+

Retrieves a loaded bank with the specified file path.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getBank(
+  const char *path,
+  Studio::Bank **bank
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetBank(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *path,
+  FMOD_STUDIO_BANK **bank
+);
+
+ +
RESULT Studio.System.getBank(
+  string path,
+  out Bank bank
+);
+
+ +
Studio.System.getBank(
+  path,
+  bank
+);
+
+ +
+
path
+
The bank path or the ID string that identifies the bank. (UTF-8 string)
+
bank Out
+
Bank object. (Studio::Bank)
+
+

path may be a path, such as bank:/Weapons or an ID string such as {793cddb6-7fa1-4e06-b805-4c74c0fd625b}.

+

Note that path lookups will only succeed if the strings bank has been loaded.

+

See Also: Studio::System::getBankByID

+

Studio::System::getBankByID

+

Retrieves a loaded bank with the specified ID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getBankByID(
+  const FMOD_GUID *id,
+  Studio::Bank **bank
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetBankByID(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_GUID *id,
+  FMOD_STUDIO_BANK **bank
+);
+
+ +
RESULT Studio.System.getBankByID(
+  Guid id,
+  out Bank bank
+);
+
+ +
Studio.System.getBankByID(
+  id,
+  bank
+);
+
+ +
+
id
+
Bank GUID. (FMOD_GUID)
+
bank Out
+
Bank object. (Studio::Bank)
+
+

See Also: Studio::parseID, Studio::System::lookupID, Studio::System::getBank

+

Studio::System::getBankCount

+

Retrieves the number of currently-loaded banks.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getBankCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetBankCount(
+  FMOD_STUDIO_SYSTEM *system,
+  int *count
+);
+
+ +
RESULT Studio.System.getBankCount(
+  out int count
+);
+
+ +
Studio.System.getBankCount(
+  count
+);
+
+ +
+
count Out
+
Number of loaded banks.
+
+

May be used in conjunction with Studio::System::getBankList to enumerate the loaded banks.

+

Studio::System::getBankList

+

Retrieves a list of the currently-loaded banks.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getBankList(
+  Studio::Bank **array,
+  int capacity,
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetBankList(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_BANK **array,
+  int capacity,
+  int *count
+);
+
+ +
RESULT Studio.System.getBankList(
+  out Bank[] array
+);
+
+ +
Studio.System.getBankList(
+  array,
+  capacity,
+  count
+);
+
+ +
+
array Out
+
Array to receive the list. (Studio::Bank)
+
capacity
+
Capacity of array.
+
count OutOpt
+
Number of banks written to array.
+
+

May be used in conjunction with Studio::System::getBankCount to enumerate the loaded banks.

+

Studio::System::getBufferUsage

+

Retrieves buffer usage information.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getBufferUsage(
+  FMOD_STUDIO_BUFFER_USAGE *usage
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetBufferUsage(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_BUFFER_USAGE *usage
+);
+
+ +
RESULT Studio.System.getBufferUsage(
+  out BUFFER_USAGE usage
+);
+
+ +
Studio.System.getBufferUsage(
+  usage
+);
+
+ +
+
usage Out
+
Buffer usage information. (FMOD_STUDIO_BUFFER_USAGE)
+
+

Stall count and time values are cumulative. They can be reset by calling Studio::System::resetBufferUsage.

+

Stalls due to the studio command queue overflowing can be avoided by setting a larger command queue size with Studio::System::setAdvancedSettings.

+

Studio::System::getBus

+

Retrieves a loaded bus.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getBus(
+  const char *path,
+  Studio::Bus **bus
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetBus(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *path,
+  FMOD_STUDIO_BUS **bus
+);
+
+ +
RESULT Studio.System.getBus(
+  string path,
+  out Bus bus
+);
+
+ +
Studio.System.getBus(
+  path,
+  bus
+);
+
+ +
+
path
+
The bus path or the ID string that identifies the bus. (UTF-8 string)
+
bus Out
+
Bus object. (Studio::Bus)
+
+

This function allows you to retrieve a handle for any bus in the global mixer.

+

path may be a path, such as bus:/SFX/Ambience, or an ID string, such as {d9982c58-a056-4e6c-b8e3-883854b4bffb}.

+

Path lookups only succeed if the strings bank is loaded.

+

See Also: Studio::System::getBusByID

+

Studio::System::getBusByID

+

Retrieves a loaded bus.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getBusByID(
+  const FMOD_GUID *id,
+  Studio::Bus **bus
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetBusByID(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_GUID *id,
+  FMOD_STUDIO_BUS **bus
+);
+
+ +
RESULT Studio.System.getBusByID(
+  Guid id,
+  out Bus bus
+);
+
+ +
Studio.System.getBusByID(
+  id,
+  bus
+);
+
+ +
+
id
+
Bus GUID. (FMOD_GUID)
+
bus Out
+
Bus object. (Studio::Bus)
+
+

This function allows you to retrieve a handle for any bus in the global mixer.

+

See Also: Studio::System::getBus

+

Studio::System::getCoreSystem

+

Retrieves the Core System.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getCoreSystem(
+  System **system
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetCoreSystem(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_SYSTEM **system
+);
+
+ +
RESULT Studio.System.getCoreSystem(
+  out FMOD.System system
+);
+
+ +
Studio.System.getCoreSystem(
+  system
+);
+
+ +
+
system Out
+
Core System object. (System)
+
+

The Core System object can be retrieved before initializing the Studio System object to call additional core configuration functions.

+

See Also: System::setFileSystem, System::setDSPBufferSize, System::setSoftwareChannels, System::setSoftwareFormat, System::setAdvancedSettings, System::setCallback

+

Studio::System::getCPUUsage

+

Retrieves the amount of CPU used for different parts of the FMOD Engine.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getCPUUsage(
+  FMOD_STUDIO_CPU_USAGE *usage,
+  FMOD_CPU_USAGE *usage_core
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetCPUUsage(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_CPU_USAGE *usage,
+  FMOD_CPU_USAGE *usage_core
+);
+
+ +
RESULT Studio.System.getCPUUsage(
+  out CPU_USAGE usage,
+  out FMOD.CPU_USAGE usage_core
+);
+
+ +
Studio.System.getCPUUsage(
+  usage,
+  usage_core
+);
+
+ +
+
usage OutOpt
+
Studio API performance information. (FMOD_STUDIO_CPU_USAGE)
+
usage_core OutOpt
+
Core API performance information. (FMOD_CPU_USAGE)
+
+

For readability, the percentage values are smoothed to provide a more stable output.

+

See Also: System::getCPUUsage

+

Studio::System::getEvent

+

Retrieves an EventDescription of an event or snapshot with the specified file path.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getEvent(
+  const char *path,
+  Studio::EventDescription **event
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetEvent(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *path,
+  FMOD_STUDIO_EVENTDESCRIPTION **event
+);
+
+ +
RESULT Studio.System.getEvent(
+  string path,
+  out EventDescription _event
+);
+
+ +
Studio.System.getEvent(
+  path,
+  event
+);
+
+ +
+
path
+
The path or the ID string that identifies the event or snapshot. (UTF-8 string)
+
event Out
+
EventDescription object. (Studio::EventDescription)
+
+

This function allows you to retrieve a handle to any loaded event description.

+

path may be a path, such as event:/UI/Cancel or snapshot:/IngamePause, or an ID string, such as {2a3e48e6-94fc-4363-9468-33d2dd4d7b00}.

+

Path lookups only succeed if the strings bank is loaded.

+

See Also: Studio::parseID, Studio::System::lookupID, Studio::System::getEventByID, Studio::EventDescription::isSnapshot, Studio::EventDescription::createInstance

+

Studio::System::getEventByID

+

Retrieves an EventDescription.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getEventByID(
+  const FMOD_GUID *id,
+  Studio::EventDescription **event
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetEventByID(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_GUID *id,
+  FMOD_STUDIO_EVENTDESCRIPTION **event
+);
+
+ +
RESULT Studio.System.getEventByID(
+  Guid id,
+  out EventDescription _event
+);
+
+ +
Studio.System.getEventByID(
+  id,
+  event
+);
+
+ +
+
id
+
The event or snapshot's GUID. (FMOD_GUID)
+
event Out
+
EventDescription object. (Studio::EventDescription)
+
+

This function allows you to retrieve a handle to any loaded event description.

+

See Also: Studio::System::getEvent

+

Studio::System::getListenerAttributes

+

Retrieves listener 3D attributes.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getListenerAttributes(
+  int listener,
+  FMOD_3D_ATTRIBUTES *attributes,
+  FMOD_VECTOR *attenuationposition = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetListenerAttributes(
+  FMOD_STUDIO_SYSTEM *system,
+  int listener,
+  FMOD_3D_ATTRIBUTES *attributes,
+  FMOD_VECTOR *attenuationposition
+);
+
+ +
RESULT Studio.System.getListenerAttributes(
+  int listener,
+  out _3D_ATTRIBUTES attributes
+);
+RESULT Studio.System.getListenerAttributes(
+  int listener,
+  out _3D_ATTRIBUTES attributes,
+  out VECTOR attenuationposition
+);
+
+ +
Studio.System.getListenerAttributes(
+  listener,
+  attributes,
+  attenuationposition
+);
+
+ +
+
listener
+
Index of listener to get 3D attributes for. Listeners are indexed from 0, to FMOD_MAX_LISTENERS - 1, in a multi-listener environment.
+
attributes Out
+
3D attributes. (FMOD_3D_ATTRIBUTES)
+
attenuationposition OutOpt
+
Position used for calculating attenuation. (FMOD_VECTOR)
+
+

See Also: Studio::EventInstance::get3DAttributes, Studio::System::getNumListeners, Studio::System::setListenerAttributes

+

Studio::System::getListenerWeight

+

Retrieves listener weighting.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getListenerWeight(
+  int listener,
+  float *weight
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetListenerWeight(
+  FMOD_STUDIO_SYSTEM *system,
+  int listener,
+  float *weight
+);
+
+ +
RESULT Studio.System.getListenerWeight(
+  int listener,
+  out float weight
+);
+
+ +
Studio.System.getListenerWeight(
+  listener,
+  weight
+);
+
+ +
+
listener
+
Listener index.
+
weight Out
+
Weighting value.
+
+

See Also: Studio::System::setListenerWeight, Studio::System::setNumListeners, Studio::System::getListenerAttributes

+

Studio::System::getMemoryUsage

+

Retrieves memory usage statistics.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getMemoryUsage(
+  FMOD_STUDIO_MEMORY_USAGE *memoryusage
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetMemoryUsage(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_MEMORY_USAGE *memoryusage
+);
+
+ +
RESULT Studio.System.getMemoryUsage(
+  out MEMORY_USAGE memoryusage
+);
+
+ +
+

Not supported for JavaScript.

+
+
+
memoryusage Out
+
Memory usage. (FMOD_STUDIO_MEMORY_USAGE)
+
+

The memory usage sampledata value for the system is the total size of non-streaming sample data currently loaded.

+

Memory usage statistics are only available in logging builds, in release builds memoryusage will contain zero for all values after calling this function.

+

Studio::System::getNumListeners

+

Retrieves the number of listeners.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getNumListeners(
+  int *numlisteners
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetNumListeners(
+  FMOD_STUDIO_SYSTEM *system,
+  int *numlisteners
+);
+
+ +
RESULT Studio.System.getNumListeners(
+  out int numlisteners
+);
+
+ +
Studio.System.getNumListeners(
+  numlisteners
+);
+
+ +
+
numlisteners Out
+
Number of listeners.
+
+

See Also: Studio::System::setNumListeners

+

Studio::System::getParameterByID

+

Retrieves a global parameter value by unique identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  float *value,
+  float *finalvalue = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterByID(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_PARAMETER_ID id,
+  float *value,
+  float *finalvalue
+);
+
+ +
RESULT Studio.System.getParameterByID(
+  PARAMETER_ID id,
+  out float value
+);
+RESULT Studio.System.getParameterByID(
+  PARAMETER_ID id,
+  out float value,
+  out float finalvalue
+);
+
+ +
Studio.System.getParameterByID(
+  id,
+  value,
+  finalvalue
+);
+
+ +
+
id
+
Parameter identifier. (FMOD_STUDIO_PARAMETER_ID)
+
value OutOpt
+
Parameter value as set from the public API.
+
finalvalue OutOpt
+
Final combined value.
+
+

finalvalue is the final value of the parameter after applying adjustments due to automation, modulation, seek speed, and parameter velocity to value. This is calculated asynchronously when the Studio system updates.

+

See Also: Studio::System::setParameterByID

+

Studio::System::getParameterByName

+

Retrieves a global parameter value by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterByName(
+  const char *name,
+  float *value,
+  float *finalvalue = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterByName(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *name,
+  float *value,
+  float *finalvalue
+);
+
+ +
RESULT Studio.System.getParameterByName(
+  string name,
+  out float value
+);
+RESULT Studio.System.getParameterByName(
+  string name,
+  out float value,
+  out float finalvalue
+);
+
+ +
Studio.System.getParameterByName(
+  name,
+  value,
+  finalvalue
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
value OutOpt
+
Parameter value as set from the public API.
+
finalvalue OutOpt
+
Final combined value.
+
+

finalvalue is the final value of the parameter after applying adjustments due to automation, modulation, seek speed, and parameter velocity to value. This is calculated asynchronously when the Studio system updates.

+

See Also: Studio::System::setParameterByName

+

Studio::System::getParameterDescriptionByID

+

Retrieves a global parameter by ID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterDescriptionByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterDescriptionByID(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_PARAMETER_ID id,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
RESULT Studio.System.getParameterDescriptionByID(
+  PARAMETER_ID id,
+  out PARAMETER_DESCRIPTION parameter
+);
+
+ +
Studio.System.getParameterDescriptionByID(
+  id,
+  parameter
+);
+
+ +
+
id
+
Parameter ID. (FMOD_STUDIO_PARAMETER_ID)
+
parameter Out
+
Parameter description. (FMOD_STUDIO_PARAMETER_DESCRIPTION)
+
+

Studio::System::getParameterDescriptionByName

+

Retrieves a global parameter by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterDescriptionByName(
+  const char *name,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterDescriptionByName(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *name,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter
+);
+
+ +
RESULT Studio.System.getParameterDescriptionByName(
+  string name,
+  out PARAMETER_DESCRIPTION parameter
+);
+
+ +
Studio.System.getParameterDescriptionByName(
+  name,
+  parameter
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
parameter Out
+
Parameter description. (FMOD_STUDIO_PARAMETER_DESCRIPTION)
+
+

name can be the short name (such as 'Wind') or the full path (such as 'parameter:/Ambience/Wind'). Path lookups only succeed if the strings bank is loaded.

+

Studio::System::getParameterDescriptionCount

+

Retrieves the number of global parameters.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterDescriptionCount(
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterDescriptionCount(
+  FMOD_STUDIO_SYSTEM *system,
+  int *count
+);
+
+ +
RESULT Studio.System.getParameterDescriptionCount(
+  out int count
+);
+
+ +
Studio.System.getParameterDescriptionCount(
+  count
+);
+
+ +
+
count Out
+
Global parameter count.
+
+

See Also: Studio::System::getParameterDescriptionList

+

Studio::System::getParameterDescriptionList

+

Retrieves a list of global parameters.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterDescriptionList(
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *array,
+  int capacity,
+  int *count
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterDescriptionList(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_PARAMETER_DESCRIPTION *array,
+  int capacity,
+  int *count
+);
+
+ +
RESULT Studio.System.getParameterDescriptionList(
+  out PARAMETER_DESCRIPTION[] array
+);
+
+ +
Studio.System.getParameterDescriptionList(
+  array,
+  capacity,
+  count
+);
+
+ +
+
array Out
+
Global parameters. (FMOD_STUDIO_PARAMETER_DESCRIPTION)
+
capacity
+
Capacity of array.
+
count Out
+
Number of parameters written to array.
+
+

See Also: Studio::System::getParameterDescriptionCount

+

Studio::System::getParameterLabelByID

+

Retrieves a global parameter label by ID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterLabelByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterLabelByID(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_PARAMETER_ID id,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.System.getParameterLabelByID(
+  PARAMETER_ID id,
+  int labelindex,
+  out string label
+);
+
+ +
Studio.System.getParameterLabelByID(
+  id,
+  labelindex,
+  label,
+  size,
+  retrieved
+);
+
+ +
+
id
+
Parameter ID. (FMOD_STUDIO_PARAMETER_ID)
+
labelindex
+
+

Label index to retrieve.

+ +
+
label Out
+
Buffer to receive the label. (UTF-8 string)
+
size
+
Size of the label buffer in bytes. Must be 0 if label is null.
+
retrieved OutOpt
+
Length of the label in bytes, including the terminating null character.
+
+

If the label is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full label.

+

Studio::System::getParameterLabelByName

+

Retrieves a global parameter label by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getParameterLabelByName(
+  const char *name,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetParameterLabelByName(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *name,
+  int labelindex,
+  char *label,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.System.getParameterLabelByName(
+  string name,
+  int labelindex,
+  out string label
+);
+
+ +
Studio.System.getParameterLabelByName(
+  name,
+  labelindex,
+  label,
+  size,
+  retrieved
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
labelindex
+
+

Label index to retrieve.

+ +
+
label Out
+
Buffer to receive the label. (UTF-8 string)
+
size
+
Size of the label buffer in bytes. Must be 0 if label is null.
+
retrieved OutOpt
+
Length of the label in bytes, including the terminating null character.
+
+

name can be the short name (such as 'Wind') or the full path (such as 'parameter:/Ambience/Wind'). Path lookups only succeed if the strings bank is loaded.

+

If the label is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full label.

+

Studio::System::getSoundInfo

+

Retrieves information for loading a sound from the audio table.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getSoundInfo(
+  const char *key,
+  FMOD_STUDIO_SOUND_INFO *info
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetSoundInfo(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *key,
+  FMOD_STUDIO_SOUND_INFO *info
+);
+
+ +
RESULT Studio.System.getSoundInfo(
+  string key,
+  out SOUND_INFO info
+);
+
+ +
Studio.System.getSoundInfo(
+  key,
+  info
+);
+
+ +
+
key
+
The key that identifies the sound. (UTF-8 string)
+
info Out
+
Sound loading information. (FMOD_STUDIO_SOUND_INFO)
+
+

The FMOD_STUDIO_SOUND_INFO structure contains information to be passed to System::createSound (which will create a parent sound), along with a subsound index to be passed to Sound::getSubSound once the parent sound is loaded.

+

The user is expected to call System::createSound with the given information. It is up to the user to combine in any desired loading flags, such as FMOD_CREATESTREAM, FMOD_CREATECOMPRESSEDSAMPLE or FMOD_NONBLOCKING with the flags in FMOD_STUDIO_SOUND_INFO::mode.

+

If the banks were loaded by Studio::System::loadBankMemory, the mode is returned as FMOD_OPENMEMORY_POINT. This won't work with the default FMOD_CREATESAMPLE mode. For in-memory banks, you should add in the FMOD_CREATECOMPRESSEDSAMPLE or FMOD_CREATESTREAM flag, or remove FMOD_OPENMEMORY_POINT and add FMOD_OPENMEMORY to decompress the sample into a new allocation.

+

Studio::System::getUserData

+

Retrieves the user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getUserData(
+  void **userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetUserData(
+  FMOD_STUDIO_SYSTEM *system,
+  void **userdata
+);
+
+ +
RESULT Studio.System.getUserData(
+  out IntPtr userdata
+);
+
+ +
Studio.System.getUserData(
+  userdata
+);
+
+ +
+
userdata Out
+
User data set by calling Studio::System::setUserData.
+
+

This function allows arbitrary user data to be retrieved from this object. See the User Data section of the glossary for an example of how to get and set user data.

+

Studio::System::getVCA

+

Retrieves a loaded VCA.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getVCA(
+  const char *path,
+  Studio::VCA **vca
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetVCA(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *path,
+  FMOD_STUDIO_VCA **vca
+);
+
+ +
RESULT Studio.System.getVCA(
+  string path,
+  out VCA vca
+);
+
+ +
Studio.System.getVCA(
+  path,
+  vca
+);
+
+ +
+
path
+
The path or the ID string that identifies the VCA. (UTF-8 string)
+
vca Out
+
VCA object. (Studio::VCA)
+
+

This function allows you to retrieve a handle for any VCA in the global mixer.

+

path may be a path, such as vca:/MyVCA, or an ID string, such as {d9982c58-a056-4e6c-b8e3-883854b4bffb}.

+

Path lookups only succeed if the strings bank is loaded.

+

See Also: Studio::System::getVCAByID

+

Studio::System::getVCAByID

+

Retrieves a loaded VCA.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::getVCAByID(
+  const FMOD_GUID *id,
+  Studio::VCA **vca
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_GetVCAByID(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_GUID *id,
+  FMOD_STUDIO_VCA **vca
+);
+
+ +
RESULT Studio.System.getVCAByID(
+  Guid id,
+  out VCA vca
+);
+
+ +
Studio.System.getVCAByID(
+  id,
+  vca
+);
+
+ +
+
id
+
VCA GUID. (FMOD_GUID)
+
vca Out
+
VCA object. (Studio::VCA)
+
+

This function allows you to retrieve a handle for any VCA in the global mixer.

+

See Also: Studio::System::getVCA

+

Studio::System::initialize

+

Initializes the Studio System.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::initialize(
+  int maxchannels,
+  FMOD_STUDIO_INITFLAGS studioflags,
+  FMOD_INITFLAGS flags,
+  void *extradriverdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_Initialize(
+  FMOD_STUDIO_SYSTEM *system,
+  int maxchannels,
+  FMOD_STUDIO_INITFLAGS studioflags,
+  FMOD_INITFLAGS flags,
+  void *extradriverdata
+);
+
+ +
RESULT Studio.System.initialize(
+  int maxchannels,
+  INITFLAGS studioflags,
+  FMOD.INITFLAGS flags,
+  IntPtr extradriverdata
+);
+
+ +
Studio.System.initialize(
+  maxchannels,
+  studioflags,
+  flags,
+  extradriverdata
+);
+
+ +
+
maxchannels
+
The maximum number of Channels, including both virtual and real, to be used in FMOD.
+
studioflags
+
Studio system initialization flags. (FMOD_STUDIO_INITFLAGS)
+
flags
+
Core system initialization flags. (FMOD_INITFLAGS)
+
extradriverdata Opt
+
Driver specific data to be passed to the output plug-in.
+
+

The core system used by the studio system is initialized at the same time as the studio system.

+

The flags and extradriverdata parameters are passed to System::init to initialize the core.

+

See Also: Creating the Studio System

+

Studio::System::isValid

+

Checks that the System reference is valid and has been initialized.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
bool Studio::System::isValid()
+
+ +
bool FMOD_Studio_System_IsValid(FMOD_STUDIO_SYSTEM *system)
+
+ +
bool Studio.System.isValid()
+
+ +
Studio.System.isValid()
+
+ +

Studio::System::loadBankCustom

+

Loads the metadata of a bank using custom read callbacks.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::loadBankCustom(
+  const FMOD_STUDIO_BANK_INFO *info,
+  FMOD_STUDIO_LOAD_BANK_FLAGS flags,
+  Studio::Bank **bank
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_LoadBankCustom(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_STUDIO_BANK_INFO *info,
+  FMOD_STUDIO_LOAD_BANK_FLAGS flags,
+  FMOD_STUDIO_BANK **bank
+);
+
+ +
RESULT Studio.System.loadBankCustom(
+  BANK_INFO info,
+  LOAD_BANK_FLAGS flags,
+  out Bank bank
+);
+
+ +
Studio.System.loadBankCustom(
+  info,
+  flags,
+  bank
+);
+
+ +
+
info
+
Information for loading the bank. (FMOD_STUDIO_BANK_INFO)
+
flags
+
Flags to control bank loading. (FMOD_STUDIO_LOAD_BANK_FLAGS)
+
bank Out
+
Bank object. (Studio::Bank)
+
+

Sample data must be loaded separately see Sample Data Loading for details.

+

By default this function blocks until the load finishes, and returns the FMOD_RESULT to indicate the result. If the load fails then bank contains NULL.

+

Using the FMOD_STUDIO_LOAD_BANK_NONBLOCKING flag causes the bank to be loaded asynchronously. In that case, this function always returns FMOD_OK and bank contains a valid bank handle. Load errors for asynchronous banks can be detected by calling Studio::Bank::getLoadingState. Failed asynchronous banks should be released by calling Studio::Bank::unload.

+

If info.userdata is set but info.userdatalength is zero, info.userdata must remain valid until the bank is unloaded and each call to info.opencallback is matched by a call to info.closecallback. This requirement allows playback of shared streaming assets to continue after a bank is unloaded.

+

If a bank is split, separating out sample data and optionally streams from the metadata bank, all parts must be loaded before any APIs that use the data are called. We recommend you load each part one after another (the order in which they are loaded is not important), then proceed with dependent API calls such as Studio::Bank::loadSampleData or Studio::System::getEvent.

+

See Also: Studio::System::loadBankFile, Studio::System::loadBankMemory

+

Studio::System::loadBankFile

+

Loads the metadata of a bank. This does not load the bank's sample data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::loadBankFile(
+  const char *filename,
+  FMOD_STUDIO_LOAD_BANK_FLAGS flags,
+  Studio::Bank **bank
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_LoadBankFile(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *filename,
+  FMOD_STUDIO_LOAD_BANK_FLAGS flags,
+  FMOD_STUDIO_BANK **bank
+);
+
+ +
RESULT Studio.System.loadBankFile(
+  string filename,
+  LOAD_BANK_FLAGS flags,
+  out Bank bank
+);
+
+ +
Studio.System.loadBankFile(
+  filename,
+  flags,
+  bank
+);
+
+ +
+
filename
+
Name of the file on disk. (UTF-8 string)
+
flags
+
Flags to control bank loading. (FMOD_STUDIO_LOAD_BANK_FLAGS)
+
bank Out
+
Bank object. (Studio::Bank)
+
+

Sample data must be loaded separately see Sample Data Loading for details.

+

By default this function blocks until the file load finishes and returns the FMOD_RESULT to indicate the result. If the load fails, then bank contains NULL.

+

Using the FMOD_STUDIO_LOAD_BANK_NONBLOCKING flag causes the bank to be loaded asynchronously. In that case, this function returns FMOD_OK and bank contains a valid bank handle. Load errors for asynchronous banks can be detected by calling Studio::Bank::getLoadingState. Failed asynchronous banks should be released by calling Studio::Bank::unload.

+

If a bank is split, separating out sample data, metadata, and optionally streams into separate .bank files, all parts of the bank must be loaded before any APIs that use the data are called. We recommend you load each part one after another (the order is not important), then proceed with dependent API calls such as Studio::Bank::loadSampleData or Studio::System::getEvent.

+

See Also: Studio::System::loadBankCustom, Studio::System::loadBankMemory

+

Studio::System::loadBankMemory

+

Loads the metadata of a bank from memory. Does not load the bank's sample data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::loadBankMemory(
+  const char *buffer,
+  int length,
+  FMOD_STUDIO_LOAD_MEMORY_MODE mode,
+  FMOD_STUDIO_LOAD_BANK_FLAGS flags,
+  Studio::Bank **bank
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_LoadBankMemory(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *buffer,
+  int length,
+  FMOD_STUDIO_LOAD_MEMORY_MODE mode,
+  FMOD_STUDIO_LOAD_BANK_FLAGS flags,
+  FMOD_STUDIO_BANK **bank
+);
+
+ +
RESULT Studio.System.loadBankMemory(
+  byte[] buffer,
+  LOAD_BANK_FLAGS flags,
+  out Bank bank
+);
+
+ +
Studio.System.loadBankMemory(
+  buffer,
+  length,
+  mode,
+  flags,
+  bank
+);
+
+ +
+
buffer
+
The memory buffer.
+
length
+
The length of the memory buffer.
+
mode
+
The loading mode to use. (FMOD_STUDIO_LOAD_MEMORY_MODE)
+
flags
+
Flags to control bank loading. (FMOD_STUDIO_LOAD_BANK_FLAGS)
+
bank Out
+
The bank object. (Studio::Bank)
+
+

Sample data must be loaded separately. See the Sample Data Loading section of the Studio API Guide chapter for details.

+

When mode is FMOD_STUDIO_LOAD_MEMORY, the FMOD Engine allocates an internal buffer and copies the data from the passed-in buffer before using it. When used in this mode, there are no alignment restrictions on buffer, and the memory pointed to by buffer may be cleaned up at any time after this function returns.

+

When mode is FMOD_STUDIO_LOAD_MEMORY_POINT, the FMOD Engine uses the passed memory buffer directly. When using this mode, the buffer must be aligned to FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT and the memory must persist until the bank is fully unloaded, which may not happen until some time after calling Studio::Bank::unload. You can ensure the memory is not being freed prematurely by only freeing it after receiving the FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD callback.

+

By default this function blocks until the load finishes and returns the FMOD_RESULT to indicate the result. If the load fails, bank contains NULL.

+

Using the FMOD_STUDIO_LOAD_BANK_NONBLOCKING flag causes the bank to be loaded asynchronously. In that case, this function always returns FMOD_OK and bank contains a valid bank handle. Load errors for asynchronous banks can be detected by calling Studio::Bank::getLoadingState. Failed asynchronous banks should be released by calling Studio::Bank::unload.

+

This function is not compatible with FMOD_STUDIO_ADVANCEDSETTINGS::encryptionkey, using them together will cause an error to be returned.

+

If a bank is split, separating out sample data, metadata, and optionally streams into separate .bank files, all parts of the bank must be loaded before any APIs that use the data are called. We recommend you load each part one after another (the order is not important), then proceed with dependent API calls such as Studio::Bank::loadSampleData or Studio::System::getEvent.

+

See Also: Studio::System::loadBankFile, Studio::System::loadBankCustom, Studio::System::setCallback

+

Studio::System::loadCommandReplay

+

Load a command replay.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::loadCommandReplay(
+  const char *filename,
+  FMOD_STUDIO_COMMANDREPLAY_FLAGS flags,
+  Studio::CommandReplay **replay
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_LoadCommandReplay(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *filename,
+  FMOD_STUDIO_COMMANDREPLAY_FLAGS flags,
+  FMOD_STUDIO_COMMANDREPLAY **replay
+);
+
+ +
RESULT Studio.System.loadCommandReplay(
+  string filename,
+  COMMANDREPLAY_FLAGS flags,
+  out Studio.CommandReplay replay
+);
+
+ +
Studio.System.loadCommandReplay(
+  filename,
+  flags,
+  replay
+);
+
+ +
+
filename
+
The name of the file from which to load the command replay. (UTF-8 string)
+
flags
+
Flags that control the command replay. (FMOD_STUDIO_COMMANDREPLAY_FLAGS)
+
replay Out
+
Command replay. (Studio::CommandReplay)
+
+

See Also: Studio::System::startCommandCapture, Studio::System::stopCommandCapture, Studio::CommandReplay::start, Studio::CommandReplay::stop, Studio::CommandReplay::release

+

Studio::System::lookupID

+

Retrieves the ID for a bank, event, snapshot, bus or VCA.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::lookupID(
+  const char *path,
+  FMOD_GUID *id
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_LookupID(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *path,
+  FMOD_GUID *id
+);
+
+ +
RESULT Studio.System.lookupID(
+  string path,
+  out Guid id
+);
+
+ +
Studio.System.lookupID(
+  path,
+  id
+);
+
+ +
+
path
+
Path. (UTF-8 string)
+
id Out
+
GUID. (FMOD_GUID)
+
+

The strings bank must be loaded prior to calling this function, otherwise FMOD_ERR_EVENT_NOTFOUND is returned.

+

The path can be copied to the system clipboard from FMOD Studio by using the "Copy Path" context menu command.

+

See Also: Studio::System::lookupPath

+

Studio::System::lookupPath

+

Retrieves the path for a bank, event, snapshot, bus or VCA.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::lookupPath(
+  const FMOD_GUID *id,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_LookupPath(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_GUID *id,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.System.lookupPath(
+  Guid id,
+  out string path
+);
+
+ +
Studio.System.lookupPath(
+  id,
+  path,
+  size,
+  retrieved
+);
+
+ +
+
id
+
The GUID. (FMOD_GUID)
+
path OutOpt
+
The buffer to receive the path. (UTF-8 string)
+
size
+
The size of the path buffer in bytes. Must be 0 if path is null.
+
retrieved OutOpt
+
The length of the path in bytes, including the terminating null character.
+
+

The strings bank must be loaded prior to calling this function, otherwise FMOD_ERR_EVENT_NOTFOUND is returned.

+

If the path is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full path.

+

See Also: Studio::System::lookupID

+

Studio::System::registerPlugin

+

Registers a DSP plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::registerPlugin(
+  const FMOD_DSP_DESCRIPTION *description
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_RegisterPlugin(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_DSP_DESCRIPTION *description
+);
+
+ +
Studio.System.registerPlugin(
+  description
+);
+
+ +
+

Not supported for C#.

+
+
+
description
+
The description of the DSP. (FMOD_DSP_DESCRIPTION)
+
+

DSP plug-ins used by an event must be registered using this function before loading the bank containing the event.

+

See Also: Studio::System::unregisterPlugin

+

Studio::System::release

+

Shut down and free the Studio System object.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::release();
+
+ +
FMOD_RESULT FMOD_Studio_System_Release(FMOD_STUDIO_SYSTEM *system);
+
+ +
RESULT Studio.System.release();
+
+ +
Studio.System.release();
+
+ +

This function will free the memory used by the Studio System object and everything created under it.

+

Studio::System::create and Studio::System::release are not thread-safe. Calling either of these functions concurrently with any Studio API function (including these two functions) may cause undefined behavior. External synchronization must be used if calls to Studio::System::create or Studio::System::release could overlap other Studio API calls. All other Studio API functions are thread safe and may be called freely from any thread unless otherwise documented.

+

All handles or pointers to objects associated with a Studio System object become invalid when the Studio System object is released. The Studio API attempts to protect against stale handles and pointers being used with a different Studio System object but this protection cannot be guaranteed and attempting to use stale handles or pointers may cause undefined behavior.

+

See Also: Creating the Studio System

+

Studio::System::resetBufferUsage

+

Resets memory buffer usage statistics.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::resetBufferUsage();
+
+ +
FMOD_RESULT FMOD_Studio_System_ResetBufferUsage(FMOD_STUDIO_SYSTEM *system);
+
+ +
RESULT Studio.System.resetBufferUsage();
+
+ +
Studio.System.resetBufferUsage();
+
+ +

This function resets the buffer usage data tracked by the Studio system.

+

See Also: FMOD_STUDIO_BUFFER_USAGE, Studio::System::getBufferUsage

+

Studio::System::setAdvancedSettings

+

Sets advanced settings.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setAdvancedSettings(
+  FMOD_STUDIO_ADVANCEDSETTINGS *settings
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetAdvancedSettings(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_ADVANCEDSETTINGS *settings
+);
+
+ +
RESULT Studio.System.setAdvancedSettings(
+  ADVANCEDSETTINGS settings
+);
+
+RESULT Studio.System.setAdvancedSettings(
+  ADVANCEDSETTINGS settings,
+  String encryptionkey
+);
+
+ +
Studio.System.setAdvancedSettings(
+  settings
+);
+
+ +
+
settings
+
The Studio system's advanced settings. (FMOD_STUDIO_ADVANCEDSETTINGS)
+
encryptionkey C#
+
The key for loading sounds from encrypted banks. (UTF-8 string)
+
+

This function must be called prior to Studio system initialization.

+
+

Use the overloaded function to provide a C# string rather than directly setting ADVANCEDSETTINGS.encryptionkey.

+
+

See Also: Studio::System::getAdvancedSettings, Studio::System::initialize

+

Studio::System::setCallback

+

Sets a callback for the Studio System.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setCallback(
+  FMOD_STUDIO_SYSTEM_CALLBACK callback,
+  FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_STUDIO_SYSTEM_CALLBACK_ALL
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetCallback(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_SYSTEM_CALLBACK callback,
+  FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask
+);
+
+ +
RESULT Studio.System.setCallback(
+  SYSTEM_CALLBACK callback,
+  SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL
+);
+
+ +
Studio.System.setCallback(
+  callback,
+  callbackmask
+);
+
+ +
+
callback
+
System callback function. (FMOD_STUDIO_SYSTEM_CALLBACK)
+
callbackmask
+
A bitfield specifying which callback types are required. Defaults to FMOD_STUDIO_SYSTEM_CALLBACK_ALL. (FMOD_STUDIO_SYSTEM_CALLBACK_TYPE)
+
+

The system callback function is called for a variety of reasons, use the callbackmask to choose which callbacks you are interested in.

+

Callbacks are called from the Studio Update Thread in default / async mode and the main (calling) thread in synchronous mode. See the FMOD_STUDIO_SYSTEM_CALLBACK_TYPE for details.

+

See Also: Callback Behavior, Studio::System::setUserData

+

Studio::System::setListenerAttributes

+

Sets the 3D attributes of the listener.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setListenerAttributes(
+  int listener,
+  const FMOD_3D_ATTRIBUTES *attributes,
+  const FMOD_VECTOR *attenuationposition = nullptr
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetListenerAttributes(
+  FMOD_STUDIO_SYSTEM *system,
+  int listener,
+  const FMOD_3D_ATTRIBUTES *attributes,
+  const FMOD_VECTOR *attenuationposition
+);
+
+ +
RESULT Studio.System.setListenerAttributes(
+  int listener,
+  _3D_ATTRIBUTES attributes
+);
+RESULT Studio.System.setListenerAttributes(
+  int listener,
+  _3D_ATTRIBUTES attributes,
+  VECTOR attenuationposition
+);
+
+ +
Studio.System.setListenerAttributes(
+  listener,
+  attributes,
+  attenuationposition
+);
+
+ +
+
listener
+
Index of listener to set 3D attributes on. Listeners are indexed from 0, to FMOD_MAX_LISTENERS - 1, in a multi-listener environment.
+
attributes
+
3D attributes. (FMOD_3D_ATTRIBUTES)
+
attenuationposition Opt
+
Position used for calculating attenuation. (FMOD_VECTOR)
+
+

Passing NULL for attenuationposition will result in the listener only using the position in attributes.

+

See Also: Studio::System::getListenerAttributes

+

Studio::System::setListenerWeight

+

Sets the listener weighting.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setListenerWeight(
+  int listener,
+  float weight
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetListenerWeight(
+  FMOD_STUDIO_SYSTEM *system,
+  int listener,
+  float weight
+);
+
+ +
RESULT Studio.System.setListenerWeight(
+  int listener,
+  float weight
+);
+
+ +
Studio.System.setListenerWeight(
+  listener,
+  weight
+);
+
+ +
+
listener
+
Listener index.
+
weight
+
+

Weighting value.

+
    +
  • Range: [0, 1]
  • +
  • Default: 1
  • +
+
+
+

Listener weighting is a factor which determines how much the listener influences the mix. It is taken into account for 3D panning, doppler, and the automatic distance event parameter. A listener with a weight of 0 has no effect on the mix.

+

Listener weighting can be used to fade in and out multiple listeners. For example to do a crossfade, an additional listener can be created with a weighting of 0 that ramps up to 1 while the old listener weight is ramped down to 0. After the crossfade is finished the number of listeners can be reduced to 1 again.

+

The sum of all the listener weights should add up to at least 1. It is a user error to set all listener weights to 0.

+

See Also: Studio::System::getListenerWeight, Studio::System::setNumListeners

+

Studio::System::setNumListeners

+

Sets the number of listeners in the 3D sound scene.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setNumListeners(
+  int numlisteners
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetNumListeners(
+  FMOD_STUDIO_SYSTEM *system,
+  int numlisteners
+);
+
+ +
RESULT Studio.System.setNumListeners(
+  int numlisteners
+);
+
+ +
Studio.System.setNumListeners(
+  numlisteners
+);
+
+ +
+
numlisteners
+
+

Number of listeners.

+ +
+
+

If the number of listeners is set to more than 1 then FMOD uses a 'closest sound to the listener' method to determine what should be heard.

+

See the Studio 3D Events white paper for more information.

+

See Also: Studio::System::getNumListeners, Studio::System::setListenerAttributes, Studio::System::setListenerWeight

+

Studio::System::setParameterByID

+

Sets a global parameter value by unique identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setParameterByID(
+  FMOD_STUDIO_PARAMETER_ID id,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetParameterByID(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_PARAMETER_ID id,
+  float value,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.System.setParameterByID(
+  PARAMETER_ID id,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.System.setParameterByID(
+  id,
+  value,
+  ignoreseekspeed
+);
+
+ +
+
id
+
Parameter identifier. (FMOD_STUDIO_PARAMETER_ID)
+
value
+
Value for given identifier.
+
ignoreseekspeed
+
+

Specifies whether to ignore the parameter's seek speed and set the value immediately.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Studio::System::setParameterByName, Studio::System::setParametersByIDs, Studio::System::getParameterByID, Studio::System::getParameterByName

+

Studio::System::setParameterByIDWithLabel

+

Sets a global parameter value by unique identifier, looking up the value label.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setParameterByIDWithLabel(
+  FMOD_STUDIO_PARAMETER_ID id,
+  const char *label,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetParameterByIDWithLabel(
+  FMOD_STUDIO_SYSTEM *system,
+  FMOD_STUDIO_PARAMETER_ID id,
+  const char *label,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.System.setParameterByIDWithLabel(
+  PARAMETER_ID id,
+  string label,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.System.setParameterByIDWithLabel(
+  id,
+  label,
+  ignoreseekspeed
+);
+
+ +
+
id
+
Parameter identifier. (FMOD_STUDIO_PARAMETER_ID)
+
label
+
Labeled value for given identifier.
+
ignoreseekspeed
+
Specifies whether to ignore the parameter's seek speed and set the value immediately.
+
+

If the specified label is not found, FMOD_ERR_EVENT_NOTFOUND is returned. This lookup is case sensitive.

+

See Also: Studio::System::setParameterByName, Studio::System::setParametersByIDs, Studio::System::getParameterByID, Studio::System::getParameterByName

+

Studio::System::setParameterByName

+

Sets a global parameter value by name, including the path if needed.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setParameterByName(
+  const char *name,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetParameterByName(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *name,
+  float value,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.System.setParameterByName(
+  string name,
+  float value,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.System.setParameterByName(
+  name,
+  value,
+  ignoreseekspeed
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
value
+
Value for given name.
+
ignoreseekspeed
+
+

Specifies whether to ignore the parameter's seek speed and set the value immediately.

+
    +
  • Units: Boolean
  • +
+
+
+

See Also: Studio::System::setParameterByID, Studio::System::setParametersByIDs, Studio::System::getParameterByID, Studio::System::getParameterByName

+

Studio::System::setParameterByNameWithLabel

+

Sets a global parameter value by name, including the path if needed, looking up the value label.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setParameterByNameWithLabel(
+  const char *name,
+  const char *label,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetParameterByNameWithLabel(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *name,
+  const char *label,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.System.setParameterByNameWithLabel(
+  string name,
+  string label,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.System.setParameterByNameWithLabel(
+  name,
+  label,
+  ignoreseekspeed
+);
+
+ +
+
name
+
Parameter name, including the path if needed (case-insensitive). (UTF-8 string)
+
label
+
Labeled value for given name.
+
ignoreseekspeed
+
Specifies whether to ignore the parameter's seek speed and set the value immediately.
+
+

If the specified label is not found, FMOD_ERR_EVENT_NOTFOUND is returned. This lookup is case sensitive.

+

See Also: Studio::System::setParameterByID, Studio::System::setParametersByIDs, Studio::System::getParameterByID, Studio::System::getParameterByName

+

Studio::System::setParametersByIDs

+

Sets multiple global parameter values by unique identifier.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setParametersByIDs(
+  const FMOD_STUDIO_PARAMETER_ID *ids,
+  float *values,
+  int count,
+  bool ignoreseekspeed = false
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetParametersByIDs(
+  FMOD_STUDIO_SYSTEM *system,
+  const FMOD_STUDIO_PARAMETER_ID *ids,
+  float *values,
+  int count,
+  FMOD_BOOL ignoreseekspeed
+);
+
+ +
RESULT Studio.System.setParametersByIDs(
+  PARAMETER_ID[] ids,
+  float[] values,
+  int count,
+  bool ignoreseekspeed = false
+);
+
+ +
Studio.System.setParametersByIDs(
+  ids,
+  values,
+  count,
+  ignoreseekspeed
+);
+
+ +
+
ids
+
Array of parameter identifiers. (FMOD_STUDIO_PARAMETER_ID)
+
values
+
Array of values for each given identifier.
+
count
+
+

Number of items in the given arrays.

+
    +
  • Range: [1, 32]
  • +
+
+
ignoreseekspeed
+
+

Specifies whether to ignore the parameter's seek speed and set the value immediately.

+
    +
  • Units: Boolean
  • +
+
+
+

If any ID is set to all zeroes then the corresponding value will be ignored.

+

See Also: Studio::System::setParameterByID, Studio::System::setParameterByName, Studio::System::getParameterByID, Studio::System::getParameterByName

+

Studio::System::setUserData

+

Sets the user data.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::setUserData(
+  void *userdata
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_SetUserData(
+  FMOD_STUDIO_SYSTEM *system,
+  void *userdata
+);
+
+ +
RESULT Studio.System.setUserData(
+  IntPtr userdata
+);
+
+ +
Studio.System.setUserData(
+  userdata
+);
+
+ +
+
userdata
+
User data to store within the system.
+
+

This function allows arbitrary user data to be attached to this object, which wll be passed through the userdata parameter in any FMOD_STUDIO_SYSTEM_CALLBACKs. See the User Data section of the glossary for an example of how to get and set user data.

+

See Also: Studio::System::getUserData, Studio::System::setCallback

+

Studio::System::startCommandCapture

+

Start recording Studio API commands to a file.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::startCommandCapture(
+  const char *filename,
+  FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_StartCommandCapture(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *filename,
+  FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags
+);
+
+ +
RESULT Studio.System.startCommandCapture(
+  string filename,
+  COMMANDCAPTURE_FLAGS flags
+);
+
+ +
Studio.System.startCommandCapture(
+  filename,
+  flags
+);
+
+ +
+
filename
+
The name of the file to which the recorded commands are to be written. (UTF-8 string)
+
flags
+
Flags that control command capturing. (FMOD_STUDIO_COMMANDCAPTURE_FLAGS)
+
+

Commands generated by the Studio API can be captured and later replayed for debugging and profiling purposes.

+

Unless the FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE flag is specified, the command capture first records the set of all banks and event instances that currently exist.

+

See Also: Studio::System::stopCommandCapture, Studio::System::loadCommandReplay

+

Studio::System::stopCommandCapture

+

Stop recording Studio API commands.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::stopCommandCapture();
+
+ +
FMOD_RESULT FMOD_Studio_System_StopCommandCapture(FMOD_STUDIO_SYSTEM *system);
+
+ +
RESULT Studio.System.stopCommandCapture();
+
+ +
Studio.System.stopCommandCapture();
+
+ +

See Also: Studio::System::startCommandCapture, Studio::System::loadCommandReplay

+

Studio::System::unloadAll

+

Unloads all currently loaded banks.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::unloadAll();
+
+ +
FMOD_RESULT FMOD_Studio_System_UnloadAll(FMOD_STUDIO_SYSTEM *system);
+
+ +
RESULT Studio.System.unloadAll();
+
+ +
Studio.System.unloadAll();
+
+ +

See Also: Studio::System::loadBankFile, Studio::System::loadBankMemory, Studio::System::loadBankCustom

+

Studio::System::unregisterPlugin

+

Unregisters a DSP plug-in.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::unregisterPlugin(
+  const char *name
+);
+
+ +
FMOD_RESULT FMOD_Studio_System_UnregisterPlugin(
+  FMOD_STUDIO_SYSTEM *system,
+  const char *name
+);
+
+ +
Studio.System.unregisterPlugin(
+  name
+);
+
+ +
+

Not supported for C#.

+
+
+
name
+
The name of the DSP. This must match the description passed to Studio::System::registerPlugin.
+
+

See Also: Studio::System::registerPlugin

+

Studio::System::update

+

Update the studio system.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::System::update();
+
+ +
FMOD_RESULT FMOD_Studio_System_Update(FMOD_STUDIO_SYSTEM *system);
+
+ +
RESULT Studio.System.update();
+
+ +
Studio.System.update();
+
+ +

When Studio is initialized in the default asynchronous processing mode this function submits all buffered commands for execution on the Studio Update thread for asynchronous processing. This is a fast operation since the commands are not processed on the calling thread. If Studio is initialized with FMOD_STUDIO_INIT_DEFERRED_CALLBACKS then any deferred callbacks fired during any asynchronous updates since the last call to this function will be called. If an error occurred during any asynchronous updates since the last call to this function then this function will return the error result.

+

When Studio is initialized with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE queued commands will be processed immediately when calling this function, the scheduling and update logic for the Studio system are executed and all callbacks are fired. This may block the calling thread for a substantial amount of time.

+

See Also: Studio System Processing

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-vca.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-vca.html new file mode 100644 index 0000000..5d030f8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api-vca.html @@ -0,0 +1,243 @@ + + +Studio API Reference | Studio::VCA + + + + +
+ +
+

6. Studio API Reference | Studio::VCA

+

Represents a global mixer VCA.

+

Volume:

+ +

General:

+ +

See Also:

+ +

Studio::VCA::getID

+

Retrieves the VCA's GUID.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::VCA::getID(
+  FMOD_GUID *id
+);
+
+ +
FMOD_RESULT FMOD_Studio_VCA_GetID(
+  FMOD_STUDIO_VCA *vca,
+  FMOD_GUID *id
+);
+
+ +
RESULT Studio.VCA.getID(
+  out Guid id
+);
+
+ +
Studio.VCA.getID(
+  id
+);
+
+ +
+
id Out
+
VCA GUID. (FMOD_GUID)
+
+

Studio::VCA::getPath

+

Retrieves the path.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::VCA::getPath(
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
FMOD_RESULT FMOD_Studio_VCA_GetPath(
+  FMOD_STUDIO_VCA *vca,
+  char *path,
+  int size,
+  int *retrieved
+);
+
+ +
RESULT Studio.VCA.getPath(
+  out string path
+);
+
+ +
Studio.VCA.getPath(
+  path,
+  size,
+  retrieved
+);
+
+ +
+
path OutOpt
+
Buffer to receive the path. (UTF-8 string)
+
size
+
Size of the path buffer in bytes. Must be 0 if path is null.
+
retrieved OutOpt
+
Length of the path in bytes, including the terminating null character.
+
+

The strings bank must be loaded prior to calling this function, otherwise FMOD_ERR_EVENT_NOTFOUND is returned.

+

If the path is longer than size then it is truncated and this function returns FMOD_ERR_TRUNCATED.

+

The retrieved parameter can be used to get the buffer size required to hold the full path.

+

Studio::VCA::getVolume

+

Retrieves the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::VCA::getVolume(
+  float *volume,
+  float *finalvolume = 0
+);
+
+ +
FMOD_RESULT FMOD_Studio_VCA_GetVolume(
+  FMOD_STUDIO_VCA *vca,
+  float *volume,
+  float *finalvolume
+);
+
+ +
RESULT Studio.VCA.getVolume(
+  out float volume
+);
+RESULT Studio.VCA.getVolume(
+  out float volume,
+  out float finalvolume
+);
+
+ +
Studio.VCA.getVolume(
+  volume,
+  finalvolume
+);
+
+ +
+
volume OutOpt
+
Volume set by Studio::VCA::setVolume.
+
finalvolume OutOpt
+
Final combined volume.
+
+

The final combined volume returned in finalvolume combines the user value set using Studio::VCA::setVolume with the result of any automation or modulation applied to the VCA. The final combined volume is calculated asynchronously when the Studio system updates.

+

Studio::VCA::isValid

+

Checks that the VCA reference is valid.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
bool Studio::VCA::isValid()
+
+ +
bool FMOD_Studio_VCA_IsValid(FMOD_STUDIO_VCA *vca)
+
+ +
bool Studio.VCA.isValid()
+
+ +
Studio.VCA.isValid()
+
+ +

Studio::VCA::setVolume

+

Sets the volume level.

+

+

+
C
+
C++
+
C#
+
JS
+
+

+
FMOD_RESULT Studio::VCA::setVolume(
+  float volume
+);
+
+ +
FMOD_RESULT FMOD_Studio_VCA_SetVolume(
+  FMOD_STUDIO_VCA *vca,
+  float volume
+);
+
+ +
RESULT Studio.VCA.setVolume(
+  float volume
+);
+
+ +
Studio.VCA.setVolume(
+  volume
+);
+
+ +
+
volume
+
+

Volume level. Negative level inverts the signal.

+
    +
  • Units: Linear
  • +
  • Range: (-inf, inf)
  • +
  • Default: 1
  • +
+
+
+

The VCA volume level is used to linearly modulate the levels of the buses and VCAs which it controls.

+

See Also: Studio::VCA::getVolume

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api.html new file mode 100644 index 0000000..5e71a20 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-api.html @@ -0,0 +1,42 @@ + + +Studio API Reference + + + + + diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-guide.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-guide.html new file mode 100644 index 0000000..1adbcbc --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/studio-guide.html @@ -0,0 +1,270 @@ + + +Studio API Guide + + + + +
+ +
+

2. Studio API Guide

+

2.1 What is the Studio API?

+

The Studio API lets you to interact with the data driven projects created in FMOD Studio at run time. It is built on top of the Core API and provides additional functionality to what the Core API provides.

+

Studio API wrappers are available for C, C++ and C# as fmod_studio.h, fmod_studio.hpp and fmod_studio.cs respectively. Any includes and libraries required by the Core API are also required for the Studio API.

+

2.2 Getting Started

+

At the most basic level, this is achieved by creating the Studio::System object and calling Studio::System::initialize on it. You need to do this once when your game starts before you can use the FMOD Engine. Once the system is initialized, you can start loading banks and creating event instances without having to do any other preparations. A more detailed description of initialization can be found in the FMOD Getting Started white paper.

+

If using the C# wrapper, you must call a Core API function before calling anything else in the Studio API. This is because some runtimes do not perform dependency loading, and because the Studio API depends on the Core API, fmod.dll needs to be loaded before fmod_studio.dll. Calling a Core API function before Studio::System::create ensures that fmod.dll is loaded before fmod_studio.dll.

+

2.3 Creating the Studio System

+

Instances of Studio::System must be created by calling Studio::System::create. Once created an instance must be initialized with a call to Studio::System::initialize before it can be used. Studio::System::create also creates an FMOD System instance which can be retrieved using Studio::System::getCoreSystem.

+

Pre-initialization configuration of both the Studio System and the Core System may be performed prior to calling Studio::System::initialize:

+
    +
  • Studio::System::setAdvancedSettings can be called to configure various advanced settings.
  • +
  • System::setSoftwareFormat should be called on the Core System object with speakermode corresponding to the project's output format if there is a possibility of the output audio device not matching the project's format. Any differences between the project format and the Core System's speakermode will cause the mix to be incorrect.
  • +
+

The Studio System is shut down and released by calling Studio::System::release, make sure to call this before your game is exited.

+

2.4 Studio System Processing

+

FMOD Studio is built on a multithreaded processing model, in which API calls on a game thread try to be fast by only reading and writing shadow data or enqueuing commands to a buffer, while a separate Studio update thread triggered by the mixer asynchronously processes the API commands and performs all the logic required by event playback and automation.

+

When running in this default asynchronous processing mode, calling Studio::System::update from your game is a fast operation which submits the queued command buffer to the asynchronous thread and performs any asynchronous callbacks due to processing on the Studio update thread.

+

Studio may also be initialized in synchronous mode with the FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE flag. When operating in synchronous mode, API calls behave the same but all the processing of queued commands and event playback and automation is performed when your game calls Studio::System::update.

+

If you do not call Studio::System::update then previous commands will not be executed. While most of the API hides this behavior with use of shadowed variables, it can cause unexpected results if waiting in a loop for Studio::EventDescription::getSampleLoadingState or Studio::Bank::getLoadingState without calling update first.

+

2.5 Bank Layout

+

By default, a bank file created in FMOD Studio contains both event metadata and sound sample data.

+

Studio Bank Layout

+

Loading a bank loads all its metadata. A bank's metadata contains information about all the events, parameters, and other data other than sample data needed by the events in that bank.

+

Sound sample data comes in two different types: Normal sample data, and streaming sample data. Normal sample data can be loaded in advance of playback on a per-event basis. Streaming data is streamed in on demand as events are played, and is never fully loaded ahead of time. Whether sample data is streamed or not is set by the sound designer in FMOD Studio, and cannot be changed at runtime. For guidance on which sample data should be set to stream, see the Streaming section of the Core API Guide chapter.

+

2.5.1 Strings Bank

+

The strings bank is a special bank which contains the string lookup of event path to GUID. The strings bank functions identically to a normal bank, except that it never contains sample data or streaming sample data.

+

2.5.2 Master Bank

+

Master banks contain the global mixer and are required for creating instances of events, regardless of which bank the event's metadata and sample data exist in. At least one master bank should remain loaded at all times.

+

2.5.3 Bank Separation

+

While banks normally contain both sample data and metadata, FMOD Studio also allows for metadata and sample data to be built to separate banks. This is commonly done to lower patch size when patching a project with updated banks, as separating sample data and metadata means that it is possible to update a bank's metadata without updating its sample data, or vice versa.

+

2.5.4 Referenced Events

+

FMOD Studio optionally allows referenced events to not be automatically included in the same banks as the events by which they are referenced. If this is the case, a referenced event may be assigned to a different bank than the event or events that reference it.

+

2.6 Bank Loading

+

Banks are loaded by calling Studio::System::loadBankFile. They are unloaded by Studio::Bank::unload.

+

Bank loading can be controlled with the FMOD_STUDIO_LOAD_BANK_FLAGS. When loading banks with FMOD_STUDIO_LOAD_BANK_NORMAL, the function does not return until the bank is finished loading. When using the FMOD_STUDIO_LOAD_BANK_NONBLOCKING flag, the load bank function returns before the bank is finished loading.

+

When a bank is fully loaded, all metadata in that bank can be accessed. This means that event descriptions can be found with Studio::System::getEvent, and instances created from those descriptions. The bank loading state can be queried with Studio::Bank::getLoadingState.

+

If a bank's sample data and metadata have been built separately, it is possible to load a bank's metadata and not its sample data, or vice-versa. If a bank's metadata is loaded and its sample data is not, events belonging to that bank can be still instantiated and played. However, doing so causes the FMOD Engine to log a warning, and all instruments whose associated sample data is not loaded are silent during playback.

+

If referenced events are not included in the same banks as the parent events by which they are referenced, it is possible to play a loaded parent event that references a child event that is not loaded. If this occurs, the FMOD Engine logs a warning, and event instruments that would play a non-loaded child event are silent during playback.

+

2.7 Bank Unload

+

Banks can be unloaded by calling Studio::Bank::unload. Unloading a bank frees all sample data from that bank, invalidates the event descriptions belonging to that bank, and destroys all associated event instances.

+

If the bank containing sample data is unloaded after being loaded using Studio::System::loadBankMemory, the system immediately unloads that bank's sample data. If any instances of events in a bank are still playing when that bank is unloaded, it may lead to playback errors. This can occur even if multiple copies of the sample data are loaded due to multiple different banks containing that sample data being loaded, and only one of those banks is unloaded.

+

2.8 Sample Data loading

+

Sample data is loaded from one of the three actions:

+ +

For cases where most or all of the events may play at any time, then loading calling Studio::Bank::loadSampleData to load all data up front may be the best approach. Once the bank sample data has loaded, then all event instances can be created or destroyed and use that existing data immediately. However, it does have the highest memory overhead. Repeated calls to Studio::Bank::loadSampleData are reference counted, and the bank's sample data is only unloaded when Studio::Bank::unloadSampleData has been called an equal number of times.

+

Sample data can be loaded for a selected event using Studio::EventDescription::loadSampleData. It is best to load the sample data ahead of time, so that the event's sound sample data is ready when needed. For cases of very common events, the sample data could be loaded for the duration of the game or level. For less common events, the sample data may be loaded in or out as needed. Repeated calls to Studio::EventDescription::loadSampleData are reference counted, and the bank's sample data is only unloaded when Studio::EventDescription::unloadSampleData has been called an equal number of times, or if the entire bank is unloaded.

+

When either of these reference counts is incremented to one the system begins loading the referenced sample data. The sample data is loaded asynchronously and the loading state may be polled by calling Studio::Bank::getSampleLoadingState or Studio::EventDescription::getSampleLoadingState. Alternatively, you can call Studio::System::flushSampleLoading, which will block until all sample loading and unloading has completed.

+

When an instance of an event is created by calling Studio::EventDescription::createInstance the system begins loading any non-streaming sample data which is not already loaded or loading. Once again the sample data is loaded asynchronously and the loading state may be polled by calling Studio::EventDescription::getSampleLoadingState. If playback of the instance is started by calling Studio::EventInstance::start before the sample data has finished loading then the instance will stay in the FMOD_STUDIO_PLAYBACK_STARTING state until loading of the sampled data has completed.

+

The automatic loading of sample data is the simplest approach and uses the least amount of memory. However it has the following disadvantages:

+
    +
  • Sample data will only start loading when the instance is created, which may be just before Studio::EventInstance::start is called.
  • +
  • Sample data will only stay loaded for as long as at least one instance exists.
  • +
+

For the case of one-shots, this may mean that the sample data is constantly loaded and unloaded whenever a one-shot plays, which is not a good approach. For these sort of common sounds, it is better to call Studio::EventDescription::loadSampleData so the sample data stays in memory rather than constantly unloading then reloading it.

+

The three approaches to bank loading can be combined. The sample data will stay loaded for as long as at least one of the three conditions are met.

+

2.8.1 Idle Pool

+

For users who don't explicitly load sample data, sounds will be loaded and unloaded on demand. To help avoid unnecessary file access, there is an idle pool for recently used sounds. When a sound is no longer needed (e.g due to an event instance finishing), its sample data will be placed into the idle pool to be reused later if needed.

+

By default, the idle pool is set to 256kB in size. This can be customized via the FMOD_STUDIO_ADVANCEDSETTINGS::idleSampleDataPoolSize field.

+

2.9 Dialogue and Localization

+

Start by loading the banks that contain the audio tables. Next, create an instance of an event that contains a programmer instrument. Using this event instance, you can register for event callbacks, specifically FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND. By using these callbacks, you can create and assign sounds from the audio tables.

+

For localized dialogue, make sure that the required localized bank is loaded. Ensure that any other localized versions of the same bank are unloaded before loading a localized bank.

+

See the FMOD Studio User Manual for more information.

+

2.9.1 Scripting Example

+

This is a modified excerpt of the programmer instrument example that is included in the C++ Studio API installation folder. The error checking has been removed for brevity.

+
struct ProgrammerSoundContext
+{
+    FMOD::System* coreSystem;
+    FMOD::Studio::System* system;
+    const char* dialogueString;
+};
+
+ProgrammerSoundContext programmerSoundContext;
+programmerSoundContext.system = system;
+programmerSoundContext.coreSystem = coreSystem;
+
+ +

This section is to set up a struct to contain the various systems required for injecting audio files or loading keys into a programmer instrument.

+
eventInstance->setUserData(&programmerSoundContext);
+eventInstance->setCallback(programmerSoundCallback, FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND | FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND);
+
+ +

The setUserData() function allows you to attach any kind of data to the event instance. In this case, the Studio system, Core system, and the dialogue string are being attached to this event instance.

+

The setCallback() function attaches the callback to the event instance. This callback will be set up outside the main thread and explained more later on.

+
// Available banks
+// "Dialogue_EN.bank", "Dialogue_JP.bank", "Dialogue_CN.bank"
+FMOD::Studio::Bank* localizedBank = NULL;
+system->loadBankFile(Common_MediaPath("Dialogue_JP.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &localizedBank);
+programmerSoundContext.dialogueString = "welcome";
+eventInstance->start();
+
+ +

When a localized audio table is added to a bank in FMOD Studio, it builds a different version of that bank file for each locale, each with its own audio table. The programmerSoundContext.dialogueString variable is the audio table key you wish to use. In this example, "welcome" is used.

+

With "welcome" as the key, what sound plays depends on the bank loaded. In this example, it will play the Japanese bank's "welcome" audio file.

+
FMOD_RESULT F_CALL programmerSoundCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void* parameters)
+
+ +

This function is to set up what happens when a programmer instrument callback is called.

+
{
+    FMOD::Studio::EventInstance* eventInstance = (FMOD::Studio::EventInstance*)event;
+
+    if (type == FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND)
+    {
+        // Get our context from the event instance user data
+        ProgrammerSoundContext* context = NULL;
+        eventInstance->getUserData((void**)&context);
+
+        // Find the audio file in the audio table with the key
+        FMOD_STUDIO_SOUND_INFO info;
+        context->system->getSoundInfo(context->dialogueString, &info);
+
+        FMOD::Sound* sound = NULL;
+        context->coreSystem->createSound(info.name_or_data, FMOD_LOOP_NORMAL | FMOD_CREATECOMPRESSEDSAMPLE | FMOD_NONBLOCKING | info.mode, &info.exinfo, &sound);
+
+        FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters;
+
+        // Pass the sound to FMOD
+        props->sound = (FMOD_SOUND*)sound;
+        props->subsoundIndex = info.subsoundindex;
+    }
+
+ +

The context struct set up previously is attached to the event with getUserData(). As mentioned previously, these are the Core system, the Studio system, and the dialogue string.

+

The context struct's dialogue string is passed to the context struct's Studio system. The system searches all loaded audio tables for the string provided, and passes the corresponding sound info into the info variable. If multiple audio tables are loaded that contain the same key, the latest-loaded audio table is used.

+

A Core API FMOD::Sound is then instantiated using the information gathered in the info variable. The audio table is passed in as info.name_or_data but the specific audio file to be used isn't specified immediately.

+

When a programmer instrument is created (triggered), the programmer instrument expects a FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES to be passed into it. The audio table, in the FMOD::Sound, is provided to the props properties, and the subsoundIndex is the actual audio file (subsound of the audio table) chosen with the key string.

+
    else if (type == FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND)
+    {
+        FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters;
+
+        // Obtain the sound
+        FMOD::Sound* sound = (FMOD::Sound*)props->sound;
+
+        // Release the sound
+        sound->release();
+    }
+}
+
+ +

When the programmer instrument is untriggered, either by the instrument no longer meeting its conditions in the event instance or by the event instance stopping, it fires the FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND callback. In the above code, when the programmer instrument is destroyed, it finds the FMOD::Sound passed into it and releases it, freeing the memory.

+

2.10 Playing Events

+

An event is an instanceable unit of sound content that can be triggered, controlled, and stopped from game code. Everything that produces a sound in a game should have a corresponding event.

+

An event contains and is composed of tracks, instruments, and parameters. The parameters trigger the instruments, which route audio content into the tracks. The tracks route into other tracks, or into the event's master track; The output of the event's master track routes into the project mixer. In addition, the event's parameters can control and manipulate most properties of the event, of the event's instruments and logic markers, and of effects on the event's tracks.

+

To play an event with the Studio API, typically you do the following:

+
    +
  1. Load a Studio::Bank containing the event you want to play, if one is not already loaded.
  2. +
  3. Get the Studio::EventDescription for the event you want to play. This can be done by either using Studio::System::getEvent or Studio::System::getEventbyID, or finding the event description in the list returned by Studio::Bank::getEventList.
  4. +
  5. Create an instance of the event with Studio::EventDescription::createInstance. This returns a handle to the new Studio::EventInstance, and causes the Studio system to begin loading the event's non-streaming sample data.
  6. +
  7. Play the event instance with Studio::EventInstance::start. This causes the event instance to begin playback, unless the event's sample data has not finished loading, in which case the event instance will start playback when loading has completed.
  8. +
  9. Release the event instance with Studio::EventInstance::release. This can be done at any point while the event is playing, and marks it to be destroyed by the Studio system when it is no longer playing, i.e. when it is no longer in the playback state FMOD_STUDIO_PLAYBACK_PLAYING.
  10. +
+

Generally, best practice is to release event instances immediately after starting them unless you want to continue to act on them in the future. For example, you may wish to play an instance multiple times, explicitly stop an instance and start it again later, or set an instance's parameters while it is still playing. This is because if the released event instance has stopped playing, it will be destroyed by the Studio system while you're still trying to act on it.

+

2.11 Event Callbacks

+

FMOD Studio allows you to specify a callback function to call when various state changes occur in an event instance. See FMOD_STUDIO_EVENT_CALLBACK_TYPE for the full list of callbacks available. The callback can be set automatically for all new instances of an event using Studio::EventDescription::setCallback, or it can be set manually for individual event instances using Studio::EventInstance::setCallback.

+

Some callbacks may be fired asynchronously on a thread owned by FMOD, depending on Studio initialization flags.

+

When Studio has been initialized in asynchronous mode (the default mode), callbacks are fired from the Studio asynchronous thread as they occur.

+

If Studio has been initialized with FMOD_STUDIO_INIT_DEFERRED_CALLBACKS then the FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER and
+FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT callbacks will be fired from the next call to Studio::System::update.

+

If Studio has been initialized with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE then all callbacks will be fired from the next call to Studio::System::update.

+

See Also: Callback Behavior

+

2.12 Setting Parameters

+

Parameters are used to control the behavior of events, snapshots, and the mixer at run time.

+

In FMOD Studio, parameters can be used to affect various behaviors, such as automating event, snapshot, and mixer properties, and acting as a trigger condition for instruments and logic markers. Parameter values can then be set at run time using the Studio API, causing automated properties to change, and dependent behaviour to trigger when trigger conditions are met.

+

Parameters can exist locally or globally. Local parameters exist on a per-event instance basis; each event instance that uses a given parameter has a single instance of that parameter, the value of which is independent from all other instances of the same parameter. A global parameter only ever has a single instance, which is shared between all events that make use of it, as well as the mixer.

+

Local parameters can be set using the following Studio::EventInstance functions:

+ +

Global parameters can be set using the following Studio::System functions:

+ +

Parameters can be set by name (case-insensitive), or by ID. A parameter's ID, FMOD_STUDIO_PARAMETER_ID, can be found in its corresponding FMOD_STUDIO_PARAMETER_DESCRIPTION. A parameter's ID is not that same as its GUID, and parameter values cannot be set using GUIDs. For local parameters, parameter descriptions can be retrieved using the following Studio::EventDescription functions:

+ +

Likewise, similar functions can be called from Studio::System for global parameters:

+ +

For more information about parameters, see the Parameters chapter of the FMOD Studio User Manual.

+

2.13 Spatialization (3D)

+

Audio spatialization is the process of taking an audio file and making it sound "in the world".
+See the Studio API 3D Events and Spatial Audio white papers.

+

2.14 Working with Reverb

+

Reverb in the Studio API can be handled in two ways. The first is to add reverb effects to the master bus or individual events, and to control the levels sent to those effects using FMOD Studio. The second approach is to use the core reverb system.

+

The core system has four user configurable 3d reverbs. FMOD Studio event instances can interact with the core reverb system by sending their signal to the core reverbs. The send level can be set with Studio::EventInstance::setReverbLevel and queried with Studio::EventInstance::getReverbLevel.

+

2.15 Signal Paths

+

Each event or bus has a signal path to the master bus or a port bus. The signal path is composed of all buses that receive a signal from the event or bus. This includes any buses on the direct path to the master bus as well as any buses that are targeted by sends.

+

By default, when an event instance is created, the system ensures that every bus on its signal path has a corresponding ChannelGroup. When an event instance is destroyed, the system destroys any ChannelGroups which are no longer required.

+

You can override the default behavior by calling Studio::Bus::lockChannelGroup. This forces the system to ensure the ChannelGroup exists for that bus and each bus on its signal path. The system cannot destroy any of these ChannelGroups until you call Studio::Bus::unlockChannelGroup.

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/DINWeb-Medium.woff b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/DINWeb-Medium.woff new file mode 100644 index 0000000..5c098af Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/DINWeb-Medium.woff differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/DINWeb.woff b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/DINWeb.woff new file mode 100644 index 0000000..5aaa4b8 Binary files /dev/null and b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/DINWeb.woff differ diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/code_highlight.css b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/code_highlight.css new file mode 100644 index 0000000..631bc92 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/code_highlight.css @@ -0,0 +1,69 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #408080; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ +.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #7D9029 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #A0A000 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/docs.css b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/docs.css new file mode 100644 index 0000000..b081522 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/style/docs.css @@ -0,0 +1,380 @@ +@font-face { + font-family:'DINWeb-Medium'; + src:url('DINWeb-Medium.woff'); +} + +@font-face { + font-family:'DINWeb'; + src:url('DINWeb.woff'); +} + +body { + background-color: black; +} + +.docs-body { + font-family: DINWeb-Medium, -apple-system, sans-serif; + background-color: black; + padding: 24px; + margin-left: auto; + margin-right: auto; + max-width: 100%; + line-height: 24px; +} + +.docs-body a { + color: #020eab; + text-decoration: none; + font-weight: bold; +} +.docs-body .apilink { + font-family: monospace; + font-size: 17px; + letter-spacing: -0.5px; +} + +.manual-content h1 a, +.manual-content h2 a, +.manual-content h3 a, +.manual-content h4 a, +.manual-content h5 a, +.manual-content h6 a { + color: black; +} + +.docs-body img { + max-width: 100%; + box-shadow: 0px 4px 20px #333333; + margin: 20px; +} + +.admonition { + border: 1px solid #b3b3b3; + border-top: 4px solid black; + background-color: #f1f1f1; + padding: 3px; +} + +.admonition.warning { + border-top: 4px solid #cc0000; +} + +.highlight { + border: 1px solid #b3b3b3; + background-color: #f1f1f1; + overflow: auto; + padding: 6px; +} + +.highlight pre { + margin: 0; +} + +code { + background-color: #eeeeee; + color: black; +} + +pre code { + display: block; + padding: 5px; + overflow: auto; +} + +blockquote { + background-color: #eeeeee; + margin: 0px; + padding: 15px; +} + +ol li ol { + list-style-type: lower-alpha; +} + + +.manual-toc { + color: black; + background-color: #d6dceb; + font-weight: bold; + + display: block; + float: right; + width: 20%; + min-width: 300px; + top: 0; + z-index: 10000; + margin-left: 20px; +} + +@media (max-width: 600px) { + .manual-content { + position: static; + min-width: 0; + padding: 20px 30px 20px !important; + } + .manual-toc { + float: none; + width: auto; + min-width: 0; + margin-left: 0; + margin-right: 0; + } +} + +@media (min-width: 601px) and (max-width: 992px) { + .manual-content { + position: static; + min-width: 0; + } + .manual-toc { + float: none; + width: auto; + min-width: 0; + margin-left: 0; + margin-right: 0; + } +} + +@media (min-width: 993px) and (max-width: 1367px) { + body { + margin-left: 24px; + margin-right: 24px; + max-width: 100%; + } + .manual-content { + min-width: 300px; + } + .manual-toc { + float: right; + max-width: 300px; + min-width: 100px; + width: auto; + padding-left: 1em; + padding-right: 1em; + } +} + +.manual-toc p { + color: black; + font-size: larger; + text-align: center; + margin-top: 0; + margin-bottom: 0; + padding-top: 1em; +} + +.manual-toc > ul { + padding: 0px; + margin-block-start: 1em; +} + +.manual-toc > ul > li { + padding: 12px; + list-style-position: inside; +} + +.manual-toc ul { list-style-type: none; } +.manual-toc ul { counter-reset: toc-level-1; } +.manual-toc li { counter-increment: toc-level-1; } +.manual-toc li > a:before { content: counter(toc-level-1)". "; } +.manual-toc li ul { counter-reset: toc-level-2; } +.manual-toc li li { counter-increment: toc-level-2; } +.manual-toc li li a:before { content: counter(toc-level-1)"."counter(toc-level-2)" "; } +.manual-toc li li ul { counter-reset: toc-level-3; } +.manual-toc li li li { counter-increment: toc-level-3; } +.manual-toc li li li a:before { content: counter(toc-level-1)"."counter(toc-level-2)"."counter(toc-level-3)" "; } +.manual-inactive-chapter li ul { display: none; } + +.manual-current-chapter { + background-color: white; +} + +.manual-current-chapter ul { + padding-left: 20px; +} + +.manual-active-chapter > a { + color: black; +} + +.manual-current-chapter > ul { margin-top: 10px; } +.manual-current-chapter li { padding-top: 10px; font-size: 14px; } +.manual-current-chapter > ul > li:first-child { padding-top: 0px; } + +.manual-current-chapter li > ul > li > ul { + display: none; +} + +ul.subchapters { border-left: 2px dotted #b3b3b3; } +ul.subchapters li > a:before { content: ""; } +ul.subchapters .manual-active-chapter > a { border-bottom: 2px solid black; } + +.manual-content { + background-color: white; + overflow: hidden; + padding: 20px 50px 40px; +} + +.manual-content li { + margin: 0.5em 0; +} + +.manual-content h2 { + margin: 1.5em 0 1em 0; +} + +.manual-content table { + margin-bottom: 1.5em; + width: 100%; + border-collapse: collapse; + display: block; + overflow-x: auto; +} + +.manual-content th { + background-color: #d6dceb; +} + +.manual-content th, .manual-content td { + border: 1px solid #b3b3b3; + padding: 12px; + text-align: left; +} + +.manual-content td img { + margin: initial; + box-shadow: initial; +} + +.manual-content img + br + em { + display: block; + margin-left: 20px; + margin-bottom: 2em; +} + +.manual-content.api dt { + font-weight: initial; + font-style:italic; + margin-bottom: 1em; +} + +.manual-content.studio dt { + margin-bottom: 1em; +} + +/* Exclude token links (e.g. "Optional", "Output") - TODO: these need proper styling */ +.manual-content.api dt a.token { + font-style:initial; +} + +.manual-content.studio p { + line-height: 24px; +} + +.manual-content.api dd { + margin-bottom: 1em; + margin-inline-start: 40px; +} + +.manual-content.studio dd { + line-height: 24px; + margin-inline-start: 24px; + margin-bottom: 1em; +} + +.manual-content.api dd ul { + margin: 0; + padding: 0.75em 0 0.5em 1em; + font-family: DINWeb; + border: 1px solid #b3b3b3; + width:max-content; +} + +.manual-content.api dd ul li { + margin: 0; + margin-right: 1em; + display: inline; +} + +.manual-content.api dd ul li .label { + font-weight: bold; +} + +.manual-content.api dd p { + margin: 0.25em; +} + +.manual-footer { + color: white; + padding: 20px; + font-size: smaller; +} + +div.language-selector { + display: -webkit-flex; + display: flex; + text-align: center; +} + +div.language-tab { + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + border: 1px solid #bbbbbb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + box-sizing: content-box; + max-width: 30px; + padding: 2px 10px; + margin-right: -1px; + margin-bottom: -1px; + cursor: pointer; +} + +.language-tab:hover { + background-color: #d6dceb; +} + +.language-tab.selected { + background-color: #f1f1f1; + border-bottom-width: 0; +} + +.language-tab.selected:after { + content: ''; + width: 100%; + height: 3px; + bottom: -1px; + left: 0; + background: inherit; +} + +div.language-selector + p { + display: none; +} + +a.token, .token { + padding: 6px; + margin-left: 8px; + color: black; + font-size: small; + font-weight: normal; + border: 1px solid #bbbbbb; + border-radius: 6px; +} + +a.token:hover { + background-color: #d6dceb; +} + +[id]:target { animation:highlighter 3s } +@keyframes highlighter { 25% { background-color: gold; } 75% { background-color: gold; } } + +.mixdowntable table { + white-space: nowrap; +} + +.mixdowntable table td, .mixdowntable table th { + min-width: 4em; + text-align: center; +} \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/troubleshooting.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/troubleshooting.html new file mode 100644 index 0000000..a3b2409 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/troubleshooting.html @@ -0,0 +1,58 @@ + + +Troubleshooting + + + + +
+ +
+

11. Troubleshooting

+

This chapter lists a number of common issues that can be encountered while working with the Core API and Studio API, along with techniques for overcoming them.

+

If you encounter a problem, and none of the techniques listed in this chapter help, post a question on the FMOD Forums for advice and support.

+

11.0.1 Audio Becomes Crackly or Distorted Over Time

+

If you are finding the output of your application is starting to crackle or become distorted when playing for a long time, it is likely there are too many processes using up CPU usage. This can be due to too many large complex events playing at once, too many expensive DSPs in use such as convolution reverbs, or an excessive build up of events.

+

To visualize the audio CPU and memory usage of your application, you can record a Live Update profiler session in your FMOD Studio project, or if using the Core API only, utilize the FMOD Profiler provided with the API installation. This will assist in tracking down exactly where the resources are being used.

+

For Studio API users, some common issues that can cause a build up of events are:

+ +

11.0.2 Cannot Find Events or Buses with Strings

+

This usually happens because the .strings.bank file has not been loaded. The error FMOD_ERR_EVENT_NOTFOUND would be logged to the game engine's debug logger. The .strings.bank file includes all the metadata required to look up events, buses, snapshots, and VCAs during runtime.

+

Refer to What Building Creates in the FMOD Studio User Manual, for more information on what a strings.bank file contains.

+

11.0.3 An error is being returned from an FMOD function and I need more detail

+

All Core API and Studio API functions return a FMOD_RESULT. This result is FMOD_OK if the function works as expected, or an error error code describing the problem. You can find a list of all possible errors in the documentation for FMOD_RESULT.

+

If further debugging is required, you can initialize the Studio API or Core API using the logging or "L" version of the respective library, i.e.: fmodstudioL.dll or fmodL.dll. To modify the amount of logging or the way it is displayed, see Debug_Initialize.

+

11.0.4 My audio device does not change automatically

+

FMOD has an automatic device switching feature which is enabled by default.

+

A reason for this not to work is that an FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED callback has been registered. This callback disables the automatic device switching feature on purpose, as it assumes you will be controlling which device gets selected in the callback.

+ + + + + +
diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-revision-history.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-revision-history.html new file mode 100644 index 0000000..b1ca8d4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-revision-history.html @@ -0,0 +1,4566 @@ + + +Welcome to the FMOD Engine | Detailed Revision History + + + + +
+ +
+

1. Welcome to the FMOD Engine | Detailed Revision History

+
+
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Legend
    Win:Microsoft WindowsXboxOne:Microsoft Xbox One
    Mac:Apple macOSGameCore:Microsoft Game Core
    Linux:LinuxPS4:Sony PlayStation 4
    iOS:Apple iOS / tvOSPS5:Sony PlayStation 5
    Android:Google AndroidSwitch:Nintendo Switch
    HTML5:JavaScript WebAssemblyUWP:Microsoft Universal Windows Platform
    +

    2/4/25 2.03.07 - Studio API minor release (build 150747)

    +

    Features:

    +
      +
    • Unity - Added support for WeChat Mini Game platform in TuanJie Engine.
    • +
    +

    Fixes:

    +
      +
    • Core API - Android - Fixed crash when calling into record API while mixer suspended.
    • +
    • Core API - Fixed DSP::setWetDryMix causing audible output on some DSPs if they were muted internally, for example FMOD_DSP_TYPE_FADER, or user DSPs using FMOD_ERR_DSP_SILENCE as a return value.
    • +
    • Core API - Mac - Fixed FMOD_ERR_OUTPUT_DRIVERCALL being returned on certain device change events.
    • +
    • Core API - XSX - Fixed hardware convolution failing to fallback to software implementation when an invalid impulse response length was provided.
    • +
    • Core API - Added support for .m3u8 file format.
    • +
    • Unity - Improved EventReferenceDrawer performance when working with large FMOD projects.
    • +
    • Unity - OpenHarmony - Removed need for manual fmod.init call in exported project's Ability.
    • +
    • Unity - Added suggestion for line ending requirements to Source Control window of the Set Up Wizard.
    • +
    • Unity/Unreal - Filter out benign FMOD_ERR_CHANNEL_STOLEN error.
    • +
    +

    Notes:

    +
      +
    • Switch - Now built with SDK 19.3.5.
    • +
    +

    07/02/25 2.03.06 - Studio API minor release (build 149358)

    +

    Features:

    +
      +
    • Core API - Android - Added support for Spatial Audio when surround speaker mode is 5.1 or higher and user has Spatial Audio enabled.
    • +
    • Unity - Added public property StudioListener::AttenuationObject.
    • +
    • Unity - Added Chinese localization to Resonance plugin.
    • +
    +

    Fixes:

    +
      +
    • Studio API - HTML5 - Added support for position independent code with Upstream WASM.
    • +
    • Core API - Fixed Channel::getAudibility not considering 3D attributes of parent ChannelGroups in audibility calculation.
    • +
    • Core API - Fixed audible pop from fix introduced in 2.02.24 regarding virtual channels and ChannelControl::setPan/setMixLevelsInput/setMixLevelsOutput/ ChannelControl::setMixMatrix.
    • +
    • Core API - Android - Fixed input stream leak when backgrounding application on some Android devices.
    • +
    • Core API - Android - Fixed small amount of old audio being played after calling System::mixerResume when using OpenSL or AAudio output types.
    • +
    • Core API - PS5 - Fixed potentially incorrect pitch / hardware errors when using very high or low pitch values with Opus.
    • +
    • Core API - PS5 - Fixed issues with the Opus codec with seamless looping.
    • +
    • Core API - Windows - Fixed ASIO failing to initialize if device CLSID is empty.
    • +
    • OpenHarmony - Reduced latency by taking advantage of SDK 11 functionality, latency for SDK 10 devices remains unchanged.
    • +
    • Unity - Fixed vector out-of-range warning when creating 3D event instances.
    • +
    • Unity - Fixed an issue with SetListenerLocation if Physic2D was disabled.
    • +
    • Unity - Fixed Setup Wizard window to be resizable and scrollable.
    • +
    • Unity - Fixed NotImplementedException error when running the event reference updater on objects that have not implemented GetEnumerator().
    • +
    • Unity - Fixed ArgumentOutOfRangeException error when trying to create a new FMOD event in editor.
    • +
    • Unreal - Fixed 3D AudioLink events playing at world zero before receiving position information from Unreal.
    • +
    +

    13/12/24 2.03.05 - Studio API minor release (build 148280)

    +

    Features:

    +
      +
    • Unity - Added Chinese localization.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Added some extra validation around 3D attributes passed in.
    • +
    • Studio API - Fixed an assert that occurs when playing a transition timeline with a relative offset and a destination region that passes the end of the main timeline.
    • +
    • Studio API - Fixed incorrect timeline transition behavior when loading banks built by FMOD Studio 2.00.04 or earlier.
    • +
    • Studio API - PS4/PS5 - Fixed crash preceded by an internal assert(isValid) on PS5 SDK 10 and PS4 SDK 12.
    • +
    • Core API - Android - Fixed glitching when attempting screen recording with AAudio on Android 14 and above.
    • +
    • Core API - Android - Added protections against recording with multiple input devices simultaneously when using OpenSL.
    • +
    • Core API - Android - AAudio now correctly stops recording if a new recording begins on a different device.
    • +
    • Core API - iOS - Added protections against recording with multiple input devices simultaneously.
    • +
    • Unity - Fixed the Event Reference Updater incorrectly being triggered when capitalization changes on events or folders.
    • +
    • Unity - Fixed "Stop Events Outside Max Distance" behavior not taking listener attenuation objects into account.
    • +
    • Unity - Removed Codec assigning for the default platform as not all platforms support the same Codec values.
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 12.008.011.
    • +
    • PS5 - Now built with SDK 10.00.00.40.
    • +
    • Unreal - Added support for UE5.5.
    • +
    • Android - arm64-v8a and x86_64 libraries are now aligned to 16kb page size.
    • +
    +

    11/11/24 2.03.04 - Studio API minor release (build 147563)

    +

    Fixes:

    +
      +
    • Studio API - Fixed a crash caused by changing an event via live update and then unloading one of its assets banks.
    • +
    • Studio API - Fixed an assert when an event with manual sample loading uses a sample after an event with automatic sample loading.
    • +
    • Studio API - Fixed crash and memory leaks when loading master banks that are missing mixer content required in other banks.
    • +
    • Core API - Removed the MarshalHelper to avoid AOT build errors when using the C# wrapper.
    • +
    • Core API - FMOD_ERR_FILE_NOTFOUND logs will now be of level "log" rather than "error" as it is not an error in some cases.
    • +
    • Core API - Fixed compatibility issues with .wavs produced with FMOD_OUTTPUTTYPE_WAVWRITER or FMOD_OUTTPUTTYPE_WAVWRITER_NRT.
    • +
    • Core API - Fixed incorrect "device" name for PCM float output with FMOD_OUTTPUTTYPE_WAVWRITER and FMOD_OUTTPUTTYPE_WAVWRITER_NRT.
    • +
    • Core API - Fixed DSP creation failing with FMOD_ERR_MEMORY if called a large number of times, despite still having system memory available.
    • +
    • Core API - C# - Fixed the definition of FMOD_DSP_BUFFER_ARRAY to allow the usage of FMOD_DSP_PROCESS_CALLBACK. New properties allow easy access to the native arrays.
    • +
    • Core API - Consoles - Hardware resources will now correctly yield after an FMOD_CREATESAMPLE decode so they can be used in other sounds.
    • +
    • Core API - Fixed subsounds in FSBs returning FMOD_SOUND_TYPE_FSB from Sound::getFormat instead of their encoded sound type.
    • +
    • Core API - Mac - Fixed error initializing output after turning bluetooth off.
    • +
    • Core API - Win - Downgraded "device unplugged" errors to warnings as device switching is supported.
    • +
    • Core API - Win - Fixed potential crash with certain ASIO driver after System::close.
    • +
    • Unity - Added support for setting number of Opus Codecs on PS5.
    • +
    • Unreal - DestroyStudioSystem no longer unloads banks, as the system release handles this.
    • +
    +

    Notes:

    +
      +
    • HTML5 - Now built with SDK 3.1.67.
    • +
    • Unity - HTML5 - Now built with SDK 3.1.8 for Unity 2022.3 and 3.1.39 for Unity 6000.0.
    • +
    +

    25/09/24 2.03.03 - Studio API minor release (build 146372)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed a crash when unloading an assets bank before its associated metadata bank.
    • +
    • Studio API - Fixed backwards compatibility loading banks from 1.08 and older, which presented as FMOD_ERR_INVALID_PARAM being returned from System::loadBankFile (or equivalent bank load function).
    • +
    • Studio API - Fixed invalid handle error being returned from Studio::System::update if a spectral sidechain on a global bus is released (due to the bus becoming unused).
    • +
    • Core API - Fixed passed in values being ignored when calling ChannelControl::setPan, ChannelControl::setMixLevelsInput, ChannelControl::setMixLevelsOutput, or ChannelControl::setMixMatrix on a virtual Channel.
    • +
    • Core API - Fixed MultibandEQ not handling DSP::reset correctly for bands B through E.
    • +
    • Core API - OpenHarmony - Audio will now automatically resume after interruption.
    • +
    • Core API - PS5 - Fixed Opus decode errors with certain pitch and seek combinations.
    • +
    • Unreal - Added additional validation to Content Browser Prefix to account for invalid characters and prefix lengths.
    • +
    • Unity - Added non-Rigidbody velocity effect option on Listeners.
    • +
    • Unity - Fixed source control presentation on macOS.
    • +
    • Unity - OpenHarmony - Fixed issue locating bank files on devices.
    • +
    • Unity - Fixed EventReferenceUpdater stack overflow exception caused by Input System.
    • +
    • Studio API - Reduced effect parameter allocations by allocating upfront instead of individually.
    • +
    +

    Notes:

    +
      +
    • Unity - Renamed StudioEventEmitter members PlayEvent and StopEvent to EventPlayTrigger and EventStopTrigger to disambiguate from StudioEventEmitter.Play().
    • +
    • GameCore - Now built with March 2024 Update 1 GDKX.
    • +
    • Unreal - PS4 - UE4.27 - Now built with SDK 11.008.001.
    • +
    • Unreal - PS5 - UE4.27 - Now built with SDK 8.00.00.41.
    • +
    +

    12/07/24 2.03.02 - Studio API minor release (build 144646)

    +

    Features:

    +
      +
    • Core API - Android - Non-default input and output devices can now be requested when using AAudio. Only available on devices targeting API level 26 (Oreo) and above.
    • +
    • Core API - Android - Added FMOD_Android_JNI_Init to support initializing Java layer from a native activity.
    • +
    • Core API - GameCore - Added FMOD_PORT_TYPE_CONTROLLER to the FMOD_OUTPUTTYPE_WASAPI output plug-in to route audio to a user specific audio device.
    • +
    • Unity - Fixed warnings for updated api functions in Unity 2023.1+.
    • +
    • Unity - Android - Added support for Application Entry Point GameActivity.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed glitches due to modulation not being applied correctly at event start time.
    • +
    • Studio API - Fixed glitches in AHDSR modulator release.
    • +
    • Studio API - Fixed an intermittent assert when playing instruments with trigger delay.
    • +
    • Studio API - GameCore - Fixed crash when setting invalid thread affinity.
    • +
    • Core API - Fixed rare crash when virtual voices swapped when using a mix of Sound and DSP based channels.
    • +
    • Core API - Android - Fixed crash when calling recordStart while mixer suspended.
    • +
    • Core API - OpenHarmony - Added support for System::mixerSuspend and System::mixerResume to allow recovery of audio when returning from the background.
    • +
    • Core API - visionOS - Fixed missing symbol build error.
    • +
    • Core API - Windows - Fixed initialization failure when audio service unavailable.
    • +
    • Unity - Fixed EventReferenceUpdater iterating over irrelevant objects.
    • +
    • Unreal - Fixed Niagara component variables using incorrect namespaces.
    • +
    • Unreal - Fixed compile errors in UE5.4 for FMODAudioLinkInputClient.cpp on some consoles.
    • +
    • Unreal - FMODAudioComponents Occlusion and Velocity is now based off the component instead of the actor.
    • +
    • Unity - Fixed CodeGeneration.cs being left in the wrong location when migrating from 2.01 to 2.02.
    • +
    • Unity - Fixed EventReferenceUpdater exception when attempting to iterate uninitialized items.
    • +
    +

    Notes:

    +
      +
    • Unity - Studio Event Emitter setting "Allow Non-Rigidbody Doppler" has been renamed "Non-Rigidbody Velocity".
    • +
    • Unity - Added support for Unity 6.
    • +
    +

    08/05/24 2.03.01 - Studio API minor release (build 142842)

    +

    Features:

    +
      +
    • Core API - Added optimizations to Multiband Dynamics plugin to skip processing of collapsed bands.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed a crash when unloading a bank containing a global parameter that automates a modulator property on another global parameter.
    • +
    • Studio API - Fixed the sidechain modulator producing incorrect results when it is connected to multiple sidechains.
    • +
    • Core API - Fixed rare clicks/pops when using DSP::setWetDryMix.
    • +
    • Core API - Fixed potential crashes relating to unloading Banks that hold referenced Events that are currently playing.
    • +
    • Core API - HTML5 - Fixed no-audio output when using FMOD_OUTPUTTYPE_AUDIOWORKLET in some newer browsers.
    • +
    • Core API - HTML5 - Fixed FFT DSP spectrum data not being accessible.
    • +
    • Unity - Fixed FMOD settings heading being over written by new Unity cloud integration buttons.
    • +
    • Unity - Fixed error if event browser is left open when Unity starts.
    • +
    • Unity - Fixed EventReferenceUpdater throwing invalid cast exceptions.
    • +
    • Unity - Fixed FileReorganizer not moving libs in old directories.
    • +
    • Unreal - iOS - Fixed interruption notification deprecations.
    • +
    +

    Notes:

    +
      +
    • iOS/Mac - Now compliant with Apple privacy requirements, removed usage of mach_absolute_time, no manifest needed.
    • +
    • PS4 - Now built with SDK 11.508.011.
    • +
    • PS5 - Now built with SDK 9.00.00.40.
    • +
    +

    13/03/24 2.03.00 - Studio API major release (build 141450)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed popping caused by Studio::Bus::setPaused.
    • +
    • Studio API - Fixed sounds being stopped when they are in multiple banks and the first loaded bank is unloaded.
    • +
    • Studio API - Fixed looping playlist instruments displaying a warning when using a DSP buffer size of less than 1024.
    • +
    • Core API - Fixed virtual voices getting out of sync when they return to real.
    • +
    +

    Notes:

    +
      +
    • All APIs - The F_CALLBACK macro has been removed, update existing code to use F_CALL instead.
    • +
    • Core API - In C#, FMOD_DSP_STATE.functions now has a wrapper function returning an FMOD_DSP_STATE_FUNCTIONS struct instead of the IntPtr requiring marshalling.
    • +
    • Core API - Removed FMOD_DSP_TYPE_ENVELOPEFOLLOWER, FMOD_DSP_TYPE_VSTPLUGIN, FMOD_DSP_TYPE_LADSPAPLUGIN, and FMOD_DSP_TYPE_WINAMPPLUGIN.
    • +
    • Core API - Removed FMOD_SYSTEM_CALLBACK_MIDMIX.
    • +
    • Core API - Renamed the FMOD_DSP_FFT_WINDOW enum to FMOD_DSP_FFT_WINDOW_TYPE, and renamed the FMOD_DSP_FFT_WINDOWTYPE enum value to FMOD_DSP_FFT_WINDOW.
    • +
    • Core API - Win - The default DSP buffer size is now 512 rather than 1024 to reduce latency.
    • +
    • Android - Updated to NDK 26b and Android SDK 21.
    • +
    • HTML5 - Removed support for deprecated Fastcomp backend.
    • +
    • Unity - Removed support for end-of-life versions, minimum is now 2021.3.
    • +
    • Tools - Updated Qt framework to v6.5.3 which lifts the minimum requirement to macOS 11.0, Win10 1809 and Linux GLIBC 2.28.
    • +
    +

    13/03/24 2.02.21 - Studio API minor release (build 141420)

    +

    Features:

    +
      +
    • Unreal - Switch - Added functionality to open a socket on dev kit when Live Update is enabled.
    • +
    • Unreal - Added IFMODStudioModule::PrePIEDelegate to give users a chance to clean up any resources before the FMOD System is released in Editor.
    • +
    • iOS - Added support for the Apple Vision Pro device and simulator in the Core/Studio APIs and the FMOD for Unity integration.
    • +
    • Win - Added support for Arm64 processors in the Core/Studio APIs.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed FSB sounds incorrectly being virtualized when built from 32 bit source assets.
    • +
    • Core API - Fixed incorrect handling of DSP wet/dry settings if the DSP returns FMOD_ERR_DSP_DONTPROCESS when its process callback is called with FMOD_DSP_PROCESS_QUERY.
    • +
    • Core API - OpenHarmony - Added an error check during System::init for insufficient DSP buffer size.
    • +
    • Core API - Android - Fixed global threads, like the File thread, remaining active when the app is suspended on Android.
    • +
    • Unity - Fixed editor hang when live recompiling code.
    • +
    • Unity - Fixed iOS interruption deprecation warnings.
    • +
    • Unreal - For UE5.2 onwards MacOS integration libs are now built as universal to support both x86_64 and arm64.
    • +
    • Unreal - Fixed iOS interruption deprecation warnings.
    • +
    +

    Notes:

    +
      +
    • iOS - Now built with iOS SDK 17.2 (Xcode 15.2).
    • +
    • Switch - Now built with SDK 17.5.3.
    • +
    • PS4 - Now built with SDK 11.008.001.
    • +
    • PS5 - Now built with SDK 8.00.00.41.
    • +
    +

    13/12/23 2.02.20 - Studio API minor release (build 139317)

    +

    Features:

    +
      +
    • Core API - Through FMOD_ADVANCEDSETTINGS, Spatial Objects count can be reserved per FMOD systems.
    • +
    • FSBank API - Added FSBANK_BUILD_ALIGN4K to align each sound in an FSB to a 4K boundary to help binary patching on Microsoft platforms.
    • +
    • Unity - The integration can now be hosted on Source Control and still be able to edit .asset files.
    • +
    • Unity - Debug Overlay can now have its on screen position set and font size changed.
    • +
    • Unreal - Added support for pausing FMOD Audio Components in Unreal Sequencer.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed crash when calling into API before FMOD::System created.
    • +
    • Core API - Fixed potential crackling caused by changing the system sample rate of a device playing as a port.
    • +
    • Win - Fixed Cygwin/MinGW libs giving linker errors from API functions that include FMOD_THREAD_AFFINITY or FMOD_STUDIO_PARAMETER_ID.
    • +
    +

    2/11/23 2.02.19 - Studio API minor release (build 137979)

    +

    Features:

    +
      +
    • Android/iOS - Added virtual recording device via System::recordStart (1, ...) that adds hardware processing including echo cancellation.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed a race condition between the sample data loading system and Studio::EventDescription::getSampleLoadingState.
    • +
    • Core API - Fixed WavWriter and NoSound output plugins potentially processing more audio than appropriate for the elapsed time.
    • +
    • Core API - PS4 - Increased DSPBufferSize range to handle sizes greater than 256 or 512. The AT9 codec still has a restriction of 256 or 512 but anything else will accept sizes of 256, 512, 768, 1024, 1280, 1536, 1792 or 2048.
    • +
    • Unreal - Reset locale to default every time PIE is launched.
    • +
    +

    Notes:

    +
      +
    • Core API - iOS - Disabled FMOD_OUTPUTTYPE_PHASE due to compatibility issues with iOS 17.
    • +
    • iOS - Now built with iOS SDK 17.0 (Xcode 15.0), min deploy target is now 12.0 and bitcode has been removed as mandated by Xcode.
    • +
    • Mac - Now built with macOS SDK 14.0 (Xcode 15.0.1).
    • +
    • HTML5 - Fixed Sound::lock not returning memory pointers.
    • +
    +

    2/10/23 2.02.18 - Studio API minor release (build 137105)

    +

    Features:

    +
      +
    • Core API - iOS - A new output plugin called FMOD_OUTPUTTYPE_PHASE has been enabled, which supports 3D spatial objects. For iOS 16.4.
    • +
    • Core API - PS5 - From SDK 8.00 we now support Dolby Atmos and thus 7.1.4 output. To enable this set FMOD_SPEAKERMODE_7POINT1POINT4.
    • +
    • Unity - Emitters are now able to be triggered from UI elements using mouse events.
    • +
    • Unreal - Added support for Niagara.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed programmer sounds getting spatialized by the Core API if the passed in Sound had the FMOD_3D mode set.
    • +
    • Studio API - Fixed shared streaming assets being forced to stop when the bank they are streaming from is unloaded if the bank was loaded via Studio::System::loadBankCustom.
    • +
    • Studio API - Fixed pops when calling Studio::EventInstance::setTimelinePosition on events with only one sound on the timeline.
    • +
    • Studio API - Fixed streaming instruments failing to stop at the right time if they were started too close to the end.
    • +
    • Studio API - Multi instruments/scatterers now factor in silence instruments when determining whether to play an instrument from a playlist in shuffle mode. If an instrument is followed by one or more silence instruments, that instrument will not be selected to play next.
    • +
    • Core API - Fixed cycles created using DSP connections not causing a feedback loop.
    • +
    • Core API - Slight improvement to Multiband EQ filter stability near the upper end of the frequency range on 24kHz devices.
    • +
    • Core API - Clamp and log a warning when setting a high pitch value rather than returning an error.
    • +
    • Core API - Fixed some DSP effects incorrectly skipping processing as if bypassed via DSP::setBypass when DSP::setWetDryMix is called with prewet set to 0.
    • +
    • Core API - Fixed potential crash in the transceiver DSP if certain pre-init calls are made in sequence, such as System::setDSPBufferSize followed by System::setOutput.
    • +
    • Core API - Fixed potential crash (or assert) when opening and closing ports.
    • +
    • Core API - Fixed potential audio corruption for 3D objects if the mixer is under heavy load.
    • +
    • Core API - PS5 - Fixed internal error from sceAudioOut2PortSetAttributes returning "not-ready" caused by a race condition in opening a port.
    • +
    • Core API - Windows - Fixed WASAPI device enumeration memory leaks when devices fail.
    • +
    • Unreal - Fixed Sequencer ignoring Start keys at frame 0.
    • +
    • Unreal - Restore "Reload Banks' option to File dropdown menu.
    • +
    • Unreal - Added validation to fix lack of leading or trailing forward slash in Content Browser Prefix.
    • +
    • Unreal - Fixed FMODAudioComponent ignoring "When Finished" behavior when Sequencer finishes playback.
    • +
    • Unreal - Fixed localized banks not working.
    • +
    • Unity - Fixed non-rigidbody doppler dividing by 0 if Time.timescale = 0.
    • +
    • Unity - Fixed issue when playing in Editor where the path plugins were attempted to be loaded from contained "/Assets" twice.
    • +
    • Android - Fixed playerSetVolume crash on devices with Android OS below Android T.
    • +
    • Windows - Removed hard dependency on msacm32.dll.
    • +
    +

    Notes:

    +
      +
    • Core API - Calling the DSP plugin API functions, FMOD_DSP_GETSAMPLERATE, FMOD_DSP_GETBLOCKSIZE, or FMOD_DSP_GETSPEAKERMODE before init will now return an error as those settings are not confirmed until after initialization.
    • +
    • PS4 - Now built with SDK 10.508.001.
    • +
    • PS5 - Now built with SDK 7.00.00.38.
    • +
    +

    21/8/23 2.02.17 - Studio API minor release (build 136061)

    +

    Fixes:

    +
      +
    • Studio API - Fixed Studio::EventInstance::getTimelinePosition occasionally reporting incorrect position.
    • +
    • Studio API - Fixed hang after running an Event for 12 hours with beat callbacks.
    • +
    • Studio API - Fixed instruments that are automated on the timeline having incorrect automated values when they start.
    • +
    • Core API - Fixed virtual voice issue that could cause Channels to restart.
    • +
    • Core API - Fixed assert firing from resampler for wildly varying pitch values.
    • +
    • Core API - Fixed FMOD_INIT_3D_RIGHTHANDED to work correctly when using FMOD_3D_HEADRELATIVE.
    • +
    • Core API - GameCore/PS5 - Fixed the Opus and XMA codecs to display an appropriate error log if the DSP buffer size is not 512.
    • +
    • Core API - HTML5 - Fixed compiler errors to do with using Strict Mode.
    • +
    • Unity - Fixed Studio Global Parameter Trigger silently failing on awake.
    • +
    • Unity - FMOD Studio system failing to initialize will no longer throw as an exception.
    • +
    • Unity - Fixed error when auditioning Events containing global parameters in Event Browser.
    • +
    • Unreal - Fixed FMODAudioComponents always using default parameter values.
    • +
    • Unreal - Fixed Sequencer restarting AudioComponents when Sequencer Editor open.
    • +
    • Unreal - Fixed crash when FMOD Studio project contains folders with "." character.
    • +
    • Unreal - Fixed FMODGenerateAssets commandlet not deleting old assets on rebuild.
    • +
    • Android - Fixed exported symbols to avoid issues with unwinder on armeabi-v7a.
    • +
    +

    13/7/23 2.02.16 - Studio API minor release (build 135072)

    +

    Fixes:

    +
      +
    • Studio API - Fixed voice stealing behavior not updating when connected to live update.
    • +
    • Studio API - Fixed instruments with AHDSR not stopping after release, introduced in 2.02.15.
    • +
    • Unity - Fixed ApplyMuteState and PauseAllEvents functions when when using Addressables
    • +
    • Unity - Fixed Editor Platform settings inheriting from the Default Platform.
    • +
    • Unity - Fixed folder references to allow the FMOD Plugin base folder to be moved anywhere on disk for use with the Unity Package Manager.
    • +
    • Unreal - Fixed potential crash when linking to Studio project locales.
    • +
    • iOS/Mac - Fixed example Xcode projects with incorrect paths failing to load.
    • +
    +

    Notes:

    +
      +
    • Unity - Added support for Unity 2023.1.
    • +
    +

    2/6/23 2.02.15 - Studio API minor release (build 134211)

    +

    Features:

    +
      +
    • Unreal - Added FMODStudioModule::GetDefaultLocale to get the default locale which can be changed in the FMOD Settings.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed live update crash if tweaking an Event with an empty single sound instrument.
    • +
    • Studio API - Fixed potential crash if releasing an EventInstance from the Stop callback.
    • +
    • Studio API - Fixed third party DSP plugins causing potential assert by calling DSP::setParameterDSP on effects managed by Studio.
    • +
    • Unity - Fixed Addressable banks not being built when building with batchmode.
    • +
    • Unreal - Fixed rare AudioVolume Reverb Effect cast crash.
    • +
    • Unreal - Fixed crash when using Hot Reload in UE4.26 & 4.27.
    • +
    • Unreal - FMODStudioModule::GetLocale correctly now returns the currently set locale instead of the default.
    • +
    • Unreal - PS4 - Fixed audio degradation due to mixer thread competing with renderer thread.
    • +
    +

    Notes:

    +
      +
    • iOS - Now built with iOS SDK 16.4 (Xcode 14.3).
    • +
    • Mac - Now built with macOS SDK 13.3 (Xcode 14.3), min deploy target is now 10.13 as mandated by Xcode.
    • +
    • Unreal - Added support for UE5.2.
    • +
    +

    3/5/23 2.02.14 - Studio API minor release (build 133546)

    +

    Features:

    +
      +
    • Core API - Examples now have a Common_Log function for outputting to TTY.
    • +
    • Unity - Reduced time spent generating bank stubs, and reduced time spent copying banks into StreamingAssets folder when building.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed crash when adding parameter sheet to a playing event while live update connected.
    • +
    • Studio API - Fixed instruments starting playback with stale property values during hotswap.
    • +
    • Studio API - Fixed Global Parameters being unable to automate other Global Parameters.
    • +
    • Core API - PS5 - Fixed out-of-resources errors when decoding a large number of FMOD_CREATESAMPLE (decompress into memory) sounds encoded as AT9.
    • +
    • Core API - Win/GameCore - Fixed potential crash when an audio device reports an invalid name.
    • +
    • Unity - Fixed Find and Replace tool not finding prefabs.
    • +
    • Unity - iOS - Fixed audio not resuming after opening and closing Siri.
    • +
    • Unity - Fixed hang caused by RuntimeManager access when auditioning in timeline.
    • +
    +

    17/3/23 2.02.13 - Studio API minor release (build 132591)

    +

    Features:

    +
      +
    • Unity - Added non-Rigidbody Doppler effect option on Emitters.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed voice stealing failing on events in FMOD_STUDIO_PLAYBACK_STOPPING state.
    • +
    • Studio API - Fixed assert during Live Update when deleting a Global Parameter.
    • +
    • Studio API - AHDSR modulators will now have correct release behavior when the instrument stop condition is triggered by an event condition.
    • +
    • Studio API - Fixed crash when changing parameter scope on a playing event.
    • +
    • Studio API - Fixed a crash when removing automations via Live Update.
    • +
    • Core API - Fixed playback issues with certain ice/shoutcast net-streams.
    • +
    • Core API - GameCore - Fixed rare crash when playing back compressed Opus.
    • +
    • Core API - GameCore - Reduced memory usage for hardware convolution reverb.
    • +
    • Core API - Mac - Fixed crash when using input devices below 16kHz sample rate.
    • +
    • Core API - PS5 - Fixed audio output stutters when a port disconnects.
    • +
    • Core API - Win - Fixed record enumeration fails causing crash.
    • +
    • Unity - Fixed Visual Scripting units not generating in Unity 2021+.
    • +
    • Unity - Fixed plugin bundles not working on Mac.
    • +
    • Unreal - Fixed AssetLookup being modified each time the editor is opened.
    • +
    • Unreal - Fixed Editor Live Update not connecting to Studio.
    • +
    +

    Note:

    +
      +
    • GameCore - Now built with October 2022 QFE 1 GDKX.
    • +
    • Switch - Now built with SDK 15.3.0.
    • +
    +

    31/1/23 2.02.12 - Studio API minor release (build 131544)

    +

    Features:

    +
      +
    • Core API - Warning is now logged when a voice swap occurs on an voice with an audibility above -20dB.
    • +
    • Unity - Added support for Unity 2022.2.
    • +
    • Unity - macOS can now handle .dylib plugins natively
    • +
    • Unity - Android - Added support for patch build.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Live Update being ignored if Studio connects before the master Bank is loaded.
    • +
    • Studio API - Fixed a potential crash updating a referenced 3D Event if it has been forcibly stopped due to bank unload.
    • +
    • Studio API - Fixed issue where using a modulated parameter to automate a property of an AHDSR modulator would sometimes cause the AHDSR to start in a bad state.
    • +
    • Studio API - Fixed VCA handles becoming invalid when live update changes them.
    • +
    • Studio API - Fixed incorrect scheduling of playlist entries in multi instruments that have pitch changes.
    • +
    • Core API - Switch - Fixed potential Opus crash when streaming with custom async IO callbacks.
    • +
    • Core API - PS5 + GameCore - Hardware resource configuration (performed using platform specific FMOD APIs) will now apply during System::init rather than System::create.
    • +
    • Unity - The EventReferenceDrawer "Open in Browser" button now functions when there is no event selected.
    • +
    • Unity - Fixed EventRefDrawer showing incorrect "Migration target X is missing" messages on sub-object fields with MigrateTo specified.
    • +
    • Unity - Fixed hang when RuntimeManager called outside of main thread.
    • +
    • Unity - The Update Event References menu command now scans non-MonoBehaviour objects that are referenced by MonoBehaviours.
    • +
    • Unity - Fixed warning "Settings instance has not been initialized...".
    • +
    • Unity - Fixed 'multiple plugins with same name' error on Mac.
    • +
    • Unreal - Fixed occlusion not working from Audio Component reloaded from a streamed level.
    • +
    • Unreal - Fixed commandlet crashing when trying to delete assets.
    • +
    • Win - Fixed examples not rendering correctly on Windows 11.
    • +
    +

    Notes:

    +
      +
    • Unity - Added an example on how to pipe audio from a VideoPlayer into FMOD.
    • +
    • iOS - Re-enabled compilation of the now deprecated Bitcode to appease toolchains such as Unity that still require it.
    • +
    • PS4 - Now built with SDK 10.008.001.
    • +
    • PS5 - Now built with SDK 6.00.00.38.
    • +
    +

    01/12/22 2.02.11 - Studio API minor release (build 130436)

    +

    Features:

    +
      +
    • Studio API - Studio::System::getBus ("bus:/", ...) will now return the master bus if the master bank has been loaded, even if the strings bank has not.
    • +
    • Core API - GameCore - Added in FMOD_GameCore_XMAConfigure. This can be used to control whether to allocate XMA codec hardware resources inside FMOD::System_Create:: If not called before FMOD::System_Create the resources will be allocated on first codec use.
    • +
    • Core API - Mac - Added support for 7.1.4 output type.
    • +
    • Core API - PS5 - Added in FMOD_PS5_AT9Configure. This can be used to control whether to allocate AT9 codec hardware resources inside FMOD::System_Create:: If not called before FMOD::System_Create the resources will be allocated on first codec use.
    • +
    • Unity - Android - Added support for x86_64.
    • +
    • Unreal - Added a Sound Stopped callback to the FMODAudioComponent.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed crash when connecting live update and a bank was loaded multiple times with FMOD_STUDIO_LOAD_BANK_NONBLOCKING flag.
    • +
    • Studio API - Fixed every asset in an Audio Table being parsed when only one item is required.
    • +
    • Studio API - Logging more meaningful error message when attempting to get/set listener properties with an invalid listener index.
    • +
    • Core API - Fixed recording not starting immediately after changing output devices.
    • +
    • Core API - Fixed AAudio no-sound issue if device disconnection occurs during initialization.
    • +
    • Core API - Fixed a stall in Sound::release on nonblocking sounds.
    • +
    • Unity - Added optimized DistanceSquaredToNearestListener method to avoid unnecessary square root.
    • +
    • Unity - Fixed StudioEventEmitter clearing handle prematurely when Allow Fadeout enabled.
    • +
    • Unity - Fixed FMODStudioEventEmitter inspector not updating displayed min and max attenuation when banks refreshed.
    • +
    • Unity - Error now logged when accessing RuntimeManager from Editor-only callsite.
    • +
    • Unity - Fixed EventReferenceDrawer input losing focus when not found warning appears.
    • +
    • Unreal - Fixed BankLookup.uasset being modified whenever banks get refreshed while using split banks.
    • +
    +

    Notes:

    +
      +
    • Unreal - Added support for UE5.1.
    • +
    • iOS - Now built with iOS SDK 16.0 (Xcode 14.0.1), min deploy target is now 11.0 and 32bit support has been removed as mandated by Xcode.
    • +
    • Mac - Now built with macOS SDK 12.3 (Xcode 14.0.1).
    • +
    +

    28/10/22 2.02.10 - Studio API minor release (build 129212)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed a race condition where the Studio API could delete DSP parameter data before the DSP was released.
    • +
    • Core API - Fixed bug with fallback realloc copying excess memory when memory callbacks being overridden but a realloc wasn't provided.
    • +
    • Core API - Fixed crash with .MOD format with a particular combination of commands.
    • +
    • Core API - Fixed potential FMOD_ERR_INVALID_PARAM from System::setDriver if the device list has changed since a previous call to that function.
    • +
    • Core API - Fixed potential crash when a Send mixes to an partially initialized Return. This crash can occur in the Studio API also.
    • +
    • Core API - Fixed potential access violation due to internal Sound Group list corruption.
    • +
    • Core API - Fixed Channel::setLoopPoints not applying if the stream decode buffer is larger than the Sound.
    • +
    • Unity - Removed benign errors originating from EventInstance::set3DAttributes calls when API Error Logging is enabled.
    • +
    • Unity - Fixed platform warning appearing unnecessarily.
    • +
    • Unreal - Fixed BankLookup.uasset being modified whenever banks get refreshed while using split banks.
    • +
    +

    Notes:

    +
      +
    • Unreal - Added support for UE5.1 preview 2.
    • +
    +

    26/09/22 2.02.09 - Studio API minor release (build 128289)

    +

    Features:

    +
      +
    • Studio API - Error now logged when attempting to set a readonly Parameter, or when attempting to set a Global Parameter from an EventInstance.
    • +
    • Core API - Deprecated Sound.readData(IntPtr, uint, out uint) in C# wrapper. Instead use Sound.readData(byte[], out uint) or Sound.readData(byte[]).
    • +
    • Core API - Added FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED callback to notify when new data recorded to FMOD::Sound.
    • +
    • Core API - GameCore - Increased the limits of SetXApuStreamCount to match Microsoft documented maximums.
    • +
    • Unity - Added UnloadBank overloads for TextAsset and AssetReference.
    • +
    • Unreal - Added "Enable API Error Logging" option to Advanced settings section. Integration will log additional internal errors when enabled.
    • +
    • Unreal - LoadBank node "Blocking" enabled by default.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed potential crash if calling DSP::setParameter on a Pan DSP when using the Studio API.
    • +
    • Core API - Fixed ChannelGroup::setPaused (false) to behave the same as Channel, ensuring any 3D calculations are performed before becoming audible.
    • +
    • Core API - Fixed Opus producing different FSBank result on AMD and Intel CPUs.
    • +
    • Core API - Fixed errors in the calculatePannerAttributes() function presented in Core API Guide section 3.5 Controlling a Spatializer DSP (formerly Driving the Spatializer).
    • +
    • Core API - Increased net streaming max URL length to 2048.
    • +
    • Core API - GameCore - Fixed potential XApu stream leak when playing a multi-channel Sound as the hardware limit is reached.
    • +
    • Core API - iOS - Fixed potential crash during System::mixerSuspend / System::mixerResume when playing audio with the platform native AudioQueue (AAC) decoder.
    • +
    • Core API - iOS - Fixed simulator detection.
    • +
    • Core API - Mac - Fixed CoreAudio crash when output device reports >32 outputs.
    • +
    • Core API - Win - Fixed WinSonic crash when the device list changes before System::init.
    • +
    • Resonance - Android - Removed dependency on libc++_shared.so.
    • +
    • Unity - Fixed FMODStudioSettings.asset marked dirty every time Editor reopens.
    • +
    • Unity - Prevented unnecessary allocation when setting parameter on an FMOD StudioEventEmitter.
    • +
    • Unity - Fixed errors when upgrading Unity versions.
    • +
    • Unreal - Provided default values to prevent various initialization warnings.
    • +
    +

    Notes:

    +
      +
    • Unreal - Moved various internal functions and fields to private.
    • +
    +

    15/08/22 2.02.08 - Studio API minor release (build 126901)

    +

    Features:

    +
      +
    • Core API - Added FMOD_INIT_CLIP_OUTPUT flag to enable hard clipping of float values.
    • +
    • Core API - GameCore - Added SetXApuStreamCount and XDspConfigure to C# wrapper.
    • +
    • Core API - PS5 - Added AcmConfigure and AjmConfigure to the C# wrapper.
    • +
    • Core API - PS5 - Opus hardware decoding is now supported.
    • +
    • Core API - PS5 - Added vibration support for the PSVR2 controller via FMOD_PORT_INDEX_FLAG_VR_CONTROLLER.
    • +
    • Unity - Timeline events now begin playback from relative playhead position when auditioning in the timeline.
    • +
    +

    Fixes:

    +
      +
    • Studio API - EventDescription::is3D now returns the correct result if the Event uses SpeedAbsolute or DistanceNormalized parameters. Requires bank rebuild.
    • +
    • Core API - Fixed ASIO driver enumeration crash caused by invalid driver.
    • +
    • Core API - Fixed incorrect thread IDs being used on pthread based platforms.
    • +
    • Core API - Fixed System::setReverbProperties / FMOD_DSP_TYPE_SFXREVERB not working with 7.1.4 input.
    • +
    • Core API - Fixed crash from reading bad m3u file.
    • +
    • Core API - Fixed the memory tracking system sometimes running out of memory.
    • +
    • Core API - GameCore - Fixed potential crash when there are insufficient xAPU resources remaining.
    • +
    • Core API - Win - Fixed crash in device enumeration cleanup.
    • +
    • Core API - C# - Some callback types renamed in fmod_dsp.cs to match C header. DSP_CREATECALLBACK becomes DSP_CREATE_CALLBACK for example.
    • +
    • Unity - Updated deprecated GameCore build target and runtime platform for Unity 2019.4.
    • +
    • Unity - Fixed issue with "Desktop" being added to build path twice when selecting "Multiple Platform Build" Source Type.
    • +
    • Unity - Fixed issue with HaveAllBanksLoaded not working when banks loaded via AssetReferences.
    • +
    • Unity - Fixed UnsatisfiedLinkError crash on Android when no FMODUnity components present.
    • +
    • Unity - Improved readability of folders in CreateEventPopup.
    • +
    • Unreal - Fixed Blueprint LoadBank not correctly honouring Load Sample data flag.
    • +
    • Unreal - Removed spurious log warning about initial value of global parameters.
    • +
    • Unreal - Fixed memory leak when using PlayEventAttached in nosound mode.
    • +
    +

    Notes:

    +
      +
    • Switch - Now built with SDK 14.3.0.
    • +
    • Unreal - Added support for UE5.0.3.
    • +
    +

    18/05/22 2.02.07 - Studio API minor release (build 125130)

    +

    Features:

    +
      +
    • Core API - HTML5 - FMOD now handles user interaction internally to allow sound to work. The developer no longer has to handle boilerplate code to allow user interaction.
    • +
    • FSBank API - Mac - Added FSBankLib.
    • +
    • Unreal - Added support for speaker mode 7.1.4 in the editor settings.
    • +
    • Unreal - Added separate platforms settings for a variety of options.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed steal quietest not working correctly causing new EventInstances to think they are the quietest and not play.
    • +
    • Core API - Fixed ChannelGroup::setPitch when applied to the master channel group causing exaggerated pitch changes as time goes on.
    • +
    • Core API - HTML5 - Fixed integer overflow crash in fastcomp builds after 70 mins.
    • +
    • Core API - Linux - Fixed potential hang on shutdown due to bad sound drivers.
    • +
    • Core API - Linux - Fixed crash during System::init if using System::setOutput (FMOD_OUTPUTTYPE_PULSEAUDIO) on a machine without PulseAudio.
    • +
    • Unity - Fixed an error occurring when a timeline playhead leaves an event playable.
    • +
    • Unity - Added missing EventReference overload for PlayOneShotAttached.
    • +
    • Unity - Fixed refcount not updating when LoadBank called with TextAsset.
    • +
    • Unity - Fixed scene hanging when auditioning timeline.
    • +
    • Unity - Fixed events in timeline not refreshing when banks updated.
    • +
    • Unity - Fixed platform objects on Settings asset showing no name in the project window.
    • +
    • Unity - Fixed stale event name left behind after clearing an FMODEventPlayable's event reference field.
    • +
    • Unity - Fixed an error caused by changing an event reference while an event is being previewed in the browser.
    • +
    • Unity - HTML5 - Fixed the audio not playing in the Safari web browser.
    • +
    • Unreal - Fixed not being able to audition events in the editor.
    • +
    • Unreal - Fixed Editor crash when importing bank with paths containing a period.
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 9.508.001.
    • +
    • PS5 - Now built with SDK 5.00.00.33.
    • +
    • Unreal - Added support for UE5.
    • +
    +

    16/03/22 2.02.06 - Studio API minor release (build 124257)

    +

    Features:

    +
      +
    • Core API - Android - Added support for loading sounds via Uri paths.
    • +
    • Unity - Added ability to set individual channel counts for each codec format supported by a given platform.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed issue where certain timeline instruments were causing EventDescription::isOneshot to incorrectly return false. This requires banks to be rebuilt to take effect.
    • +
    • Core API - Fixed rare vorbis decoding error.
    • +
    • Core API - Fixed crash in OutputASIO::stop if start has not been called.
    • +
    • Core API - Fixed static noise or clicks when using DSP::setWetDryMix.
    • +
    • Core API - Fixed FMOD_CODEC_METADATA macro parameters.
    • +
    • Core API - Fixed bad ASIO driver causing enumeration to fail.
    • +
    • Core API - Android - Fixed crash from headset detection with incorrect Java lifetimes.
    • +
    • Core API - HTML5 - Fixed an issue where FMOD_OUTPUTTYPE_AUDIOWORKLET would crash if the speaker mode setup was greater than stereo while refreshing the web browser.
    • +
    • Core API - PS5 - Fixed a crash in the convolution reverb to do with deallocating GPU memory.
    • +
    • Core API - UWP - Fixed corrupted audio using certain headsets that implement virtual surround sound such as those from Razer.
    • +
    • Core API - Win - Fixed WASAPI device enumeration failure causing initialization to fail.
    • +
    • Unity - Fixed il2cpp crash caused by CREATESOUNDEXINFO callbacks not being marshaled when loading sounds from audio tables.
    • +
    • Unity - Fixed event browser preview area not initially displaying at correct size.
    • +
    • Unity - Fixed error shown when attempting to delete Default and Editor platforms.
    • +
    • Unity - Fixed audible glitches on PS4 and PS5 due to FMOD feeder thread getting blocked.
    • +
    • Unity - Fixed enumeration of bank folders when creating an event from an event reference field in the inspector.
    • +
    • Unity - Fixed error if Resonance Listener is not on the Master Bus.
    • +
    • Unity - Fixed banks being reimported with every build when set to AssetBundle import type.
    • +
    • Unity - Fixed cached events losing GUIDs after updating from a 2.01 or earlier integration.
    • +
    • Unreal - Fixed crash when importing banks containing ports.
    • +
    • Unreal - Fixed net streams not working with programmer sounds.
    • +
    • Unreal - Fixed problem locking all buses on bank load if banks haven't finished loading.
    • +
    • Unreal - Fixed AudioComponent::OnEventStopped sometimes being called twice.
    • +
    • Unreal - Fixed FMODAudioComponents inside AudioVolumes not having the correct AmbientVolumeParameter value when Started after being Stopped.
    • +
    +

    Notes:

    +
      +
    • GameCore - Now built with October 2021 QFE 1 GDKX.
    • +
    • Stadia - Now built with SDK 1.71.
    • +
    • Switch - Now built with SDK 13.3.0.
    • +
    • Unity - GameCore - Now built with June 2021 QFE 4 GDKX.
    • +
    • Unreal - Added support for UE5.0 preview 1.
    • +
    +

    06/02/22 2.02.05 Patch 1 - Studio API patch release (build 123444)

    +

    Fixes:

    +
      +
    • Studio API - Fixed crash when allocating internal pool resources. Introduced 2.02.05.
    • +
    +

    Notes:

    +
      +
    • Due to the severity of the above mentioned issue, the previous release of 2.02.05 has been withdrawn and should not be used.
    • +
    +

    21/12/21 2.02.05 - Studio API minor release (build 122665)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed issue where an async instrument would not trigger if its delay interval was greater than its length on the timeline.
    • +
    • Studio API - Fixed issue where the description of an event retrieved from a start event command would have an invalid handle unless first retrieved via Studio::System::getEvent.
    • +
    • Studio API - Start Event Command Instrument now gracefully handles the case when the event it is trying to start has not been loaded.
    • +
    • Studio API - Fixed issue where the scatterer instrument can spawn instruments inconsistently under certain conditions.
    • +
    • Studio API - Fixed issue where audibility based stealing would not use FMOD_DSP_PARAMETER_OVERALLGAIN::linear_gain_additive in its calculation. For events using the object spatializer or the resonance audio source this would cause the attenuation to be ignored for stealing.
    • +
    • Studio API - Improved general Studio API performance.
    • +
    • Studio API - Improved determination of whether a nested event will end, reducing the incorrect cases where it would be stopped immediately.
    • +
    • Studio API - Fixed Studio::EventInstance::getMinMaxDistance returning -1 before event starts playing.
    • +
    • Core API - GameCore - Fixed very rare Opus decoding hang.
    • +
    • Core API - GameCore - Improved convolution reverb XDSP recovery in case of unexpected hardware failure.
    • +
    • Core API - Linux - PulseAudio now attempts to load and connect for detection rather than running 'pulseaudio --check'. This improves PipeWire compatibility.
    • +
    • Unity - Fixed event reference updater not handling multiple game objects with the same path.
    • +
    • Unity - Fixed setup window showing event reference update step as completed when incomplete tasks remained.
    • +
    • Unreal - FMOD plugin no longer overwrites existing Unreal editor style.
    • +
    • Unreal - Fixed BankLookup being regenerated unnecessarily.
    • +
    • Unreal - Fixed FMODAudioComponent not handling streaming levels correctly.
    • +
    • Unreal - XSX - Fixed builds not finding fmod libs.
    • +
    • Unity - Fixed platform-specific settings not being saved.
    • +
    +

    Notes:

    +
      +
    • Stadia - Now built with SDK 1.62, LLVM 9.0.1.
    • +
    • Unity - First-time installation no longer requires an event reference update scan.
    • +
    • Unity - Event reference update tasks now display their completion status and can no longer be redundantly run multiple times.
    • +
    • Unity - Editor now restores scene setup after finishing execution of event reference update tasks.
    • +
    +

    19/11/21 2.02.04 - Studio API minor release (build 121702)

    +

    Features:

    +
      +
    • Core API - Added support for FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED with multiple Systems
    • +
    • Core API - Switch - Added Opus decoding for streams.
    • +
    • Unity - HTML5 - Added support for Unity 2021.2.
    • +
    +

    Fixes:

    +
      +
    • Studio API - When loading pre 2.02 banks, Studio::EventDescription::getMinMaxDistance will now provide a minimum and maximum value based on the spatializers of that event instead of 0.
    • +
    • Core API - Fixed potential crash / error / corruption if using Object spatializer and multiple listeners.
    • +
    • Core API - Improve handling of disconnected devices.
    • +
    • Core API - Fixed incorrect audibility calculation causing some sounds to incorrectly go virtual when sends are involved.
    • +
    • Core API - iOS - Fixed crash when suspending multiple FMOD::System objects while using the AudioQueue codec.
    • +
    • Core API - ARM based iOS / Mac / Switch. Three EQ effect optimized to be up to 2x faster.
    • +
    • Core API - Android and macOS - Now use Monotonic clock instead of Wall clock.
    • +
    • Core API - Win - Fixed issue where WASAPI would fail to gracefully handle an invalidated device due to a disconnection during initialization.
    • +
    • Unity - Added a prompt to update the FMOD folder metadata if necessary so that it can be moved to any location in the project.
    • +
    • Unity - Fixed a bug causing the Event Browser to be in an invalid state when reopening the Unity Editor.
    • +
    • Unity - Fixed a bug that caused stale cache assets to not be cleared correctly.
    • +
    • Unity - Fixed attenuation override values not updating until next GUI change when a new event is selected for an emitter.
    • +
    • Unity - Fixed a denied access error when updating FMOD for Unity integration.
    • +
    • Unity - Fixed the bank cache refresh failing when the event browser is open.
    • +
    • Unity - Android - Fixed command line builds not using split application binary.
    • +
    • Unity - Mac - Added a prompt to fix bad line endings in FMOD bundle Info.plist files if necessary (these could cause DllNotFoundException errors).
    • +
    • Unity - Fixed an error preventing command line builds from completing.
    • +
    • Unreal - Linux - Fixed missing libs.
    • +
    +

    Notes:

    +
      +
    • GameCore - Now built with June 2021 QFE 2 GDKX.
    • +
    • PS4 - Now built with SDK 9.008.001.
    • +
    • PS5 - Now built with SDK 4.00.00.31.
    • +
    • Switch - Now built with SDK 12.3.7.
    • +
    • Unity - Removed obsolete x86 Linux binaries.
    • +
    • Unity - RuntimeManager's AnyBankLoading and WaitForAllLoads methods have been renamed for clarity (to AnySampleDataLoading and WaitForAllSampleLoading respectively), retaining the same functionality. The previous methods remain for compatibility but are considered deprecated.
    • +
    +

    08/09/21 2.02.03 - Studio API minor release (build 120077)

    +

    Features:

    +
      +
    • Core API - It is now possible to specify the Opus codec count via FMOD_ADVANCEDSETTINGS, previously it was hardcoded to 128.
    • +
    • Core API - PS5 - Added ACM convolution reverb support.
    • +
    • Core API - GameCore - Added XDSP convolution reverb support on Scarlett hardware.
    • +
    • Core API - Win, GameCore, XBoxOne - Added recording support to WinSonic.
    • +
    • Unity - Added EventReference.Find() to make setting default values on EventReference fields more convenient.
    • +
    • Unreal - UE4.26 on - Integration setup will now offer to add generated assets to package settings.
    • +
    • Unreal - UE4.26 on - Added Commandlet to support generating assets from command line.
    • +
    • Unity - Added IsInitialized property to EventManager to make it easier to know when EventManager is safe to call.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed buffer overflow issues with command replays, system is now more robust against failure and buffers have grown to handle demand.
    • +
    • Studio API - Fixed issue where automating a labelled parameter under specific circumstances would produce an incorrect result.
    • +
    • Studio API - Fixed 7.1.4 sends losing their height speakers at the return.
    • +
    • Studio API - Fixed issue where event instruments inside a multi instrument were unable to be seemlessly looped with simple events.
    • +
    • Studio API - Streaming instruments no longer can have the end of the audio cut off if they take too long to load.
    • +
    • Studio API - Fixed volume spike at start of multi instruments using both fade curves and seek offsets.
    • +
    • Core API - Fixed issue with System::registerCodec returning FMOD_ERR_PLUGIN_VERSION regardless of FMOD_CODEC_DESCRIPTION apiversion.
    • +
    • Core API - Fixed convolution reverb crash if out of memory.
    • +
    • Core API - Fixed rare audio corruption / noise burst issue.
    • +
    • Core API - Fixed FSBankLib AT9 encoder failing with an internal error on newer versions of libatrac9.dll, 4.3.0.0 onward.
    • +
    • Core API - Fixed potential crash when up-mixing quad to 5.1.
    • +
    • Core API - GameCore - Reduced the chances of running out of Opus streams when playing back Opus compressed banks on Scarlett hardware.
    • +
    • Core API - Linux - Added support for automatic device switching.
    • +
    • Core API - Android - Fixed issue where AAudio would restart occasionally on certain devices.
    • +
    • Core API - Android - Fixed issue where AAudio would would request an amount of data far larger than its burst size on certain devices.
    • +
    • Unity - Fixed a bug where settings could be accessed while an asset database refresh was in progress, causing settings to be wiped.
    • +
    • Unity - Fixed live update breaking when domain reload is disabled.
    • +
    • Unity - Fixed an invalid handle error that would occur when an attached instance ends.
    • +
    • Unity - Fixed StudioParameterTrigger and StudioGlobalParameterTrigger not receiving Object Start and Object Destroy events.
    • +
    • Unity - Fixed the attenuation override values being overwritten when selecting multiple event emitters.
    • +
    • Unity - Fixed global parameter trigger browser showing other FMOD folders.
    • +
    • Unity - Fixed referenced events not being played when an event is previewed in the event browser if the referenced events are in a different bank.
    • +
    • Unity - Fixed RuntimeManager.MuteAllEvents not working in editor.
    • +
    • Unity - Fixed bank names including the .bank file extension when Load Banks is set to Specified.
    • +
    • Unity - Fixed a bug allowing multiple localized banks to be loaded and preventing them from being unloaded.
    • +
    • Unity - Fixed compatibility of native libraries changing after build.
    • +
    • Unity - Fixed stretched logo texture in setup wizard when targeting iOS as build platform.
    • +
    • Unity - Fixed an error caused by auditioning events with global parameters in the event browser.
    • +
    • Unity - Fixed an error state caused by inspecting a game object that contains both a Unity Image and an FMOD StudioEventEmitter.
    • +
    • Unity - Fixed staging instructions appearing for fresh integration installations.
    • +
    • Unity - Fixed an exception caused by disconnected prefab instances when updating event references.
    • +
    • Unreal - Fixed FMODAudioComponents continuing to play after actors have been destroyed.
    • +
    • Unreal - Fixed 'Reload Banks' menu option.
    • +
    • Unreal - Fixed error when building installed engine with FMOD plugin.
    • +
    +

    Notes:

    +
      +
    • GameCore - Now built with June 2021 QFE 1 GDKX.
    • +
    • Stadia - Now built with SDK 1.62
    • +
    • Unity - Removed a sleep loop in StudioEventEmitter.Start().
    • +
    • Unreal - Added support for UE4.27.
    • +
    +

    26/07/21 2.02.02 - Studio API minor release (build 118084)

    +

    Features:

    +
      +
    • Core API - Mac - Added Dolby PLII downmix support.
    • +
    • Unity - When Event Linkage is set to Path, the EventReference property drawer and Event Reference Updater tool can now update paths for events which have been moved in FMOD Studio (detected via matching GUIDs).
    • +
    • Unity - Console logging from the plugin now follows the logging level specified for FMOD.
    • +
    • Unity - Improved the Asset Bundle import type to better support Addressables: FMOD now creates a stub asset for each source .bank file, which can be added to version control and to Addressables Groups. Stub assets are replaced with source .bank files at build time, and reverted to stubs after each build.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed issue where silence instruments placed after a set parameter command instrument would be skipped.
    • +
    • Studio API - Fixed popping that would occur with fade curves and multi instruments in the right conditions.
    • +
    • Studio API - Fixed issue where automation and modulation would not evenly distribute values for discrete parameters.
    • +
    • Studio API - Fixed sustain point behavior where the sustain point is at the same time as the end of a loop region.
    • +
    • Studio API - Async instruments with infinite loop counts will play out their last loop after being untriggered.
    • +
    • Studio API - Scatterer instruments that have been untriggered will no longer fade out child instruments.
    • +
    • Studio API - Fixed issue where scatterer instruments would spawn instruments inconsistently.
    • +
    • Studio API - Fixed a stack overflow when releasing a very large number of events in a single frame.
    • +
    • Core API - Fixed FMOD::CREATESOUNDEXINFO::initialseekposition causing sound to not stop at the correct time.
    • +
    • Core API - Fixed disconnecting channel groups from ports when multiple instances of the same port are connected.
    • +
    • Core API - Fixed a possible crash by increasing the stack size of the file thread from 48k to 64k.
    • +
    • Core API - Fixed Object Spatializer getting out of sync with the mixer when the mixer buffer is starved, this could also cause asserts to appear the log.
    • +
    • Core API - GameCore - Fixed a race condition that could cause a hang when playing Opus compressed audio.
    • +
    • UE4 - Fixed default locale setting not working in cooked builds.
    • +
    • Unity - Fixed references in EventReferenceUpdater.cs to classes unavailable when the Unity Timeline package is missing.
    • +
    • Unity - Fixed event browser being unable to audition events when an encryption key is in use.
    • +
    • Unity - Fixed setup wizard not marking current scene as dirty when replacing Unity audio listeners.
    • +
    • Unity - Fixed banks failing to load on Mac when the project is saved in Unity on Windows.
    • +
    • Unity - Fixed a crash caused by disabling API error logging.
    • +
    • Unity - Fixed benign errors being logged to the console when API logging is enabled.
    • +
    • Unity - Fixed all banks being reimported whenever the banks are refreshed, even if nothing has changed.
    • +
    • Unity - Fixed an exception being thrown when building if version control is enabled.
    • +
    • FSBank - Fixed compatibility issue with Windows 7.
    • +
    • Profiler - Fixed compatibility issue with Windows 7.
    • +
    +

    Notes:

    +
      +
    • HTML5 - Now built with SDK 2.0.20 (Upstream) and SDK 1.40.1 (Fastcomp).
    • +
    • iOS - Now built with iOS SDK 14.5 (Xcode 12.5.1).
    • +
    • Mac - Now built with macOS SDK 11.3 (Xcode 12.5.1), min deploy target is now 10.9 as mandated by Xcode.
    • +
    • Unity - Moved images into the Assets/Plugins/FMOD folder.
    • +
    • Unreal - Added support for UE5.0 (EA1).
    • +
    +

    26/05/21 2.02.01 - Studio API minor release (build 116648)

    +

    Features:

    +
      +
    • Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT which returns a FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES containing the event's id.
    • +
    • Studio API - Added an FMOD_STUDIO_PARAMETER_LABELED flag.
    • +
    • Core API - Added loudness meter to the DSP API. The loudness meter is intended for development purposes and is not recommended to be included in shipped titles.
    • +
    • Unity - Improved the UI for setting values on discrete and labeled parameters.
    • +
    • Unity - Added FMODUnity.Settings.ForceLoggingBinaries to force FMOD to use the logging binaries even when BuildOptions.Development is not set.
    • +
    • Unity - Added the ability to set global parameters when auditioning an event.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Improved performance of repeated calls to Studio::EventDescription::isStream and Studio::EventDescription::isOneShot.
    • +
    • Studio API - Removed potential for performance hit from retrieving final volume and final pitch values due to thread contention.
    • +
    • Studio API - Fixed issue with audio device switching.
    • +
    • Studio API - Restrict maximum number of non-zero length transitions to 31 per update to prevent overloading the scheduler.
    • +
    • Core API - GameCore - Fixed error log (assert) with logging build when playing multichannel Opus.
    • +
    • Core API - GameCore - Fixed rare Opus failure / hang when playing streams.
    • +
    • Core API - GameCore - Fixed error log (assert) when seeking XMA streams near the file end.
    • +
    • Core API - Win/UWP/GameCore - Fixed WinSonic not falling back to no-sound automatically if no devices are available.
    • +
    • Core API - C# - Unblocked potential stalls when calling Studio::EventInstance::getVolume / Studio::EventInstance::getPitch when finalVolume / finalPitch isn't requested.
    • +
    • Unity - Fixed global parameters disappearing if banks are refreshed when the master bank hasn't changed.
    • +
    • Unity - Fixed the setup wizard's Updating page status being reset whenever scripts are recompiled.
    • +
    • Unity - Fixed errors that occur when Settings.OnEnable() is called on an object that is already initialized (e.g. "Cleaning up duplicate platform" and "An item with the same key has already been added").
    • +
    • Unity - Reverted binary selection at build time to the old method of checking for BuildOptions.Development in BuildReport.summary.options, as checking for the DEVELOPMENT_BUILD symbol was failing in some situations and causing DllNotFoundExceptions.
    • +
    • Unity - Fixed bank sizes not being displayed in the event browser.
    • +
    • Unity - Fixed compiler errors that appear when Unity's Physics and Physics 2D packages are disabled.
    • +
    • Unity - Fixed "The name 'StaticPluginManager' does not exist" error when calling AddressableAssetSettings.BuildPlayerContent() on IL2CPP platforms.
    • +
    • Unity - Removed cleanup of RegisterStaticPlugins.cs when a build finishes, in order to avoid recompiling scripts unnecessarily.
    • +
    • Unity - Create the Assets/Plugins/FMOD/Cache folder if it does not exist when generating RegisterStaticPlugins.cs during a build.
    • +
    +

    Notes:

    +
      +
    • Unity - Added type-specific icons for global parameters in the event browser.
    • +
    • Unity - Removed conditional code below Unity 2019.4 minimum specification.
    • +
    • PS4 - Now built with SDK 8.508.
    • +
    • PS5 - Now built with SDK 3.00.00.27.
    • +
    +

    15/04/21 2.02.00 - Studio API major release (build 115890)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed behavior interaction between timelocked multi instruments and sustain points so that multi instruments will play from the same point that they were stopped via the sustain point.
    • +
    +

    Notes:

    + +

    12/02/21 2.01.09 - Studio API minor release

    +

    Features:

    +
      +
    • Studio API - Added FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED and FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED.
    • +
    • Studio API - Added Studio::EventDescription::isDopplerEnabled. Will return false with banks built prior to 2.01.09.
    • +
    • Unity - Added a Volume property to FMOD Event Tracks.
    • +
    • Unity - Improved plugin lib updates by automating the process in a few simple steps.
    • +
    • Unity - Added 7.1.4 speaker mode to Project Platform in the settings menu.
    • +
    • Unity - Added support for generating unit options for Unity 2021 Visual Scripting package.
    • +
    • Unity - Added option to enable error reporting to Unity console from internal FMOD system.
    • +
    • Unity - Added a Setup Wizard to help with adding FMOD to projects.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed possible memory corruption due to race condition between user code creating sounds asynchronously using sound info from an audio table and unloading the bank containing the audio table.
    • +
    • Studio API - Improved error detection and documentation regarding the requirement of loading asset banks at the same time as metadata banks.
    • +
    • Studio API - Fixed issue where stopping conditions on nested events without ahdsr modulators would not play out when the parent event is still playing and the nested event becomes untriggered.
    • +
    • Studio API - Fixed issue where hot swapping an event via live update would invalidate the API handle.
    • +
    • Studio API - Fixed incorrect count from Studio::Bank::getEventCount when loading banks built with 1.07, 1.08 or 1.09.
    • +
    • Core API - Fixed substantial performance issue when connected to a profiler.
    • +
    • Core API - Fixed sync points potentially being skipped as Channels transition from virtual to real.
    • +
    • Core API - Fixed warning being logged about truncated files on user created sounds.
    • +
    • Core API - Fixed hang on .S3M format playback when seeking past calculated end of song with FMOD_ACCURATETIME.
    • +
    • Core API - Fixed some netstreams return FMOD_ERR_HTTP. Introduced 2.01.02.
    • +
    • Core API - Fixed potential audio corruption when using the object spatializer.
    • +
    • Core API - Fixed System::getPluginHandle returning internal only DSPs.
    • +
    • Core API - Fixed crash with Convolution Reverb. Introduced 2.01.08.
    • +
    • Core API - Fixed early and late delay support for FMOD_DSP_TYPE_SFXREVERB. Introduced 2.01.04.
    • +
    • UE4 - Add a configurable delay to automatic bank reloading to avoid a race condition between banks being rebuilt in Studio and the integration trying to reload them.
    • +
    • UE4 - Remove unsupported log levels from settings.
    • +
    • UE4 - Fixed blueprint AnimNotify causing Editor to crash.
    • +
    • UE4 - 4.26 - Fixed asset generation regenerating assets when banks have not been modified.
    • +
    • UE4 - 4.26 - Fixed crashes caused by attempting to regenerate assets which are read-only on disk. User is now prompted to check-out or make writable assets which are read-only on disk.
    • +
    • UE4 - 4.26 - Fixed sequencer integration.
    • +
    • UE4 - 4.26 - Fixed AnimNotify not automatically loading referenced event asset.
    • +
    • UE4 - 4.26 - Fixed FindEventByName failing to load required event asset.
    • +
    • UE4 - 4.26 - Fixed crash when running with sound disabled (eg. running as A dedicated server or running with the "-nosound" command line option).
    • +
    • UE4 - iOS/tvOS - Fixed audio occasionally not returning on application resume.
    • +
    • UE4 - XboxOne - Fixed third party plugins not working.
    • +
    • Unity - Made binary selection at build time more robust by checking for DEVELOPMENT_BUILD in the active script compilation defines.
    • +
    • Unity - Fixed context menu entries being disabled on FMOD Event Playable parameter automation.
    • +
    • Unity - Fixed a hang that could occur when scripts were recompiled after a callback was fired from FMOD to managed code.
    • +
    • Unity - Fixed banks not loading on Mac if project was saved from PC to source control.
    • +
    • Unity - Fixed a number of build errors on various platforms caused by the static plugin system's use of the IL2CPP --additional-cpp command (the static plugin system now generates C# instead of C++).
    • +
    • Unity - PS5 - Removed unsupported Audio 3D option from the platform settings.
    • +
    • Unity - UWP - Fixed warnings and errors surrounding Marshal usage depending on Unity version, scripting backend and API compatibility combination.
    • +
    +

    Notes:

    +
      +
    • GameCore - Updated to February 2021 GDK.
    • +
    • UE4 - Changed default source directory for runtime bank files to Content/FMOD/Desktop. Platform specific INI files should be used to override this as appropriate.
    • +
    +

    11/02/21 2.01.08 - Studio API minor release (build 114355)

    +

    Features:

    +
      +
    • Core API - Added FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN, which is called when a buffered mixer output device attempts to read more samples than are available in the output buffer.
    • +
    • Core API - Mac - Added Resonance Audio Apple Silicon support.
    • +
    • Unity - Improved bank refresh logic and added a status window that appears when a refresh is about to happen.
    • +
    • Unity - Added support for automating event parameters on the Timeline.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed fast spawning scatterer instruments with low polyphony spawning too few instruments.
    • +
    • Studio API - Fixed a memory leak that could occur when a sound got stuck in the loading state.
    • +
    • Core API - Fixed crash on .XM format playback.
    • +
    • Core API - Fixed potential hang with net streams if server returns errors.
    • +
    • Core API - Fixed extraneous logging of internal pool allocations.
    • +
    • Core API - Fixed rare crash when releasing convolution reverb DSP instances.
    • +
    • Core API - UWP - Fixed logging spam when using WASAPI output mode.
    • +
    • UE4 - Expose the Enable Timeline Callbacks property of FMOD Audio Component to blueprints.
    • +
    • UE4 - Fixed crash which could occur when an FMOD Audio Component which uses a programmer sound is destroyed by unloading the map or closing the game.
    • +
    • Unity - Fixed Discrete and Labelled global parameters that do not appear in the Event Browser.
    • +
    • Unity - Fix multiple listeners positioning not working correctly.
    • +
    • Unity - Fixed sample data failing to load when Load Bank Sample Data is enabled in a project with separate asset banks.
    • +
    • Unity - Fixed an Android build error when the Export Project option is set.
    • +
    • Unity - Fixed FMOD IL2CPP arguments being left in ProjectSettings after building, which could break builds on other operating systems.
    • +
    • Unity - Android - Fixed an IL2CPP build error on some NDK versions.
    • +
    • Unity - PS5 - Fixed compile error due to stale platform API CS file.
    • +
    • Unity - iOS/tvOS - Fixed audio occasionally not returning on application resume.
    • +
    +

    Notes:

    +
      +
    • Switch - Now built with SDK 11.4.0.
    • +
    • UE4 - Added support for UE4.26.
    • +
    +

    18/12/20 2.01.07 - Studio API minor release (build 113487)

    +

    Features:

    +
      +
    • Core API - Added FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE.
    • +
    • Core API - Mac - Added Apple Silicon support.
    • +
    • Unity - Added support for generating unit options for Bolt visual scripting.
    • +
    • Unity - Added option to stop an emitter's event instance when the emitter is further than its maximum attenuation distance from all listeners.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Command replays now record the initial state of global parameters.
    • +
    • Studio API - Fixed errors from instrument creation failure not being reported to the error callback.
    • +
    • Studio API - Fixed crash due to null pointer dereference when instrument creation fails due to running out of memory.
    • +
    • Studio API - Fixed crash when unloading a bank from the FMOD_STUDIO_EVENT_CALLBACK_STOPPED callback.
    • +
    • Studio API - Fixed crash when hot swapping a nested event and its parent where the child event is registered before the parent event.
    • +
    • Studio API - Fixed spurious warning messages when connecting Live Update.
    • +
    • Studio API - Fixed crash which could occur if a user thread loads a bank asynchronously while another thread releases the system.
    • +
    • Studio API - Switch log messages about missing plugins from warning to log level when the system is initialized with FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS.
    • +
    • Core API - Fixed rare crash due to race condition when calling Sound::getOpenState for a sound created with FMOD_NONBLOCKING.
    • +
    • Core API - Fixed rare crash occurring some time after calling System::attachChannelGroupToPort due to internal buffer synchronization.
    • +
    • Core API - Fixed certain internet radio stations that serve up playlists failing to load correctly.
    • +
    • Core API - Fixed sidechain modulator release being cutoff if sidechain source is destroyed.
    • +
    • Core API - Linux - Fixed hang in shutdown when using ALSA as the output mode when ALSA is unable to write to the output buffer.
    • +
    • Core API - Android - Reduced AAudio fail to stop error message to a warning.
    • +
    • Core API - UWP - Fixed issue preventing loading of 32 bit x86 plugins.
    • +
    • UE4 - Fixed spurious warning messages when loading banks which use plugins.
    • +
    • UE4 - Fixed listener being stuck at world origin when using a standalone game from the editor (introduced in 2.00.12).
    • +
    • UE4 - XboxOne - Fixed users having to modify engine code to copy libs.
    • +
    • Unity - Android - Fixed Mobile Low and Mobile High platforms using the wrong bank path when on Android.
    • +
    • Unity - Prebuild debug warning added for invalid FMOD Event paths.
    • +
    • Unity - Fixed banks not being copied into the project when using Asset Bundles.
    • +
    • Unity - Fixed specified bank paths for multi platform builds.
    • +
    +

    Notes:

    +
      +
    • Core API - Changed THREAD_AFFINITY enum in C# wrapper from unsigned 64-bit integer to signed 64-bit integer, reducing the maximum supported number of cores by one.
    • +
    • GameCore - Updated to August 2020 QFE 5 GDK.
    • +
    • XboxOne - Now built with July 2018 QFE15 XDK.
    • +
    • PS4 - Resonance Audio now built with SDK 8.008.
    • +
    • PS5 - Resonance Audio now built with SDK 2.00.00.09.
    • +
    • iOS - Now built with iOS SDK 14.2 (Xcode 12.2), min deploy target for iOS is now 9.0 as mandated by Xcode.
    • +
    • Mac - Now built with macOS SDK 11.0 (Xcode 12.2).
    • +
    • Stadia - Now built with SDK 1.55.
    • +
    • Unity - Moved Timeline and Resonance Audio classes from global namespace into FMOD namespaces.
    • +
    +

    13/11/20 2.01.06 - Studio API minor release (build 112764)

    +

    Features:

    +
      +
    • Core API - Added FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX.
    • +
    • Core API - PS5 - Added support for microphone recording.
    • +
    • Unity - Added support for Addressables.
    • +
    • Unity - In Events Browser the banks folders now show when mirroring is disabled.
    • +
    • Unity - Setting Live Update port per-platform is now supported.
    • +
    • Unity - FMOD now automatically selects the release or logging version of the native libraries at build time, based on the Development Build setting.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed issue where tempo based scatterer would play slightly off beat.
    • +
    • Core API - Improved error message when binding to a port fails due to a permission error.
    • +
    • Core API - Android - Fixed issue where audio would disconnect while debugging.
    • +
    • UE4 - Fixed deprecation warning in FMODStudioEditorModule.
    • +
    • Unity - Fixed FMOD_ERR_MEMORY caused by leaking System objects on play-in-editor script reload.
    • +
    • Unity - Fixed volume value in debug window.
    • +
    • Unity - Prebuild debug warning added for invalid FMOD Event paths.
    • +
    • Unity - HTML5 - Fixed error when building for development.
    • +
    • Unity - Switch - Fixed a build error due to fmodplugins.cpp not being enabled.
    • +
    +

    Notes:

    + +

    09/10/20 2.01.05 - Studio API minor release (build 112138)

    +

    Features:

    +
      +
    • Core API - XboxOne and Switch - Added ResonanceAudio plugin support.
    • +
    • Core API - GameCore - Added FMOD_GameCore_SetXApuStreamCount to control reserved XApu resources.
    • +
    • Unity - Edit Settings now allows FMOD output mode to be set per-platform.
    • +
    • Unity - Added support for specifying static plugins in the FMOD Settings.
    • +
    • Unity - Added support for setting a per-platform callback handler to run custom configuration code prior to initialization.
    • +
    • Unity - Added settings to customize DSP buffer length and count per-platform.
    • +
    • Unity - Added metering channel order setting.
    • +
    • Unity - Assembly Definition files added to the FMOD plugin.
    • +
    • Unity - The FMOD scripts will now compile without the unity.timeline package installed. If you wish to use Timeline you will need to install this package for Unity 2019.1 and above.
    • +
    • Unity - GameCore - Add resonance audio support.
    • +
    • Unity - iOS - Added simulator support.
    • +
    • Unity - PS5 - Add resonance audio support.
    • +
    • GameCore - Added support for decoding Opus compressed FSBs / Banks using platform hardware acceleration on Scarlett devices. This is a preview release of this feature, please report any bugs found directly to FMOD support email.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Live update socket errors are now handled gracefully, only warnings are logged.
    • +
    • Studio API - Fix marker callbacks for multiply nested events.
    • +
    • Studio API - Fixed Studio::EventDescription::is3D, Studio::EventDescription::isOneShot and Studio::EventDescription::isNested potentially returning an error when the event contains a nested reference to an event which has not been loaded.
    • +
    • Core API - Fixed crash in convolution reverb if out of memory.
    • +
    • Core API - Fixed rare crash when updating net stream metadata tags.
    • +
    • Core API - Android - Reduce popping encountered on certain handsets by dynamically adjusting latency.
    • +
    • Core API - Android - Fix issue where regular gaps in audio were encountered on handsets with using very large burst sizes.
    • +
    • Core API - Android - Fix issue where System::mixerSuspend would fail on certain handsets.
    • +
    • Core API - Mac - Fixed init returning an error when no output devices available.
    • +
    • Core API - Win - Fixed crash on Win7/8 devices with high end CPUs that support AVX-512.
    • +
    • Core API - Fix convolution crash if a small impulse was used followed by a large impulse. Introduced in 2.01.04.
    • +
    • Core API - HTML5 - Fix missing implementation of Sound::getSyncPoint/getSyncPointInfo/ addSyncPoint/deleteSyncPoint.
    • +
    • UE4 - Fixed potential null pointer dereference when updating FMOD listeners for play-in-editor session.
    • +
    • UE4 - PS5 - Disabled UE4 built-in audio to prevent crash at startup.
    • +
    • Unity - Fixed rare TimeZoneNotFoundException encountered on some devices.
    • +
    • Unity - Fixed play-in-editor not using new speaker mode when changed in settings.
    • +
    • Unity - HTML5 - Fix FMOD_ERR_UNSUPPORTED error being returned from bank loading. Introduced in 2.01.04.
    • +
    +

    Notes:

    +
      +
    • Studio API - Issues with reconnecting Live Update (primarily on mobile) have been resolved in FMOD Studio. Update to FMOD Studio 2.01.05 or higher.
    • +
    • GameCore - To produce Opus banks in FMOD Studio, add the new "Custom" platform to your project and select Opus as the encoding.
    • +
    • GameCore - Updated to June 2020 QFE 6 GDK.
    • +
    +

    10/09/20 2.01.04 - Studio API minor release (build 111454)

    +

    Features:

    +
      +
    • Studio API - Added a flag for discrete parameters to FMOD_STUDIO_PARAMETER_FLAGS
    • +
    • Core API - Convolution reverb optimizations. Now multithreaded to avoid spikes in mixer performance. Significant memory optimization with multiple instances.
    • +
    • Core API - Android - Added support for swapping output modes.
    • +
    • Core API - GameCore - Added FMOD_GAMECORE_PORT_TYPE_COPYRIGHT_MUSIC output port type.
    • +
    • Unity - Added OnEnabled and OnDisabled for StudioBankLoader.
    • +
    • Unity - Added attachedRigidbody to OnTriggerEnter and OnTriggerExit for EventHandler.
    • +
    • Unity - Updated the event browser for better performance and more consistent look and feel.
    • +
    +

    Fixes:

    +
      +
    • Core API - Android - Fixed recording support when using AAudio.
    • +
    • Core API - Android - Fixed issues with headphone detection with AAudio.
    • +
    • Core API - XboxOne - Fixed getOutputHandle not returning the IAudioClient on WASAPI.
    • +
    • UE4 - When running multiplayer PIE sessions a listener is added for each player in each viewport.
    • +
    • UE4 - Improved handling of FMOD Studio objects being renamed or removed when reloading banks. Previously it would appear that references to renamed objects were correctly handled when they were not; references in UE4 must be manually fixed up when FMOD Studio names are changed.
    • +
    • UE4 - Improved handling of unsupported characters in FMOD Studio object names.
    • +
    • Unity - Made the Studio Event Emitter initial parameter value UI handle prefab instances and multi-selections properly.
    • +
    • Unity - Fixed tooltips not working for EventRef.
    • +
    • Unity - Fixed bank loading on Android with split/non-split APKs.
    • +
    • Unity - Fixed plugin paths for Windows and Linux.
    • +
    +

    Notes:

    +
      +
    • Core API - GameCore - FMOD_GAMECORE_PORT_TYPE_MUSIC is no longer ignored by GameDVR. Use FMOD_GAMECORE_PORT_TYPE_COPYRIGHT_MUSIC for background music which should not be captured by GameDVR.
    • +
    • Stadia - Now built with SDK 1.50.
    • +
    • Android - Examples now include CMake based projects alongside the NdkBuild based projects.
    • +
    • GameCore - Updated to June 2020 QFE 4 GDK.
    • +
    +

    05/08/20 2.01.03 - Studio API minor release (build 110858)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed named marker callbacks for nested events.
    • +
    • Studio API - Fixed issue with accumulating event instruments spawned by a scatterer.
    • +
    • Studio API - Fixed issue where an event instance handle would incorrectly remain valid.
    • +
    • Studio API - Improved detection of user code incorrectly using a dangling pointer from a previously destroyed Studio System object.
    • +
    • Studio API - Improve panner envelopment when source is above or below the listener.
    • +
    • Studio API - Fixed FMOD_STUDIO_PARAMETER_DESCRIPTION::maximum being 1 higher than the maximum value which could be set.
    • +
    • Studio API - Fixed discrete parameters with non-zero seek speed or velocity changing value too quickly after having their value set by an API call.
    • +
    • Studio API - Fixed stopping conditions for nested events.
    • +
    • Core API - Ignore data and fmt sections of a wave file that are contained in lists.
    • +
    • Core API - iOS - Fixed stale audio from before System::mixerSuspend playing after calling System::mixerResume.
    • +
    • Core API - iOS - FMOD initializes with FMOD_OUTPUTTYPE_NOSOUND if unable to initialize due AVAudioSessionErrorCodeCannotStartPlaying. Switching to FMOD_OUTPUTTYPE_COREAUDIO via System::setOutput is also supported.
    • +
    • Core API - Mac - Fixed automatic default device switching.
    • +
    • Core API - Win - Improved handling of IPv6 net-streams.
    • +
    • Core API - Fixed FMOD_DSP_STATE_DFT_FUNCTIONS::inversefftreal function possibly causing corrupted audio if it and FMOD_DSP_STATE_DFT_FUNCTIONS::fftreal were called from different threads.
    • +
    • UE4 - Android - Fixed issue which could cause Android packaged builds to crash at startup.
    • +
    • Unity - Fix crash in HasBankLoaded if RuntimeManager isn't initialized.
    • +
    +

    Notes:

    +
      +
    • Unity - Added GameCore platform.
    • +
    • Switch - Now built with SDK 10.4.1.
    • +
    • GameCore - Updated to June 2020 QFE 1 GDK.
    • +
    +

    01/07/20 2.01.02 - Studio API minor release (build 110199)

    +

    Features:

    +
      +
    • Core API - GameCore - Added XMA support for Scarlett.
    • +
    • Core API - GameCore - Added background music port support.
    • +
    • Core API - PS5 - Added support for all platform specific ports, including background music, controller speaker and vibration.
    • +
    • Unity - Added field for specifying a sub directory for Banks in the settings.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed an issue with events referencing missing parameter descriptions when parameters were unused for a platform. For old banks references to missing parameter descriptions are stripped out of the event at load time. Newer banks will always include all parameter descriptions to ensure consistency across platforms.
    • +
    • Studio API - Fixed assert that would occur when setting a parameter that in turn creates an entity that also is listening for that parameter to change.
    • +
    • Studio API - Fixed doppler calculation to use listener attenuation position.
    • +
    • Studio API - Fixed memory leak caused by creating a bus with missing bank data.
    • +
    • Studio API - Improved performance of repeated calls to Studio::EventDescription::is3D.
    • +
    • Studio API - HTML5 - Fixed loadBankMemory not allowing a UInt8 memory object type to be passed to it.
    • +
    • Core API - Fixed silence from ports when switching from no-sound back to a valid output mode with ports.
    • +
    • Core API - Fixed incorrect return of FMOD_ERR_DSP_RESERVED on ChannelGroups caused by internal race condition.
    • +
    • Core API - Fixed FMOD_LOOP_NORMAL flag not working with netstreams that have "Accept-Ranges: bytes header".
    • +
    • Core API - iOS - Fixed conflicting ogg vorbis symbols if linking FMOD against a project containing vorbis already.
    • +
    • Core API - Android - Fixed detection of headphones being plugged and unplugged via the headphone jack on some devices.
    • +
    • Core API - GameCore - Thread names will now show up in PIX.
    • +
    • Core API - PS5 - Fixed crash when looping AT9 playback, no change required, fixed by SDK 1.00.
    • +
    • Core API - PS5 - Fixed AT9 decode failure when seeking near the end of the file.
    • +
    • Core API - Stadia - Fixed crash on playback of Vorbis compressed audio.
    • +
    • Unity - Fixed "ERR_INVALID_HANDLE" errors in UWP builds.
    • +
    • Unity - Changed banks to only be copied into the project when building.
    • +
    +

    Notes:

    +
      +
    • PS4 - Resonance Audio now built with SDK 7.508.
    • +
    • PS5 - Updated to SDK 1.00.00.39.
    • +
    • UE4 - Added GameCore platform.
    • +
    • UE4 - Added support for UE4.25.
    • +
    • UE4 - Added PS5 platform.
    • +
    +

    12/05/20 2.01.01 - Studio API minor release (build 109257)

    +

    Features:

    +
      +
    • Core API - Stadia - Added microphone recording support.
    • +
    • Unity - Added support for separate listener attenuation position.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed issue where an instrument not on the timeline would fail to be untriggered while the timeline is inside a source transition region.
    • +
    • Studio API - Improve loudness meter performance.
    • +
    • Studio API - Fixed crash that occurs with instrument hotswaps that change the instrument and its position on the timeline while auditioning.
    • +
    • Studio API - Fixed issue where scatterer instrument would spawn streaming instruments that would exceed the polyphony limit.
    • +
    • Studio API - Fixed issue where the Studio update thread could hang trying to release an event instance where the instance being released used a streaming programmer sound which was reused by another instance and the second instance was still active.
    • +
    • Studio API - Fixed scheduling behavior of events inside multi instruments so that the event will play out async instruments, ahdsr modulators and adjust to pitch modulation before playing the next item in the multi instrument. It will still play before DSP tails.
    • +
    • Core API - Fixed potential crash in the mixer or stream thread when playing MIDI / MOD style files due to race condition.
    • +
    • Core API - Android - Fixed potential crash when opening a file using the Android asset syntax file:///android_asset/.
    • +
    • Core API - PS5 - Fixed error being returned from platform specific affinity API.
    • +
    • UE4 - Fixed possible crash during module shutdown if DLLs aren't loaded correctly.
    • +
    • UE4 - Fixed Android builds crashing at startup.
    • +
    • Unity - Linux - Fixed FMOD_ERR_HEADERMISMATCH error due to conflict between FMOD Studio and FMOD Ex (built into Unity) in 2019.3.
    • +
    • Unity - Fixed settings bank path using wrong directory separators.
    • +
    • Resonance - Fixed rare crash in Resonance Audio due to thread safety issue.
    • +
    +

    Notes:

    +
      +
    • GameCore - Updated to April 2020 GDK.
    • +
    • Stadia - Now built with SDK 1.46.
    • +
    • PS4 Now built with SDK 7.508.
    • +
    • XboxOne - Now built with July 2018 QFE13 XDK.
    • +
    • HTML5 - Now built with SDK 1.39.11, both fastcomp and upstream.
    • +
    • Unity - Added PS5 platform.
    • +
    +

    23/03/20 2.01.00 - Studio API major release (build 108403)

    +

    Features:

    +
      +
    • Studio API - Studio::System::setListenerAttributes now supports a separate position argument for attenuation.
    • +
    • Core API - Optimized mixing and vorbis decoding. Performance increase of 2-2.5x on all platforms.
    • +
    • Core API - Optimized Multiband EQ. Performance increase of 2-3x on all platforms for stereo and higher channel count processing.
    • +
    • Core API - Added cross-platform API for setting thread affinity, stack size and priority via FMOD_Thread_SetAttributes.
    • +
    • Core API - Win - FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK now responds to default device changes.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed issue where async instruments on a transition timeline with fade out curves would snap to full volume when exiting the transition timeline.
    • +
    • Studio API - The end of destination and magnet regions are included as part of the timeline length.
    • +
    • Studio API - Changed behaviour of stopped async multi-instrument entries with unlimited loop counts to not play.
    • +
    • Studio API - Loop regions of lower priority that coincide with transitions are now followed during the transition's source timeline.
    • +
    • Core API - Fixed potential crash when calling Sound::getSubSound on a playing stream, this is now prohibited and will instead return an error.
    • +
    • Unity - Fixed compatibility issues with C# wrapper. FMOD objects are now passed as IntPtr for callback arguments from native to C#. Use the constructor of the correct type to recreate the object from the IntPtr.
    • +
    +

    Notes:

    +
      +
    • Core API - Calling Sound::getSubSound from FMOD_CREATESOUNDEXINFO::nonblockcallback is no longer a synchronous operation meaning an additional callback will execute when fetching the subsound has completed.
    • +
    • Core API - Removed stackSizeStream, stackSizeNonBlocking and stackSizeMixer from FMOD_ADVANCEDSETTINGS:: These are now set via FMOD_Thread_SetAttributes .
    • +
    • Core API - Removed deprecated FMOD_ADVANCEDSETTINGS::commandQueueSize member.
    • +
    • Core API - Removed all platform specific thread affinity APIs, affinity is now controlled via FMOD_Thread_SetAttributes.
    • +
    • Core API - Renamed FMOD_OUTPUT_DESCRIPTION::polling to FMOD_OUTPUT_DESCRIPTION::method.
    • +
    • Core API - When calling FMOD_Memory_Initialize with valid 'useralloc' and 'userfree' callbacks, the requirement of 'userrealloc' is now optional.
    • +
    • Core API - DSP Echo delay effect minimum reduced to 1 millisecond.
    • +
    • FSBank - Minimum requirement for Mac version of the FSBank tool has been lifted to macOS 10.12 due to framework update.
    • +
    • Profiler - Minimum requirement for Mac version of the Profiler tool has been lifted to macOS 10.12 due to framework update.
    • +
    +

    02/03/20 2.00.08 - Studio API minor release (build 108014)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed issue with determining the end of an event inside a multi instrument.
    • +
    • Studio API - Fixed issue with determining the end of an async instrument with pitch automation.
    • +
    • Studio API - Fixed potential crash when playing a command replay from a 64bit game on a 32bit host.
    • +
    • Studio API - Fixed issue where polyphony limits on an event and bus could both apply causing too many event instances to be stolen when starting a new event instance.
    • +
    • Studio API - Fixed issue where Studio update thread could get stuck in an infinite loop and eventually deadlock with the game thread when a sound object used for a programmer sound was used by more than one event instance.
    • +
    • Studio API - Fixed issue where transitioning from the start of a transition region to a destination marker using a relative transition with a tempo marker would result in the event stopping.
    • +
    • Studio API - HTML5 - Fixed missing plugin errors for banks using loudness meter, convolution reverb or pitch shifter. These effects can be CPU intensive so use them with caution.
    • +
    • Core API - Fixed seeking accuracy of mp3 files that use small mpeg frame sizes.
    • +
    • Core API - Fixed ChannelGroup::isPlaying from returning false on a parent ChannelGroup, when children groups in certain configurations had playing sounds.
    • +
    • Core API - iOS - Fixed issue causing MP3 netstreams to not work.
    • +
    • Core API - iOS - Fixed issue where FMOD_CREATECOMPRESSEDSAMPLE would not work as expected with MP3 files.
    • +
    • UE4 - Fixed crash in 4.24 caused by SetActive call in FMODAudioComponent.
    • +
    • UE4 - Fixed warning log message when using the IsBankLoaded blueprint function when the bank is not loaded.
    • +
    • Unity - TextAsset banks import directory now defaults to 'FMODBanks' instead of the root 'Assets' folder.
    • +
    • Unity - HTML5 - Fixed compilation issue preventing launch.
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with July 2018 QFE12 XDK.
    • +
    • PS4 - Resonance Audio now built with SDK 7.008.
    • +
    • HTML5 - JavaScript bindings are now separate from the main bitcode binary to facilitate recompilation of ASM.JS / WASM or usage in strictly native projects.
    • +
    +

    17/01/20 2.00.07 - Studio API minor release (build 107206)

    +

    Features:

    +
      +
    • Unity - Changing bank import type now gives you the option of removing the previously imported banks.
    • +
    • UE4 - Added getParameter functions for getting user and final values.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed application of fade curves to instruments when transitioning immediately between transition timelines.
    • +
    • Studio API - Fixed Studio::EventDescription::is3D to return true for events with scatterer instruments, for 3D instruments inside multi instruments, and for spatializers on non-master tracks.
    • +
    • Studio API - Fixed relative transition calculation when performing a transition jump that would incorrectly end up at the beginning instead of the end of the destination or vice versa.
    • +
    • Studio API - Fixed issue when encountering a loop region in a destination timeline which would stop the event in specific circumstances.
    • +
    • Studio API - Fixed crash when profiling runtime with an older Studio tool version.
    • +
    • Core API - Fixed asserts from setting readonly DSP data parameters when the setter isn't implemented.
    • +
    • Core API - Fixed FSBankLib Vorbis encoder not supporting quality zero as default.
    • +
    • Core API - Fixed System::setDriver not always applying if called after System::setOutput when the device list has changed.
    • +
    • Core API - Fixed DSP_PARAMETER_DESC being populated with incorrect data in C#.
    • +
    • Core API - Fixed MP3 codec not respecting FMOD_ACCURATETIME flag when played as FMOD_CREATECOMPRESSEDSAMPLE.
    • +
    • UE4 - Fixed EncryptionKey not being saved to packaged game. Bank encryption keys in existing projects will need to be re-entered after upgrading.
    • +
    • UE4 - XBoxOne - Fixed third party plugin path.
    • +
    • UE4 - Fixed FMODEvent::GetParameterDescriptions not working in built game.
    • +
    • Unity - Fix lag in editor due to banks being reimported.
    • +
    • Unity - Fixed FMODStudioCache causing deserialization exceptions by moving the file to a separate cache folder.
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 7.008.031.
    • +
    • Stadia - Now built with SDK 1.38.
    • +
    • Switch - Now built with SDK 9.3.0.
    • +
    • HTML5 - Now built with sdk-1.38.19-64bit
    • +
    • UE4 - Added support for UE4.24.
    • +
    • UE4 - Added support for Stadia.
    • +
    • OSX - Updated Resonance Audio plugin with performance improvements.
    • +
    +

    20/11/19 2.00.06 - Studio API minor release (build 106220)

    +

    Fixes:

    +
      +
    • Studio API - Fixed issue where a loop on an instrument followed immediately by a transition timeline could result in a short pause in playback.
    • +
    • Core API - Mac - Fix crash calling recordStart at the same time as unplugging a USB microphone.
    • +
    • Core API - Android - minimum Android version for AAudio support changed to 8.1 (API 27) to circumvent AAudio RefBase crash issue.
    • +
    • Core API - XboxOne - Fixed background music port going silent if XAudio is initialized outside of FMOD.
    • +
    • Core API - Stadia - Fixed crash at static initialization time when using the logging build on system software v1.37 and newer.
    • +
    • FSBank API - Win - Fixed bug introduced in 2.00.05 which prevented banks being built when passing a non-empty encryption key to FSBank_Build.
    • +
    • UE4 - Fixed asset loading errors on dedicated server.
    • +
    • Unity - Fixed integration deleting non FMOD bank/bytes files when refreshing.
    • +
    • Unity - Fixed handling of iOS AudioSession interruption notifications.
    • +
    +

    Notes:

    +
      +
    • iOS - Now built with iOS SDK 13.1 and tvOS SDK 13.0 (Xcode 11.1).
    • +
    • Mac - Now built with macOS SDK 10.15 (Xcode 11.1).
    • +
    +

    09/10/19 2.00.05 - Studio API minor release (build 105402)

    +

    Features:

    +
      +
    • Studio API - Add event and bus instance CPU profiling to the FMOD Studio API.
    • +
    • Core API - Stadia - Added voice output port FMOD_STADIA_PORT_TYPE_VOICE.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed crash caused by creating an instance of an event containing a nested event which has not been loaded.
    • +
    • Studio API - Fixed pitch changes on a bus propagating across sidechain connections.
    • +
    • Studio API - Fixed application of transition fade curves to parameter triggered instruments on multi track events.
    • +
    • Core API - Fixed mixer falling silent due to very small but not denormal positions being passed into the API.
    • +
    • Core API - Fixed crash when processing loops of FMOD_DSPCONNECTION_TYPE_SEND or FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN.
    • +
    • Unity - Removed high frequency of UnityEditor.SetDirty calls.
    • +
    • Unity - Fixed issues with using relative paths in linked project/bank directory.
    • +
    +

    Notes:

    +
      +
    • Switch - Now built with SDK 8.3.0.
    • +
    • XboxOne - Now built with July 2018 QFE9 XDK.
    • +
    +

    06/09/19 2.00.04 - Studio API minor release (build 104705)

    +

    Features:

    +
      +
    • Official support for Stadia as a separate platform is now complete, anyone using the Linux version should migrate across.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed issue where programmer sound without an associated sound would have unexpected behavior when modulated.
    • +
    • Studio API - Fixed issue where instruments with low polyphony would incorrectly fail to play.
    • +
    • Studio API - Fixed looping multi-instrument with streaming instruments cutting off near the end of the loop when the length of the multi-instrument is slightly longer than a multiple of the instrument length.
    • +
    • Studio API - Fixed issue where automation points are reused in transition timelines when both the timelines and the transition have no automation points.
    • +
    • Core API - Fixed crash caused by unlinking a convolution reverb dsp during a mix.
    • +
    • Core API - Fixed potential alignment crash on ARM devices if using FMOD_DSP_PAN.
    • +
    • Core API - Fixed leak of socket handles when binding to a listening port fails.
    • +
    • Core API - Win / UWP / XboxOne - Fixed incorrect DSP CPU reporting when using FMOD_OUTPUTTYPE_WINSONIC.
    • +
    • UE4 - Fixed crash in PlayEventAtLocation when world context is invalid.
    • +
    • UE4 - Fixed failed to load errors when playing in Standalone.
    • +
    • UE4 - Switch to using "Additional non-asset directories to copy" packaging setting for FMOD banks to avoid possible deadlocks at runtime.
    • +
    • Unity - Fixed banks being copied to project repeatedly when using AssetBundles.
    • +
    • Unity - Fixed Events not auditioning from split banks.
    • +
    • Unity - Fixed RuntimeManager being able to update the 3DAttributes for an Event Instance multiple times using different values.
    • +
    +

    02/08/19 2.00.03 - Studio API minor release (build 103912)

    +

    Features:

    +
      +
    • Core API - Improved ASIO channel mapping via FMOD_ADVANCEDSETTINGS::ASIOSpeakerList. Skips irrelevant speakers with FMOD_SPEAKER_NONE and supports devices up to 32 channels without using FMOD_SPEAKERMODE_RAW.
    • +
    • Core API - Android - Added support for AAudio via FMOD_OUTPUTTYPE_AAUDIO.
    • +
    • Core API - PS4 - Added ResonanceAudio plugin for PS4.
    • +
    • Core API - Android - Added support for setting thread affinity via FMOD_Android_SetThreadAffinity.
    • +
    • UE4 - Added blueprint node for Studio::EventInstance::release.
    • +
    • Unity - Added setParameter by name wrapper function to StudioEventEmitter.Features:
    • +
    • Unity - Fixed crash when setting logging level to LOG and entering playback.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed rare crash on Studio::System::release.
    • +
    • UE4 - Fixed FMODAudioComponent not being occluded are being stopped and restarted.
    • +
    • Unity - Fixed project determinism issue causing paths to update when opening the project on Windows and Mac.
    • +
    • HTML5 - FMOD Studio examples updated with 2.0 API changes.
    • +
    +

    Notes:

    +
      +
    • Switch - Now built with SDK 8.2.0.
    • +
    • XboxOne - Now built with July 2018 QFE7 XDK.
    • +
    +

    18/06/19 2.00.02 - Studio API minor release (build 102879)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Core API - Win 64bit - Skip JACK ASIO driver when enumerating ASIO devices. An unrecoverable crash occurs in the driver when attempting to query its capabilities.
    • +
    • UE4 - Fixed "Accessed too early?" crash by changing the plugin loading phase.
    • +
    • UE4 - Fixed OnEventStopped not being broadcast when the FMODAudioComponent is destroyed.
    • +
    • Unity - Fixed third party plugin paths for Win32 and Mac.
    • +
    • Unity - Changed the Debug Overlay Window ID to avoid conflicts.
    • +
    • +

      Unity - iOS - Fixed sound stopping in editor when focus is lost.

      +
    • +
    • +

      PS4 - Now built with SDK 6.508.021.

      +
    • +
    +

    09/05/19 2.00.01 - Studio API minor release (build 102182)

    +

    Features:

    +
      +
    • Core API - ChannelMix DSP now supports re-routing input channels.
    • +
    • UE4 - Added support for UE4.22.
    • +
    • UE4 - Added Encryption Key to the settings for loading sounds from encrypted banks.
    • +
    • UE4 - Added Play-In-Editor logging options to Plugin Settings.
    • +
    • UE4 - Android - Added support for x86_64.
    • +
    • Unity - Added SetParameter by ID to StudioEventEmitter.
    • +
    • Unity - Added Encryption Key to the settings for loading sounds from encrypted banks.
    • +
    • Unity - Added mouse events to StudioEventEmitter trigger options.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed assert caused by a backwards transition with a lead out on a transition timeline with callbacks for timeline markers.
    • +
    • Studio API - Fixed bug in cone angle built-in parameter calculation when using FMOD_INIT_3D_RIGHTHANDED.
    • +
    • Core API - Fixed virtualized objects from object spatializer being silenced (introduced in 2.00.00).
    • +
    • Core API - Fix crash when using convolution reverb with a DSP buffer size of 4096 or above.
    • +
    • Core API - Fix crash trying to load corrupt WAV files with 0 length chunk size.
    • +
    • Core API - Fix crash trying to load corrupt MP3 files.
    • +
    • Core API - Fixed send dsp data being retained after being bypassed.
    • +
    • Core API - iOS - Fixed crash when suspending or resuming the mixer while audio is loading.
    • +
    • UE4 - Fixed Ambient LPF values not being set properly.
    • +
    • UE4 - Fixed builds failing due to the integration being loaded after blueprints.
    • +
    • UE4 - Fixed listener using the correct nested AudioVolume.
    • +
    • Unity - Fixed handling banks in sub-directories.
    • +
    • Unity - Fixed IOException when trying to copy banks into StreamingAssets.
    • +
    • Unity - Fixed Events previewed in Timeline not stopping.
    • +
    • Unity - Fixed StudioListeners with an index larger than zero causing errors.
    • +
    • Unity - Fixed FMODStudioSettings.asset modifying bank list order when using different scripting backends.
    • +
    • Unity - Remove garbage collection overhead in DebugOverlay.
    • +
    • Unity - Fixed creating duplicate objects when loading banks for the Editor.
    • +
    • Unity - Fixed Emitters cleaning up properly when using one shot Events.
    • +
    • Unity - Fixed paths for plugins in editor.
    • +
    • Unity - Fixed build errors on iOS / tvOS due to "lowLevelSystem" references.
    • +
    • Unity - Removed excessive error logging when no project or folder linked to the integration.
    • +
    • Unity - Fixed occasional issues with copying banks into StreamingAssets.
    • +
    • Unity - Fixed Master Bank not being found if in a sub directory.
    • +
    • Unity - Fixed StudioParameterTrigger IndexOutOfRange exception.
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with July 2018 QFE4 XDK.
    • +
    +

    14/03/19 2.00.00 - Studio API major release (build 101145)

    +

    Features:

    +
      +
    • Studio API - Bank sample data encryption is now supported via the Studio API. Use FMOD_STUDIO_ADVANCEDSETTINGS.encryptionkey to specify the encryption key to use when opening banks and use the FMOD_STUDIO_LOAD_BANK_UNENCRYPTED flag to load unencrypted banks if an encryption key has been set.
    • +
    • Studio API - Added built-in parameter for speed.
    • +
    • Studio API - Added support for global parameters.
    • +
    • Studio API - Added support for global mixer automation.
    • +
    • Studio API - Added the ability to set a custom final value on an AHDSR modulator.
    • +
    • Studio API - Added ignoreseekspeed argument to public api setParameter functions.
    • +
    • Studio API - Added the ability to automate time based ahdsr properties.
    • +
    • Studio API - Added a command instrument with the ability to stop all non-nested instances of an event description.
    • +
    • Core API - Added output device enumeration to Windows Sonic output plugin.
    • +
    • Unity - Switch platform settings have been moved into a separate dropdown.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Event parameters with "Hold value during playback" enabled now snap to their target values when their event is started.
    • +
    • Studio API - Changed quantization calculation to use future tempo markers if no past tempo markers are present, and default to 4/4 timing at 120 bmp if no tempo markers are present.
    • +
    • Studio API - Transition regions not using quantization perform any probability determinations each time all other required conditions are newly met.
    • +
    • Studio API - Sidechain modulators now correctly handle multiple sidechain inputs.
    • +
    • Core API - Fixed volume spike due to tremolo DSP with high duty setting.
    • +
    • Core API - Fixed excessive instances of clipping that occur when adjusting the FMOD_DSP_THREE_EQ_LOWCROSSOVER value of a DSPThreeEQ DSP in the low frequency range.
    • +
    +

    Notes:

    +
      +
    • Updated Resonance Audio plugin removing additional transformation of occlusion values. If previous occlusion calculation is required, replace the resonance audio libraries with their 1.10 versions.
    • +
    • The GoogleVR plugin deprecated in 1.10 has now been removed, Resonance Audio is available as a functional drop in replacement.
    • +
    • Studio API - The parameter API has been updated. See the "What's New in 2.00" section in the API documentation for details.
    • +
    • Studio API - The deprecated ParameterInstance class has been removed.
    • +
    • Studio API - Seek speed is now applied when parameter values are modified by AHDSR or sidechain modulation.
    • +
    • Studio API - Parameters with seek speed now snap to their target value when the event stops.
    • +
    • Studio API - Automatic parameters no longer update their user value. The automatically calculated value can be retrieved using the finalvalue parameter of Studio::EventInstance::getParameter.
    • +
    • Studio API - Studio::System::getBank no longer supports getting a loaded bank from the system by filename.
    • +
    • Core API - System::getFileUsage will no longer count bytes read from user callbacks.
    • +
    • Core API - Automatic SRS downmix from 5.1 to 2.0 has been removed.
    • +
    • Core API - System::getSoundRAM API has been removed.
    • +
    • Core API - FMOD_ADVANCEDSETTINGS::HRTFMinAngle, HRTFMaxAngle, HRTFFreq removed
    • +
    • Core API - FMOD_CREATESOUNDEXINFO::channelmask removed
    • +
    • Core API - Win - Support for paths using Windows ANSI Code Page (ACP) encoding has been removed. Paths must be UTF-8 encoded.
    • +
    • Core API - Win - The minimum supported version of Windows has been lifted from Windows XP to Windows 7. Coupled with this change we have removed the legacy DirectSound and WinMM output modes.
    • +
    • Win / UWP - All binaries no longer have a suffix indicating the target architecture, instead the files are separated by directories in the installer.
    • +
    +

    14/03/19 1.10.12 - Studio API minor release (build 101101)

    +

    Features:

    +
      +
    • Unity - Added option to specify Live Update port number in editor settings.
    • +
    • Unity - Changed StudioEventEmitter private members to protected.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Avoid stalling when unloading a bank which is waiting to load sample data behind other banks.
    • +
    • Core API - FMOD_OUTPUTTYPE_ASIO is now compatible with more devices without requiring calls to System::setDSPBufferSize.
    • +
    • Core API - Android - Fixed instances of audio stuttering that occurred on some devices by dynamically adding latency to compensate.
    • +
    • Core API - Fixed MP3 files with MPEG 2.5 encoding having distortion on some files.
    • +
    • Unity - Fixed plugins not being found on Android.
    • +
    • Unity - Fix for banks being read only when trying to copy new banks to StreamingAssets.
    • +
    • Unity - Fixed BatchMode builds not being able to find the MasterBank.
    • +
    • Unity - Fixed BatchMode builds not building with banks.
    • +
    • Unity - Changed console default thread affinity to not use the game thread.
    • +
    • Unity - Fixed Strings bank not being found or copied (introduced in 1.10.10).
    • +
    +

    01/02/19 1.10.11 - Studio API minor release (build 99976)

    +

    Features:

    +
      +
    • Studio API - Add streamingscheduledelay member to FMOD_STUDIO_ADVANCEDSETTINGS. May be used to reduce latency when scheduling events containing streaming sounds.
    • +
    • UE4 - Expose the FMODAudioComponent::bAutoDestroy property to the PlayEventAttached Blueprint function.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed fire and forget event instances not releasing when another instance of the same event is active.
    • +
    • Studio API - Fixed a bug with multi-instruments when using looping and initial seek which caused a gap of silence the same length as the initial seek when scheduling the second instrument.
    • +
    • Core API - Fixed MP3 files using Xing headers from having incorrect seek positions when using Channel::setPosition.
    • +
    • Core API - Fixed potential crash caused by third party applications sending data to the FMOD profiler port.
    • +
    • Core API - Fixed issue where bypassed faders and convolution reverb dsps could silence their output.
    • +
    • UE4 - Fixed 'An invalid object handle' errors from FMODAudioComponent in sequencer after reloading banks.
    • +
    • UE4 - Fixed playback not working correctly in Sequencer.
    • +
    • UE4 - Fixed error from FindEventInstances if zero events found.
    • +
    • UE4 - Fixed Programmer Sounds not auditioning in Editor.
    • +
    • UE4 - Fixed events not playing in Sequencer.
    • +
    • Unity - Fixed RuntimeManager being saved to scene after auditioning timeline.
    • +
    • Unity - Fix AttachInstanceToGameObject positioning not being applied correctly.
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 6.008.051.
    • +
    • iOS - Now built with iOS SDK 12.1 and tvOS SDK 12.1 (Xcode 10.1) which necessitates lifting the min spec to 8.0 for iOS, no change for tvOS.
    • +
    • Mac - Now built with macOS SDK 10.14 (Xcode 10.1) which necessitates lifting the min spec to 10.7 and the removal of x86 support.
    • +
    • Android - Added support for x86_64.
    • +
    +

    03/12/18 1.10.10 - Studio API minor release (build 98815)

    +

    Features:

    +
      +
    • Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL and FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL.
    • +
    • Core API - Added DSP::GetCPUUsage to public API.
    • +
    • Core API - Linux - Added support for FMOD_ALSA_DEVICE environment variable to allow a user to specify an ALSA device.
    • +
    • HTML5 - Add Web Assembly support (WASM) to HTML5 version of FMOD Core API and Studio API. Memory usage halved, CPU speed improvements of about 30%
    • +
    • Unity - Android - Added ARM64 support.
    • +
    • Unity - Add support for working with multiple master banks and strings banks.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed multi-instrument playlist entries set to loop infinitely not looping correctly.
    • +
    • Studio API - Fixed pop that occurs at the start of a transition destination section with a fade curves.
    • +
    • Studio API - Fixed nested event instances stopping when their parent is paused.
    • +
    • Studio API - HTML5 - Fix Studio::System::getSoundInfo not working
    • +
    • Core API - System::setDSPBufferSize validates arguments for integer overflow.
    • +
    • Core API - Fixed potential CPU usage spike due to dsp flush on releasing a programmer sound during the destroy callback.
    • +
    • Core API - Opening a playlist from a URL now validates that the playlist file is a text file and falls back to codec probing if binary data is found.
    • +
    • Core API - Linux - Fixed occasional distortion that can occur when using PulseAudio.
    • +
    • FSBank API - Fixed issue where a file change would not be detected when it has the same modified time.
    • +
    • UE4 - Fixed occlusion using the trace channel selected in editor.
    • +
    • UE4 - Fixed plugin include directory paths.
    • +
    • UE4 - Fixed crash caused by trying to access objects pending kill.
    • +
    • UE4 - Fixed occlusion not working.
    • +
    • UE4 - Fixed programmer sounds trying to access the FMODStudioModule outside of the main thread, while also improving the performance of the FMODAudioComponent.
    • +
    • Unity - Fixed Asset Folder name updating after each keystroke.
    • +
    • Unity - Fixed Timeline playables playing the previously selected event.
    • +
    • Unity - Fixed "Bus not found" error caused when no banks loaded in editor.
    • +
    • Unity - iOS - Fixed Events not resuming after returning focus.
    • +
    • Unity - PS4 - Fixed logging libs being used for development builds.
    • +
    +

    Notes:

    +
      +
    • Studio API - Reduced the maximum number of parameter values which can be set in a batch using Studio::EventInstance::setParameterValuesByIndices to 64.
    • +
    • HTML5 - Now built with Emscripten v1.38.15
    • +
    • Switch - Now built with SDK 6.4.0.
    • +
    +

    11/10/18 1.10.09 - Studio API minor release (build 97915)

    +

    Features:

    +
      +
    • Studio API - Added globally sequential play mode to multi and scatterer instruments.
    • +
    • Unity - All logging will now be displayed in the editor console. The logging level can be changed using the dropdown in settings.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed missing bank warnings when playing a CommandReplay using FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD mode.
    • +
    • Studio API - UWP - Fixed Studio thread affinity not applying correctly.
    • +
    • Studio API - Android / UWP - Fixed CommandReplay not working with AppX and APK based paths.
    • +
    • Core API - Fixed loading of encrypted FSBs.
    • +
    • Core API - Fixed several panning issues when using FMOD_SPEAKERMODE_QUAD or FMOD_SPEAKERMODE_SURROUND, does not affect Studio API usage.
    • +
    • Core API - Fixed potential hang from internal fade point usage.
    • +
    • Core API - Fixed ChannelControl::setMixLevelsInput not remembering the set values when FMOD_3D is applied.
    • +
    • Core API - Fixed potential cpu usage spike due to thread lock on releasing a non-gpu convolution reverb dsp.
    • +
    • Core API - Fixed support of FMOD_3D_INVERSETAPEREDROLLOFF.
    • +
    • Core API - Fixed potential cpu usage spike due to thread lock on releasing a transciever dsp.
    • +
    • Core API - Win / UWP - Fixed Windows Sonic initialization failure when audio device is configured for a sample rate other than 48KHz.
    • +
    • Core API - Linux - Fixed ALSA default audio device selection.
    • +
    • Core API - Android - Fixed crash if System::mixerSuspend is called before System::init.
    • +
    • Unity - iOS - Fixed playback not resuming after alarm / call interruptions.
    • +
    +

    Notes:

    +
      +
    • Updated Resonance Audio plugin to add support for near field effects, and added FMOD_DSP_PARAMETER_OVERALLGAIN parameter to support virtualization.
    • +
    • PS4 - Now built with SDK 6.008.001.
    • +
    • XboxOne - Now built with July 2018 QFE2 XDK.
    • +
    +

    10/08/18 1.10.08 - Studio API minor release (build 96768)

    +

    Features:

    +
      +
    • UE4 - FMODAudioComponent is now blueprintable.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed potential crash when calling Studio::EventInstance::release from the FMOD_STUDIO_EVENT_CALLBACK_STOPPED triggered by Bus::stopAllEvents.
    • +
    • Studio API - Fixed a bug where changes to a parameter value made while an event was in the FMOD_STUDIO_PLAYBACK_STARTING state would not update automation controllers (introduced in 1.10.02).
    • +
    • Studio API - Fixed Studio::CommandReplay::release not cleaning up resources unless Studio::CommandReplay::stop was called earlier.
    • +
    • Studio API - HTML5/WebGL - Fixed the following functions that didn't work. - Studio::Bank::getID - Studio::EventDescription::getID - Studio::Bus::Bank::getID - Studio::VCA::Bank::getID - Studio::System::lookupID - Studio::Bank::getStringInfo - Studio::System::getBankList - Studio::EventDescription::getInstanceList - Studio::Bank::getEventList - Studio::Bank::getBusList - Studio::Bank::getVCAList
    • +
    • Core API - Fixed audible artifacts when adjusting pitch near 1.0. Issue can be seen from doppler calculations with small velocities.
    • +
    • Core API - Improved stuttering issue when using Windows Sonic with high DSP CPU usage.
    • +
    • Core API - Fixed init errors on output devices that operate at 384KHz such as the Aune X1s.
    • +
    • Core API - Windows - Improved compatibility with some audio drivers by falling back to stereo.
    • +
    • Core API - HTML5/WebGL - Added support for unimplemented System::createDSP with FMOD_DSP_DESCRIPTION. DSP callbacks are provided to allow custom DSP support in Javascript. Added dsp_custom example to example folder.
    • +
    • Core API - HTML5/WebGL - Added support for unimplemented ChannelControl::setCallback.
    • +
    • Core API - HTML5/WebGL - Enabled support for 5.1 / Surround sound in a browser. Only Firefox supports 5.1 so far, out of all browsers tested.
    • +
    • UE4 - Fixed Activate and SetActive not working for FMODAudioComponents.
    • +
    • UE4 - Fixed Simulating in editor producing no sound.
    • +
    • UE4 - Fixed BlueprintStatics::LoadBank not working for banks containing spaces.
    • +
    • UE4 - Fixed asset banks not displaying in editor or being loaded.
    • +
    • Unity - Fixed warnings due to loading sample data on a metadata-only bank before its asset bank is loaded.
    • +
    • Unity - Fixed source project not updating if the old path is still valid.
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with April 2018 QFE1 XDK.
    • +
    +

    03/07/18 1.10.07 - Studio API minor release (build 95892)

    +

    Features:

    +
      +
    • Unity - Added support for Timeline (from Unity 2017.1 onwards).
    • +
    +

    Fixes:

    +
      +
    • Studio API - The FMOD Gain effect is now taken into account when applying event stealing behavior and virtualizing FMOD::Channels.
    • +
    • Core API - Win/XboxOne - Fixed crash during System::recordStart if the device was unplugged.
    • +
    • Core API - Win - System::loadPlugin now correctly handles UTF-8 encoded paths. Support for paths using ACP is deprecated and will be removed in FMOD 1.11.
    • +
    • UE4 - Fixed auditioning events not taking parameter values into account.
    • +
    • UE4 - Fixed game crash when built using Event-Driven-Loader.
    • +
    +

    06/06/18 1.10.06 - Studio API minor release (build 95384)

    +

    Features:

    +
      +
    • Unity - Added SampleRate for Play-In-Editor settings.
    • +
    • Unity - Added scripts for setting thread affinity on specific consoles.
    • +
    • HTML5 - Updated core API and studio API examples to handle chrome mute until mouse click or touch event happens, via System::mixerSuspend / System::mixerResume.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed potential crash if a stream naturally ends at the same time as being released.
    • +
    • Core API - Fixed incorrect parsing of large ID3 tags.
    • +
    • Core API - Fixed FMOD_ERR_FILE_BAD error when trying to call setPosition to a point past 2GB bytes in a file.
    • +
    • Core API - Fixed crash if Windows Sonic output mode is used with the object spatializer and the device is unplugged.
    • +
    • Core API - Fixed stall in Sound::release for FSB files if another thread is performing a createSound operation.
    • +
    • Core API - Fixed potential crash when playing a netstream with tags.
    • +
    • Core API - Fixed OGG netstreams not automatically stopping if the stream goes offline.
    • +
    • Core API - Fixed potential invalid memory access when a channel group is released (introduced in 1.10.02).
    • +
    • Core API - Channel group audibility now factors in attenuation due to 3D effects when using ChannelControl::setMode (FMOD_3D).
    • +
    • Core API - HTML5/WebGL - Fix System::setDriver (0) causing garbled audio when trying to respond to a touch event and the audio is already active.
    • +
    • Core API - HTML5/WebGL - Fix floating point accuracy issues making MIDI file sound out of tune.
    • +
    • Core API - UWP - Fixed default affinity mask incorrectly putting all threads on core 0, now threads default to distributing among all cores.
    • +
    • UE4 - Removed FMODAudioComponent ticking when deactivated.
    • +
    +

    Notes:

    +
      +
    • Core API - Windows Sonic output mode no longer requires a block size of 480.
    • +
    • XboxOne - Now built with February 2018 XDK.
    • +
    • Switch - Now built with SDK 5.3.0.
    • +
    +

    26/04/18 1.10.05 - Studio API minor release (build 94661)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed a rare bug where Studio::System::Update could hang if a streaming sound encountered an error.
    • +
    • Studio API - Fixed events getting stuck in a paused state if they were restarted while waiting for sample data to load (introduced in 1.10.02).
    • +
    • Studio API - Fixed an issue preventing network streams being used as programmer sounds.
    • +
    • Core API - Fixed rare hang during Sound::release when releasing a streaming sound in the FMOD_OPENSTATE_ERROR state.
    • +
    • Core API - Switch - Fixed Vorbis encoded banks producing silence when using multimedia.nso (UE4 uses this).
    • +
    • UE4 - Fixed FMODAudioComponent programmer sound creation flags.
    • +
    • UE4 - Switch - Fixed performance by changing default thread affinity.
    • +
    • Unity - Fixed FMODStudioSettings asset dirty flag being set unnecessarily.
    • +
    • Unity - Fixed callbacks crashing when using IL2CPP or Mono on some platforms.
    • +
    • Unity - Fixed editor system not being cleaned up on Play-In-Editor start.
    • +
    • Unity - Android - Fixed load bank returning ERR_INVALID_HANDLE.
    • +
    +

    Notes:

    +
      +
    • Core API - It is now possible to initialize WinSonic output even if the user has not enabled spatial audio on their default device. The platform will provide a non-binaural downmix to the user desired speaker mode.
    • +
    • PS4 - Now built with SDK 5.508.021.
    • +
    +

    05/03/18 1.10.04 - Studio API minor release (build 93853)

    +

    Features:

    +
      +
    • Studio API - Improved bank loading performance when there are already a large number of loaded events.
    • +
    • UE4 - Added the ability to enable Live Update while in editor for auditioning. The Editor will need to be restarted for this setting to take effect.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed a bug where Studio::System::Update could fail with FMOD_ERR_INVALID_HANDLE or FMOD_ERR_CHANNEL_STOLEN, which could lead to memory or performance problems. Introduced in 1.10.03.
    • +
    • Core API - XboxOne - Fixed XMA hang that can occur after actively using many XMA voices for several days.
    • +
    • Unity - Fixed MobileHigh/Low classifications for Apple Devices. Pre iPhone 5 is classed as MobileLow.
    • +
    +

    01/02/18 1.10.03 - Studio API minor release (build 93157)

    +

    Features:

    +
      +
    • Core API - Added ASIO support for drivers that use PCM32 as a container for smaller sized data.
    • +
    • Profiler - Draw different DSP connection types with different line styles.
    • +
    • UE4 - Added option to specify memory pool size, per platform, in the project FMOD Studio settings.
    • +
    • UE4 - Now complying with IWYU mode, this should increase compilation speed.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed the DSP network sometimes getting into a bad state when a sidechain is connected to the next effect in the chain.
    • +
    • Studio API - Fixed event playback sometimes using stale parameter values.
    • +
    • Studio API - Fixed events failing to stop if they contain empty Single Instruments.
    • +
    • Core API - Fixed potential crash in device list changed callback when there are no available devices remaining.
    • +
    • Core API - Fix 3D 5.1 sound not panning correctly if ChannelControl::set3DLevel (0) is used.
    • +
    • Core API - Fixed ID3v2.4 compatibility issue causing missing or corrupted tags.
    • +
    • Core API - Android - Fixed incorrect floating point check on ARM64 devices causing FMOD_ERR_NEEDSHARDWARE with some devices.
    • +
    • Core API - XboxOne - Fixed race condition causing internal errors with XMA sounds loaded as FMOD_CREATECOMPRESSEDSAMPLE.
    • +
    • Core API - PS4 - Fixed internal assertion caused by setPosition on an AT9 sound loaded as FMOD_CREATECOMPRESSEDSAMPLE.
    • +
    • FSBank API - Fixed creation of C header so it goes next to the FSB instead of the working directory of the application.
    • +
    • Unity - Fixed pause working properly in Play In Editor mode.
    • +
    • Unity - Removed excess memory allocation from APIs that return strings in C#.
    • +
    • UE4 - Fixed velocity of FMODAudioComponents.
    • +
    +

    Notes:

    +
      +
    • Unity - Added support for Unity 2017.3.
    • +
    • Android - Now built with NDK r16b.
    • +
    • Android - Minimum Android version is now API level 14 due to NDK r16b deprecating older versions.
    • +
    • Switch - Now built with SDK 3.5.1.
    • +
    +

    07/12/17 1.10.02 - Studio API minor release (build 92217)

    +

    Features:

    +
      +
    • Core API - UWP - Added Windows Sonic support.
    • +
    • Core API - UWP - Added support for setting thread affinity via FMOD_UWP_SetThreadAffinity.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Quietest stealing behavior so new events don't start if they are quieter than all currently playing events.
    • +
    • Studio API - Fixed buses that have reached their Max Instances limit incorrectly preventing their input buses from applying their stealing behavior.
    • +
    • Studio API - Fixed a crash caused by wav files with invalid loop points.
    • +
    • Core API - Fixed recording devices still being marked as connected when switching to FMOD_OUTPUTTYPE_NOSOUND.
    • +
    • Core API - UWP - Made device reset / unplug behavior more robust against failure.
    • +
    • Core API - XboxOne - Fixed WASAPI init error if WinSonic was attempted first.
    • +
    • FSBank API - Fixed crash in 64bit version when encoding low sample rate mono sounds as Vorbis with low quality.
    • +
    • Unity - PlayOneshot and PlayOneshotAttached now log a warning when the event is not found, rather than throwing an exception.
    • +
    +

    Notes:

    +
      +
    • Added Resonance Audio plugin version 1.0, this plugin represents the continuation of the Google VR plugin under new branding. The Google VR plugin is now considered deprecated in favour of Resonance Audio, consider migrating to the new plugin as the GVR plugin will be removed in FMOD 1.11.
    • +
    • XboxOne - Now built with June 2017 QFE 8 XDK.
    • +
    +

    01/11/17 1.10.01 - Studio API minor release (build 91339)

    +

    Features:

    +
      +
    • UE4 - Expose Studio::Bus::stopAllEvents to be useable through blueprints.
    • +
    • Unity - Event length displayed in event browser for one shot events.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed modulation on plugin instruments using the parent event's lifetime rather than the instrument's lifetime.
    • +
    • Studio API - Fixed a live update issue where asset files would not reload after being moved on disk.
    • +
    • Studio API - Fixed a bug which caused sounds to pan incorrectly when using FMOD_INIT_3D_RIGHTHANDED.
    • +
    • Studio API - PS4 - Fixed excessive binary size caused by inclusion of debug symbols.
    • +
    • Core API - Fixed potential crash when re-initializing System after failure.
    • +
    • Core API - Fixed compatibility issues with Windows XP.
    • +
    • Core API - Android - Fixed exported symbols to avoid issues with unwinder.
    • +
    • Core API - Android - Automatic output mode selection will now choose AudioTrack rather than OpenSL if Bluetooth is enabled to avoid stuttering.
    • +
    • Core API - XboxOne - Ensure WinSonic internal threads are assigned to the same core as the FMOD mixer.
    • +
    • FSBank API - Fixed crash when encoding very long audio files.
    • +
    • UE4 - Integration now handles application interruption by pausing and resuming the mixer.
    • +
    • UE4 - Fixed SetEvent not setting or using new event.
    • +
    • UE4 - Fixed XboxOne thread affinity struct setup.
    • +
    • UE4 - Removed engine version ifdef's.
    • +
    • UE4 - Fixed integration attempting to set the initial value of built-in parameters.
    • +
    • Unity - Fixed compatibility for Unity 5.0 & 5.1.
    • +
    • Unity - Added check to see if any banks have been loaded before trying to pause.
    • +
    • Unity - Allow StringHelper to fast return if string is null.
    • +
    +

    Notes:

    +
      +
    • Updated Google VR plugin to version 0.6.1.
    • +
    • Studio API - Studio::EventInstance::set3DAttributes and Studio::System::setListenerAttributes will now return FMOD_ERR_INVALID_PARAM if the forward or up vectors are zero. In logging builds warnings will be logged if the forward and up vectors are not orthonormal.
    • +
    • Core API - The convolution reverb effect will not accept impulse response data if the system is not using a power-of-two DSP buffer size. Windows Sonic currently requires a DSP buffer size of 480 making it incompatible with convolution reverb until this requirement is lifted.
    • +
    • PS4 - Now built with SDK 5.008.001.
    • +
    • Unity - Exposed editor script classes for in-game FMOD objects as public.
    • +
    • Unity - Exposed StudioEventEmitter's EventInstance as public to allow easier integration with custom plugins.
    • +
    +

    19/09/17 1.10.00 - Studio API major release (build 90329)

    +

    Features:

    +
      +
    • Core API - Added FMOD_MAX_SYSTEMS constant, currently 8.
    • +
    • Core API - Exposed FMOD_DSP_FADER_GAIN on FMOD_DSP_TYPE_FADER.
    • +
    • Core API - Added FMOD_SPEAKERMODE_7POINT1POINT4 speaker mode which includes four height speakers to be used with Windows Sonic output.
    • +
    • Core API - Added FMOD_DSP_PAN_2D_HEIGHT_BLEND parameter to FMOD_DSP_TYPE_PAN that allows mixing ground speaker signal into the height speakers and vice versa.
    • +
    • Core API - Windows & XboxOne - Added Windows Sonic output plugin to support rendering multichannel (with height) speaker mode 7.1.4 as well as dynamic objects via FMOD_DSP_TYPE_OBJECTPAN.
    • +
    • Core API - PS Vita - Switched FMOD_PSVita_SetThreadAffinity to accept a mask instead of a core number to allow floating threads.
    • +
    • Core API - Added FMOD_OUTPUT_REQUESTRESET to FMOD_OUTPUT_STATE to allow output plugins to request they be reset by the System.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Sequential multi and scatterer instruments now track their current playlist entry on a per-event-instance basis, rather than globally.
    • +
    • UE4 - Removed all reference to Oculus, now that Oculus functions as all other FMOD Studio plugins.
    • +
    • UE4 - Removed all legacy UE4 version code, if you are not using UE4.16 the plugin will not work without making changes to source code.
    • +
    • UE4 - Overhauled details interaction in editor and improved usability. Grouped all FMOD functionality together, added Parameters, and removed unnecessary information from attenuation/occlusion.
    • +
    • Unity - Removed garbage allocations from C# wrapper.
    • +
    +

    Notes:

    +
      +
    • Updated Google VR plugin to version 0.6.0.
    • +
    • Studio API - Changed the behaviour of nested events to stop when idle even when there are instruments on parameters. This makes nested events match the behaviour of top level events. Events which depend on the old behaviour need to be manually fixed up by (for example) adding a sustain point to the nested events timeline.
    • +
    • Core API - FMOD_DSP_TYPE_ENVELOPEFOLLOWER is now deprecated and will be removed in a future release.
    • +
    • Core API - Increment Plugin API version for Output plugins. Dynamic library Output Plugins must be rebuilt.
    • +
    • Android - Logging version will now produce proper crash stacks but due to binary size increase the release version will continue to not.
    • +
    • XboxOne - Removed "acp" and "feeder" from FMOD_XBOXONE_THREADAFFINITY. Both threads were removed in previous versions and setting them did nothing.
    • +
    • UE4 - AudioComponents using occlusion from previous versions are NOT compatible with this version. Occlusion and Attenuation now do not rely on UE4 structs.
    • +
    +

    11/09/17 1.09.08 - Studio API minor release (build 90162)

    +

    Fixes:

    +
      +
    • Core API - Fixed extraneous logging.
    • +
    +

    07/09/17 1.09.07 - Studio API minor release (build 90008)

    +

    Features:

    +
      +
    • UE4 - Cache dsp used for occlusion lowpass effect & add support for use of Multiband EQ (lowpass on band A only).
    • +
    • UE4 - FMODAudioComponent now reuses event instances until the object is no longer needed or Release() is called.
    • +
    • UE4 - Added support for UWP.
    • +
    • Unity - Added support for Unity v2017.1.
    • +
    • Unity - Added a button in the FMOD menu for Refreshing Bank files.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed scatterer sounds being processed by FMOD::Geometry.
    • +
    • Studio API - Fixed multi-stream events playing out of sync (introduced in 1.09.01).
    • +
    • Core API - Fixed ChannelControl::setDelay being ignored if addDSP was called immediately after it.
    • +
    • Core API - Fixed potential crash if calling Channel::setPosition soon after System::playSound with paused as true.
    • +
    • Core API - Fixed click on ChannelControl::setPaused (false) caused by a non-zero Channel::setPosition after System::playSound with paused as true.
    • +
    • Core API - Fixed potential crash if calling System::getRecordPosition while disconnecting an audio device.
    • +
    • Core API - Fix FMOD_ACCURATETIME not looping mod/s3m/xm/it files properly, and midi files not looping properly without the flag.
    • +
    • Core API - Fixed crash when attempting to load invalid VST files.
    • +
    • UE4 - Fix compile error by adding categories to AnimNotify vars.
    • +
    • Unity - Switch - Fixed "unknown pointer encoding" error when an exception occurs.
    • +
    • Unity - Fix plugin path for UWP builds.
    • +
    • Unity - Fixed possible crash when using GoogleVR plugin.
    • +
    • Unity - Fix EventEmitter SetParameter not working unless parameter had an inital value set in editor.
    • +
    +

    Notes:

    +
      +
    • Studio API - Reduced memory usage for events with a small number of instances.
    • +
    • Core API - FMOD_CREATESOUNDEXINFO::initialseekposition will now wrap if the value given is longer than the Sound length.
    • +
    • Core API - Added documentation to the top of fmod_codec_raw to be more instructional for plugin writers.
    • +
    • UE4 - Added support for UE4.17.
    • +
    • Unity - Device specific errors will now cause only a single exception to be thrown and the integration will assume no-sound mode.
    • +
    • Switch - Now built with SDK 1.7.0.
    • +
    • XboxOne - Now built with March 2017 QFE 3 XDK.
    • +
    +

    06/07/17 1.09.06 - Studio API minor release (build 88495)

    +

    Features:

    +
      +
    • Studio API - Improved performance when a large number of EventInstances have been created but not started.
    • +
    • Core API - HTML5 - Performance increased by 10%.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed a bug where an asynchronous looping multi instrument would stop selecting new playlist entries after playing a nested event which itself contains an asynchronous looping multi instrument.
    • +
    • Studio API - Fixed a bug where a parameter could trigger parameter instruments before having its value updated by modulators when restarting an event instance.
    • +
    • Studio API - Fixed incorrect automation interpolation on transition timelines with lead-out regions.
    • +
    • Core API - Fixed DSPs with sidechain inputs incorrectly going idle when the main input is idle but the sidechain input is not.
    • +
    • Core API - Fixed the compressor DSP not playing out its release correctly when its inputs are idle.
    • +
    • Core API - Remove main thread stall from System::playDSP (or playing a generator DSP via Studio API).
    • +
    • UE4 - Sequencer integration now supports previewing event playback in an editor viewport by using the Sequencer transport controls. A Sequencer section has been added to the documentation.
    • +
    • UE4 - Added AreBanksLoaded funtion to FMODStudioModule.
    • +
    • Unity - Events in EventBrowser window now in alpabetical order.
    • +
    • Unity - Setting parameters on StudioEventEmitter no longer generates garbage.
    • +
    +

    Notes:

    + +

    08/06/17 1.09.05 - Studio API minor release (build 87666)

    +

    Features:

    +
      +
    • Core API - Switch - Added support for HTC sockets to allow communications between FMOD tools and runtime via target manager. Enable using FMOD_Switch_SetHTCSEnabled(TRUE).
    • +
    • Core API - XboxOne - Added support for System::attachChannelGroupToPort with FMOD_XBOXONE_PORT_TYPE_MUSIC.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed FMOD_ERR_INTERNAL returned when loading old bank files containing transition timeline automation of instrument volumes.
    • +
    • Studio API - Fixed bug where very short instruments would not play when cross fading.
    • +
    • Studio API - Made changes to the logic in Studio::EventDescription::isOneShot so that it consistently returns true for events which are guaranteed to finish without intervention, and false for events which may play indefinitely.
    • +
    • Core API - Fixed ChannelControl::setMixLevelsInput not working and updated docs.
    • +
    • Core API - Fixed Channel::setLoopCount not working with very small streams.
    • +
    • Core API - Stricter error checking when loading IMA ADPCM wav files to prevent a potential crash from malformed data.
    • +
    • Core API - Fixed potential crash in ChannelGroup operations when a Channel failed to play on it with FMOD_ERR_SUBSOUNDS.
    • +
    • Core API - Fixed Convolution reverb panning a mono IR with a stereo input incorrectly.
    • +
    • Core API - Fixed race conditions when setting FMOD_DSP_SEND_RETURNID.
    • +
    • Core API - Fixed a crash with some MOD/S3M/XM/IT files. Introduced in 1.09.00.
    • +
    • Core API - System::setDSPBufferSize will round the requested buffer size up to the closest multiple of 4 to prevent a crash when sending metering data to studio.
    • +
    • Core API - PS4 - Fixed GPU compute compatibility issue with SDK 4.508.001. GPU compute is now re-enabled.
    • +
    • Core API - Switch - Reduced thread priority to avoid conflict with Profiler.
    • +
    • Core API - Windows - Fixed ASIO output mode failing to initialize if the devices requires a buffer size of 2048 samples.
    • +
    • Unity - Fixed bank directory path separators when developing across OSX & Win.
    • +
    • Unity - Fixed simulated Android devices producing no sound.
    • +
    • Unity - BankLoadException now display error message correctly.
    • +
    • Unity - Fixed bank loading and unloading refcount accuracy.
    • +
    • Unity - Fixed Mac editor attempting to load Linux plugins when building for Linux platform.
    • +
    • Unity - Improved detection of 3D Event Instances that haven't had their position set yet.
    • +
    • UE4 - Fixed integration working with UE4's IWYU non-monolithic header system, for now the integration is still using the old PCH system.
    • +
    • UE4 - Added new native AnimNotify class, old one didn't work on code projects.
    • +
    • UE4 - Sequencer integration. FMOD events can be started and stopped and event parameters can be controlled by adding custom tracks to sequencer.
    • +
    • UE4 - Fixed max vorbis codecs not being set correctly.
    • +
    • UE4 - Fixed file readers being accessed from multiple threads.
    • +
    +

    Notes:

    +
      +
    • UE4 - Added support for UE4.16.
    • +
    +

    Notes:

    +
      +
    • Updated Google VR plugin to version 0.4.0, please note there is a known crash when loading the plugin on Windows XP, Google are aware and investigating.
    • +
    +

    10/04/17 1.09.04 - Studio API minor release (build 86084)

    +

    Fixes:

    +
      +
    • Studio API - Fixed delayed playback on streaming sounds in events (introduced in 1.09.03).
    • +
    • Studio API - Fixed AHDSR release not working on single sounds shorter than 100 milliseconds.
    • +
    • Studio API - Fixed Studio::EventDescription::is3D returning true for events that only have 2D panners.
    • +
    • Studio API - Set programmer sounds to FMOD_LOOP_NORMAL internally if they were not created that way.
    • +
    • Studio API - Fixed regression introduced in 1.09.00 which allowed events to play at the origin before 3d attributes were updated.
    • +
    • Studio API - Fixed issue where reverb tail would cut off when all events on a bus finished playing.
    • +
    • Core API - Fixed FMOD_DSP_TRANSCEIVER making channels audible that weren't supposed to be (introduced with glitch fix in 1.09.03).
    • +
    • Core API - Fixed loop clicks on PCM sounds if using FMOD_DSP_RESAMPLER_CUBIC or FMOD_DSP_RESAMPLER_SPLINE.
    • +
    • Core API - Fixed FMOD_ADVANCEDSETTINGS::resamplerMethod being ignored.
    • +
    • Core API - Fixed plugin unloading for multi-description libraries potentially failing depending on how it's unloaded.
    • +
    • Core API - Fixed stream glitch when going virtual then resuming.
    • +
    • Core API - Fixed virtual voices losing their loop/2d/3d status, and not staying virtual if ChannelControl::setMode was used. Introduced in 1.09.00.
    • +
    • Core API - Fixed FMOD_UNIQUE not being accepted if ChannelControl::setMode or Sound::setMode was used. (it could be successfully used via createSound/createStream).
    • +
    • Core API - Fixed rare crash in mixer, introduced 1.09.00.
    • +
    • Core API - Switch - Fixed FMOD_SWITCH_THREADAFFINITY so cores can be ORd together to form a mask.
    • +
    • Core API - PS4 - GPU compute disabled due to an incompatibility with SDK 4.508.001.
    • +
    • Core API - Windows/Mac - Re-enable SRS downmixer 80Hz high pass filter by default. Add FMOD_INIT_DISABLE_SRS_HIGHPASSFILTER init flag to disable it.
    • +
    • FSBank API - Fixed PS Vita AT9 encoder not working with currently available Sony library.
    • +
    • FSBank API - Fixed full scale 32bit float wav files encoding incorrectly.
    • +
    +

    Notes:

    +
      +
    • Studio API - FMOD expects programmer sounds to be created with FMOD_LOOP_NORMAL. This is now specified in the FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES documentation.
    • +
    • FSBank API - Building an FSB with PS Vita AT9 encoding now requires 64bit.
    • +
    • PS4 - Now built with SDK 4.508.001.
    • +
    • Switch - Now built with SDK 0.12.17.
    • +
    • XboxOne - Now built with October 2016 QFE 2 XDK.
    • +
    +

    20/03/17 1.09.03 - Studio API minor release (build 85359)

    +

    Features:

    +
      +
    • Core API - Updated the /examples/dsp_custom example to include a lot more functionality including parameters, and capture of wave data.
    • +
    • Core API - Add fmod_reduced.js for reduced functionality, but also reduced size.
    • +
    • Core API - Switch - Added support for setting thread affinity.
    • +
    • Studio API - Reduced size of fmodstudio.js and .mem files.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed event doppler settings not being applied to sounds spawned by scatterer.
    • +
    • Studio API - Fixed bus and VCA handles not being set up properly in Studio::Bank::getBusList and Studio::Bank::getVCAList.
    • +
    • Studio API - Fixed crashes caused by stopping events that are routed into a bus with instance limiting enabled when they are in the FMOD_STUDIO_PLAYBACK_STARTING state.
    • +
    • Studio API - Fixed tempo and marker event callbacks not being fired when the timeline cursor is in the lead-in or lead-out region of a transition timeline.
    • +
    • Core API - Fixed glitches with Transceiver DSP after inputs go idle.
    • +
    • Core API - Fix Channel::setPosition (pos, FMOD_TIMEUNIT_MODORDER) not working when playing paused.
    • +
    • Core API - Fixed short streams created as non-looping then switched to looping via the Channel API not looping seamlessly.
    • +
    • Core API - Fixed DSP plugin version >= 109 data parameters other than 3D attributes not applying if FMOD_INIT_3D_RIGHTHANDED is used.
    • +
    • Core API - Fixed rare crash in FMOD Panner DSP. Introduced in 1.09.00.
    • +
    • Core API - Re-Fix MOD/S3M/XM/IT file crash with samples that have 0 length, for 1.09 only.
    • +
    • Core API - Fixed potential memory leak if System::init returned an error.
    • +
    • Core API - Fix FMOD_ACCURATETIME not looping a mod file properly, and not seeking correctly with FMOD_TIMEUNIT_MODORDER.
    • +
    • Core API - HTML5 - Loading FSB sounds did not work properly.
    • +
    • Core API - Windows - Fixed 5.1->stereo SRS downmix causing lack of bass.
    • +
    • Core API - Windows - Fix FMOD_INIT_PREFER_DOLBY_DOWNMIX not working.
    • +
    • FSBank API - Fix crash if FSBANK_INIT_GENERATEPROGRESSITEMS is not used.
    • +
    • Unity - Removed error when plugin field is added but empty.
    • +
    • UE4 - Removed error when plugin field is added but empty.
    • +
    +

    Notes:

    +
      +
    • UE4 - Added support for UE4.15.
    • +
    +

    15/02/17 1.09.02 - Studio API minor release (build 84334)

    +

    Fixes:

    +
      +
    • Unity - Remove ifdef from EnforceLibraryOrder as it isn't harmful for static lib platforms to call GetStats.
    • +
    • UE4 - Occlusion can now use Multiband EQ instead of Lowpass filter.
    • +
    • Core API - Fix crash when connecting to FMOD Profiler.exe and there is a circular connection
    • +
    • Core API - Fix glitches with Transceiver DSP after inputs go idle.
    • +
    • Core API - Fix Channel::setPosition (pos, FMOD_TIMEUNIT_MODORDER) not working when playing paused.
    • +
    +

    09/02/17 1.09.01 - Studio API minor release (build 84153)

    +

    Features:

    +
      +
    • Core API - Added FMOD_DSP_STATE_FUNCTIONS::getlistenerattributes to the DSP plugin API to query the current listener attributes.
    • +
    • Unity - Added support for Rigidbody2D in 3D attribute settings and integration scripts.
    • +
    • Unity - Added support for Object Enable/Disable on EventEmitter and ParameterTrigger scripts.
    • +
    • UE4 - Added GetLength function for blueprints that returns the event length in milliseconds.
    • +
    • UE4 - Improved in editor profiling stats.
    • +
    +

    Fixes:

    +
      +
    • Unity - Fixed compatibility with Unity 4.6 & 4.7 for OSX and IOS.
    • +
    • Unity - Fixed "file not found" error when settings asset is corrupt
    • +
    • Unity - Fixed set3DAttributes ambiguity.
    • +
    • Unity - Fixed not being able to copy ReadOnly banks into StreamingAssets.
    • +
    • Unity - Fixed event instance leak in Unity PlayOneshotAttached not releasing.
    • +
    • Unity - Specified version to check for WiiU BuildTarget for early Unity5.
    • +
    • UE4 - Fixed XboxOne delayload error now that UE4 handles it.
    • +
    • UE4 - Android - Added ARM64 support.
    • +
    • Studio API - AHDSR modulator curve shapes now work correctly. In previous versions the envelope was interpolated linearly regardless of the shape displayed in the UI.
    • +
    • Studio API - Fixed looping single sounds in an async multi sound being cut-off when the multi sound is un-triggered.
    • +
    • Core API - Fixed ChannelControl::setReverbProperties not resetting reverb connection to a new tail DSP when turning wet mix off and on.
    • +
    • Core API - If the system is initialized in right-handed mode, FMOD will now swap to left-handed when passing attributes into plugins. This only applies to plugins rebuilt against this version, old plugins remain unswapped.
    • +
    • Core API - Fix MOD/S3M/XM/IT file crash with samples that have 0 length.
    • +
    • Core API - Fixed some potential crashes when running out of memory, these will correctly return FMOD_ERR_MEMORY now.
    • +
    • Core API - Win - Fixed WASAPI recording device enumeration taking a couple of seconds after System::init before being correct.
    • +
    • Core API - Win - Fixed potential error returned from System::update if device is unplugged.
    • +
    • Core API - MIDI - Fixed Sound::set/getMusicChannelVolume referring to wrong track indices rather than just a normal 0-15 track index.
    • +
    • Core API - MIDI - Fixed Channel::setPosition causing loud drum bang noise after seek
    • +
    +

    Notes:

    +
      +
    • Studio API - When loading legacy banks with looping sounds nested in multi sounds, the multi sound is set to cut-off all sounds when untriggered, including non-looping sounds. This is a change in behaviour compared to earlier versions where only looping sounds were cut-off.
    • +
    • Core API - DSP plugin API version has been increased, for maximum compatibility plugin writers should only rebuild against this version if they need the getlistenerattributes feature. Old plugins are still supported.
    • +
    • Switch - Now built with SDK 0.12.10
    • +
    +

    01/12/16 1.09.00 - Studio API major release (build 82164)

    +

    Important:

    +
      +
    • Added support for the Nintendo Switch platform.
    • +
    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed incorrect playback volume for instruments and playlist items whose volume property is set to a non-zero dB value.
    • +
    +

    Notes:

    +
      +
    • Core API - Incremented Plugin SDK version for DSP plugins. Dynamic library plugins built with earlier versions will continue to load.
    • +
    • Core API - Incremented FMOD_CODEC_WAVEFORMAT version. Codecs that provide names must keep the name memory persistent for the lifetime of the codec.
    • +
    • Core API - Increment Plugin API version for Output plugins. Dynamic library Output Plugins must be rebuilt.
    • +
    • Core API - FMOD_DSP_TYPE_LOWPASS, FMOD_DSP_TYPE_LOWPASS_SIMPLE, FMOD_DSP_TYPE_HIGHPASS, FMOD_DSP_TYPE_HIGHPASS_SIMPLE and FMOD_DSP_TYPE_PARAMEQ are considered deprecated and will be removed in the future. Use the new FMOD_DSP_TYPE_MULTIBAND_EQ instead which has the performance of "simple" effects with full featured quality.
    • +
    • Core API - Changed reverb wet mix to send from the fader DSP of a ChannelGroup. Previously it sent from the head DSP. Now effects placed pre-fader will apply to the signal sent to the reverb, while effects placed post-fader will not.
    • +
    • Core API - ChannelGroup reverb wet level is now scaled by the group's effective audibility.
    • +
    • Core API - ChannelGroup reverb no longer automatically disables reverb on its child channels when the wet level is set to non-zero.
    • +
    • Core API - Channel::setReverbProperties now allows setting the wet level before the specified reverb instance has been created.
    • +
    • Core API - ChannelControl::addDSP and ChannelControl::removeDSP manage standard DSP connections (FMOD_DSPCONNECTION_TYPE_STANDARD) to maintain the mixer hierarchy. Other connection types (FMOD_DSPCONNECTION_TYPE_SIDECHAIN, FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN, and now FMOD_DSPCONNECTION_TYPE_SEND) are left undisturbed.
    • +
    • Core API - FMOD_INIT_MIX_FROM_UPDATE will now directly execute the mixer from System::update instead of triggering the mix to happen in another thread.
    • +
    • Studio API - Incremented bank version, requires runtime 1.09.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Studio API - Studio::Bus::setFaderLevel, Studio::Bus::getFaderLevel, Studio::VCA::setFaderLevel and Studio::VCA::getFaderLevel is now called Studio::Bus::setVolume, Studio::Bus::getVolume, Studio::VCA::setVolume and Studio::VCA::getVolume.
    • +
    • Studio API - Studio::EventInstance::getVolume, Studio::EventInstance::getPitch, Studio::EventInstance::getParameterValue, Studio::EventInstance::getParameterValueByIndex, Studio::Bus::getVolume, Studio::VCA::getVolume now have an additional argument to get the final value which includes automation and modulation.
    • +
    • Studio API - The required alignment for Studio::System::loadBankMemory has been added as the constant FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT.
    • +
    • Studio API - Event instances now disable reverb on their internal channels, for all global reverb instances. Previously only did so for reverb instance 0. Use Studio::EventInstance::setReverbLevel to control the reverb mix for the whole event instance.
    • +
    • Studio API - Disconnected sidechain modulators are now inactive. Previous behavior was to fall back to monitoring the event's master track output.
    • +
    • Core API - FMOD_DSP_RELEASE_CALLBACK is now called from the main thread
    • +
    • Core API - Unimplemented ChannelControl::overridePanDSP function has been removed, along with FMOD_CHANNELCONTROL_DSP_PANNER enum value.
    • +
    • Core API - PS3 - Removed old opt-in FIOS support via FMOD_PS3_EXTRADRIVERDATA. New recommended approach is to use FMOD_FILE_ASYNCREAD_CALLBACK and set appropriate deadlines based on FMOD_ASYNCREADINFO::priority.
    • +
    • Core API - XboxOne - Optimized XMA decoding performance and removed the ACP thread.
    • +
    • Core API - PS4 - Improved AT9 decoding performance.
    • +
    • FSBank API - Added support for source data as a memory pointer instead of file name.
    • +
    • Documentation - Some FMOD_DSP_PAN_SURROUND enums changed to FMOD_DSP_PAN_2D for clarity.
    • +
    +

    01/12/16 1.08.15 - Studio API minor release (build 82163)

    +

    Features:

    +
      +
    • PS4 - Add support for System::getOutputHandle, to return sce port handle. Fixes:
    • +
    • UE4 - Fix missing plugin error when building on Mac.
    • +
    • UE4 - Fixed compatibility with 4.14.
    • +
    • Unity - Fixed OSX working with unified library.
    • +
    • Unity - Fixed WiiU copying banks error.
    • +
    • Unity - Fixed XboxOne dll meta files missing platform target.
    • +
    • Unity - Fixed duplicate dll copying build error on some platforms.
    • +
    • Unity - Added null check to stop error being thrown when no event assigned.
    • +
    • Unity - Fix in editor out of bounds exception in RuntimeManager.
    • +
    • Core API - Allow DSP::setParameterData with null data and 0 length to free convolution reverb impulse response data.
    • +
    • Core API - Fixed short looping streams playing some of the start when switched to non-looping via the Channel API.
    • +
    • Core API - Fixed FMOD_CREATESOUNDEXINFO::pcmsetposcallback getting wrong sound pointer passed to it with a stream.
    • +
    • Studio API - Fixed incorrect parameter values being passed to nested events when value "hold" is being used.
    • +
    • Studio API - PS3 - Fix potential crash with the new Channel Mix effect.
    • +
    • FSBank API - Fixed encoder bug with FADPCM causing occasional clipping at playback.
    • +
    +

    Notes:

    +
      +
    • FSBank API - FSBs / Banks may not be binary identical to previous release due to FADPCM encoder bug fix, however full compatibility is maintained.
    • +
    +

    20/10/16 1.08.14 - Studio API minor release (build 80900)

    +

    Fixes:

    +
      +
    • UE4 - Fix for crash when using "Validate FMOD" menu item
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 4.00
    • +
    • XboxOne - Added better logging and documentation to describe an incorrectly configured appxmanifest regarding microphone recording.
    • +
    +

    04/10/16 1.08.13 - Studio API minor release (build 80479)

    +

    Fixes:

    +
      +
    • Studio API - Fixed potential crash after the following sequence of actions: load master bank, try to load master bank again and fail with FMOD_ERR_EVENT_ALREADY_LOADED, unload master bank, reload master bank.
    • +
    • Core API - Fix circular DSP connection causing hang in certain situations.
    • +
    • Unity 2 - Fix issues with multi-object editing of emitters.
    • +
    +

    22/09/16 1.08.12 - Studio API minor release (build 80229)

    +

    Features:

    +
      +
    • Unity 2 - Added ability to override minimum and maximum distance for Event emitters.
    • +
    • Unity 2 - Added support for multiple listeners.
    • +
    • Studio API - Added support for auto pitch at minimum.
    • +
    • Studio API - Added support for the global master bus being duplicated across banks.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fix auto pitch cutting off at zero for parameter with minimum value that is less than zero.
    • +
    • Studio API - Fix events with a transciever effect not allowing the event to stop
    • +
    • Android - Fixed crash when loading FSBs or Banks that contain a sound that isn't mono, stereo, 5.1 or 7.1.
    • +
    • Android - Fixed compatibility issue with some devices introduced in previous release due to r12b update. Presents as a runtime linker error when loading the FMOD library, failing to locate __aeabi_atexit.
    • +
    • iOS - Fixed stuttering during fade out when device screen goes to sleep.
    • +
    • Core API - Fix FMOD_DSP_TRANSCEIVER memory stomp.
    • +
    • Core API - Fix channels playing at incorrect pitch. Introduced in 1.08.10.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.08.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Core API - Improved validation for ChannelGroup, DSP and Sound handles, detects invalid pointers and usage after release.
    • +
    +

    08/09/16 1.08.11 - Studio API minor release (build 79819)

    +

    Features:

    +
      +
    • Core API - PS3 - Added support for FMOD_DSP_CHANNELMIX.
    • +
    • Unity 2 - Respect Game View mute button.
    • +
    +

    Fixes:

    +
      +
    • FSBank - Fix crash on 64-bit when encoding 16kHz or 24kHz sources using Vorbis at low quality settings.
    • +
    • Core API - Fix FMOD_SOUND_PCMSETPOS_CALLBACK getting invalid position value when a sound opened with FMOD_OPENUSER loops.
    • +
    • Core API - Android - Fixed crash on load with old devices when using armeabi.
    • +
    • Unity 2 - Fix CREATESOUNDEXINFO not getting marshalled properly.
    • +
    +

    Notes:

    +
      +
    • Android - Now built with NDK r12b.
    • +
    • Android - Minimum Android version is now API level 9 due to NDK r12b deprecating older versions.
    • +
    +

    22/08/16 1.08.10 - Studio API minor release (build 79252)

    +

    Features:

    +
      +
    • Studio API - Improved performance of sidechain modulator.
    • +
    • Core API - Improved ChannelControl::setPitch accuracy between DSP clock and the underlying codec decoding speed.
    • +
    • Unity 2 - Added option for play-in-editor to reflect the active build target for loading banks.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed error trying to create a Return DSP when the system format is set to FMOD_SPEAKERMODE_RAW.
    • +
    • Core API - Fixed FFT DSP crash if window size is smaller than DSP block size.
    • +
    • Core API - Removed spurious warning messages when loading plugins on some platforms.
    • +
    • Core API - Android - Tweaked OpenSL auto detection, now requires device to specify low latency and a block size <= 1024.
    • +
    • Unity 2 - Fix bank import issues when the strings bank contains bank names that differ in case from the files on disk.
    • +
    • Unity 2 - Bank import now has a longer timeout after last detected file activity before starting import.
    • +
    • Unity 2 - Fixed settings screen allowing real channels to be set higher then 256.
    • +
    • Unity 2 - Fix up errors when StudioEventEmitter is created dynamically.
    • +
    • Unity 2 - Small fixes for the settings screen when overriding the parent platform settings.
    • +
    • UE4 - Fix for crash when previewing animations using the FMOD event notifier.
    • +
    +

    Notes:

    + +

    01/08/16 1.08.09 - Studio API minor release (build 78489)

    +

    Features:

    +
      +
    • Core API - PS4 - Add support for social screen audio to the ports API.
    • +
    • Studio API - Added Studio::EventInstance:setListenerMask and Studio::EventInstance::getListenerMask, that adds the ability to specify which listeners apply to each event instance.
    • +
    • Unity 2 - Warning is now produced when playing in editor if the position of a 3D event is not set.
    • +
    • UE4 - Added blueprint functions to set event properties.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed case of indeterminism when building banks that contain events with automation curves.
    • +
    • Core API - Fixed FMOD_OUTPUT_OBJECT3DINFO::gain so it only includes distance attenuation not bus gain (which is now pre-applied to FMOD_OUTPUT_OBJECT3DINFO::buffer.
    • +
    • Core API - Fixed channelmix DSP volume not always being initialized.
    • +
    • Core API - WiiU - Fixed potential crash during System::init if System::setDriver or System::setOutput has been called.
    • +
    • Core API - Fix hang on netstreams when the connection times out.
    • +
    • Core API - Linux - Fix FPU control word of the calling thread being modified when the FMOD dynamic library is loaded.
    • +
    • Core API - Android - Fixed potential crash if FMOD isn't loaded with System.loadLibrary, now a proper error will be issued.
    • +
    • FSBank API - Fixed FADPCM not looping seamlessly for non-zero crossing loops.
    • +
    • UE4 - Fixed plugin loading assuming a "lib" prefix for plugins on Android, Mac, Linux and PS4. Now plugin loading will attempt to load the name with and without adding a lib prefix.
    • +
    • UE4 - Respect FApp::IsUnattended for message-box errors.
    • +
    • UE4 - Fixed deprecation warnings about AttachTo usage.
    • +
    • Unity 2 - Fix errors when bank source files are updated while Event Browser preview is playing or paused.
    • +
    • Unity 2 - Fix unnecessary copying of Bank files in OSX editor.
    • +
    +

    Notes:

    +
      +
    • Core API - Linux - Removed limit of 32 devices with ALSA output mode.
    • +
    • Core API - Incremented API version of Output plugins. Dynamic library plugins built with earlier versions of 1.08 will continue to load.
    • +
    +

    14/07/16 1.08.08 - Studio API minor release (build 77846)

    +

    Features:

    +
      +
    • UE4 - bMatchHardwareSampleRate will use the system default format to avoid excessively matching the output rate on mobile devices.
    • +
    • UE4 - Added bLockAllBuses which will force all buses to be created at startup, rather than on demand.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed looping sounds in a multi sound playlist failing to stop if the multi sound itself is non-looping.
    • +
    • Studio API - Fixed rare crash calling the following functions while the bank containing the event is unloading: Studio::EventInstance::getDescription, Studio::EventInstance::getParameter, Studio::EventInstance::getParameterValue, Studio::EventInstance::setParameterValue, Studio::EventInstance::setParameterValueByIndex, Studio::EventInstance::triggerCue, Studio::ParameterInstance::getDescription and Studio::ParameterInstance::setValue.
    • +
    • Studio API - Fixed shared events becoming invalidated when one of the banks containing them is unloaded. Could also manifest as Studio::EventInstance::getDescription failing with FMOD_ERR_INTERNAL.
    • +
    • Studio API - Fixed crash that could occur when using FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE and calling Studio::System::update from multiple threads at the same time.
    • +
    • Studio API - Increased scheduling lookahead time to ensure sample accurate timeline scheduling even if there is an output stall.
    • +
    • Studio API - Fixed crash that could occur when improperly calling Studio::Bus::getChannelGroup without first calling Studio::Bus::lockChannelGroup, if the bus was being destroyed as the call was made.
    • +
    • Studio API - Fixed rare crash calling the following functions while the master bank containing the bus or VCA is unloading: Studio::System::getBus, Studio::System::getBusByID, Studio::System::getVCA and Studio::System::getVCAByID.
    • +
    • Studio API - Fixed rare timing issue where Studio::System::getEvent would succeed but Studio::EventDescription::createInstance would fail with FMOD_ERR_INTERNAL, if called just as the bank containing the event finished loading.
    • +
    • Studio API - Fixed rare hang in Studio::System::getBankCount when called while banks are currently unloading.
    • +
    • Core API - Fixed rare glitch at the start of XMA playback causing non-seamless looping.
    • +
    • Core API - Fixed rare hang on shutdown when using multiple systems.
    • +
    • Core API - Fix streams with an unknown file length remaining in the playing state after an end of file is encountered.
    • +
    • Core API - Windows - Enumeration of record devices will now reflect a change of default device with WASAPI output.
    • +
    • Core API - Linux - Enumeration will now correctly display GUIDs and speaker modes for ALSA output.
    • +
    • Core API - Linux - Fixed potential crash if both PulseAudio and ALSA are missing / unavailable.
    • +
    • Unity 2 - Fix plugin loading on Linux standalone builds.
    • +
    • Unity 2 - Fix script compilation errors in standalone builds.
    • +
    • Unity 2 - Fix Event Browser preview of events with built-in parameters.
    • +
    • Unity 2 - Fix missing tvOS files.
    • +
    +

    Notes:

    +
      +
    • Core API - Significantly reduced memory consumption when using FMOD_DSP_FFT.
    • +
    • PS4 - Now built with SDK 3.508.101
    • +
    • UE4 - Updated Oculus plugin to 1.0.4.
    • +
    +

    27/06/16 1.08.07 - Studio API minor release (build 77241)

    +

    Features:

    +
      +
    • FSBank API - Added support for Linux.
    • +
    • Unity 2 - Live Update and Debug Overlay can be set to only be enabled in standalone builds when the development build option is set.
    • +
    • Unity 2 - Add MuteAllEvents and PauseAllEvents functions to the RuntimeManager.
    • +
    • Unity 2 - Audio will now pause when the application pauses.
    • +
    • UE4 - Added MixerSuspend and MixerResume blueprint functions.
    • +
    • UE4 - Added IsBankLoaded blueprint function.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Studio command buffer assert and crash that could occur when using FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE in conjunction with multiple threads.
    • +
    • Core API - Fix crash when closing a system with a multi-plugin DLL still loaded.
    • +
    • Core API - iOS / Android - Improved audio stability when mixer thread is overloaded.
    • +
    • FSBank API - Fixed calling convention linker error on Windows in FSBankLib header.
    • +
    • FSBank API - Fixed issue when passing duplicate source files with different encoding settings would cause cache file conflicts.
    • +
    +

    Notes:

    +
      +
    • Unity 2 - Renamed "Level Start" and "Level End" triggers to "Object Start" and "Object Destroy" to more accurately reflect when the triggers occur.
    • +
    +

    17/06/16 1.08.06 - Studio API minor release (build 76937)

    +

    Features:

    +
      +
    • Unity 2 - Added framework for registering native plugins on iOS and tvOS.
    • +
    • Unity 2 - Added support for importing Studio Banks as TextAssets so they can be added to Unity AssetBundles.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed crash on shutdown, after creating multiple systems and setting a system callback.
    • +
    • Core API - PS4 - Fix issues with calling FMOD_PS4_GetPadVolume() immediately after opening the controller audio port.
    • +
    +

    15/06/16 1.08.05 - Studio API minor release (build 76824)

    +

    Features:

    +
      +
    • Studio API - Added Studio::EventDescription::isSnapshot.
    • +
    • Unity 2 - Added "Preload Sample Data" checkbox to Event Emitter to reduce latency when emitters are triggered for the first time.
    • +
    • Unity 2 - Added script example to show how to build an asynchronous loading screen that includes loading FMOD Banks.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Studio::EventDescription::isOneshot () incorrectly returning true for snapshots.
    • +
    • Core API - Fix FMOD_ADVANCEDSETTINGS::maxADPCMCodecs not being applied.
    • +
    • Core API - Fix crash when using CreateSound from multiple threads (including FMOD Async loading threads).
    • +
    • Unity 2 - Fix issues when bank file in the Unity project Streaming Assets folder have a different case to the banks in the Studio project.
    • +
    • Unity 2 - Fix issues when editor log file cannot be opened because it's read only.
    • +
    • Unity 2 - If the "Load All" options are selected in the FMOD Settings then the main thread will now block until it's complete.
    • +
    • UE4 - Fix for OnEventStopped callback firing repeatedly if triggers the instance to play again.
    • +
    +

    Notes:

    +
      +
    • Core API - All System, ChannelControl, ChannelGroup, Channel, and DSP API functions check for NaN and INF floats and return FMOD_ERR_INVALID_FLOAT if detected.
    • +
    • Studio API - All API functions check for NaN and INF floats and return FMOD_ERR_INVALID_FLOAT if detected.
    • +
    • Studio API - All API functions with output parameters now clear those values in the case of an error. Previously some values may have been left uninitialized. In the case of an error, int and float outputs are set to 0, bool outputs are set to false, and pointers are set to NULL. Structures are cleared to zeros, and string buffers are set to the empty string.
    • +
    +

    25/05/16 1.08.04 - Studio API minor release (build 76196)

    +

    Features:

    +
      +
    • Studio API - Added runtime support for steal quietest polyphony.
    • +
    • Core API - Improved performance when connecting sends and returns.
    • +
    • UE4 - FFMODEventInstance can now be stored as a blueprint variable.
    • +
    • UE4 - Added support for Occlusion. See the Occlusion section of the documentation for more information.
    • +
    • UE4 - Added support for Android deployment without having to modify the engine.
    • +
    • UE4 - Added InitialDriverOutputName to select output device by name at startup, as well as new Blueprint functions GetOutputDrivers, SetOutputDriverByName and SetOutputDriverByIndex.
    • +
    • UE4 - Added VCASetFaderLevel Blueprint function.
    • +
    • UE4 - "FMOD Validate" now checks for FMOD in the packaging setting, and can add it if needed.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed unnecessary DSP queue flush when using ports.
    • +
    • Core API - Fixed ADPCM and FADPCM compressed FSBs not returning FMOD_ERR_MEMORY_CANTPOINT when loaded as FMOD_OPENMEMORY_POINT FMOD_CREATESAMPLE.
    • +
    • Core API - Fix pops when channels with a mix matrix that are started virtual become real.
    • +
    • Core API - Fixed DSP panner reset not clearing ramps, causing ramping when setting initial parameters.
    • +
    • Core API - Fixed Sound::getSyncPointInfo returning first sync point info when loading sounds from FSBs with multiple sync points.
    • +
    • Studio API - Fixed memory stomp that can occur when sharing events between multiple banks, if a streaming sound is in the middle of loading when one of the shared banks is unloaded.
    • +
    • Unity 2 - Fix error messages when previewing an event contained in the Master Bank.
    • +
    • Unity 2 - Fix WinPhone 8.1 DLL's conflicting with UWP builds.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.08.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • UE4 - Updated ovrfmod to version 1.0.3.
    • +
    • UE4 - Tested with 4.12 pre-release, compiles successfully.
    • +
    • PS Vita - Now built with SDK 3.570.011.
    • +
    +

    05/05/16 1.08.03 - Studio API minor release (build 75571)

    +

    Features:

    +
      +
    • Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED and FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED for when an event plays sounds. Sound names will only be available if banks have been re-exported in FMOD Studio 1.08.03 or later. See the music_callbacks example for demonstration.
    • +
    • Studio API - Added runtime support for the event cooldown property set from FMOD Studio. Events that fail to start due to cooldown time will invoke the FMOD_STUDIO_EVENT_CALLBACK_START_FAILED callback.
    • +
    • Core API - Improved performance of logging.
    • +
    • Core API - PS4 - Improved performance when profiling is enabled.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Events that fail to start due to bus polyphony now invoke the FMOD_STUDIO_EVENT_CALLBACK_START_FAILED callback.
    • +
    • Studio API - Fixed crash when calling Studio::System::unloadAll with crossfading nested events.
    • +
    • Studio API - Fixed unnecessary up/down mix applied to 2D events that have sidechain modulators.
    • +
    • Studio API - Fixed mixing issues and degraded performance if the system speaker mode does not match the Studio project format.
    • +
    • Studio API - Fixed case of stereo sounds panning hard right when downmixed to a mono track and later upmixed again, introduced in 1.07.04.
    • +
    • Core API - Fixed potential incorrect position when voice comes back from being virtual, which can cause a hang on XboxOne.
    • +
    • Core API - Improved handling for out of memory errors when mixing DSP buffers.
    • +
    • Core API - Fixed incorrect propagation of FMOD_DSP_STATE::channelmask when mixing signals with differing masks.
    • +
    • Core API - Fixed http streams (file from http, not shoutcast/icecast) returning FMOD_ERR_FORMAT. Introduced 1.08.01
    • +
    • Core API - Fixed m3u playlist file format support. Was returning FMOD_ERR_FORMAT.
    • +
    • Core API - Android - Improved detection of low-latency devices allowing better automatic output mode selection and less stuttering.
    • +
    • Core API - Sound::getName will now return "" for sounds without names, instead of "(null)".
    • +
    • Core API - Object 3D Panning fix for silent objects in certain speaker modes
    • +
    • Studio API - More robust live update handshaking when attempting to connect with multiple copies of FMOD Studio at once.
    • +
    • Unity 2 - Added missing Studio::EventDescription::getSoundSize function.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.08.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Studio API - Sound names are now loaded into memory if they have been exported in the bank file. The option is on by default, which means by the runtime memory use might be slightly higher when loading banks exported from 1.08.03 and later. If this is a problem, make sure to disable the option to export sound names in FMOD Studio when re-exporting banks.
    • +
    • XboxOne - Now built with March 2016 QFE 1 XDK.
    • +
    • PS4 - Now built with SDK 3.508.031.
    • +
    +

    13/04/16 1.08.02 - Studio API minor release (build 74770)

    +

    Fixes:

    +
      +
    • UE4 - Fixed audio component transform not being updated in 4.11.
    • +
    • Studio API - Fixed unnecessary up/down mix applied to 2D events that have sidechain modulators.
    • +
    • Studio API - Studio::EventDescription::is3D now returns true if there is a plug-in panner on the master track.
    • +
    +

    Notes:

    +
      +
    • UE4 - PS4 - Deployment uses standard unreal plugin system.
    • +
    • UE4 - Now built against Unreal 4.11
    • +
    +

    07/04/16 1.08.01 - Studio API minor release (build 74554)

    +

    Features:

    +
      +
    • Unity 2 - Added Universal Windows Application platform support.
    • +
    • Unity 2 - Added Find and Replace tool.
    • +
    • Core API - Improved performance when creating DSPs.
    • +
    • UE4 - Added FMOD stats for CPU usage.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed errors being generated when the initial seek is past the loop end point of a sound.
    • +
    • Studio API - Fixed error loading sample data for banks loaded by Studio::System::loadBankMemory with FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES flag.
    • +
    • Studio API - Fixed rare Studio update error FMOD_ERR_NOTREADY when stopping modules with streaming sounds.
    • +
    • Studio API - Fixed unnecessary up/down mix on sidechain effects in game.
    • +
    • Studio API - Eliminated API stalls due to holding a lock when creating event instances on the Studio Update thread.
    • +
    • Studio API - Fixed error when loading an API capture that contains Studio::System::flushSampleLoading commands.
    • +
    • Studio API - PS4 - Fixed incorrect linking options on fmodstudio.prx that caused package creation to fail.
    • +
    • Core API - Fixed rare hang when rapidly creating and releasing Return DSPs.
    • +
    • Core API - Fixed hang or crash when loading a .it/s3m/mod/mid file as a decompressed sound.
    • +
    • Core API - Fixed some shoutcast streams playing back garbled.
    • +
    • Core API - Fixed Sound::readData returning 0 for bytes read, instead of a valid number if FMOD_ERR_FILE_EOF was returned. Introduced in 1.07.08.
    • +
    • Core API - PS4 - Fix AT9 playback when a sound created as looping is played with the channel loop-count explicitly set to zero before starting.
    • +
    • Core API - Win - Fixed ASIO device enumeration not supplying a GUID.
    • +
    • Core API - Win - Fixed ASIO device enumeration having a blank name if the device is not connected.
    • +
    • UE4 - Added lock around file accesses to avoid Unreal pak file thread safety issue.
    • +
    • UE4 - Fixed logging callback not being initialized.
    • +
    • UE4 - Avoid asset table system from mixing while normal mixer is in operation, to work around an AT9 mixer issue.
    • +
    • UE4 - Fixed always linking against ovrfmod even if it isn't present.
    • +
    • Unity 2 - Rewrote Timeline Callback and Programmer Sound Callback examples to work on iOS.
    • +
    • Unity 2 - Fix marshalling of FMOD.CREATESOUNDEXINFO structure on iOS.
    • +
    • Unity 2 - Fix DLL not found errors in standalone Windows builds.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.08.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Studio API - Studio::EventInstance::setPitch () now returns an error if a NaN is passed in.
    • +
    • Studio API - Errors that occur during the Studio update thread will no longer stop the thread.
    • +
    • Studio API - Studio will set the master channel group format to the project's format to avoid an extra upmix.
    • +
    +

    04/03/16 1.08.00 - Studio API major release (build 73609)

    +

    Features:

    +
      +
    • Studio API - Sample data loading has been optimised. Load time, file access, and memory use have all been substantially improved. A new entry has been added to the per platform thread affinity settings.
    • +
    • Studio API - FMOD_STUDIO_PARAMETER_DESCRIPTION now has the parameter index and default value.
    • +
    • Studio API - Added Studio::System::flushSampleLoading.
    • +
    • Studio API - Support for left edge trimming of timelocked sounds.
    • +
    • Studio API - Support for Start Offset as a percentage of sound length.
    • +
    • Studio API - Added idle resource pool to keep recently used sounds in memory in case they might be re-used. It can be controlled by the idleResourcePoolSize field in FMOD_STUDIO_ADVANCEDSETTINGS. See the Studio Banks Programmer Topic for more information.
    • +
    • Core API - Increased performance of System::createSound and System::createStream, since they no longer block against System::update.
    • +
    • Core API - Added filebuffersize to FMOD_CREATESOUNDEXINFO for customizable file buffering.
    • +
    • Core API - Added System::getFileUsage to query file loading information.
    • +
    • Core API - Custom DSP effects now always receive a buffer length that is equal to the mix block size. The input and output buffers will always be 16-byte aligned. Custom DSP sounds still have be able to generate signal less than a mix block.
    • +
    • Core API - Added getclock callback to FMOD_DSP_STATE_SYSTEMCALLBACKS to get the clock, offset and length for a custom DSP.
    • +
    • Core API - Added support for multiple plugins within one plugin file. See FMOD_PLUGINLIST, System::getNumNestedPlugins, System::getNestedPlugin, and the DSP Plugin API Programmer Topic for more information.
    • +
    • Core API - Added support for object based panning with two backend providers, Dolby Atmos (FMOD_OUTPUTTYPE_ATMOS) and Playstation VR (FMOD_OUTPUTTYPE_AUDIO3D).
    • +
    • Core API - Added 3D object panner DSP (FMOD_DSP_TYPE_OBJECTPAN) to be used with new object pan enabled outputs.
    • +
    • Core API - Extended output mode plugin API (FMOD_OUTPUT_DESCRIPTION) to allow custom object panner backends.
    • +
    • Core API - Win - Reduced WASAPI latency by 40ms and improved mixer thread regularity.
    • +
    • FSBank - AT9 Band Extension is now enabled by default for supported bit-rates.
    • +
    • FSBank - Added Mac versions of the FSBank tool and FSBankLib API. Included in the Mac and iOS API packages.
    • +
    • Profiler - Added Mac version of the Profiler tool. Included in the Mac and iOS API packages.
    • +
    • Unity 2 - Added ability to create new studio events from within the Unity editor.
    • +
    • Unity 2 - Improved event selection UI on emitter component and when using EventRef attribute.
    • +
    • Unity 2 - Added support for default parameter values in emitter component.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.08.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Studio API - New example 'object_pan' that demonstrates object based panning.
    • +
    • Studio API - Studio::EventDescription::getSampleLoadingState and Bank::getSampleLoadingState now return FMOD_STUDIO_LOADING_STATE_ERROR if sample data failed to load (e.g. due to a corrupt file).
    • +
    • Studio API - Removed Studio::CueInstance, Studio::EventInstance::getCue, Studio::EventInstance::getCueCount and Studio::EventInstance::getCueByIndex. Instead use new functions Studio::EventDescription::hasCue and Studio::EventInstance::triggerCue.
    • +
    • Studio API - Deprecated Studio::EventInstance::getParameter and Studio::EventInstance::getParameterByIndex. Instead use Studio::EventInstance::getParameterValue, Studio::EventInstance::setParameterValue, Studio::EventInstance::getParameterValueByIndex, and Studio::EventInstance::setParameterValueByIndex.
    • +
    • Studio API - Increased stack size for Studio threads to 64K.
    • +
    • Studio API - Played events will stay in the FMOD_STUDIO_PLAYBACK_STARTING state until their sample data has loaded. This avoids selected sounds in the event playing late if the sample data has not been preloaded.
    • +
    • Core API - System::getChannelsPlaying now returns the number of real and total channels playing. System::getChannelsReal has been removed.
    • +
    • FSBank - AT9 compression now requires AT9 library 1.7.1 (DLL version 2.8.0.5) or later. Compression in 32bit versions of FSBank is no longer supported in line with Sony's removal of 32bit compression libraries.
    • +
    +

    03/03/16 1.07.08 - Studio API patch release (build 73591)

    +

    Features:

    +
      +
    • Unity 2 - Importing banks has been speed up dramatically.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Studio::EventInstance::setProperty not restoring the default setting for FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE and FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE when a value of -1 is specified.
    • +
    • Studio API - Fixed case of mono sounds panning hard left when both mono and stereo 2D sounds are placed on the same event track, introduced in 1.07.04.
    • +
    • Core API - Fixed some net streams returning 'invalid parameter' introduced in 1.07.06.
    • +
    • Core API - Fixed potential crash if calling Sound::release soon after System::createSound with FMOD_NONBLOCKING and async IO callbacks.
    • +
    • Core API - Winstore/UWP - Fixed small memory leak on system shutdown.
    • +
    • Core API - Winstore/UWP - Fixed occasional crash when closing a socket with a pending asynchronous read.
    • +
    • Core API - Xbox One - Fixed potential hang waiting on XMA Sound::release if using async IO callbacks and a cancel was issued.
    • +
    • Core API - Android - Relaxed overly strict validation of M4A files introduced in 1.07.07.
    • +
    • Core API - Android - Fixed potential JNI_OnLoad failure introduced in 1.07.07.
    • +
    • Core API - Fix crash in convolution reverb if wet level is set to -80db and it has no inputs.
    • +
    • Core API - Fix seeking on stereo FADPCM compressed streams and samples.
    • +
    • Unity 2 - Errors opening log output file are no longer fatal.
    • +
    +

    Notes:

    + +

    16/02/16 1.07.07 - Studio API patch release (build 72710)

    +

    Features:

    +
      +
    • Core API - Win - Improved ASIO output to accept requested sample rate and buffer size instead of using defaults.
    • +
    • UE4 - FMOD Memory allocation now occurs via standard UE4 allocators.
    • +
    • Unity 2 - Added AppleTV support.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed System::loadPlugin not unloading the library file in the case of an error.
    • +
    • Core API - Fixed automatic format detection failing for some types when the file size is less than 1KB.
    • +
    • Core API - Fixed FMOD_CREATESOUNDEXINFO::suggestedsoundtype being ignored for FMOD_OPENMEMORY and FMOD_OPENMEMORY_POINT.
    • +
    • Core API - WinStore/UWP - Fixed occasional deadlock when removing the current output device.
    • +
    • Core API - Win - Fixed potential crash if switching output mode to ASIO after System::init.
    • +
    • Core API - Android - Fixed crash if MediaCodec processes a file that isn't an M4A file.
    • +
    • Core API - Android - Fixed Marshmallow devices being unable to load M4A files.
    • +
    • Unity 2 - Remove broken inspector code for ParamRef.
    • +
    • Unity 2 - Fix PS Vita.
    • +
    • Unity 2 - Small event reference UI rendering fixes.
    • +
    • Unity 2 - Fix unnecessary copying of files that haven't been modified.
    • +
    • Unity 2 - Fix issues with copying of files that have only been partially written by the Studio tool.
    • +
    • Unity 2 - Work around IL2CPP issues introduced in Unity 5.3.2p2.
    • +
    • Legacy Unity - Work around IL2CPP issues introduced in Unity 5.3.2p2.
    • +
    • Unity 2 - Xbox One - Fix runtime errors when using Mono AOT compilation.
    • +
    +

    Notes:

    +
      +
    • Unity 2 - Unity 5.3.2p1 is not supported for iOS.
    • +
    • Legacy Unity - Unity 5.3.2p1 is not supported for iOS.
    • +
    +

    27/01/16 1.07.06 - Studio API patch release (build 71893)

    +

    Features:

    +
      +
    • +

      Studio API - Improved CPU and IO performance when capturing API commands via Studio profiler.

      +
    • +
    • +

      Core API - Android - Lollipop devices may now select 7.1 with AudioTrack output mode. Older devices will gracefully fall back to stereo.

      +
    • +
    • Unity 2 - Emitter gizmos are now pickable in the scene view.
    • +
    • Unity 2 - Event Browser layout changed to work in narrow windows. Note the Event Browser windows will need to be closed and re-opened for new minimum bounds to take effect.
    • +
    • Unity 2 - Added bitcode support for iOS.
    • +
    • UE4 - Added support for programmer sounds. See the new UE4 Programmer Sound page for more information.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed bug if streams start virtual, they may not come back as audible. Introduced in 1.07.00
    • +
    • Core API - Update URL in Netstream example.
    • +
    • Core API - Fixed net streams not working when server delivers shoutcast with chunked HTTP data.
    • +
    • Core API - Fixed memory leak when a network connection fails.
    • +
    • Core API - Android - Devices that don't support 5.1 output will now gracefully fallback to stereo.
    • +
    • Core API - WinStore / UWP - Fixed WASAPI output so it return the correct 'no drivers' error when none are detected.
    • +
    • Core API - WinStore / UWP - Fixed WASAPI output swapped sides and rears in 7.1.
    • +
    • Core API - Fix C# wrapper of ChannelGroup.addGroup missing arguments.
    • +
    • Core API - Fix crash when using chorus effect on a channel group with channel count greater than the system channel count.
    • +
    • Core API - PS4 - Fix validation of thread affinity settings.
    • +
    • Core API - iOS - Fixed compatibility issue introduced in 1.07.02 for old devices running iOS 6.X.
    • +
    • Unity 2 - Fixed UI when EventRef attribute is used on an array of strings.
    • +
    • Unity 2 - Work around DLL loading issues on some standalone Windows builds.
    • +
    • Unity 2 - Fix DLL loading issues for play-in-editor when platform is iOS.
    • +
    • Unity 2 - Fix RuntimeManager being recreated during shutdown and leaking FMOD native instances.
    • +
    • Unity 2 - Fix issue when using RuntimeManager.LowLevelSystem and RuntimeManager.StudioSystem before RuntimeManager has initialized.
    • +
    • Unity 2 - Increase channels for Play-In-Editor.
    • +
    • Unity 2 - Fix play-in-editor not setting the speaker mode correctly.
    • +
    • Unity 2 - PS4 - Fix script compile errors.
    • +
    +

    Notes:

    +
      +
    • Xbox One - Now built with November 2015 XDK.
    • +
    • iOS - Now built with iOS SDK 9.2 and tvOS SDK 9.1 (Xcode 7.2).
    • +
    • UE4 - Updated Oculus plugin for 1.0.1.
    • +
    +

    07/01/15 1.07.05 - Studio API patch release (build 71238)

    +

    Features:

    +
      +
    • Unity 2 - When using the file browser in the settings editor to set the Studio source paths the result will be set relative to the Unity project if it is a sub-directory.
    • +
    • Unity 2 - Added Parameter Trigger component.
    • +
    +

    Fixes:

    +
      +
    • Core API - UWP - Fixed FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED not firing when the default output device changes.
    • +
    • Core API - PS3 - Fix rare crash with reverb.
    • +
    • Core API - PS3 - Fix static and audio dropouts if speaker mode is forced to stereo (normally it is 7.1).
    • +
    +

    Notes:

    +
      +
    • iOS - Reduced binary size.
    • +
    • Android - Added calling convention to public API to allow usage with hard float ABI.
    • +
    +

    11/12/15 1.07.04 - Studio API patch release (build 70728)

    +

    Features:

    +
      +
    • Core API - Better support for sounds with channel/speaker masks, ie a 1 channel sound specified as LFE, or a quad sound specified as LRCS instead of 2 front 2 back for example.
    • +
    • Unity 2 - Added optional debug overlay.
    • +
    • Unity 2 - Added migration steps for data in custom components.
    • +
    • Unity 2 - Added support for Unity 4.6.
    • +
    • Unity 2 - Added support for Android split binary.
    • +
    • Unity Legacy - Added support for Android split binary.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed blocking bank loads stalling for longer than necessary when other threads are constantly issuing new Studio commands.
    • +
    • Core API - Fixed corrupted playback for big endian PCM FSBs.
    • +
    • Core API - Fixed crash when switching channel count of generator DSPs during playback.
    • +
    • Core API - PS3 - Fix crash reallocating buffers on flange effect.
    • +
    • Core API - Xbox One - Fixed rare stall when playing XMA streams and compressed samples at the same time.
    • +
    • Core API - Fix crash if the Master Channel Group head DSP was set inactive right after initialization.
    • +
    • Core API - Fix Sound::getOpenState () moving from FMOD_OPENSTATE_PLAYING too early on some streaming sounds.
    • +
    • Core API - Fix Sound::Release () freeing memory still in use by the mixer.
    • +
    • Core API - Fix convolution reverb not correctly producing tails on long impulse responses when it has no input.
    • +
    • Unity 2 - Fixed issue with plugins not being loaded correctly.
    • +
    • Unity 2 - Work around DLL loading issues on some standalone Windows builds.
    • +
    • Unity 2 - Fix leaking system objects leading to ERR_MEMORY.
    • +
    • Unity 2 - Updated signature of DSP::setWetDryMix, DSP::getWetDryMix.
    • +
    +

    Notes:

    +
      +
    • Core API - FMOD_DSP_STATE::channelmask is now passed down through the dsp chain so plugin developers can see the original signal channel format even if a sound was upmixed.
    • +
    +

    17/11/15 1.07.03 - Studio API patch release (build 69975)

    +

    Features:

    +
      +
    • Core API - When using System::recordStart the provided FMOD::Sound can now be any channel count, up/down mixing will be performed as necessary.
    • +
    • Core API - Improved performance of convolution reverb effect when wet is 0 or input goes idle.
    • +
    • Core API - PS4 - Added FMOD_THREAD_CORE6 to allow access to the newly unlocked 7th core.
    • +
    • Core API - PS4 - Added FMOD_PS4_GetPadVolume() to retrieve the output volume of the pad speaker as set by the user in the system software.
    • +
    • Core API - Added FMOD_DSP_TYPE_TRANSCEIVER. Send signals from multiple sources to a single 'channel' (out of 32 global 'channels') and receieve from that or any channel from multiple receivers. Great for receiving and broadcasting a submix from multiple 3d locations (amongst other uses).
    • +
    • Unity - FMOD_StudioSystem.GetEvent() can now be used with snapshot paths.
    • +
    • Unity - Ignore OSX resource fork files when importing from FAT32 file systems.
    • +
    • UE4 - Deployment will also copy any plugins listed in a file plugins.txt in the FMODStudio/Binaries/Platform directory. See the Using Plugins page for more information.
    • +
    • UE4 - Console platforms set up thread affinity in FMODPlatformSystemSetup.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed snapshot applied to VCA level not working in game.
    • +
    • Studio API - Fixed profiler session timing when recording a game with a non-standard sample rate.
    • +
    • Studio API - PS4 - Fix linker error in examples.
    • +
    • Core API - Fixed buffer overrun when convolution reverb is set up with mismatched input and output channels.
    • +
    • Core API - Fix crash with invalid .mp3 files.
    • +
    • Core API - Fix Sound::getName () not returning a valid UTF8 string when loading a sound with ID3 tags specifying the title as a latin1 string.
    • +
    • Core API - Fix pops in flange and chorus effects.
    • +
    • Core API - Fix crash when using flange effect on a channel group with channel count greater than the system channel count.
    • +
    • Core API - FLAC - Fix crash when seeking in certain flac files.
    • +
    • Core API - Android - Automatic selection of OpenSL output mode will now be stricter to reduce stuttering on devices that incorrectly report they are low latency.
    • +
    • Core API - PS4 - Fix signal not being routed back to the main output when detaching a channel group from a port.
    • +
    • Core API - Fix FMOD_ADVANCEDSETTINGS::reverb3Dinstance not working.
    • +
    +

    Notes:

    + +

    02/11/15 1.07.02 - Studio API patch release (build 69450)

    +

    Important:

    +
      +
    • AppleTV platform support is now part of the iOS package.
    • +
    +

    Features:

    +
      +
    • Core API - Improved performance of System::getChannelsPlaying.
    • +
    • Core API - Added System::getChannelsReal to get the number of non-virtual playing channels.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed internal error during playback caused by inaccuracies in quantization calculation when timeline position is greater than 5 minutes.
    • +
    • Core API - Fix mixer not running if mixer sample rate is lower than output sample rate.
    • +
    • Core API - Fix Sound::getOpenState returning FMOD_OPENSTATE_READY when a sounded ended, when it should have returned FMOD_OPENSTATE_PLAYING for a bit longer, which meant Sound::release could stall.
    • +
    • Core API - iOS - Fixed output being mono on some devices, minimum detected hardware channel count is now 2 to ensure stereo.
    • +
    +

    Notes:

    +
      +
    • iOS - Now built with iOS SDK 9.1 and tvOS SDK 9.0 (Xcode 7.1).
    • +
    • Mac - Now built with SDK 10.11 (Xcode 7.1).
    • +
    +

    27/10/15 1.07.01 - Studio API patch release (build 69235)

    +

    Features:

    +
      +
    • Studio API - Added support for multiple parameter conditions.
    • +
    • Studio API - Added Studio::EventDescription::getSoundSize.
    • +
    • UE4 - Added validation help menu option to diagnose common issues.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed auto-pitch, cutoff and looping not live updating properly.
    • +
    • Core API - Fixed potential crash on ARM platforms when seeking Vorbis compressed FSBs.
    • +
    • Core API - Fix ChannelGroup::setReverbProperties from returning FMOD_ERR_REVERB_CHANNELGROUP if a child channel had a reverb connection previously.
    • +
    • Core API - Fixed FMOD_CREATESOUNDEXINFO::suggestedsoundtype being ignored if a custom codec of higher priority has been registered.
    • +
    • Core API - Fixed System::getRecordNumDrivers incorrectly reporting 0 if called within 1 second of application start on some platforms.
    • +
    • Core API - Fixed stereo AIFF files producing static.
    • +
    • Core API - Xbox One - Fixed rare crash for stereo XMA streams.
    • +
    • Core API - iOS - Fixed MP3 decoding being performed by FMOD cross-platform decoder instead of native AudioQueue.
    • +
    • Core API - Fix mp3 crash seeking, introduced in 1.07.00 if using certain types of MP3 file in FMOD_CREATECOMPRESSEDSAMPLE mode.
    • +
    • Unity - Change Android to read banks straight from APK
    • +
    • Unity - Will automatically append a "64" suffix to plugins if required.
    • +
    • Unity - Fix OSX bundles having incorrect settings
    • +
    • Unity - Fix compatibility with Unity 5.2.2
    • +
    • Unity - Fix crashes when creating a standalone OSX build.
    • +
    • UE4 - Fix for audio component direction not being set into FMOD.
    • +
    • UE4 - Fixed IOS deployment error "libfmod does not exist"
    • +
    +

    Notes:

    +
      +
    • Studio API - The FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED and FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED callbacks now fire from nested events, for both plugin effects and plugin sounds.
    • +
    • Studio API - For the FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES callback argument, the 'name' field will contain just the user defined name of the plugin sound if one has been set. Otherwise it will be empty. You can use the 'dsp' field to determine the plugin type.
    • +
    • Studio API - Programmer sounds with no name will have an empty string for FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES.name, previously it was an arbitrary hex sequence.
    • +
    • Core API - Plugin developers - FMOD_DSP_SYSTEM_GETSPEAKERMODE added to FMOD_DSP_STATE_SYSTEMCALLBACKS. Plugin SDK version updated to 1.07 meaning plugins created from this point onwards wont work with older versions of FMOD.
    • +
    • Android - Replaced all Eclipse examples with Visual Studio using NVIDIA Nsight Tegra integration.
    • +
    • PS4 - Now built with SDK 3.008.041
    • +
    • PS3 - Now built with SDK 475.001.
    • +
    +

    05/10/15 1.07.00 - Studio API minor release (build 68517)

    +

    Important:

    +
      +
    • Studio is now a 64-bit application. All plugin libraries must be built for 64-bit architecture to be compatible with the 64-bit version of the tool.
    • +
    • Added Universal Windows Platform (UWP) support.
    • +
    • Added AppleTV platform support. Contact support@fmod.org for beta access.
    • +
    +

    Features:

    +
      +
    • Studio API - Support for bus polyphony.
    • +
    • Studio API - Added FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE and FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE to override the minimum and maximum panner distance for an instance.
    • +
    • Studio API - Added FMOD_STUDIO_INIT_DEFERRED_CALLBACKS to defer event callbacks to the main thread. See Studio::EventInstance::setCallback for more information.
    • +
    • Core API - Added FMOD_DSP_TYPE_CHANNELMIX effect. Allows user to control gain levels for up to 32 input channel signals, and pipe the output to a range of speaker formats i.e. repeating mono, stereo, quad, 5.1, 7.1 or only LFE out.
    • +
    • Core API - Improved CPU performance when using metering or profiling.
    • +
    • Core API - Added support for loading multi-channel FSBs with the FMOD_CREATECOMPRESSEDSAMPLE flag.
    • +
    • Core API - Improved record driver enumeration, list is now persistent, removed devices will remain to ensure record IDs stay valid. See record_enumeration example for new functionality.
    • +
    • Core API - Added full record device add/removal detection for Windows, Mac, Xbox 360, Xbox One, PS3 and PS4.
    • +
    • Core API - Reduced recording latency on Windows, XboxOne and PS4.
    • +
    • Core API - Mac - Added support for recording from multiple microphones at the same time.
    • +
    • Core API - Win - Improved CPU performance for FSB Vorbis decoding. See Performance Reference section of the documentation for updated benchmark results.
    • +
    • Core API - iOS - Added support for bitcode.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed the scatterer module's random distance calculation to ensure it is within the limit set in Studio. In previous versions the random distance may have exceeded the max limit. This change may affect the loudness of sounds with scatterer modules compared to 1.06.xx releases.
    • +
    • Core API - Fix rare crash when releasing a streamed sound.
    • +
    • Core API - Fix output plugins with GUIDs of zero stopping setDriver working.
    • +
    • Core API - PS3 - Fixed send/returns not respecting volume changes or rarely failing with an error when setting return IDs.
    • +
    • Core API - PS4 - Rewrote output to use sceAudioOutOutputs instead of multiple sceAudioOutOutput calls on a single thread.
    • +
    • Core API - Win - Fixed the audible output driver from resetting when an unrelated device is removed or disabled.
    • +
    • Core API - Xbox One - Fixed the first couple of samples of decoded XMA being lost due to SHAPE SRC.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.07.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Studio API - Improved compatibility for plugin effects. Adding extra DSP parameters to an effect no longer breaks bank version compatibility.
    • +
    • Studio API - Studio::Bank::getEventCount and Studio::Bank::getEventList only return events directly added to the bank, not implicit events that are included in the bank due to event instrument references.
    • +
    • Studio API - The asynchronous command buffer for the Studio API will now grow as necessary, avoiding stalls that could occur if it was too small. The commandQueueSize field in FMOD_STUDIO_ADVANCEDSETTINGS now specifies the initial size of the buffer.
    • +
    • Studio API - Studio now enables FMOD_INIT_VOL0_BECOMES_VIRTUAL by default.
    • +
    • Studio API - WinStore - Fixed inconsistent naming of X64 libraries.
    • +
    • Core API - Increased FMOD_MAX_LISTENERS from 5 to 8.
    • +
    • Core API - System::getCPUUsage update time now includes the metering and profiling part of the update.
    • +
    • Core API - Removed support for FSB Vorbis files built using FMOD Ex 4.42 or earlier.
    • +
    • Core API - PS4 - Changed default mix buffer size to 512 samples to reduce CPU cost. Previous setting of 256 can be set using System::setDSPBufferSize.
    • +
    • Core API - PS4 - The size of each pre-allocated AT9 instance has increased by 8kB.
    • +
    • Core API - PS4 - Prebuilt static libraries are no longer provided, only dynamic libraries.
    • +
    • Core API - WinStore - Fixed inconsistent naming of X64 libraries.
    • +
    +

    05/10/15 1.06.11 - Studio API patch release (build 68487)

    +

    Features:

    +
      +
    • Win - Reduced dll and exe sizes.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed input buses not being released when there are no longer any event instances routed into the bus.
    • +
    • Studio API - Fixed API capture recording the initial VCA level as 0.
    • +
    • Core API - Fix rare crash when changing the master channel group head DSP when the software format and system output don't match.
    • +
    • Core API - Fix Channel::AddDSP () and ChannelGroup::AddDSP () not correctly moving a DSP if it's already a member.
    • +
    • Core API - Fix for noise being produced when panning a surround input when the system format doesn't match the panner input format.
    • +
    • Unity - FMOD RNG seed set at initialization time.
    • +
    • Unity - Can now properly cancel the copy step of the import process.
    • +
    • Unity - Updated documentation links in menu.
    • +
    +

    Notes:

    +
      +
    • iOS - Now built with SDK 9.0 (Xcode 7.0).
    • +
    • Mac - Now built with SDK 10.11 (Xcode 7.0).
    • +
    +

    15/09/15 1.06.10 - Studio API patch release (build 67958)

    +

    Features:

    +
      +
    • Core API - Add Sound::seekData support to HTTP streams.
    • +
    • UE4 - Added blueprint functions for loading and unloading sample data.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix small reverb pop on sounds that had Channel::setPosition called on then and were muted via a parent channelgroup.
    • +
    • Core API - Fix https netstream redirects not working.
    • +
    • Core API - Fix user DSP read callback firing with no data if Channel::setPaused (false) is used after a System::playSound.
    • +
    • Studio API - Fixed Trigger Delay not being applied to sounds on parameters that trigger immediately when an event starts.
    • +
    +

    Notes:

    +
      +
    • Xbox One - Now built with August 2015 XDK.
    • +
    +

    01/09/15 1.06.09 - Studio API patch release (build 67431)

    +

    Features:

    +
      +
    • Studio API - Additional logging when banks have been exported with out of date plugin effects.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix automatic device changing support if a user called System::update from their own thread.
    • +
    • Core API - Fix crash when a channel group cannot be attached to port.
    • +
    • Core API - Fixed incorrect loop length being set for ADPCM files.
    • +
    • Core API - Win64 - Enable automatic device changing support.
    • +
    • Core API - iOS - Fixed error creating the file thread on iOS 9.0.
    • +
    • Core API - Fix distance filtering not resetting its parameters properly for channels.
    • +
    • Core API - MIDI support - Fix note keyoff when evelope is in decay phase causing note to finish early.
    • +
    • Studio API - Fix crash that could occur when auditioning an event in Studio while changing the path to waveforms.
    • +
    +

    Notes:

    +
      +
    • UE4 - Updated oculus rift plugin to version 0.11
    • +
    +

    12/08/15 1.06.08 - Studio API patch release (build 66772)

    +

    Features:

    +
      +
    • UE4 - Added FMOD init settings.
    • +
    • UE4 - Added preliminary support for 4.9 engine preview build.
    • +
    • Core API - Add Channel::setPosition support to HTTP streams.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed System::getDefaultMixMatrix crashing if passed FMOD_SPEAKERMODE_RAW:: Now returns FMOD_ERR_INVALID_PARAM .
    • +
    • Core API - Xbox One - Fixed crash if all SHAPE contexts are consumed.
    • +
    • Core API - Xbox One - Fixed XMA loops not being seamless.
    • +
    • Studio API - Fixed potential crash when disconnecting from live update while recording a profiling session.
    • +
    • Studio API - WiiU - Fixed hang on shutdown when exiting game from home menu.
    • +
    • Core API - Fix for inaccurate metering levels when the calculation spanned multiple mix blocks.
    • +
    • Core API - Fixed System::getRecordPosition race condition that could cause the returned value to be out of bounds.
    • +
    • Unity - Fixed missing functionality from C# wrapper for beat callbacks and metering.
    • +
    • Unity - Fix leaking native system objects in editor.
    • +
    • UE4 - Fixed multiple listeners.
    • +
    • FSBank - Fixed crash encoding FADPCM format in 64bit version of tool.
    • +
    +

    Notes:

    + +

    22/07/15 1.06.07 - Studio API patch release (build 66161)

    +

    Fixes:

    +
      +
    • Core API - Win - Fix audio glitches at initialization time when using the WASAPI output mode on Windows 10.
    • +
    • Core API - Fix UTF8 strings in MP3 ID3V2 tags not being null terminated properly leading to possible string overflow crash.
    • +
    • Core API - PS4 - Fixed issue with non-1024 sample aligned loop-points and AT9 compressed samples.
    • +
    • Core API - Fixed memory leak when releasing connections that have a user allocated mix matrix.
    • +
    • Core API - Added pre-wet and post-wet arguments to WetDryMix in C# wrapper.
    • +
    • Core API - Fixed crash with FADPCM streams.
    • +
    • Core API - Fixed another potential crash in PitchShifter DSP if changing channel count while running.
    • +
    • Core API - Win - Fix issues caused by WASAPI allocating the output buffer at the mixer's sample rate instead of the device's sample rate.
    • +
    • Studio API - XboxOne - Fix setting the thread affinity of the studio loading thread.
    • +
    • Studio API - Fixed case of nested events on parameters being stopped while still active. Introduced in 1.06.04.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.06.06 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Core API - XboxOne - Thread affinity can now be set as a mask of allowed cores.
    • +
    +

    08/07/15 1.06.06 - Studio API patch release (build 65638)

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed potential invalid memory access when a bank is unloaded while create instance commands are queued.
    • +
    • Studio API - Removed one frame delay between setting a parameter and having conditional timeline transitions occur.
    • +
    • Studio API - Studio gracefully handles the case of a programmer sound being returned in a streaming not-ready state when the instrument is being used with timelocked seeks.
    • +
    • Core API - Fixed rare crash when streams go virtual.
    • +
    • Core API - Fixed 3EQ DSP not waiting an extra mix block before going idle, possibly cutting off a tail.
    • +
    • Core API - Fixed potential crash in PitchShifter DSP if changing channel count or FFT size while running.
    • +
    • Core API - Fixed rare volume pop when ramping with fade points as a channel goes emulated.
    • +
    • Core API - Linux - Fixed record position not advancing with ALSA output mode.
    • +
    • Core API - Fix race condition when setting the impulse response on an active convolution reverb DSP.
    • +
    • Unity - Fix compatibility with Unity 5.1
    • +
    +

    24/06/15 1.06.05 - Studio API patch release (build 65161)

    +

    Features:

    +
      +
    • Studio API - Added FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES flag to force bank sample data to decompress into memory, saving CPU on low end platforms.
    • +
    • Studio API - Improved responsiveness when reducing steal oldest polyphony over live update.
    • +
    • Studio API - Studio profiling now includes nested instance information.
    • +
    • UE4 - Exposed beat and marker callbacks as Blueprint events.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Scatterer sounds having incorrect volume when min and max scatter distances are equal. Introduced in 1.06.00.
    • +
    • Studio API - Fixed FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES position to return the beat position, rather than the tempo marker position.
    • +
    • Studio API - Fix deadlock in studio when removing an output device that runs at a different sample rate to the system.
    • +
    • Studio API - Fix deadlock in studio when removing certain USB headsets.
    • +
    • Core API - Fixed rare case of DSP mixer not responding momentarily if output mode was switched during playback.
    • +
    • Core API - Fix declaration of DSP.getMeteringInfo in C# wrapper.
    • +
    +

    Notes:

    +
      +
    • UE4 - Now built against Unreal 4.8
    • +
    +

    09/06/15 1.06.04 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Core API - Fixed MIDI playback not correctly handling CC1 (mod wheel).
    • +
    • Studio API - Fixed livelock when scheduling nested events in a playlist that have 0 duration.
    • +
    • Studio API - Fixed events staying active when they have active but idle nested events on parameters. Events now finish once their nested parameter events go idle.
    • +
    • Studio API - Fixed Scatterer sounds not being spatialized properly. Introduced in 1.06.00.
    • +
    • FSBank - Fix bug that prevented selection of FMOD ADPCM in the tool.
    • +
    • Core API - Fix set3DPanLevel not respecting reverb mix when pan level was approaching 0.
    • +
    • Core API - Fix 2d channels not having the wet mix scaled for reverb when parent ChannelGroup volume/mute functions were called.
    • +
    • Unity - Remove warnings about banks already loaded
    • +
    • Unity - Fix Unity Editor crashing when using FMOD_LIVEUPDATE and FMOD_DEBUG pre-processor commands simultaneously.
    • +
    +

    Notes:

    +
      +
    • Studio API - Incremented bank version, requires runtime 1.06.00 or later.
    • +
    • Studio API - Latest runtime supports loading old bank versions from 1.03.00.
    • +
    • Studio API - Added a warning for events that haven't finished because they are waiting for a DSP effect to go idle.
    • +
    • Core API - WiiU - To comply with LotCheck requirements only the logging version of FMOD will link with networking APIs
    • +
    • Xbox One - Now built with May 2015 QFE 1 XDK.
    • +
    • WiiU - Now built with SDK 2.12.13.
    • +
    +

    22/05/15 1.06.03 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Reduced memory overhead of bank metadata.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed steal oldest polyphony behaviour using instance creation instead of instance start time.
    • +
    • Studio API - Fixed playlist instrument cutoff not applying a volume ramp down which could cause pops when using polyphony.
    • +
    • Core API - Fixed invalid memory access when loading an incorrectly formatted or truncated IMA ADPCM wav file using FMOD_OPENMEMORY_POINT and FMOD_CREATECOMPRESSEDSAMPLE.
    • +
    • Core API - Fix rare crash due to race condition when calling Sound::Release () just after the sound has been loaded using NON_BLOCKING.
    • +
    • Core API - PS3 - Fix deadlock in streaming when using SPU Threads.
    • +
    • Core API - Attempting to attach the Master ChannelGroup to a port will now return FMOD_ERR_INVALID_PARAM.
    • +
    • Core API - PS4 - Fix issues with recording at rates other than the driver default.
    • +
    • Core API - Fix crash in DSPFader when voice goes virtual with DSP effect added at a position lower than the fader (ie post fader), and the effect is freed.
    • +
    • UE4 Integration - Fixed incorrect listener orientation.
    • +
    +

    Notes:

    +
      +
    • Studio API - Changed envelope follower DSP sidechain parameter to ignore invalid values.
    • +
    • Xbox One - Now built with April 2015 XDK.
    • +
    • 7.1 to 5.1 downmix now lowers the volumes of the back speakers' contribution to the surround speakers by 1.5db to lessen volume bulge in the middle.
    • +
    +

    06/05/15 1.06.02 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed transition timeline modules not crossfading their volume properly when overlapping the lead out region.
    • +
    • Studio API - Fixed C# wrapper not linking against 64bit dll when WIN64 is defined.
    • +
    • Studio API - Fixed events with sidechains never naturally stopping.
    • +
    • Studio API - Fixed runtime crash caused by a compiler bug for customers compiling from source using VS2015 CTP.
    • +
    • Core API - WiiU - Fixed incorrect pitch for DRC if System is running a rate other than 48KHz or 32KHz.
    • +
    • Core API - PS4 - Fix small memory leak when closing output ports.
    • +
    • Core API - Fixed documentation regarding FMOD_DSP_COMPRESSOR_USESIDECHAIN and FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN.
    • +
    • +

      Core API - WinStore - Fix System::Init () freezing when called from the UI thread.

      +
    • +
    • +

      UE4 Integration - Fixed bad editor performance when selecting audio components.

      +
    • +
    • +

      UE4 Integration - Fixed several Android deployment issues.

      +
    • +
    • +

      Unity Integration - Fix compilation issues on iOS when using IL2CPP.

      +
    • +
    • Unity Integration - Logging libs for OSX are now included. Defining FMOD_DEBUG will now route FMOD internal logging to the Unity console in the OSX editor and standalone OSX builds.
    • +
    • Unity Integration - Make members of the REVERB_PROPERTIES structure public.
    • +
    • Unity Integration - Fix compile error on XBox One when defining FMOD_DEBUG.
    • +
    +

    Notes:

    +
      +
    • UE4 Integration - Merged documentation with main API documentation.
    • +
    +

    17/04/15 1.06.01 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Core API - Fixed Channel userdata not being reset to 0 each playSound.
    • +
    • Core API - Fixed the C# wrapper for DSP.AddInput and DSP.disconnectFrom.
    • +
    • Core API - PS4 - Fixed playback issue with AT9 compressed samples that have a non-zero loop start point.
    • +
    • Core API - Fix rare issues with generator DSPs or compressed channels getting stuck looping the same fragment of audio.
    • +
    • +

      Core API - PS3 - Fix rare crash if sound stops on a channelgroup with a matrix set in it.

      +
    • +
    • +

      Unity Integration - Fix banks not being loaded on standalone OSX builds.

      +
    • +
    • Unity Integration - Logging libs for windows are now included. Defining FMOD_DEBUG will now route FMOD internal logging to the Unity console in the Windows editor and standalone Windows builds.
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 2.508.051.
    • +
    +

    10/04/15 1.06.00 - Studio API minor release

    +

    Important:

    +
      +
    • Studio API - Scatterer sounds now steal the oldest spawned sound if the polyphony limit has been reached when spawning a new sound.
    • +
    +

    Features:

    +
      +
    • Added new compression format FADPCM as a higher quality, lower CPU cost drop in replacement for standard IMA ADPCM. This custom developed format is our new recommendation for mobile, PS Vita and Wii U delivered exclusively via FSB.
    • +
    • Core API - Improved CPU performance of convolution reverb by 30%
    • +
    • Core API - Android - Improved latency by automatically resampling to the native rate to enable the fast mixer.
    • +
    • Core API - PS Vita - Removed requirement to use 48KHz mixing, default is now 24KHz for better performance.
    • +
    • Core API - Xbox One - Optimized performance for looping compressed XMA.
    • +
    • Core API - Xbox One - Added support for greater than stereo XMA streams.
    • +
    • Core API - Xbox One - Reduced output latency by 20ms.
    • +
    • Studio API - Significantly reduced memory usage.
    • +
    • Studio API - Added Studio bank loading thread.
    • +
    • Studio API - Added Studio::Bank::getUserData and Studio::Bank::setUserData.
    • +
    • Studio API - Added FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD callback.
    • +
    • Studio API - Support for transition timeline lead-in and lead-out.
    • +
    • Studio API - Added support for setting Studio async update period via FMOD_STUDIO_ADVANCEDSETTINGS.
    • +
    • Core API - PS4 - Added support for High Quality Recording API by default.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed parameter modulation being unable to go below the value set from the public API.
    • +
    • Studio API - Fixed effect bypass setting not being saved to banks.
    • +
    +

    Notes:

    + +

    02/04/15 1.05.15 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Win - Fixed occasional deadlock when removing audio devices.
    • +
    • Core API - Fixed stream crackling if initialseekposition was used immediately followed by Channel::setPosition with a close position value.
    • +
    • Core API - PS3 - Fixed six or eight channels vorbis streams crashing the SPU.
    • +
    • Core API - Xbox One - Fixed rare hang when decoding small XMA compressed audio.
    • +
    • Core API - Fixed DSP::getInfo not returning configwidth and confighheight information for VST plugins.
    • +
    • Core API - Fixed rare crash calling DSP::reset on the fader DSP, after ChannelGroup::setPan/setMixLevelsOutput/setMixMatrix. This could occur when a Studio event is started or stopped.
    • +
    • Core API - PS4 - Fixed issue with non-1024 sample aligned loop-points and AT9 compressed samples.
    • +
    • Core API - Fixed DSP effect being un-removable with FMOD_ERR_DSP_INUSE after being added to a channel and the channel stops (becoming invalid).
    • +
    +

    Notes:

    +
      +
    • PS3 - Now built with SDK 470.001.
    • +
    +

    16/03/15 1.05.14 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Fixed some cases where channel group audibility was not refreshed when fade points are active. This could happen when a Studio event instance is paused and unpaused.
    • +
    • Core API - PS3 - Fixed FMOD_PS3_INITFLAGS overlapping FMOD_INITFLAGS causing certain FMOD_INITFLAGS to affect PS3 specific bit-stream encoding options.
    • +
    • Core API - PS3 - Fixed a rare hang when releasing a DSP that exposes a FMOD_DSP_PARAMETER_OVERALLGAIN parameter.
    • +
    • Core API - PS3 - Fixed opening URL failing with network streams.
    • +
    • Core API - Xbox One - Fixed recording API, you can now specify any sample rate to record at. Native rate of 48KHz is still recommended for lowest latency.
    • +
    • Studio API - Fixed virtualized event failing to become real if the number of playing instances drops back below max polyphony.
    • +
    +

    Notes:

    +
      +
    • Core API - PS3 - Deprecated FMOD_PS3_EXTRADRIVERDATA::initflags. Due to a bug it was being ignored. Pass the flags to System::init instead.
    • +
    +

    25/02/15 1.05.13 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Studio::System::getBank now accepts bank filenames as input.
    • +
    • Core API - Added 64bit versions of fsbank and fsbankcl tools.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed case of nested event not being destroyed even after it had finished producing sound.
    • +
    • Studio API - Fixed crash when changing output bus on an event when live update is connected.
    • +
    • Studio API - Fixed deadlock when calling Studio commands when mixer is suspended.
    • +
    • Studio API - System::release now ensures release even if flushing pending commands causes an error.
    • +
    • Studio API - The name of the string bank is now added to the string bank.
    • +
    • Studio API - Event instance restart now flushes parameter values before timeline rescheduling occurs. This avoids a potential issue for transitions with parameter conditions, where they may not have used the most recent parameter value.
    • +
    • Core API - Fix unnecessary querying of recording driver capabilities during recording.
    • +
    • Core API - PS4 - Remove AT9 workaround added in 1.05.12. Fix AT9 compressed codecs with finite loop counts.
    • +
    • Core API - PS4 - Removed stalls when an AT9 compressed sample channel is started.
    • +
    • Core API - PS4 - Fix crash in recording.
    • +
    • Core API - Fix multiple listener support not working properly.
    • +
    • Core API - Fix user file crash if using asyncfileread callback, and file open and close happens without any read occuring.
    • +
    • Core API - Fix rare crash with Sound::release if a nonblocking setPosition is in process and it is an FSB sound.
    • +
    • Core API - Fix thread safety issue loading multiple mod/s3m/xm/it files simultaneously.
    • +
    • Core API - Fix rare crash if FMOD_ACCURATETIME was used with .mp3 file followed by mp3 encoded FSB file after a time, both using FMOD_CREATECOMPRESSEDSAMPLE.
    • +
    • Core API - PS3 - Fixed custom DSP that use the plugindata member.
    • +
    +

    Notes:

    +
      +
    • Studio API - Updated programmer_sound example.
    • +
    • Core API - Added plug-in inspector example.
    • +
    • Xbox One - Now built with February 2015 XDK.
    • +
    +

    06/02/15 1.05.12 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Improved memory use for events with repeated nested events.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed crash when stopping multiple one-shot events on a bus.
    • +
    • Studio API - Fixed nested event polyphony from cutting off immediately, causing pops.
    • +
    • Core API - Fixed rare crash in mixer if DSP::reset is called on a FMOD_DSP_TYPE_FADER dsp (ie ChannelControl head DSP) after DSP::setPan/setMixLevelsOutput/setMixMatrix.
    • +
    • Core API - Fixed race condition setting resampling speed while resampling is occurring.
    • +
    • Core API - Fixed crash loading mod/s3m/xm/it file using FMOD_NONBLOCKING and FMOD_CREATECOMPRESSEDSAMPLE and then immediately calling SoundI::release
    • +
    • Core API - PS4 - Work around AT9 codec issues that have appeared when using SDK 2.000
    • +
    +

    22/01/15 1.05.11 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Xbox One - Added access to 7th CPU core.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed crash setting Studio event callback to null as it is being invoked.
    • +
    • Studio API - Fixed crash in hashmap reallocation when running out of memory.
    • +
    • Studio API - Fixed Studio::loadBankCustom from freeing its custom userdata before the close callback for failed banks.
    • +
    • Studio API - If FMOD_OUTTPUTTYPE_WAVWRITER_NRT or NOSOUND_NRT is used as an output mode, Studio runtime will now internally force FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE to avoid a hang.
    • +
    • Core API - Fix pop noise when 3d sound goes virtual then becomes real again, only if ChannelControl::addDSP was used.
    • +
    +

    Notes:

    + +

    12/01/15 1.05.10 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Xbox One - Added support for recording from microphones.
    • +
    +

    Fixes:

    +
      +
    • Core API - PS3 - Fix deadlock in streaming sounds when linking against the SPU thread libraries.
    • +
    • Core API - Windows - Fixed crash when initializing a second ASIO system.
    • +
    • Core API - Fix ChannelControl::getDSPIndex not returning an error if the dsp did not belong in the Channel or ChannelGroup
    • +
    • Core API - PS3 - Fix linker error when using libfmod_sputhreads.a
    • +
    • Core API - Fixed AT9 and ACP XMA incorrectly allowing FMOD_OPENMEMORY_POINT and FMOD_CREATESAMPLE.
    • +
    • Core API - Fixed reverb wetlevel from ChannelControl::setReverbProperties being reset after a voice goes virtual then returns as real.
    • +
    • Core API - Fixed removing/adding DSPs in a ChannelControl chain copying setDelay commands incorrectly and making channels pause when they shouldnt
    • +
    • Studio API - Reinstated support for embedded loop points in source sounds, and fixed issue with playback of timelocked sounds.
    • +
    +

    12/12/14 1.05.09 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed looping event cursor position from getting slightly out of sync with scheduled position when running at 44.1kHz.
    • +
    • Studio API - Fixed playlist steal-oldest polyphony returning errors when used with extremely small durations.
    • +
    • Studio API - Fixed silence after unpausing an event instance. Introduced in 1.05.08.
    • +
    • Core API - Fixed crash after setting the input format of a Return DSP to stereo, when the mixer output format is mono.
    • +
    • Core API - Windows - Fix crash calling FMOD_ASYNCREADINFO::done function pointer when default calling convention is not cdecl.
    • +
    • Core API - Fixed FMOD_SPEAKERMODE_RAW panning incorrectly during an up or down mix.
    • +
    • Core API - Fix crash when a Channel::setPosition is called on a non-blocking stream that is going virtual.
    • +
    • Core API - Fixed potential audio corruption when playing sounds with more than 8 channels.
    • +
    • Core API - Fixed emulated channels not updating their parent when when Channel::setChannelGroup is called.
    • +
    • Core API - Fixed channels having their volume reset when changing channel group parents.
    • +
    • Core API - Fixed channels not going virtual when being paused if no other volume changes were occurring.
    • +
    • Core API - Fixed FMOD_INIT_PROFILE_ENABLE enabling all DSP metering regardless of whether FMOD_INIT_PROFILE_METER_ALL was used.
    • +
    • Core API - Added volume ramp up for 3d channels coming back from virtual to real.
    • +
    • Core API - Fixed rare crash if the master channelgroup's DSP Head unit was changed then released.
    • +
    • Core API - PS3 - Fix loudness meter not functioning.
    • +
    • Core API - PS3 - Re-enabled playDSP.
    • +
    +

    Notes:

    +
      +
    • Core API - Xbox One - Added check to ensure DSP buffer size is specified as the default 512 samples to avoid performance degradation of XMA decoding.
    • +
    • Core API - Windows - Changed default ASIO speaker mapping to 1:1 for outputs with more than 8 channels.
    • +
    +

    28/11/14 1.05.08 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed pops that could occur when stopping events that have instruments scheduled to stop already.
    • +
    • Studio API - Fixed pop that could occur when playing an sound that has an AHDSR fade in.
    • +
    • Studio API - Fixed indeterminism when exporting string banks that have multiple string entries with inconsistent case.
    • +
    • Core API - Android - Improved compatibility with Java 1.6.
    • +
    • Core API - iOS - Added armv7s back to the universal binary.
    • +
    • Core API - Windows - Fix System::getRecordDriverInfo returning incorrect device names. Introduced in 1.05.00.
    • +
    • Core API - Fix FMOD_SPEAKERMODE_RAW creating silence if playing more than 1 sound, introduced in 1.04.15.
    • +
    • Core API - Fix CELT and Vorbis FSB being allowed with FMOD_OPENMEMORY_POINT and FMOD_CREATESAMPLE when it should in fact return FMOD_ERR_MEMORY_CANTPOINT
    • +
    +

    21/11/14 1.05.07 - Studio API patch release

    +

    Important:

    +
      +
    • Studio API - Fixed scheduling for looping nested events which are cut off from the parent event. Previously the looping nested event would attempt to play to end but would cut off halfway through with a noticeable click. The nested event now cuts off immediately with a fade out ramp.
    • +
    +

    Features:

    +
      +
    • Core API - Android - Added ARM64 support.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix ChannelGroup::setMixLevelsOutput causing corrupted audio when the channel group has an input with a channel count greater than the system channel count.
    • +
    • Core API - Fixed ChannelControl::setMute not refreshing channel audibility.
    • +
    • Core API - Windows - Fix calls to DSP::getInfo () from within a custom DSP deadlocking the system during audio device change.
    • +
    • Core API - Fixed some DSP configurations with an idle first input causing signal to be downmixed to mono.
    • +
    • Core API - Fix invalid characters being printed in log messages when open certain types of media files.
    • +
    • Studio API - Fixed Studio::Bank::getEventCount and Studio::Bank::getEventList incorrectly enumerating nested events.
    • +
    • Studio API - Fixed Studio::Bus::stopAllEvents not working when snapshots or nested events are playing.
    • +
    • Studio API - Fixed "state->mInstanceCount > 0" assert that could occur when instruments were stopped repeated times.
    • +
    +

    Notes:

    +
      +
    • PS Vita - Now built with SDK 3.300.
    • +
    • WiiU - Now built with SDK 2.11.13.
    • +
    +

    13/11/14 1.05.06 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Windows - Add 64bit VST support
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed thread safety issue when accessing sound tables as new banks with sound tables are being added.
    • +
    • Studio API - Fixed duplicate streaming sounds keeping playing when unloading the memory bank that it is streaming from. Now the stream will stop if the memory bank is unloaded.
    • +
    • Core API - Fixed sound going mono in certain DSP configurations. Introduced 1.05.00.
    • +
    • Core API - Fixed rare timing issue with fade points that caused the fader DSP to generate invalid floats.
    • +
    • Core API - Android - Fixed crashes due to insufficient stack size when running ART instead of Dalvik.
    • +
    • Core API - Windows - Fixed potential crash if using multiple FMOD::System with ASIO output mode. This is not supported by ASIO and is now disabled.
    • +
    • Core API - Linux - Fixed PulseAudio device enumeration not placing the default device at position 0.
    • +
    +

    Notes:

    +
      +
    • Xbox One - Now built with November 2014 XDK.
    • +
    • Android - Now built with NDK r10c.
    • +
    • iOS - Now built with SDK 8.1 (Xcode 6.1).
    • +
    • Mac - Now built with SDK 10.10 (Xcode 6.1).
    • +
    • PS4 - Now built with SDK 2.000.071
    • +
    +

    30/10/14 1.05.05 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Added convolution reverb example.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed various errors after deleting objects via Live Update
    • +
    • Studio API - Fixed possible crash using shared waveforms across multiple banks after some of the duplicate banks have been unloaded.
    • +
    • Studio API - Fixed duplicate events becoming invalidated when the first bank that contains them is unloaded.
    • +
    • Studio API - Fixed bug in load_banks example.
    • +
    • Studio API - Fixed crash when calling Studio::Bus::stopAllEvents while playing event instances that have had release called.
    • +
    • Core API - Fixed memory leaks.
    • +
    +

    22/10/14 1.05.04 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed transition markers failing at the start of the timeline.
    • +
    • Core API - PS3/X360/Wii-U - Fix vorbis seek getting stuck in an infinite loop.
    • +
    • Core API - Fixed incorrect behaviour when changing the channel mode from 3D to 2D.
    • +
    • FSBank - Fixed setting the cache directory and printing log messages.
    • +
    +

    Notes:

    +
      +
    • Studio API - Timeline transitions can be chained together with no delay.
    • +
    +

    13/10/14 1.05.03 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed event fadeout cutting off DSP effects with long tails.
    • +
    • Studio API - Fixed crash when accessing events with a lifetime across duplicate banks. Note that when unloading the initial bank for an event, that event will be invalidated.
    • +
    • Core API - Fixed for enum mismatches in C# wrapper.
    • +
    • Core API - Fixed FMOD_DSP_LOWPASS click when being reused, ie stopping then starting a new sound.
    • +
    • Core API - Fixed rare hang during Sound::release for sounds created as FMOD_NONBLOCKING.
    • +
    • Core API - Fixed corrupted playback of MOD/S3M/XM/IT/MID sequenced formats. Introduced 1.04.05
    • +
    • Core API - Fixed ChannelGroup::setReverbProperties on the master channel group causing a stack overflow. This is now disallowed as it creates a circular dependency.
    • +
    • Core API - Mac - Replaced error condition if initializing FMOD before activating the AudioSession with a TTY warning.
    • +
    • Core API - Android - Fixed Sound::readData going forever when reading AAC audio.
    • +
    • Core API - Fix the pancallbacks member of the FMOD_DSP_STATE_SYSTEMCALLBACKS structure passed into custom DSP callbacks being NULL.
    • +
    • Core API - Fix crash in mixer if user used System::playDSP and made the dsp inactive with DSP::setByPass or DSP::setActive
    • +
    +

    01/10/14 1.05.02 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed a bug where event sounds could have incorrectly synchronized playback.
    • +
    • Core API - Fixed compiler warning in public header.
    • +
    • Studio API - Disabled embedded loop points on all sounds played by the Studio API to fix incorrect playback of timelocked sounds.
    • +
    • Studio API - Snapshot volumes are now interpolated in terms of linear gain.
    • +
    • Core API - Fixed 3EQ DSP not clearing out internal state when DSP::reset is called, potentially causing audible artifacts when reused.
    • +
    • Core API - Fixed resampler inaccuracies when reading partial looping data.
    • +
    • Core API - Mac - CoreAudio output mode will now allow any DSP block size and will correctly use the desired buffer count.
    • +
    • Core API - Mac - CoreAudio now correctly exposes its output AudioUnit via the System::getOutputHandle function.
    • +
    • Core API - PS3 - Fixed resampler strict aliasing bug on PPU release builds.
    • +
    • Core API - PS3 - Fixed playDSP crash.
    • +
    • Core API - Fixed convolution reverb input downmix
    • +
    • Core API - Greatly increase speed of mixing multichannel source data.
    • +
    +

    Notes:

    +
      +
    • Studio API - Loudness meters saved in banks will now be bypassed to improve performance when profiler isn't attached.
    • +
    • Xbox One - Now built with September 2014 QFE 1 XDK.
    • +
    +

    22/09/14 1.05.01 - Studio API patch release

    +

    Important:

    +
      +
    • Fixed possible large memory blowout if certain DSP pools were exceeded.
    • +
    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Implemented Studio::Bus::stopAllEvents.
    • +
    • Studio API - Fixed bus going silent when output format is stereo and system speaker mode is 5.1.
    • +
    • Studio API - Fixed Studio::System::getAdvancedSettings clearing FMOD_STUDIO_ADVANCEDSETTINGS.cbSize and not returning default values.
    • +
    • Studio API - Fixed a bug where looping or sustaining events could incorrectly be treated as oneshot.
    • +
    • Studio API - Fixed a bug where event sounds could have incorrectly synchronized playback.
    • +
    • Core API - Fix bug with custom 3D rolloff curve points getting corrupted.
    • +
    • Core API - Fixed incorrect documentation for FMOD_CHANNELCONTROL_CALLBACK.
    • +
    • Core API - Fix sub-mix channel count being incorrect when playing multiple sounds with different channel counts together. Introduced in 1.04
    • +
    • Core API - Fix a channel DSP head's ChannelFormat not being reset if a sound with a channel mask was played on it previously
    • +
    +

    Notes:

    +
      +
    • iOS - Now built with SDK 8.0 (Xcode 6.0).
    • +
    • Mac - Now built with SDK 10.9 (Xcode 6.0).
    • +
    +

    09/09/14 1.05.00 - Studio API minor release

    +

    Important:

    + +

    Features:

    +
      +
    • Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED and FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED callback types.
    • +
    • Studio API - Added Studio::Bank::getStringCount and Studio::Bank::getStringInfo.
    • +
    • Core API - Added FMOD::Debug_Initialize to configure the destination and level of debug logging when using the logging version of FMOD. This is a more flexible replacement for the previous FMOD::Debug_SetLevel API.
    • +
    • Core API - Android - Added support for playing AAC files (requires Android 4.2).
    • +
    • Core API - Android - Reduced latency for devices that support FastMixer, see "Basic Information" section of the docs CHM for details.
    • +
    • Core API - Added DSP::setWetDryMix so any effect can have generic wet/dry signal level control.
    • +
    • Core API - Added 3D ChannelGroup support. A ChannelGroup is a 'group bus' and it can now be positioned in 3d space, affecting the mix for buses and channels below it. 3D Cones, geometry etc all work. Use ChannelGroup::setMode (FMOD_3D) to enable a 3D ChannelGroup.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed transitions to the end of a loop region failing to escape the loop.
    • +
    • Studio API - Fixed sends inside events occasionally having a brief period of full volume when the event is started.
    • +
    • Core API - Fix for crash when creating multiple Systems with profiling enabled.
    • +
    +

    Notes:

    +
      +
    • Studio API - Transition regions no longer include the end of their range.
    • +
    • Studio API - FMOD_ERR_EVENT_WONT_STOP has been removed.
    • +
    • Studio API - Studio::EventInstance::start now resets all DSPs inside the event to prevent incorrect ramping. This relies on FMOD_DSP_RESET_CALLBACK leaving public parameters unchanged.
    • +
    • Studio API - Studio::System::getEvent's unimplemented mode parameter has been removed, along with FMOD_STUDIO_LOADING_MODE.
    • +
    • Studio API - FMOD_STUDIO_PLAYBACK_IDLE and FMOD_STUDIO_EVENT_CALLBACK_IDLE have been removed.
    • +
    • Studio API - Removed deprecated function Studio::EventInstance::createSubEvent.
    • +
    • Core API - Changed FMOD_FILE_ASYNCCANCEL_CALLBACK to take FMOD_ASYNCREADINFO structure rather than void *handle.
    • +
    • Core API - The FMOD_DSP_RESET_CALLBACK documentation has been updated to make it clear that it should leave public parameters unchanged.
    • +
    • Core API - PS4 - Thread affinity can now be set as a mask of allowed cores.
    • +
    • Core API - iOS / Mac - Reduced default block size to 512 for lower latency.
    • +
    • Core API - Android - Renamed Java interface from FMODAudioDevice to simply FMOD, i.e. org.fmod.FMOD.init().
    • +
    • Core API - Channel::setMode moved to ChannelControl::setMode so that ChannelGroups can now also have 2D/3D mode bits set.
    • +
    +

    09/09/14 1.04.08 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed crash when a second system is created but never initialized.
    • +
    • Studio API - Fixed a few ordering issues that can cause binary changes in identical banks.
    • +
    • Core API - Fix for pop due to unwanted volume ramping after calling DSP::reset on fader DSP. This can happen when a Studio event instance is stopped and then restarted. Caused by timing issue with ChannelControl::setVolumeRamp.
    • +
    • Core API - Fix crash if FMOD_DSP_TYPE_MIXER or DSP with no read/process function is passed to System::playDSP.
    • +
    • Core API - iOS - Fixed MP2 files being intercepted by AudioQueue causing an internal error.
    • +
    • Core API - XboxOne - Fixed network connect not resolving host names and not honoring the requested time out.
    • +
    • Core API - Fix rare crash if calling Channel::stop () which a non blocking Channel::setPosition is happening with a stream.
    • +
    • Core API - Winphone and Windows Store Apps - fixed detection of socket errors.
    • +
    • Core API - If a user DSP is added after the master ChannelGroup's fader that changes the output channel count to something other than the software mixer's channel count, stuttering could occur. Fixed.
    • +
    • Studio API - Windows - Fixed Studio API functions deadlocking when in asynchronous mode and a sound device is removed.
    • +
    • Core API - PS3 - Fixed some DSP parameter sets being ignored (overwritten by SPU DMA)
    • +
    • Core API - Fix System::playDSP not working with custom DSP effects that use the read callback
    • +
    • Core API - Added Memory.Initialize function to the C# wrapper.
    • +
    • Core API - Fixed incorrect truncation of FMOD_CREATECOMPRESSEDSAMPLE sounds created from MP3 or MP2 files (does not affect FSB).
    • +
    • Core API - Fixed FMOD_ACCURATETIME for FMOD_CREATECOMPRESSEDSAMPLE sounds created from MP3 or MP2 files (does not affect FSB).
    • +
    +

    Notes:

    +
      +
    • Core API - The master ChannelGroup's fader/head now is not responsible for up or downmixing the signal. It is now done beyond the dsp tree, internally within FMOD. The Master ChannelGroup's Fader can still be forced to upmix if required with DSP::setChannelFormat.
    • +
    +

    20/08/14 1.04.07 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed an internal error when instantiating a snapshot that exposes intensity as a parameter.
    • +
    • Core API - PS3 - Fix audio dropout/corruption when using FMOD_SPEAKERMODE_STEREO. Usually when sidechain is involved.
    • +
    • Core API - iOS - Fixed System::recordStart returning FMOD_ERR_RECORD.
    • +
    • Core API - Fixed possible click noise on end of sound if using FMOD_CREATECOMPRESSEDSAPMLE or PCM on PS3.
    • +
    +

    Notes:

    +
      +
    • Xbox One - Now built with July 2014 QFE1 XDK.
    • +
    • PS4 - Now built with SDK 1.750.061
    • +
    +

    06/08/14 1.04.06 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Added FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES.subsoundIndex to support non-blocking loading of FSB subsounds.
    • +
    • Core API - Windows - FMOD now handles sound card removal and insertion without any programmer intervention. If System::setCallback is called with FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED bit set, this feature is disabled.
    • +
    • Core API - Windows - System::setOutput can be called post-init now, allowing dynamic switching between any output mode at runtime.
    • +
    • Core API - iOS - Improved IMA ADPCM decoding performance especially for arm64 variant.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed bug where channels with post-fader DSP units would not play after transitioning from virtual to real.
    • +
    • Core API - Fix pops with resampler on loops.
    • +
    • Core API - Fix playDSP returning FMOD_ERR_DSP_SILENCE or FMOD_ERR_DSP_DONTPROCESS if the dsp played returned that during query mode.
    • +
    • Core API - PS3 - Fix ITEcho, SFXReverb, FFT DSP effects rarely getting parameters reset to old values.
    • +
    • Core API - Xbox One - Fixed audio corruption when playing mono streams from an XMA FSB that has both mono and stereo subsounds.
    • +
    • Core API - PS3 - Moved vorbis decode work during stream setPosition to the SPU.
    • +
    • Core API - Windows - Fix System::setSoftwareFormat with differing samplerate and speaker mode causing static.
    • +
    • FSBank API - Fixed cache being incorrectly reused when replacing source files of identical name with a different file that has an old time stamp.
    • +
    +

    Notes:

    +
      +
    • PS3 - Now built with SDK 460.001
    • +
    +

    25/07/14 1.04.05 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fix for pop when stopping events with FMOD_STUDIO_STOP_ALLOWFADEOUT.
    • +
    • Studio API - Fix incorrect scheduling when Multi Sounds contain nested events with timeline transitions.
    • +
    • Studio API - Fix for nested event modules not being cleaned up when used in a playlist module.
    • +
    • Studio API - Fix for events failing to stop when they have instruments on parameters that have Hold enabled.
    • +
    • Core API - Fix combined volume ramp and fade point ramp having an incorrect volume.
    • +
    • Core API - Fix for pop when setting zero volume with vol0virtual enabled.
    • +
    • Core API - Fix for pop when scheduling fade point ramps in the past.
    • +
    • Core API - Fix for pop on a return bus when all incoming sends go idle.
    • +
    • Core API - Fix for faders delaying going idle for a mix when volume is set to zero without ramping.
    • +
    • Core API - Fixed FSB forwards compatibility issue causing load failures.
    • +
    • Core API - XboxOne - Fixed ACP race condition when shutting down / initializing System causing XMA channels to not play.
    • +
    • Core API - XboxOne - Fixed XMA compressed sample channel leak that would eventually result in all sounds playing emulated (silent).
    • +
    • Core API - WinPhone and WSA - Fixed network connection not respecting system timeout value.
    • +
    • Core API - PS3 - Fix IMA ADPCM support for ps3 not working.
    • +
    • Core API - iOS - Fixed potential duplicate symbol error on link.
    • +
    +

    Notes:

    +
      +
    • Xbox One - Now built with July 2014 XDK.
    • +
    • iOS - Now built with SDK 7.1 (Xcode 5.1.1).
    • +
    +

    11/07/14 1.04.04 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed a bug where quantized timeline transitions could fail to play the audio at the destination marker.
    • +
    • Core API - Fix channel stealing not calling end callback in playDSP case.
    • +
    • Core API - Fix rare crash if System::playDSP is called, and it steals a channel with a sound on it, and System::update wasnt called in between.
    • +
    • Core API - Mac, iOS and Android - Improved network error reporting.
    • +
    +

    08/07/14 1.04.03 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Added FMOD_ADVANCEDSETTINGS.randomSeed, which specifies a seed value that FMOD will use to initialize its internal random number generators.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Changed isValid() functions in C# wrapper to call through to C++.
    • +
    • Studio API - Fixed Studio::System::loadBankCustom file callbacks being ignored when System::setFileSystem is using async read functions.
    • +
    • Studio API - Fixed incorrect playback when starting an event instance immediately after creating it.
    • +
    • Studio API - Fixed some snapshot types causing silence on busses if loading files older than those created with FMOD Studio 1.04.02.
    • +
    • Core API - Fixed incorrect FMOD_ASYNCREADINFO.offset value passed to FMOD_FILE_ASYNCREAD_CALLBACK when file buffering is disabled.
    • +
    • Core API - Windows - Fixed WASAPI failing to initialize on certain old drivers.
    • +
    • Core API - Fix FMOD_SPEAKERMODE_RAW being broken.
    • +
    • Core API - Fixed System::set3DRolloffCallback not working.
    • +
    • Core API - Fixed Sound::set3DCustomRolloff not working.
    • +
    • Core API - Fix Geometry API not running in its own thread like it was in FMOD Ex.
    • +
    • Core API - Fixed incorrect DSP clock when re-routing a ChannelGroup immediately after adding DSPs to it.
    • +
    • Profiler - Fixed nodes appearing to overlap each other if multiple outputs were involved.
    • +
    • Core API - PS4 - Fixed unnecessary file reads when playing an AT9 stream.
    • +
    +

    27/06/14 1.04.02 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed incorrect virtualization of events that have more than one 3D position dependent effect.
    • +
    • Studio API - Studio::EventDescription::getInstanceList, Studio::Bank::getEventList, Studio::Bank::getMixerStripList and Studio::System::getBankList now accept a capacity of 0.
    • +
    • Core API - Fixed a race condition that could lead to DSP graph changes not being handled correctly.
    • +
    • Core API - Linux - Fixed "spurious thread death event" messages appearing when attached with GDB.
    • +
    • Core API - Linux - Fixed internal PulseAudio assert if System::getNumDrivers or System::getDriverInfo is used before System::init.
    • +
    • Core API - Linux - Fixed ALSA not using correct default driver in some cases.
    • +
    • Core API - Send levels set before connecting the Return DSP are now applied immediately rather than fading in over a short time.
    • +
    +

    19/06/14 1.04.01 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed playlist module upmixing to system speakermode when playing multiple overlapping sounds.
    • +
    • Core API - Fix streams opened with FMOD_NONBLOCKING from playing at the incorrect position if they go virtual shortly after setPosition is called.
    • +
    • Core API - Fix EOF detection in file system causing rare extra file read past end of file.
    • +
    • Core API - Fix some FMOD_CREATECOMPRESSEDSOUND based samples finishing early if they were playing back at a low sample rate.
    • +
    • Core API - Fix a bug where DSP nodes could get stuck in an inactive state after setting pitch to 0.
    • +
    +

    11/06/14 1.04.00 - Studio API minor release

    +

    Important:

    +
      +
    • Added PS3 platform support.
    • +
    • Added WiiU platform support using SDK 2.10.04.
    • +
    • Added Linux platform support.
    • +
    • Added Windows Phone 8.1 platform support.
    • +
    • FMOD_HARDWARE and FMOD_SOFTWARE flags have been removed. All voices are software mixed in FMOD Studio.
    • +
    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed nested events never ending if they have a parameter with non-zero seek speed.
    • +
    • Studio API - Fixed AHDSR modulation on snapshot intensity
    • +
    • Core API - Fixed incorrect fader interpolation when reparenting channels with propagate clocks.
    • +
    • Core API - Win - Fixed several issues with ASIO playback.
    • +
    • Core API - Android - Fixed audio corruption on devices without NEON support.
    • +
    • Core API - Fixed FMOD_CREATESOUNDEXINFO.length being handled incorrectly for memory sounds. This length represents the amount of data to access starting at the specified fileoffset.
    • +
    • Core API - Fix truncated FSB causing zero length subsounds, now returns FMOD_ERR_FILE_BAD
    • +
    +

    Notes:

    +
      +
    • Core API - Renamed C# wrapper SYSTEM_CALLBACKTYPE to SYSTEM_CALLBACK_TYPE so it matches the C++ API.
    • +
    • Core API - Renamed MinGW/Cygwin import library to libfmod.a
    • +
    • Studio API - Deprecated C# wrapper functions Studio.Factory.System_Create and Studio.System.init have been removed. Use Studio.System.create and Studio.System.initialize instead.
    • +
    • Studio API - Deprecated function Studio::EventInstance::getLoadingState has been removed. Use Studio::EventDescription::getSampleLoadingState instead.
    • +
    • Studio API - FMOD_STUDIO_EVENT_CALLBACK now takes an FMOD_STUDIO_EVENTINSTANCE* parameter.
    • +
    • Xbox One - Now built with June 2014 XDK.
    • +
    +

    29/05/14 1.03.09 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed truncation error when loading sample data from bank opened with Studio::System::loadBankMemory.
    • +
    • Studio API - Fixed numerical error when blending multiple snapshots with zero intensity.
    • +
    • Studio API - Fixed incorrect pitch when an instrument has a non-zero base pitch combined with pitch automation or modulation.
    • +
    • Core API - Xbox One - Fixed potential seeking inaccuracies with XMA sounds.
    • +
    • Core API - Fix occasional audio pops when starting a channel or channel group.
    • +
    • Core API - Fix crash when running out of memory during channel group creation.
    • +
    • Core API - Fixed the C# wrapper for Sound.setDefaults and Sound.getDefaults.
    • +
    +

    Notes:

    + +

    21/05/14 1.03.08 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Add FMOD_INIT_ASYNCREAD_FAST and FMOD_ASYNCREADINFO.done method, to improve performance of asyncread callback significantly. Instead of setting 'result', call 'done' function pointer instead.
    • +
    • Core API - Multiple channel groups can now be attached to the same output port.
    • +
    • Core API - PS4 - Minor performance improvements in AT9 decoding using new SDK features.
    • +
    +

    Fixes:

    +
      +
    • Core API - Windows Store - Fixed networking issues.
    • +
    • Core API - Windows Store - Fixed System::getRecordDriverInfo () returning incorrect number of channels.
    • +
    • Core API - Fix System::setFileSystem asyncread callback not setting priority values properly.
    • +
    • Core API - Releasing a channel group attached to an auxiliary output port now cleans up resources correctly.
    • +
    • Core API - Channel groups attached to an auxiliary output port can now be added as children of other channel groups.
    • +
    • Core API - Fix DSPConnection::setMix () not being applied properly.
    • +
    • Core API - PS Vita - Fixed potential crash during System::init if any output related pre-init APIs are used, such as System::getNumDrivers.
    • +
    • Core API - PS Vita - Fixed crash if an attempt is made to load AT9 FSBs as a compressed sample, for PS Vita this is a streaming only format.
    • +
    • Core API - Xbox One - Small improvement to XMA performance.
    • +
    • Core API - Fixed the C# wrapper for System.playDSP.
    • +
    • Core API - Fixed potential crash on ARM platforms when loading an FSB.
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 1.700.
    • +
    • Android - Now built with NDK r9d.
    • +
    +

    08/05/14 1.03.07 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Improved performance for projects with many events.
    • +
    • Studio API - Improved memory usage for projects with many bus instances.
    • +
    • Studio API - Added Studio::System::setCallback, Studio::System::setUserData and Studio::System::getUserData.
    • +
    • Core API - Added gapless_playback example for scheduling/setDelay usage.
    • +
    • Core API - Improved performance of logging build.
    • +
    • Core API - Added FMOD_SYSTEM_CALLBACK_MIDMIX callback.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed AHDSR Release not working when timelocked sounds are stopped by a parameter condition.
    • +
    • Studio API - Removed some unnecessary file seeks.
    • +
    • Studio API - Fixed AHDSR Release resetting to Sustain value when instruments with limited Max Voices are stopped repeatedly.
    • +
    • Studio API - Fixed channels within paused events not going virtual.
    • +
    • Studio API - Fixed AHDSR Release not working inside nested events
    • +
    • Core API - Fixed downmixing to a quad speaker setup.
    • +
    • Core API - Fixed fsb peak volume levels on big endian platforms.
    • +
    • Core API - Fixed paused channels not going virtual.
    • +
    +

    17/04/14 1.03.06 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Improved performance of automation and modulation
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed crash when creating new automation via LiveUpdate
    • +
    • Studio API - Fixed possible internal error being returned from Studio::Bank::getSampleLoadingState when called on an unloading bank.
    • +
    +

    14/04/14 1.03.05 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Added ChannelControl to the C# wrapper to match the C++ API.
    • +
    • Core API - Fixed the definition of ChannelControl.setDelay and ChannelControl.getDelay in the C# wrapper.
    • +
    • Core API - Replaced broken C# wrapper System.set3DSpeakerPosition and System.get3DSpeakerPosition functions with System.setSpeakerPosition and System.getSpeakerPosition.
    • +
    • Core API - Fixed the capitalization of DSP.setMeteringEnabled, DSP.getMeteringEnabled and DSP.getMeteringInfo in the C# wrapper.
    • +
    • Core API - Xbox 360 - Fix hang on XMA playback
    • +
    • Core API - Fix crash when running out of memory loading an ogg vorbis file.
    • +
    • Core API - Fix symbol collisions when statically linking both FMOD and Xiph libvorbis or libtremor.
    • +
    +

    08/04/14 1.03.04 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Added Studio.System.initialize to the C# wrapper to match the C++ API (replacing Studio.System.init, which is now deprecated).
    • +
    • Studio API - Added Studio.System.create to the C# wrapper to match the C++ API (replacing Studio.Factory.System_Create, which is now deprecated).
    • +
    • Studio API - Added missing functions to the C# wrapper: Studio.EventInstance.get3DAttributes, Studio.EventInstance.isVirtual, Studio.EventInstance.setUserData, Studio.EventInstance.getUserData, Studio.MixerStrip.getChannelGroup, Studio.EventDescription.getUserProperty, Studio.EventDescription.getUserPropertyCount, Studio.EventDescription.getUserPropertyByIndex, Studio.EventDescription.setUserData, Studio.EventDescription.getUserData and Studio.System.loadBankCustom.
    • +
    • Core API - Fix for VBR sounds that dont use FMOD_CREATECOMPRESSEDSAMPLE and FMOD_ACCURATETIME not looping when FMOD_LOOP_NORMAL was set.
    • +
    • Core API - XboxOne - Fixed rare mixer hang when playing XMA as a compressed sample.
    • +
    • Core API - Fix crash with combination of FMOD_OPENUSER + FMOD_NONBLOCKING and a null pointer being passed to System::createSound/createStream.
    • +
    +

    Notes:

    +
      +
    • Added examples to the Programmer API documentation.
    • +
    • Xbox One - Now built with March 2014 QFE1 XDK.
    • +
    • Studio API - In the C# wrapper, Studio.System.init is now deprecated in favour of Studio.System.initialize.
    • +
    • Studio API - In the C# wrapper, Studio.Factory.System_Create is now deprecated in favour of Studio.System.create.
    • +
    • Studio API - Studio::EventDescription::is3D now returns true if any of its nested events are 3D.
    • +
    • Core API - FMOD_CREATESOUNDEXINFO.suggestedsoundtype now tries the suggested type first, then tries the rest of the codecs later if that fails, rather than returning FMOD_ERR_FORMAT.
    • +
    • Core API - Custom codecs. The open callback for a user created codec plugin now does not have to seek to 0 with the file function pointer before doing a read.
    • +
    +

    28/03/14 1.03.03 - Studio API patch release

    +

    Fixes:

    + +

    26/03/14 1.03.02 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fix for setting parameter values that could cause volume changes without the appropriate volume ramp.
    • +
    • Core API - Fix for some incorrect declarations in the C header files.
    • +
    • Core API - Fixed a linker error when calling some C API functions.
    • +
    • Core API - Fixed FMOD_ChannelGroup_AddGroup not returning the DSP connection on success.
    • +
    • Core API - PS4 - Fixed FMOD macros for declaring plugin functions.
    • +
    +

    Notes:

    + +

    18/03/14 1.03.01 - Studio API patch release

    +

    Important:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed simple nested events not terminating properly when inside multi sounds
    • +
    • Core API - Fix SRS downmix crash on startup if software mixer was set to 5.1, and the OS was set to stereo, and the system sample rate was not 44/48/96khz
    • +
    • Core API - Fix for deadlock that could occur when executing commands in the non-blocking callback as another thread is releasing sounds.
    • +
    • Core API - Fix for Channel::getPosition and ChannelControl::getDSPClock returning errors when called on emulated channels created with System::playDSP.
    • +
    • Core API - PS4 - Fixed leak of audio output handles on shutdown.
    • +
    • Core API - Fix crash in compressor when placed on a channel with a delay.
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 1.600.071.
    • +
    +

    03/03/14 1.03.00 - Studio API minor release

    +

    Important:

    +
      +
    • Added PS Vita platform support.
    • +
    • Updated FMOD Studio Programmers API documentation.
    • +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    • Studio API - Studio API is now asynchronous by default, with the processing occuring on a new Studio thread. Asynchronous behaviour can be disabled with the FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE init flag.
    • +
    • Studio API - Studio API classes are now all referenced as pointers. This reflects a change in the handle system to make it thread-safe, more performant and match the C and Core API interface.
    • +
    • Studio API - Event and mixer strip paths now include a prefix in order to guarantee uniqueness. See Studio::System::lookupID.
    • +
    • Core API - Core API is now thread-safe by default. Thread safety can be disabled with the FMOD_INIT_THREAD_UNSAFE init flag.
    • +
    • Core API - Codecs must set waveformatversion to FMOD_CODEC_WAVEFORMAT_VERSION in the FMOD_CODEC_OPEN_CALLBACK.
    • +
    • Core API - Removed support for digital CD audio
    • +
    +

    Features:

    +
      +
    • Studio API - The new .bank file format provides improved support for backward and forward compatibility. Future version updates will not generally require banks to be rebuilt.
    • +
    • Studio API - Added support for events duplicated across banks.
    • +
    • Studio API - Added support for transition marker and loop region probability.
    • +
    • Studio API - Added support for sounds on transition timelines.
    • +
    • Studio API - Added asset enumeration functions: Studio::System::getBankCount, Studio::System::getBankList, Studio::Bank::getEventCount, Studio::Bank::getEventList, Studio::Bank::getMixerStripCount, Studio::Bank::getMixerStripList.
    • +
    • Studio API - Added path retrieval functions: Studio::System::lookupPath, Studio::EventDescription::getPath, Studio::MixerStrip::getPath, Studio::Bank::getPath.
    • +
    • Studio API - Bank loading now takes an extra flags argument. It is possible to load banks in non-blocking mode in which case the function will return while the bank is still in the process of loading.
    • +
    • Studio API - Added Studio::System::setAdvancedSettings.
    • +
    • Studio API - Added Studio::System::getCPUUsage.
    • +
    • Studio API - Studio repositories have improved performance and no longer depend on the standard library map.
    • +
    • Core API - The system callback now includes the error callback type which will be invoked whenever a public FMOD function returns a result which is not FMOD_OK.
    • +
    • Core API - Optimize Sound::getNumSyncPoints when using large FSB files with many subsounds and many syncpoints.
    • +
    • Core API - Made improvements to virtual voices for DSP graphs using sends, returns, fade points, and sounds with varying peak volumes.
    • +
    • Core API - PS4 - Added recording support.
    • +
    • Core API - XBox One - Added dll loading support.
    • +
    • FSBank API - Added support for exporting peak volume per sound using the FSBANK_BUILD_WRITEPEAKVOLUME flag.
    • +
    +

    Fixes:

    +
      +
    • Core API - Channels now take fade points into account for virtualisation
    • +
    • Core API - Fixed pops when changing Echo DSP Delay parameter
    • +
    • Core API - Xbox One - Removed a CPU spike when first playing a compressed sample XMA.
    • +
    +

    Notes:

    +
      +
    • Studio API - Replaced Studio::System::lookupEventID and Studio::System::lookupBusID with Studio::System::lookupID.
    • +
    • Core API - The system callback now has an extra userdata argument that matches the userdata specified in System::setUserData.
    • +
    • Core API - Xbox One - APU allocations are now handled internally for developers using memory callbacks or memory pools.
    • +
    +

    24/02/14 1.02.13 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Removed stalls when removing a DSP chain from a channel
    • +
    • Core API - Fixed Channel::getPosition returning incorrect value for streams with very short loops.
    • +
    • Core API - Fixed rare bug with DSP nodes not being set active in the mixer graph.
    • +
    • Core API - Fixed rare bug with DSP metering not being set.
    • +
    • Core API - Fixed incorrect playback of multi-channel PCM8 data.
    • +
    • Core API - PS4 - Fixed issues with calling ChannelControl::setPosition on AT9 streams and compressed samples.
    • +
    • Core API - PS4 - Fixed audio glitches when using the background music port and the system format is not 7.1
    • +
    • Core API - PS4 - Added loading of plugins from PRX files.
    • +
    • Core API - Android - Fixed crash on low quality Vorbis encoded FSBs.
    • +
    • Core API - Android - Fixed one time memory leak on System::release when using OpenSL output mode.
    • +
    • Studio API - Fixed playlist instruments occasionally cutting off too early.
    • +
    • Studio API - Fixed rare timing issue that caused spawning instruments to trigger too early.
    • +
    +

    Notes:

    +
      +
    • Xbox One - Now built with August QFE11 XDK.
    • +
    • PS4 - Now built with SDK 1.600.051.
    • +
    +

    07/01/14 1.02.12 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Fixed potential crash with net streams.
    • +
    • Core API - PS4 - Fixed rare internal error in AT9 codec when channels are reused after stopping.
    • +
    • Studio API - Fixed nested events getting incorrect 3D position information
    • +
    +

    17/12/13 1.02.11 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Added ChannelControl::setVolumeRamp and ChannelControl::getVolumeRamp to control whether channels automatically ramp their volume changes.
    • +
    • Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_IDLE callback type, fired when an event instance enters the idle state.
    • +
    +

    Fixes:

    + +

    Notes:

    +
      +
    • Core API - PCM data will now be read the main data in a single read instead of breaking the reads up into 16kb chunks.
    • +
    • Studio API - Changed behavior of Studio::EventInstance::getCue to return FMOD_ERR_EVENT_NOTFOUND if the event has no sustain points.
    • +
    +

    02/12/13 1.02.10 - Studio API patch release

    +

    Important:

    +
      +
    • Core API - Updated the C ChannelGroup functions to take 64 bit integer argument.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix FMOD_SPEAKERMODE_SURROUND upmixing to 5.1 or 7.1 incorrectly, ie surround left mixing into LFE and surround right into surround right.
    • +
    • Core API - PS4 - Fix playback of background music when system software format is not 7.1.
    • +
    +

    26/11/13 1.02.09 - Studio API patch release

    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 1.500.111
    • +
    +

    19/11/13 1.02.08 - Studio API patch release

    +

    Important:

    + +

    Features:

    +
      +
    • Studio API - Added setParameterValue and setParameterValueByIndex functions in eventInstance to wrap finding and then setting a parameter value.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed positioning of 5.1 surround speakers when soundcard is set to other surround formats
    • +
    • Core API - Fixed excessive log spam making the logging version much slower
    • +
    • Core API - Xbox One - Fixed rare XMA codec hang which could also manifest as FMOD_ERR_INTERNAL.
    • +
    • Core API - PS4 - Fixed crash when assigning a channel group to the controller speaker.
    • +
    • Studio API - Fixed MixerStrip release not working when the user has multiple handles to the same strip
    • +
    • Studio API - Fixed pops when playing nested events that have silent tracks
    • +
    • Studio API - Fixed crash when shutting down with profiler connected.
    • +
    • Studio API - Fixed unused streams being created during event preloading
    • +
    +

    Notes:

    +
      +
    • Core API - Turned off optimization for user created DSP effects that do not call the read callback if no sound is coming in. read callbacks will now always fire regardless. 'shouldiprocess' callback can be defined to optimize out no input.
    • +
    +

    12/11/13 1.02.07 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - iOS - Fixed streams returning FMOD_ERR_INTERNAL on ARM64 devices.
    • +
    • Core API - iOS - Fixed automatic interruption handling not working for ARM64 devices.
    • +
    • Core API - Fix possible crash on startup, if using 5.1 mixing on a stereo output (downmixer enabled).
    • +
    • Core API - Fix setMute on master channelgroup not working.
    • +
    • Studio API - Fixed AHDSR modulators starting at the wrong value when attack time is 0
    • +
    • Studio API - Fixed Multi Sounds and Scatterer Sounds not randomizing correctly after deleting all entries
    • +
    +

    06/11/13 1.02.06 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - iOS - Added support for ARM64 devices and x86_64 simulator.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fix playback issues after running for more than 12 hours
    • +
    • Core API - Fixed net streaming truncating or repeatings parts of the end of a netstream.
    • +
    • Core API - Fix crash due to missing functions in kernel32.dll on Windows XP.
    • +
    +

    29/10/13 1.02.05 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Improved performance of Studio::System::setListenerAttributes
    • +
    • Studio API - FMOD profiler can now show Studio Bus and Event instances in the DSP node graph.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed pan jittering on events that move with the listener
    • +
    +

    22/10/13 1.02.04 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Added ability to continue loading banks when missing plugins.
    • +
    • Studio API - Added FMOD_STUDIO_PARAMETER_TYPE enum to describe the type of a parameter to FMOD_STUDIO_PARAMETER_DESCRIPTION.
    • +
    • Core API - Added function to get parent sound from a subsound.
    • +
    • Core API - Android - Added support for dynamic plugins.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Trying to set an automatic parameter will return FMOD_ERR_INVALID_PARAM.
    • +
    • Core API - Fix restarting a channel corrupting fader and panner positions if effects are added.
    • +
    • Core API - Fix channel restarting if 1. sound ended, 2. Channel::setVolume (0) with FMOD_VOL0BECOMESVIRTUAL happened, 3. setVolume(>0) happened, in between 2 system updates.
    • +
    • Core API - Fixed issues on PS4 after opening an output audio port fails.
    • +
    • Core API - Calling playSound on a fsb loaded with createStream will now return FMOD_ERR_SUBSOUND.
    • +
    +

    15/10/13 1.02.03 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - iOS - Fixed potential crash when stopping virtual channels.
    • +
    • Studio API - Fixed click with cross-fade for nested events
    • +
    • Studio API - Mac - Fixed link issues from certain API functions.
    • +
    +

    Notes:

    +
      +
    • Studio API - FMOD_Studio_System_Create now takes a headerVersion parameter to match the C++ API
    • +
    +

    07/10/13 1.02.02 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Fixed rare crash when using virtual voices.
    • +
    • Core API - Fixed channel fade state not being preserved when switching to virtual.
    • +
    • Core API - Fixed 5.1 and 7.1 downmix to stereo being off-center.
    • +
    • Core API - Mac - Fixed incorrect downmix logic causing excess channels to be dropped.
    • +
    +

    Notes:

    + +

    01/10/13 1.02.01 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Improved performance of compressor on X86/x64 platforms.
    • +
    • Studio API - Added support for new automatic parameters: Event Orientation, Direction, Elevation and Listener Orientation
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed crash when downmixing to 16-bit output.
    • +
    • Core API - Fixed floating point issue when setting very low pitch values.
    • +
    • Studio API - Fixed sound glitch that could occur after crossfade.
    • +
    • Studio API - Fix for assert when rescheduling with modified pitch.
    • +
    +

    Notes:

    +
      +
    • iOS - Now built with SDK 7.0.
    • +
    • Mac - Now built with SDK 10.8.
    • +
    +

    23/09/13 1.02.00 - Studio API minor release

    +

    Important:

    +
      +
    • Added Android platform support.
    • +
    +

    Features:

    +
      +
    • Core API - Added FMOD_CREATESOUNDEXINFO.fileuserdata to hold user data that will be passed into all file callbacks for the sound
    • +
    • Core API - Added System::mixerSuspend and System::mixerResume for mobile platforms to allow FMOD to be suspended when interrupted or operating in the background.
    • +
    • Core API - Added float parameter mappings support to plug-ins
    • +
    • Core API - PS4 - Added Output Ports example
    • +
    • Studio API - Reduced memory overhead for several core types.
    • +
    • Studio API - Added Studio::System::loadBankMemory to support loading banks from a memory buffer
    • +
    • Studio API - Added Studio::System::loadBankCustom to support loading banks using bank-specific custom file callbacks
    • +
    • Studio API - Added support for placing multiple tempo markers on a timeline.
    • +
    • Studio API - Better error reporting for instruments scheduled in the past.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix incorrect error codes being returned by C# wrapper.
    • +
    • Core API - Fix bug in stereo-to-surround and surround-to-surround panning
    • +
    • Core API - Fix System::playDSP not working
    • +
    • Core API - Fix rare crash with DSPConnection::setMixMatrix. Studio API could also be affected.
    • +
    • Core API - Fix getMeteringInfo not clearing its values when pausing.
    • +
    • Core API - Fix audio pops when restarting sounds due to downmixing.
    • +
    • Core API - PS4 - Fix crash when disconnecting a channel group from an output port.
    • +
    • Core API - PS4 - Fix issue with audio channels not finishing correctly when being played through a port.
    • +
    • Core API - Xbox One - Fixed 'clicking' when a realtime decoded XMA sample loops if adjusting pitch during playback.
    • +
    • Studio API - Fix event priority not working
    • +
    • Studio API - Fix Studio::EventInstance::start () returning incorrect result with non-blocking sounds.
    • +
    • Studio API - Fix memory leaks when loading corrupt banks
    • +
    • Studio API - Fix channels leaking with nested instruments
    • +
    • Studio API - Fix MixerStrip::setFaderLevel on the game side affecting volume levels in the tool when connected via Live Update
    • +
    • Studio API - Fix a potential crash when getting a string property with Studio::EventDescription::getUserPropertyByIndex
    • +
    +

    Notes:

    +
      +
    • Studio API - Renamed Studio::System::loadBank to Studio::System::loadBankFile
    • +
    • Studio API - Updated the API examples to use the new example project
    • +
    • Core API - Changed FMOD_FILE_OPEN_CALLBACK userdata parameter from void* to void (it now comes from FMOD_CREATESOUNDEXINFO.fileuserdata rather than being set by the open callback)
    • +
    • Core API - iOS - Removed automatic handling of interruptions. Developers should call the new System::mixerSuspend / System::mixerResume API from their interruption handler.
    • +
    • Core API - iOS - Removed all usage of AudioSession API, developers are now encouraged to use the platform native APIs as there is no possible conflict with FMOD.
    • +
    • PS4 - Now built with SDK 1.020.041.
    • +
    +

    02/09/13 1.01.15 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Performance optimizations.
    • +
    • Studio API - Performance optimizations.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix oscillators not changing pitch if System::playDSP was used.
    • +
    • Core API - Fix crash when setting 0 or invalid pitch.
    • +
    • Studio API - Fix for some allocations not propagating FMOD_ERR_MEMORY errors.
    • +
    • Studio API - Fix for memory leak when failing to load a bank.
    • +
    +

    26/08/13 1.01.14 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Fix crash if adding an FMOD_DSP_TYPE_FADER dsp to a channelgroup.
    • +
    • Core API - Xbox One - Internal WASAPI (mmdevapi.dll) threads will now have their affinity set to match the FMOD feeder thread.
    • +
    +

    Notes:

    +
      +
    • Xbox One - Now built with August XDK.
    • +
    +

    19/08/13 1.01.13 - Studio API patch release

    +

    Features:

    +
      +
    • +

      Studio API - Global mixer strips will now be automatically cleaned up when when the events routed into them complete.

      +
    • +
    • +

      Studio API - Improved performance of Studio::System::Update by removing stalls waiting on the mixer the complete.

      +
    • +
    +

    Fixes:

    +
      +
    • Core API - Channel::setPitch () now returns an error if a NaN is passed in. Fixes crashes occuring later in the mixer thread.
    • +
    • Studio API - Fixed sustain points at the start of the timeline not working
    • +
    • Studio API - Fixed sustain point keyoff incorrectly being ignored if the cursor is not currently sustaining
    • +
    • Studio API - Fixed sustain point keyoff incorrectly skipping sustain points repeatedly when looping
    • +
    +

    Notes:

    +
      +
    • Studio API - Changed behavior of Studio::EventInstance::getCue to return FMOD_ERR_INVALID_PARAM if the event contains no sustain points.
    • +
    +

    12/08/13 1.01.12 - Studio API patch release

    +

    Features:

    +
      +
    • Added FMOD SoundBank Generator tool for creating .fsb files. Both a GUI version (fsbank.exe) and a command line version (fsbankcl.exe) are provided.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix FSB Vorbis seek table containing an invalid entry at the end.
    • +
    • Core API - Fix cpu stall when using System::playDSP. Also if using oscillator in studio.
    • +
    • Core API - Xbox One - Fixed rare crash on System::init when using WASAPI.
    • +
    +

    05/08/13 1.01.11 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed resource leak.
    • +
    • Studio API - Fixed a crash when releasing an event instance with sub events.
    • +
    • Core API - Fixed FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED not being passed to the application.
    • +
    • Core API - PS4 - Fix crashes caused by out-of-memory conditions. FMOD_ERR_MEMORY is now returned correctly.
    • +
    • Core API - Xbox One - Fixed race condition that causes a hang when playing compressed XMA samples and streams at the same time.
    • +
    • Core API - Xbox One - Fixed leak of SHAPE contexts that would cause createSound to fail if playing and releasing lots of XMA streams.
    • +
    • Core API - Xbox One & Win - Fixed surrounds and rears being swapped in 7.1.
    • +
    +

    29/07/13 1.01.10 - Studio API patch release

    +

    Important:

    +
      +
    • Studio API - Changed .bank file format - API is backward compatible but must be upgraded for compatibility with Studio tool 1.01.10 or newer.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed plugin effect sounds not working in game.
    • +
    • Studio API - Fixed a crash in Studio::System::update after calling Studio::EventDescription::releaseAllInstances
    • +
    • Studio API - Fixed sustain points at the start of the timeline not working
    • +
    • Studio API - Fixed sustain point keyoff incorrectly being ignored if the cursor is not currently sustaining
    • +
    • Studio API - Fixed sustain point keyoff incorrectly skipping sustain points repeatedly when looping
    • +
    • Studio API - Fixed a crash when unloading a bank that contains a nested event that is currently playing
    • +
    • Studio API - Fixed Studio::System::update sometimes failing with FMOD_ERR_INTERNAL and leaving the system in an inconsistent state
    • +
    • Core API - Xbox One - Fixed FMOD_CREATECOMPRESSEDSAMPLE XMA playback issues.
    • +
    +

    Notes:

    +
      +
    • Studio API - Changed behavior of Studio::EventInstance::getCue to return FMOD_ERR_INVALID_PARAM if the event contains no sustain points.
    • +
    +

    22/07/13 1.01.09 - Studio API patch release

    +

    Important:

    +
      +
    • Core API - Fixed rare crash in mixer.
    • +
    +

    Features:

    +
      +
    • Studio API - Fixed spawning sounds not playing at correct 3D position.
    • +
    • Studio API - Fixed 40ms of latency getting added for each layer of event sound nesting.
    • +
    • Core API - Optimized mixer by about 30% in some configurations.
    • +
    +

    Fixes:

    +
      +
    • Core API - Remove FMOD_CHANNELCONTROL union, used in ChannelControl type callbacks, as it was incorrect and using it as a union would have lead to corruption/crash. A simple opaque FMOD_CHANNELCONTROL type is now used for callbacks, and the user should just cast to the relevant channel or channelgroup type.
    • +
    • Core API - Fixed fade point interpolation on channels with pitch.
    • +
    • Core API - Fixed race condition when channels were reused after stopping.
    • +
    • Core API - Xbox One - Fixed hang for short (2KB) XMA files.
    • +
    • Core API - Xbox One - Fixed incorrect seek offset for XMA files.
    • +
    • Core API - PS4 - Added support for AT9 streams with greater than 2 channels.
    • +
    • Studio API - PS4 - Fixed crash when Handle derived classes went out of scope after the dynamic lib was unloaded
    • +
    +

    Notes:

    +
      +
    • PS4 - Now built with SDK 1.0.
    • +
    +

    15/07/13 1.01.08 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Added Studio::EventDescription::getMinimumDistance
    • +
    • Studio API - Added Studio::EventDescription::isStream
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed crash / corruption from DSP Fader/Panner objects.
    • +
    • Core API - Fixed mod/s3m/xm/mid playback.
    • +
    • Studio API - Fixed Studio::EventDescription::isOneshot () incorrectly returning true for an event that has a loop on the logic track.
    • +
    • Linux - Fixed crash on playback of certain CELT streams.
    • +
    • Xbox One - Fixed potential hangs with compressed XMA samples.
    • +
    • Xbox One - Fixed potential silence if XMA sample rate was not one of 24K, 32K, 44.1K or 48K.
    • +
    +

    10/07/13 1.01.07 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Fix "Sample Rate Change" tag from passing through 0 rate when EOF was hit on certain MP3 files.
    • +
    • Core API - Fix crash when using FMOD_CREATECOMPRESSEDSAMPLE introduced in 1.01.06
    • +
    • Core API - iOS - Fixed crash when using DSP Echo.
    • +
    • Core API - iOS - Fixed crash in mixer due to misaligned buffers.
    • +
    +

    08/07/13 1.01.06 - Studio API patch release

    +

    Features:

    +
      +
    • XboxOne - Officially added support for XMA. Please note this requires the July XDK to avoid a hang.
    • +
    • Studio API - Added Studio::ParameterInstance::getDescription
    • +
    • Studio API - Added EventDescription getParameter, getParameterCount and getParameterByIndex functions
    • +
    +

    Fixes:

    +
      +
    • Fix Sound userdata being overwritten when FMOD_SOUND_NONBLOCKCALLBACK was called for a 2nd or more time.
    • +
    • Core API - Fix rare crash in mixer when releasing a ChannelGroup
    • +
    • Core API - Fix 3D Panner DSPs and Studio Event 3d volumes not being considered by virtual voice system.
    • +
    • Core API - Fixed compressor sounding erratic and unresponsive
    • +
    • Studio API - Fixed clicks when a Studio::ParameterInstance::setValue call causes sounds to be cut off
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with July XDK.
    • +
    • Core API - Changed FMOD_DSP_TYPE_PAN FMOD_DSP_PAN_STEREO_POSITION parameter to go from -100 to 100.
    • +
    • Core API - Changed FMOD_DSP_TYPE_COMPRESSOR FMOD_DSP_COMPRESSOR_ATTACK parameter to go from 0.1 to 500ms.
    • +
    +

    28/06/13 1.01.05 - Studio API patch release

    +

    Important:

    +
      +
    • Core API - Changed .fsb file format - ALL BANKS MUST BE REBUILT
    • +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    +

    Features:

    + +

    Fixes:

    +
      +
    • Core API - PS4 - Improved AT9 decoding performance, fixed issue with when a sound has loop points not aligned to frame size, fixed seamless looping playback glitches.
    • +
    • Core API - Fixed bug that was causing virtual channels to stop prematurely.
    • +
    • Core API - Fixed fade points leaking when channels go virtual.
    • +
    +

    Notes:

    +
      +
    • Studio API - Effect data parameter buffers are now 16-byte aligned (128-byte aligned on PS3)
    • +
    • Studio API - Added automatic header version verification to Studio::System::create
    • +
    +

    19/06/13 1.01.04 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Fix rare crash with Fader DSP unit.
    • +
    • Studio API - Fixed some effects causing events to not stop correctly
    • +
    • Studio API - Fixed multiple concurrent playbacks of one event sometimes failing with FMOD_ERR_SUBSOUNDS returned from Studio::System::update
    • +
    +

    Notes:

    + +

    07/06/13 1.01.03 - Studio API patch release

    +

    Features:

    + +

    Fixes:

    +
      +
    • Core API - Fixed silence in certain DSP configurations.
    • +
    • Core API - Fixed virtual channels not stopping correctly when a parent channelgroup stops due to an end delay
    • +
    • Core API - Fixed virtual channels not cleaning up fade points correctly
    • +
    • Core API - Fixed fade points being ignored when channels go from virtual to non-virtual
    • +
    • Studio API - Fixed crash when playing a multisound after unloading and reloading it's bank.
    • +
    • Studio API - Implemented Studio::Bank::loadSampleData, Studio::Bank::unloadSampleData and Studio::Bank::getSampleLoadingState (they previously did nothing)
    • +
    • Studio API - Fixed crashes and unexpected behavior with sidechains when they are connected to multiple compressors.
    • +
    • Studio API - Fixed a linker error when calling handle assignment operators
    • +
    • Studio API - Fixed a crash in the game when adding a sound to an event while connected via Live Update
    • +
    +

    Notes:

    +
      +
    • Core API - Specific parameter description structures like FMOD_DSP_PARAMETER_DESC_FLOAT no longer inherit from FMOD_DSP_PARAMETER_DESC; instead, FMOD_DSP_PARAMETER_DESC includes a union of all the specific structures with floatdesc, intdesc, booldesc and datadesc members. The FMOD_DSP_INIT_PARAMDESC_xxxx macros have been updated to reflect this.
    • +
    • PS4 - Now built with SDK 0.930.060.
    • +
    +

    31/05/13 1.01.02 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed getMixerStrip not returning a valid handle when retrieving a VCA.
    • +
    +

    30/05/13 1.01.01 - Studio API patch release

    +

    Fixes:

    +
      +
    • Core API - Fix rare crash in DSPFader.
    • +
    • Studio API - Studio::EventInstance::getParameter and Studio::EventInstance::getCue now use case-insensitive name comparison
    • +
    +

    Notes:

    +
      +
    • Studio API - Renamed Studio::EventInstance::getNumCues to Studio::EventInstance::getCueCount
    • +
    +

    27/05/13 1.01.00 - Studio API minor release

    +

    Important:

    +
      +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    +

    Features:

    + +

    Fixes:

    +
      +
    • Core API - Fixed FSB Vorbis not working with encryption key enabled.
    • +
    • Core API - Fixed virtual voices not respecting ChannelControl::setDelay
    • +
    • Core API - Fixed parameter index validation when getting/setting DSP parameters.
    • +
    • Core API - Fixed reverb not always idling when it should.
    • +
    • Core API - Fixed bug with loop count being incorrectly set to infinite
    • +
    • Core API - Optimised Echo DSP effect on x86/x64 architectures
    • +
    • Core API - Fixed ChannelControl::set3DLevel, ChannelControl::set3DSpeakerSpread and stereo 3d sounds not working
    • +
    • Core API - Fixed flange effect not updating 'rate' parameter if the rate was set before adding it to a channel or channelgroup or system object.
    • +
    • Core API - PS4 - Added support for music, voice, personal device and pad speaker routing. See System::AttachChannelGroupToPort and fmod_ps4.h
    • +
    • Core API - PS4 - Added dynamic linking option.
    • +
    • Studio API - Fixed stop/release behaviour of event instances containing logic markers.
    • +
    • Studio API - Fixed memory corruption in Studio::System::release
    • +
    • Studio API - Fixed FMOD_STUDIO_STOP_ALLOWFADEOUT cutting off delay and reverb
    • +
    • PS4 - Fixed closing the FMOD::System causing platform wide networking to be shutdown even if the system did not initialize it.
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with April XDK.
    • +
    • PS4 - Now built with SDK 0.930.
    • +
    +

    09/05/13 1.00.03 - Studio API patch release

    +

    Features:

    +
      +
    • Core API - Added memory callbacks for DSP plugins
    • +
    +

    Fixes:

    +
      +
    • Core API - Fixed true peak calculation in loudness meter
    • +
    • Core API - Fix thread related crash in fader DSP and possibly panner DSP.
    • +
    • Studio API - Fixed automatic angle parameter calculation
    • +
    +

    12/04/13 1.00.02 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed snapshots sometimes not working on some properties
    • +
    • Studio API - Fixed VCAs applying fader level twice to controlled buses
    • +
    +

    09/04/13 1.00.01 - Studio API patch release

    +

    Important:

    +
      +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    +

    Features:

    +
      +
    • PS4 & XboxOne - Reduced CPU usage with optimized SSE and AVX functions.
    • +
    +

    Fixes:

    +
      +
    • Core API - Fix potential crash when stopping and starting sounds quickly and a leak for FMOD_CREATECOMPRESSED codecs which made all sounds go virtual.
    • +
    • Studio API - Fixed a crash when connecting to the game via Live Update
    • +
    • Studio API - Fixed serialization of snapshots with automation
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with March XDK.
    • +
    +

    25/03/13 1.00.00 - Studio API major release

    +

    Important:

    +
      +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    +

    Features:

    +
      +
    • Mac - Reduced CPU usage with optimized SSE and AVX functions.
    • +
    • XboxOne - Added ability to set affinity via FMOD_XboxOne_SetThreadAffinity.
    • +
    • PS4 - Added ability to set affinity via FMOD_PS4_SetThreadAffinity.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Studio::EventDescription::getLength return incorrect values
    • +
    • Studio API - Fixed playback glitches when sounds are placed end-to-end on the timeline
    • +
    • Studio API - Studio::System::lookupEventID and Studio::System::lookupBusID now ignore case
    • +
    • Studio API - Fixed playback of Sound Scatterers with non-zero pitch
    • +
    • Made return DSPs go idle when there is no input from sends
    • +
    • Fixed sends sometimes going silent if there are multiple sends to a single return
    • +
    • Fixed rare hang in mixer when using setDelay with a pitch on the parent
    • +
    +

    Notes:

    +
      +
    • Studio API - Replaced Studio::System::lookupID with Studio::System::lookupEventID and Studio::System::lookupBusID.
    • +
    • FSBank API will now always encode PCM FSBs as PCM16 instead of deciding based on the source file format.
    • +
    • PS4 - Now built with SDK 0.920.
    • +
    +

    25/02/13 0.02.04 - Studio API patch release

    +

    Fixes:

    + +

    15/02/13 0.02.03 - Studio API patch release

    +

    Features:

    +
      +
    • Studio API - Added Studio::System::lookupID () to look up event IDs from paths (using any string tables present in currently loaded banks).
    • +
    • Studio API - Added Studio::Bank::unload () to free loaded bank data.
    • +
    • Windows - Added optimisations to the 64 bit build.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed a linker error when calling Studio::EventDescription::getID
    • +
    • Fixed constant FMOD_ERR_MEMORY in the TTY and hang if FMOD_ADVANCEDSETTINGS is used with DSPBufferPoolSize being set to 0.
    • +
    • Changed custom DSPs with no shouldiprocess callback to only be processed when their inputs are active.
    • +
    • Fixed high freqency noise coming from send DSP when channel counts mismatches the return DSP.
    • +
    • Fixed metering not working via LiveUpdate
    • +
    • Windows - fixed bug in 5.1 mixing in 32bit builds.
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with January XDK.
    • +
    • PS4 - Now built with SDK 0.915.
    • +
    +

    18/01/13 0.02.02 - Studio API patch release

    +

    Important:

    +
      +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    • Studio API - Changed function signature for Studio::System::initialize, added STUDIO_FLAGS field
    • +
    +

    Features:

    + +

    Fixes:

    +
      +
    • Studio API - Fixed an internal error on instantiating a VCA when not all of the mixer strips it controls are loaded
    • +
    +

    Notes:

    +
      +
    • XboxOne - Now built with December XDK.
    • +
    +

    11/01/13 0.02.01 - Studio API patch release

    +

    Fixes:

    +
      +
    • Studio API - Fixed Distance and Angle parameters not being created properly by live update
    • +
    • Fixed reverb effect generating denorm floats after silence
    • +
    +

    20/12/12 0.02.00 - Studio API minor release

    +

    Features:

    +
      +
    • Added Xbox360 support.
    • +
    • Added iOS support.
    • +
    • Studio API - Added sub-event instantiation via Studio::EventInstance::createSubEvent
    • +
    +

    23/11/12 0.01.04 - Patch release

    +

    Fixes:

    + +

    9/11/12 0.01.03 - Patch release

    +

    Fixes:

    +
      +
    • Fixed a linker error when using Studio::EventInstance::setPaused
    • +
    +

    29/10/12 0.01.02 - Patch release

    +

    Fixes:

    +
      +
    • Fixed distortion when the distance between 3D sound and the listener is greater than the maximum attenuation distance.
    • +
    • Fixed memory leaks when playing a persistent event and triggering sounds via parameter changes.
    • +
    +

    16/10/12 0.01.00 - Minor release

    +

    Features:

    +
      +
    • Implemented side chaining for FMOD Compressor
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed linker error when calling Studio::EventInstance::isVirtual
    • +
    • Studio API - Added log message for asset not found error
    • +
    +

    Notes:

    +
      +
    • Second Developer Preview release
    • +
    +

    28/09/12 0.00.04 - Patch release

    +

    Important:

    +
      +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    +

    Features:

    +
      +
    • Add DSP::addSideChain and FMOD_DSP_STATE::sidechainbuffer to allow a DSP unit to support sidechaining from the output of another DSP.
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed Event::getParameter () and retrieving the name of a parameter via EventParameter::getInfo ()
    • +
    • Studio API - Added version checking to bank loading, the runtime will return FMOD_ERR_FORMAT when attempting to load an old bank
    • +
    +

    19/09/12 0.00.03 - Patch release

    +

    Fixes:

    +
      +
    • Fix panning issue introduced in 5.00.02
    • +
    • Fix possible crackling noises from mixer optimization in 5.00.02
    • +
    +

    14/09/12 0.00.02 - Patch release

    +

    Important:

    +
      +
    • Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT
    • +
    +

    Features:

    +
      +
    • Optimized mixer to be 20% faster in some cases.
    • +
    • Studio API - Improved performance of event playback containing mono/stereo tracks
    • +
    +

    Fixes:

    +
      +
    • Studio API - Fixed panning different in game to tool
    • +
    +

    27/08/12 0.00.00 - Initial release

    +

    Notes:

    +
      +
    • First Developer Preview release
    • +
    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-110.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-110.html new file mode 100644 index 0000000..1ac9cc8 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-110.html @@ -0,0 +1,47 @@ + + +Welcome to the FMOD Engine | New in FMOD Engine 1.10 + + + + +
    + +
    +

    1. Welcome to the FMOD Engine | New in FMOD Engine 1.10

    + +

    What's New in 1.10?

    +

    This section describes the major features introduced in the 1.10 release. See the Detailed Revision History for information regarding each patch release.

    +

    Spatial audio features

    +

    Windows Sonic spatialization has been added for Windows and Xbox One with a new output plugin FMOD_OUTPUTTYPE_WINSONIC. This will allow FMOD to be rendered using Windows Sonic for headphones, Dolby Atmos for headphones and Dolby Atmos Home Theatre. These technologies allow for a more immersive surround experience which includes height spatialization via 7.1.4 surround speaker mode and dynamic objects.

    +

    To facilitate getting signal into the height speakers FMOD can play 12 channel audio (7.1.4) as a source or upmix with the help of FMOD_DSP_TYPE_PAN and the new FMOD_DSP_PAN_2D_HEIGHT_BLEND parameter.

    +

    For more detail about using spatial audio features with FMOD please refer to the dedicated Spatial Audio page.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-200.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-200.html new file mode 100644 index 0000000..95ba07c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-200.html @@ -0,0 +1,106 @@ + + +Welcome to the FMOD Engine | New in FMOD Engine 2.00 + + + + +
    + +
    +

    1. Welcome to the FMOD Engine | New in FMOD Engine 2.00

    + +

    What's New in 2.00?

    +

    This section describes the major features introduced in the 2.00 release. See the Detailed Revision History for information regarding each patch release.

    +

    Global Parameters

    +

    The Studio API now supports global parameters. These parameters are controlled via the System parameter API and have a single value that is shared between all instances. This feature is intended for parameters like "time of day" or "wind speed" that affect a number of different events at the same time.

    +

    Global parameters are read-only when accessed via an event. They must be accessed via the System parameter API in order to set their value.

    +

    Global Mixer Automation

    +

    The Studio API now supports automation of objects in the global mixer (for example effect parameters or bus volume). Parameters that drive global mixer automation are controlled via the System parameter API.

    +

    New Parameter API

    +

    The Studio parameter API has been updated to support global parameters and provide a more robust fast path for setting parameter values frequently:

    +
      +
    • Indices have been replaced with IDs. These IDs are intended to be cached by game code, and provide fast access while remaining stable if the parameter list changes due to live update or bank loading.
    • +
    • A global parameter API has been added to the Studio::System class.
    • +
    • The Studio::EventDescription parameter functions have been renamed to be consistent with the corresponding System functions.
    • +
    • The '...ByName' parameter functions now accept paths (which can be copied from FMOD Studio) as well as short parameter names.
    • +
    • The FMOD_STUDIO_PARAMETER_DESCRIPTION index field has been replaced with an id field.
    • +
    • A flags field has been added to FMOD_STUDIO_PARAMETER_DESCRIPTION. It provides information on whether the parameter is read-only, automatic, or global.
    • +
    • The deprecated ParameterInstance class has been removed.
    • +
    +

    The following event functions have been added:

    + +

    In addition, to support global parameters, the following system functions have been added:

    + +

    The following functions have been renamed:

    + +

    The following functions have been removed:

    +
      +
    • Studio::EventInstance::getParameterValueByIndex
    • +
    • Studio::EventInstance::setParameterValueByIndex
    • +
    • Studio::EventInstance::setParameterValuesByIndices
    • +
    • Studio::EventInstance::getParameter
    • +
    • Studio::EventInstance::getParameterByIndex
    • +
    • Studio::EventInstance::getParameterCount
    • +
    +

    Sample Data Encryption

    +

    Bank sample data can now be encrypted using FMOD Studio. This implentation is an extension of the Core API FSB encryption feature. To allow bank loading when used with the Studio API, set the key via FMOD_STUDIO_ADVANCEDSETTINGS::encryptionkey. When some banks are unencrypted you can use the FMOD_STUDIO_LOAD_BANK_UNENCRYPTED load flag to ignore the given key.

    +

    LowLevel API Renamed to Core API

    +

    The LowLevel API has been renamed to Core API, other than that it should still function the same way it previously has.

    +
    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-201.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-201.html new file mode 100644 index 0000000..5f93e34 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-201.html @@ -0,0 +1,107 @@ + + +Welcome to the FMOD Engine | New in FMOD Engine 2.01 + + + + +
    + +
    +

    1. Welcome to the FMOD Engine | New in FMOD Engine 2.01

    + +

    What's New in 2.01?

    +

    This section describes the major features introduced in the 2.01 release. See the Detailed Revision History for information regarding each patch release.

    +

    Performance improvements

    +

    With every release of FMOD performance is kept in mind, however particularly with this release a strong focus has been made to improve performance across several key areas.

    +
      +
    • Mixing
    • +
    • Resampling
    • +
    • FSB Vorbis
    • +
    • Convolution reverb
    • +
    • Multiband EQ
    • +
    +

    This process involved improving existing and adding new hardware specific optimization for SSE, AVX, AVX2, AVX-512 and Neon instruction sets which cover all platforms FMOD currently targets.

    +
      +
    • Synthetic benchmarks for Vorbis playback with resampling for mono, stereo, quad, 5.1 and 7.1 showed performance increase of 2-2.5x.
    • +
    • Synthetic benchmarks for Multiband EQ showed performance increase of 2-3x for stereo and higher channel counts.
    • +
    • Replay of commands from existing games showed real world improvements of 20% for a mix of workloads.
    • +
    +

    Thread attributes

    +

    Prior to this release setting thread related attributes such as priority, stack size and thread affinity was split over several API locations (some platform specific).
    +Now we have a unified API for controlling all these values in a single place accessed via Thread_SetAttributes.

    +

    In 2.0 you could override the stack size for the stream, non-blocking and mixer threads using FMOD_ADVANCEDSETTINGS::stackSizeStream, FMOD_ADVANCEDSETTINGS::stackSizeNonBlocking and FMOD_ADVANCEDSETTINGS::stackSizeMixer respectively. These have all been removed in favor of using the new set attributes function as follows:

    +
    FMOD::Thread_SetAttributes(FMOD_THREAD_TYPE_STREAM,      FMOD_THREAD_AFFINITY_GROUP_DEFAULT, FMOD_THREAD_PRIORITY_DEFAULT, stackSizeStream);
    +FMOD::Thread_SetAttributes(FMOD_THREAD_TYPE_NONBLOCKING, FMOD_THREAD_AFFINITY_GROUP_DEFAULT, FMOD_THREAD_PRIORITY_DEFAULT, stackSizeNonBlocking);
    +FMOD::Thread_SetAttributes(FMOD_THREAD_TYPE_MIXER,       FMOD_THREAD_AFFINITY_GROUP_DEFAULT, FMOD_THREAD_PRIORITY_DEFAULT, stackSizeMixer);
    +
    + +

    In 2.0 you could override the affinity for all threads in a platform specific way, e.g. FMOD_UWP_SetThreadAffinity or FMOD_Android_SetThreadAffinity. These have all been removed in favor of using the new set attributes function as follows:

    +
    FMOD::Thread_SetAttributes(FMOD_THREAD_TYPE_MIXER, FMOD_THREAD_AFFINITY_CORE_5);
    +FMOD::Thread_SetAttributes(FMOD_THREAD_TYPE_STREAM, FMOD_THREAD_AFFINITY_CORE_3);
    +
    + +

    Additionally it's now possible to specify the thread priority for all FMOD threads using the same API.

    +

    Minor API differences

    + +

    What's new since 2.00 initial release?

    +

    Improved CPU tracking

    +

    It is now possible to track both inclusive and exclusive CPU usage costs for the Studio update thread via Studio::Bus::getCPUUsage and Studio::EventInstance::getCPUUsage.

    +

    Improved memory tracking

    +

    It is now possible to track the instances and sample data memory usage for each System, Bus and EventInstance via Studio::System::getMemoryUsage, Studio::Bus::getCPUUsage and Studio::EventInstance::getCPUUsage respectively.

    +

    Stadia platform

    +

    Official support for the Stadia platform has been added.

    +

    Minor API differences

    +
    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-202.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-202.html new file mode 100644 index 0000000..8185d57 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-202.html @@ -0,0 +1,154 @@ + + +Welcome to the FMOD Engine | New in FMOD Engine 2.02 + + + + +
    + +
    +

    1. Welcome to the FMOD Engine | New in FMOD Engine 2.02

    + +

    What's New in 2.02?

    +

    This section describes the major features introduced in the 2.02 release. See the Detailed Revision History for information regarding each patch release.

    +

    Minimum / Maximum Distance

    +

    Events (rather than spatializer DSPs) now encapsulate the functionality of minimum and maximum distance.

    +

    As a result, Studio::EventDescription::getMinimumDistance and Studio::EventDescription::getMaximumDistance have been removed. Those APIs which returned values reported by FMOD spatializers have been replaced with the new Studio::EventDescription::getMinMaxDistance. The new API returns the initial values specified for minimum and maximum distance as set in FMOD Studio. If the minimum or maximum distance have been automated you can query the runtime value per EventInstance using Studio::EventInstance::getMinMaxDistance.

    +

    DSP plugins interested in receiving the new Event level min/max distance information can now add a data parameter of data type FMOD_DSP_PARAMETER_ATTENUATION_RANGE. For compatibility with the old behavior of each spatializer DSP having its own min/max distance, FMOD_DSP_TYPE_PAN and FMOD_DSP_TYPE_OBJECTPAN now have override properties that ignore the Event level values. Resonance Audio has been updated to use the new method, so if the old method is desired please use the Resonance plugin from v2.01.xx.

    +

    Using the new Event level min/max we are able to provide a new built-in parameter, FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED, that presents the range from min to max as 0 to 1.

    +

    Labeled Parameters

    +

    Labeled or enumerated parameters have existed in FMOD Studio for a while, however until now they have been unavailable in the API.

    +

    With this release we have introduced a way to query all of the labels associated with one of these parameters. You can fetch labels for global parameters via Studio::System::getParameterLabelByID or Studio::System::getParameterLabelByName and you can fetch labels for local parameter via Studio::EventDescription::getParameterLabelByID, Studio::EventDescription::getParameterLabelByName or Studio::EventDescription::getParameterLabelByIndex. The main purpose of this API is to expose these strings to your level editor for ease of value selection. We recommend still storing the related index in you level data for best performance at runtime when setting enumerated parameters.

    +

    Despite this advice, we also provide some new APIs for setting enumerated parameter with their string value. For global parameters you can use Studio::System::setParameterByIDWithLabel or Studio::System::setParameterByNameWithLabel to lookup the parameter by ID or name respectively then set the value string. For local parameters you can use Studio::EventInstance::setParameterByIDWithLabel or Studio::EventInstance::setParameterByNameWithLabel to lookup the parameter by ID or name respectively then set the value string.

    +

    Ports

    +

    To accompany the addition of Ports into the FMOD Studio tool an additional API was necessary for setting the port index. In the Core API, System::attachChannelGroupToPort would accept both a port type and an index in order to disambiguate between multiple ports targeting the same device type, for example controller speakers. In the Studio API the port type is set on a bus at design time, for ports that require disambiguation you can now use Studio::Bus::setPortIndex to provide that value and Studio::Bus::getPortIndex to query it back.

    +

    With this change we have now unified all port types previously spread over platform specific APIs in the form of FMOD_<PLATFORM>_PORT_TYPE. Now you can find the complete set in the FMOD_PORT_TYPE enumeration with information of availability in each platforms getting started guide.

    +

    Platform Notes

    +
      +
    • Added support for Windows N versions by separating MediaFoundation into a separate DLL
    • +
    • Linux is now built with LLVM / Clang 10, lifting 32bit min-spec to ARMv7 (with NEON) and adding 64bit support
    • +
    • Android minimum API version raised to 16 for 32bit
    • +
    • Renamed PS5 specific APIs and headers from codename to official name
    • +
    +

    API Differences

    +

    APIs that have changed with this release that haven't been called out explicitly above.

    +

    Studio API

    + +

    Core API

    + +

    Output Plugin API

    + +

    Codec Plugin API

    + +

    FSBank API

    + +

    What's new since 2.01 initial release?

    +

    This section describes any major changes that occurred in 2.01.xx leading up to the release of 2.02.

    +

    Platforms

    +
      +
    • Added Apple Silicon, PS5 and Game Core platforms
    • +
    • Added microphone recording support to Stadia
    • +
    • Optimized convolution reverb performance and memory usage
    • +
    +

    API differences

    +

    APIs that have changed with this release that haven't been called out explicitly above.

    +

    Studio API

    + +

    Core API

    +
    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-203.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-203.html new file mode 100644 index 0000000..671f24a --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome-whats-new-203.html @@ -0,0 +1,165 @@ + + +Welcome to the FMOD Engine | New in FMOD Engine 2.03 + + + + +
    + +
    +

    1. Welcome to the FMOD Engine | New in FMOD Engine 2.03

    + +

    What's New in 2.03?

    +

    This section describes the major features introduced in the 2.03 release. See the Detailed Revision History for information regarding each patch release.

    +

    Echo Improvements

    +

    Changes in delay time can now be ramped gradually using FMOD_DSP_ECHO_DELAYCHANGEMODE_LERP. This mode is best suited for small changes in delay, otherwise a noticeable warping effect can occur. This warping can be used for simulating doppler, and as an effect with large parameter changes.

    +

    The existing delay change mode of FMOD_DSP_ECHO_DELAYCHANGEMODE_FADE has been made the default, and is best suited to large changes in delay time. With small changes, a noticeable zipper effect can occur.

    +

    EQ Improvements

    +

    The Multiband EQ effect now has low-overhead 6dB highpass and lowpass filters.

    +

    The 6dB lowpass filter can be set with FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_6DB, and uses an efficient one-pole low pass design.

    +

    The 6dB highpass can be set with FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_6DB, and uses a slightly less efficient one-pole one-zero highpass design.

    +

    FFT Improvements

    +

    Hardware offloading of the FFT DSP can now be enabled using FMOD_DSP_FFT_IMMEDIATE_MODE.

    +

    The RMS value of the analysis band's spectral components can now be queried using FMOD_DSP_FFT_RMS. The analysis band's range can now be set with FMOD_DSP_FFT_BAND_START_FREQ and FMOD_DSP_FFT_BAND_STOP_FREQ.

    +

    FMOD_DSP_FFT_DOWNMIX and FMOD_DSP_FFT_CHANNEL have been added to provide greater control over how the input signal is processed and which part of a spectrum is analyzed.

    +

    Multiband Dynamics

    +

    A new DSP effect has been added, FMOD_DSP_MULTIBAND_DYNAMICS. This plugin can be used to compress or expand the dynamic range of a signal within three separate frequency bands.
    +The Multiband Dynamics plugin operates similarly to the existing FMOD_DSP_COMPRESSOR plugin, providing gain, threshold, ratio, attack and release controls to alter the envelope of the signal. The difference is that the Multiband Dynamics plugin can perform this same processing in a limited frequency range, and rather than just attenuating the signal above the threshold it can also be configured to amplify or attenuate the signal above or below the threshold.

    +

    Here are the different modes available in each band, as well as some suggested use cases for them:

    +

    Upward Compression

    +

    This mode can be set with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_UP to amplify the signal below the threshold.
    +Upward Compression can be useful for bringing out quieter details in sounds, such as breath in the middle frequency range of vocals, or fret noise in the upper frequency range of a guitar.

    +

    Downward Compression

    +

    This mode can be set with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_COMPRESS_DOWN to attenuate the signal above the threshold.
    +This is the mode that the existing FMOD Compressor uses, and is useful for bringing down harsh percussive sounds, such as plosives and sibilance in the upper frequency range.

    +

    Upward Expansion

    +

    This mode can be set with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_UP to amplify the signal above the threshold.
    +Upward Expansion can easily cause clipping, so use with caution, but can be useful for bringing percussive sounds forward, such as snares in the upper frequency range or explosions in the lower frequency range.

    +

    Downward Expansion

    +

    This mode can be set with FMOD_DSP_MULTIBAND_DYNAMICS_MODE_EXPAND_DOWN to attenuate the signal below the threshold.
    +Downward Epansion be useful for removing noise in the signal, such as bird chirps in the upper frequency range, or room tone in the lower frequency range.

    +

    Passthrough Ports

    +

    A new port type has been added, FMOD_PORT_TYPE_PASSTHROUGH, to bypass the binauralization applied to all sounds by WinSonic and PS5.

    +

    You can use this port type to preserve multi-channel layouts for non-diegetic sounds.

    +

    VR Vibration

    +

    Controller vibration for VR devices that support vibration, such as the PlayStation VR2 Sense™ controller, can now be controlled by FMOD_PORT_TYPE_VR_VIBRATION Ports.

    +

    To use VR vibration ports in the Core API call System::attachChannelGroupToPort, passing in FMOD_PORT_TYPE_VR_VIBRATION for the portType and the controller's user id for the portIndex.

    +

    For the Studio API, you must create a Port Bus in FMOD Studio, set to the "VR Vibration" port type, and route audio into the Port. Then in the API, retrieve the Port with Studio::System::getBus and call Studio::Bus::setPortIndex with the controller's user id to route the Port's audio to the controller.

    +

    Platform Notes

    +
      +
    • Changed default dsp buffer size on Windows from 512 to 1024
    • +
    • Removed Fastcomp support for HTML5
    • +
    • Android minimum version raised to SDK 21 and NDK 26b
    • +
    • Unity Editor minimum version raised to 2021.3
    • +
    • Profiler & FSBank tool minimum macOS version raised to 11.0
    • +
    • Profiler & FSBank tool minimum Windows version raised to Win10 1809
    • +
    • Profiler & FSBank tool minimum Linux GNU C library version raised to GLIBC_2.28
    • +
    +

    API Differences

    +

    APIs that have changed with this release that haven't been called out explicitly above.

    +

    Studio API

    + +

    Core API

    +
      +
    • Modified FMOD_DSP_TYPE_FFT to add FMOD_DSP_FFT_BAND_START_FREQ, FMOD_DSP_FFT_BAND_STOP_FREQ, FMOD_DSP_FFT_DOWNMIX, FMOD_DSP_FFT_CHANNEL, and FMOD_DSP_FFT_IMMEDIATE_MODE
    • +
    • Modified System::getVersion to output build number from second argument
    • +
    • Removed FMOD_DSP_TYPE_ENVELOPEFOLLOWER
    • +
    • Removed FMOD_DSP_TYPE_LADSPAPLUGIN
    • +
    • Removed FMOD_DSP_TYPE_VSTPLUGIN
    • +
    • Removed FMOD_DSP_TYPE_WINAMPPLUGIN
    • +
    • Removed FMOD_PORT_INDEX_FLAG_VR_CONTROLLER
    • +
    • Renamed F_CALLBACK to F_CALL
    • +
    • Renamed FMOD_DSP_FFT_DOMINANT_FREQ to FMOD_DSP_FFT_SPECTRAL_CENTROID
    • +
    • Renamed FMOD_DSP_FFT_WINDOW to FMOD_DSP_FFT_WINDOW_TYPE
    • +
    • Renamed FMOD_DSP_FFT_WINDOWTYPE enum value to FMOD_DSP_FFT_WINDOW_TYPE
    • +
    +

    What's New Since 2.02 Initial Release?

    +

    This section describes any major changes that occurred in 2.02.xx leading up to the release of 2.03.

    +

    Platforms

    +
      +
    • Removed support for Stadia
    • +
    • Added Open Harmony platform
    • +
    • Added support for Vision Pro, and Windows arm64 devices
    • +
    • Added support for hardware offloaded convolution reverb on XSX and PS5
    • +
    • Added support for hardware echo cancellation on Android and iOS
    • +
    +

    API Differences

    +

    APIs that have changed with this release that haven't been called out explicitly above.

    +

    Studio API

    + +

    Core API

    + +

    FSBank API

    +
    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome.html new file mode 100644 index 0000000..31a3644 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/welcome.html @@ -0,0 +1,48 @@ + + +Welcome to the FMOD Engine + + + + +
    + +
    +

    1. Welcome to the FMOD Engine

    +

    Welcome to the FMOD Engine user manual. Here you will find information regarding the functionality and use of each API provided.

    +

    If you want your team to design sound for your game using a user-friendly DAW-like interface, the best starting point is the Studio API guide used alongside the Studio API reference. The Studio API plays back content created in FMOD Studio, our adaptive audio content creation tool. Studio's data-driven approach and rich graphical user interface make audio behaviors easily accessible and editable to sound designers.

    +

    If your project has custom requirements that go beyond what the Studio API offers, the Core API provides fast and flexible access to low-level audio primitives. Start with the Core API guide along side the Core API reference.

    +

    Additionally, to integrate the creation of compressed assets using the FSB file format into your tools and development pipelines, use the FSBank API reference.

    +

    Whether you're developing with the Studio API or Core API, it's important to consider your target platform and any specific functionality, compatibility and requirements it may have. You can see this in the platform details chapter.

    +

    If you are a plug-in developer, read the Plug-in API Reference for the particular type of plug-in you're interested in creating.

    +

    There is also a collection of white paper style documents that discuss various features and concepts available in FMOD.

    +

    If you are migrating to a newer major version of FMOD, make sure to check out the "New in FMOD Engine" sections for new, changed and removed API's.

    +

    For information on using any FMOD example code from this documentation in your own programs, please visit https://www.fmod.com/legal.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-3d-reverb.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-3d-reverb.html new file mode 100644 index 0000000..70066a6 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-3d-reverb.html @@ -0,0 +1,80 @@ + + +White Papers | 3D Reverb + + + + +
    + +
    +

    5. White Papers | 3D Reverb

    + +

    3D Reverb

    +

    It is common for environments to exhibit different reverberation characteristics in different locations. Ideally as the listener moves throughout the virtual environment, the sound of the reverberation should change accordingly. This change in reverberation properties can be modeled in FMOD Studio by using the built in Reverb3D API.

    +

    3D Reverbs

    +

    The 3D reverb system works by allowing you to place multiple virtual reverbs within the 3D world. Each reverb defines:

    +
      +
    • Its position within the 3D world
    • +
    • The area, or sphere of influence affected by the reverb (with minimum and maximum distances)
    • +
    • The reverberation properties of the area
    • +
    +

    At runtime, the FMOD Engine interpolates (or morphs) between the characteristics of 3D reverbs according to the listener's proximity and the position and overlap of the reverbs. This method allows FMOD Studio to use a single reverb DSP unit to provide a dynamic reverberation within the 3D world. This process is illustrated in the image below.

    +

    3D Reverb

    +

    When the listener is within the sphere of effect of one or more 3D reverbs, the listener hears a weighted combination of the affecting reverbs. When the listener is outside the coverage of all 3D reverbs, the reverb is not applied. It is important to note that by default, 2D sounds share this same reverb DSP instance, so to avoid 2D sounds having reverb, use ChannelControl::setReverbProperties and set wet = 0, or shift the 2D Sounds to a different reverb DSP instance, using the same function (adding a 2nd reverb will incur a small CPU and memory hit).

    +

    The interpolation of 3D reverbs is only an estimation of how the multiple reverberations within the environment may sound. In some cases, greater realism is required. In these situations we suggest using multiple reverbs as described in the tutorial 'Using multiple reverbs'.

    +

    Create a 3D Reverb

    +

    We will now create a virtual reverb, using the call System::createReverb3D, then set the characteristics of the reverb using Reverb3D::setProperties.

    +
    FMOD::Reverb *reverb;
    +result = system->createReverb3D(&reverb);
    +FMOD_REVERB_PROPERTIES prop2 = FMOD_PRESET_CONCERTHALL;
    +reverb->setProperties(&prop2);
    +
    + +

    Set 3D Attributes

    +

    The 3D attributes of the reverb must now be set. The method Reverb3D::set3DAttributes allows us to set the origin position, as well as the area of coverage using the minimum distance and maximum distance.

    +
    FMOD_VECTOR pos = { -10.0f, 0.0f, 0.0f };
    +float mindist = 10.0f; 
    +float maxdist = 20.0f;
    +reverb->set3DAttributes(&pos, mindist, maxdist);
    +
    + +

    As the 3D reverb uses the position of the listener in its weighting calculation, we also need to ensure that the location of the listener is set using System::set3dListenerAtrributes.

    +
    FMOD_VECTOR  listenerpos  = { 0.0f, 0.0f, -1.0f };
    +system->set3DListenerAttributes(0, &listenerpos, 0, 0, 0);
    +
    + +

    All done!

    +

    This is all that is needed to get virtual 3d reverb zones to work. From this point onwards, based on the listener position, reverb presets should morph into each other if they overlap, and attenuate based on the listener's distance from the 3D reverb sphere's center.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-3d-sounds.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-3d-sounds.html new file mode 100644 index 0000000..9847961 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-3d-sounds.html @@ -0,0 +1,132 @@ + + +White Papers | 3D Sounds + + + + +
    + +
    +

    5. White Papers | 3D Sounds

    + +

    3D Sounds

    +

    This section will introduce you to using 3D sound with the Core API. With it, you can easily implement interactive 3D audio and have access to features such as 5.1 or 7.1 speaker output, and automatic attenuation, doppler and more advanced psychoacoustic 3D audio techniques.

    +

    For information specific to the Studio API and FMOD Studio events, see the Studio API 3D Events white paper.

    +

    Loading sounds as '3D'

    +

    When loading a sound or sound bank, the sound must be created with System::createSound or System::createStream using the FMOD_3D flag. ie.

    +
    result = system->createSound("../media/drumloop.wav", FMOD_3D, 0, &sound);
    +if (result != FMOD_OK)
    +{
    +    HandleError(result);
    +}
    +
    + +

    It is generally best not to try and switch between 3D and 2D at all, if you want though, you can change the Sound or Channel's mode to FMOD_3D_HEADRELATIVE at runtime which places the sound always relative to the listener, effectively sounding 2D as it will always follow the listener as the listener moves around.

    +

    Distance models and linear roll-off vs inverse

    +

    Inverse

    +

    This is the default FMOD 3D distance model. All sounds naturally attenuate (fade out) in the real world using an inverse distance attenuation. The flag to set to this mode is FMOD_3D_INVERSEROLLOFF but if you're loading a sound you don't need to set this because it is the default. It is more for the purpose or resetting the mode back to the original if you set it to FMOD_3D_LINEARROLLOFF at some later stage.

    +

    When FMOD uses this model, 'mindistance' of a Sound / Channel, is the distance that the sound starts to attenuate from. This can simulate the sound being smaller or larger. By default, for every doubling of this mindistance, the sound volume will halve. This roll-off rate can be changed with System::set3DSettings.

    +

    As an example of relative sound sizes, we can compare a bee and a jumbo jet. At only a meter or 2 away from a bee we will probably not hear it any more. In contrast, a jet will be heard from hundreds of meters away. In this case we might set the bee's mindistance to 0.1 meters. After a few meters it should fall silent. The jumbo jet's mindistance could be set to 50 meters. This could take many hundreds of meters of distance between listener and sound before it falls silent. In this case we now have a more realistic representation of the loudness of the sound, even though each wave file has a fully normalized 16bit waveform within. (ie if you played them in 2D they would both be the same volume).

    +

    The 'maxdistance' does not affect the rate of roll-off, it simply means the distance where the sound stops attenuating. Don't set the maxdistance to a low number unless you want it to artificially stop attenuating. This is usually not wanted. Leave it at its default of 10000.0.

    +

    Linear and Linear Squared

    +

    These are an alternative distance model that FMOD has introduced. It is supported by adding the FMOD_3D_LINEARROLLOFF or FMOD_3D_LINEARSQUAREROLLOFF flag to System::createSound or Sound::setMode / ChannelControl::setMode. This is a more fake, but usually more game programmer friendly method of attenuation. It allows the 'mindistance' and 'maxdistance' settings to change the attenuation behavior to fading linearly between the two distances. Effectively the mindistance is the same as the logarithmic method (ie the minimum distance before the sound starts to attenuate, otherwise it is full volume), but the maxdistance now becomes the point where the volume = 0 due to 3D distance. The attenuation in-between those 2 points is linear or linear squared.

    +

    Some global 3D settings

    +

    The 3 main configurable settings in the FMOD Engine that affect all 3D sounds are:

    +
      +
    • Doppler factor. This is just a way to exaggerate or minimize the doppler effect.
    • +
    • Distance factor. This allows the user to set FMOD to use units that match their own (ie centimeters, meters, feet)
    • +
    • Roll-off scale. Affects 3d sounds that use roll-off modes other than FMOD_3D_CUSTOMROLLOFF. Controls how quickly such sounds attenuate as distance increases.
    • +
    +

    All 3 settings can be set with System::set3DSettings. Generally the user will not want to set these.

    +

    Velocity and keeping it frame rate independent

    +

    Velocity is only required if you want doppler effects. Otherwise you can pass 0 or NULL to both System::set3DListenerAttributes and ChannelControl::set3DAttributes for the velocity parameter, and no doppler effect will be heard.

    +

    It is important that the velocity passed to the FMOD Engine is in meters per second and not meters per frame. To get the correct velocity vector, use vectors from your game's physics code etc. Don't just subtract the last frame's position from the current position, as this is affected by framerate, meaning that the higher the framerate the smaller the position deltas and thus the smaller the doppler effect, which is incorrect.

    +

    If the only way you can get the velocity is to subtract this and last frame's position vectors, then remember to time adjust them from meters per frame back up to meters per second. This is done simply by scaling the difference vector obtained by subtracting the 2 position vectors, by one over the frame time delta.

    +

    Here is an example.

    +
    velx = (posx-lastposx) * 1000 / timedelta;
    +velz = (posy-lastposy) * 1000 / timedelta;
    +velz = (posz-lastposz) * 1000 / timedelta;
    +
    + +

    timedelta is the time since the last frame in milliseconds. This can be obtained with functions such as timeGetTime(). So at 60fps, the timedelta would be 16.67ms. if the source moved 0.1 meters in this time, the actual velocity in meters per second would be:

    +
    vel = 0.1 * 1000 / 16.67 = 6 meters per second.
    +
    + +

    Similarly, if we only have half the framerate of 30fps, then subtracting position deltas will gives us twice the distance that it would at 60fps (so it would have moved 0.2 meters this time).

    +
    vel = 0.2 * 1000 / 33.33 = 6 meters per second.
    +
    + +

    Orientation and left-handed vs right-handed coordinate systems

    +

    Getting the correct orientation set up is essential if you want the source to move around you in 3D space.

    +

    By default FMOD uses a left-handed coordinate system. If you are using a right-handed coordinate system then FMOD must be initialized by passing FMOD_INIT_3D_RIGHTHANDED to System::init. In either case FMOD requires that the positive Y axis is up and the positive X axis is right, if your coordinate system uses a different convention then you must rotate your vectors into FMOD's space before passing them to FMOD.

    +

    Note for plug-in writers: FMOD always uses a left-handed coordinate system when passing 3D data to plug-ins. This coordinate system is fixed to use +X = right, +Y = up, +Z = forward. When the system is initialised to use right-handed coordinates FMOD will flip the Z component of vectors before passing them to plug-ins.

    +

    A typical game loop

    +

    3D sound and the FMOD channel management system need to be updated once per frame. To do this use System::update.

    +

    This would be a typical example of a game audio loop.

    +
    do
    +{
    +    UpdateGame();       // here the game is updated and the sources would be moved with channel->set3DAttibutes.
    +
    +    system->set3DListenerAttributes(0, &listener_pos, &listener_vel, &listener_forward, &listener_up);     // update 'ears'
    +
    +    system->update();   // needed to update 3d engine, once per frame.
    +
    +} while (gamerunning);
    +
    + +

    Most games usually take the position, velocity and orientation from the camera's vectors and matrix.

    +

    Stereo and multi-channel audio can be 3D!

    +

    A stereo sound when played as 3d, will be split into 2 mono voices internally which are separately 3d positionable. Multi-channel audio formats are also supported, so an 8 channel sound for example will allocate 8 mono voices internally in FMOD. To rotate the left and right part of the stereo 3d sound in 3D space, use the ChannelControl::set3DSpread function. By default the subchannels position themselves in the same place, therefore sounding 'mono'.

    +

    Split screen / multiple listeners

    +

    In some games, there may be a split screen mode. When it comes to audio, this means that the FMOD Engine has to know about having more than 1 listener on the screen at once. This is easily handled via System::set3DNumListeners and System::set3DListenerAttributes.

    +

    If you have 2 player split screen, then for each 'camera' or 'listener' simply call System::set3DListenerAttributes with 0 as the listener number of the first camera, and 1 for the listener number of the second camera. System::set3DNumListeners would be set to 2.

    +

    When using the Core, 3D Channels have the following behavior:

    +
      +
    • It turns off all doppler. This is because one listener might be going towards the sound, and another listener might be going away from the sound. To avoid confusion, the doppler is simply turned off.
    • +
    • All audio is mono. If to one listener the sound should be coming out of the left speaker, and to another listener it should be coming out of the right speaker, there will be a conflict, and more confusion, so all sounds are simply panned to the middle. This removes confusion.
    • +
    • Each sound is played only once as it would with a single player game, saving voice and cpu resources. This means the sound's effective audibility is determined by the closest listener to the sound. This makes sense as the sound should be the loudest to the nearest listener. Any listeners that are further away wouldn't have any impact on the volume at this point.
    • +
    +

    Speaker modes / output

    +

    To get 5.1 sound is easy. If the sound card supports it, then any sound using FMOD_3D will automatically position itself in a surround speaker system, and only the user has to be sure that the speaker settings in the operating system are correct so that the sound device can output the audio in 5.1 or 7.1. You do not need to set the speaker mode for FMOD.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-asynchronous-io.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-asynchronous-io.html new file mode 100644 index 0000000..d6fc69e --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-asynchronous-io.html @@ -0,0 +1,176 @@ + + +White Papers | Asynchronous I/O + + + + +
    + +
    +

    5. White Papers | Asynchronous I/O

    + +

    Asynchronous I/O and deferred file reading

    +

    This tutorial will describe how to defer file reading in FMOD so that you don't have to immediately satisfy FMOD's requests for data.
    +This sort of behavior is highly desirable in game streaming engines that do not have access to the data yet, or for when accessing data out of order or in a non sequential fashion would greatly degrade performance.
    +FMOD's asynchronous I/O callbacks will allow you to receive an FMOD read request and defer it to a later time when the game is ready. FMOD will use priorities to notify the game engine how urgent the read request is, as sometimes deferring a music stream read for example could result in stuttering audio.

    +

    Setup : Override FMOD's file system with callbacks

    +

    The idea is that you are wanting to override the file I/O that FMOD normally performs internally. You may have done this before with the System::setFileSystem by overriding the following callbacks:

    +
    FMOD_FILE_OPENCALLBACK  useropen
    +FMOD_FILE_CLOSECALLBACK  userclose
    +FMOD_FILE_READCALLBACK  userread
    +FMOD_FILE_SEEKCALLBACK  userseek
    +
    + +

    The normal behavior here is that you would need to satisfy FMOD's read and seek requests immediately in a blocking fashion.
    +In the open callback, you open your internal file handle and return it to FMOD, along with the file size.
    +You would have to set all callbacks or file system override would not work. Any callback that is null in the above callback list will cause FMOD to use the default internal system and ignore your callbacks. All callbacks must be set.

    +

    With async I/O, there are 2 new callbacks which you can use to replace the 'userread' and 'userseek' callbacks:

    +
    FMOD_FILE_ASYNCREADCALLBACK  userasyncread
    +FMOD_FILE_ASYNCCANCELCALLBACK  userasynccancel
    +
    + +

    If these callbacks are set, the 'userread' and 'userseek' callbacks are made redundant. You can of course keep 'userread' and 'userseek' defined if you want to switch between the 2 systems for some reason, but when 'userasyncread' is defined, the normal read/seek callbacks will never be called.

    +

    Defining the basics - opening and closing the file handle.

    +

    Before we start, we'll just define the open and close callback. A very simple implementation using stdio is provided below:

    +
    FMOD_RESULT F_CALL myopen(const char *name, unsigned int *filesize, void **handle, void **userdata)
    +{
    +    if (name)
    +    {
    +        FILE *fp;
    +
    +        fp = fopen(name, "rb");
    +        if (!fp)
    +        {
    +            return FMOD_ERR_FILE_NOTFOUND;
    +        }
    +
    +        fseek(fp, 0, SEEK_END);
    +        *filesize = ftell(fp);
    +        fseek(fp, 0, SEEK_SET);
    +
    +        *userdata = (void *)0x12345678;
    +        *handle = fp;
    +    }
    +
    +    return FMOD_OK;
    +}
    +
    +FMOD_RESULT F_CALL myclose(void *handle, void *userdata)
    +{
    +    if (!handle)
    +    {
    +        return FMOD_ERR_INVALID_PARAM;
    +    }
    +
    +    fclose((FILE *)handle);
    +
    +    return FMOD_OK;
    +}
    +
    + +

    Defining 'userasyncread'

    +

    The idea for asynchronous reading, is that FMOD will request data (note, possibly from any thread - so be wary of thread safety in your code!), but you don't have to give the data to FMOD immediately. You can return from the callback without giving FMOD any data. This is deferred I/O.

    +

    For example, here is a definition of an async read callback:

    +
    FMOD_RESULT F_CALL myasyncread(FMOD_ASYNCREADINFO *info, void *userdata)
    +{
    +    return PutReadRequestOntoQueue(info);
    +}
    +
    + +

    Note that we didnt actually do any read here. You can return immediately and FMOD will internally wait until the read request is satisfied. Note that if FMOD decides to wait from the main thread (which it will do often), then you cannot satisfy the queue from the main thread, you will get a deadlock. Just put the request onto a queue. We'll discuss how to let FMOD know that the data is ready in the next section.

    +

    There are a few things to consider here:

    +
      +
    • The callback could come from any thread inside FMOD's system. Usually this means FMOD's streaming thread, FMOD's file I/O thread, the main thread, or the FMOD_NONBLOCKING thread. Be thread safe! Use criticalsections around linked list/queue operations to avoid corruption of data.
    • +
    • Return code. This is usually a fatal, non disk related error such as not being able to add to the queue. This could be an out of memory error for example. Use FMOD_ERR_MEMORY as the return value if this is the case. Return FMOD_OK in normal cases. It normally won't be a return code related to a disk error. You have to set the 'result' code in the FMOD_ASYNCREADINFO structure to let FMOD know about a file based error.
    • +
    • Be wary that your queued command may need to be cancelled if the user decides to release the FMOD resource that is using that file, such as a sound. See the next section about myasynccancel in that case.
    • +
    • The FMOD_ASYNCREADINFO structure is where you fill in the data requested by FMOD. See below for a more detailed description of this structure and what is required to complete the read.
    • +
    +

    Defining 'userasynccancel'

    +

    If you have queued up a lot of read requests, and have not satisfied them yet, then it is possible that the user may want to release a sound before the request has been fulfilled (ie Sound::release is called).
    +In that case FMOD will call the async cancel callback to let you cancel any operations you may have pending, that are related to this file.

    +
    FMOD_RESULT F_CALL myasynccancel(void *handle, void *userdata)
    +{
    +    return SearchQueueForFileHandleAndRemove(info);
    +}
    +
    + +

    Note that the above callback implementation will search through our internal linked list (in a thread safe fashion), removing any requests from the queue so that they don't get processed after the Sound is released. If it is in the middle of reading, then the callback will wait until the read is finished and then return.
    +Do not return while a read is happening, or before a read happens, as the memory for the read destination will be freed and the deferred read will read into an invalid pointer.

    +

    Filling out the FMOD_ASYNCREADINFO structure when performing a deferred read

    +

    The FMOD_ASYNCREADINFO is the structure you will pass to your deferred I/O system, and will be the structure that you read and fill out when fulfilling the requests.

    +

    The structure exposes the features of the async read system. These are:

    +
      +
    • Priority is supported. FMOD will let the user know if the read is not important, mildly important, or extremely important. This will allow the user to reshuffle the queue to make important reads happen before non important reads.
    • +
    • Read completion is signalled by simply setting the 'result' code of FMOD_ASYNCREADINFO.
    • +
    • Memory does not need to be copied anywhere, you can read directly into FMOD's pointers which point directly to the internal file buffers.
    • +
    • You do not have to give FMOD all of the data, you can give a partial read result to the callback and FMOD will most likely just issue another read request later with a smaller byte value.
    • +
    +
    typedef struct {
    +  void *  handle;
    +  unsigned int  offset;
    +  unsigned int  sizebytes;
    +  int  priority;
    +  void *  buffer;
    +  unsigned int  bytesread;
    +  FMOD_RESULT  result;
    +  void *  userdata;
    +} FMOD_ASYNCREADINFO;
    +
    + +

    The first 4 members (handle, offset, sizebytes, priority) are read only values, which tell you about the file handle in question, where in the file it wants to read from (so no seek callbacks required!) and how many bytes it wants. The priority value tells you how important the read is as discussed previously.

    +

    The next 3 members (buffer, bytesread and result) are values you will fill in, and to let FMOD know that you have read the data.
    +Read your file data into buffer. sizebytes is how much you should be reading. bytesread is how much you actually read (this could be less than sizebytes).
    +If you hit the 'end of file' condition and need to return less bytes than were requested - set bytesread to less than sizebytes, and then set the result to FMOD_ERR_FILE_EOF.

    +

    Set the result last!

    +

    Note! Do not set the result before setting the bytesread value and reading the data into buffer.
    +The initial value for result, is going to be FMOD_ERR_NOTREADY. When you set the value to FMOD_OK (or appropriate error code) then internally FMOD will immediately see this as an indication to continue, so if the bytesread or buffer contents are not ready, you will get corruption, errors or unexpected behavior.
    +So to summarize, the last thing you will do before finishing your queue process is to set result. You will not set it before setting bytesread or filling in buffer.

    +

    Threading issues & read priorities

    +

    As mentioned earlier in this tutorial, FMOD can call the read callback from various different threads, so it is common sense to protect your I/O system from operations happening simultaneously from different threads.

    +

    A system that would use FMOD's async I/O feature would most likely be running in its own thread. This is so the blocking wait loops in FMOD's loading calls are not forever waiting for data because the user can't provide it to FMOD.
    +If the system runs in another thread, it can detect the queue insert, and process the data while FMOD is waiting.

    +

    It is actually possible to complete the read as if it wasn't deferred, and do a direct file read into the buffer and set sizebytes/result values from the FMOD async read callback. This is a possible way to reduce delays for extremely urgent FMOD reads.

    +

    Currently there are 3 different categories of read priority.

    +
      +
    • 0 = low priority. These reads are usually blocking style reads that come from a user load command, and there are no real negative side effects of delaying the read except that the load function takes longer. These reads are going to be issued from a System::createSound call for example.
    • +
    • 50 = medium priority. These reads are important, and usually come from the FMOD stream system. They can be delayed, but not for too long. If the delay is too long, then audio streams will starve, and possibly stutter. If you need to delay the read longer, the FMOD file buffer size can be increased with System::setStreamBufferSize
    • +
    • 100 = high priority. Currently the highest priority read issued by FMOD is when an audio stream loops. It must internally flush the stream buffer after a seek to loop start, and do so before the stream 'decode buffer' (the PCM double-buffer that the stream decoder decodes into) loops around and starts stuttering (this is a different buffer to the previously mentioned stream buffer. That one contains compressed file data. The decode buffer contains decompressed PCM data). The decode buffer is usually small so it is important to get the read done fast, but the user can also increase these buffers with FMOD_CREATESOUNDEXINFO::decodebuffersize. FMOD_ADVANCEDSETTINGS::defaultDecodeBufferSize can also be used to set all future decode buffer sizes for all streams without having to set it every time, and is going to be used for the Event System because decode buffer size is not something you can set for events individually.
    • +
    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-cpu-performance.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-cpu-performance.html new file mode 100644 index 0000000..bf1a706 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-cpu-performance.html @@ -0,0 +1,98 @@ + + +White Papers | CPU Performance + + + + +
    + +
    +

    5. White Papers | CPU Performance

    + +

    CPU Performance

    +

    Measuring and tweaking performance is an important part of developing any application, and being able to scale FMOD from low power portable devices to the very latest in next gen consoles is key to our design. This guide should give you a solid understanding of how to configure FMOD to fit within your audio budget, no matter which platforms you're targeting.

    +

    Before we jump into the details, let's first consider how performance is measured in FMOD. The primary metric we use, when discussing how expensive something is, is CPU percentage. We can calculate this by measuring the time spent performing an action and comparing it against a known time window; the most common example of this is DSP or mixer performance.

    +

    What is the mixer and how is it measured?

    +

    When we talk about mixer performance we are actually talking about the production of audio samples being sent to the output (usually your speakers). At regular intervals, our mixer produces a buffer of samples which represents a fixed amount of time for playback. We call this a DSP block. DSP block size often defaults to 512 samples, which when played back at 48 kHz represents ~10ms of audio.

    +

    With a fixed amount of samples being produced regularly, we can now measure how long it takes to produce those samples and receive a percentage. For example, if it took us 5ms of CPU time to produce 10ms of audio, our mixer performance would be 50%. As the CPU time approaches 10ms we risk not delivering the audio in time which results in an audio discontinuity known as stuttering.

    +

    What else can be measured?

    +

    Another key performance area is update, this operation is called regularly to do runtime housekeeping. Our recommendation is you call update once per render frame which is often 30 or 60 times per second. Using the 30 or 60 FPS (frames per second) known time frame we can now measure CPU time spent performing this action to get percentages.

    +

    Armed with the ability to measure performance we now need to identify the things that cost the bulk of the CPU time. The most commonly quoted contributor is Channel count, following the logic that playing more Channels takes up more CPU time. Following is a list of the main contributors to the cost of sound playback:

    +
      +
    • Decoding compressed audio to PCM.
    • +
    • Resampling the PCM to the appropriate pitch.
    • +
    • Applying DSP effects to the Channel.
    • +
    • Mixing the audio with other sounds to produce the final output you hear.
    • +
    +

    Choosing the correct compression format for the kind of audio you want to play and the platform you want to play it on is a big part of controlling the CPU cost. For recommendations on format choice please consult the performance reference for this platform.

    +

    Voice Limiting

    +

    Once you've settled on a compression format you need to decide how many Channels of that format you want to be audible at the same time. There are three ways you can use to control the number of Channels playable:

    +

    System::init (maxChannels, ...) The maximum number of Channels playing at once.
    +System::setSoftwareChannels (numSoftwareChannels) The maximum number of software mixed Channels at any one time.
    +FMOD_ADVANCEDSETTINGS max???Codec The maximum number of decoders where ??? is the compression format.
    +For a deep dive into how the virtual voice system works and ways to further control Channel count please consult the [Virtual Voice System](white-papers-virtual-voices.html] white paper.

    +

    It's often hard to gauge what are good values to use for the above three settings. In rough terms maxChannels should be high enough that you don't hit the cap under normal circumstances, so 256, 512 or even 1024 are reasonable choices. Selecting the values for numSoftwareChannels and maxCodecs depends on the platform and format used. To help choose these values we have provided some recommendations and benchmarks in the performance reference document for this platform.

    +

    Tips and Tricks

    +

    With a correctly configured compression format and appropriate Channel count you are well on your way to an efficiently configured set up. Next up is a series of tips to consider for your project, not all are applicable but they should be considered to get the best performance from FMOD.

    +

    Sample Rate

    +

    There are two sample rates you need to think about when optimizing, the System rate and the source audio rate.

    +

    You can control the System sample rate by using System::setSoftwareFormat (sampleRate, ...), which by default is 48 kHz. Reducing this can give some big wins in performance because less data is being produced. This setting is a trade off between performance and quality.

    +

    To control the source audio rate you can resample using your favorite audio editor or use the sample rate settings when compressing using the FSBank tool or the FSBankLib API. All audio is sent to a resampler when it is played at runtime, if the source sample rate and the System rate match then the resampler can be essentially skipped saving CPU time. Be aware that this only happens if there are no pitch / frequency settings applied to the Channel, so this trick is often good for music.

    +

    DSP Block Size

    +

    As mentioned earlier, this represents a fixed amount of samples that are produced regularly to be sent to the speakers. When producing each block of samples there is a fixed amount of overhead, so making the block size larger reduces the overall CPU cost. You can control this setting with System::setDSPBufferSize (blockLength, ...), which often defaults to 512 or 1024 samples depending on the platform.

    +

    The trade off with this setting is CPU against mixer granularity, for more information about the implications of changing this setting please consult the API reference for that function.

    +

    Channel Count

    +

    This section refers to channel count in the context of channels as they exist in audio files.
    +Controlling how many channels of audio are being played can have a big impact on performance, consider the simple math that 7.1 surround has four times as much data to process compared with stereo. There are a few different places where channel count can be controlled to improve performance.

    +

    The source audio channel count should be carefully chosen, often mono sources are best, especially for sound that is positioned in 3D. Reducing the channel count at the source is an easy win and also decreases the decoding time for that sound.

    +

    Setting the System channel count controls how 3D sounds are panned when they are given a position in the world. You set this channel count by specifying a speaker mode that represents a well known speaker configuration such as 7.1 surround or stereo. To do this use System::setSoftwareFormat (..., speakerMode, ...), the default matches your output device settings.

    +

    As a more advanced setting you can limit the number of channels produced by a sub-mix or the number of channels entering a particular DSP effect. This can be especially useful for limiting the channels into an expensive effect. The API to control this is DSP::setChannelFormat(..., speakerMode), by default this is the output of the previous DSP unit.

    +

    DSP Choice

    +

    Not all DSPs are created equal. Some are computationally simple and use very little CPU, others can be quite expensive. When deciding to use a particular effect it is important to profile on the target hardware to fully understand the CPU implications.

    +

    The positioning of an effect in the DSP graph can make a big difference on a game's resource cost. Placing an effect on every channel routed into a channel group means it can affect each of those channels differently, but costs a lot more CPU time than placing that effect only on the channel group. There are no strict rules for where each effect should be positioned, but to give an example, multiband equalizer DSP effects are cheap enough that they can often be applied to every channel without straining a game's resource budget, and the SFX reverb DSP effect is expensive enough that it's more common to add a single instance of it to a channel group so that it's applied to the sub-mix.

    +

    Hardware Decoding

    +

    Some platforms have access to hardware assisted decoders, which offload the processing from the CPU to dedicated decoding hardware. These can be utilized by building banks with the corresponding platform's format, such as AT9, XMA, or Opus.

    +

    When using hardware assisted decoders with streams, each Channel reserves a hardware decoder for the lifetime of the Channel. This means that the Virtual Voice System is not able to steal any hardware decoders that are in use. As a result, if all hardware decoders are in use, new streamed Channels cannot play until an existing streamed Channel stops and yields its decoder. Therefore, you should not rely on the Virtual Voice System to cull streamed Channels when using hardware decoders. Treat hardware decoders as you would any other limited resource, only using what you need and freeing Channels when they are no longer required.

    +

    Wrapping Up

    +

    Hopefully now you have a good understanding of the options available for optimizing your usage of FMOD. If in doubt about your particular set up, please make a post on our forums and start a discussion.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-dsp-architecture.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-dsp-architecture.html new file mode 100644 index 0000000..6de6c91 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-dsp-architecture.html @@ -0,0 +1,217 @@ + + +White Papers | DSP Architecture and Usage + + + + +
    + +
    +

    5. White Papers | DSP Architecture and Usage

    + +

    DSP Architecture and Usage

    +

    This section will introduce you to the FMOD Engine's DSP system. With this system you can implement custom filters or create complicated signal chains to create high quality and dynamic sounding audio. The DSP system is an incredibly flexible mixing engine that has an emphasis on quality, flexibility and efficiency, and makes it an extremely powerful system when used to its full potential.

    +

    The figure below shows a representation of what a very basic FMOD DSP graph looks like.

    +

    DSP Network

    +

    Audio data flows from the right to the left, tail to head, until it finally arrives at the soundcard, fully mixed and processed.

    +
      +
    • A blue box is a DSP unit. This unit is represented by the DSP class in the Core API header.
    • +
    • A line between the boxes, is an DSPConnection. This is what links the DSP units together into a DSP graph. Each DSPConnection has a pan matrix which you can use to configure the mapping from input speakers/channels to output speakers/channels.
    • +
    • The green vertical bars inside the grey bars are detected signal levels. You can see that the WaveTable unit produces a mono signal, that mono signal continues through the Channel Fader (untouched) then gets upmixed to 6 channels (5.1). Because the default pan for a mono sound to a 5.1 output is to have the mono signal attenuated by 3db to the Front Left speaker, and the signal attenuated by 3db to the Front Right speaker, you can see that the 6 grey bars have only signal in the first 2 speaker levels. See FMOD_SPEAKER for the speaker order, represented by those bars. Note: Since FMOD Engine version 1.04.08, the upmix happens internally, beyond the master ChannelGroup's fader; so for the purposes of this tutorial, the master ChannelGroup's fader has been forced to FMOD_SPEAKERMODE_5POINT1 so that it can be visualized. More about channel formats can be read below in the "Set the output format of a DSP unit, and control the pan matrix for its output signal" section.
    • +
    +

    The above image, excluding the annotation, was taken using the FMOD Profiler. You can profile your own DSP graph as long as you specify FMOD_INIT_PROFILE_ENABLE when initializing the Core API. The tool is located in the /bin directory of the SDK.

    +

    Some common units in a DSP graph

    +

    This section will describe the units in more detail, from the origin of the data through to the soundcard, from right to left. The following list describes some of the typical DSP units you will see in a graph.

    +
      +
    • Wavetable Unit This unit reads raw PCM data from the sound buffer and resamples it to the system sample rate. A Wavetable Unit is only connected when the user calls System::playSound. Once resampled, the audio data is then processed (or flows) at the rate of the system sample rate. The system sample rate is 48khz by default or 24khz on iOS and Android, but can be manually set to a different value using System::setSoftwareFormat.
    • +
    • DSPCodec Unit This unit reads decodes compressed data from an FMOD Codec, and passes it to a built in resampler, and then passes the decompressed result to the output.
    • +
    • Channel Fader This unit provides a top level unit for a Channel to hold onto, and is a place to insert effects for a Channel. A Channel Fader also controls the volume level of a Channel, for example if the user calls ChannelControl::setVolume.
    • +
    • ChannelGroup Fader This unit provides a top level unit for a ChannelGroup to hold onto, and is a place to insert effects for a ChannelGroup. A ChannelGroup Fader also controls the volume level of a Channel, for example if the user calls ChannelControl::setVolume.
    • +
    +

    When FMOD plays a PCM sound on a Channel (using System::playSound), it creates a small sub-graph consisting of a fader and a Wavetable Unit. This would also happen if playing a stream, even if the source data is compressed.

    +

    When FMOD plays a compressed sound on a Channel (MP3/Vorbis/XMA/ADPCM usually, loaded with FMOD_CREATECOMPRESSEDSAMPLE), it creates a similar small sub-graph consisting of a Fader and a DSPCodec Unit.

    +

    When FMOD plays a DSP on a Channel (using System::playDSP), it creates a small sub-graph consisting of a Fader and a standalone Resampler Unit. The DSP that was specified by the user executed by the resampler as a sub-graph to the resampler, and is not visible on the profiler.

    +

    Watch a DSP graph get built (with code examples)

    +

    Start off with nothing, then play some sounds

    +

    In this section we will look at some basic techniques that can be used to manipulate DSP graphs. We shall start with the most basic signal chain (as shown in the image below) and identify the changes that occur to the DSP graph with the provided code.

    +

    DSP Network

    +

    Note that the graph only exists of 1 unit, the Master ChannelGroup's DSP Fader Unit (FMOD_DSP_TYPE_FADER). This unit can be used to control the mix output of the entire mix if desired.

    +

    Now we shall play a PCM sound with System::playSound.

    +

    DSP Network

    +

    Note that the sub-graph of a DSP Fader unit (FMOD_DSP_TYPE_FADER), and a system level DSP WaveTable unit have been attached to the Master ChannelGroup's DSP Fader unit.

    +

    Let's play the sound again, resulting in 2 channels being active.

    +

    DSP Network

    +

    Note now that the new Channel targets the same Master ChannelGroup DSP Fader unit, and when 2 lines merge into 1 unit, a 'mix' happens. This is just a summing of the 2 signals together.

    +

    Add a DSP effect to a Channel

    +

    In this example we shall add an effect to a sound by connecting a DSP effect unit to the Channel. The code below starts by playing a sound, then creates a DSP unit with System::createDSPByType and adds it to the DSP graph using ChannelControl::addDSP.

    +
    FMOD::Channel *channel;
    +FMOD::DSP *dsp_echo;
    +result = system->playSound(sound, 0, false, &channel);
    +result = system->createDSPByType(FMOD_DSP_TYPE_ECHO, &dsp_echo);
    +result = channel->addDSP(0, dsp_echo);
    +
    + +

    The figure below shows the FMOD Echo effect inserted at the 'Channel head' or position 0, as specified with the ChannelControl::addDSP command (position = 0). The Channel Fader which used to be the head unit, is now shuffled down to position 1.

    +

    DSP Network

    +

    If we call ChannelControl::setDSPIndex

    +
    result = channel->setDSPIndex(dsp_echo, 1);
    +
    + +

    We can see below, that the echo has now moved down one, and Channel Fader is back at position 0.

    +

    DSP Network

    +

    Create a new ChannelGroup and add our Channel to it
    +In this example we shall introduce ChannelGroups which are effectively used as sub-mix buses. We can add an effect to a ChannelGroup and if Channels are assigned to that ChannelGroup, all Channels will be affected by any DSP inserted into a ChannelGroup.

    +

    These ChannelGroups can then be nested and manipulated to create hierarchical mixing.

    +
    result = system->createChannelGroup("my channelgroup", &channelgroup);
    +result = channel->setChannelGroup(channelgroup);
    +
    + +

    DSP Network

    +

    We can now see the newly created ChannelGroup as a stand-alone DSP ChannelGroup Fader between the channel on the right and the Master ChannelGroup Fader on the left.

    +

    Add an effect to the ChannelGroup

    +

    Adding an effect to a ChannelGroup is the same as adding one to a Channel. Use ChannelControl::addDSP.

    +
    FMOD::DSP *dsp_lowpass;
    +result = system->createDSPByType(FMOD_DSP_TYPE_LOWPASS, &dsp_lowpass);
    +result = channelgroup->addDSP(1, dsp_lowpass);
    +
    + +

    DSP Network

    +

    We can now see as before, an effect attached to a ChannelGroup Fader, in position 1, the entirety of the ChannelGroup being symbolized by the box around the 2 units.

    +

    Creating an effect and making all Channels send to it.

    +

    This example demonstrates a more complex, and somewhat typical scenario, in which we create a new effect, and every time a Sound plays on a Channel, we connect the new channel to the effect.

    +

    Important note! Please don't use this example as a standard way to set up reverb. Simply call System::setReverbProperties instead and all connection logic is handled automatically. Note the following logic does not handle what happens when a Channel goes virtual and is removed from the graph, only to return later. You would only normally use this logic if you wanted to control the 'wet' mix levels indivudually for an effect, per channel. Otherwise a simple ChannelControl::addDSP would suffice.

    +

    The first step is to add an effect to the master ChannelGroup. We do this by calling System::createDSPByType again, and then using the DSP API to manually add connections.

    +
    FMOD::DSP *dsp_reverb;
    +FMOD::DSP *dsp_tail;
    +FMOD::ChannelGroup *channelgroup_master;
    +result = system->createDSPByType(FMOD_DSP_TYPE_SFXREVERB, &dsp_reverb);             /* Create the reverb DSP */
    +result = system->getMasterChannelGroup(&channelgroup_master);                       /* Grab the master ChannelGroup / master bus */
    +result = channelgroup_master->getDSP(FMOD_CHANNELCONTROL_DSP_TAIL, &dsp_tail);      /* Grab the 'tail' unit for the master ChannelGroup.  This is the last DSP unit for the ChannelGroup, in case it has other effects already in it. */
    +result = dsp_tail->addInput(dsp_reverb);
    +
    + +

    This will result in

    +

    DSP Network

    +

    Note that the ChannelGroup from before is still there. This is what the Channels will be playing on. The reason we have a ChannelGroup here for this example is to keep the Channels executing first in the graph, then the reverb second. This raises a topic called 'order of execution' which you can find more information about below and why it may or may not be important to you.

    +

    Also note that the reverb is black. This means it is inactive / disabled. All units are inactive by default, so we have to activate them. You can do this with DSP::setActive.

    +
    result = dsp_reverb->setActive(true);
    +
    + +

    DSP Network

    +

    Now you can see that the reverb has gone from black/inactive to active.

    +

    Now we will play a sound on multiple channels with the following code. The code plays the sound paused, gets its Channel DSP head unit, adds the Channel DSP head unit to the reverb, then unpauses the sound.

    +
    FMOD::DSP *channel_dsp_head;
    +result = system->playSound(sound, channelgroup, true, &gChannel[0]);                /* Play the sound.  Play it paused so we dont hear the sound play before it is connected to the reverb. */
    +result = channel->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &channel_dsp_head);          /* Grab the 'head' unit for the Channel */
    +result = dsp_reverb->addInput(channel_dsp_head);                                    /* Manually add a connection from the Channel DSP head to the reverb. */
    +result = channel->setPaused(false);                                                 /* Unpause the channel and let it be audible. */
    +
    + +

    Note that calling ChannelControl::setPaused internally just calls DSP::setActive on the Channel's head DSP unit.

    +

    Here is the result

    +

    DSP Network

    +

    The interesting parts here are that the Channel DSP head units now have 2 outputs per channel, and each set of outputs mix to the user created ChannelGroup first, before being passed as the 'dry' signal to the output. The second set of outputs can be considered the 'wet' path and similarly mix to the reverb unit, before being processed by the reverb processor.

    +

    Controlling mix level and pan matrices for DSPConnections

    +

    Each connection between a DSP unit is represented by a DSPConnection object. This is the line between the boxes.

    +

    The primary purpose of this object type is to allow the user to control the volume / mix level between 2 processing units, and also to control the speaker / channel mapping between 2 units, so that a signal can be panned, and input signals mapped to any output signal, in any way that is needed.

    +

    Lets go back to the example above, but with 1 channel, and change its wet mix from the Channel to the reverb from 1.0 (0db) to 0.0 (-80db)

    +

    The code around the playsound would have one difference, and that is that addInput will also take a pointer to the resulting DSPConnection object.

    +
    FMOD::DSP *channel_dsp_head;
    +FMOD::DSPConnection *dsp_connection;
    +result = system->playSound(sound, channelgroup, true, &gChannel[0]);                /* Play the sound.  Play it paused so we dont hear the sound play before it is connected to the reverb. */
    +result = channel->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &channel_dsp_head);          /* Grab the 'head' unit for the Channel */
    +result = dsp_reverb->addInput(channel_dsp_head, &dsp_connection);                   /* Manually add a connection from the Channel DSP head to the reverb. */
    +result = channel->setPaused(false);                                                 /* Unpause the channel and let it be audible. */
    +
    + +

    We can then update the volume simply with DSPConnection::setMix.

    +
    result = dsp_connection->setMix(0.0f);
    +
    + +

    DSP Network

    +

    You can see there is no signal level in the meter for the reverb, because the only input to it is silent.

    +

    Set the output format of a DSP unit, and control the pan matrix for its output signal

    +

    In this section we will grab the first output from the channel_dsp_head and apply a pan matrix to it, to allow mapping of input signal to any output speaker within the mix.

    +

    The first thing to note, is that the Channel Fader outputs mono to the ChannelGroup Fader. This means there's not much to map from and to here. Any matrix representing this signal will be 1 in and 1 out.

    +

    To make it more interesting, we can change the output format of a DSP Unit with DSP::setChannelFormat.

    +
    result = channel_dsp_head->setChannelFormat(0, 0, FMOD_SPEAKER_QUAD);
    +
    + +

    Here is the result

    +

    DSP Network

    +

    You will notice that the ChannelFader now outputs 4 channels, and this gets propagated through the graph. A Quad to 5.1 pan has a different default upmix than mono to 5.1, so you will see that the fronts are now slightly lower on the final ChannelGroup Fader unit, and there is some signal now introduced into the Surround Left and Surround Right speakers. Now we will use some code to do something interesting, we will put the newly quad ChannelFader signal's front 2 channels into the rear 2 speakers of the quad output.

    +
    FMOD::DSPConnection *channel_dsp_head_output_connection;
    +float matrix[4][4] =
    +{   /*                                    FL FR SL SR <- Input signal (columns) */
    +    /* row 0 = front left  out    <- */ { 0, 0, 0, 0 },     
    +    /* row 1 = front right out    <- */ { 0, 0, 0, 0 },     
    +    /* row 2 = surround left out  <- */ { 1, 0, 0, 0 },     
    +    /* row 3 = surround right out <- */ { 0, 1, 0, 0 }      
    +};
    +result = channel_dsp_head->getOutput(0, 0, &channel_dsp_head_output_connection);
    +result = channel_dsp_head_output_connection->setMixMatrix(&matrix[0][0], 4, 4);
    +
    + +

    DSP Network

    +

    We can now see that the first 2 channels are now silent on the output because they have 0s in the matrix where the first 2 input columns map to the first 2 output columns.

    +

    Instead the first 2 input columns have 1s where the rows map to the surround left and surround right output speakers.

    +

    Bypass an effect / disable it.

    +

    To disable an effect simply use the setBypass method. The code below plays a sound, adds an effect then bypasses it.

    +
    result = dsp_reverb->setBypass(true);
    +
    + +

    This has the benefit of not disabling all input units like DSP::setActive with false as the parameter would, and allows the signal to pass through the reverb unit untouched (The reverb process function is not called, saving CPU).

    +

    DSP Network

    +

    The bypassed reverb is represented as greyed out.

    +

    Note that many FMOD effects automatically bypass themselves, saving CPU, after no signal, or silence is detected and the effective 'tail' of the effect has played out.

    +

    Order of execution and pull / no pull traversal

    +

    The order of execution for a DSP graph is from right to left, but also top to bottom. Units at the top will get executed before units at the bottom.

    +

    Sometimes it is undesirable to have a user created effect execute the DSP units for the channel, rather than the ChannelGroup it belongs to. This typically doesn't matter, but one case where it would matter is if the user called ChannelControl::setDelay on the channel or ChannelControl::setDelay on a parent ChannelGroup, to make the sound delay before starting.

    +

    The reverb unit has no concept of the delay because the clock it is delaying against is stored in the ChannelGroup it belongs to.

    +

    The result is that the reverb will pull the signal and be audible through the reverb processor, and the dry path will still be silent because it is in a delay state.

    +

    The workaround in the above reverb example, is to attach the reverb to the master ChannelGroup after the ChannelGroup the Channels will play on is created, so that the ChannelGroup executes first, and the reverb second.

    +

    'Send' vs 'Standard' connection type

    +

    A second workaround is to stop the reverb pulling data from its inputs. This can be done by using the FMOD_DSPCONNECTION_TYPE 'type' parameter for DSP::addInput. If FMOD_DSPCONNECTION_TYPE_SEND is used instead of FMOD_DSPCONNECTION_TYPE_STANDARD, the inputs are not executed, and all the reverb would do is process whatever is mixed to it from a previous traversal to the inputs.

    +

    The delay will then work, but the downside to this method is that if the reverb is first, the signal from the channels will be sent after the reverb has processed. This means it will have to wait until the next mix before it can process that data, therefore 1 mix block of latency is introduced to the reverb.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-dsp-plugin-api.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-dsp-plugin-api.html new file mode 100644 index 0000000..1804c4f --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-dsp-plugin-api.html @@ -0,0 +1,220 @@ + + +White Papers | DSP Plug-in API + + + + +
    + +
    +

    5. White Papers | DSP Plug-in API

    + +

    DSP Plug-in API

    +

    Game studios and third-party developers can augment FMOD Studio's built-in suite of effects and sound modules by creating their own plug-ins. By placing plug-ins in FMOD Studio's plug-ins folder, these can be added to tracks or buses, modulated and automated by game parameters just like built-in effect and sound modules.

    +

    This document describes how to create plug-ins and make them available to FMOD Studio and your game. We also recommended you follow along with the example plug-ins found in api/core/examples/plugins, as they are fully implemented working effects you can use or base your code on.

    +

    Accessing Plug-ins in FMOD Studio

    +

    A plug-in must be built as a dynamic linked library and placed in the plug-ins folder specified in FMOD Studio's Preferences dialog under the Plug-ins tab. FMOD Studio scans the folder and all sub-folders both on start-up and when the folder is changed by the user. Studio tries to load any libraries it finds (.dll on Windows or .dylib on Mac) and ignores libraries which don't support the API.

    +

    Detected plug-in instruments will be available via the track context menu in the Event Editor, whereas detected plug-in effects will show up in the effect deck's Add Effect and Insert Effect context menus. When a plug-in module is added to a track or bus, its panel will be displayed in the effect deck. The panel will be automatically populated with dials, buttons and data drop-zones for each parameter.

    +

    Basics

    +

    Two versions of the plug-in will usually be required - one for FMOD Studio and one for the game.

    +

    Studio will require a dll or dylib file if running in Windows or Mac respectively. These will be loaded dynamically in Studio as described in the previous section.

    +

    Another version of the plug-in must be compiled for the game's target platform. This may also be a dynamic library but, in most cases, can (or must) be a static library or simply compiled along with the game code. Each target platform requires its own version of the plugin to ensure compatibility and performance. In each case, game code is required to load the plug-in prior to loading the project or object referencing the plug-in.

    +

    Building a Plug-in

    +

    The fmod_dsp.h header file includes all the necessary type definitions and constants for creating plug-ins including the struct FMOD_DSP_DESCRIPTION which defines the plug-in's capabilities and callbacks.

    +

    If creating a dynamic library, the library must export FMODGetDSPDescription, e.g.:

    +
    extern "C" {
    +F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMODGetDSPDescription();
    +}
    +
    + +

    The F_EXPORT macro provides the relevant storage class for exporting FMODGetDSPDescription. Some platforms however, such as PS5, cannot automatically provide a definition for this macro. In such cases you will need to manually add a preprocessor definition for F_USE_DECLSPEC, or F_USE_ATTRIBUTE for Linux based platforms, otherwise the built plugin may fail to load.

    +

    Dynamic libraries must be compiled for the same architecture as the host (whether FMOD Studio or the game), so if the host is 64-bit, the plug-in must be 64-bit.

    +

    A third-party tool, such as the free Dependencies, can be used to verify that the library is able to be loaded and the proper symbol is exported. In Windows, the symbol will look like _FMODGetDSPDescription@0.

    +

    If creating a static library, the library should export a symbol with a unique name such as FMOD_YourCompany_YourProduct_GetDSPDescription, e.g.:

    +
    extern "C" {
    +F_EXPORT FMOD_DSP_DESCRIPTION* F_CALL FMOD_YourCompany_YourProduct_GetDSPDescription();
    +}
    +
    + +

    You should then share this extern'd symbol name in a header so developers can register it at runtime with System::registerDSP.

    +

    Loading the Plug-in in the Game

    +

    The plug-in must be registered using the FMOD Studio or Core API before the object referencing the plug-in is loaded in the game.

    +

    The following functions can be used to register a plug-in if it is statically linked or compiled with the game code:

    +
    FMOD_RESULT FMOD::Studio::System::registerPlugin(const FMOD_DSP_DESCRIPTION* description);
    +FMOD_RESULT FMOD::System::registerDSP(const FMOD_DSP_DESCRIPTION *description, unsigned int *handle);
    +
    + +

    If the plug-in library is to be dynamically loaded, it can be registered using:

    +
    FMOD_RESULT FMOD::System::loadPlugin(const char *filename, unsigned int *handle, unsigned int priority = 0)
    +
    + +

    A base plug-in path can be specified using the function:

    +
    FMOD_RESULT FMOD::System::setPluginPath(const char *path)
    +
    + +

    If this is set, the filename parameter of System::loadPlugin is assumed to be relative to this path.

    +

    Plug-ins do not normally need to be unregistered, but it is possible with either of the following functions:

    +
    FMOD_RESULT FMOD::Studio::System::unregisterPlugin(const char* name)
    +FMOD_RESULT FMOD::System::unloadPlugin(unsigned int handle)
    +
    + +

    In these functions, name refers to the name of the plug-in defined in the plug-ins descriptor and handle refers to handle returned by System::loadPlugin.

    +

    Plug-in Types

    +

    There are two main plug-in types:

    +
      +
    • Effect Modules
    • +
    • Sound Modules
    • +
    +

    Both module types are created in the same way - the difference lies in whether the plug-in processes an audio input.

    +

    Effect modules apply effects to an audio signal. Each effect module has an input and an output. Effect modules can be inserted anywhere in FMOD Studio's signal routing, whether it be on an event's track or a mixer bus. Examples of different types of plug-in effects include:

    +
      +
    • Effects which have the same input and output channel counts such as EQ, compression, distortion, etc...
    • +
    • Effects which perform up- or down-mixing as part of the processing algorithm such as panning or reverb
    • +
    • Spatialization and any distance/direction effects which respond to a sound's 3D location in the game such as 3D panning, distance filtering, early reflections or binaural audio
    • +
    • Side-chaining effects such as compression or audio modulation (e.g. ring modulators)
    • +
    +

    Sound Modules produce their own audio output - they do not have an audio input. Sound modules can be placed on tracks inside Events and can be made to trigger from the timeline, game parameter or within another sound module.

    +

    The Plug-in Descriptor

    +

    The plug-in descriptor is a struct, FMOD_DSP_DESCRIPTION defined in fmod_dsp.h, which describes the capabilities of the plug-in and contains function pointers for all callbacks needed to communicate with FMOD. Data in the descriptor cannot change once the plug-in is loaded. The original struct and its data must stay around until the plug-in is unloaded as data inside this struct is referenced directly within FMOD throughout the lifetime of the plug-in.

    +

    The first member, FMOD_DSP_DESCRIPTION::pluginsdkversion, must always hold the version number of the plug-in SDK it was complied with. This version is defined as FMOD_PLUGIN_SDK_VERSION. The SDK version is incremented whenever changes to the API occur.

    +

    The following two members, FMOD_DSP_DESCRIPTION::name and FMOD_DSP_DESCRIPTION::version, identify the plug-in. Each plug-in must have a unique name, usually the company name followed by the product name. Version numbers should not be included in the name in order to allow for future migration of saved data across different versions. Names should not change across versions for the same reason. The version number should be incremented whenever any changes to the plug-in have been made.

    +

    Here is a code snippet from the FMOD Gain example which shows how to initialize the first five members of FMOD_DSP_DESCRIPTION:

    +
    FMOD_DSP_DESCRIPTION FMOD_Gain_Desc =
    +{
    +    FMOD_PLUGIN_SDK_VERSION,
    +    "FMOD Gain",    // name
    +    0x00010000,     // plug-in version
    +    1,              // number of input buffers to process
    +    1,              // number of output buffers to process
    +    ...
    +};
    +
    + +

    The other descriptor members will be discussed in the following sections.

    +

    Thread Safety

    +

    Audio callbacks FMOD_DSP_DESCRIPTION::read, FMOD_DSP_DESCRIPTION::process and FMOD_DSP_DESCRIPTION::shouldiprocess are executed in FMOD's mixer thread whereas all other callbacks are executed in the host's thread (game or Studio UI). It is therefore important to ensure thread safety across parameters and states which are shared between those two types of callbacks.

    +

    In the FMOD Gain example, two gains are stored: target gain and current gain. target gain stores the parameter value which is set and queried from the host thread. This value is then assigned to current gain at the start of the audio processing callback and it is current gain that is then applied to the signal. FMOD Gain shows how this method can be used to perform parameter ramping by not directly assigning current gain but interpolating between current gain and target gain over a fixed number of samples so as to minimize audio artefacts during parameter changes.

    +

    Plug-in Parameters

    +

    Plug-in effect and sound modules can have any number of parameters. Once defined, the number of parameters and each of their properties cannot change. Parameters can be one of four types:

    +
      +
    • floating-point
    • +
    • integer
    • +
    • boolean (two-state)
    • +
    • data
    • +
    +

    Parameters are defined in FMOD_DSP_DESCRIPTION as a list of pointers to parameter descriptors, FMOD_DSP_DESCRIPTION::paramdesc. The FMOD_DSP_DESCRIPTION::numparameters specifies the number of parameters. Each parameter descriptor is of type FMOD_DSP_PARAMETER_DESC. As with the plug-in descriptor, parameter descriptors must stay around until the plug-in is unloaded as the data within these descriptors are directly accessed throughout the lifetime of the plug-in.

    +

    Common to each parameter type are the members FMOD_DSP_PARAMETER_DESC::name and units, as well as FMOD_DSP_PARAMETER_DESC::description which should describe the parameter in a sentence or two. The type member will need to be set to one of the four types and either of the FMOD_DSP_PARAMETER_DESC::floatdesc, FMOD_DSP_PARAMETER_DESC::intdesc, FMOD_DSP_PARAMETER_DESC::booldesc or FMOD_DSP_PARAMETER_DESC::datadesc members will need to specified. The different parameter types and their properties are described in more detail in the sections below.

    +

    Floating-point Parameters

    +

    Floating-point parameters have type set to FMOD_DSP_PARAMETER_TYPE_FLOAT. They are continuous, singled-valued parameters and their minimum, maximum and default values are defined by the floatdesc members min, max and defaultval.

    +

    The following units should be used where appropriate:

    +
      +
    • "Hz" for frequency or cut-off
    • +
    • "ms" for duration, time offset or delay
    • +
    • "st" (semitones) for pitch
    • +
    • "dB" for gain, threshold or feedback
    • +
    • "%" for mix, depth, feedback, quality, probability, multiplier or generic 'amount'.
    • +
    • "Deg" for angle or angular spread
    • +
    +

    These are preferred over other denominations (such as kHz for cut-off) as they are recognised by Studio therefore allowing values to be displayed in a more readable and consistent manner. Unitless 0-to-1 parameters should be avoided in favour of dB if the parameter describes a gain, % if it describes a multiplier, or a unitless 0-to-10 range is preferred if describing a generic amount.

    +

    The FMOD_DSP_DESCRIPTION members FMOD_DSP_DESCRIPTION::setparameterfloat and FMOD_DSP_DESCRIPTION::getparameterfloat will need to point to static functions of type FMOD_DSP_SETPARAM_FLOAT_CALLBACK and FMOD_DSP_GETPARAM_FLOAT_CALLBACK, respectively, if any floating-point parameters are declared.

    +

    These will be displayed as dials in FMOD Studio's effect deck.

    +

    Integer Parameters

    +

    Integer parameters have type set to FMOD_DSP_PARAMETER_TYPE_INT. They are discrete, singled-valued parameters and their minimum, maximum and default values are defined by the intdesc members min, max and defaultval. The member goestoinf describes whether the maximum value represents infinity as maybe used for parameters representing polyphony, count or ratio.

    +

    The FMOD_DSP_DESCRIPTION members FMOD_DSP_DESCRIPTION::setparameterint and FMOD_DSP_DESCRIPTION::getparameterint will need to point to static functions of type FMOD_DSP_SETPARAM_INT_CALLBACK and FMOD_DSP_GETPARAM_INT_CALLBACK, respectively, if any integer parameters are declared.

    +

    These will be displayed as dials in FMOD Studio's effect deck.

    +

    Boolean Parameters

    +

    Boolean parameters have type set to FMOD_DSP_PARAMETER_TYPE_BOOL. They are discrete, singled-valued parameters and their default value is defined by the booldesc member defaultval.

    +

    The FMOD_DSP_DESCRIPTION members FMOD_DSP_DESCRIPTION::setparameterbool and FMOD_DSP_DESCRIPTION::getparameterbool will need to point to static functions of type FMOD_DSP_SETPARAM_BOOL_CALLBACK and FMOD_DSP_GETPARAM_BOOL_CALLBACK, respectively, if any boolean parameters are declared.

    +

    These will be displayed as buttons in FMOD Studio's effect deck.

    +

    Data Parameters

    +

    Data parameters have type set to FMOD_DSP_PARAMETER_TYPE_DATA. These parameters can represent any type of data including built-in types which serve a special purpose in FMOD. The datadesc member datatype specifies the type of data stored in the parameter. Values 0 and above may be used to describe user types whereas negative values are reserved for special types described in the following sections.

    +

    The FMOD_DSP_DESCRIPTION members FMOD_DSP_DESCRIPTION::setparameterdata and FMOD_DSP_DESCRIPTION::getparameterdata will need to point to static functions of type FMOD_DSP_SETPARAM_DATA_CALLBACK and FMOD_DSP_GETPARAM_DATA_CALLBACK, respectively, if any data parameters with datatype 0 and above are declared.

    +

    Data parameters with datatype 0 and above will be displayed as drop-zones in FMOD Studio's effect deck. You can drag any file containing the data onto the drop-zone to set the parameter's value. Data is stored with the project just like other parameter types.

    +

    Multiple plug-ins within one file

    +

    Typically each plug-in only has a single definition. If you want to have multiple definitions from within the one plugin file, you can use a plugin list. An example is shown below.

    +
    FMOD_DSP_DESCRIPTION My_Gain_Desc = { .. };
    +FMOD_DSP_DESCRIPTION My_Panner_Desc = { .. };
    +FMOD_OUTPUT_DESCRIPTION My_Output_Desc = { .. };
    +
    +static FMOD_PLUGINLIST My_Plugin_List[] =
    +{
    +    { FMOD_PLUGINTYPE_DSP, &My_Gain_Desc },
    +    { FMOD_PLUGINTYPE_DSP, &My_Panner_Desc },
    +    { FMOD_PLUGINTYPE_OUTPUT, &My_Output_Desc },
    +    { FMOD_PLUGINTYPE_MAX, NULL }
    +};
    +
    +extern "C"
    +{
    +
    +F_EXPORT FMOD_PLUGINLIST* F_CALL FMODGetPluginDescriptionList()
    +{
    +    return &My_Plugin_List;
    +}
    +
    +} // end extern "C"
    +
    + +

    Support for multiple plug-ins via FMODGetPluginDescriptionList was added in 1.08. If the plug-in also implements FMODGetDSPDescription, then older versions of the FMOD Engine load a single DSP effect, whereas newer versions load all effects.

    +

    To load plug-ins at runtime, call System::loadPlugin as normal. The handle returned is for the first definition. System::getNumNestedPlugins and System::getNestedPlugin can be used to iterate all plug-ins in the one file.

    +
    unsigned int baseHandle;
    +ERRCHECK(system->loadPlugin("plugin_name.dll", &baseHandle));
    +int count;
    +ERRCHECK(system->getNumNestedPlugins(baseHandle, &count));
    +for (int index=0; index<count; ++index)
    +{
    +    unsigned int handle;
    +    ERRCHECK(system->getNestedPlugin(baseHandle, index, &handle));        
    +    FMOD_PLUGINTYPE type;
    +    ERRCHECK(system->getPluginInfo(handle, &type, 0, 0, 0));
    +    // We have an output plug-in, a DSP plug-in, or a codec plug-in here.
    +}
    +
    + +

    The above code also works for plug-ins with a single definition. In that case, the count is always 1 and System::getNestedPlugin returns the same handle as passed in.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-getting-started.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-getting-started.html new file mode 100644 index 0000000..450d207 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-getting-started.html @@ -0,0 +1,138 @@ + + +White Papers | Getting Started + + + + +
    + +
    +

    5. White Papers | Getting Started

    + +

    Getting Started

    +

    The Studio API and Core API are designed to be intuitive and flexible. This white paper contains an introduction to using both, and explains the key factors involved in using it effectively.

    +

    FMOD provides a C++ API and also a C API. They are functionally identical, and in fact the C++ and C functions can be mixed interchangeably, with the C++ and C classes being able to be cast back and forth. The following examples only show the C++ version.

    +

    Initialization

    +

    Before anything else can be done with the FMOD Engine, it is necessary to initialize the studio system (if your game uses FMOD Studio) or core system (if it does not).

    +

    Studio API Initialization

    +

    The Studio API can load FMOD Studio banks and can play events created by sound designers in FMOD Studio. When using the Studio API, you can create a studio system and then call Studio::System::initialize. That function will also initialize the in-built core system as well. Here is a simple example:

    +
    FMOD_RESULT result;
    +FMOD::Studio::System* system = NULL;
    +
    +result = FMOD::Studio::System::create(&system); // Create the Studio System object.
    +if (result != FMOD_OK)
    +{
    +    printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
    +    exit(-1);
    +}
    +
    +// Initialize the Studio system, which also initializes the Core system
    +result = system->initialize(512, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, 0);
    +if (result != FMOD_OK)
    +{
    +    printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
    +    exit(-1);
    +}
    +
    + +

    Core API Initialization (Do not use this if using Studio API Initialization)

    +

    The Core API can be used without needing to use the Studio API at all. Using the Core API gives access to the fundamental abilities of loading and playing sounds, creating DSP effects, setting up FMOD ChannelGroups, and setting sample-accurate fade points and start/stop times. However, when just using the Core API, it is not possible to load FMOD Studio banks or load and play events that sound artists have designed in FMOD Studio. To initialize the Core API directly:

    +
    FMOD_RESULT result;
    +FMOD::System *system = NULL;
    +
    +result = FMOD::System_Create(&system);      // Create the main system object.
    +if (result != FMOD_OK)
    +{
    +    printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
    +    exit(-1);
    +}
    +
    +result = system->init(512, FMOD_INIT_NORMAL, 0);    // Initialize FMOD.
    +if (result != FMOD_OK)
    +{
    +    printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
    +    exit(-1);
    +}
    +
    + +

    Advanced Initialization Settings

    +

    FMOD can be customised with advanced settings by calling System::setAdvancedSettings or Studio::System::setAdvancedSettings before initialization. For a description of the typical settings for effective virtual voices, see the Virtual Voice System.

    +

    Playing a sound (Core API only)

    +

    The simplest way to get started, and a basic function of the Core API, is initializing the Core API system, loading a sound, and playing it. All functions execute immediately, so you can either fire and forget a sound during main loop execution or poll for a sound to finish. Playing a sound does not block the application.

    +

    To execute a simple playSound

    +
      +
    1. Load a sound with System::createSound, using the system object handle as described above. This will return a Sound handle. This is your handle to your loaded sound.
    2. +
    3. Play the sound with System::playSound, using the Sound handle returned from Step 1. This will return a Channel handle.
    4. +
    5. Let it play in the background, or monitor its status with ChannelControl::isPlaying, using the Channel handle returned from Step 2. A channel handle will also go immediately invalid when a sound ends, when calling any relevant Channel based function, so that is another way to know a sound has ended. The error code returned will be FMOD_ERR_INVALID_HANDLE.
    6. +
    +

    Using decompressed samples vs compressed samples vs streams

    +

    Decompressed Samples

    +

    The default mode for createSound is FMOD_CREATESAMPLE, which decompresses the sound into memory. This may be useful for distributing sounds compressed, then decompressing them at runtime to avoid the overhead of decompressing the sounds while playing. This can be expensive on mobile devices depending on the format. Decompressing to PCM uses litte CPU during playback, but also uses many times more memory at runtime.

    +

    Streams

    +

    Loading a sound as a streaming, gives the ability to take a large file, and read/play it in realtime in small chunks at a time, avoiding the need to load the entire file into memory. This is typically reserved for Music / Voice over / dialogue or Long ambience tracks. The user can simply play a sound as a stream by adding the FMOD_CREATESTREAM flag to the System::createSound function, or using the System::createStream function. The 2 options equate to the same end behavior.

    +

    Compressed Samples

    +

    To play a sound as compressed, simply add the FMOD_CREATECOMPRESSEDSAMPLE flag to the System::createSound function

    +

    Because compressed samples are more complicated, they have larger contexts to deal with (for example vorbis decode information), so there is a constant per voice overhead (up to a fixed limit) for a playing sound.
    +This allocation is typically incurred at System::init time if the user calls System::setAdvancedSettings and sets a maxCodecs value, or it could happen the first time a sound is loaded with the FMOD_CREATECOMPRESSEDSAMPLE flag. This will not be configured by the user so uses the default of 32 codecs for the allocation.

    +

    As an example: the vorbis codec has an overhead of 16kb per voice, so the default of 32 vorbis codecs will consume 512kb of memory. This is adjustable by the user to reduce or increase the default of 32, using the System::setAdvancedSettings function as mentioned. The user would adjust the FMOD_ADVANCEDSETTINGS maxVorbisCodecs value for the vorbis case. Other supported codecs are adjustable as well.

    +

    The best cross platform codec to used as a compressed sample is Vorbis (from an FSB file) but if it uses too much CPU for your platform (ie mobile), the FADPCM codec is a good second option. It is less compressed, and uses far less CPU cycles to decode, while giving good quality and 4:1 compression. For PS4 or Xbox One, it is better to use the AT9 and XMA codec format respectively, as the decoding of these formats are handled by separate media chips, taking the load off the CPU.

    +

    Update

    +

    FMOD should be ticked once per game update. When using the Studio API, call Studio::System::update, which internally will also update the Core system. If using Core API only, instead call System::update.

    +

    If the Studio API is running in asynchronous mode (the default, unless FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE has been specified), then Studio::System::update will be extremely quick, as it is merely swapping a buffer for the asynchronous execution of that frame's commands.

    +

    Shut Down

    +

    To shut down the Studio API, call Studio::System::release. If using the Core API only, instead call System::release.

    +

    Error Checking

    +

    In the FMOD examples, the error codes are checked with a macro that calls into a handling function if an unexpected error occurs. That is the recommended way of calling Studio API functions. There is also a callback that can be received whenever a public FMOD function has an error. See FMOD_SYSTEM_CALLBACK for more information.

    +

    Configuration

    +

    The output hardware, FMOD's resource usage, and other types of configuration options can be set if you desire behavior differing from the default. These are generally called before System::init. For examples of these, see Studio::System::getCoreSystem, System::setAdvancedSettings, Studio::System::setAdvancedSettings.

    +

    Avoiding stalls while loading or releasing a sound

    +

    One of the slowest operations is loading a sound. To place a sound load into the background so that it doesn't affect processing in the main application thread, the user can use the FMOD_NONBLOCKING flag in System::createSound or System::createStream.

    +

    Immediately a sound handle is returned to the user. The status of the sound being loaded can then be checked with Sound::getOpenState. If a function is called on a sound that is still loading (besides getOpenState), it will typically return FMOD_ERR_NOTREADY. Wait until the sound is ready to play it. The state would be FMOD_OPENSTATE_READY.

    +

    To avoid a stall on a streaming sound when trying to free/release it, check that the state is FMOD_OPENSTATE_READY before calling Sound::release.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-handle-system.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-handle-system.html new file mode 100644 index 0000000..3512b78 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-handle-system.html @@ -0,0 +1,60 @@ + + +White Papers | Handle System + + + + +
    + +
    +

    5. White Papers | Handle System

    + +

    Handle System

    +

    The Studio API and Core API return pointers to types. Some of these types are actually implemented as an underlying handle, but represent the handle data as a pointer type. This section explains the underlying representation and lifetime of these objects.

    +

    General Information

    +

    All FMOD types, whether they are represented internally via pointer or handle, look like a pointer type. No matter the type, a null pointer will never be returned as a valid result, but it is not safe to assume anything else about the pointer value. Do not assume that the pointer value falls in any particular address range, or that it has any zero bits in the bottom of the pointer value address.

    +

    All FMOD types are equivalent for both the C and C++ API. It is possible to cast between the appropriate types by re-interpreting the pointer type directly.

    +

    Core API Channels

    +

    FMOD Channels are returned to you as a pointer, but actually consist of 32 bits of packed integer handle data. This allows Channels to be re-used safely.

    +

    If a Channel is stopped with ChannelControl::stop or ends naturally, the Channel handle will become invalid and return FMOD_ERR_INVALID_HANDLE.

    +

    If not enough Channels are specified at System::init and an existing virtual Channel is stolen by the FMOD priority system, then the handle to the stolen Channel becomes 'invalid'. Subsequent Channel commands to a stolen handle will return FMOD_ERR_CHANNEL_STOLEN.

    +

    Core API Channel Groups

    +

    FMOD ChannelGroups are returned to you directly as a pointer. Once you destroy a ChannelGroup, it is no longer safe to call FMOD functions with that pointer.

    +

    Core API System

    +

    FMOD System object is returned to you directly as a pointer. Once you destroy the Core API System, it is no longer safe to call FMOD functions with that pointer.

    +

    Studio API Types

    +

    Studio API types are returned as pointers, but actually consist of packed handle data. If the underlying type has been destroyed then the API will return FMOD_ERR_INVALID_HANDLE. An example of this would be unloading a Studio::Bank and then referencing a Studio::EventDescription belonging to that bank.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-memory-management.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-memory-management.html new file mode 100644 index 0000000..12b42c0 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-memory-management.html @@ -0,0 +1,70 @@ + + +White Papers | Memory Management + + + + +
    + +
    +

    5. White Papers | Memory Management

    + +

    Memory Management and Conservation

    +

    This white paper gives some pointers on how to use and save memory in the FMOD Engine by describing things that may not be so obvious upon first looking at the API.

    +

    Using a fixed size memory pool.

    +

    To make FMOD stay inside a fixed size memory pool, and not do any external allocs, you can use the Memory_Initialize function.
    +i.e.

    +
    result = FMOD::Memory_Initialize(malloc(4*1024*1024), 4*1024*1024, 0,0,0);  // allocate 4mb and pass it to the FMOD Engine to use.
    +ERRCHECK(result);
    +
    + +

    Note! that this uses malloc. On Xbox 360 and Xbox you must use a different operating system alloc such as XPhysicalAlloc otherwise FMOD may not behave correctly. See "Platform specific issues" tutorials for more information on this.

    +

    Note! that this function allows you to specify your own callbacks for alloc and free. In this case the memory pool pointer and length must be NULL. The 2 features are mutually exclusive.

    +

    Lowering sound instance overhead.

    +

    The FMOD_LOWMEM flag is used for users wanting to shave some memory usage off of the sound class. This flag removes memory allocation for certain features, such as the 'name' field, which aren't used often in games. If Sound::getName is called when this flag is set, it returns "(null)".

    +

    Using compressed samples.

    +

    The FMOD Engine can play ADPCM, AT9, MP2/MP3, Opus, and XMA data compressed, without needing to decompress it to PCM first. This can save a large amount of memory, at the cost of requiring more CPU time when the sound is played.

    +

    To enable this, use the FMOD_CREATECOMPRESSEDSAMPLE flag. When using formats other than the ones specified above or platforms that do not support those formats, this flag is ignored.

    +

    On platforms that support hardware decoding, using this flag results in the platform hardware decoder decompressing the data without affecting the main CPU. For information about what platforms support hardware decoding and which encoding formats they support, see the Platform Details chapter.

    +

    Note! Using FMOD_CREATECOMPRESSEDSAMPLE incurs a 'one off' memory overhead cost, as it allocates the pool of codecs required to play the encoding format of the sample data. For information on how to control this pool, see the following section.

    +

    Controlling memory usage with settings.

    +

    System::setSoftwareFormat maxinputchannels is default to 6 to allow up to 6 channel wav files to be played through FMOD's software engine. Setting this to a lower number will save memory across the board. If the highest channel count in a sound you are going to use is stereo, then set this to 2.
    +For sounds created with FMOD_CREATECOMPRESSEDSAMPLE, System::setAdvancedSettings allows the user to reduce the number of simultaneous XMA/ADPCM or MPEG sounds played at once, to save memory. The defaults are specified in the documentation for this function. Lowering them will reduce memory. Note the pool of codecs for each codec type is only allocated when the first sound of that type is loaded. Reducing XMA to 0 when XMA is never used will not save any memory.
    +For streams, setting System::setStreamBufferSize will control the memory usage for the stream buffer used by FMOD for each stream. Lowering the size in this function will reduce memory, but may also lead to stuttering streams. This is purely based on the type of media the FMOD streamer is reading from (ie CDROM is slower than harddisk), so it is to be experimented with based on this.
    +Reducing the number of Channels used will reduce memory. System::init and System::setSoftwareChannels give control over maximum number of virtual voices and real voices used. You will need to make sure you specify enough voices though to avoid Channel stealing.

    +

    Tracking FMOD memory usage.

    +

    Using Memory_GetStats is a good way to track FMOD memory usage, and also find the highest amount of memory allocated at any time, so you can adjust the fix memory pool size for the next time.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-non-blocking-sound-creation.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-non-blocking-sound-creation.html new file mode 100644 index 0000000..1b7ba6b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-non-blocking-sound-creation.html @@ -0,0 +1,144 @@ + + +White Papers | Non-blocking Sound Creation + + + + +
    + +
    +

    5. White Papers | Non-blocking Sound Creation

    + +

    Non-blocking sound creation

    +

    FMOD_NONBLOCKING flag is used so that sounds can be loaded without affecting the framerate of the application.
    +Normally loading operations can take a large or significant amount of time, but with this feature, sounds can be loaded in the background without the application skipping a beat.

    +

    Creating the sound.

    +

    Simply create the sound as you normally would but add the FMOD_NONBLOCKING flag.

    +
    FMOD::Sound *sound;
    +result = system->createStream("../media/wave.mp3", FMOD_NONBLOCKING, 0, &sound); // Creates a handle to a stream then commands the FMOD Async loader to open the stream in the background.
    +ERRCHECK(result);
    +
    + +

    Now the sound will open in the background, and you will get a handle to the sound immediately. You cannot do anything with this sound handle except call Sound::getOpenState. Any other attempts to use this sound handle will result in the function returning FMOD_ERR_NOTREADY.

    +

    Getting a callback when the sound loads.

    +

    When the sound loads or the stream opens, you can specify a callback using the nonblockcallback member of the FMOD_CREATESOUNDEXINFO structure that is called when the operation is completed.
    +Firstly the callback definition.

    +
    FMOD_RESULT F_CALL nonblockcallback(FMOD_SOUND *sound, FMOD_RESULT result)
    +{
    +    FMOD::Sound *snd = (FMOD::Sound *)sound;
    +
    +    printf("Sound loaded! (%d) %s\n", result, FMOD_ErrorString(result)); 
    +
    +    return FMOD_OK;
    +}
    +
    + +

    And then the createSound call.

    +
    FMOD_RESULT result;
    +FMOD::Sound *sound;
    +FMOD_CREATESOUNDEXINFO exinfo;
    +
    +memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
    +exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
    +exinfo.nonblockcallback = nonblockcallback;
    +
    +result = system->createStream("../media/wave.mp3", FMOD_NONBLOCKING, &exinfo, &sound);
    +ERRCHECK(result);
    +
    + +

    Waiting for the sound to be ready and using it.

    +

    As mentioned, you will have to call Sound::getOpenState to wait for the sound to load in the background. You could do this, or just continually try to call the function you want to call (i.e. System::playSound) until it succeeds.
    +Here is an example of polling the sound until it is ready, then playing it.

    +
    FMOD_RESULT result;
    +FMOD::Sound *sound;
    +result = system->createStream("../media/wave.mp3", FMOD_NONBLOCKING, 0, &sound); // Creates a handle to a stream then commands the FMOD Async loader to open the stream in the background.
    +ERRCHECK(result);
    +
    +do
    +{
    +    FMOD_OPENSTATE state;
    +
    +    result = tmpsnd->getOpenState(&state, 0, 0);
    +    ERRCHECK(result);
    +
    +    if (state == FMOD_OPENSTATE_READY && !channel)
    +    {
    +        result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);
    +        ERRCHECK(result);
    +    }
    +
    +    GameCode();
    +} while (1)
    +
    + +

    or

    +
    do
    +{
    +    if (!channel)
    +    {
    +        result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);
    +        if (result != FMOD_ERR_NOTREADY)
    +        {
    +            ERRCHECK(result);
    +        }
    +    }
    +
    +    GameCode();
    +} while (1)
    +
    + +

    The second loop will simply retry playsound until it succeeds.

    +

    Creating the sound as a streamed FSB file.

    +

    An FSB file will have subsounds in it, so if you open it as a stream, you may not want FMOD seeking to the first subsound and wasting time. You can use the initialsubsound member of the FMOD_CREATESOUNDEXINFO structure to make the non-blocking open seek to the subsound of your choice.

    +
    FMOD_RESULT result;
    +FMOD::Sound *sound;
    +FMOD_CREATESOUNDEXINFO exinfo;
    +
    +memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
    +exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
    +exinfo.initialsubsound = 1;
    +
    +result = system->createStream("../media/sounds.fsb", FMOD_NONBLOCKING, &exinfo, &sound);
    +ERRCHECK(result);
    +
    + +

    Then get the subsound you wanted with Sound::getSubSound.

    +

    Getting a subsound.

    +

    Sound::getSubSound is a free function call normally, all it does is return a pointer to the subsound, whether it be a sample or a stream. It does not execute any special code besides this.
    +What it would cause if it was a blocking stream though, is System::playSound stalling several milliseconds or more while it seeks and reflushes the stream buffer. Time taken can depend on the file format and media.

    +

    If the parent sound was opened using FMOD_NONBLOCKING, then it will set the subsound to be FMOD_OPENSTATE_SEEKING and it will become not ready again until the seek and stream buffer flush has completed.
    +When the stream is ready and System::playSound is called, then the playsound will not stall and will execute immediately because the stream has been flushed.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-spatial-audio.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-spatial-audio.html new file mode 100644 index 0000000..4751e6b --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-spatial-audio.html @@ -0,0 +1,96 @@ + + +White Papers | Spatial Audio + + + + +
    + +
    +

    5. White Papers | Spatial Audio

    + +

    Spatial Audio

    +

    Historically audio spatialization (the process of taking an audio file and making it sound "in the world") has been all about positioning sound in speakers arranged on a horizontal plane. This arrangement is often seen in the form of 5.1 or 7.1 surround. With the advancement of VR technology more emphasis has been put on making sound as immersive as the visuals. This is achieved by more advanced processing of the audio signals for the traditional horizontal plane as well as the introduction of height spatialization. This has given the rise of the term "spatial audio" which focuses on this more realistic approach to spatialization.

    +

    Within FMOD there are several ways you can achieve a more immersive spatialization experience, depending on your target platform some may or may not apply. The following sections outline a few general approaches with specific implementation details contained within.

    +

    Channel based approach

    +

    The most traditional way to approach spatialization is by panning signal into virtual speakers, so with the introduction of 7.1.4 (7 horizontal plane speakers, 1 sub-woofer, 4 roof speakers) you can do just this.

    +
      +
    • Set your FMOD::System to the appropriate speaker mode by calling System::setSoftwareFormat(0, FMOD_SPEAKERMODE_7POINT1POINT4, 0).
    • +
    • Select an output mode capable of rendering 7.1.4 content System::setOutput(FMOD_OUTPUTTYPE_WINSONIC).
    • +
    +

    You can now System::createSound and System::playSound content authored as 7.1.4. If you have the necessary sound system setup (i.e. Dolby Atmos) you will hear the sound play back including the ceiling speakers. If you have a headphone based setup (i.e. Windows Sonic for Headphones or Dolby Atmos for Headphones) you will hear an approximation of ceiling speakers.

    +

    To take an existing horizontal plane signal and push it into the ceiling plane you can create an FMOD spatializer and adjust the height controls.

    + +

    Not only will this let you blend to the 0.0.4 ceiling speakers by setting the value between 0.0 and 1.0, it will also let you blend from the 0.0.4 ceiling speakers to the ground plane 7.1.0 by setting the value between 0.0 and -1.0.

    +

    The FMOD_OUTPUTTYPE_WINSONIC plug-in supports 7.1.4 output available on Windows, UWP, Xbox One and Xbox Series X|S. Also, the FMOD_OUTPUTTYPE_PHASE plug-in supports 7.1.4 output for iOS devices. Other platforms will fold 7.1.4 down to 7.1.

    +

    Object based approach

    +

    To get more discrete spatialization of an audio signal you can use the FMOD object spatializer, so named because the audio signal is packaged with the spatialization information (position, orientation, etc) and sent to an object mixer. Often used to highlight important sounds with strong localization to add interest to a scene, usually used in-conjunction with the channel based approach, be that 7.1.4 or even simply 5.1 / 7.1.

    +
      +
    • Set your FMOD::System to an object ready output plug-in by calling System::setOutput(FMOD_OUTPUTTYPE_WINSONIC) or System::setOutput(FMOD_OUTPUTTYPE_AUDIO3D) or System::setOutput(FMOD_OUTPUTTYPE_AUDIOOUT) or System::setOutput(FMOD_OUTPUTTYPE_PHASE).
    • +
    • Create an object spatializer with System::createDSPByType(FMOD_DSP_TYPE_OBJECTPAN).
    • +
    • Provide 3D position information with FMOD_DSP_OBJECTPAN_3D_POSITION via DSP::setParameterData.
    • +
    +

    There is no limit to how many FMOD_DSP_TYPE_OBJECTPAN DSPs you can create, however there is a limit to how many can be processed at a time. This limit is flexible, and varies from platform to platform. When there are more object spatializers in use than there are available resources for, FMOD virtualizes the least significant sounds by processing with a traditional channel based mix.

    +

    An important consideration, when using object spatializers, is signal flow. Unlike most DSPs, after the signal enters an object spatializer DSP it is sent out to the object mixer. Regardless of whether the object mixer is a software library or a physical piece of hardware, the result is that you no longer have access to that signal. Any processing you would like to perform on that signal must therefore be accomplished before it enters the object spatializer DSP. Despite this, to assist mixing, the object spatializer automatically applies any "downstream" ChannelGroup volume settings.

    +

    Object spatialization is available via the following output plug-ins:

    + +

    Other output plug-ins will emulate object spatialization using traditional channel based panning.

    +

    Third Party Plug-ins

    +

    In addition to the built-in channel and object based approaches there are third party plug-ins available that can assist too. The FMOD DSP plug-in API (see FMOD_DSP_DESCRIPTION) allows any developer to produce an interface for their spatial audio technology and provide it across all FMOD platforms. Additionally the FMOD output plug-in API (see FMOD_OUTPUT_DESCRIPTION) allows developers to implement a renderer for the FMOD object spatializer extending the functionality to more platforms and more technologies.

    +

    Resonance Audio Spatializer
    +Once such third party is the Resonance Audio cross-platform suite of plug-ins that comes bundled with FMOD. Resonance Audio offers a "Source" plug-in which behaves much like the FMOD object spatializer in that audio is sent out to an object mixer, however the final signal returns as binaural output at the "Listener" plug-in. Resonance Audio also offers a "Soundfield" plug-in for playing back first order Ambisonic sound fields. For more details about the usage of Resonance Audio please check out the user guide.

    +

    Oculus Spatializer
    +Another cross-platform suite of spatial audio plug-ins is that offered by Oculus as part of their Audio SDK. You can find instructions and downloads for these available on their website.

    +

    Steam Audio
    +Valve Software offers another cross-platform suite of spatial audio plug-ins as part of their Steam Audio SDK. You can find getting started information available on their website with downloads on GitHub.

    +

    Usage in FMOD Studio

    +

    While all of the functionality above has been presented in the context of the Core API, it is all (including the plug-ins) also available within FMOD Studio. For detailed information about the individual components and their visual representations, read the FMOD Studio User Manual; for a quick overview of where each feature may be found, see below.

    +

    Output mode selection: Edit -> Preferences -> Output Device, set Windows Sonic.

    +
      +
    • 7.1.4 output: Window -> Mixer, select "Master Bus", right click "out" on the deck, set Surround 7.1.4.
    • +
    • Height control: Use the "height" slider that is part of the deck panner on any bus configured as 7.1.4.
    • +
    • Object spatialization: Right click the deck for any event, Add effect -> FMOD Object Spatializer.
    • +
    • Resonance Audio spatialization: Right click the deck for any event, Add effect -> Plug-in effects -> Google -> Resonance Audio Source.
    • +
    +

    Note: When using Windows Sonic output you must first be running Windows 10 Creators Update. You must also configure it for your audio device. Right click the speaker icon in the system tray -> Playback devices -> Right click your default device -> Properties -> Spatial sound -> Spatial sound format, now choose your desired spatial technology. FMOD will use your default output device with the technology you select here.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-studio-3d-events.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-studio-3d-events.html new file mode 100644 index 0000000..0dfe8d3 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-studio-3d-events.html @@ -0,0 +1,90 @@ + + +White Papers | Studio API 3D Events + + + + +
    + +
    +

    5. White Papers | Studio API 3D Events

    + +

    Studio 3D Events

    +

    This section will introduce you to using 3D sound with FMOD Studio events.

    +

    Coordinate Systems and Handedness

    +

    FMOD Studio shares the same coordinate system as the core API. See the 3D Sounds white paper for details.

    +

    Updating orientations

    +

    The programmer needs to call Studio::System::setListenerAttributes once per frame for the listener, and to update 3D events with Studio::EventInstance::set3DAttributes. It is important to update all orientations before calling Studio::System::update. If some orientations are set before Studio::System::update and some are set afterwards, then some frames may end up having old positions relative to others. This is particularly important when both the listener and the events are moving fast and together - if there are frames where the listener moves but the event does not it becomes very noticeable.

    +

    FMOD Spatializer

    +

    FMOD Studio supports spatializing events by placing an FMOD spatializer effect on the event master track. It is possible to use other sorts of spatializers by replacing the FMOD spatializer with a different type of effect, for example a third party spatializer.

    +

    FMOD Object Spatializer

    +

    The object spatializer is a special type of spatializer that interfaces with object-based output modes such as Dolby Atmos. These output modes accept mono signals with a 3D position and do their own spatialization and mixing to the final speaker configuration. To use object spatializers, the programmer has to specify an output mode that supports object based spatialization, otherwise the signal will be mixed down at the final stage by FMOD.

    +

    The benefit of the object spatializer is that it allows the sound designer to leverage object-based technologies. It does come at a cost, however, as the signal leaves the mix at the object spatializer and does not receive the benefit of DSP effects on parent buses like signals run though normal spatializers do. The object spatializer automatically bases its volume on the combined volumes of parent buses for basic mixing, but no complex effects can be used. For this reason, the mix has to be set up very carefully with knowledge of the limitations of the object spatialization.

    +

    It is possible for the sound designer to use a mixture of normal 3D spatialized events and object-spatialized 3D events. Normal events will have signal going through the mixer hierarchy, and object-based events will have signal that leaves the mix at the master track. As far as the programming API goes, both kinds of events are treated exactly the same.

    +

    Automatic Parameters

    +

    FMOD Studio supports setting automations based on parameters that automatically update based on position. For example, the sound designer could add a volume automation based on Distance, with a 2D panning that is automated on the Direction parameter. The event is still considered 3D in that case, even if it has no spatializer on the master track.

    +

    An event may have both a spatializer on the master track, as well as an automation based on a Distance parameter. As the event and listener moves, both the spatializer and the automation will be updated.

    +

    Multiple Listeners

    +

    FMOD Studio supports multiple listeners. Call Studio::System::setNumListeners to set the number of listeners, and use Studio::System::setListenerAttributes to set the orientations for listeners, with an index for the listener.

    +

    Studio Spatialization for Multiple Listeners

    +

    Consider the case of an event with three nearby listeners. In this case, listener A is slightly closer to the event than B, and C is the furthest away, outside the max distance of the event.

    +

    The Studio spatializer will take listener A and B into account. The gain will be based off the closest listener distance (in this case, the distance to listener A). Listener B will have an effect on the spatialization. However, both A and B agree that the event is to the front, so the final pan matrix will be towards the front speakers. Listener C has no effect on the calculation since it is out of range.

    +

    Multiple listeners

    +

    Consider this case where listener A and B have moved and now the event is to the right of A and to the left of B. In this case, the gain will be based of the closest listener distance (which is B), but the pan matrix will have signal out of both the left and the right since both listeners have an effect on the mix. If A moved further away then the contribution of A would diminish and to the signal would start to come more out of the left speakers. If A moved further enough away, the signal would smoothly interpolate to just B having an influence on the spatialization.

    +

    Multiple listeners

    +

    Studio Spatialization for Listener Weights

    +

    Listener weights can be set using Studio::System::setListenerWeight. This allows listeners to fade in and out of existence, as well as to allow cross-fading of listeners to a new position. In the following picture, we have 4 listeners. Listener C is out of range so it has no influence, and listener D has 0% weighting so it has no influence either. The remaining two listeners have a weight of 40% and 60%. In this example, perhaps the camera is teleporting to a new position and the game is smoothly interpolating to a new orientation.

    +

    The gain is a weighted average between A and B, so it is equivalent to having a distance somewhere between the two listeners. The spatialization of the signal is a mixture of A and B. A is further away and has a lower weight, so the biggest contribution is due to B, meaning the signal sounds mostly in the front speakers. If you imagine blending from A to B, the signal will smoothly interpolate from the back speakers to the front and get louder when the weights scale from A to B.

    +

    Multiple listener weights

    +

    Listener Mask

    +

    Events can have a mask that specifies which listeners are active for that event. By default all listeners apply to all events. By calling Studio::EventInstance::setListenerMask, some listeners can be disabled for that event so that they have no influence on the panning. This could be used to group some events and listeners together and have that set only affected by that one listener. When performing the calculation above, any listener not included in the mask is ignored and is as if it does not exist for that event. It is an error to set a combination of mask and weight such that no listener is active for an event.

    +

    Doppler

    +

    FMOD events support doppler. The sound designer specifies doppler on a per event basis with a scale, so some events may be affected less than others. Doppler is calculated using listener and event velocities; it is up to the programmer to correctly specify velocity values using Studio::EventInstance::set3DAttributes and Studio::System::setListenerAttributes. The scale of doppler can be specified at initialization time using System::set3DSettings.

    +

    For the case of multiple listeners, the doppler is based on the closest listener. If listener has a weight then it is a combination of the closest listeners up to 100%. For example if there were three listeners at increasing distance with weight of 60%, 60% and 60%, then the doppler would be calculated from 60% of the first listener, 40% of the second, and 0% of the third.

    +

    Automatic Parameters and Multiple Listeners

    +

    If there are multiple listeners, an FMOD Studio event's automatic parameters are based on the closest listener. If the closest listener has a weight, then the event's automatic parameters instead use a combination of the closest listeners, up to a total weight of 100%. For example, if there are three listeners at increasing distance with weights of 60%, 60% and 60%, then the automatic parameters would be calculated from 60% of the first listener, 40% of the second, and 0% of the third.

    +

    Interface with Core API

    +

    When calling Studio::System::setNumListeners and Studio::System::setListenerAttributes, there is no need to call the equivalent Core API functions System::set3DNumListeners and System::set3DListenerAttributes, as FMOD Studio passes the information into the Core API automatically. This means it is possible to have a mixture of FMOD Studio 3D events and Core API 3D Channels playing at the same time.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-studio-threads.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-studio-threads.html new file mode 100644 index 0000000..dfe0134 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-studio-threads.html @@ -0,0 +1,59 @@ + + +White Papers | Studio API Threads + + + + +
    + +
    +

    5. White Papers | Studio API Threads

    + +

    Studio Thread Overview

    +

    This section will describe how Studio execution works in regards to threads.

    +

    Studio Synchronous Mode

    +

    If Studio::System::initialize is called with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE, then Studio will be created in synchronous mode. In this mode, all Studio API commands are executed during Studio::System::update.

    +

    As part of that Studio update, it will automatically call the core System::update to ensure that the core system is updated properly.

    +

    Studio Thread Synchronous

    +

    The above diagram shows Studio commands being called from the game thread in Studio. It also shows the core mixer thread, which is triggered based on the hardware output device. The core mixer thread normally has a period of 5ms, 10ms, or 20ms, depending on the platform. It can also be customized with System::setDSPBufferSize and System::setSoftwareFormat.

    +

    When running in this mode, Studio must deal with the fact that the core mix can execute at any time. For instance, an event may have two timelocked instruments that should start at the same time. Studio schedules sounds a mix block later so that even if the mix jumps in, all scheduled events will occur in the same mix block.

    +

    Studio Asynchronous Mode

    +

    The default operation is for Studio to create its own asynchronous thread for execution. In this mode, Studio API commands are enqueued and executed in the Studio asynchronous thread. The commands are batched up so that they are only sent to the asynchronous thread at the end of the next Studio::System::update. This prevents some Studio commands from executing earlier than others, which could cause glitches. For instance, if an event position is updated, and the listener position is updated, those two commands will always be executed together.

    +

    Studio Thread Asynchronous

    +

    In asynchronous mode, the Studio processing occurs every 20ms and is triggered off the core mixer. The core mix is split into parts, premix, midmix and postmix. It is the core premix that executes any enqueued core commands and updates DSP clocks. By triggering the asynchronous Studio processing at the end of the premix, Studio can assume that the mix isn't going to jump in as the asynchronous update is executing. Unlike the first case, Studio can also assume that the update will be called in a timely manner, even if the game's main thread has a framerate spike.

    +

    The size of the Studio asynchronous command buffer can be customized by calling Studio::System::setAdvancedSettings. If there is not enough space for commands, then a stall will occur until the asynchronous update has consumed enough commands. Studio::System::getBufferUsage can be used to measure if any stalls have occurred due to the command buffer not being large enough.

    +

    Game Controlled Worker Thread

    +

    Another command situation is for the game to have its own worker thread that invokes Studio using FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE. This is very similar to the first diagram, except that execution is in a worker rather than the game thread. It is up to the game thread how it wishes to synchronize with the rest of the game. It could be triggered per game frame, or with a fixed period.

    +

    In this mode, it is up to the developer to ensure that commands are not split across system updates. For example, consider the case where the game thread issues commands for the worker thread, and the worker thread wakes up periodically to execute those commands. In that case, the worker thread may wake up and execute some commands but not others, causing subtle issues with the sound playback. Instead, the commands to the worker thread should be batched up to avoid slicing commands. Or even better, just use the inbuilt asynchronous mode to do the command batching instead.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-threads.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-threads.html new file mode 100644 index 0000000..b7c90e2 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-threads.html @@ -0,0 +1,83 @@ + + +White Papers | Threads and Thread Safety + + + + +
    + +
    +

    5. White Papers | Threads and Thread Safety

    + +

    Threads and Thread Safety

    +

    This section will describe the threads FMOD uses, and the thread safety offered by both the Studio API and the Core API.

    +

    FMOD Thread Types

    +

    Studio Thread

    +

    This thread processes all Studio API commands and updates Studio events. It is created during Studio::System::initialize by default, unless FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE is specified as an init flag.

    +

    Mixer Thread

    +

    This thread is the software mixing thread. This is the thread that does the real work of mixing the DSP graph. It is created at System::init.

    +

    Stream Thread

    +

    This thread is used for decoding streams. It is created the first time a sound is loaded as a stream in System::createSound with FMOD_CREATESTREAM, or System::createStream.

    +

    Async Loading Thread

    +

    This thread is created the first time a sound is loaded with the FMOD_NONBLOCKING flag in System::createSound.

    +

    File Reading Thread

    +

    This thread is used for reading from disk for streams, to then be decoded (decompressed) by the Stream thread. It is created the first time a sound is loaded as a stream in System::createSound with FMOD_CREATESTREAM, or System::createStream.

    +

    Thread Affinity

    +

    On some platforms, FMOD thread affinity can be customised. See the platform specific Platform Details page for more information.

    +

    FMOD Callback Types

    +

    FMOD File and memory callbacks can possibly be called from an FMOD thread. Remember that if you specify file or memory callbacks with FMOD, to make sure that they are thread safe. FMOD may call these callbacks from other threads.

    +

    FMOD Thread Safety

    +

    Studio API Thread Safety

    +

    By default, the Studio API is completely thread safe, and all commands execute on the Studio API update thread. In the case of a function that returns a handle, that handle is valid as soon as the function returns it, and all functions using that handle are immediately available. As such, if a command is delayed, the delay is not immediately obvious, and does not delay subsequent commands on the thread.

    +

    If Studio::System::initialize is called with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE, then Studio will not be thread-safe as it assumes all calls will be issued from a single thread. Commands in this mode will be queued up to be processed in the next Studio::System::update call. This mode is not recommended except for testing or for users who have set up their own asynchronous command queue already and wish to process all calls on a single thread. See the Studio Thread Overview for further information.

    +

    Core API Thread Safety

    +

    By default, the Core API is initialized to be thread safe, which means the API can be called from any game thread at any time. Core API thread safety can be disabled with the FMOD_INIT_THREAD_UNSAFE flag in System::init or Studio::System::initialize. The overhead of thread safety is that there is a mutex lock around the public API functions and (where possible) some commands are enqueued to be executed the next system update. The cases where it is safe to disable thread safety are:

    +
      +
    • The game is using Studio API exclusively, and never issues Core API calls itself.
    • +
    • The game is using the Core API exclusively, and always from a single thread at once.
    • +
    • The game is using Studio API and Core API at the same time, but FMOD Studio is created with FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE and the Core API calls are done in the same thread as the Studio API calls.
    • +
    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-transitioning-from-fmodex.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-transitioning-from-fmodex.html new file mode 100644 index 0000000..7a98957 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-transitioning-from-fmodex.html @@ -0,0 +1,343 @@ + + +White Papers | Transitioning from FMOD Ex + + + + +
    + +
    +

    5. White Papers | Transitioning from FMOD Ex

    +
    + +
    +

    Transitioning between FMOD Ex and FMOD Studio

    +

    This section describes the differences between FMOD Ex and FMOD Studio.

    +

    Studio API Versus FMOD Designer API

    +

    The Studio API is conceptually similar to the old FMOD Designer API, but most classes have been renamed, and some have been removed or split up.

    +

    EventSystem and EventSystem_Create

    +

    The Studio::System class is analogous to the old EventSystem class. The static Studio::System::create function is analogous to the old EventSystem_Create function.

    +

    EventProject

    +

    The Studio::Bank class is analogous to the old EventProject class.

    +

    FEV and FSB Files

    +

    Each FMOD Designer project produced a single .fev file and multiple .fsb files. In contrast, an FMOD Studio project produces multiple .bank files, which contain event metadata as well as sample data. See the Studio::System::loadBankFile, Studio::Bank::loadSampleData, and Studio::EventDescription::loadSampleData functions. The core API still supports loading .fsb files directly.

    +

    EventGroup

    +

    FMOD Studio doesn't have the concept of EventGroups. Events can be placed in folders, but this has no significance at runtime. To achieve the loading control formerly provided by EventGroups, events can be placed in different banks.

    +

    Event

    +

    The old Event class has been split into two classes: Studio::EventDescription and Studio::EventInstance. Studio::EventDescription holds the static data that describes an event, while Studio::EventInstance is a playable instance of an event. These two classes correspond to old Event objects retrieved by calling getEvent with or without the FMOD_EVENT_INFOONLY flag.

    +

    The FMOD Designer API used to create a fixed number of event instances when you first called getEvent without FMOD_EVENT_INFOONLY, whereas the Studio API creates a single instance each time you call Studio::EventDescription::createInstance. This gives you more control over the memory usage for each event.

    +

    Retrieving Events

    +

    Events can be retrieved by ID (using Studio::System::getEventByID) or by path (using Studio::System::getEvent).

    +

    Event IDs are GUIDs (globally unique identifiers), and stay the same even if the event is renamed or moved around in the project. IDs can be parsed from a string using Studio::parseID, or looked up from a path using Studio::System::lookupID if the "Master Bank.strings.bank" file is loaded.

    +

    Event paths consist of the string "event:/", followed by the the path to the event within the project's folder structure. To retrieve events by path, the "Master Bank.strings.bank" file must be loaded.

    +

    EventParameter

    +

    There is no class analogous to the old EventParameter class. Instead use the parameter getting and setting functions in Studio::EventInstance: Studio::EventInstance::getParameterByID, Studio::EventInstance::getParameterByName, Studio::EventInstance::setParameterByID, Studio::EventInstance::setParameterByName, Studio::EventInstance::setParametersByIDs.

    +

    Sustain Points and Key Off

    +

    The old EventParameter class had a keyOff function to move past the next sustain point. In FMOD Studio and the Studio API, this behavior is implemented via a built-in KeyOff that can be triggered via Studio::EventInstance::keyOff.

    +

    EventCategory

    +

    Event categories have been replaced in FMOD Studio by buses and VCAs, which provide much more functionality to the sound designer. In the Studio API, buses and VCAs are accessed via the Studio::Bus and Studio::VCA classes.

    +

    EventReverb

    +

    The EventReverb class has been removed. Similar functionality can be implemented using events with automatic distance parameters controlling reverb snapshots.

    +

    EventQueue and EventQueueEntry

    +

    FMOD Studio doesn't have the concept of event queues.

    +

    MusicSystem and MusicPrompt

    +

    Interactive music in FMOD Studio is implemented inside the event editor, so the MusicSystem and MusicPrompt classes have been removed.

    +

    NetEventSystem

    +

    Whereas the old network tweaking API was implemented as a separate fmod_event_net library, the FMOD Studio live update system is built into the main API library, and can be enabled by passing FMOD_STUDIO_INIT_LIVEUPDATE to Studio::System::initialize.

    +

    FMOD Studio's Core API Versus FMOD Ex's Core API

    +

    New features

    + +

    The FMOD Engine now handles the speaker mode automatically. Starting the Core API is as simple as calling System::init, and does not require querying caps or speaker modes to make the FMOD Engine's software mixer match that of the operating system. If you want the software mixer to be forced into a certain speaker mode, disregarding the operating system, use System::setSoftwareFormat. The FMOD Engine will automatically downmix or upmix this mode if the user's system is not the same speaker mode as the one selected for the software engine. Where possible, Dolby or internal downmixing will be used to achieve better surround effect.

    +

    Added new DSP effects

    +

    The following new DSP effects are added. (From fmod_dsp_effects.h)

    +
    FMOD_DSP_TYPE_SEND,               /* This unit sends a copy of the signal to a return DSP anywhere in the DSP tree. */
    +FMOD_DSP_TYPE_RETURN,             /* This unit receives signals from a number of send DSPs. */
    +FMOD_DSP_TYPE_HIGHPASS_SIMPLE,    /* This unit filters sound using a simple highpass with no resonance, but has flexible cutoff and is fast. Deprecated and will be removed in a future release (see FMOD_DSP_HIGHPASS_SIMPLE remarks for alternatives). */
    +FMOD_DSP_TYPE_PAN,                /* This unit pans the signal, possibly upmixing or downmixing as well. */
    +FMOD_DSP_TYPE_THREE_EQ,           /* This unit is a three-band equalizer. */
    +FMOD_DSP_TYPE_FFT,                /* This unit simply analyzes the signal and provides spectrum information back through getParameter. */
    +FMOD_DSP_TYPE_LOUDNESS_METER,     /* This unit analyzes the loudness and true peak of the signal. */
    +FMOD_DSP_TYPE_CONVOLUTIONREVERB,  /* This unit implements convolution reverb. */
    +FMOD_DSP_TYPE_CHANNELMIX,         /* This unit provides per signal channel gain, and output channel mapping to allow 1 multi-channel signal made up of many groups of signals to map to a single output signal. */
    +FMOD_DSP_TYPE_TRANSCEIVER,        /* This unit 'sends' and 'receives' from a selection of up to 32 different slots.  It is like a send/return but it uses global slots rather than returns as the destination.  It also has other features.  Multiple transceivers can receive from a single channel, or multiple transceivers can send to a single channel, or a combination of both. */
    +FMOD_DSP_TYPE_OBJECTPAN,          /* This unit sends the signal to a 3d object encoder like Dolby Atmos.   Supports a subset of the FMOD_DSP_TYPE_PAN parameters. */
    +FMOD_DSP_TYPE_MULTIBAND_EQ,       /* This unit is a flexible five band parametric equalizer. */
    +
    + +

    Note FMOD's convolution reverb also has the option to be GPU accelerated for big performance wins.

    +

    New file format support

    +

    FMOD_SOUND_TYPE_FADPCM is a new highly optimized, branchless ADPCM variant which has higher quality than IMA ADPCM, and better performance. Great for mobiles.

    +

    Dolby Atmos support

    +

    Through the FMOD object panner, sounds can be positioned spherically in 3d space to support Dolby Atmos. This includes height speakers.

    +

    New DSP mixing engine

    +

    The FMOD Engine's software mixing engine is more flexible than that of FMOD Ex, with support for changing channel formats and speaker modes as the signal flows through the mix. THe FMOD Engine's software mixing engine also has better custom DSP support, with branch idling, silence detection, sends and returns, side-chaining, circular connections and more.

    +

    Added plug-in info helper function

    +

    System::getDSPInfoByPlugin has been added to plug the gap between loading a plug-in, and getting its FMOD_DSP_DESCRIPTION structure so that it can be passed to System::createDSP.

    +

    Added background suspension support

    +

    For mobile devices, System::mixerSuspend and System::mixerResume allows you to halt FMODs cpu mixer and thread before sleeping or answering a call or any other interruption event.

    +

    ChannelGroups volume and panning are now DSP based, rather than reaching down to the Channels of the child ChannelGroups.

    +

    ChannelGroups in FMOD Ex were a way to scale and modify the pan and volume of the Channels in the ChannelGroups below. The FMOD Engine now modifies pan and volume on a DSP basis using the fader DSP unit. A fader unit can be repositioned in its own effect list, allowing effects to be either post- or pre-fader effects.

    +

    Added additional output streams

    +

    System::attachChannelGroupToPort and System::detachChannelGroupFromPort allows signals to be sent to alternate sound outputs like headsets, controllers with speakers, and console based multi speaker arrays that are not the standard surround sound speaker output.

    +

    Added Sound helper function

    +

    Added the ability for a child sound (subsound) to query for its parent via Sound::getSubSoundParent.

    +

    Added sample volume control

    +

    ChannelControl::addFadePoint, ChannelControl::removeFadePoints and ChannelControl::getFadePoints give the ability to set up a volume fade or ramp between any 2 clock points is possible. Link up multiple fade points to create envelopes. All fading is clock accurate and compensated for when pitch is changed. ChannelControl::setVolumeRamp / ChannelControl::getVolumeRamp can be used when queuing sounds up and for other reasons, it can be desirable to turn off ramping of volume changes, so the ability has been added to turn volume ramping (declicking) off or on per Channel/ChannelGroup.

    +

    Added UTF8 support

    +

    Functions such as System::getDriverInfoW have been removed in favour of UTF8 support.

    +

    Added concept of a 'fader' DSP per Channel and ChannelGroup

    +

    Each Channel and ChannelGroup has a built in 'fader' (FMOD_DSP_TYPE_FADER). This also acts as the DSP 'head' of the Channel or ChannelGroup by default.
    +This can of course be changed later. If you add an effect, you can position it to be the head, and the fader will be before that in the signal chain.
    +A fader DSP simply adjusts volume of the signal for a mix, and also supports sample accurate volume fade points, for envelopes and fade ins / fade outs.
    +A panner is a separate entity which can pan a sound in mono, stereo and surround using a variety of parameters including position/direction/extent/rotation/axis control and 3d position control.
    +The order of processing of a fader and panner can be controlled using ChannelControl::setDSPIndex, and it can be positioned into an effect chain so that panning comes before an effect or after, with fading coming at a different position in the effect chain.

    +

    New DSPConnection types supported

    +

    DSP::addInput now has a new optional parameter to describe the connection's behavior between 2 DSP units. FMOD_DSPCONNECTION_TYPE has been added to tell an input DSP that it should mix to a 'sidechain' buffer, which is a special buffer for DSP units that want to process a sidechain (for example a compressor) through a DSP unit's FMOD_DSP_STATE structure. This signal is not audible but is used to affect behavior within the DSP. FMOD_DSPCONNECTION_TYPE_SIDECHAIN would be used here.
    +It should only consume existing data, not execute the input to generate that data. FMOD_DSPCONNECTION_TYPE_SEND would be used here. This can be useful for graph dependency reasons, so that an input is not executed before it should be.

    +

    New DSP parameter types

    +

    In FMOD Ex, only float parameters were supported. Now Int, Bool and Data parameters are supported.
    +Use:

    + +

    Changes

    +

    FMOD_HARDWARE support

    +

    The FMOD Engine's software mixing is sufficiently advanced that it can do things that would be impossible with the limited features of hardware voices. Today, when multicore processors are common even on mobile platforms, hardware voice support provides no real advantage; not when the FMOD Engine can be faster, better quality, and more flexible. As such, all sounds and voices handled by the FMOD Engine are software mixed.

    +

    API changes:

    +
      +
    • System::setHardwareChannels is removed
    • +
    • System::getDriverCaps is removed. systemrate, speakermode, speakermodechannels parameters have been added to System::getDriverInfo to provide the information which may be important to the developer. Similarly, System::getRecordDriverCaps has been removed, in favour of System::getRecordDriverInfo.
    • +
    • System::setSpeakerMode and System::getSpeakerMode are removed, and instead are now moved into System::setSoftwareFormat because 'speakermode' now only affects the internal mixer, and the operating system speaker mode is matched at runtime through matrix upmixing or downmixing (automatically).
    • +
    +

    FMOD Ex had Channels and ChannelGroups, now it seems they are merged into 'ChannelControl'?

    +

    Channels and ChannelGroups had some similar functionality in FMOD Ex (ie setVolume, setPaused), but the FMOD Engine takes it even further. The FMOD Engine is designed so that ChannelGroups can have a lot more control, including allowing pausing and muting at the DSP node level, adding effects, and positioning in 3D.

    +

    Converting FMOD Reverb parameters

    +

    The FMOD Engine handles reverb parameters differently to FMOD Ex. Use this table to convert from FMOD Ex parameters to FMOD Engine parameters.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FMOD Engine propertyRangeFMOD Ex property / conversion formula to create FMOD Engine value
    DecayTime (ms)100 to 20000DecayTime * 1000
    EarlyDelay (ms)0 to 300ReflectionsDelay * 1000
    LateDelay (ms)0 to 100ReverbDelay * 1000
    HFReference (Hz)20 to 20000HFReference
    HFDecayRatio (%)0 to 100DecayHFRatio * 100
    Diffusion (%)0 to 100Diffusion
    Density (%)0 to 100Density
    LowShelfFrequency (Hz)20 to 1000LFReference
    LowShelfGain (dB)-48 to 12RoomLF / 100
    HighCut (Hz)20 to 20000IF RoomHF < 0 THEN HFReference / sqrt((1-HFGain) / HFGain) ELSE 20000
    EarlyLateMix (%)0 to 100IF Reflections > -10000 THEN LateEarlyRatio/(LateEarlyRatio + 1) * 100 ELSE 100
    WetLevel (dB)-80 to 2010 * log10(EarlyAndLatePower) + Room / 100
    +

    Note: Clamp all values to maximum (after conversion) as some conversions may exceed the new parameter range.

    + + + + + + + + + + + + + + + + + + + + + +
    Intermediate variables used in conversionFormulas
    LateEarlyRatiopow(10, (Reverb - Reflections) / 2000)
    EarlyAndLatePowerpow(10, Reflections / 1000) + pow(10, Reverb / 1000)
    HFGainpow(10, RoomHF / 2000)
    +

    System::set3DSpeakerPosition renamed

    +

    System::setSpeakerPosition is a minor name change to denote that 3d and 2d positioning is affected by speaker location.

    +

    FMOD_CHANNEL_FREE / FMOD_CHANNEL_REUSE removed. Default ChannelGroup now passed to playSound if needed

    +

    System::playSound and System::playDSP now do not take a 'channel' parameter. All channels behave the same way as FMOD_CHANNEL_FREE would have in FMOD Ex.
    +Seeing as a parameter was removed from playSound/playDSP, a new one was added to remove the overhead of disconnecting and reconnecting DSP graph nodes after playSound was called, so that they could be hooked up to a new ChannelGroup other than the master ChannelGroup. Consider this addition a performance optimization, and a simplification in API calls.

    +

    CDROM / CDDA support removed

    +

    Legacy support for CDROM redbook audio playback has been removed due to lack of interest and issues with maintaining said code.

    +

    System::getSpectrum and System::getWaveData removed

    +

    Add a custom DSP unit to capture DSP wavedata from the output stage. Use the master ChannelGroup's DSP head with System::getMasterChannelGroup and ChannelControl::getDSP.
    +Add a built in FFT DSP unit type to capture spectrum data from the output stage. Create a built in FFT unit with System::createDSPByType and FMOD_DSP_TYPE_FFT, then add the effect to the master ChannelGroup with ChannelControl::addDSP. Use DSP::getParameterData to get the raw spectrum data or use DSP::getParameterFloat to get the dominant frequency from the signal.

    +

    'W' function wide char support removed

    +

    Functions such as System::getDriverInfoW have been removed in favour of UTF8 support.

    +

    System::setReverbAmbientProperties removed

    +

    The 'background' ambient reverb for a 3d reverb system is now just the standard reverb set with System::setReverbProperties.

    +

    System::getDSPClock removed

    +

    Use the DSP clock of the master ChannelGroup instead with System::getMasterChannelGroup and ChannelControl::getDSPClock.

    +

    getMemoryInfo functions have been removed from all classes

    +

    Due to the unreliability of the function in FMOD Ex due to caching, threads, and shared memory throwing results out, the function has been removed. Alternate memory tracking methods will be added later. FMOD::Memory_GetStats and logging is the best way to track memory at the moment.

    +

    Sound::setVariations and Sound::getVariations have been removed

    +

    Due to this being a 'helper' function that can easily be achieved in user code, this was deemed not necessary and removed.

    +

    Sound::setSubSoundSentence has been removed

    +

    This function has been removed in favour of the extremely precise and more reliable ChannelControl::setDelay functionality. 2 or more sounds can be queued up to play end to end using this function, with the added benefit of cross fades and overlaps.

    +

    setDelay and clock functions now use 64bit 'long long' type rather than than 32bit hi and 32bit low part parameters.

    +

    Due to the complexity of working in fixed point, and seeing as there is a consistent 64bit type for all compilers in long long that FMOD supports, we have switched to this type.
    +1 32bit value would wrap around in 24 hours at 48khz, so 64bit values will last for 12 million years which should be enough to avoid in game clock wrap around.

    +

    Channel::setSpeakerMix, Channel::setSpeakerLevels, Channel::setInputChannelMix, Channel::getPan, Channel::getSpeakerMix and Channel::getSpeakerLevels removed

    +

    A cleaner replacement has been made for these functions,

    + +

    Note that because setPan, setMixLevelsOutput and setMixLevelsInput all affect a final pan matrix, only getMixMatrix is available as the 'getter'. There is no more exclusive mode for the panning technique like there was in FMOD Ex. All 3 functions can now affect the final matrix. The setMixMatrix function now allows instant setting of a full matrix for performance reasons, rather than calling setSpeakerLevels each time for each speaker.

    +

    DSPConnection::setLevels/getLevels have been removed.

    +

    As above, new functionality is available to produce the same result. Rather than setting output levels row by row, a full 2 dimensional matrix is supplied with DSPConnection::setMixMatrix.

    +

    Channel::set3DPanLevel misnomer renamed

    +

    The FMOD Ex function did not actually only affect pan, it also affected doppler and distance attenuation so to call it 'pan' level was not really correct. THe FMOD Engine corrects this with ChannelControl::set3DLevel.

    +

    'override' functions removed from ChannelGroup class

    +

    Because volume/pitch/muting/reverb properties and pausing has been added as a ChannelGroup concept at the DSP level, ChannelGroups no longer rely on their 'channels' to do pausing and muting type logic. The ChannelGroup's DSP itself will directly mute/pause etc, thanks to the removal of FMOD_HARDWARE support.

    +

    System::addDSP removed from the System API

    +

    Rather than using the 'system' to add a DSP to, the user must use System::getMasterChannelGroup which gets the top level ChannelGroup, then use ChannelControl::addDSP to add the DSP to it, which effectively puts at the end of the signal chain.

    +

    DSP::remove removed from the DSP API

    +

    Effects that are added with ChannelControl::addDSP are owned by the ChannelControl that added it, and therefore must be removed with ChannelControl::removeDSP, instead of having the DSP removing itself. This helps the ChannelGroup or Channel manage resources.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-using-multiple-reverbs.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-using-multiple-reverbs.html new file mode 100644 index 0000000..18db084 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-using-multiple-reverbs.html @@ -0,0 +1,80 @@ + + +White Papers | Using Multiple Reverbs + + + + +
    + +
    +

    5. White Papers | Using Multiple Reverbs

    + +

    Using multiple reverbs

    +

    In some situations, multiple styles of reverberations within a single environment must be modeled. For example, imagine a large church hall with a tunnel down into the catacombs. The reverb applied to the player's footsteps within the church hall (such as FMOD_PRESET_STONEROOM) could be quite different to that of the monster sounds emitting from the tunnel (which may be applied with both FMOD_PRESET_SEWERPIPE and FMOD_PRESET_STONEROOM). To handle this situation, multiple instances of the reverb DSP are required. As many as four instances of the reverb DSP can be added to the FMOD DSP graph, though each instance incurs a cost of more CPU time and memory usage.

    +

    FMOD Studio allows a sound designer to design their own reverbs, add them to group buses, and use sends and mixer snapshots to control the reverb mix. In this white paper, however, we will look at examples of using the Core API to add reverbs, query an instance's reverb properties, and control the wet/dry mix of each reverb instance on a per-channel basis.

    +

    Should you want to model multiple reverbs types within an environment without the extra resource expense of multiple reverbs, see the 3D Reverb white paper, which covers using automated 3D reverb zones to simulate reverb for different environments using only a single reverb instance.

    +

    Setting up the reverbs

    +

    Below is an example of setting up four reverb instances. You do not need to explicitly create the extra reverb instance DSP objects, as the FMOD engine creates them and connects them to the DSP graph when you reference them.

    +

    In the following example we will use System::setReverbProperties to specify four different reverb effects.

    +

    First we define four different FMOD_REVERB_PROPERTIES structures. The example below uses presets. You can define your own reverb settings but presets make it easier to get some common reverbs working. See FMOD_REVERB_PRESETS.

    +
    FMOD_REVERB_PROPERTIES prop1 = FMOD_PRESET_HALLWAY;
    +FMOD_REVERB_PROPERTIES prop2 = FMOD_PRESET_SEWERPIPE;
    +FMOD_REVERB_PROPERTIES prop3 = FMOD_PRESET_PARKINGLOT;
    +FMOD_REVERB_PROPERTIES prop4 = FMOD_PRESET_CONCERTHALL;
    +
    + +

    We then supply the 'instance' parameter to set which reverb DSP unit will be used for each preset, whilst calling the System::setReverbProperties function.

    +
    result = system->setReverbProperties(0, &prop1);
    +result = system->setReverbProperties(1, &prop2);
    +result = system->setReverbProperties(2, &prop3);
    +result = system->setReverbProperties(3, &prop4);
    +
    + +

    Getting the reverb properties

    +

    Should you wish to get the current System reverb properties, you must specify the instance number in the 'instance' parameter when calling System::getReverbProperties. In this example we will get the properties for Instance 3.

    +
    FMOD_REVERB_PROPERTIES prop = { 0 };
    +result = system->getReverbProperties(3, &prop);
    +
    + +

    Setting the wet/dry mix per Channel

    +

    You can set the wet/dry mix for each reverb on a channel of the FMOD Engine's mixer with ChannelControl::setReverbProperties. By default, a channel sends to all instances. This example sets the instance 1 send value to linear 0.0 (-80 db) (off).

    +
    result = channel->setReverbProperties(1, 0.0f);
    +
    + +

    To get the reverb mix level to be full volume again, simply set it to 1 (0db)

    +
    result = channel->setReverbProperties(1, 1.0f);
    +
    + +

    This system supercedes the now obsolete method of using FMOD_REVERB_CHANNELPROPERTIES and flags to specify which instance.

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-virtual-voices.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-virtual-voices.html new file mode 100644 index 0000000..63130be --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers-virtual-voices.html @@ -0,0 +1,115 @@ + + +White Papers | Virtual Voices + + + + +
    + +
    +

    5. White Papers | Virtual Voices

    + +

    Virtual Voice System

    +

    The Core API includes an efficient virtual voice system. The Studio API adds another layer of control on top of that with event polyphony. This white paper describes how best to take advantage of the virtual voice system.

    +

    Core API Virtual Channels

    +

    The Core API includes a virtual voice system. It allows you to play hundreds or even thousands of sounds at once, but only have a small number actually producing sound. For example, a dungeon may have 200 torches burning on the wall in various places, but only the loudest will be really playing. This is because the FMOD Engine dynamically makes Channels virtual or real depending on their real time audibility, such that a sound which is playing far off or with a low volume becomes virtual, but changes back to being a real Channel when it comes closer or becomes louder due to Channel or ChannelGroup API calls.

    +

    Audibility Calculation

    +

    The virtual voice system automatically takes into account the following when calculating audibility:

    + +

    A Channel can be queried for whether it is virtual with the Channel::isVirtual function. When going virtual, the sound's time will still be ticked and any fade points will still continue to interpolate. Any additional DSPs attached to the Channel will be preserved. When the Channel becomes real again, it will resume as if it had been playing properly.

    +

    Peak Volume

    +

    Peak volume is available for sounds that are exported via FSBank as long as the "Write peak volume" option is enabled. FMOD Studio tool always enables this flag when exporting banks, so FMOD Studio sounds will always have a peak volume. If the peak volume is not present (such as a loose wav file), then the sound will be treated as if it had full volume.

    +

    Sound Priority

    +

    FMOD provides a simple and powerful way of controlling which Channels go virtual, by using a Channel priority. Channel priority set with Channel::setPriority or Sound::setDefaults, where a smaller integer value corresponds to a higher (more important) priority. If a Channel is a higher priority than another, then it will always take precedence regardless of its volume, distance, or gain calculation. Channels with a high priority will never be stolen by those with a lower priority, ever. The only time a Channel with a high priority will go virtual is if other Channels with an equal or even higher priority are playing, or if FMOD_INIT_VOL0_BECOMES_VIRTUAL has been specified and the sound is effectively silent.

    +

    Important sounds should have higher priority and it is up to the user to decide if some sounds should be more important than others. An example of an important sound might be a 2D menu or GUI sound or beep that needs to be heard above all other sounds. Avoid using too many priority levels in a fine-grained way. If a sound has a higher priority it will never be stolen, even if it is very quiet compared to a lower priority sound.

    +

    VOL0 Virtual

    +

    An important part of the virtual voice system is the FMOD_INIT_VOL0_BECOMES_VIRTUAL flag. When this flag is enabled, Channels will automatically go virtual when their audibility drops below the limit specified in the FMOD_ADVANCEDSETTINGS vol0virtualvol field. This is useful to remove sounds which are effectively silent, which is both a performance and quality improvement. Since it is only removing silent sounds, there should be no perceived difference in sound output when enabling this flag.

    +

    It is strongly recommended that FMOD_INIT_VOL0_BECOMES_VIRTUAL is specified in System::init or Studio::System::initialize, and that the FMOD_ADVANCEDSETTINGS::vol0virtualvol field is set to a small non-zero amount, such as 0.001. If you're using the Studio API, System::setAdvancedSettings can be called by getting the Studio::System::getCoreSystem after Studio::System::create but before Studio::System::initialize.

    +

    Software Channels vs Virtual Channels

    +

    To set the number of virtual Channels FMOD will use, call System::init with the number of virtual Channels specified in the maxchannels parameter. To set the number of software mixed Channels available, use System::setSoftwareChannels. A further limit is available per codec by using FMOD_ADVANCEDSETTINGS.

    +

    If the virtual Channel limit is hit then Channels will be stolen and start returning FMOD_ERR_INVALID_HANDLE. Channels which have had their handle stolen in this way are permanently stopped and will never return.

    +

    Assuming the number of playing Channels is below the maximum virtual Channel limit, then the Channel handle will remain valid, but the Channel may be virtual or real depending on audibility. The maximum number of real playing Channels will be the limit set by System::setSoftwareChannels, or the limits of the codecs set with FMOD_ADVANCEDSETTINGS.

    +

    For typical games, it is reasonable to set the maxchannels value of System::init to some high value, from a few hundred up to a thousand or more. The number of real software Channels is often set lower, at anywhere from 32 to 128. This allows the game to create and keep track of a large number of Channels, but still limit the CPU cost by having a small number actually playing at once.

    +

    Virtual to Real Transition

    +

    The way the virtual voice system works is that when sounds become real they resume from their proper place, halfway through the sound. To change this behavior, you can either use Sound or Channel priorities to stop it going virtual in the first place, or you have the option to have a Channel start from the beginning instead of half way through, by using the FMOD_VIRTUAL_PLAYFROMSTART flag with System::createSound, System::createStream, Sound::setMode or ChannelControl::setMode.

    +

    As described above, only the quietest, least important sounds should be swapping in and out, so you shouldn't notice sounds 'swapping in', but if you have a low number of real Channels, and they are all loud, then this behavior could become more noticeable and may sound bad.

    +

    Another option is to simply call Channel::isVirtual and stop the sound, but don't do this until after a System::update! After System::playSound, the virtual Channel sorting needs to be done in System::update to process what is really virtual and what isn't.

    +

    Studio API Voice Control

    +

    In addition to the system provided by the Core API, the Studio API also allows you to limit playing Channels by using event polyphony: The sound designer can specify a limit to the number of simultaneously playing instances of an event. There are two modes for event polyphony: Channel stealing on, and channel stealing off.

    +

    Event Polyphony with Channel Stealing On

    +

    In this mode, once more instances are playing than the limit, then some will become virtual. Whether an event has become virtual can be queried with Studio::EventInstance::isVirtual. A virtual event will mute its master channel group, which will cause any playing Channels to go virtual if FMOD_INIT_VOL0_BECOMES_VIRTUAL has been specified.

    +

    Event virtualization is determined by an event's audibility, which is calculated based on the accumulated gain applied to the event's master track, as well any alterations applied to gain by fades, automation, and modulation. This includes:

    + +

    Audibility is only calculated using the event's master channel group; the calculation does not include any gain applied to any child channels or channel groups.

    +

    An event which is virtual may become real at a later time if the audibility increases compared to the other playing instances.

    +

    Event Polyphony with Channel Stealing Off

    +

    In this mode, once the instance limit has been met, further instances will not play. Instances can still be created, and Studio::EventInstance::start can be called, but they will not actually play. Querying Studio::EventInstance::getPlaybackState will show that the extra instances are not in the playing state. Once instances fail to play then they will not start at a later time, regardless of what happens to the other instances. In this mode, event audibility has no affect on which instances play, it is simply based on which had Studio::EventInstance::start called first.

    +

    Interaction with Core API Virtual Voice System

    +

    FMOD Studio events ultimately create one or more core Channel objects to play sound. These Channels can go real or virtual based on the max software Channels set at initialization time. Therefore, it is possible to have events where Studio::EventInstance::isVirtual is false, but some or all of the underlying Channels are virtual due to the software Channel limit. The Core API voice system takes into account the bus set-up, distance attenuation, volume settings, and other DSP effects on Studio buses.

    +

    Studio Events can influence and override the Core API's virtual voice selection system with the priority value controlled per-event in FMOD Studio. Any Channels created by an event have the priority value set for their event in the FMOD Studio Tool - and a higher priority Channel can never be stolen by a lower priority Channel, even if it is very quiet. Unlike priorities set in the Core API, FMOD Studio only exposes five potential priority values. This is done deliberately, since priority should not be used in a fine-grained way.

    +

    Event Priority is not inherited for nested events. It is therefore possible for a high priority event to have low priority nested events. In such a case, the Channels of the nested events may be virtualized, regardless of the parent event's high priority.

    +

    Core API Profiler

    +

    The Core API profiler tool displays the DSP graph, and can be used to quickly see which Channels have gone virtual. Consider the Channel Groups Example. If we add FMOD_INIT_PROFILE_ENABLE and add a call to System::setSoftwareChannels with 5, then we see one of the 6 Channels has gone virtual:

    +

    Virtual DSP Graph

    + + + + + +
    diff --git a/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers.html b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers.html new file mode 100644 index 0000000..0b4e61c --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/FMOD API User Manual/white-papers.html @@ -0,0 +1,51 @@ + + +White Papers + + + + + diff --git a/SimpleGame/fmodstudioapi20307linux/doc/LICENSE.TXT b/SimpleGame/fmodstudioapi20307linux/doc/LICENSE.TXT new file mode 100644 index 0000000..2ce86fa --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/LICENSE.TXT @@ -0,0 +1,1053 @@ + FMOD END USER LICENCE AGREEMENT + =============================== + +This End User Licence Agreement (EULA) is a legal agreement between you and +Firelight Technologies Pty Ltd (ACN 099 182 448) (us or we) and governs your +use of FMOD Studio and FMOD Engine, together the Software. + +1. GRANT OF LICENCE + +1.1 FMOD Studio + +This EULA grants you the right to use FMOD Studio, being the desktop +application for adaptive audio content creation, for all use, including +Commercial use, subject to the following: + + i. FMOD Studio is used to create content for use with the FMOD Engine + only; + ii. FMOD Studio is not redistributed in any form. + +1.2 FMOD Engine + +This EULA grants you the right to use the FMOD Engine, 'FMOD Ex' or 'FMOD 3' +being the run-time engines for adaptive audio playback, without payment, for +personal (hobbyist), educational (students and teachers) or Non-Commercial use, +subject to the following: + + i. FMOD Engine is integrated and redistributed in a software application + (Product) only; + ii. FMOD Engine is not distributed as part of a game engine or tool set; + iii. FMOD Engine is not used in any Commercial enterprise or for any + Commercial production or subcontracting, except for the purposes of + Evaluation or Development of a Commercial Product; + iv. Non-Commercial use does not involve any form of monetisation, + sponsorship or promotion; + v. Product includes attribution in accordance with Clause 3. + +This EULA grants you the right to use FMOD Engine, for limited Commercial +use, subject to the following: + + i. Development budget of the project is less than $600k USD (Refer to + https://www.fmod.com/licensing#licensing-faq) for information); + ii. Total gross revenue / funding per year for the developer, before + expenses, is less than $200k USD (Refer to + https://www.fmod.com/licensing#licensing-faq for information); + iii. FMOD Engine is integrated and redistributed in a game application + (Product) only; + iv. FMOD Engine is not distributed as part of a game engine or tool set; + v. FMOD Engine is not distributed as part of a Product with the intent + to be commercially exploited by another business or institution; + vi. Project is registered in your profile page at + https://www.fmod.com/profile#projects; + vii. Product includes attribution in accordance with Clause 3. + +This EULA does not grant you the right to use 'FMOD Ex' or 'FMOD 3', for +Commercial use. A custom commercial license must be acquired from Firelight +Technologies by contacting sales@fmod.com. + +1.3 FMOD SDK + +This EULA grants you the right to use the FMOD SDK, interfacing either 'FMOD +Engine', 'FMOD Ex' or 'FMOD 3', comprising the programming interface +specification, documentation and examples subject to the following: + + i. FMOD SDK is used to develop a software application using the FMOD + Engine; + ii. FMOD SDK is used to develop an external DSP, Output or Codec plugin; + iii. FMOD SDK files are not be distributed with the exception of the FMOD + Engine run-time libraries (.DLL, .SO for example). + +1.4 FMOD example code and media + +This EULA grants you the right to use FMOD example code, being all or snippets +of source code files located in the FMOD API examples folder and scripting +examples in the documentation, for all use, including Commercial use, subject +to the following: + + i. Media files included in FMOD examples, including wav, ogg, mp3, fsb + and bank files, are not to be redistributed. + +2.OTHER USE + +For all Commercial use, and any Non Commercial use not permitted by this +license, a separate license is required. Refer to www.fmod.com/licensing for +information. + +3. CREDITS + +All Products require an in game credit line which must include the words "FMOD" +and "Firelight Technologies Pty Ltd." Refer to www.fmod.com/attribution for +examples. + +4. INTELLECTUAL PROPERTY RIGHTS + +We are and remain at all times the owner of the Software (including all +intellectual property rights in or to the Software). For the avoidance of doubt, +nothing in this EULA may be deemed to grant or assign to you any proprietary or +ownership interest or intellectual property rights in or to the Software other +than the rights licensed pursuant to Clause 1. + +You acknowledge and agree that you have no right, title or interest in and to +the intellectual property rights in the Software. + +5. SECURITY AND RISK + +You are responsible for protecting the Software and any related materials at all +times from unauthorised access, use or damage. + +6. WARRANTY AND LIMITATION OF LIABILITY + +The Software is provided by us “as is†and, to the maximum extent permitted by +law, any express or implied warranties of any kind, including (but not limited +to) all implied warranties of merchantability and fitness for a particular +purpose are disclaimed. + +In no event shall we (and our employees, contractors and subcontractors), +developers and contributors be liable for any direct, special, indirect or +consequential damages whatsoever resulting from loss of data or profits, whether +in an action of contract, negligence or other tortious conduct, arising out of +or in connection with the use or performance of the Software. + +7. OGG VORBIS CODEC + +FMOD uses the Ogg Vorbis codec © 2002, Xiph.Org Foundation. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + i. Redistributions of source code must retain the above copyright notice, + the list of conditions and the following disclaimer. + + ii. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other material provided with the distribution. + + iii. Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS “AS IS†AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +8. RESONANCE AUDIO SDK + +FMOD includes Resonance Audio SDK, licensed under the Apache Licence, Version +2.0 (the Licence); you may not use this file except in compliance with the +License. You may obtain a copy of the License at: + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an “AS IS†BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + +8. ANDROID PLATFORM CODE + +Copyright (C) 2010 The Android Open Source Project All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +9. AUDIOMOTORS DEMO CONTENT + +The audiogaming_audiomotors_demo_engine.agp file is provided for evaluation +purposes only and is not to be redistributed. AudioMotors V2 Pro is required to +create your own engine content. Refer to https://lesound.io for information. + +10. Qt Toolkit + +FMOD uses Qt Toolkit Copyright (C) 2017 The Qt Company Ltd under the +GNU Lesser General Public License version 3. + +FMOD dynamically links to the unmodified Qt libraries, as provided by +The Qt Company in the pre-compiled binary format. If unable to obtain +source code from The Qt Company, we offer to provide it via the support +options available to all users outlined on our website. + +------------------------------------------------------------------------- + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +------------------------------------------------------------------------- + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright © 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies of this + license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + +0. Additional Definitions. + + As used herein, “this License†refers to version 3 of the GNU Lesser +General Public License, and the “GNU GPL†refers to version 3 of the +GNU General Public License. + + “The Library†refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An “Application†is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A “Combined Work†is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the “Linked +Versionâ€. + + The “Minimal Corresponding Source†for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The “Corresponding Application Code†for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this + license document. + +4. Combined Works. + + You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. + + e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +5. Combined Libraries. + + You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of + it is a work based on the Library, and explaining where to find + the accompanying uncombined form of the same work. + +6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License “or any later version†applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, +you may choose any version of the GNU Lesser General Public License +ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the Library. + +--------------------------- +Last updated 17th Jun 2024. \ No newline at end of file diff --git a/SimpleGame/fmodstudioapi20307linux/doc/revision.txt b/SimpleGame/fmodstudioapi20307linux/doc/revision.txt new file mode 100644 index 0000000..0c5cdde --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/doc/revision.txt @@ -0,0 +1,6310 @@ + +========================================================================================== + REVISION HISTORY : FMOD Studio API + Copyright (c) Firelight Technologies, Pty, Ltd, 2011-2025 + https://www.fmod.com +========================================================================================== + +Legend +------ +Win: Microsoft Windows XboxOne: Microsoft Xbox One +Mac: Apple macOS GameCore: Microsoft Game Core +Linux: Linux PS4: Sony PlayStation 4 +iOS: Apple iOS / tvOS PS5: Sony PlayStation 5 +Android: Google Android Switch: Nintendo Switch +HTML5: JavaScript WebAssembly UWP: Microsoft Universal Windows Platform + +2/4/25 2.03.07 - Studio API minor release (build 150747) +------------------------------------------------------------------------------------------ + +Features: +* Unity - Added support for WeChat Mini Game platform in TuanJie Engine. + +Fixes: +* Core API - Android - Fixed crash when calling into record API while mixer suspended. +* Core API - Fixed DSP::setWetDryMix causing audible output on some DSPs if they + were muted internally, for example FMOD_DSP_TYPE_FADER, or user DSPs + using FMOD_ERR_DSP_SILENCE as a return value. +* Core API - Mac - Fixed FMOD_ERR_OUTPUT_DRIVERCALL being returned on certain + device change events. +* Core API - XSX - Fixed hardware convolution failing to fallback to software + implementation when an invalid impulse response length was provided. +* Core API - Added support for .m3u8 file format. +* Unity - Improved EventReferenceDrawer performance when working with large FMOD + projects. +* Unity - OpenHarmony - Removed need for manual fmod.init call in exported + project's Ability. +* Unity - Added suggestion for line ending requirements to Source Control window of the + Set Up Wizard. +* Unity/Unreal - Filter out benign FMOD_ERR_CHANNEL_STOLEN error. + +Notes: +* Switch - Now built with SDK 19.3.5. + +07/02/25 2.03.06 - Studio API minor release (build 149358) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Android - Added support for Spatial Audio when surround speaker mode is + 5.1 or higher and user has Spatial Audio enabled. +* Unity - Added public property StudioListener::AttenuationObject. +* Unity - Added Chinese localization to Resonance plugin. + +Fixes: +* Studio API - HTML5 - Added support for position independent code with Upstream WASM. +* Core API - Fixed Channel::getAudibility not considering 3D attributes of parent + ChannelGroups in audibility calculation. +* Core API - Fixed audible pop from fix introduced in 2.02.24 regarding virtual channels + and ChannelControl::setPan/setMixLevelsInput/setMixLevelsOutput/ + ChannelControl::setMixMatrix. +* Core API - Android - Fixed input stream leak when backgrounding application on some + Android devices. +* Core API - Android - Fixed small amount of old audio being played after calling + System::mixerResume when using OpenSL or AAudio output types. +* Core API - PS5 - Fixed potentially incorrect pitch / hardware errors when using + very high or low pitch values with Opus. +* Core API - PS5 - Fixed issues with the Opus codec with seamless looping. +* Core API - Windows - Fixed ASIO failing to initialize if device CLSID is empty. +* OpenHarmony - Reduced latency by taking advantage of SDK 11 functionality, latency + for SDK 10 devices remains unchanged. +* Unity - Fixed vector out-of-range warning when creating 3D event instances. +* Unity - Fixed an issue with SetListenerLocation if Physic2D was disabled. +* Unity - Fixed Setup Wizard window to be resizable and scrollable. +* Unity - Fixed NotImplementedException error when running the event reference + updater on objects that have not implemented GetEnumerator(). +* Unity - Fixed ArgumentOutOfRangeException error when trying to create a new + FMOD event in editor. +* Unreal - Fixed 3D AudioLink events playing at world zero before receiving + position information from Unreal. + +13/12/24 2.03.05 - Studio API minor release (build 148280) +------------------------------------------------------------------------------------------ + +Features: +* Unity - Added Chinese localization. + +Fixes: +* Studio API - Added some extra validation around 3D attributes passed in. +* Studio API - Fixed an assert that occurs when playing a transition timeline with a + relative offset and a destination region that passes the end of the main + timeline. +* Studio API - Fixed incorrect timeline transition behavior when loading banks built by + FMOD Studio 2.00.04 or earlier. +* Studio API - PS4/PS5 - Fixed crash preceded by an internal assert(isValid) on + PS5 SDK 10 and PS4 SDK 12. +* Core API - Android - Fixed glitching when attempting screen recording with AAudio + on Android 14 and above. +* Core API - Android - Added protections against recording with multiple input devices + simultaneously when using OpenSL. +* Core API - Android - AAudio now correctly stops recording if a new recording begins + on a different device. +* Core API - iOS - Added protections against recording with multiple input devices + simultaneously. +* Unity - Fixed the Event Reference Updater incorrectly being triggered when + capitalization changes on events or folders. +* Unity - Fixed "Stop Events Outside Max Distance" behavior not taking listener + attenuation objects into account. +* Unity - Removed Codec assigning for the default platform as not all platforms + support the same Codec values. + +Notes: +* PS4 - Now built with SDK 12.008.011. +* PS5 - Now built with SDK 10.00.00.40. +* Unreal - Added support for UE5.5. +* Android - arm64-v8a and x86_64 libraries are now aligned to 16kb page size. + +11/11/24 2.03.04 - Studio API minor release (build 147563) +------------------------------------------------------------------------------------------ + +Fixes: +* Studio API - Fixed a crash caused by changing an event via live update and then + unloading one of its assets banks. +* Studio API - Fixed an assert when an event with manual sample loading uses a sample + after an event with automatic sample loading. +* Studio API - Fixed crash and memory leaks when loading master banks that are missing + mixer content required in other banks. +* Core API - Removed the MarshalHelper to avoid AOT build errors when using the + C# wrapper. +* Core API - FMOD_ERR_FILE_NOTFOUND logs will now be of level "log" rather than + "error" as it is not an error in some cases. +* Core API - Fixed compatibility issues with .wavs produced with + FMOD_OUTTPUTTYPE_WAVWRITER or FMOD_OUTTPUTTYPE_WAVWRITER_NRT. +* Core API - Fixed incorrect "device" name for PCM float output with + FMOD_OUTTPUTTYPE_WAVWRITER and FMOD_OUTTPUTTYPE_WAVWRITER_NRT. +* Core API - Fixed DSP creation failing with FMOD_ERR_MEMORY if called a large number + of times, despite still having system memory available. +* Core API - C# - Fixed the definition of FMOD_DSP_BUFFER_ARRAY to allow the + usage of FMOD_DSP_PROCESS_CALLBACK. New properties allow easy access + to the native arrays. +* Core API - Consoles - Hardware resources will now correctly yield after an + FMOD_CREATESAMPLE decode so they can be used in other sounds. +* Core API - Fixed subsounds in FSBs returning FMOD_SOUND_TYPE_FSB from + Sound::getFormat instead of their encoded sound type. +* Core API - Mac - Fixed error initializing output after turning bluetooth off. +* Core API - Win - Downgraded "device unplugged" errors to warnings as device + switching is supported. +* Core API - Win - Fixed potential crash with certain ASIO driver after System::close. +* Unity - Added support for setting number of Opus Codecs on PS5. +* Unreal - DestroyStudioSystem no longer unloads banks, as the system release + handles this. + +Notes: +* HTML5 - Now built with SDK 3.1.67. +* Unity - HTML5 - Now built with SDK 3.1.8 for Unity 2022.3 and 3.1.39 for + Unity 6000.0. + +25/09/24 2.03.03 - Studio API minor release (build 146372) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Mac/iOS - System::mixerSuspend/System::mixerResume now suspends the mixer + and all other threads. +* Core API - Added logging to System::setAdvancedSettings. +* Unity - Added AttachInstanceToGameObject overload that accepts GameObject + instead of Transform. + +Fixes: +* Studio API - Fixed a crash when unloading an assets bank before its associated + metadata bank. +* Studio API - Fixed backwards compatibility loading banks from 1.08 and older, which + presented as FMOD_ERR_INVALID_PARAM being returned from + System::loadBankFile (or equivalent bank load function). +* Studio API - Fixed invalid handle error being returned from Studio::System::update + if a spectral sidechain on a global bus is released (due to the + bus becoming unused). +* Core API - Fixed passed in values being ignored when calling ChannelControl::setPan, + ChannelControl::setMixLevelsInput, ChannelControl::setMixLevelsOutput, + or ChannelControl::setMixMatrix on a virtual Channel. +* Core API - Fixed MultibandEQ not handling DSP::reset correctly for bands + B through E. +* Core API - OpenHarmony - Audio will now automatically resume after interruption. +* Core API - PS5 - Fixed Opus decode errors with certain pitch and seek combinations. +* Unreal - Added additional validation to Content Browser Prefix to account for + invalid characters and prefix lengths. +* Unity - Added non-Rigidbody velocity effect option on Listeners. +* Unity - Fixed source control presentation on macOS. +* Unity - OpenHarmony - Fixed issue locating bank files on devices. +* Unity - Fixed EventReferenceUpdater stack overflow exception caused by + Input System. +* Studio API - Reduced effect parameter allocations by allocating upfront instead of + individually. + +Notes: +* Unity - Renamed StudioEventEmitter members PlayEvent and StopEvent to + EventPlayTrigger and EventStopTrigger to disambiguate from + StudioEventEmitter.Play(). +* GameCore - Now built with March 2024 Update 1 GDKX. +* Unreal - PS4 - UE4.27 - Now built with SDK 11.008.001. +* Unreal - PS5 - UE4.27 - Now built with SDK 8.00.00.41. + +12/07/24 2.03.02 - Studio API minor release (build 144646) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Android - Non-default input and output devices can now be requested when + using AAudio. Only available on devices targeting API level 26 (Oreo) + and above. +* Core API - Android - Added FMOD_Android_JNI_Init to support initializing Java + layer from a native activity. +* Core API - GameCore - Added FMOD_PORT_TYPE_CONTROLLER to the FMOD_OUTPUTTYPE_WASAPI + output plug-in to route audio to a user specific audio device. +* Unity - Fixed warnings for updated api functions in Unity 2023.1+. +* Unity - Android - Added support for Application Entry Point GameActivity. + +Fixes: +* Studio API - Fixed glitches due to modulation not being applied correctly at event + start time. +* Studio API - Fixed glitches in AHDSR modulator release. +* Studio API - Fixed an intermittent assert when playing instruments with trigger delay. +* Studio API - GameCore - Fixed crash when setting invalid thread affinity. +* Core API - Fixed rare crash when virtual voices swapped when using a mix of Sound + and DSP based channels. +* Core API - Android - Fixed crash when calling recordStart while mixer suspended. +* Core API - OpenHarmony - Added support for System::mixerSuspend and + System::mixerResume to allow recovery of audio when returning from + the background. +* Core API - visionOS - Fixed missing symbol build error. +* Core API - Windows - Fixed initialization failure when audio service unavailable. +* Unity - Fixed EventReferenceUpdater iterating over irrelevant objects. +* Unreal - Fixed Niagara component variables using incorrect namespaces. +* Unreal - Fixed compile errors in UE5.4 for FMODAudioLinkInputClient.cpp + on some consoles. +* Unreal - FMODAudioComponents Occlusion and Velocity is now based off the + component instead of the actor. +* Unity - Fixed CodeGeneration.cs being left in the wrong location when migrating + from 2.01 to 2.02. +* Unity - Fixed EventReferenceUpdater exception when attempting to iterate + uninitialized items. + +Notes: +* Unity - Studio Event Emitter setting "Allow Non-Rigidbody Doppler" has been + renamed "Non-Rigidbody Velocity". +* Unity - Added support for Unity 6. + +08/05/24 2.03.01 - Studio API minor release (build 142842) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added optimizations to Multiband Dynamics plugin to skip processing of + collapsed bands. + +Fixes: +* Studio API - Fixed a crash when unloading a bank containing a global parameter that + automates a modulator property on another global parameter. +* Studio API - Fixed the sidechain modulator producing incorrect results when it is + connected to multiple sidechains. +* Core API - Fixed rare clicks/pops when using DSP::setWetDryMix. +* Core API - Fixed potential crashes relating to unloading Banks that hold + referenced Events that are currently playing. +* Core API - HTML5 - Fixed no-audio output when using FMOD_OUTPUTTYPE_AUDIOWORKLET in + some newer browsers. +* Core API - HTML5 - Fixed FFT DSP spectrum data not being accessible. +* Unity - Fixed FMOD settings heading being over written by new Unity cloud + integration buttons. +* Unity - Fixed error if event browser is left open when Unity starts. +* Unity - Fixed EventReferenceUpdater throwing invalid cast exceptions. +* Unity - Fixed FileReorganizer not moving libs in old directories. +* Unreal - iOS - Fixed interruption notification deprecations. + +Notes: +* iOS/Mac - Now compliant with Apple privacy requirements, removed usage of + mach_absolute_time, no manifest needed. +* PS4 - Now built with SDK 11.508.011. +* PS5 - Now built with SDK 9.00.00.40. + +13/03/24 2.03.00 - Studio API major release (build 141450) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Referenced events now continue playing after they are untriggered. +* Studio API - Added Studio::EventInstance::getSystem for accessing the FMOD System + from event callbacks. +* Core API - System::getVersion now outputs build number from second argument. +* Core API - Recording is now automatically restarted after device resets and + changing output types where the devices of the output types have + matching GUIDs. This continues the recording with the sound previously + passed in. If the output types are incompatible, the behavior is + unchanged. +* Core API - Added new port type, FMOD_PORT_TYPE_VR_VIBRATION, to cater for + VR controllers that support vibration. Removed the old method + of controlling vibration via FMOD_PORT_INDEX_FLAG_VR_CONTROLLER. + Supported by PS5 (PSVR2). +* Core API - Added new port type, FMOD_PORT_TYPE_PASSTHROUGH, to provide a bypass + for platform-provided multichannel spatialization. + Supported by PS5 and Windows (WinSonic). +* Core API - Added new FMOD_DSP_TYPE_ECHO parameter FMOD_DSP_ECHO_DELAYCHANGEMODE. + FMOD_DSP_ECHO_DELAYCHANGEMODE_FADE (default) is best suited to + large changes in delay time, FMOD_DSP_ECHO_DELAYCHANGEMODE_LERP + is best suited to small changes in delay time, and + FMOD_DSP_ECHO_DELAYCHANGEMODE_NONE is available to avoid additional + processing between delay time changes, but can introduce zipper + noise. +* Core API - Added new FMOD_DSP_TYPE_FFT parameters FMOD_DSP_FFT_BAND_START_FREQ, + FMOD_DSP_FFT_BAND_STOP_FREQ, FMOD_DSP_FFT_DOWNMIX, and + FMOD_DSP_FFT_CHANNEL to give control over how the input signal + is processed and which part of a spectrum is analyzed. +* Core API - Added new FMOD_DSP_TYPE_FFT parameter FMOD_DSP_FFT_RMS and renamed + FMOD_DSP_FFT_DOMINANT_FREQ to FMOD_DSP_FFT_SPECTRAL_CENTROID. Both + provide information about the nature of the signal within the analysis + band. +* Core API - Added new FMOD_DSP_TYPE_FFT parameter FMOD_DSP_FFT_IMMEDIATE_MODE + to control whether processing is immediate or delayed to reduce + CPU cost by offloading to compatible hardware. The default is delayed. +* Core API - Added new 6dB high/low pass filters to FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE + for FMOD_DSP_TYPE_MULTIBAND_EQ. These give a more gentle roll-off + and lower CPU cost. +* Core API - Added new Multiband Dynamics effect FMOD_DSP_MULTIBAND_DYNAMICS. + It supports upward/downward compression/expansion across three bands. +* Unreal - Added cross platform Memory Pool and Codec settings. + +Fixes: +* Studio API - Fixed popping caused by Studio::Bus::setPaused. +* Studio API - Fixed sounds being stopped when they are in multiple banks and + the first loaded bank is unloaded. +* Studio API - Fixed looping playlist instruments displaying a warning when using + a DSP buffer size of less than 1024. +* Core API - Fixed virtual voices getting out of sync when they return to real. + +Notes: +* All APIs - The F_CALLBACK macro has been removed, update existing code to + use F_CALL instead. +* Core API - In C#, FMOD_DSP_STATE.functions now has a wrapper function returning + an FMOD_DSP_STATE_FUNCTIONS struct instead of the IntPtr requiring + marshalling. +* Core API - Removed FMOD_DSP_TYPE_ENVELOPEFOLLOWER, FMOD_DSP_TYPE_VSTPLUGIN, + FMOD_DSP_TYPE_LADSPAPLUGIN, and FMOD_DSP_TYPE_WINAMPPLUGIN. +* Core API - Removed FMOD_SYSTEM_CALLBACK_MIDMIX. +* Core API - Renamed the FMOD_DSP_FFT_WINDOW enum to FMOD_DSP_FFT_WINDOW_TYPE, + and renamed the FMOD_DSP_FFT_WINDOWTYPE enum value to + FMOD_DSP_FFT_WINDOW. +* Core API - Win - The default DSP buffer size is now 512 rather than 1024 to + reduce latency. +* Android - Updated to NDK 26b and Android SDK 21. +* HTML5 - Removed support for deprecated Fastcomp backend. +* Unity - Removed support for end-of-life versions, minimum is now 2021.3. +* Tools - Updated Qt framework to v6.5.3 which lifts the minimum requirement + to macOS 11.0, Win10 1809 and Linux GLIBC 2.28. + +13/03/24 2.02.21 - Studio API minor release (build 141420) +------------------------------------------------------------------------------------------ + +Features: +* Unreal - Switch - Added functionality to open a socket on dev kit when + Live Update is enabled. +* Unreal - Added IFMODStudioModule::PrePIEDelegate to give users a chance + to clean up any resources before the FMOD System is released in + Editor. +* iOS - Added support for the Apple Vision Pro device and simulator in + the Core/Studio APIs and the FMOD for Unity integration. +* Win - Added support for Arm64 processors in the Core/Studio APIs. + +Fixes: +* Core API - Fixed FSB sounds incorrectly being virtualized when built from + 32 bit source assets. +* Core API - Fixed incorrect handling of DSP wet/dry settings if the DSP returns + FMOD_ERR_DSP_DONTPROCESS when its process callback is called with + FMOD_DSP_PROCESS_QUERY. +* Core API - OpenHarmony - Added an error check during System::init for insufficient + DSP buffer size. +* Core API - Android - Fixed global threads, like the File thread, remaining + active when the app is suspended on Android. +* Unity - Fixed editor hang when live recompiling code. +* Unity - Fixed iOS interruption deprecation warnings. +* Unreal - For UE5.2 onwards MacOS integration libs are now built as universal + to support both x86_64 and arm64. +* Unreal - Fixed iOS interruption deprecation warnings. + +Notes: +* iOS - Now built with iOS SDK 17.2 (Xcode 15.2). +* Switch - Now built with SDK 17.5.3. +* PS4 - Now built with SDK 11.008.001. +* PS5 - Now built with SDK 8.00.00.41. + +13/12/23 2.02.20 - Studio API minor release (build 139317) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Through FMOD_ADVANCEDSETTINGS, Spatial Objects count can be reserved per + FMOD systems. +* FSBank API - Added FSBANK_BUILD_ALIGN4K to align each sound in an FSB to + a 4K boundary to help binary patching on Microsoft platforms. +* Unity - The integration can now be hosted on Source Control and still be + able to edit .asset files. +* Unity - Debug Overlay can now have its on screen position set and font size + changed. +* Unreal - Added support for pausing FMOD Audio Components in Unreal Sequencer. + +Fixes: +* Studio API - Fixed crash when calling into API before FMOD::System created. +* Core API - Fixed potential crackling caused by changing the system sample + rate of a device playing as a port. +* Win - Fixed Cygwin/MinGW libs giving linker errors from API functions + that include FMOD_THREAD_AFFINITY or FMOD_STUDIO_PARAMETER_ID. + +2/11/23 2.02.19 - Studio API minor release (build 137979) +------------------------------------------------------------------------------------------ + +Features: +* Android/iOS - Added virtual recording device via System::recordStart(1, ...) that adds + hardware processing including echo cancellation. + +Fixes: +* Studio API - Fixed a race condition between the sample data loading system and + Studio::EventDescription::getSampleLoadingState. +* Core API - Fixed WavWriter and NoSound output plugins potentially processing + more audio than appropriate for the elapsed time. +* Core API - PS4 - Increased DSPBufferSize range to handle sizes greater than + 256 or 512. The AT9 codec still has a restriction of 256 or 512 but + anything else will accept sizes of 256, 512, 768, 1024, 1280, 1536, + 1792 or 2048. +* Unreal - Reset locale to default every time PIE is launched. + +Notes: +* Core API - iOS - Disabled FMOD_OUTPUTTYPE_PHASE due to compatibility issues + with iOS 17. +* iOS - Now built with iOS SDK 17.0 (Xcode 15.0), min deploy target + is now 12.0 and bitcode has been removed as mandated by Xcode. +* Mac - Now built with macOS SDK 14.0 (Xcode 15.0.1). +* HTML5 - Fixed Sound::lock not returning memory pointers. + +2/10/23 2.02.18 - Studio API minor release (build 137105) +------------------------------------------------------------------------------------------ + +Features: +* Core API - iOS - A new output plugin called FMOD_OUTPUTTYPE_PHASE has been + enabled, which supports 3D spatial objects. For iOS 16.4. +* Core API - PS5 - From SDK 8.00 we now support Dolby Atmos and thus 7.1.4 output. + To enable this set FMOD_SPEAKERMODE_7POINT1POINT4. +* Unity - Emitters are now able to be triggered from UI elements using mouse events. +* Unreal - Added support for Niagara. + +Fixes: +* Studio API - Fixed programmer sounds getting spatialized by the Core API if + the passed in Sound had the FMOD_3D mode set. +* Studio API - Fixed shared streaming assets being forced to stop when the bank they are + streaming from is unloaded if the bank was loaded via + Studio::System::loadBankCustom. +* Studio API - Fixed pops when calling Studio::EventInstance::setTimelinePosition on + events with only one sound on the timeline. +* Studio API - Fixed streaming instruments failing to stop at the right time if they + were started too close to the end. +* Studio API - Multi instruments/scatterers now factor in silence instruments when + determining whether to play an instrument from a playlist in shuffle + mode. If an instrument is followed by one or more silence instruments, + that instrument will not be selected to play next. +* Core API - Fixed cycles created using DSP connections not causing a feedback + loop. +* Core API - Slight improvement to Multiband EQ filter stability near the upper + end of the frequency range on 24kHz devices. +* Core API - Clamp and log a warning when setting a high pitch value rather + than returning an error. +* Core API - Fixed some DSP effects incorrectly skipping processing as if bypassed + via DSP::setBypass when DSP::setWetDryMix is called with prewet set to 0. +* Core API - Fixed potential crash in the transceiver DSP if certain pre-init + calls are made in sequence, such as System::setDSPBufferSize followed + by System::setOutput. +* Core API - Fixed potential crash (or assert) when opening and closing ports. +* Core API - Fixed potential audio corruption for 3D objects if the mixer is + under heavy load. +* Core API - PS5 - Fixed internal error from sceAudioOut2PortSetAttributes returning + "not-ready" caused by a race condition in opening a port. +* Core API - Windows - Fixed WASAPI device enumeration memory leaks when devices fail. +* Unreal - Fixed Sequencer ignoring Start keys at frame 0. +* Unreal - Restore "Reload Banks' option to File dropdown menu. +* Unreal - Added validation to fix lack of leading or trailing forward slash in + Content Browser Prefix. +* Unreal - Fixed FMODAudioComponent ignoring "When Finished" behavior when + Sequencer finishes playback. +* Unreal - Fixed localized banks not working. +* Unity - Fixed non-rigidbody doppler dividing by 0 if Time.timescale = 0. +* Unity - Fixed issue when playing in Editor where the path plugins were + attempted to be loaded from contained "/Assets" twice. +* Android - Fixed playerSetVolume crash on devices with Android OS below Android T. +* Windows - Removed hard dependency on msacm32.dll. + +Notes: +* Core API - Calling the DSP plugin API functions, FMOD_DSP_GETSAMPLERATE, + FMOD_DSP_GETBLOCKSIZE, or FMOD_DSP_GETSPEAKERMODE before init + will now return an error as those settings are not confirmed until + after initialization. +* PS4 - Now built with SDK 10.508.001. +* PS5 - Now built with SDK 7.00.00.38. + +21/8/23 2.02.17 - Studio API minor release (build 136061) +------------------------------------------------------------------------------------------ + +Fixes: +* Studio API - Fixed Studio::EventInstance::getTimelinePosition occasionally reporting + incorrect position. +* Studio API - Fixed hang after running an Event for 12 hours with beat callbacks. +* Studio API - Fixed instruments that are automated on the timeline having incorrect + automated values when they start. +* Core API - Fixed virtual voice issue that could cause Channels to restart. +* Core API - Fixed assert firing from resampler for wildly varying pitch values. +* Core API - Fixed FMOD_INIT_3D_RIGHTHANDED to work correctly when using + FMOD_3D_HEADRELATIVE. +* Core API - GameCore/PS5 - Fixed the Opus and XMA codecs to display an appropriate + error log if the DSP buffer size is not 512. +* Core API - HTML5 - Fixed compiler errors to do with using Strict Mode. +* Unity - Fixed Studio Global Parameter Trigger silently failing on awake. +* Unity - FMOD Studio system failing to initialize will no longer throw as + an exception. +* Unity - Fixed error when auditioning Events containing global parameters in + Event Browser. +* Unreal - Fixed FMODAudioComponents always using default parameter values. +* Unreal - Fixed Sequencer restarting AudioComponents when Sequencer Editor + open. +* Unreal - Fixed crash when FMOD Studio project contains folders with "." + character. +* Unreal - Fixed FMODGenerateAssets commandlet not deleting old assets on + rebuild. +* Android - Fixed exported symbols to avoid issues with unwinder on armeabi-v7a. + +13/7/23 2.02.16 - Studio API minor release (build 135072) +------------------------------------------------------------------------------------------ + +Fixes: +* Studio API - Fixed voice stealing behavior not updating when connected to live + update. +* Studio API - Fixed instruments with AHDSR not stopping after release, introduced + in 2.02.15. +* Unity - Fixed ApplyMuteState and PauseAllEvents functions when when using + Addressables +* Unity - Fixed Editor Platform settings inheriting from the Default Platform. +* Unity - Fixed folder references to allow the FMOD Plugin base folder to + be moved anywhere on disk for use with the Unity Package Manager. +* Unreal - Fixed potential crash when linking to Studio project locales. +* iOS/Mac - Fixed example Xcode projects with incorrect paths failing to load. + +Notes: +* Unity - Added support for Unity 2023.1. + +2/6/23 2.02.15 - Studio API minor release (build 134211) +------------------------------------------------------------------------------------------ + +Features: +* Unreal - Added FMODStudioModule::GetDefaultLocale to get the default locale + which can be changed in the FMOD Settings. + +Fixes: +* Studio API - Fixed live update crash if tweaking an Event with an empty single + sound instrument. +* Studio API - Fixed potential crash if releasing an EventInstance from the Stop + callback. +* Studio API - Fixed third party DSP plugins causing potential assert by calling + DSP::setParameterDSP on effects managed by Studio. +* Unity - Fixed Addressable banks not being built when building with batchmode. +* Unreal - Fixed rare AudioVolume Reverb Effect cast crash. +* Unreal - Fixed crash when using Hot Reload in UE4.26 & 4.27. +* Unreal - FMODStudioModule::GetLocale correctly now returns the currently + set locale instead of the default. +* Unreal - PS4 - Fixed audio degradation due to mixer thread competing with + renderer thread. + +Notes: +* iOS - Now built with iOS SDK 16.4 (Xcode 14.3). +* Mac - Now built with macOS SDK 13.3 (Xcode 14.3), min deploy target + is now 10.13 as mandated by Xcode. +* Unreal - Added support for UE5.2. + +3/5/23 2.02.14 - Studio API minor release (build 133546) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Examples now have a Common_Log function for outputting to TTY. +* Unity - Reduced time spent generating bank stubs, and reduced time spent copying + banks into StreamingAssets folder when building. + +Fixes: +* Studio API - Fixed crash when adding parameter sheet to a playing event while live + update connected. +* Studio API - Fixed instruments starting playback with stale property values during + hotswap. +* Studio API - Fixed Global Parameters being unable to automate other Global Parameters. +* Core API - PS5 - Fixed out-of-resources errors when decoding a large number + of FMOD_CREATESAMPLE (decompress into memory) sounds encoded as AT9. +* Core API - Win/GameCore - Fixed potential crash when an audio device reports + an invalid name. +* Unity - Fixed Find and Replace tool not finding prefabs. +* Unity - iOS - Fixed audio not resuming after opening and closing Siri. +* Unity - Fixed hang caused by RuntimeManager access when auditioning in timeline. + +17/3/23 2.02.13 - Studio API minor release (build 132591) +------------------------------------------------------------------------------------------ + +Features: +* Unity - Added non-Rigidbody Doppler effect option on Emitters. + +Fixes: +* Studio API - Fixed voice stealing failing on events in FMOD_STUDIO_PLAYBACK_STOPPING + state. +* Studio API - Fixed assert during Live Update when deleting a Global Parameter. +* Studio API - AHDSR modulators will now have correct release behavior when + the instrument stop condition is triggered by an event condition. +* Studio API - Fixed crash when changing parameter scope on a playing event. +* Studio API - Fixed a crash when removing automations via Live Update. +* Core API - Fixed playback issues with certain ice/shoutcast net-streams. +* Core API - GameCore - Fixed rare crash when playing back compressed Opus. +* Core API - GameCore - Reduced memory usage for hardware convolution reverb. +* Core API - Mac - Fixed crash when using input devices below 16kHz sample rate. +* Core API - PS5 - Fixed audio output stutters when a port disconnects. +* Core API - Win - Fixed record enumeration fails causing crash. +* Unity - Fixed Visual Scripting units not generating in Unity 2021+. +* Unity - Fixed plugin bundles not working on Mac. +* Unreal - Fixed AssetLookup being modified each time the editor is opened. +* Unreal - Fixed Editor Live Update not connecting to Studio. + +Note: +* GameCore - Now built with October 2022 QFE 1 GDKX. +* Switch - Now built with SDK 15.3.0. + +31/1/23 2.02.12 - Studio API minor release (build 131544) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Warning is now logged when a voice swap occurs on an voice with an + audibility above -20dB. +* Unity - Added support for Unity 2022.2. +* Unity - macOS can now handle .dylib plugins natively +* Unity - Android - Added support for patch build. + +Fixes: +* Studio API - Fixed Live Update being ignored if Studio connects before the master Bank + is loaded. +* Studio API - Fixed a potential crash updating a referenced 3D Event if it has + been forcibly stopped due to bank unload. +* Studio API - Fixed issue where using a modulated parameter to automate a property of an + AHDSR modulator would sometimes cause the AHDSR to start in a bad state. +* Studio API - Fixed VCA handles becoming invalid when live update changes them. +* Studio API - Fixed incorrect scheduling of playlist entries in multi instruments that + have pitch changes. +* Core API - Switch - Fixed potential Opus crash when streaming with custom + async IO callbacks. +* Core API - PS5 + GameCore - Hardware resource configuration (performed using + platform specific FMOD APIs) will now apply during System::init + rather than System::create. +* Unity - The EventReferenceDrawer "Open in Browser" button now functions + when there is no event selected. +* Unity - Fixed EventRefDrawer showing incorrect "Migration target X is missing" + messages on sub-object fields with MigrateTo specified. +* Unity - Fixed hang when RuntimeManager called outside of main thread. +* Unity - The Update Event References menu command now scans non-MonoBehaviour + objects that are referenced by MonoBehaviours. +* Unity - Fixed warning "Settings instance has not been initialized...". +* Unity - Fixed 'multiple plugins with same name' error on Mac. +* Unreal - Fixed occlusion not working from Audio Component reloaded from + a streamed level. +* Unreal - Fixed commandlet crashing when trying to delete assets. +* Win - Fixed examples not rendering correctly on Windows 11. + +Notes: +* Unity - Added an example on how to pipe audio from a VideoPlayer into FMOD. +* iOS - Re-enabled compilation of the now deprecated Bitcode to appease + toolchains such as Unity that still require it. +* PS4 - Now built with SDK 10.008.001. +* PS5 - Now built with SDK 6.00.00.38. + +01/12/22 2.02.11 - Studio API minor release (build 130436) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Studio::System::getBus("bus:/", ...) will now return the master + bus if the master bank has been loaded, even if the strings bank has not. +* Core API - GameCore - Added in FMOD_GameCore_XMAConfigure. This can be used to + control whether to allocate XMA codec hardware resources inside + FMOD::System_Create. If not called before FMOD::System_Create the + resources will be allocated on first codec use. +* Core API - Mac - Added support for 7.1.4 output type. +* Core API - PS5 - Added in FMOD_PS5_AT9Configure. This can be used to + control whether to allocate AT9 codec hardware resources inside + FMOD::System_Create. If not called before FMOD::System_Create the + resources will be allocated on first codec use. +* Unity - Android - Added support for x86_64. +* Unreal - Added a Sound Stopped callback to the FMODAudioComponent. + +Fixes: +* Studio API - Fixed crash when connecting live update and a bank was loaded multiple + times with FMOD_STUDIO_LOAD_BANK_NONBLOCKING flag. +* Studio API - Fixed every asset in an Audio Table being parsed when only one + item is required. +* Studio API - Logging more meaningful error message when attempting to get/set listener + properties with an invalid listener index. +* Core API - Fixed recording not starting immediately after changing output devices. +* Core API - Fixed AAudio no-sound issue if device disconnection occurs during + initialization. +* Core API - Fixed a stall in Sound::release on nonblocking sounds. +* Unity - Added optimized DistanceSquaredToNearestListener method to avoid + unnecessary square root. +* Unity - Fixed StudioEventEmitter clearing handle prematurely when Allow Fadeout + enabled. +* Unity - Fixed FMODStudioEventEmitter inspector not updating displayed min and max + attenuation when banks refreshed. +* Unity - Error now logged when accessing RuntimeManager from Editor-only callsite. +* Unity - Fixed EventReferenceDrawer input losing focus when not found + warning appears. +* Unreal - Fixed BankLookup.uasset being modified whenever banks get refreshed + while using split banks. + +Notes: +* Unreal - Added support for UE5.1. +* iOS - Now built with iOS SDK 16.0 (Xcode 14.0.1), min deploy target + is now 11.0 and 32bit support has been removed as mandated by Xcode. +* Mac - Now built with macOS SDK 12.3 (Xcode 14.0.1). + +28/10/22 2.02.10 - Studio API minor release (build 129212) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added DSP::setCallback. + +Fixes: +* Studio API - Fixed a race condition where the Studio API could delete DSP parameter + data before the DSP was released. +* Core API - Fixed bug with fallback realloc copying excess memory when memory + callbacks being overridden but a realloc wasn't provided. +* Core API - Fixed crash with .MOD format with a particular combination of commands. +* Core API - Fixed potential FMOD_ERR_INVALID_PARAM from System::setDriver if + the device list has changed since a previous call to that function. +* Core API - Fixed potential crash when a Send mixes to an partially initialized + Return. This crash can occur in the Studio API also. +* Core API - Fixed potential access violation due to internal Sound Group list + corruption. +* Core API - Fixed Channel::setLoopPoints not applying if the stream decode buffer + is larger than the Sound. +* Unity - Removed benign errors originating from EventInstance::set3DAttributes + calls when API Error Logging is enabled. +* Unity - Fixed platform warning appearing unnecessarily. +* Unreal - Fixed BankLookup.uasset being modified whenever banks get refreshed + while using split banks. + +Notes: +* Unreal - Added support for UE5.1 preview 2. + +26/09/22 2.02.09 - Studio API minor release (build 128289) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Error now logged when attempting to set a readonly Parameter, or when + attempting to set a Global Parameter from an EventInstance. +* Core API - Deprecated Sound.readData(IntPtr, uint, out uint) in C# wrapper. Instead + use Sound.readData(byte[], out uint) or Sound.readData(byte[]). +* Core API - Added FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED callback to notify when + new data recorded to FMOD::Sound. +* Core API - GameCore - Increased the limits of SetXApuStreamCount to match + Microsoft documented maximums. +* Unity - Added UnloadBank overloads for TextAsset and AssetReference. +* Unreal - Added "Enable API Error Logging" option to Advanced settings section. + Integration will log additional internal errors when enabled. +* Unreal - LoadBank node "Blocking" enabled by default. + +Fixes: +* Core API - Fixed potential crash if calling DSP::setParameter on a Pan DSP + when using the Studio API. +* Core API - Fixed ChannelGroup::setPaused(false) to behave the same as Channel, + ensuring any 3D calculations are performed before becoming audible. +* Core API - Fixed Opus producing different FSBank result on AMD and Intel CPUs. +* Core API - Fixed errors in the calculatePannerAttributes() function presented in + Core API Guide section 3.5 Controlling a Spatializer DSP + (formerly Driving the Spatializer). +* Core API - Increased net streaming max URL length to 2048. +* Core API - GameCore - Fixed potential XApu stream leak when playing a multi-channel + Sound as the hardware limit is reached. +* Core API - iOS - Fixed potential crash during System::mixerSuspend / + System::mixerResume when playing audio with the platform native + AudioQueue (AAC) decoder. +* Core API - iOS - Fixed simulator detection. +* Core API - Mac - Fixed CoreAudio crash when output device reports >32 outputs. +* Core API - Win - Fixed WinSonic crash when the device list changes before + System::init. +* Resonance - Android - Removed dependency on libc++_shared.so. +* Unity - Fixed FMODStudioSettings.asset marked dirty every time Editor reopens. +* Unity - Prevented unnecessary allocation when setting parameter on an FMOD + StudioEventEmitter. +* Unity - Fixed errors when upgrading Unity versions. +* Unreal - Provided default values to prevent various initialization warnings. + +Notes: +* Unreal - Moved various internal functions and fields to private. + +15/08/22 2.02.08 - Studio API minor release (build 126901) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added FMOD_INIT_CLIP_OUTPUT flag to enable hard clipping of float values. +* Core API - GameCore - Added SetXApuStreamCount and XDspConfigure to C# wrapper. +* Core API - PS5 - Added AcmConfigure and AjmConfigure to the C# wrapper. +* Core API - PS5 - Opus hardware decoding is now supported. +* Core API - PS5 - Added vibration support for the PSVR2 controller via + FMOD_PORT_INDEX_FLAG_VR_CONTROLLER. +* Unity - Timeline events now begin playback from relative playhead position when + auditioning in the timeline. + +Fixes: +* Studio API - EventDescription::is3D now returns the correct result if the Event uses + SpeedAbsolute or DistanceNormalized parameters. Requires bank rebuild. +* Core API - Fixed ASIO driver enumeration crash caused by invalid driver. +* Core API - Fixed incorrect thread IDs being used on pthread based platforms. +* Core API - Fixed System::setReverbProperties / FMOD_DSP_TYPE_SFXREVERB not working + with 7.1.4 input. +* Core API - Fixed crash from reading bad m3u file. +* Core API - Fixed the memory tracking system sometimes running out of memory. +* Core API - GameCore - Fixed potential crash when there are insufficient xAPU + resources remaining. +* Core API - Win - Fixed crash in device enumeration cleanup. +* Core API - C# - Some callback types renamed in fmod_dsp.cs to match C header. + DSP_CREATECALLBACK becomes DSP_CREATE_CALLBACK for example. +* Unity - Updated deprecated GameCore build target and runtime platform for Unity + 2019.4. +* Unity - Fixed issue with "Desktop" being added to build path twice when + selecting "Multiple Platform Build" Source Type. +* Unity - Fixed issue with HaveAllBanksLoaded not working when banks loaded via + AssetReferences. +* Unity - Fixed UnsatisfiedLinkError crash on Android when no FMODUnity components + present. +* Unity - Improved readability of folders in CreateEventPopup. +* Unreal - Fixed Blueprint LoadBank not correctly honouring Load Sample data flag. +* Unreal - Removed spurious log warning about initial value of global parameters. +* Unreal - Fixed memory leak when using PlayEventAttached in nosound mode. + +Notes: +* Switch - Now built with SDK 14.3.0. +* Unreal - Added support for UE5.0.3. + +18/05/22 2.02.07 - Studio API minor release (build 125130) +------------------------------------------------------------------------------------------ + +Features: +* Core API - HTML5 - FMOD now handles user interaction internally to allow sound to + work. The developer no longer has to handle boilerplate code + to allow user interaction. +* FSBank API - Mac - Added FSBankLib. +* Unreal - Added support for speaker mode 7.1.4 in the editor settings. +* Unreal - Added separate platforms settings for a variety of options. + +Fixes: +* Studio API - Fixed steal quietest not working correctly causing new EventInstances + to think they are the quietest and not play. +* Core API - Fixed ChannelGroup::setPitch when applied to the master channel + group causing exaggerated pitch changes as time goes on. +* Core API - HTML5 - Fixed integer overflow crash in fastcomp builds after 70 mins. +* Core API - Linux - Fixed potential hang on shutdown due to bad sound drivers. +* Core API - Linux - Fixed crash during System::init if using + System::setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO) on a machine + without PulseAudio. +* Unity - Fixed an error occurring when a timeline playhead leaves an event + playable. +* Unity - Added missing EventReference overload for PlayOneShotAttached. +* Unity - Fixed refcount not updating when LoadBank called with TextAsset. +* Unity - Fixed scene hanging when auditioning timeline. +* Unity - Fixed events in timeline not refreshing when banks updated. +* Unity - Fixed platform objects on Settings asset showing no name in the project + window. +* Unity - Fixed stale event name left behind after clearing an FMODEventPlayable's + event reference field. +* Unity - Fixed an error caused by changing an event reference while an event is + being previewed in the browser. +* Unity - HTML5 - Fixed the audio not playing in the Safari web browser. +* Unreal - Fixed not being able to audition events in the editor. +* Unreal - Fixed Editor crash when importing bank with paths containing a period. + +Notes: +* PS4 - Now built with SDK 9.508.001. +* PS5 - Now built with SDK 5.00.00.33. +* Unreal - Added support for UE5. + +16/03/22 2.02.06 - Studio API minor release (build 124257) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Android - Added support for loading sounds via Uri paths. +* Unity - Added ability to set individual channel counts for each codec format + supported by a given platform. + +Fixes: +* Studio API - Fixed issue where certain timeline instruments were causing + EventDescription::isOneshot to incorrectly return false. This requires + banks to be rebuilt to take effect. +* Core API - Fixed rare vorbis decoding error. +* Core API - Fixed crash in OutputASIO::stop if start has not been called. +* Core API - Fixed static noise or clicks when using DSP::setWetDryMix. +* Core API - Fixed FMOD_CODEC_METADATA macro parameters. +* Core API - Fixed bad ASIO driver causing enumeration to fail. +* Core API - Android - Fixed crash from headset detection with incorrect Java + lifetimes. +* Core API - HTML5 - Fixed an issue where FMOD_OUTPUTTYPE_AUDIOWORKLET would crash + if the speaker mode setup was greater than stereo while refreshing the + web browser. +* Core API - PS5 - Fixed a crash in the convolution reverb to do with + deallocating GPU memory. +* Core API - UWP - Fixed corrupted audio using certain headsets that implement + virtual surround sound such as those from Razer. +* Core API - Win - Fixed WASAPI device enumeration failure causing + initialization to fail. +* Unity - Fixed il2cpp crash caused by CREATESOUNDEXINFO callbacks not being + marshaled when loading sounds from audio tables. +* Unity - Fixed event browser preview area not initially displaying at correct + size. +* Unity - Fixed error shown when attempting to delete Default and Editor platforms. +* Unity - Fixed audible glitches on PS4 and PS5 due to FMOD feeder thread getting + blocked. +* Unity - Fixed enumeration of bank folders when creating an event from an event + reference field in the inspector. +* Unity - Fixed error if Resonance Listener is not on the Master Bus. +* Unity - Fixed banks being reimported with every build when set to AssetBundle + import type. +* Unity - Fixed cached events losing GUIDs after updating from a 2.01 or earlier + integration. +* Unreal - Fixed crash when importing banks containing ports. +* Unreal - Fixed net streams not working with programmer sounds. +* Unreal - Fixed problem locking all buses on bank load if banks haven't finished + loading. +* Unreal - Fixed AudioComponent::OnEventStopped sometimes being called twice. +* Unreal - Fixed FMODAudioComponents inside AudioVolumes not having the correct + AmbientVolumeParameter value when Started after being Stopped. + +Notes: +* GameCore - Now built with October 2021 QFE 1 GDKX. +* Stadia - Now built with SDK 1.71. +* Switch - Now built with SDK 13.3.0. +* Unity - GameCore - Now built with June 2021 QFE 4 GDKX. +* Unreal - Added support for UE5.0 preview 1. + +06/02/22 2.02.05 Patch 1 - Studio API patch release (build 123444) +------------------------------------------------------------------------------------------ + +Fixes: +* Studio API - Fixed crash when allocating internal pool resources. Introduced 2.02.05. + +Notes: +* Due to the severity of the above mentioned issue, the previous release of 2.02.05 + has been withdrawn and should not be used. + +21/12/21 2.02.05 - Studio API minor release (build 122665) +------------------------------------------------------------------------------------------ + +Features: +* Core API - HTML5 - Added a new FMOD_OUTPUTTYPE called FMOD_OUTPUTTYPE_AUDIOWORKLET, + which uses the Web Audio AudioWorkletNode functionality. + +Fixes: +* Studio API - Fixed issue where an async instrument would not trigger if its delay + interval was greater than its length on the timeline. +* Studio API - Fixed issue where the description of an event retrieved from a start + event command would have an invalid handle unless first retrieved via + Studio::System::getEvent. +* Studio API - Start Event Command Instrument now gracefully handles the case when the + event it is trying to start has not been loaded. +* Studio API - Fixed issue where the scatterer instrument can spawn instruments + inconsistently under certain conditions. +* Studio API - Fixed issue where audibility based stealing would not use + FMOD_DSP_PARAMETER_OVERALLGAIN::linear_gain_additive in its calculation. + For events using the object spatializer or the resonance audio + source this would cause the attenuation to be ignored for stealing. +* Studio API - Improved general Studio API performance. +* Studio API - Improved determination of whether a nested event will end, reducing the + incorrect cases where it would be stopped immediately. +* Studio API - Fixed Studio::EventInstance::getMinMaxDistance returning -1 before + event starts playing. +* Core API - GameCore - Fixed very rare Opus decoding hang. +* Core API - GameCore - Improved convolution reverb XDSP recovery in case of + unexpected hardware failure. +* Core API - Linux - PulseAudio now attempts to load and connect for detection rather + than running 'pulseaudio --check'. This improves PipeWire compatibility. +* Unity - Fixed event reference updater not handling multiple game objects with the + same path. +* Unity - Fixed setup window showing event reference update step as completed when + incomplete tasks remained. +* Unreal - FMOD plugin no longer overwrites existing Unreal editor style. +* Unreal - Fixed BankLookup being regenerated unnecessarily. +* Unreal - Fixed FMODAudioComponent not handling streaming levels correctly. +* Unreal - XSX - Fixed builds not finding fmod libs. +* Unity - Fixed platform-specific settings not being saved. + +Notes: +* Stadia - Now built with SDK 1.62, LLVM 9.0.1. +* Unity - First-time installation no longer requires an event reference update + scan. +* Unity - Event reference update tasks now display their completion status and + can no longer be redundantly run multiple times. +* Unity - Editor now restores scene setup after finishing execution of event + reference update tasks. + +19/11/21 2.02.04 - Studio API minor release (build 121702) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added support for FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED with multiple + Systems +* Core API - Switch - Added Opus decoding for streams. +* Unity - HTML5 - Added support for Unity 2021.2. + +Fixes: +* Studio API - When loading pre 2.02 banks, Studio::EventDescription::getMinMaxDistance + will now provide a minimum and maximum value based on the spatializers of + that event instead of 0. +* Core API - Fixed potential crash / error / corruption if using Object spatializer + and multiple listeners. +* Core API - Improve handling of disconnected devices. +* Core API - Fixed incorrect audibility calculation causing some sounds to incorrectly + go virtual when sends are involved. +* Core API - iOS - Fixed crash when suspending multiple FMOD::System objects while using + the AudioQueue codec. +* Core API - ARM based iOS / Mac / Switch. Three EQ effect optimized to be up to + 2x faster. +* Core API - Android and macOS - Now use Monotonic clock instead of Wall clock. +* Core API - Win - Fixed issue where WASAPI would fail to gracefully handle an + invalidated device due to a disconnection during initialization. +* Unity - Added a prompt to update the FMOD folder metadata if necessary so that + it can be moved to any location in the project. +* Unity - Fixed a bug causing the Event Browser to be in an invalid state when + reopening the Unity Editor. +* Unity - Fixed a bug that caused stale cache assets to not be cleared correctly. +* Unity - Fixed attenuation override values not updating until next GUI change when + a new event is selected for an emitter. +* Unity - Fixed a denied access error when updating FMOD for Unity integration. +* Unity - Fixed the bank cache refresh failing when the event browser is open. +* Unity - Android - Fixed command line builds not using split application binary. +* Unity - Mac - Added a prompt to fix bad line endings in FMOD bundle Info.plist + files if necessary (these could cause DllNotFoundException errors). +* Unity - Fixed an error preventing command line builds from completing. +* Unreal - Linux - Fixed missing libs. + +Notes: +* GameCore - Now built with June 2021 QFE 2 GDKX. +* PS4 - Now built with SDK 9.008.001. +* PS5 - Now built with SDK 4.00.00.31. +* Switch - Now built with SDK 12.3.7. +* Unity - Removed obsolete x86 Linux binaries. +* Unity - RuntimeManager's AnyBankLoading and WaitForAllLoads methods have been + renamed for clarity (to AnySampleDataLoading and WaitForAllSampleLoading + respectively), retaining the same functionality. The previous methods + remain for compatibility but are considered deprecated. + +08/09/21 2.02.03 - Studio API minor release (build 120077) +------------------------------------------------------------------------------------------ + +Features: +* Core API - It is now possible to specify the Opus codec count via + FMOD_ADVANCEDSETTINGS, previously it was hardcoded to 128. +* Core API - PS5 - Added ACM convolution reverb support. +* Core API - GameCore - Added XDSP convolution reverb support on Scarlett hardware. +* Core API - Win, GameCore, XBoxOne - Added recording support to WinSonic. +* Unity - Added EventReference.Find() to make setting default values on + EventReference fields more convenient. +* Unreal - UE4.26 on - Integration setup will now offer to add generated assets + to package settings. +* Unreal - UE4.26 on - Added Commandlet to support generating assets from + command line. +* Unity - Added IsInitialized property to EventManager to make it easier to know when + EventManager is safe to call. + +Fixes: +* Studio API - Fixed buffer overflow issues with command replays, system is now + more robust against failure and buffers have grown to handle demand. +* Studio API - Fixed issue where automating a labelled parameter under specific + circumstances would produce an incorrect result. +* Studio API - Fixed 7.1.4 sends losing their height speakers at the return. +* Studio API - Fixed issue where event instruments inside a multi instrument were unable + to be seemlessly looped with simple events. +* Studio API - Streaming instruments no longer can have the end of the audio cut off + if they take too long to load. +* Studio API - Fixed volume spike at start of multi instruments using both fade curves + and seek offsets. +* Core API - Fixed issue with System::registerCodec returning FMOD_ERR_PLUGIN_VERSION + regardless of FMOD_CODEC_DESCRIPTION apiversion. +* Core API - Fixed convolution reverb crash if out of memory. +* Core API - Fixed rare audio corruption / noise burst issue. +* Core API - Fixed FSBankLib AT9 encoder failing with an internal error on newer + versions of libatrac9.dll, 4.3.0.0 onward. +* Core API - Fixed potential crash when up-mixing quad to 5.1. +* Core API - GameCore - Reduced the chances of running out of Opus streams + when playing back Opus compressed banks on Scarlett hardware. +* Core API - Linux - Added support for automatic device switching. +* Core API - Android - Fixed issue where AAudio would restart occasionally on certain + devices. +* Core API - Android - Fixed issue where AAudio would would request an amount of data + far larger than its burst size on certain devices. +* Unity - Fixed a bug where settings could be accessed while an asset database + refresh was in progress, causing settings to be wiped. +* Unity - Fixed live update breaking when domain reload is disabled. +* Unity - Fixed an invalid handle error that would occur when an attached instance + ends. +* Unity - Fixed StudioParameterTrigger and StudioGlobalParameterTrigger not + receiving Object Start and Object Destroy events. +* Unity - Fixed the attenuation override values being overwritten when selecting + multiple event emitters. +* Unity - Fixed global parameter trigger browser showing other FMOD folders. +* Unity - Fixed referenced events not being played when an event is previewed in + the event browser if the referenced events are in a different bank. +* Unity - Fixed RuntimeManager.MuteAllEvents not working in editor. +* Unity - Fixed bank names including the .bank file extension when Load Banks is + set to Specified. +* Unity - Fixed a bug allowing multiple localized banks to be loaded and preventing + them from being unloaded. +* Unity - Fixed compatibility of native libraries changing after build. +* Unity - Fixed stretched logo texture in setup wizard when targeting iOS as build + platform. +* Unity - Fixed an error caused by auditioning events with global parameters in the + event browser. +* Unity - Fixed an error state caused by inspecting a game object that contains + both a Unity Image and an FMOD StudioEventEmitter. +* Unity - Fixed staging instructions appearing for fresh integration installations. +* Unity - Fixed an exception caused by disconnected prefab instances when updating + event references. +* Unreal - Fixed FMODAudioComponents continuing to play after actors have been + destroyed. +* Unreal - Fixed 'Reload Banks' menu option. +* Unreal - Fixed error when building installed engine with FMOD plugin. + +Notes: +* GameCore - Now built with June 2021 QFE 1 GDKX. +* Stadia - Now built with SDK 1.62 +* Unity - Removed a sleep loop in StudioEventEmitter.Start(). +* Unreal - Added support for UE4.27. + +26/07/21 2.02.02 - Studio API minor release (build 118084) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Mac - Added Dolby PLII downmix support. +* Unity - When Event Linkage is set to Path, the EventReference property drawer and + Event Reference Updater tool can now update paths for events which have + been moved in FMOD Studio (detected via matching GUIDs). +* Unity - Console logging from the plugin now follows the logging level specified + for FMOD. +* Unity - Improved the Asset Bundle import type to better support Addressables: + FMOD now creates a stub asset for each source .bank file, which can be + added to version control and to Addressables Groups. Stub assets are + replaced with source .bank files at build time, and reverted to stubs + after each build. + +Fixes: +* Studio API - Fixed issue where silence instruments placed after a set parameter + command instrument would be skipped. +* Studio API - Fixed popping that would occur with fade curves and multi instruments in + the right conditions. +* Studio API - Fixed issue where automation and modulation would not evenly distribute + values for discrete parameters. +* Studio API - Fixed sustain point behavior where the sustain point is at the same time + as the end of a loop region. +* Studio API - Async instruments with infinite loop counts will play out their last loop + after being untriggered. +* Studio API - Scatterer instruments that have been untriggered will no longer fade out + child instruments. +* Studio API - Fixed issue where scatterer instruments would spawn instruments + inconsistently. +* Studio API - Fixed a stack overflow when releasing a very large number of events in a + single frame. +* Core API - Fixed FMOD::CREATESOUNDEXINFO::initialseekposition causing sound to not stop + at the correct time. +* Core API - Fixed disconnecting channel groups from ports when multiple instances of + the same port are connected. +* Core API - Fixed a possible crash by increasing the stack size of the file thread + from 48k to 64k. +* Core API - Fixed Object Spatializer getting out of sync with the mixer when the + mixer buffer is starved, this could also cause asserts to appear the log. +* Core API - GameCore - Fixed a race condition that could cause a hang when playing + Opus compressed audio. +* UE4 - Fixed default locale setting not working in cooked builds. +* Unity - Fixed references in EventReferenceUpdater.cs to classes unavailable when + the Unity Timeline package is missing. +* Unity - Fixed event browser being unable to audition events when an encryption + key is in use. +* Unity - Fixed setup wizard not marking current scene as dirty when replacing + Unity audio listeners. +* Unity - Fixed banks failing to load on Mac when the project is saved in Unity on + Windows. +* Unity - Fixed a crash caused by disabling API error logging. +* Unity - Fixed benign errors being logged to the console when API logging is + enabled. +* Unity - Fixed all banks being reimported whenever the banks are refreshed, + even if nothing has changed. +* Unity - Fixed an exception being thrown when building if version control is + enabled. +* FSBank - Fixed compatibility issue with Windows 7. +* Profiler - Fixed compatibility issue with Windows 7. + +Notes: +* HTML5 - Now built with SDK 2.0.20 (Upstream) and SDK 1.40.1 (Fastcomp). +* iOS - Now built with iOS SDK 14.5 (Xcode 12.5.1). +* Mac - Now built with macOS SDK 11.3 (Xcode 12.5.1), min deploy target + is now 10.9 as mandated by Xcode. +* Unity - Moved images into the Assets/Plugins/FMOD folder. +* Unreal - Added support for UE5.0 (EA1). + +26/05/21 2.02.01 - Studio API minor release (build 116648) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT which returns a + FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES containing the event's id. +* Studio API - Added an FMOD_STUDIO_PARAMETER_LABELED flag. +* Core API - Added loudness meter to the DSP API. The loudness meter is intended for + development purposes and is not recommended to be included in shipped + titles. +* Unity - Improved the UI for setting values on discrete and labeled parameters. +* Unity - Added FMODUnity.Settings.ForceLoggingBinaries to force FMOD to use the + logging binaries even when BuildOptions.Development is not set. +* Unity - Added the ability to set global parameters when auditioning an event. + +Fixes: +* Studio API - Improved performance of repeated calls to + Studio::EventDescription::isStream and + Studio::EventDescription::isOneShot. +* Studio API - Removed potential for performance hit from retrieving final volume and + final pitch values due to thread contention. +* Studio API - Fixed issue with audio device switching. +* Studio API - Restrict maximum number of non-zero length transitions to 31 per update + to prevent overloading the scheduler. +* Core API - GameCore - Fixed error log (assert) with logging build when playing + multichannel Opus. +* Core API - GameCore - Fixed rare Opus failure / hang when playing streams. +* Core API - GameCore - Fixed error log (assert) when seeking XMA streams near + the file end. +* Core API - Win/UWP/GameCore - Fixed WinSonic not falling back to no-sound + automatically if no devices are available. +* Core API - C# - Unblocked potential stalls when calling Studio::EventInstance::getVolume + / Studio::EventInstance::getPitch when finalVolume / finalPitch isn't + requested. +* Unity - Fixed global parameters disappearing if banks are refreshed when + the master bank hasn't changed. +* Unity - Fixed the setup wizard's Updating page status being reset whenever + scripts are recompiled. +* Unity - Fixed errors that occur when Settings.OnEnable() is called on an object + that is already initialized (e.g. "Cleaning up duplicate platform" and + "An item with the same key has already been added"). +* Unity - Reverted binary selection at build time to the old method of checking for + BuildOptions.Development in BuildReport.summary.options, as checking for + the DEVELOPMENT_BUILD symbol was failing in some situations and causing + DllNotFoundExceptions. +* Unity - Fixed bank sizes not being displayed in the event browser. +* Unity - Fixed compiler errors that appear when Unity's Physics and Physics 2D + packages are disabled. +* Unity - Fixed "The name 'StaticPluginManager' does not exist" error when calling + AddressableAssetSettings.BuildPlayerContent() on IL2CPP platforms. +* Unity - Removed cleanup of RegisterStaticPlugins.cs when a build finishes, in + order to avoid recompiling scripts unnecessarily. +* Unity - Create the Assets/Plugins/FMOD/Cache folder if it does not exist when + generating RegisterStaticPlugins.cs during a build. + +Notes: +* Unity - Added type-specific icons for global parameters in the event browser. +* Unity - Removed conditional code below Unity 2019.4 minimum specification. +* PS4 - Now built with SDK 8.508. +* PS5 - Now built with SDK 3.00.00.27. + +15/04/21 2.02.00 - Studio API major release (build 115890) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Event instances now have minimum and maximum distance properties that can + be automated by parameters. These can be overridden by + FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE and + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE. +* Studio API - Added Studio::EventInstance::getMinMaxDistance. +* Studio API - Added FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED. Converts the + range min distance to max distance into the range 0 to 1, clamping values + outside that range. +* Studio API - Added a guid field to FMOD_STUDIO_PARAMETER_DESCRIPTION. +* Studio API - Added Studio::System::getParameterLabelByID, + Studio::System::getParameterLabelByName, + Studio::System::setParameterByIDWithLabel, + Studio::System::setParameterByNameWithLabel, + Studio::EventDescription::getParameterLabelByName, + Studio::EventDescription::getParameterLabelByID, + Studio::EventDescription::getParameterLabelByIndex, + Studio::EventInstance::setParameterByIDWithLabel, + Studio::EventInstance::setParameterByNameWithLabel. +* Studio API - Added Studio::Bus::getPortIndex and Studio::Bus::setPortIndex. +* Core API - Added FMOD_DSP_PARAMETER_ATTENUATION_RANGE for spatializing DSPs to + utilize Studio::EventInstance min and max distance. +* Core API - Unified platform specific output port types FMOD_[PLATFORM]_PORT_TYPE + and moved them to common FMOD_PORT_TYPE. Attempting to attach a channel + group to an output port type which is not available on the platform will + return an error. +* Core API - UWP - Added support for Windows N versions. +* Unity - In Events Browser the Global Parameters now show in folders. +* FSBank - Added native Linux version of Gui and Command line application. +* Profiler - Added native Linux version of the Core API profiler. +* Linux - Added ARM 64 bit support. + +Fixes: +* Studio API - Fixed behavior interaction between timelocked multi instruments and + sustain points so that multi instruments will play from the same point + that they were stopped via the sustain point. + +Notes: +* Studio API - Studio::EventDescription::getMinimumDistance and + Studio::EventDescription::getMaximumDistance replaced with + Studio::EventDescription::getMinMaxDistance. +* Studio API - Studio::EventInstance::setProperty on + FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE or + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE does not affect spatializers + with Override Range set. This is most noticeable with effect presets. +* Studio API - Studio::System::getCPUUsage changed to take a struct FMOD_CPU_USAGE as + 2nd parameter, also FMOD_STUDIO_CPU_USAGE removes core api values. Use + FMOD_CPU_USAGE for that. +* Studio API - Renamed Studio::EventInstance::triggerCue to + Studio::EventInstance::keyOff and Studio::EventDescription::hasCue to + Studio::EventDescription::hasSustainPoint. +* Core API - FMOD_DSP_TYPE_PAN and FMOD_DSP_TYPE_OBJECTPAN have an override attenuation + range property to use the min and max distance properties of the dsp and + ignore the attenuation range of the event instance. Defaults to true for + backwards compatibility. +* Core API - FMOD::System_Create takes a headerversion argument to check the core api + headers and libraries match. +* Core API - System::getCPUUsage changed to take a struct FMOD_CPU_USAGE. +* Core API - Incremented FMOD_OUTPUT_PLUGIN_VERSION for Output plugins. Dynamic + library Output Plugins must be rebuilt. FMOD_OUTPUT_INIT_CALLBACK argument + dspnumbuffers can now be modified and dspnumadditionalbuffers has been + added. Additionally, FMOD_OUTPUT_METHOD_POLLING has been removed. +* Core API - Incremented FMOD_CODEC_PLUGIN_VERSION for Codec plugins. Dynamic + library Codec Plugins must be rebuilt. Codec API now exposes + FMOD_CODEC_FILE_TELL_FUNC, FMOD_CODEC_ALLOC_FUNC, FMOD_CODEC_FREE_FUNC and + FMOD_CODEC_LOG_FUNC functions. Additionally, FMOD_CODEC_FILE_SEEK_FUNC + accepts a FMOD_CODEC_SEEK_METHOD. +* Core API - Changed FMOD_THREAD_AFFINITY from unsigned 64-bit integer to signed 64-bit + integer, reducing the maximum supported number of cores by one. +* Core API - UWP - FMOD MediaFoundation Codec is now included as a separate dll. +* FSBank API - Removed deprecated FSBANK_FORMAT_PCM_BIGENDIAN and + FSBANK_FORMAT_AT9_PSVITA, and renamed FSBANK_FORMAT_AT9_PS4 to + FSBANK_FORMAT_AT9. +* Resonance - Replaced min and max distance with FMOD_DSP_PARAMETER_ATTENUATION_RANGE. + If previous behavior is required, FMOD 2.2 is compatible with resonance + audio included with 2.1. +* Android - Minimum API version raised to 16 for 32 bit. +* Linux - Now built with LLVM/Clang 10. +* Linux - ARM - the minimum supported architecture has been lifted to armv7 with + NEON support. +* PS5 - Renamed platform specific APIs and headers from codename to official name. +* Unity - The [EventRef] attribute has been replaced with the EventReference type. + This change requires migration; use the FMOD/Update Event References + menu command to assist you with the migration process. +* Unity - The minimum version of Unity supported is now 2019.4 + +12/02/21 2.01.09 - Studio API minor release +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Added FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED and + FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED. +* Studio API - Added Studio::EventDescription::isDopplerEnabled. Will return false with + banks built prior to 2.01.09. +* Unity - Added a Volume property to FMOD Event Tracks. +* Unity - Improved plugin lib updates by automating the process in a few simple + steps. +* Unity - Added 7.1.4 speaker mode to Project Platform in the settings menu. +* Unity - Added support for generating unit options for Unity 2021 Visual + Scripting package. +* Unity - Added option to enable error reporting to Unity console from internal + FMOD system. +* Unity - Added a Setup Wizard to help with adding FMOD to projects. + +Fixes: +* Studio API - Fixed possible memory corruption due to race condition between user code + creating sounds asynchronously using sound info from an audio table and + unloading the bank containing the audio table. +* Studio API - Improved error detection and documentation regarding the requirement of + loading asset banks at the same time as metadata banks. +* Studio API - Fixed issue where stopping conditions on nested events without ahdsr + modulators would not play out when the parent event is still playing and + the nested event becomes untriggered. +* Studio API - Fixed issue where hot swapping an event via live update would invalidate + the API handle. +* Studio API - Fixed incorrect count from Studio::Bank::getEventCount when loading + banks built with 1.07, 1.08 or 1.09. +* Core API - Fixed substantial performance issue when connected to a profiler. +* Core API - Fixed sync points potentially being skipped as Channels transition from + virtual to real. +* Core API - Fixed warning being logged about truncated files on user created sounds. +* Core API - Fixed hang on .S3M format playback when seeking past calculated end of + song with FMOD_ACCURATETIME. +* Core API - Fixed some netstreams return FMOD_ERR_HTTP. Introduced 2.01.02. +* Core API - Fixed potential audio corruption when using the object spatializer. +* Core API - Fixed System::getPluginHandle returning internal only DSPs. +* Core API - Fixed crash with Convolution Reverb. Introduced 2.01.08. +* Core API - Fixed early and late delay support for FMOD_DSP_TYPE_SFXREVERB. + Introduced 2.01.04. +* UE4 - Add a configurable delay to automatic bank reloading to avoid a race + condition between banks being rebuilt in Studio and the integration + trying to reload them. +* UE4 - Remove unsupported log levels from settings. +* UE4 - Fixed blueprint AnimNotify causing Editor to crash. +* UE4 - 4.26 - Fixed asset generation regenerating assets when banks have not + been modified. +* UE4 - 4.26 - Fixed crashes caused by attempting to regenerate assets which are + read-only on disk. User is now prompted to check-out or make writable + assets which are read-only on disk. +* UE4 - 4.26 - Fixed sequencer integration. +* UE4 - 4.26 - Fixed AnimNotify not automatically loading referenced event asset. +* UE4 - 4.26 - Fixed FindEventByName failing to load required event asset. +* UE4 - 4.26 - Fixed crash when running with sound disabled (eg. running as A + dedicated server or running with the "-nosound" command line option). +* UE4 - iOS/tvOS - Fixed audio occasionally not returning on application resume. +* UE4 - XboxOne - Fixed third party plugins not working. +* Unity - Made binary selection at build time more robust by checking for + DEVELOPMENT_BUILD in the active script compilation defines. +* Unity - Fixed context menu entries being disabled on FMOD Event Playable + parameter automation. +* Unity - Fixed a hang that could occur when scripts were recompiled after a + callback was fired from FMOD to managed code. +* Unity - Fixed banks not loading on Mac if project was saved from PC to source + control. +* Unity - Fixed a number of build errors on various platforms caused by the + static plugin system's use of the IL2CPP --additional-cpp command + (the static plugin system now generates C# instead of C++). +* Unity - PS5 - Removed unsupported Audio 3D option from the platform settings. +* Unity - UWP - Fixed warnings and errors surrounding Marshal usage depending + on Unity version, scripting backend and API compatibility combination. + +Notes: +* GameCore - Updated to February 2021 GDK. +* UE4 - Changed default source directory for runtime bank files to + Content/FMOD/Desktop. Platform specific INI files should be used to + override this as appropriate. + +11/02/21 2.01.08 - Studio API minor release (build 114355) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN, which is called when a + buffered mixer output device attempts to read more samples than are + available in the output buffer. +* Core API - Mac - Added Resonance Audio Apple Silicon support. +* Unity - Improved bank refresh logic and added a status window that appears when a + refresh is about to happen. +* Unity - Added support for automating event parameters on the Timeline. + +Fixes: +* Studio API - Fixed fast spawning scatterer instruments with low polyphony spawning too + few instruments. +* Studio API - Fixed a memory leak that could occur when a sound got stuck in the + loading state. +* Core API - Fixed crash on .XM format playback. +* Core API - Fixed potential hang with net streams if server returns errors. +* Core API - Fixed extraneous logging of internal pool allocations. +* Core API - Fixed rare crash when releasing convolution reverb DSP instances. +* Core API - UWP - Fixed logging spam when using WASAPI output mode. +* UE4 - Expose the Enable Timeline Callbacks property of FMOD Audio Component to + blueprints. +* UE4 - Fixed crash which could occur when an FMOD Audio Component which uses a + programmer sound is destroyed by unloading the map or closing the game. +* Unity - Fixed Discrete and Labelled global parameters that do not appear in the + Event Browser. +* Unity - Fix multiple listeners positioning not working correctly. +* Unity - Fixed sample data failing to load when Load Bank Sample Data is enabled + in a project with separate asset banks. +* Unity - Fixed an Android build error when the Export Project option is set. +* Unity - Fixed FMOD IL2CPP arguments being left in ProjectSettings after building, + which could break builds on other operating systems. +* Unity - Android - Fixed an IL2CPP build error on some NDK versions. +* Unity - PS5 - Fixed compile error due to stale platform API CS file. +* Unity - iOS/tvOS - Fixed audio occasionally not returning on application resume. + +Notes: +* Switch - Now built with SDK 11.4.0. +* UE4 - Added support for UE4.26. + +18/12/20 2.01.07 - Studio API minor release (build 113487) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE. +* Core API - Mac - Added Apple Silicon support. +* Unity - Added support for generating unit options for Bolt visual scripting. +* Unity - Added option to stop an emitter's event instance when the emitter is + further than its maximum attenuation distance from all listeners. + +Fixes: +* Studio API - Command replays now record the initial state of global parameters. +* Studio API - Fixed errors from instrument creation failure not being reported to the + error callback. +* Studio API - Fixed crash due to null pointer dereference when instrument creation + fails due to running out of memory. +* Studio API - Fixed crash when unloading a bank from the + FMOD_STUDIO_EVENT_CALLBACK_STOPPED callback. +* Studio API - Fixed crash when hot swapping a nested event and its parent where the + child event is registered before the parent event. +* Studio API - Fixed spurious warning messages when connecting Live Update. +* Studio API - Fixed crash which could occur if a user thread loads a bank + asynchronously while another thread releases the system. +* Studio API - Switch log messages about missing plugins from warning to log level when + the system is initialized with FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS. +* Core API - Fixed rare crash due to race condition when calling Sound::getOpenState + for a sound created with FMOD_NONBLOCKING. +* Core API - Fixed rare crash occurring some time after calling + System::attachChannelGroupToPort due to internal buffer synchronization. +* Core API - Fixed certain internet radio stations that serve up playlists failing to + load correctly. +* Core API - Fixed sidechain modulator release being cutoff if sidechain source is + destroyed. +* Core API - Linux - Fixed hang in shutdown when using ALSA as the output mode when + ALSA is unable to write to the output buffer. +* Core API - Android - Reduced AAudio fail to stop error message to a warning. +* Core API - UWP - Fixed issue preventing loading of 32 bit x86 plugins. +* UE4 - Fixed spurious warning messages when loading banks which use plugins. +* UE4 - Fixed listener being stuck at world origin when using a standalone game + from the editor (introduced in 2.00.12). +* UE4 - XboxOne - Fixed users having to modify engine code to copy libs. +* Unity - Android - Fixed Mobile Low and Mobile High platforms using the wrong + bank path when on Android. +* Unity - Prebuild debug warning added for invalid FMOD Event paths. +* Unity - Fixed banks not being copied into the project when using Asset Bundles. +* Unity - Fixed specified bank paths for multi platform builds. + +Notes: +* Core API - Changed THREAD_AFFINITY enum in C# wrapper from unsigned 64-bit integer + to signed 64-bit integer, reducing the maximum supported number of cores + by one. +* GameCore - Updated to August 2020 QFE 5 GDK. +* XboxOne - Now built with July 2018 QFE15 XDK. +* PS4 - Resonance Audio now built with SDK 8.008. +* PS5 - Resonance Audio now built with SDK 2.00.00.09. +* iOS - Now built with iOS SDK 14.2 (Xcode 12.2), min deploy target + for iOS is now 9.0 as mandated by Xcode. +* Mac - Now built with macOS SDK 11.0 (Xcode 12.2). +* Stadia - Now built with SDK 1.55. +* Unity - Moved Timeline and Resonance Audio classes from global namespace into + FMOD namespaces. + +13/11/20 2.01.06 - Studio API minor release (build 112764) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX. +* Core API - PS5 - Added support for microphone recording. +* Unity - Added support for Addressables. +* Unity - In Events Browser the banks folders now show when mirroring is disabled. +* Unity - Setting Live Update port per-platform is now supported. +* Unity - FMOD now automatically selects the release or logging version of the + native libraries at build time, based on the Development Build setting. + +Fixes: +* Studio API - Fixed issue where tempo based scatterer would play slightly off beat. +* Core API - Improved error message when binding to a port fails due to a permission + error. +* Core API - Android - Fixed issue where audio would disconnect while debugging. +* UE4 - Fixed deprecation warning in FMODStudioEditorModule. +* Unity - Fixed FMOD_ERR_MEMORY caused by leaking System objects on play-in-editor + script reload. +* Unity - Fixed volume value in debug window. +* Unity - Prebuild debug warning added for invalid FMOD Event paths. +* Unity - HTML5 - Fixed error when building for development. +* Unity - Switch - Fixed a build error due to fmodplugins.cpp not being enabled. + +Notes: +* Core API - Renamed FMOD_CODEC_METADATA_CALLBACK to FMOD_CODEC_METADATA_FUNC to + better reflect its purpose. +* Core API - Sound::getFormat now returns FMOD_SOUND_FORMAT_BITSTREAM if + FMOD_CREATECOMPRESSEDSAMPLE is used with System::createSound. +* GameCore - Updated to August 2020 QFE 4 GDK. +* PS4 - Now built with SDK 8.008. +* PS5 - Now built with SDK 2.00.00.09. + +09/10/20 2.01.05 - Studio API minor release (build 112138) +------------------------------------------------------------------------------------------ + +Features: +* Core API - XboxOne and Switch - Added ResonanceAudio plugin support. +* Core API - GameCore - Added FMOD_GameCore_SetXApuStreamCount to control reserved + XApu resources. +* Unity - Edit Settings now allows FMOD output mode to be set per-platform. +* Unity - Added support for specifying static plugins in the FMOD Settings. +* Unity - Added support for setting a per-platform callback handler to run custom + configuration code prior to initialization. +* Unity - Added settings to customize DSP buffer length and count per-platform. +* Unity - Added metering channel order setting. +* Unity - Assembly Definition files added to the FMOD plugin. +* Unity - The FMOD scripts will now compile without the unity.timeline package + installed. If you wish to use Timeline you will need to install this + package for Unity 2019.1 and above. +* Unity - GameCore - Add resonance audio support. +* Unity - iOS - Added simulator support. +* Unity - PS5 - Add resonance audio support. +* GameCore - Added support for decoding Opus compressed FSBs / Banks using platform + hardware acceleration on Scarlett devices. This is a preview release of + this feature, please report any bugs found directly to FMOD support email. + +Fixes: +* Studio API - Live update socket errors are now handled gracefully, only warnings are + logged. +* Studio API - Fix marker callbacks for multiply nested events. +* Studio API - Fixed Studio::EventDescription::is3D, Studio::EventDescription::isOneShot and + Studio::EventDescription::isNested potentially returning an error when the event + contains a nested reference to an event which has not been loaded. +* Core API - Fixed crash in convolution reverb if out of memory. +* Core API - Fixed rare crash when updating net stream metadata tags. +* Core API - Android - Reduce popping encountered on certain handsets by dynamically + adjusting latency. +* Core API - Android - Fix issue where regular gaps in audio were encountered on + handsets with using very large burst sizes. +* Core API - Android - Fix issue where System::mixerSuspend would fail on certain + handsets. +* Core API - Mac - Fixed init returning an error when no output devices available. +* Core API - Win - Fixed crash on Win7/8 devices with high end CPUs that support + AVX-512. +* Core API - Fix convolution crash if a small impulse was used followed by a large + impulse. Introduced in 2.01.04. +* Core API - HTML5 - Fix missing implementation of Sound::getSyncPoint/getSyncPointInfo/ + addSyncPoint/deleteSyncPoint. +* UE4 - Fixed potential null pointer dereference when updating FMOD listeners for + play-in-editor session. +* UE4 - PS5 - Disabled UE4 built-in audio to prevent crash at startup. +* Unity - Fixed rare TimeZoneNotFoundException encountered on some devices. +* Unity - Fixed play-in-editor not using new speaker mode when changed in settings. +* Unity - HTML5 - Fix FMOD_ERR_UNSUPPORTED error being returned from bank loading. + Introduced in 2.01.04. + +Notes: +* Studio API - Issues with reconnecting Live Update (primarily on mobile) have been + resolved in FMOD Studio. Update to FMOD Studio 2.01.05 or higher. +* GameCore - To produce Opus banks in FMOD Studio, add the new "Custom" platform to + your project and select Opus as the encoding. +* GameCore - Updated to June 2020 QFE 6 GDK. + +10/09/20 2.01.04 - Studio API minor release (build 111454) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Added a flag for discrete parameters to FMOD_STUDIO_PARAMETER_FLAGS +* Core API - Convolution reverb optimizations. Now multithreaded to avoid spikes in + mixer performance. Significant memory optimization with multiple instances. +* Core API - Android - Added support for swapping output modes. +* Core API - GameCore - Added FMOD_GAMECORE_PORT_TYPE_COPYRIGHT_MUSIC output port + type. +* Unity - Added OnEnabled and OnDisabled for StudioBankLoader. +* Unity - Added attachedRigidbody to OnTriggerEnter and OnTriggerExit for EventHandler. +* Unity - Updated the event browser for better performance and more consistent + look and feel. + +Fixes: +* Core API - Android - Fixed recording support when using AAudio. +* Core API - Android - Fixed issues with headphone detection with AAudio. +* Core API - XboxOne - Fixed getOutputHandle not returning the IAudioClient on WASAPI. +* UE4 - When running multiplayer PIE sessions a listener is added for each player + in each viewport. +* UE4 - Improved handling of FMOD Studio objects being renamed or removed when + reloading banks. Previously it would appear that references to renamed + objects were correctly handled when they were not; references in UE4 + must be manually fixed up when FMOD Studio names are changed. +* UE4 - Improved handling of unsupported characters in FMOD Studio object names. +* Unity - Made the Studio Event Emitter initial parameter value UI handle prefab + instances and multi-selections properly. +* Unity - Fixed tooltips not working for EventRef. +* Unity - Fixed bank loading on Android with split/non-split APKs. +* Unity - Fixed plugin paths for Windows and Linux. + +Notes: +* Core API - GameCore - FMOD_GAMECORE_PORT_TYPE_MUSIC is no longer ignored by + GameDVR. Use FMOD_GAMECORE_PORT_TYPE_COPYRIGHT_MUSIC for background music + which should not be captured by GameDVR. +* Stadia - Now built with SDK 1.50. +* Android - Examples now include CMake based projects alongside the NdkBuild based + projects. +* GameCore - Updated to June 2020 QFE 4 GDK. + +05/08/20 2.01.03 - Studio API minor release (build 110858) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added System::getDSPInfoByType. +* Core API - GameCore - Added support for microphone recording. + +Fixes: +* Studio API - Fixed named marker callbacks for nested events. +* Studio API - Fixed issue with accumulating event instruments spawned by a scatterer. +* Studio API - Fixed issue where an event instance handle would incorrectly remain valid. +* Studio API - Improved detection of user code incorrectly using a dangling pointer from + a previously destroyed Studio System object. +* Studio API - Improve panner envelopment when source is above or below the listener. +* Studio API - Fixed FMOD_STUDIO_PARAMETER_DESCRIPTION::maximum being 1 higher than the + maximum value which could be set. +* Studio API - Fixed discrete parameters with non-zero seek speed or velocity changing + value too quickly after having their value set by an API call. +* Studio API - Fixed stopping conditions for nested events. +* Core API - Ignore data and fmt sections of a wave file that are contained in lists. +* Core API - iOS - Fixed stale audio from before System::mixerSuspend playing after + calling System::mixerResume. +* Core API - iOS - FMOD initializes with FMOD_OUTPUTTYPE_NOSOUND if unable to + initialize due AVAudioSessionErrorCodeCannotStartPlaying. Switching to + FMOD_OUTPUTTYPE_COREAUDIO via System::setOutput is also supported. +* Core API - Mac - Fixed automatic default device switching. +* Core API - Win - Improved handling of IPv6 net-streams. +* Core API - Fixed FMOD_DSP_STATE_DFT_FUNCTIONS::inversefftreal function possibly + causing corrupted audio if it and FMOD_DSP_STATE_DFT_FUNCTIONS::fftreal + were called from different threads. +* UE4 - Android - Fixed issue which could cause Android packaged builds to crash + at startup. +* Unity - Fix crash in HasBankLoaded if RuntimeManager isn't initialized. + +Notes: +* Unity - Added GameCore platform. +* Switch - Now built with SDK 10.4.1. +* GameCore - Updated to June 2020 QFE 1 GDK. + +01/07/20 2.01.02 - Studio API minor release (build 110199) +------------------------------------------------------------------------------------------ + +Features: +* Core API - GameCore - Added XMA support for Scarlett. +* Core API - GameCore - Added background music port support. +* Core API - PS5 - Added support for all platform specific ports, including background + music, controller speaker and vibration. +* Unity - Added field for specifying a sub directory for Banks in the settings. + +Fixes: +* Studio API - Fixed an issue with events referencing missing parameter descriptions + when parameters were unused for a platform. For old banks references to + missing parameter descriptions are stripped out of the event at load + time. Newer banks will always include all parameter descriptions to + ensure consistency across platforms. +* Studio API - Fixed assert that would occur when setting a parameter that in turn + creates an entity that also is listening for that parameter to change. +* Studio API - Fixed doppler calculation to use listener attenuation position. +* Studio API - Fixed memory leak caused by creating a bus with missing bank data. +* Studio API - Improved performance of repeated calls to Studio::EventDescription::is3D. +* Studio API - HTML5 - Fixed loadBankMemory not allowing a UInt8 memory object type to + be passed to it. +* Core API - Fixed silence from ports when switching from no-sound back to a valid + output mode with ports. +* Core API - Fixed incorrect return of FMOD_ERR_DSP_RESERVED on ChannelGroups caused + by internal race condition. +* Core API - Fixed FMOD_LOOP_NORMAL flag not working with netstreams that have + "Accept-Ranges: bytes header". +* Core API - iOS - Fixed conflicting ogg vorbis symbols if linking FMOD against a + project containing vorbis already. +* Core API - Android - Fixed detection of headphones being plugged and unplugged via + the headphone jack on some devices. +* Core API - GameCore - Thread names will now show up in PIX. +* Core API - PS5 - Fixed crash when looping AT9 playback, no change required, fixed + by SDK 1.00. +* Core API - PS5 - Fixed AT9 decode failure when seeking near the end of the file. +* Core API - Stadia - Fixed crash on playback of Vorbis compressed audio. +* Unity - Fixed "ERR_INVALID_HANDLE" errors in UWP builds. +* Unity - Changed banks to only be copied into the project when building. + +Notes: +* PS4 - Resonance Audio now built with SDK 7.508. +* PS5 - Updated to SDK 1.00.00.39. +* UE4 - Added GameCore platform. +* UE4 - Added support for UE4.25. +* UE4 - Added PS5 platform. + +12/05/20 2.01.01 - Studio API minor release (build 109257) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Stadia - Added microphone recording support. +* Unity - Added support for separate listener attenuation position. + +Fixes: +* Studio API - Fixed issue where an instrument not on the timeline would fail to be + untriggered while the timeline is inside a source transition region. +* Studio API - Improve loudness meter performance. +* Studio API - Fixed crash that occurs with instrument hotswaps that change the + instrument and its position on the timeline while auditioning. +* Studio API - Fixed issue where scatterer instrument would spawn streaming instruments + that would exceed the polyphony limit. +* Studio API - Fixed issue where the Studio update thread could hang trying to release + an event instance where the instance being released used a streaming + programmer sound which was reused by another instance and the second + instance was still active. +* Studio API - Fixed scheduling behavior of events inside multi instruments so that the + event will play out async instruments, ahdsr modulators and adjust to + pitch modulation before playing the next item in the multi instrument. + It will still play before DSP tails. +* Core API - Fixed potential crash in the mixer or stream thread when playing + MIDI / MOD style files due to race condition. +* Core API - Android - Fixed potential crash when opening a file using the Android + asset syntax file:///android_asset/. +* Core API - PS5 - Fixed error being returned from platform specific affinity API. +* UE4 - Fixed possible crash during module shutdown if DLLs aren't loaded + correctly. +* UE4 - Fixed Android builds crashing at startup. +* Unity - Linux - Fixed FMOD_ERR_HEADERMISMATCH error due to conflict between + FMOD Studio and FMOD Ex (built into Unity) in 2019.3. +* Unity - Fixed settings bank path using wrong directory separators. +* Resonance - Fixed rare crash in Resonance Audio due to thread safety issue. + +Notes: +* GameCore - Updated to April 2020 GDK. +* Stadia - Now built with SDK 1.46. +* PS4 Now built with SDK 7.508. +* XboxOne - Now built with July 2018 QFE13 XDK. +* HTML5 - Now built with SDK 1.39.11, both fastcomp and upstream. +* Unity - Added PS5 platform. + +23/03/20 2.01.00 - Studio API major release (build 108403) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Studio::System::setListenerAttributes now supports a separate position + argument for attenuation. +* Core API - Optimized mixing and vorbis decoding. Performance increase of 2-2.5x on + all platforms. +* Core API - Optimized Multiband EQ. Performance increase of 2-3x on all platforms + for stereo and higher channel count processing. +* Core API - Added cross-platform API for setting thread affinity, stack size and + priority via FMOD_Thread_SetAttributes. +* Core API - Win - FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK now responds to default + device changes. + +Fixes: +* Studio API - Fixed issue where async instruments on a transition timeline with fade + out curves would snap to full volume when exiting the transition + timeline. +* Studio API - The end of destination and magnet regions are included as part of the + timeline length. +* Studio API - Changed behaviour of stopped async multi-instrument entries with + unlimited loop counts to not play. +* Studio API - Loop regions of lower priority that coincide with transitions are now + followed during the transition's source timeline. +* Core API - Fixed potential crash when calling Sound::getSubSound on a playing + stream, this is now prohibited and will instead return an error. +* Unity - Fixed compatibility issues with C# wrapper. FMOD objects are now passed + as IntPtr for callback arguments from native to C#. Use the constructor + of the correct type to recreate the object from the IntPtr. + +Notes: +* Core API - Calling Sound::getSubSound from FMOD_CREATESOUNDEXINFO::nonblockcallback + is no longer a synchronous operation meaning an additional callback + will execute when fetching the subsound has completed. +* Core API - Removed stackSizeStream, stackSizeNonBlocking and stackSizeMixer from + FMOD_ADVANCEDSETTINGS. These are now set via FMOD_Thread_SetAttributes. +* Core API - Removed deprecated FMOD_ADVANCEDSETTINGS::commandQueueSize member. +* Core API - Removed all platform specific thread affinity APIs, affinity is now + controlled via FMOD_Thread_SetAttributes. +* Core API - Renamed FMOD_OUTPUT_DESCRIPTION::polling to FMOD_OUTPUT_DESCRIPTION::method. +* Core API - When calling FMOD_Memory_Initialize with valid 'useralloc' and 'userfree' + callbacks, the requirement of 'userrealloc' is now optional. +* Core API - DSP Echo delay effect minimum reduced to 1 millisecond. +* FSBank - Minimum requirement for Mac version of the FSBank tool has been lifted + to macOS 10.12 due to framework update. +* Profiler - Minimum requirement for Mac version of the Profiler tool has been lifted + to macOS 10.12 due to framework update. + +02/03/20 2.00.08 - Studio API minor release (build 108014) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Added FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN to set per instance cooldown. +* Studio API - Added Studio::getMemoryUsage, Bus::getMemoryUsage, + Studio::EventInstance::getMemoryUsage and FMOD_STUDIO_MEMORY_USAGE for retrieving + memory usage statistics in logging builds. + +Fixes: +* Studio API - Fixed issue with determining the end of an event inside a multi + instrument. +* Studio API - Fixed issue with determining the end of an async instrument with pitch + automation. +* Studio API - Fixed potential crash when playing a command replay from a 64bit game + on a 32bit host. +* Studio API - Fixed issue where polyphony limits on an event and bus could both apply + causing too many event instances to be stolen when starting a new event + instance. +* Studio API - Fixed issue where Studio update thread could get stuck in an infinite + loop and eventually deadlock with the game thread when a sound object + used for a programmer sound was used by more than one event instance. +* Studio API - Fixed issue where transitioning from the start of a transition region + to a destination marker using a relative transition with a tempo marker + would result in the event stopping. +* Studio API - HTML5 - Fixed missing plugin errors for banks using loudness meter, + convolution reverb or pitch shifter. These effects can be CPU intensive + so use them with caution. +* Core API - Fixed seeking accuracy of mp3 files that use small mpeg frame sizes. +* Core API - Fixed ChannelGroup::isPlaying from returning false on a parent + ChannelGroup, when children groups in certain configurations had playing + sounds. +* Core API - iOS - Fixed issue causing MP3 netstreams to not work. +* Core API - iOS - Fixed issue where FMOD_CREATECOMPRESSEDSAMPLE would not work as + expected with MP3 files. +* UE4 - Fixed crash in 4.24 caused by SetActive call in FMODAudioComponent. +* UE4 - Fixed warning log message when using the IsBankLoaded blueprint function + when the bank is not loaded. +* Unity - TextAsset banks import directory now defaults to 'FMODBanks' instead + of the root 'Assets' folder. +* Unity - HTML5 - Fixed compilation issue preventing launch. + +Notes: +* XboxOne - Now built with July 2018 QFE12 XDK. +* PS4 - Resonance Audio now built with SDK 7.008. +* HTML5 - JavaScript bindings are now separate from the main bitcode binary to + facilitate recompilation of ASM.JS / WASM or usage in strictly native + projects. + +17/01/20 2.00.07 - Studio API minor release (build 107206) +------------------------------------------------------------------------------------------ + +Features: +* Unity - Changing bank import type now gives you the option of removing the + previously imported banks. +* UE4 - Added getParameter functions for getting user and final values. + +Fixes: +* Studio API - Fixed application of fade curves to instruments when transitioning + immediately between transition timelines. +* Studio API - Fixed Studio::EventDescription::is3D to return true for events with + scatterer instruments, for 3D instruments inside multi instruments, and + for spatializers on non-master tracks. +* Studio API - Fixed relative transition calculation when performing a transition jump + that would incorrectly end up at the beginning instead of the end of the + destination or vice versa. +* Studio API - Fixed issue when encountering a loop region in a destination timeline + which would stop the event in specific circumstances. +* Studio API - Fixed crash when profiling runtime with an older Studio tool version. +* Core API - Fixed asserts from setting readonly DSP data parameters when the setter + isn't implemented. +* Core API - Fixed FSBankLib Vorbis encoder not supporting quality zero as default. +* Core API - Fixed System::setDriver not always applying if called after + System::setOutput when the device list has changed. +* Core API - Fixed DSP_PARAMETER_DESC being populated with incorrect data in C#. +* Core API - Fixed MP3 codec not respecting FMOD_ACCURATETIME flag when played as + FMOD_CREATECOMPRESSEDSAMPLE. +* UE4 - Fixed EncryptionKey not being saved to packaged game. Bank encryption keys + in existing projects will need to be re-entered after upgrading. +* UE4 - XBoxOne - Fixed third party plugin path. +* UE4 - Fixed FMODEvent::GetParameterDescriptions not working in built game. +* Unity - Fix lag in editor due to banks being reimported. +* Unity - Fixed FMODStudioCache causing deserialization exceptions by moving the + file to a separate cache folder. + +Notes: +* PS4 - Now built with SDK 7.008.031. +* Stadia - Now built with SDK 1.38. +* Switch - Now built with SDK 9.3.0. +* HTML5 - Now built with sdk-1.38.19-64bit +* UE4 - Added support for UE4.24. +* UE4 - Added support for Stadia. +* OSX - Updated Resonance Audio plugin with performance improvements. + +20/11/19 2.00.06 - Studio API minor release (build 106220) +------------------------------------------------------------------------------------------ + +Fixes: +* Studio API - Fixed issue where a loop on an instrument followed immediately by a + transition timeline could result in a short pause in playback. +* Core API - Mac - Fix crash calling recordStart at the same time as unplugging a USB + microphone. +* Core API - Android - minimum Android version for AAudio support changed to 8.1 + (API 27) to circumvent AAudio RefBase crash issue. +* Core API - XboxOne - Fixed background music port going silent if XAudio is + initialized outside of FMOD. +* Core API - Stadia - Fixed crash at static initialization time when using the logging + build on system software v1.37 and newer. +* FSBank API - Win - Fixed bug introduced in 2.00.05 which prevented banks being built + when passing a non-empty encryption key to FSBank_Build. +* UE4 - Fixed asset loading errors on dedicated server. +* Unity - Fixed integration deleting non FMOD bank/bytes files when refreshing. +* Unity - Fixed handling of iOS AudioSession interruption notifications. + +Notes: +* iOS - Now built with iOS SDK 13.1 and tvOS SDK 13.0 (Xcode 11.1). +* Mac - Now built with macOS SDK 10.15 (Xcode 11.1). + +09/10/19 2.00.05 - Studio API minor release (build 105402) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Add event and bus instance CPU profiling to the FMOD Studio API. +* Core API - Stadia - Added voice output port FMOD_STADIA_PORT_TYPE_VOICE. + +Fixes: +* Studio API - Fixed crash caused by creating an instance of an event containing a + nested event which has not been loaded. +* Studio API - Fixed pitch changes on a bus propagating across sidechain connections. +* Studio API - Fixed application of transition fade curves to parameter triggered + instruments on multi track events. +* Core API - Fixed mixer falling silent due to very small but not denormal positions + being passed into the API. +* Core API - Fixed crash when processing loops of FMOD_DSPCONNECTION_TYPE_SEND + or FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN. +* Unity - Removed high frequency of UnityEditor.SetDirty calls. +* Unity - Fixed issues with using relative paths in linked project/bank directory. + +Notes: +* Switch - Now built with SDK 8.3.0. +* XboxOne - Now built with July 2018 QFE9 XDK. + +06/09/19 2.00.04 - Studio API minor release (build 104705) +------------------------------------------------------------------------------------------ + +Features: +* Official support for Stadia as a separate platform is now complete, anyone using + the Linux version should migrate across. + +Fixes: +* Studio API - Fixed issue where programmer sound without an associated sound would + have unexpected behavior when modulated. +* Studio API - Fixed issue where instruments with low polyphony would incorrectly fail + to play. +* Studio API - Fixed looping multi-instrument with streaming instruments cutting + off near the end of the loop when the length of the multi-instrument is + slightly longer than a multiple of the instrument length. +* Studio API - Fixed issue where automation points are reused in transition timelines + when both the timelines and the transition have no automation points. +* Core API - Fixed crash caused by unlinking a convolution reverb dsp during a mix. +* Core API - Fixed potential alignment crash on ARM devices if using FMOD_DSP_PAN. +* Core API - Fixed leak of socket handles when binding to a listening port fails. +* Core API - Win / UWP / XboxOne - Fixed incorrect DSP CPU reporting when using + FMOD_OUTPUTTYPE_WINSONIC. +* UE4 - Fixed crash in PlayEventAtLocation when world context is invalid. +* UE4 - Fixed failed to load errors when playing in Standalone. +* UE4 - Switch to using "Additional non-asset directories to copy" packaging + setting for FMOD banks to avoid possible deadlocks at runtime. +* Unity - Fixed banks being copied to project repeatedly when using AssetBundles. +* Unity - Fixed Events not auditioning from split banks. +* Unity - Fixed RuntimeManager being able to update the 3DAttributes for an + Event Instance multiple times using different values. + +02/08/19 2.00.03 - Studio API minor release (build 103912) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Improved ASIO channel mapping via FMOD_ADVANCEDSETTINGS::ASIOSpeakerList. + Skips irrelevant speakers with FMOD_SPEAKER_NONE and supports devices up + to 32 channels without using FMOD_SPEAKERMODE_RAW. +* Core API - Android - Added support for AAudio via FMOD_OUTPUTTYPE_AAUDIO. +* Core API - PS4 - Added ResonanceAudio plugin for PS4. +* Core API - Android - Added support for setting thread affinity via + FMOD_Android_SetThreadAffinity. +* UE4 - Added blueprint node for Studio::EventInstance::release. +* Unity - Added setParameter by name wrapper function to StudioEventEmitter.Features: +* Unity - Fixed crash when setting logging level to LOG and entering playback. + +Fixes: +* Core API - Fixed rare crash on Studio::System::release. +* UE4 - Fixed FMODAudioComponent not being occluded are being stopped and + restarted. +* Unity - Fixed project determinism issue causing paths to update when opening + the project on Windows and Mac. +* HTML5 - FMOD Studio examples updated with 2.0 API changes. + +Notes: +* Switch - Now built with SDK 8.2.0. +* XboxOne - Now built with July 2018 QFE7 XDK. + +18/06/19 2.00.02 - Studio API minor release (build 102879) +------------------------------------------------------------------------------------------ + +Features: +* Core API - C# - Added getters to DSP_PARAMETER_FFT that will fill a user provided + buffer, to avoid garbage collection. +* Studio API - FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED, + FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER, and + FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED callbacks are now called from + nested events. +* UE4 - Added support for tvOS. +* Unity - StudioEventEmitter and EventRef now support the use of GUIDs or paths. +* Unity - StudioListener components will be assigned an index from the + RuntimeManager at runtime, rather than user specified. + +Fixes: +* Core API - Win 64bit - Skip JACK ASIO driver when enumerating ASIO devices. An + unrecoverable crash occurs in the driver when attempting to query its + capabilities. +* UE4 - Fixed "Accessed too early?" crash by changing the plugin loading phase. +* UE4 - Fixed OnEventStopped not being broadcast when the FMODAudioComponent + is destroyed. +* Unity - Fixed third party plugin paths for Win32 and Mac. +* Unity - Changed the Debug Overlay Window ID to avoid conflicts. +* Unity - iOS - Fixed sound stopping in editor when focus is lost. + +* PS4 - Now built with SDK 6.508.021. + +09/05/19 2.00.01 - Studio API minor release (build 102182) +------------------------------------------------------------------------------------------ + +Features: +* Core API - ChannelMix DSP now supports re-routing input channels. +* UE4 - Added support for UE4.22. +* UE4 - Added Encryption Key to the settings for loading sounds from + encrypted banks. +* UE4 - Added Play-In-Editor logging options to Plugin Settings. +* UE4 - Android - Added support for x86_64. +* Unity - Added SetParameter by ID to StudioEventEmitter. +* Unity - Added Encryption Key to the settings for loading sounds from + encrypted banks. +* Unity - Added mouse events to StudioEventEmitter trigger options. + +Fixes: +* Studio API - Fixed assert caused by a backwards transition with a lead out on a + transition timeline with callbacks for timeline markers. +* Studio API - Fixed bug in cone angle built-in parameter calculation when using + FMOD_INIT_3D_RIGHTHANDED. +* Core API - Fixed virtualized objects from object spatializer being silenced + (introduced in 2.00.00). +* Core API - Fix crash when using convolution reverb with a DSP buffer size of 4096 or + above. +* Core API - Fix crash trying to load corrupt WAV files with 0 length chunk size. +* Core API - Fix crash trying to load corrupt MP3 files. +* Core API - Fixed send dsp data being retained after being bypassed. +* Core API - iOS - Fixed crash when suspending or resuming the mixer while audio is + loading. +* UE4 - Fixed Ambient LPF values not being set properly. +* UE4 - Fixed builds failing due to the integration being loaded after + blueprints. +* UE4 - Fixed listener using the correct nested AudioVolume. +* Unity - Fixed handling banks in sub-directories. +* Unity - Fixed IOException when trying to copy banks into StreamingAssets. +* Unity - Fixed Events previewed in Timeline not stopping. +* Unity - Fixed StudioListeners with an index larger than zero causing errors. +* Unity - Fixed FMODStudioSettings.asset modifying bank list order when + using different scripting backends. +* Unity - Remove garbage collection overhead in DebugOverlay. +* Unity - Fixed creating duplicate objects when loading banks for the Editor. +* Unity - Fixed Emitters cleaning up properly when using one shot Events. +* Unity - Fixed paths for plugins in editor. +* Unity - Fixed build errors on iOS / tvOS due to "lowLevelSystem" references. +* Unity - Removed excessive error logging when no project or folder linked + to the integration. +* Unity - Fixed occasional issues with copying banks into StreamingAssets. +* Unity - Fixed Master Bank not being found if in a sub directory. +* Unity - Fixed StudioParameterTrigger IndexOutOfRange exception. + +Notes: +* XboxOne - Now built with July 2018 QFE4 XDK. + +14/03/19 2.00.00 - Studio API major release (build 101145) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Bank sample data encryption is now supported via the Studio API. + Use FMOD_STUDIO_ADVANCEDSETTINGS.encryptionkey to specify the + encryption key to use when opening banks and use the + FMOD_STUDIO_LOAD_BANK_UNENCRYPTED flag to load unencrypted banks + if an encryption key has been set. +* Studio API - Added built-in parameter for speed. +* Studio API - Added support for global parameters. +* Studio API - Added support for global mixer automation. +* Studio API - Added the ability to set a custom final value on an AHDSR modulator. +* Studio API - Added ignoreseekspeed argument to public api setParameter functions. +* Studio API - Added the ability to automate time based ahdsr properties. +* Studio API - Added a command instrument with the ability to stop all non-nested + instances of an event description. +* Core API - Added output device enumeration to Windows Sonic output plugin. +* Unity - Switch platform settings have been moved into a separate dropdown. + +Fixes: +* Studio API - Event parameters with "Hold value during playback" enabled now + snap to their target values when their event is started. +* Studio API - Changed quantization calculation to use future tempo markers if no past + tempo markers are present, and default to 4/4 timing at 120 bmp if no + tempo markers are present. +* Studio API - Transition regions not using quantization perform any probability + determinations each time all other required conditions are newly met. +* Studio API - Sidechain modulators now correctly handle multiple sidechain inputs. +* Core API - Fixed volume spike due to tremolo DSP with high duty setting. +* Core API - Fixed excessive instances of clipping that occur when adjusting + the FMOD_DSP_THREE_EQ_LOWCROSSOVER value of a DSPThreeEQ DSP in + the low frequency range. + +Notes: +* Updated Resonance Audio plugin removing additional transformation of occlusion values. + If previous occlusion calculation is required, replace the resonance audio libraries + with their 1.10 versions. +* The GoogleVR plugin deprecated in 1.10 has now been removed, Resonance Audio + is available as a functional drop in replacement. +* Studio API - The parameter API has been updated. See the "What's New in 2.00" + section in the API documentation for details. +* Studio API - The deprecated ParameterInstance class has been removed. +* Studio API - Seek speed is now applied when parameter values are modified by + AHDSR or sidechain modulation. +* Studio API - Parameters with seek speed now snap to their target value when + the event stops. +* Studio API - Automatic parameters no longer update their user value. The + automatically calculated value can be retrieved using the finalvalue + parameter of Studio::EventInstance::getParameter. +* Studio API - Studio::System::getBank no longer supports getting a loaded bank from + the system by filename. +* Core API - System::getFileUsage will no longer count bytes read from user callbacks. +* Core API - Automatic SRS downmix from 5.1 to 2.0 has been removed. +* Core API - System::getSoundRAM API has been removed. +* Core API - FMOD_ADVANCEDSETTINGS::HRTFMinAngle, HRTFMaxAngle, HRTFFreq removed +* Core API - FMOD_CREATESOUNDEXINFO::channelmask removed +* Core API - Win - Support for paths using Windows ANSI Code Page (ACP) encoding + has been removed. Paths must be UTF-8 encoded. +* Core API - Win - The minimum supported version of Windows has been lifted + from Windows XP to Windows 7. Coupled with this change we have + removed the legacy DirectSound and WinMM output modes. +* Win / UWP - All binaries no longer have a suffix indicating the target architecture, + instead the files are separated by directories in the installer. + +14/03/19 1.10.12 - Studio API minor release (build 101101) +------------------------------------------------------------------------------------------ + +Features: +* Unity - Added option to specify Live Update port number in editor settings. +* Unity - Changed StudioEventEmitter private members to protected. + +Fixes: +* Studio API - Avoid stalling when unloading a bank which is waiting to load sample data + behind other banks. +* Core API - FMOD_OUTPUTTYPE_ASIO is now compatible with more devices without + requiring calls to System::setDSPBufferSize. +* Core API - Android - Fixed instances of audio stuttering that occurred on some + devices by dynamically adding latency to compensate. +* Core API - Fixed MP3 files with MPEG 2.5 encoding having distortion on some files. +* Unity - Fixed plugins not being found on Android. +* Unity - Fix for banks being read only when trying to copy new banks to + StreamingAssets. +* Unity - Fixed BatchMode builds not being able to find the MasterBank. +* Unity - Fixed BatchMode builds not building with banks. +* Unity - Changed console default thread affinity to not use the game thread. +* Unity - Fixed Strings bank not being found or copied (introduced in 1.10.10). + +01/02/19 1.10.11 - Studio API minor release (build 99976) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Add streamingscheduledelay member to FMOD_STUDIO_ADVANCEDSETTINGS. May be + used to reduce latency when scheduling events containing streaming + sounds. +* UE4 - Expose the FMODAudioComponent::bAutoDestroy property to the + PlayEventAttached Blueprint function. + +Fixes: +* Studio API - Fixed fire and forget event instances not releasing when another instance + of the same event is active. +* Studio API - Fixed a bug with multi-instruments when using looping and initial seek + which caused a gap of silence the same length as the initial seek when + scheduling the second instrument. +* Core API - Fixed MP3 files using Xing headers from having incorrect seek positions + when using Channel::setPosition. +* Core API - Fixed potential crash caused by third party applications sending + data to the FMOD profiler port. +* Core API - Fixed issue where bypassed faders and convolution reverb dsps could + silence their output. +* UE4 - Fixed 'An invalid object handle' errors from FMODAudioComponent + in sequencer after reloading banks. +* UE4 - Fixed playback not working correctly in Sequencer. +* UE4 - Fixed error from FindEventInstances if zero events found. +* UE4 - Fixed Programmer Sounds not auditioning in Editor. +* UE4 - Fixed events not playing in Sequencer. +* Unity - Fixed RuntimeManager being saved to scene after auditioning timeline. +* Unity - Fix AttachInstanceToGameObject positioning not being applied correctly. + +Notes: +* PS4 - Now built with SDK 6.008.051. +* iOS - Now built with iOS SDK 12.1 and tvOS SDK 12.1 (Xcode 10.1) which + necessitates lifting the min spec to 8.0 for iOS, no change for tvOS. +* Mac - Now built with macOS SDK 10.14 (Xcode 10.1) which necessitates + lifting the min spec to 10.7 and the removal of x86 support. +* Android - Added support for x86_64. + +03/12/18 1.10.10 - Studio API minor release (build 98815) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL and + FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL. +* Core API - Added DSP::GetCPUUsage to public API. +* Core API - Linux - Added support for FMOD_ALSA_DEVICE environment variable to + allow a user to specify an ALSA device. +* HTML5 - Add Web Assembly support (WASM) to HTML5 version of FMOD Core API + and Studio API. Memory usage halved, CPU speed improvements of about 30% +* Unity - Android - Added ARM64 support. +* Unity - Add support for working with multiple master banks and strings banks. + +Fixes: +* Studio API - Fixed multi-instrument playlist entries set to loop infinitely not + looping correctly. +* Studio API - Fixed pop that occurs at the start of a transition destination section + with a fade curves. +* Studio API - Fixed nested event instances stopping when their parent is paused. +* Studio API - HTML5 - Fix Studio::System::getSoundInfo not working +* Core API - System::setDSPBufferSize validates arguments for integer overflow. +* Core API - Fixed potential CPU usage spike due to dsp flush on releasing a + programmer sound during the destroy callback. +* Core API - Opening a playlist from a URL now validates that the playlist file is a + text file and falls back to codec probing if binary data is found. +* Core API - Linux - Fixed occasional distortion that can occur when using + PulseAudio. +* FSBank API - Fixed issue where a file change would not be detected when it has the + same modified time. +* UE4 - Fixed occlusion using the trace channel selected in editor. +* UE4 - Fixed plugin include directory paths. +* UE4 - Fixed crash caused by trying to access objects pending kill. +* UE4 - Fixed occlusion not working. +* UE4 - Fixed programmer sounds trying to access the FMODStudioModule outside + of the main thread, while also improving the performance of the + FMODAudioComponent. +* Unity - Fixed Asset Folder name updating after each keystroke. +* Unity - Fixed Timeline playables playing the previously selected event. +* Unity - Fixed "Bus not found" error caused when no banks loaded in editor. +* Unity - iOS - Fixed Events not resuming after returning focus. +* Unity - PS4 - Fixed logging libs being used for development builds. + +Notes: +* Studio API - Reduced the maximum number of parameter values which can be set in a + batch using Studio::EventInstance::setParameterValuesByIndices to 64. +* HTML5 - Now built with Emscripten v1.38.15 +* Switch - Now built with SDK 6.4.0. + +11/10/18 1.10.09 - Studio API minor release (build 97915) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Added globally sequential play mode to multi and scatterer instruments. +* Unity - All logging will now be displayed in the editor console. The logging + level can be changed using the dropdown in settings. + +Fixes: +* Studio API - Fixed missing bank warnings when playing a CommandReplay using + FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD mode. +* Studio API - UWP - Fixed Studio thread affinity not applying correctly. +* Studio API - Android / UWP - Fixed CommandReplay not working with AppX and + APK based paths. +* Core API - Fixed loading of encrypted FSBs. +* Core API - Fixed several panning issues when using FMOD_SPEAKERMODE_QUAD or + FMOD_SPEAKERMODE_SURROUND, does not affect Studio API usage. +* Core API - Fixed potential hang from internal fade point usage. +* Core API - Fixed ChannelControl::setMixLevelsInput not remembering the set + values when FMOD_3D is applied. +* Core API - Fixed potential cpu usage spike due to thread lock on releasing a + non-gpu convolution reverb dsp. +* Core API - Fixed support of FMOD_3D_INVERSETAPEREDROLLOFF. +* Core API - Fixed potential cpu usage spike due to thread lock on releasing a + transciever dsp. +* Core API - Win / UWP - Fixed Windows Sonic initialization failure when audio + device is configured for a sample rate other than 48KHz. +* Core API - Linux - Fixed ALSA default audio device selection. +* Core API - Android - Fixed crash if System::mixerSuspend is called before + System::init. +* Unity - iOS - Fixed playback not resuming after alarm / call interruptions. + +Notes: +* Updated Resonance Audio plugin to add support for near field effects, and added + FMOD_DSP_PARAMETER_OVERALLGAIN parameter to support virtualization. +* PS4 - Now built with SDK 6.008.001. +* XboxOne - Now built with July 2018 QFE2 XDK. + +10/08/18 1.10.08 - Studio API minor release (build 96768) +------------------------------------------------------------------------------------------ + +Features: +* UE4 - FMODAudioComponent is now blueprintable. + +Fixes: +* Studio API - Fixed potential crash when calling Studio::EventInstance::release from + the FMOD_STUDIO_EVENT_CALLBACK_STOPPED triggered by Bus::stopAllEvents. +* Studio API - Fixed a bug where changes to a parameter value made while an event was in + the FMOD_STUDIO_PLAYBACK_STARTING state would not update automation + controllers (introduced in 1.10.02). +* Studio API - Fixed Studio::CommandReplay::release not cleaning up resources + unless Studio::CommandReplay::stop was called earlier. +* Studio API - HTML5/WebGL - Fixed the following functions that didn't work. + - Studio::Bank::getID + - Studio::EventDescription::getID + - Studio::Bus::Bank::getID + - Studio::VCA::Bank::getID + - Studio::System::lookupID + - Studio::Bank::getStringInfo + - Studio::System::getBankList + - Studio::EventDescription::getInstanceList + - Studio::Bank::getEventList + - Studio::Bank::getBusList + - Studio::Bank::getVCAList +* Core API - Fixed audible artifacts when adjusting pitch near 1.0. Issue + can be seen from doppler calculations with small velocities. +* Core API - Improved stuttering issue when using Windows Sonic with high + DSP CPU usage. +* Core API - Fixed init errors on output devices that operate at 384KHz such + as the Aune X1s. +* Core API - Windows - Improved compatibility with some audio drivers by falling + back to stereo. +* Core API - HTML5/WebGL - Added support for unimplemented System::createDSP + with FMOD_DSP_DESCRIPTION. DSP callbacks are provided to allow + custom DSP support in Javascript. Added dsp_custom example to + example folder. +* Core API - HTML5/WebGL - Added support for unimplemented + ChannelControl::setCallback. +* Core API - HTML5/WebGL - Enabled support for 5.1 / Surround sound in a browser. + Only Firefox supports 5.1 so far, out of all browsers tested. +* UE4 - Fixed Activate and SetActive not working for FMODAudioComponents. +* UE4 - Fixed Simulating in editor producing no sound. +* UE4 - Fixed BlueprintStatics::LoadBank not working for banks containing spaces. +* UE4 - Fixed asset banks not displaying in editor or being loaded. +* Unity - Fixed warnings due to loading sample data on a metadata-only bank + before its asset bank is loaded. +* Unity - Fixed source project not updating if the old path is still valid. + +Notes: +* XboxOne - Now built with April 2018 QFE1 XDK. + +03/07/18 1.10.07 - Studio API minor release (build 95892) +------------------------------------------------------------------------------------------ + +Features: +* Unity - Added support for Timeline (from Unity 2017.1 onwards). + +Fixes: +* Studio API - The FMOD Gain effect is now taken into account when applying event + stealing behavior and virtualizing FMOD::Channels. +* Core API - Win/XboxOne - Fixed crash during System::recordStart if the + device was unplugged. +* Core API - Win - System::loadPlugin now correctly handles UTF-8 encoded + paths. Support for paths using ACP is deprecated and will be removed in + FMOD 1.11. +* UE4 - Fixed auditioning events not taking parameter values into account. +* UE4 - Fixed game crash when built using Event-Driven-Loader. + +06/06/18 1.10.06 - Studio API minor release (build 95384) +------------------------------------------------------------------------------------------ + +Features: +* Unity - Added SampleRate for Play-In-Editor settings. +* Unity - Added scripts for setting thread affinity on specific consoles. +* HTML5 - Updated core API and studio API examples to handle chrome mute until + mouse click or touch event happens, via System::mixerSuspend / + System::mixerResume. + +Fixes: +* Core API - Fixed potential crash if a stream naturally ends at the same time + as being released. +* Core API - Fixed incorrect parsing of large ID3 tags. +* Core API - Fixed FMOD_ERR_FILE_BAD error when trying to call setPosition to a point + past 2GB bytes in a file. +* Core API - Fixed crash if Windows Sonic output mode is used with the object + spatializer and the device is unplugged. +* Core API - Fixed stall in Sound::release for FSB files if another thread is + performing a createSound operation. +* Core API - Fixed potential crash when playing a netstream with tags. +* Core API - Fixed OGG netstreams not automatically stopping if the stream goes + offline. +* Core API - Fixed potential invalid memory access when a channel group is released + (introduced in 1.10.02). +* Core API - Channel group audibility now factors in attenuation due to 3D effects + when using ChannelControl::setMode(FMOD_3D). +* Core API - HTML5/WebGL - Fix System::setDriver(0) causing garbled audio when trying + to respond to a touch event and the audio is already active. +* Core API - HTML5/WebGL - Fix floating point accuracy issues making MIDI file sound + out of tune. +* Core API - UWP - Fixed default affinity mask incorrectly putting all threads + on core 0, now threads default to distributing among all cores. +* UE4 - Removed FMODAudioComponent ticking when deactivated. + +Notes: +* Core API - Windows Sonic output mode no longer requires a block size of 480. +* XboxOne - Now built with February 2018 XDK. +* Switch - Now built with SDK 5.3.0. + +26/04/18 1.10.05 - Studio API minor release (build 94661) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Add "Channel mask" tag to MIDI file support, to allow a user to + map used / unused channels in a midi file to the channel IDs in the + Sound::setMusicChannelVolume / Sound::getMusicChannelVolume functions +* Core API - Fixed System::recordStart memory leak if an error was returned. +* UE4 - File buffer size is now customizable in the settings menu. + +Fixes: +* Studio API - Fixed a rare bug where Studio::System::Update could hang if a streaming + sound encountered an error. +* Studio API - Fixed events getting stuck in a paused state if they were restarted while + waiting for sample data to load (introduced in 1.10.02). +* Studio API - Fixed an issue preventing network streams being used as programmer + sounds. +* Core API - Fixed rare hang during Sound::release when releasing a streaming sound in + the FMOD_OPENSTATE_ERROR state. +* Core API - Switch - Fixed Vorbis encoded banks producing silence when using + multimedia.nso (UE4 uses this). +* UE4 - Fixed FMODAudioComponent programmer sound creation flags. +* UE4 - Switch - Fixed performance by changing default thread affinity. +* Unity - Fixed FMODStudioSettings asset dirty flag being set unnecessarily. +* Unity - Fixed callbacks crashing when using IL2CPP or Mono on some platforms. +* Unity - Fixed editor system not being cleaned up on Play-In-Editor start. +* Unity - Android - Fixed load bank returning ERR_INVALID_HANDLE. + +Notes: +* Core API - It is now possible to initialize WinSonic output even if the user + has not enabled spatial audio on their default device. The platform + will provide a non-binaural downmix to the user desired speaker mode. +* PS4 - Now built with SDK 5.508.021. + +05/03/18 1.10.04 - Studio API minor release (build 93853) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Improved bank loading performance when there are already a large number + of loaded events. +* UE4 - Added the ability to enable Live Update while in editor for auditioning. + The Editor will need to be restarted for this setting to take effect. + +Fixes: +* Studio API - Fixed a bug where Studio::System::Update could fail with + FMOD_ERR_INVALID_HANDLE or FMOD_ERR_CHANNEL_STOLEN, which could lead to + memory or performance problems. Introduced in 1.10.03. +* Core API - XboxOne - Fixed XMA hang that can occur after actively using + many XMA voices for several days. +* Unity - Fixed MobileHigh/Low classifications for Apple Devices. Pre iPhone 5 + is classed as MobileLow. + +01/02/18 1.10.03 - Studio API minor release (build 93157) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added ASIO support for drivers that use PCM32 as a container for + smaller sized data. +* Profiler - Draw different DSP connection types with different line styles. +* UE4 - Added option to specify memory pool size, per platform, in the project + FMOD Studio settings. +* UE4 - Now complying with IWYU mode, this should increase compilation speed. + +Fixes: +* Studio API - Fixed the DSP network sometimes getting into a bad state when a sidechain + is connected to the next effect in the chain. +* Studio API - Fixed event playback sometimes using stale parameter values. +* Studio API - Fixed events failing to stop if they contain empty Single Instruments. +* Core API - Fixed potential crash in device list changed callback when there + are no available devices remaining. +* Core API - Fix 3D 5.1 sound not panning correctly if ChannelControl::set3DLevel(0) is used. +* Core API - Fixed ID3v2.4 compatibility issue causing missing or corrupted tags. +* Core API - Android - Fixed incorrect floating point check on ARM64 devices + causing FMOD_ERR_NEEDSHARDWARE with some devices. +* Core API - XboxOne - Fixed race condition causing internal errors with XMA + sounds loaded as FMOD_CREATECOMPRESSEDSAMPLE. +* Core API - PS4 - Fixed internal assertion caused by setPosition on an AT9 + sound loaded as FMOD_CREATECOMPRESSEDSAMPLE. +* FSBank API - Fixed creation of C header so it goes next to the FSB instead + of the working directory of the application. +* Unity - Fixed pause working properly in Play In Editor mode. +* Unity - Removed excess memory allocation from APIs that return strings in C#. +* UE4 - Fixed velocity of FMODAudioComponents. + +Notes: +* Unity - Added support for Unity 2017.3. +* Android - Now built with NDK r16b. +* Android - Minimum Android version is now API level 14 due to NDK r16b + deprecating older versions. +* Switch - Now built with SDK 3.5.1. + +07/12/17 1.10.02 - Studio API minor release (build 92217) +------------------------------------------------------------------------------------------ + +Features: +* Core API - UWP - Added Windows Sonic support. +* Core API - UWP - Added support for setting thread affinity via + FMOD_UWP_SetThreadAffinity. + +Fixes: +* Studio API - Fixed Quietest stealing behavior so new events don't start if they are + quieter than all currently playing events. +* Studio API - Fixed buses that have reached their Max Instances limit incorrectly + preventing their input buses from applying their stealing behavior. +* Studio API - Fixed a crash caused by wav files with invalid loop points. +* Core API - Fixed recording devices still being marked as connected when + switching to FMOD_OUTPUTTYPE_NOSOUND. +* Core API - UWP - Made device reset / unplug behavior more robust against failure. +* Core API - XboxOne - Fixed WASAPI init error if WinSonic was attempted first. +* FSBank API - Fixed crash in 64bit version when encoding low sample rate mono + sounds as Vorbis with low quality. +* Unity - PlayOneshot and PlayOneshotAttached now log a warning when the + event is not found, rather than throwing an exception. + +Notes: +* Added Resonance Audio plugin version 1.0, this plugin represents the continuation + of the Google VR plugin under new branding. The Google VR plugin is now considered + deprecated in favour of Resonance Audio, consider migrating to the new plugin as + the GVR plugin will be removed in FMOD 1.11. +* XboxOne - Now built with June 2017 QFE 8 XDK. + +01/11/17 1.10.01 - Studio API minor release (build 91339) +------------------------------------------------------------------------------------------ + +Features: +* UE4 - Expose Studio::Bus::stopAllEvents to be useable through blueprints. +* Unity - Event length displayed in event browser for one shot events. + +Fixes: +* Studio API - Fixed modulation on plugin instruments using the parent event's lifetime + rather than the instrument's lifetime. +* Studio API - Fixed a live update issue where asset files would not reload after being + moved on disk. +* Studio API - Fixed a bug which caused sounds to pan incorrectly when using + FMOD_INIT_3D_RIGHTHANDED. +* Studio API - PS4 - Fixed excessive binary size caused by inclusion of debug symbols. +* Core API - Fixed potential crash when re-initializing System after failure. +* Core API - Fixed compatibility issues with Windows XP. +* Core API - Android - Fixed exported symbols to avoid issues with unwinder. +* Core API - Android - Automatic output mode selection will now choose AudioTrack + rather than OpenSL if Bluetooth is enabled to avoid stuttering. +* Core API - XboxOne - Ensure WinSonic internal threads are assigned to the + same core as the FMOD mixer. +* FSBank API - Fixed crash when encoding very long audio files. +* UE4 - Integration now handles application interruption by pausing and resuming + the mixer. +* UE4 - Fixed SetEvent not setting or using new event. +* UE4 - Fixed XboxOne thread affinity struct setup. +* UE4 - Removed engine version ifdef's. +* UE4 - Fixed integration attempting to set the initial value of + built-in parameters. +* Unity - Fixed compatibility for Unity 5.0 & 5.1. +* Unity - Added check to see if any banks have been loaded before trying to pause. +* Unity - Allow StringHelper to fast return if string is null. + +Notes: +* Updated Google VR plugin to version 0.6.1. +* Studio API - Studio::EventInstance::set3DAttributes and + Studio::System::setListenerAttributes will now return + FMOD_ERR_INVALID_PARAM if the forward or up vectors are zero. In + logging builds warnings will be logged if the forward and up vectors are + not orthonormal. +* Core API - The convolution reverb effect will not accept impulse response data if + the system is not using a power-of-two DSP buffer size. Windows Sonic + currently requires a DSP buffer size of 480 making it incompatible with + convolution reverb until this requirement is lifted. +* PS4 - Now built with SDK 5.008.001. +* Unity - Exposed editor script classes for in-game FMOD objects as public. +* Unity - Exposed StudioEventEmitter's EventInstance as public to allow + easier integration with custom plugins. + +19/09/17 1.10.00 - Studio API major release (build 90329) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Added FMOD_MAX_SYSTEMS constant, currently 8. +* Core API - Exposed FMOD_DSP_FADER_GAIN on FMOD_DSP_TYPE_FADER. +* Core API - Added FMOD_SPEAKERMODE_7POINT1POINT4 speaker mode which includes + four height speakers to be used with Windows Sonic output. +* Core API - Added FMOD_DSP_PAN_2D_HEIGHT_BLEND parameter to FMOD_DSP_TYPE_PAN + that allows mixing ground speaker signal into the height speakers + and vice versa. +* Core API - Windows & XboxOne - Added Windows Sonic output plugin to support + rendering multichannel (with height) speaker mode 7.1.4 as well + as dynamic objects via FMOD_DSP_TYPE_OBJECTPAN. +* Core API - PS Vita - Switched FMOD_PSVita_SetThreadAffinity to accept a + mask instead of a core number to allow floating threads. +* Core API - Added FMOD_OUTPUT_REQUESTRESET to FMOD_OUTPUT_STATE to allow output + plugins to request they be reset by the System. + +Fixes: +* Studio API - Sequential multi and scatterer instruments now track their current + playlist entry on a per-event-instance basis, rather than globally. +* UE4 - Removed all reference to Oculus, now that Oculus functions as + all other FMOD Studio plugins. +* UE4 - Removed all legacy UE4 version code, if you are not using UE4.16 + the plugin will not work without making changes to source code. +* UE4 - Overhauled details interaction in editor and improved usability. + Grouped all FMOD functionality together, added Parameters, and + removed unnecessary information from attenuation/occlusion. +* Unity - Removed garbage allocations from C# wrapper. + +Notes: +* Updated Google VR plugin to version 0.6.0. +* Studio API - Changed the behaviour of nested events to stop when idle even + when there are instruments on parameters. This makes nested + events match the behaviour of top level events. Events which + depend on the old behaviour need to be manually fixed up by (for + example) adding a sustain point to the nested events timeline. +* Core API - FMOD_DSP_TYPE_ENVELOPEFOLLOWER is now deprecated and will be + removed in a future release. +* Core API - Increment Plugin API version for Output plugins. Dynamic library + Output Plugins must be rebuilt. +* Android - Logging version will now produce proper crash stacks but due to + binary size increase the release version will continue to not. +* XboxOne - Removed "acp" and "feeder" from FMOD_XBOXONE_THREADAFFINITY. + Both threads were removed in previous versions and setting them + did nothing. +* UE4 - AudioComponents using occlusion from previous versions are NOT + compatible with this version. Occlusion and Attenuation now do + not rely on UE4 structs. + +11/09/17 1.09.08 - Studio API minor release (build 90162) +------------------------------------------------------------------------------------------ + +Fixes: +* Core API - Fixed extraneous logging. + +07/09/17 1.09.07 - Studio API minor release (build 90008) +------------------------------------------------------------------------------------------ + +Features: +* UE4 - Cache dsp used for occlusion lowpass effect & add support for + use of Multiband EQ (lowpass on band A only). +* UE4 - FMODAudioComponent now reuses event instances until the object + is no longer needed or Release() is called. +* UE4 - Added support for UWP. +* Unity - Added support for Unity v2017.1. +* Unity - Added a button in the FMOD menu for Refreshing Bank files. + +Fixes: +* Studio API - Fixed scatterer sounds being processed by FMOD::Geometry. +* Studio API - Fixed multi-stream events playing out of sync (introduced in 1.09.01). +* Core API - Fixed ChannelControl::setDelay being ignored if addDSP was + called immediately after it. +* Core API - Fixed potential crash if calling Channel::setPosition soon + after System::playSound with paused as true. +* Core API - Fixed click on ChannelControl::setPaused(false) caused by a non-zero + Channel::setPosition after System::playSound with paused as true. +* Core API - Fixed potential crash if calling System::getRecordPosition while + disconnecting an audio device. +* Core API - Fix FMOD_ACCURATETIME not looping mod/s3m/xm/it files properly, and midi + files not looping properly without the flag. +* Core API - Fixed crash when attempting to load invalid VST files. +* UE4 - Fix compile error by adding categories to AnimNotify vars. +* Unity - Switch - Fixed "unknown pointer encoding" error when an exception occurs. +* Unity - Fix plugin path for UWP builds. +* Unity - Fixed possible crash when using GoogleVR plugin. +* Unity - Fix EventEmitter SetParameter not working unless parameter had + an inital value set in editor. + +Notes: +* Studio API - Reduced memory usage for events with a small number of instances. +* Core API - FMOD_CREATESOUNDEXINFO::initialseekposition will now wrap if + the value given is longer than the Sound length. +* Core API - Added documentation to the top of fmod_codec_raw to be more instructional + for plugin writers. +* UE4 - Added support for UE4.17. +* Unity - Device specific errors will now cause only a single exception + to be thrown and the integration will assume no-sound mode. +* Switch - Now built with SDK 1.7.0. +* XboxOne - Now built with March 2017 QFE 3 XDK. + +06/07/17 1.09.06 - Studio API minor release (build 88495) +------------------------------------------------------------------------------------------ + +Features: +* Studio API - Improved performance when a large number of EventInstances have + been created but not started. +* Core API - HTML5 - Performance increased by 10%. + +Fixes: +* Studio API - Fixed a bug where an asynchronous looping multi instrument would + stop selecting new playlist entries after playing a nested event + which itself contains an asynchronous looping multi instrument. +* Studio API - Fixed a bug where a parameter could trigger parameter + instruments before having its value updated by modulators when + restarting an event instance. +* Studio API - Fixed incorrect automation interpolation on transition timelines with + lead-out regions. +* Core API - Fixed DSPs with sidechain inputs incorrectly going idle when + the main input is idle but the sidechain input is not. +* Core API - Fixed the compressor DSP not playing out its release correctly + when its inputs are idle. +* Core API - Remove main thread stall from System::playDSP (or playing a + generator DSP via Studio API). +* UE4 - Sequencer integration now supports previewing event playback in + an editor viewport by using the Sequencer transport controls. A + Sequencer section has been added to the documentation. +* UE4 - Added AreBanksLoaded funtion to FMODStudioModule. +* Unity - Events in EventBrowser window now in alpabetical order. +* Unity - Setting parameters on StudioEventEmitter no longer generates garbage. + +Notes: +* Core API - Added checking to System::mixerResume to ensure called from + the same thread as System::mixerSuspend. +* XboxOne - Now built with October 2016 QFE 3 XDK. + +08/06/17 1.09.05 - Studio API minor release (build 87666) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Switch - Added support for HTC sockets to allow communications + between FMOD tools and runtime via target manager. Enable using + FMOD_Switch_SetHTCSEnabled(TRUE). +* Core API - XboxOne - Added support for System::attachChannelGroupToPort + with FMOD_XBOXONE_PORT_TYPE_MUSIC. + +Fixes: +* Studio API - Fixed FMOD_ERR_INTERNAL returned when loading old bank files + containing transition timeline automation of instrument volumes. +* Studio API - Fixed bug where very short instruments would not play when cross fading. +* Studio API - Made changes to the logic in Studio::EventDescription::isOneShot so that + it consistently returns true for events which are guaranteed to + finish without intervention, and false for events which may play + indefinitely. +* Core API - Fixed ChannelControl::setMixLevelsInput not working and updated docs. +* Core API - Fixed Channel::setLoopCount not working with very small streams. +* Core API - Stricter error checking when loading IMA ADPCM wav files to + prevent a potential crash from malformed data. +* Core API - Fixed potential crash in ChannelGroup operations when a Channel + failed to play on it with FMOD_ERR_SUBSOUNDS. +* Core API - Fixed Convolution reverb panning a mono IR with a stereo input + incorrectly. +* Core API - Fixed race conditions when setting FMOD_DSP_SEND_RETURNID. +* Core API - Fixed a crash with some MOD/S3M/XM/IT files. Introduced in 1.09.00. +* Core API - System::setDSPBufferSize will round the requested buffer size up + to the closest multiple of 4 to prevent a crash when sending + metering data to studio. +* Core API - PS4 - Fixed GPU compute compatibility issue with SDK 4.508.001. + GPU compute is now re-enabled. +* Core API - Switch - Reduced thread priority to avoid conflict with Profiler. +* Core API - Windows - Fixed ASIO output mode failing to initialize if the + devices requires a buffer size of 2048 samples. +* Unity - Fixed bank directory path separators when developing across OSX & Win. +* Unity - Fixed simulated Android devices producing no sound. +* Unity - BankLoadException now display error message correctly. +* Unity - Fixed bank loading and unloading refcount accuracy. +* Unity - Fixed Mac editor attempting to load Linux plugins when building + for Linux platform. +* Unity - Improved detection of 3D Event Instances that haven't had their + position set yet. +* UE4 - Fixed integration working with UE4's IWYU non-monolithic header + system, for now the integration is still using the old PCH system. +* UE4 - Added new native AnimNotify class, old one didn't work on code projects. +* UE4 - Sequencer integration. FMOD events can be started and stopped + and event parameters can be controlled by adding custom tracks + to sequencer. +* UE4 - Fixed max vorbis codecs not being set correctly. +* UE4 - Fixed file readers being accessed from multiple threads. + +Notes: +* UE4 - Added support for UE4.16. + +Notes: +* Updated Google VR plugin to version 0.4.0, please note there is a known crash + when loading the plugin on Windows XP, Google are aware and investigating. + +10/04/17 1.09.04 - Studio API minor release (build 86084) +------------------------------------------------------------------------------------------ + +Fixes: +* Studio API - Fixed delayed playback on streaming sounds in events (introduced + in 1.09.03). +* Studio API - Fixed AHDSR release not working on single sounds shorter than + 100 milliseconds. +* Studio API - Fixed Studio::EventDescription::is3D returning true for events that only + have 2D panners. +* Studio API - Set programmer sounds to FMOD_LOOP_NORMAL internally if they were + not created that way. +* Studio API - Fixed regression introduced in 1.09.00 which allowed events to + play at the origin before 3d attributes were updated. +* Studio API - Fixed issue where reverb tail would cut off when all events on + a bus finished playing. +* Core API - Fixed FMOD_DSP_TRANSCEIVER making channels audible that weren't + supposed to be (introduced with glitch fix in 1.09.03). +* Core API - Fixed loop clicks on PCM sounds if using FMOD_DSP_RESAMPLER_CUBIC + or FMOD_DSP_RESAMPLER_SPLINE. +* Core API - Fixed FMOD_ADVANCEDSETTINGS::resamplerMethod being ignored. +* Core API - Fixed plugin unloading for multi-description libraries potentially + failing depending on how it's unloaded. +* Core API - Fixed stream glitch when going virtual then resuming. +* Core API - Fixed virtual voices losing their loop/2d/3d status, and not + staying virtual if ChannelControl::setMode was used. Introduced in 1.09.00. +* Core API - Fixed FMOD_UNIQUE not being accepted if ChannelControl::setMode or + Sound::setMode was used. (it could be successfully used via + createSound/createStream). +* Core API - Fixed rare crash in mixer, introduced 1.09.00. +* Core API - Switch - Fixed FMOD_SWITCH_THREADAFFINITY so cores can be ORd together + to form a mask. +* Core API - PS4 - GPU compute disabled due to an incompatibility with SDK 4.508.001. +* Core API - Windows/Mac - Re-enable SRS downmixer 80Hz high pass filter by + default. Add FMOD_INIT_DISABLE_SRS_HIGHPASSFILTER init flag to + disable it. +* FSBank API - Fixed PS Vita AT9 encoder not working with currently available + Sony library. +* FSBank API - Fixed full scale 32bit float wav files encoding incorrectly. + +Notes: +* Studio API - FMOD expects programmer sounds to be created with FMOD_LOOP_NORMAL. + This is now specified in the FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES + documentation. +* FSBank API - Building an FSB with PS Vita AT9 encoding now requires 64bit. +* PS4 - Now built with SDK 4.508.001. +* Switch - Now built with SDK 0.12.17. +* XboxOne - Now built with October 2016 QFE 2 XDK. + +20/03/17 1.09.03 - Studio API minor release (build 85359) +------------------------------------------------------------------------------------------ + +Features: +* Core API - Updated the /examples/dsp_custom example to include a lot more + functionality including parameters, and capture of wave data. +* Core API - Add fmod_reduced.js for reduced functionality, but also reduced size. +* Core API - Switch - Added support for setting thread affinity. +* Studio API - Reduced size of fmodstudio.js and .mem files. + +Fixes: +* Studio API - Fixed event doppler settings not being applied to sounds spawned + by scatterer. +* Studio API - Fixed bus and VCA handles not being set up properly in + Studio::Bank::getBusList and Studio::Bank::getVCAList. +* Studio API - Fixed crashes caused by stopping events that are routed into a + bus with instance limiting enabled when they are in the + FMOD_STUDIO_PLAYBACK_STARTING state. +* Studio API - Fixed tempo and marker event callbacks not being fired when the + timeline cursor is in the lead-in or lead-out region of a + transition timeline. +* Core API - Fixed glitches with Transceiver DSP after inputs go idle. +* Core API - Fix Channel::setPosition(pos, FMOD_TIMEUNIT_MODORDER) not + working when playing paused. +* Core API - Fixed short streams created as non-looping then switched to + looping via the Channel API not looping seamlessly. +* Core API - Fixed DSP plugin version >= 109 data parameters other than 3D + attributes not applying if FMOD_INIT_3D_RIGHTHANDED is used. +* Core API - Fixed rare crash in FMOD Panner DSP. Introduced in 1.09.00. +* Core API - Re-Fix MOD/S3M/XM/IT file crash with samples that have 0 length, + for 1.09 only. +* Core API - Fixed potential memory leak if System::init returned an error. +* Core API - Fix FMOD_ACCURATETIME not looping a mod file properly, and not + seeking correctly with FMOD_TIMEUNIT_MODORDER. +* Core API - HTML5 - Loading FSB sounds did not work properly. +* Core API - Windows - Fixed 5.1->stereo SRS downmix causing lack of bass. +* Core API - Windows - Fix FMOD_INIT_PREFER_DOLBY_DOWNMIX not working. +* FSBank API - Fix crash if FSBANK_INIT_GENERATEPROGRESSITEMS is not used. +* Unity - Removed error when plugin field is added but empty. +* UE4 - Removed error when plugin field is added but empty. + +Notes: +* UE4 - Added support for UE4.15. + +15/02/17 1.09.02 - Studio API minor release (build 84334) +---------------------------------------------------- + +Fixes: +* Unity - Remove ifdef from EnforceLibraryOrder as it isn't harmful for static lib platforms to call GetStats. +* UE4 - Occlusion can now use Multiband EQ instead of Lowpass filter. +* Core API - Fix crash when connecting to FMOD Profiler.exe and there is a circular connection +* Core API - Fix glitches with Transceiver DSP after inputs go idle. +* Core API - Fix Channel::setPosition(pos, FMOD_TIMEUNIT_MODORDER) not working when playing paused. + +09/02/17 1.09.01 - Studio API minor release (build 84153) +---------------------------------------------------- + +Features: +* Core API - Added FMOD_DSP_STATE_FUNCTIONS::getlistenerattributes to the + DSP plugin API to query the current listener attributes. +* Unity - Added support for Rigidbody2D in 3D attribute settings and + integration scripts. +* Unity - Added support for Object Enable/Disable on EventEmitter and + ParameterTrigger scripts. +* UE4 - Added GetLength function for blueprints that returns the event length + in milliseconds. +* UE4 - Improved in editor profiling stats. + +Fixes: +* Unity - Fixed compatibility with Unity 4.6 & 4.7 for OSX and IOS. +* Unity - Fixed "file not found" error when settings asset is corrupt +* Unity - Fixed set3DAttributes ambiguity. +* Unity - Fixed not being able to copy ReadOnly banks into StreamingAssets. +* Unity - Fixed event instance leak in Unity PlayOneshotAttached not releasing. +* Unity - Specified version to check for WiiU BuildTarget for early Unity5. +* UE4 - Fixed XboxOne delayload error now that UE4 handles it. +* UE4 - Android - Added ARM64 support. +* Studio API - AHDSR modulator curve shapes now work correctly. In previous versions + the envelope was interpolated linearly regardless of the shape displayed + in the UI. +* Studio API - Fixed looping single sounds in an async multi sound being cut-off when + the multi sound is un-triggered. +* Core API - Fixed ChannelControl::setReverbProperties not resetting reverb connection + to a new tail DSP when turning wet mix off and on. +* Core API - If the system is initialized in right-handed mode, FMOD will now swap + to left-handed when passing attributes into plugins. This only applies + to plugins rebuilt against this version, old plugins remain unswapped. +* Core API - Fix MOD/S3M/XM/IT file crash with samples that have 0 length. +* Core API - Fixed some potential crashes when running out of memory, these will + correctly return FMOD_ERR_MEMORY now. +* Core API - Win - Fixed WASAPI recording device enumeration taking a couple of seconds + after System::init before being correct. +* Core API - Win - Fixed potential error returned from System::update if device is unplugged. +* Core API - MIDI - Fixed Sound::set/getMusicChannelVolume referring to wrong track + indices rather than just a normal 0-15 track index. +* Core API - MIDI - Fixed Channel::setPosition causing loud drum bang noise after seek + +Notes: +* Studio API - When loading legacy banks with looping sounds nested in multi sounds, + the multi sound is set to cut-off all sounds when untriggered, including + non-looping sounds. This is a change in behaviour compared to earlier + versions where only looping sounds were cut-off. +* Core API - DSP plugin API version has been increased, for maximum compatibility + plugin writers should only rebuild against this version if they need + the getlistenerattributes feature. Old plugins are still supported. +* Switch - Now built with SDK 0.12.10 + +01/12/16 1.09.00 - Studio API major release (build 82164) +---------------------------------------------------- + +Important: +* Added support for the Nintendo Switch platform. + +Features: +* Studio API - Added support for multiple listener weights, with + Studio::System::setListenerWeight and + Studio::System::getListenerWeight. This allows listeners to be + faded in or out smoothly. +* Studio API - Profiling uses less CPU and memory. +* Studio API - Added FMOD_STUDIO_INIT_LOAD_FROM_UPDATE to drive all loading from + Studio::System::update rather than the bank and resource loading + threads. Mainly used in non-realtime situations. +* Studio API - Added ability to run replays at faster than real time speed using + FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD. +* Studio API - Added Studio::EventInstance::setReverbLevel and + Studio::EventInstance::getReverbLevel. +* Studio API - Support for automation of modulator properties. +* Core API - Improved memory use when loading sounds with names. +* Core API - Added new efficient multiband equalizer (FMOD_DSP_TYPE_MULTIBAND_EQ) + featuring 5 toggleable bands with variable rolloff low/high pass, shelf, + peaking, band-pass, all-pass and notch modes. +* Core API - Added logging function to the DSP plugin API. Use FMOD_DSP_LOG + helper macro from a DSP callback. +* Core API - Added FMOD_DSP_STATE_FUNCTIONS::getuserdata to the DSP plugin API. + Use FMOD_DSP_GETUSERDATA helper macro from a DSP callback. +* FSBank API - Added ability to pass NULL as the FSB file name for FSBank_Build causing + the FSB to be built in memory. Use FSBank_FetchFSBMemory to get access + to the data once the build has completed. + +Fixes: +* Studio API - Fixed incorrect playback volume for instruments and playlist + items whose volume property is set to a non-zero dB value. + +Notes: +* Core API - Incremented Plugin SDK version for DSP plugins. Dynamic library + plugins built with earlier versions will continue to load. +* Core API - Incremented FMOD_CODEC_WAVEFORMAT version. Codecs that provide + names must keep the name memory persistent for the lifetime + of the codec. +* Core API - Increment Plugin API version for Output plugins. Dynamic library + Output Plugins must be rebuilt. +* Core API - FMOD_DSP_TYPE_LOWPASS, FMOD_DSP_TYPE_LOWPASS_SIMPLE, + FMOD_DSP_TYPE_HIGHPASS, FMOD_DSP_TYPE_HIGHPASS_SIMPLE and + FMOD_DSP_TYPE_PARAMEQ are considered deprecated and will be removed + in the future. Use the new FMOD_DSP_TYPE_MULTIBAND_EQ instead which + has the performance of "simple" effects with full featured quality. +* Core API - Changed reverb wet mix to send from the fader DSP of a ChannelGroup. + Previously it sent from the head DSP. Now effects placed pre-fader + will apply to the signal sent to the reverb, while effects placed + post-fader will not. +* Core API - ChannelGroup reverb wet level is now scaled by the group's + effective audibility. +* Core API - ChannelGroup reverb no longer automatically disables reverb + on its child channels when the wet level is set to non-zero. +* Core API - Channel::setReverbProperties now allows setting the wet level + before the specified reverb instance has been created. +* Core API - ChannelControl::addDSP and ChannelControl::removeDSP manage + standard DSP connections (FMOD_DSPCONNECTION_TYPE_STANDARD) + to maintain the mixer hierarchy. + Other connection types (FMOD_DSPCONNECTION_TYPE_SIDECHAIN, + FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN, and now + FMOD_DSPCONNECTION_TYPE_SEND) are left undisturbed. +* Core API - FMOD_INIT_MIX_FROM_UPDATE will now directly execute the mixer from + System::update instead of triggering the mix to happen in another + thread. +* Studio API - Incremented bank version, requires runtime 1.09.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Studio API - Studio::Bus::setFaderLevel, Studio::Bus::getFaderLevel, + Studio::VCA::setFaderLevel and Studio::VCA::getFaderLevel is now + called Studio::Bus::setVolume, Studio::Bus::getVolume, + Studio::VCA::setVolume and Studio::VCA::getVolume. +* Studio API - Studio::EventInstance::getVolume, + Studio::EventInstance::getPitch, + Studio::EventInstance::getParameterValue, + Studio::EventInstance::getParameterValueByIndex, + Studio::Bus::getVolume, + Studio::VCA::getVolume now have an additional argument + to get the final value which includes automation and modulation. +* Studio API - The required alignment for Studio::System::loadBankMemory has + been added as the constant FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT. +* Studio API - Event instances now disable reverb on their internal channels, + for all global reverb instances. Previously only did so for + reverb instance 0. Use Studio::EventInstance::setReverbLevel + to control the reverb mix for the whole event instance. +* Studio API - Disconnected sidechain modulators are now inactive. Previous + behavior was to fall back to monitoring the event's master + track output. +* Core API - FMOD_DSP_RELEASE_CALLBACK is now called from the main thread +* Core API - Unimplemented ChannelControl::overridePanDSP function has been + removed, along with FMOD_CHANNELCONTROL_DSP_PANNER enum value. +* Core API - PS3 - Removed old opt-in FIOS support via FMOD_PS3_EXTRADRIVERDATA. + New recommended approach is to use FMOD_FILE_ASYNCREAD_CALLBACK + and set appropriate deadlines based on FMOD_ASYNCREADINFO::priority. +* Core API - XboxOne - Optimized XMA decoding performance and removed the ACP thread. +* Core API - PS4 - Improved AT9 decoding performance. +* FSBank API - Added support for source data as a memory pointer instead of file name. +* Documentation - Some FMOD_DSP_PAN_SURROUND enums changed to FMOD_DSP_PAN_2D for clarity. + +01/12/16 1.08.15 - Studio API minor release (build 82163) +---------------------------------------------------- + +Features: +* PS4 - Add support for System::getOutputHandle, to return sce + port handle. +Fixes: +* UE4 - Fix missing plugin error when building on Mac. +* UE4 - Fixed compatibility with 4.14. +* Unity - Fixed OSX working with unified library. +* Unity - Fixed WiiU copying banks error. +* Unity - Fixed XboxOne dll meta files missing platform target. +* Unity - Fixed duplicate dll copying build error on some platforms. +* Unity - Added null check to stop error being thrown when no event assigned. +* Unity - Fix in editor out of bounds exception in RuntimeManager. +* Core API - Allow DSP::setParameterData with null data and 0 length to free + convolution reverb impulse response data. +* Core API - Fixed short looping streams playing some of the start when + switched to non-looping via the Channel API. +* Core API - Fixed FMOD_CREATESOUNDEXINFO::pcmsetposcallback getting wrong sound + pointer passed to it with a stream. +* Studio API - Fixed incorrect parameter values being passed to nested events + when value "hold" is being used. +* Studio API - PS3 - Fix potential crash with the new Channel Mix effect. +* FSBank API - Fixed encoder bug with FADPCM causing occasional clipping at playback. + +Notes: +* FSBank API - FSBs / Banks may not be binary identical to previous release due to + FADPCM encoder bug fix, however full compatibility is maintained. + +20/10/16 1.08.14 - Studio API minor release (build 80900) +---------------------------------------------------- + +Fixes: +* UE4 - Fix for crash when using "Validate FMOD" menu item + +Notes: +* PS4 - Now built with SDK 4.00 +* XboxOne - Added better logging and documentation to describe an incorrectly + configured appxmanifest regarding microphone recording. + +04/10/16 1.08.13 - Studio API minor release (build 80479) +---------------------------------------------------- + +Fixes: +* Studio API - Fixed potential crash after the following sequence of actions: + load master bank, try to load master bank again and fail with + FMOD_ERR_EVENT_ALREADY_LOADED, unload master bank, reload + master bank. +* Core API - Fix circular DSP connection causing hang in certain situations. +* Unity 2 - Fix issues with multi-object editing of emitters. + +22/09/16 1.08.12 - Studio API minor release (build 80229) +---------------------------------------------------- + +Features: +* Unity 2 - Added ability to override minimum and maximum distance for + Event emitters. +* Unity 2 - Added support for multiple listeners. +* Studio API - Added support for auto pitch at minimum. +* Studio API - Added support for the global master bus being duplicated across + banks. + +Fixes: +* Studio API - Fix auto pitch cutting off at zero for parameter with minimum + value that is less than zero. +* Studio API - Fix events with a transciever effect not allowing the event to stop +* Android - Fixed crash when loading FSBs or Banks that contain a sound that + isn't mono, stereo, 5.1 or 7.1. +* Android - Fixed compatibility issue with some devices introduced in previous + release due to r12b update. Presents as a runtime linker error + when loading the FMOD library, failing to locate __aeabi_atexit. +* iOS - Fixed stuttering during fade out when device screen goes to sleep. +* Core API - Fix FMOD_DSP_TRANSCEIVER memory stomp. +* Core API - Fix channels playing at incorrect pitch. Introduced in 1.08.10. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.08.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Core API - Improved validation for ChannelGroup, DSP and Sound handles, + detects invalid pointers and usage after release. + +08/09/16 1.08.11 - Studio API minor release (build 79819) +---------------------------------------------------- + +Features: +* Core API - PS3 - Added support for FMOD_DSP_CHANNELMIX. +* Unity 2 - Respect Game View mute button. + +Fixes: +* FSBank - Fix crash on 64-bit when encoding 16kHz or 24kHz sources using + Vorbis at low quality settings. +* Core API - Fix FMOD_SOUND_PCMSETPOS_CALLBACK getting invalid position value + when a sound opened with FMOD_OPENUSER loops. +* Core API - Android - Fixed crash on load with old devices when using armeabi. +* Unity 2 - Fix CREATESOUNDEXINFO not getting marshalled properly. + +Notes: +* Android - Now built with NDK r12b. +* Android - Minimum Android version is now API level 9 due to NDK r12b + deprecating older versions. + +22/08/16 1.08.10 - Studio API minor release (build 79252) +---------------------------------------------------- + +Features: +* Studio API - Improved performance of sidechain modulator. +* Core API - Improved ChannelControl::setPitch accuracy between DSP clock and + the underlying codec decoding speed. +* Unity 2 - Added option for play-in-editor to reflect the active build target + for loading banks. + +Fixes: +* Core API - Fixed error trying to create a Return DSP when the system + format is set to FMOD_SPEAKERMODE_RAW. +* Core API - Fixed FFT DSP crash if window size is smaller than DSP block size. +* Core API - Removed spurious warning messages when loading plugins on + some platforms. +* Core API - Android - Tweaked OpenSL auto detection, now requires device to + specify low latency and a block size <= 1024. +* Unity 2 - Fix bank import issues when the strings bank contains bank + names that differ in case from the files on disk. +* Unity 2 - Bank import now has a longer timeout after last detected file + activity before starting import. +* Unity 2 - Fixed settings screen allowing real channels to be set higher + then 256. +* Unity 2 - Fix up errors when StudioEventEmitter is created dynamically. +* Unity 2 - Small fixes for the settings screen when overriding the parent + platform settings. +* UE4 - Fix for crash when previewing animations using the FMOD event + notifier. + +Notes: +* Core API - System::getSpeakerModeChannels returns the system channel + count when passed FMOD_SPEAKERMODE_DEFAULT. Now works even + if the system format is set to FMOD_SPEAKERMODE_RAW. +* UE4 - Can be recompiled with 4.13 pre-release. +* Documentation - Added documentation for FMOD_DSP_PAN enums. + +01/08/16 1.08.09 - Studio API minor release (build 78489) +---------------------------------------------------- + +Features: +* Core API - PS4 - Add support for social screen audio to the ports API. +* Studio API - Added Studio::EventInstance:setListenerMask and + Studio::EventInstance::getListenerMask, that adds the ability + to specify which listeners apply to each event instance. +* Unity 2 - Warning is now produced when playing in editor if the position + of a 3D event is not set. +* UE4 - Added blueprint functions to set event properties. + +Fixes: +* Studio API - Fixed case of indeterminism when building banks that contain + events with automation curves. +* Core API - Fixed FMOD_OUTPUT_OBJECT3DINFO::gain so it only includes + distance attenuation not bus gain (which is now pre-applied + to FMOD_OUTPUT_OBJECT3DINFO::buffer. +* Core API - Fixed channelmix DSP volume not always being initialized. +* Core API - WiiU - Fixed potential crash during System::init if + System::setDriver or System::setOutput has been called. +* Core API - Fix hang on netstreams when the connection times out. +* Core API - Linux - Fix FPU control word of the calling thread being modified + when the FMOD dynamic library is loaded. +* Core API - Android - Fixed potential crash if FMOD isn't loaded with + System.loadLibrary, now a proper error will be issued. +* FSBank API - Fixed FADPCM not looping seamlessly for non-zero crossing loops. +* UE4 - Fixed plugin loading assuming a "lib" prefix for plugins on + Android, Mac, Linux and PS4. Now plugin loading will attempt + to load the name with and without adding a lib prefix. +* UE4 - Respect FApp::IsUnattended for message-box errors. +* UE4 - Fixed deprecation warnings about AttachTo usage. +* Unity 2 - Fix errors when bank source files are updated while Event Browser + preview is playing or paused. +* Unity 2 - Fix unnecessary copying of Bank files in OSX editor. + +Notes: +* Core API - Linux - Removed limit of 32 devices with ALSA output mode. +* Core API - Incremented API version of Output plugins. Dynamic library + plugins built with earlier versions of 1.08 will continue to load. + +14/07/16 1.08.08 - Studio API minor release (build 77846) +---------------------------------------------------- + +Features: +* UE4 - bMatchHardwareSampleRate will use the system default format + to avoid excessively matching the output rate on mobile devices. +* UE4 - Added bLockAllBuses which will force all buses to be created + at startup, rather than on demand. + +Fixes: +* Studio API - Fixed looping sounds in a multi sound playlist failing to stop + if the multi sound itself is non-looping. +* Studio API - Fixed rare crash calling the following functions while the + bank containing the event is unloading: + Studio::EventInstance::getDescription, + Studio::EventInstance::getParameter, + Studio::EventInstance::getParameterValue, + Studio::EventInstance::setParameterValue, + Studio::EventInstance::setParameterValueByIndex, + Studio::EventInstance::triggerCue, + Studio::ParameterInstance::getDescription and + Studio::ParameterInstance::setValue. +* Studio API - Fixed shared events becoming invalidated when one of the + banks containing them is unloaded. Could also manifest as + Studio::EventInstance::getDescription failing with + FMOD_ERR_INTERNAL. +* Studio API - Fixed crash that could occur when using + FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE and calling + Studio::System::update from multiple threads at the same time. +* Studio API - Increased scheduling lookahead time to ensure sample accurate + timeline scheduling even if there is an output stall. +* Studio API - Fixed crash that could occur when improperly calling + Studio::Bus::getChannelGroup without first calling + Studio::Bus::lockChannelGroup, if the bus was being destroyed + as the call was made. +* Studio API - Fixed rare crash calling the following functions while the + master bank containing the bus or VCA is unloading: + Studio::System::getBus, + Studio::System::getBusByID, + Studio::System::getVCA and + Studio::System::getVCAByID. +* Studio API - Fixed rare timing issue where Studio::System::getEvent would + succeed but Studio::EventDescription::createInstance would + fail with FMOD_ERR_INTERNAL, if called just as the bank + containing the event finished loading. +* Studio API - Fixed rare hang in Studio::System::getBankCount when called + while banks are currently unloading. +* Core API - Fixed rare glitch at the start of XMA playback causing non-seamless + looping. +* Core API - Fixed rare hang on shutdown when using multiple systems. +* Core API - Fix streams with an unknown file length remaining in the playing state + after an end of file is encountered. +* Core API - Windows - Enumeration of record devices will now reflect a change + of default device with WASAPI output. +* Core API - Linux - Enumeration will now correctly display GUIDs and speaker + modes for ALSA output. +* Core API - Linux - Fixed potential crash if both PulseAudio and ALSA are + missing / unavailable. +* Unity 2 - Fix plugin loading on Linux standalone builds. +* Unity 2 - Fix script compilation errors in standalone builds. +* Unity 2 - Fix Event Browser preview of events with built-in parameters. +* Unity 2 - Fix missing tvOS files. + +Notes: +* Core API - Significantly reduced memory consumption when using FMOD_DSP_FFT. +* PS4 - Now built with SDK 3.508.101 +* UE4 - Updated Oculus plugin to 1.0.4. + +27/06/16 1.08.07 - Studio API minor release (build 77241) +---------------------------------------------------- + +Features: +* FSBank API - Added support for Linux. +* Unity 2 - Live Update and Debug Overlay can be set to only be enabled in + standalone builds when the development build option is set. +* Unity 2 - Add MuteAllEvents and PauseAllEvents functions to the RuntimeManager. +* Unity 2 - Audio will now pause when the application pauses. +* UE4 - Added MixerSuspend and MixerResume blueprint functions. +* UE4 - Added IsBankLoaded blueprint function. + +Fixes: +* Studio API - Fixed Studio command buffer assert and crash that could occur + when using FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE in conjunction + with multiple threads. +* Core API - Fix crash when closing a system with a multi-plugin DLL still loaded. +* Core API - iOS / Android - Improved audio stability when mixer thread is overloaded. +* FSBank API - Fixed calling convention linker error on Windows in FSBankLib header. +* FSBank API - Fixed issue when passing duplicate source files with different encoding + settings would cause cache file conflicts. + +Notes: +* Unity 2 - Renamed "Level Start" and "Level End" triggers to "Object Start" and + "Object Destroy" to more accurately reflect when the triggers occur. + +17/06/16 1.08.06 - Studio API minor release (build 76937) +---------------------------------------------------- + +Features: +* Unity 2 - Added framework for registering native plugins on iOS and tvOS. +* Unity 2 - Added support for importing Studio Banks as TextAssets so they + can be added to Unity AssetBundles. + +Fixes: +* Core API - Fixed crash on shutdown, after creating multiple systems and + setting a system callback. +* Core API - PS4 - Fix issues with calling FMOD_PS4_GetPadVolume() immediately + after opening the controller audio port. + +15/06/16 1.08.05 - Studio API minor release (build 76824) +---------------------------------------------------- + +Features: +* Studio API - Added Studio::EventDescription::isSnapshot. +* Unity 2 - Added "Preload Sample Data" checkbox to Event Emitter to reduce + latency when emitters are triggered for the first time. +* Unity 2 - Added script example to show how to build an asynchronous loading + screen that includes loading FMOD Banks. + +Fixes: +* Studio API - Fixed Studio::EventDescription::isOneshot() incorrectly + returning true for snapshots. +* Core API - Fix FMOD_ADVANCEDSETTINGS::maxADPCMCodecs not being applied. +* Core API - Fix crash when using CreateSound from multiple threads + (including FMOD Async loading threads). +* Unity 2 - Fix issues when bank file in the Unity project Streaming Assets + folder have a different case to the banks in the Studio project. +* Unity 2 - Fix issues when editor log file cannot be opened because it's + read only. +* Unity 2 - If the "Load All" options are selected in the FMOD Settings + then the main thread will now block until it's complete. +* UE4 - Fix for OnEventStopped callback firing repeatedly if triggers + the instance to play again. + +Notes: +* Core API - All System, ChannelControl, ChannelGroup, Channel, and DSP API + functions check for NaN and INF floats and return + FMOD_ERR_INVALID_FLOAT if detected. +* Studio API - All API functions check for NaN and INF floats and return + FMOD_ERR_INVALID_FLOAT if detected. +* Studio API - All API functions with output parameters now clear those + values in the case of an error. Previously some values may + have been left uninitialized. + In the case of an error, int and float outputs are set to 0, + bool outputs are set to false, and pointers are set to NULL. + Structures are cleared to zeros, and string buffers are set + to the empty string. + +25/05/16 1.08.04 - Studio API minor release (build 76196) +---------------------------------------------------- + +Features: +* Studio API - Added runtime support for steal quietest polyphony. +* Core API - Improved performance when connecting sends and returns. +* UE4 - FFMODEventInstance can now be stored as a blueprint variable. +* UE4 - Added support for Occlusion. See the Occlusion section of the + documentation for more information. +* UE4 - Added support for Android deployment without having to modify + the engine. +* UE4 - Added InitialDriverOutputName to select output device by name + at startup, as well as new Blueprint functions GetOutputDrivers, + SetOutputDriverByName and SetOutputDriverByIndex. +* UE4 - Added VCASetFaderLevel Blueprint function. +* UE4 - "FMOD Validate" now checks for FMOD in the packaging setting, + and can add it if needed. + +Fixes: +* Core API - Fixed unnecessary DSP queue flush when using ports. +* Core API - Fixed ADPCM and FADPCM compressed FSBs not returning + FMOD_ERR_MEMORY_CANTPOINT when loaded as FMOD_OPENMEMORY_POINT + FMOD_CREATESAMPLE. +* Core API - Fix pops when channels with a mix matrix that are started virtual + become real. +* Core API - Fixed DSP panner reset not clearing ramps, causing ramping when + setting initial parameters. +* Core API - Fixed Sound::getSyncPointInfo returning first sync point info + when loading sounds from FSBs with multiple sync points. +* Studio API - Fixed memory stomp that can occur when sharing events between + multiple banks, if a streaming sound is in the middle of loading + when one of the shared banks is unloaded. +* Unity 2 - Fix error messages when previewing an event contained in the + Master Bank. +* Unity 2 - Fix WinPhone 8.1 DLL's conflicting with UWP builds. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.08.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* UE4 - Updated ovrfmod to version 1.0.3. +* UE4 - Tested with 4.12 pre-release, compiles successfully. +* PS Vita - Now built with SDK 3.570.011. + +05/05/16 1.08.03 - Studio API minor release (build 75571) +---------------------------------------------------- + +Features: +* Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED and + FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED for when an event + plays sounds. Sound names will only be available if + banks have been re-exported in FMOD Studio 1.08.03 or later. + See the music_callbacks example for demonstration. +* Studio API - Added runtime support for the event cooldown property + set from FMOD Studio. Events that fail to start due to + cooldown time will invoke the + FMOD_STUDIO_EVENT_CALLBACK_START_FAILED callback. +* Core API - Improved performance of logging. +* Core API - PS4 - Improved performance when profiling is enabled. + +Fixes: +* Studio API - Events that fail to start due to bus polyphony now invoke the + FMOD_STUDIO_EVENT_CALLBACK_START_FAILED callback. +* Studio API - Fixed crash when calling Studio::System::unloadAll with + crossfading nested events. +* Studio API - Fixed unnecessary up/down mix applied to 2D events that have + sidechain modulators. +* Studio API - Fixed mixing issues and degraded performance if the system + speaker mode does not match the Studio project format. +* Studio API - Fixed case of stereo sounds panning hard right when downmixed + to a mono track and later upmixed again, introduced in 1.07.04. +* Core API - Fixed potential incorrect position when voice comes back from + being virtual, which can cause a hang on XboxOne. +* Core API - Improved handling for out of memory errors when mixing DSP + buffers. +* Core API - Fixed incorrect propagation of FMOD_DSP_STATE::channelmask + when mixing signals with differing masks. +* Core API - Fixed http streams (file from http, not shoutcast/icecast) + returning FMOD_ERR_FORMAT. Introduced 1.08.01 +* Core API - Fixed m3u playlist file format support. Was returning + FMOD_ERR_FORMAT. +* Core API - Android - Improved detection of low-latency devices allowing better + automatic output mode selection and less stuttering. +* Core API - Sound::getName will now return "" for sounds without names, + instead of "(null)". +* Core API - Object 3D Panning fix for silent objects in certain speaker modes +* Studio API - More robust live update handshaking when attempting to connect + with multiple copies of FMOD Studio at once. +* Unity 2 - Added missing Studio::EventDescription::getSoundSize function. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.08.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Studio API - Sound names are now loaded into memory if they have been + exported in the bank file. The option is on by default, + which means by the runtime memory use might be slightly higher + when loading banks exported from 1.08.03 and later. If this is + a problem, make sure to disable the option to export sound names + in FMOD Studio when re-exporting banks. +* XboxOne - Now built with March 2016 QFE 1 XDK. +* PS4 - Now built with SDK 3.508.031. + +13/04/16 1.08.02 - Studio API minor release (build 74770) +---------------------------------------------------- + +Fixes: +* UE4 - Fixed audio component transform not being updated in 4.11. +* Studio API - Fixed unnecessary up/down mix applied to 2D events that have + sidechain modulators. +* Studio API - Studio::EventDescription::is3D now returns true if there is a + plug-in panner on the master track. + +Notes: +* UE4 - PS4 - Deployment uses standard unreal plugin system. +* UE4 - Now built against Unreal 4.11 + +07/04/16 1.08.01 - Studio API minor release (build 74554) +---------------------------------------------------- + +Features: +* Unity 2 - Added Universal Windows Application platform support. +* Unity 2 - Added Find and Replace tool. +* Core API - Improved performance when creating DSPs. +* UE4 - Added FMOD stats for CPU usage. + +Fixes: +* Studio API - Fixed errors being generated when the initial seek is past + the loop end point of a sound. +* Studio API - Fixed error loading sample data for banks + loaded by Studio::System::loadBankMemory with + FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES flag. +* Studio API - Fixed rare Studio update error FMOD_ERR_NOTREADY when stopping + modules with streaming sounds. +* Studio API - Fixed unnecessary up/down mix on sidechain effects in game. +* Studio API - Eliminated API stalls due to holding a lock when creating + event instances on the Studio Update thread. +* Studio API - Fixed error when loading an API capture that contains + Studio::System::flushSampleLoading commands. +* Studio API - PS4 - Fixed incorrect linking options on fmodstudio.prx that + caused package creation to fail. +* Core API - Fixed rare hang when rapidly creating and releasing Return DSPs. +* Core API - Fixed hang or crash when loading a .it/s3m/mod/mid file as a + decompressed sound. +* Core API - Fixed some shoutcast streams playing back garbled. +* Core API - Fixed Sound::readData returning 0 for bytes read, instead of a + valid number if FMOD_ERR_FILE_EOF was returned. + Introduced in 1.07.08. +* Core API - PS4 - Fix AT9 playback when a sound created as looping is + played with the channel loop-count explicitly set to zero + before starting. +* Core API - Win - Fixed ASIO device enumeration not supplying a GUID. +* Core API - Win - Fixed ASIO device enumeration having a blank name if the + device is not connected. +* UE4 - Added lock around file accesses to avoid Unreal pak file thread + safety issue. +* UE4 - Fixed logging callback not being initialized. +* UE4 - Avoid asset table system from mixing while normal mixer is in + operation, to work around an AT9 mixer issue. +* UE4 - Fixed always linking against ovrfmod even if it isn't present. +* Unity 2 - Rewrote Timeline Callback and Programmer Sound Callback examples + to work on iOS. +* Unity 2 - Fix marshalling of FMOD.CREATESOUNDEXINFO structure on iOS. +* Unity 2 - Fix DLL not found errors in standalone Windows builds. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.08.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Studio API - Studio::EventInstance::setPitch() now returns an error if a NaN + is passed in. +* Studio API - Errors that occur during the Studio update thread will no longer + stop the thread. +* Studio API - Studio will set the master channel group format to the + project's format to avoid an extra upmix. + +04/03/16 1.08.00 - Studio API major release (build 73609) +---------------------------------------------------- + +Features: +* Studio API - Sample data loading has been optimised. Load time, file access, + and memory use have all been substantially improved. A new entry + has been added to the per platform thread affinity settings. +* Studio API - FMOD_STUDIO_PARAMETER_DESCRIPTION now has the parameter index and + default value. +* Studio API - Added Studio::System::flushSampleLoading. +* Studio API - Support for left edge trimming of timelocked sounds. +* Studio API - Support for Start Offset as a percentage of sound length. +* Studio API - Added idle resource pool to keep recently used sounds in memory in + case they might be re-used. It can be controlled by the + idleResourcePoolSize field in FMOD_STUDIO_ADVANCEDSETTINGS. See + the Studio Banks Programmer Topic for more information. +* Core API - Increased performance of System::createSound and System::createStream, + since they no longer block against System::update. +* Core API - Added filebuffersize to FMOD_CREATESOUNDEXINFO for customizable + file buffering. +* Core API - Added System::getFileUsage to query file loading information. +* Core API - Custom DSP effects now always receive a buffer length that is equal + to the mix block size. The input and output buffers will always be + 16-byte aligned. Custom DSP sounds still have be able to generate + signal less than a mix block. +* Core API - Added getclock callback to FMOD_DSP_STATE_SYSTEMCALLBACKS to get the + clock, offset and length for a custom DSP. +* Core API - Added support for multiple plugins within one plugin file. See + FMOD_PLUGINLIST, System::getNumNestedPlugins, System::getNestedPlugin, + and the DSP Plugin API Programmer Topic for more information. +* Core API - Added support for object based panning with two backend providers, Dolby + Atmos (FMOD_OUTPUTTYPE_ATMOS) and Playstation VR (FMOD_OUTPUTTYPE_AUDIO3D). +* Core API - Added 3D object panner DSP (FMOD_DSP_TYPE_OBJECTPAN) to be used + with new object pan enabled outputs. +* Core API - Extended output mode plugin API (FMOD_OUTPUT_DESCRIPTION) to allow custom + object panner backends. +* Core API - Win - Reduced WASAPI latency by 40ms and improved mixer thread regularity. +* FSBank - AT9 Band Extension is now enabled by default for supported bit-rates. +* FSBank - Added Mac versions of the FSBank tool and FSBankLib API. Included + in the Mac and iOS API packages. +* Profiler - Added Mac version of the Profiler tool. Included in the Mac and + iOS API packages. +* Unity 2 - Added ability to create new studio events from within the Unity editor. +* Unity 2 - Improved event selection UI on emitter component and when using EventRef attribute. +* Unity 2 - Added support for default parameter values in emitter component. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.08.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Studio API - New example 'object_pan' that demonstrates object based panning. +* Studio API - Studio::EventDescription::getSampleLoadingState and + Bank::getSampleLoadingState now return FMOD_STUDIO_LOADING_STATE_ERROR + if sample data failed to load (e.g. due to a corrupt file). +* Studio API - Removed Studio::CueInstance, Studio::EventInstance::getCue, + Studio::EventInstance::getCueCount and + Studio::EventInstance::getCueByIndex. Instead use new functions + Studio::EventDescription::hasCue and Studio::EventInstance::triggerCue. +* Studio API - Deprecated Studio::EventInstance::getParameter and + Studio::EventInstance::getParameterByIndex. Instead use + Studio::EventInstance::getParameterValue, + Studio::EventInstance::setParameterValue, + Studio::EventInstance::getParameterValueByIndex, and + Studio::EventInstance::setParameterValueByIndex. +* Studio API - Increased stack size for Studio threads to 64K. +* Studio API - Played events will stay in the FMOD_STUDIO_PLAYBACK_STARTING state until + their sample data has loaded. This avoids selected sounds in the event + playing late if the sample data has not been preloaded. +* Core API - System::getChannelsPlaying now returns the number of real and + total channels playing. System::getChannelsReal has been + removed. +* FSBank - AT9 compression now requires AT9 library 1.7.1 (DLL version 2.8.0.5) + or later. Compression in 32bit versions of FSBank is no longer supported + in line with Sony's removal of 32bit compression libraries. + +03/03/16 1.07.08 - Studio API patch release (build 73591) +---------------------------------------------------- + +Features: +* Unity 2 - Importing banks has been speed up dramatically. + +Fixes: +* Studio API - Fixed Studio::EventInstance::setProperty not restoring the default + setting for FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE and + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE when a value of -1 + is specified. +* Studio API - Fixed case of mono sounds panning hard left when both mono and + stereo 2D sounds are placed on the same event track, introduced + in 1.07.04. +* Core API - Fixed some net streams returning 'invalid parameter' introduced + in 1.07.06. +* Core API - Fixed potential crash if calling Sound::release soon after + System::createSound with FMOD_NONBLOCKING and async IO callbacks. +* Core API - Winstore/UWP - Fixed small memory leak on system shutdown. +* Core API - Winstore/UWP - Fixed occasional crash when closing a socket with a + pending asynchronous read. +* Core API - Xbox One - Fixed potential hang waiting on XMA Sound::release if + using async IO callbacks and a cancel was issued. +* Core API - Android - Relaxed overly strict validation of M4A files introduced + in 1.07.07. +* Core API - Android - Fixed potential JNI_OnLoad failure introduced in 1.07.07. +* Core API - Fix crash in convolution reverb if wet level is set to -80db + and it has no inputs. +* Core API - Fix seeking on stereo FADPCM compressed streams and samples. +* Unity 2 - Errors opening log output file are no longer fatal. + +Notes: +* Core API - Ensure FMOD_FILE_ASYNCDONE is called with FMOD_ERR_FILE_DISKEJECTED + if implementing FMOD_FILE_ASYNCCANCEL_CALLBACK to notify FMOD that + you will not be servicing the FMOD_ASYNCREADINFO::buffer. + +16/02/16 1.07.07 - Studio API patch release (build 72710) +---------------------------------------------------- + +Features: +* Core API - Win - Improved ASIO output to accept requested sample rate and + buffer size instead of using defaults. +* UE4 - FMOD Memory allocation now occurs via standard UE4 allocators. +* Unity 2 - Added AppleTV support. + +Fixes: +* Core API - Fixed System::loadPlugin not unloading the library file in the + case of an error. +* Core API - Fixed automatic format detection failing for some types when + the file size is less than 1KB. +* Core API - Fixed FMOD_CREATESOUNDEXINFO::suggestedsoundtype being ignored for + FMOD_OPENMEMORY and FMOD_OPENMEMORY_POINT. +* Core API - WinStore/UWP - Fixed occasional deadlock when removing the current + output device. +* Core API - Win - Fixed potential crash if switching output mode to ASIO after + System::init. +* Core API - Android - Fixed crash if MediaCodec processes a file that isn't an + M4A file. +* Core API - Android - Fixed Marshmallow devices being unable to load M4A files. +* Unity 2 - Remove broken inspector code for ParamRef. +* Unity 2 - Fix PS Vita. +* Unity 2 - Small event reference UI rendering fixes. +* Unity 2 - Fix unnecessary copying of files that haven't been modified. +* Unity 2 - Fix issues with copying of files that have only been partially + written by the Studio tool. +* Unity 2 - Work around IL2CPP issues introduced in Unity 5.3.2p2. +* Legacy Unity - Work around IL2CPP issues introduced in Unity 5.3.2p2. +* Unity 2 - Xbox One - Fix runtime errors when using Mono AOT compilation. + +Notes: +* Unity 2 - Unity 5.3.2p1 is not supported for iOS. +* Legacy Unity - Unity 5.3.2p1 is not supported for iOS. + +27/01/16 1.07.06 - Studio API patch release (build 71893) +---------------------------------------------------- + +Features: +* Studio API - Improved CPU and IO performance when capturing API commands + via Studio profiler. + +* Core API - Android - Lollipop devices may now select 7.1 with AudioTrack + output mode. Older devices will gracefully fall back + to stereo. +* Unity 2 - Emitter gizmos are now pickable in the scene view. +* Unity 2 - Event Browser layout changed to work in narrow windows. Note the + Event Browser windows will need to be closed and re-opened for new + minimum bounds to take effect. +* Unity 2 - Added bitcode support for iOS. +* UE4 - Added support for programmer sounds. See the new UE4 Programmer + Sound page for more information. + +Fixes: +* Core API - Fixed bug if streams start virtual, they may not come back as audible. + Introduced in 1.07.00 +* Core API - Update URL in Netstream example. +* Core API - Fixed net streams not working when server delivers shoutcast + with chunked HTTP data. +* Core API - Fixed memory leak when a network connection fails. +* Core API - Android - Devices that don't support 5.1 output will now + gracefully fallback to stereo. +* Core API - WinStore / UWP - Fixed WASAPI output so it return the correct 'no + drivers' error when none are detected. +* Core API - WinStore / UWP - Fixed WASAPI output swapped sides and rears in 7.1. +* Core API - Fix C# wrapper of ChannelGroup.addGroup missing arguments. +* Core API - Fix crash when using chorus effect on a channel group with + channel count greater than the system channel count. +* Core API - PS4 - Fix validation of thread affinity settings. +* Core API - iOS - Fixed compatibility issue introduced in 1.07.02 for old + devices running iOS 6.X. +* Unity 2 - Fixed UI when EventRef attribute is used on an array of strings. +* Unity 2 - Work around DLL loading issues on some standalone Windows builds. +* Unity 2 - Fix DLL loading issues for play-in-editor when platform is iOS. +* Unity 2 - Fix RuntimeManager being recreated during shutdown and leaking FMOD + native instances. +* Unity 2 - Fix issue when using RuntimeManager.LowLevelSystem and + RuntimeManager.StudioSystem before RuntimeManager has initialized. +* Unity 2 - Increase channels for Play-In-Editor. +* Unity 2 - Fix play-in-editor not setting the speaker mode correctly. +* Unity 2 - PS4 - Fix script compile errors. + +Notes: +* Xbox One - Now built with November 2015 XDK. +* iOS - Now built with iOS SDK 9.2 and tvOS SDK 9.1 (Xcode 7.2). +* UE4 - Updated Oculus plugin for 1.0.1. + +07/01/15 1.07.05 - Studio API patch release (build 71238) +---------------------------------------------------- + +Features: +* Unity 2 - When using the file browser in the settings editor to set + the Studio source paths the result will be set relative + to the Unity project if it is a sub-directory. +* Unity 2 - Added Parameter Trigger component. + +Fixes: +* Core API - UWP - Fixed FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED not firing + when the default output device changes. +* Core API - PS3 - Fix rare crash with reverb. +* Core API - PS3 - Fix static and audio dropouts if speaker mode is forced + to stereo (normally it is 7.1). + +Notes: +* iOS - Reduced binary size. +* Android - Added calling convention to public API to allow usage with + hard float ABI. + +11/12/15 1.07.04 - Studio API patch release (build 70728) +---------------------------------------------------- + +Features: +* Core API - Better support for sounds with channel/speaker masks, ie a 1 + channel sound specified as LFE, or a quad sound specified as LRCS + instead of 2 front 2 back for example. +* Unity 2 - Added optional debug overlay. +* Unity 2 - Added migration steps for data in custom components. +* Unity 2 - Added support for Unity 4.6. +* Unity 2 - Added support for Android split binary. +* Unity Legacy - Added support for Android split binary. + +Fixes: +* Studio API - Fixed blocking bank loads stalling for longer than necessary when + other threads are constantly issuing new Studio commands. +* Core API - Fixed corrupted playback for big endian PCM FSBs. +* Core API - Fixed crash when switching channel count of generator DSPs + during playback. +* Core API - PS3 - Fix crash reallocating buffers on flange effect. +* Core API - Xbox One - Fixed rare stall when playing XMA streams and + compressed samples at the same time. +* Core API - Fix crash if the Master Channel Group head DSP was set inactive right + after initialization. +* Core API - Fix Sound::getOpenState() moving from FMOD_OPENSTATE_PLAYING too early + on some streaming sounds. +* Core API - Fix Sound::Release() freeing memory still in use by the mixer. +* Core API - Fix convolution reverb not correctly producing tails on long impulse + responses when it has no input. +* Unity 2 - Fixed issue with plugins not being loaded correctly. +* Unity 2 - Work around DLL loading issues on some standalone Windows builds. +* Unity 2 - Fix leaking system objects leading to ERR_MEMORY. +* Unity 2 - Updated signature of DSP::setWetDryMix, DSP::getWetDryMix. + +Notes: +* Core API - FMOD_DSP_STATE::channelmask is now passed down through the dsp chain + so plugin developers can see the original signal channel format even + if a sound was upmixed. + +17/11/15 1.07.03 - Studio API patch release (build 69975) +---------------------------------------------------- + +Features: +* Core API - When using System::recordStart the provided FMOD::Sound can now be + any channel count, up/down mixing will be performed as necessary. +* Core API - Improved performance of convolution reverb effect when wet is 0 + or input goes idle. +* Core API - PS4 - Added FMOD_THREAD_CORE6 to allow access to the newly unlocked + 7th core. +* Core API - PS4 - Added FMOD_PS4_GetPadVolume() to retrieve the output volume + of the pad speaker as set by the user in the system software. +* Core API - Added FMOD_DSP_TYPE_TRANSCEIVER. Send signals from multiple sources + to a single 'channel' (out of 32 global 'channels') and receieve from + that or any channel from multiple receivers. Great for receiving + and broadcasting a submix from multiple 3d locations (amongst other + uses). +* Unity - FMOD_StudioSystem.GetEvent() can now be used with snapshot paths. +* Unity - Ignore OSX resource fork files when importing from FAT32 file systems. +* UE4 - Deployment will also copy any plugins listed in a file plugins.txt + in the FMODStudio/Binaries/Platform directory. See the Using + Plugins page for more information. +* UE4 - Console platforms set up thread affinity in FMODPlatformSystemSetup. + +Fixes: +* Studio API - Fixed snapshot applied to VCA level not working in game. +* Studio API - Fixed profiler session timing when recording a game with a non-standard + sample rate. +* Studio API - PS4 - Fix linker error in examples. +* Core API - Fixed buffer overrun when convolution reverb is set up with + mismatched input and output channels. +* Core API - Fix crash with invalid .mp3 files. +* Core API - Fix Sound::getName() not returning a valid UTF8 string when + loading a sound with ID3 tags specifying the title as a latin1 + string. +* Core API - Fix pops in flange and chorus effects. +* Core API - Fix crash when using flange effect on a channel group with + channel count greater than the system channel count. +* Core API - FLAC - Fix crash when seeking in certain flac files. +* Core API - Android - Automatic selection of OpenSL output mode will now + be stricter to reduce stuttering on devices that + incorrectly report they are low latency. +* Core API - PS4 - Fix signal not being routed back to the main output when + detaching a channel group from a port. +* Core API - Fix FMOD_ADVANCEDSETTINGS::reverb3Dinstance not working. + +Notes: +* Android - Now built with NDK r10e. +* PS Vita - Now built with SDK 3.550. +* Core API - FMOD_DSP_CHANNELGAIN_OUTPUT_DEFAULT ... FMOD_DSP_CHANNELGAIN_OUTPUT_ALLLFE + (from the FMOD_DSP_CHANNELMIX_OUTPUT enum) have been renamed to + FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT ... FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE + (ie CHANNELGAIN renamed to CHANNELMIX) to fit with the correct naming + convention. Rename required if using this effect. + +02/11/15 1.07.02 - Studio API patch release (build 69450) +---------------------------------------------------- + +Important: +* AppleTV platform support is now part of the iOS package. + +Features: +* Core API - Improved performance of System::getChannelsPlaying. +* Core API - Added System::getChannelsReal to get the number of + non-virtual playing channels. + +Fixes: +* Studio API - Fixed internal error during playback caused by inaccuracies + in quantization calculation when timeline position is greater + than 5 minutes. +* Core API - Fix mixer not running if mixer sample rate is lower than output + sample rate. +* Core API - Fix Sound::getOpenState returning FMOD_OPENSTATE_READY when a + sounded ended, when it should have returned + FMOD_OPENSTATE_PLAYING for a bit longer, which meant + Sound::release could stall. +* Core API - iOS - Fixed output being mono on some devices, minimum detected + hardware channel count is now 2 to ensure stereo. + +Notes: +* iOS - Now built with iOS SDK 9.1 and tvOS SDK 9.0 (Xcode 7.1). +* Mac - Now built with SDK 10.11 (Xcode 7.1). + +27/10/15 1.07.01 - Studio API patch release (build 69235) +---------------------------------------------------- + +Features: +* Studio API - Added support for multiple parameter conditions. +* Studio API - Added Studio::EventDescription::getSoundSize. +* UE4 - Added validation help menu option to diagnose common issues. + +Fixes: +* Studio API - Fixed auto-pitch, cutoff and looping not live updating properly. +* Core API - Fixed potential crash on ARM platforms when seeking Vorbis + compressed FSBs. +* Core API - Fix ChannelGroup::setReverbProperties from returning + FMOD_ERR_REVERB_CHANNELGROUP if a child channel had a reverb + connection previously. +* Core API - Fixed FMOD_CREATESOUNDEXINFO::suggestedsoundtype being ignored if + a custom codec of higher priority has been registered. +* Core API - Fixed System::getRecordNumDrivers incorrectly reporting 0 if + called within 1 second of application start on some platforms. +* Core API - Fixed stereo AIFF files producing static. +* Core API - Xbox One - Fixed rare crash for stereo XMA streams. +* Core API - iOS - Fixed MP3 decoding being performed by FMOD cross-platform + decoder instead of native AudioQueue. +* Core API - Fix mp3 crash seeking, introduced in 1.07.00 if using certain types + of MP3 file in FMOD_CREATECOMPRESSEDSAMPLE mode. +* Unity - Change Android to read banks straight from APK +* Unity - Will automatically append a "64" suffix to plugins if required. +* Unity - Fix OSX bundles having incorrect settings +* Unity - Fix compatibility with Unity 5.2.2 +* Unity - Fix crashes when creating a standalone OSX build. +* UE4 - Fix for audio component direction not being set into FMOD. +* UE4 - Fixed IOS deployment error "libfmod does not exist" + +Notes: +* Studio API - The FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED and + FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED callbacks now + fire from nested events, for both plugin effects and plugin + sounds. +* Studio API - For the FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES callback + argument, the 'name' field will contain just the user defined + name of the plugin sound if one has been set. Otherwise it + will be empty. You can use the 'dsp' field to determine the + plugin type. +* Studio API - Programmer sounds with no name will have an empty string for + FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES.name, previously it + was an arbitrary hex sequence. +* Core API - Plugin developers - FMOD_DSP_SYSTEM_GETSPEAKERMODE added to + FMOD_DSP_STATE_SYSTEMCALLBACKS. Plugin SDK version updated to 1.07 meaning + plugins created from this point onwards wont work with older versions of + FMOD. +* Android - Replaced all Eclipse examples with Visual Studio using NVIDIA + Nsight Tegra integration. +* PS4 - Now built with SDK 3.008.041 +* PS3 - Now built with SDK 475.001. + +05/10/15 1.07.00 - Studio API minor release (build 68517) +---------------------------------------------------- + +Important: +* Studio is now a 64-bit application. All plugin libraries must be built for + 64-bit architecture to be compatible with the 64-bit version of the tool. +* Added Universal Windows Platform (UWP) support. +* Added AppleTV platform support. Contact support@fmod.org for beta access. + +Features: +* Studio API - Support for bus polyphony. +* Studio API - Added FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE and + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE to override the + minimum and maximum panner distance for an instance. +* Studio API - Added FMOD_STUDIO_INIT_DEFERRED_CALLBACKS to defer event + callbacks to the main thread. See + Studio::EventInstance::setCallback for more information. +* Core API - Added FMOD_DSP_TYPE_CHANNELMIX effect. Allows user to control + gain levels for up to 32 input channel signals, and pipe the + output to a range of speaker formats i.e. repeating mono, + stereo, quad, 5.1, 7.1 or only LFE out. +* Core API - Improved CPU performance when using metering or profiling. +* Core API - Added support for loading multi-channel FSBs with the + FMOD_CREATECOMPRESSEDSAMPLE flag. +* Core API - Improved record driver enumeration, list is now persistent, + removed devices will remain to ensure record IDs stay valid. + See record_enumeration example for new functionality. +* Core API - Added full record device add/removal detection for Windows, + Mac, Xbox 360, Xbox One, PS3 and PS4. +* Core API - Reduced recording latency on Windows, XboxOne and PS4. +* Core API - Mac - Added support for recording from multiple microphones at + the same time. +* Core API - Win - Improved CPU performance for FSB Vorbis decoding. See + Performance Reference section of the documentation for + updated benchmark results. +* Core API - iOS - Added support for bitcode. + +Fixes: +* Studio API - Fixed the scatterer module's random distance calculation to + ensure it is within the limit set in Studio. In previous + versions the random distance may have exceeded the max limit. + This change may affect the loudness of sounds with scatterer + modules compared to 1.06.xx releases. +* Core API - Fix rare crash when releasing a streamed sound. +* Core API - Fix output plugins with GUIDs of zero stopping setDriver + working. +* Core API - PS3 - Fixed send/returns not respecting volume changes or + rarely failing with an error when setting return IDs. +* Core API - PS4 - Rewrote output to use sceAudioOutOutputs instead of + multiple sceAudioOutOutput calls on a single thread. +* Core API - Win - Fixed the audible output driver from resetting when an + unrelated device is removed or disabled. +* Core API - Xbox One - Fixed the first couple of samples of decoded XMA + being lost due to SHAPE SRC. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.07.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Studio API - Improved compatibility for plugin effects. Adding extra DSP + parameters to an effect no longer breaks bank version + compatibility. +* Studio API - Studio::Bank::getEventCount and Studio::Bank::getEventList only + return events directly added to the bank, not implicit events + that are included in the bank due to event instrument references. +* Studio API - The asynchronous command buffer for the Studio API will now + grow as necessary, avoiding stalls that could occur if it was too + small. The commandQueueSize field in FMOD_STUDIO_ADVANCEDSETTINGS + now specifies the initial size of the buffer. +* Studio API - Studio now enables FMOD_INIT_VOL0_BECOMES_VIRTUAL by default. +* Studio API - WinStore - Fixed inconsistent naming of X64 libraries. +* Core API - Increased FMOD_MAX_LISTENERS from 5 to 8. +* Core API - System::getCPUUsage update time now includes the metering and + profiling part of the update. +* Core API - Removed support for FSB Vorbis files built using FMOD Ex 4.42 or + earlier. +* Core API - PS4 - Changed default mix buffer size to 512 samples to reduce + CPU cost. Previous setting of 256 can be set using + System::setDSPBufferSize. +* Core API - PS4 - The size of each pre-allocated AT9 instance has increased + by 8kB. +* Core API - PS4 - Prebuilt static libraries are no longer provided, + only dynamic libraries. +* Core API - WinStore - Fixed inconsistent naming of X64 libraries. + +05/10/15 1.06.11 - Studio API patch release (build 68487) +---------------------------------------------------- + +Features: +* Win - Reduced dll and exe sizes. + +Fixes: +* Studio API - Fixed input buses not being released when there are no longer + any event instances routed into the bus. +* Studio API - Fixed API capture recording the initial VCA level as 0. +* Core API - Fix rare crash when changing the master channel group head DSP + when the software format and system output don't match. +* Core API - Fix Channel::AddDSP() and ChannelGroup::AddDSP() not correctly + moving a DSP if it's already a member. +* Core API - Fix for noise being produced when panning a surround input + when the system format doesn't match the panner input format. +* Unity - FMOD RNG seed set at initialization time. +* Unity - Can now properly cancel the copy step of the import process. +* Unity - Updated documentation links in menu. + +Notes: +* iOS - Now built with SDK 9.0 (Xcode 7.0). +* Mac - Now built with SDK 10.11 (Xcode 7.0). + +15/09/15 1.06.10 - Studio API patch release (build 67958) +---------------------------------------------------- + +Features: +* Core API - Add Sound::seekData support to HTTP streams. +* UE4 - Added blueprint functions for loading and unloading sample data. + +Fixes: +* Core API - Fix small reverb pop on sounds that had Channel::setPosition + called on then and were muted via a parent channelgroup. +* Core API - Fix https netstream redirects not working. +* Core API - Fix user DSP read callback firing with no data if + Channel::setPaused(false) is used after a System::playSound. +* Studio API - Fixed Trigger Delay not being applied to sounds on parameters + that trigger immediately when an event starts. + +Notes: +* Xbox One - Now built with August 2015 XDK. + +01/09/15 1.06.09 - Studio API patch release (build 67431) +---------------------------------------------------- + +Features: +* Studio API - Additional logging when banks have been exported with out of + date plugin effects. + +Fixes: +* Core API - Fix automatic device changing support if a user called + System::update from their own thread. +* Core API - Fix crash when a channel group cannot be attached to port. +* Core API - Fixed incorrect loop length being set for ADPCM files. +* Core API - Win64 - Enable automatic device changing support. +* Core API - iOS - Fixed error creating the file thread on iOS 9.0. +* Core API - Fix distance filtering not resetting its parameters properly + for channels. +* Core API - MIDI support - Fix note keyoff when evelope is in decay phase + causing note to finish early. +* Studio API - Fix crash that could occur when auditioning an event in + Studio while changing the path to waveforms. + +Notes: +* UE4 - Updated oculus rift plugin to version 0.11 + +12/08/15 1.06.08 - Studio API patch release (build 66772) +---------------------------------------------------- + +Features: +* UE4 - Added FMOD init settings. +* UE4 - Added preliminary support for 4.9 engine preview build. +* Core API - Add Channel::setPosition support to HTTP streams. + +Fixes: +* Core API - Fixed System::getDefaultMixMatrix crashing if passed + FMOD_SPEAKERMODE_RAW. Now returns FMOD_ERR_INVALID_PARAM. +* Core API - Xbox One - Fixed crash if all SHAPE contexts are consumed. +* Core API - Xbox One - Fixed XMA loops not being seamless. +* Studio API - Fixed potential crash when disconnecting from live update + while recording a profiling session. +* Studio API - WiiU - Fixed hang on shutdown when exiting game from home menu. +* Core API - Fix for inaccurate metering levels when the calculation spanned + multiple mix blocks. +* Core API - Fixed System::getRecordPosition race condition that could cause + the returned value to be out of bounds. +* Unity - Fixed missing functionality from C# wrapper for beat callbacks + and metering. +* Unity - Fix leaking native system objects in editor. +* UE4 - Fixed multiple listeners. +* FSBank - Fixed crash encoding FADPCM format in 64bit version of tool. + +Notes: +* Studio API - Reduced memory usage for instruments that do not require + up/down mix. +* Core API - Improved performance of DSP::getParameterFloat, + DSP::getParameterInt, DSP::getParameterBool and + DSP::getParameterData when 'valuestr' argument is NULL. + +22/07/15 1.06.07 - Studio API patch release (build 66161) +---------------------------------------------------- + +Fixes: +* Core API - Win - Fix audio glitches at initialization time when using + the WASAPI output mode on Windows 10. +* Core API - Fix UTF8 strings in MP3 ID3V2 tags not being null terminated + properly leading to possible string overflow crash. +* Core API - PS4 - Fixed issue with non-1024 sample aligned loop-points and AT9 + compressed samples. +* Core API - Fixed memory leak when releasing connections that have a user + allocated mix matrix. +* Core API - Added pre-wet and post-wet arguments to WetDryMix in C# wrapper. +* Core API - Fixed crash with FADPCM streams. +* Core API - Fixed another potential crash in PitchShifter DSP if changing + channel count while running. +* Core API - Win - Fix issues caused by WASAPI allocating the output buffer at + the mixer's sample rate instead of the device's sample rate. +* Studio API - XboxOne - Fix setting the thread affinity of the studio loading thread. +* Studio API - Fixed case of nested events on parameters being stopped while + still active. Introduced in 1.06.04. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.06.06 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Core API - XboxOne - Thread affinity can now be set as a mask of allowed cores. + +08/07/15 1.06.06 - Studio API patch release (build 65638) +---------------------------------------------------- + +Features: +* Core API - Added FMOD_DSP_COMPRESSOR_LINKED parameter to DSP compressor. + +Fixes: +* Studio API - Fixed potential invalid memory access when a bank is unloaded + while create instance commands are queued. +* Studio API - Removed one frame delay between setting a parameter and having + conditional timeline transitions occur. +* Studio API - Studio gracefully handles the case of a programmer sound being + returned in a streaming not-ready state when the instrument is + being used with timelocked seeks. +* Core API - Fixed rare crash when streams go virtual. +* Core API - Fixed 3EQ DSP not waiting an extra mix block before going idle, + possibly cutting off a tail. +* Core API - Fixed potential crash in PitchShifter DSP if changing channel + count or FFT size while running. +* Core API - Fixed rare volume pop when ramping with fade points as a channel + goes emulated. +* Core API - Linux - Fixed record position not advancing with ALSA output mode. +* Core API - Fix race condition when setting the impulse response on an active + convolution reverb DSP. +* Unity - Fix compatibility with Unity 5.1 + +24/06/15 1.06.05 - Studio API patch release (build 65161) +---------------------------------------------------- + +Features: +* Studio API - Added FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES flag to + force bank sample data to decompress into memory, saving + CPU on low end platforms. +* Studio API - Improved responsiveness when reducing steal oldest polyphony + over live update. +* Studio API - Studio profiling now includes nested instance information. +* UE4 - Exposed beat and marker callbacks as Blueprint events. + +Fixes: +* Studio API - Fixed Scatterer sounds having incorrect volume when min and + max scatter distances are equal. Introduced in 1.06.00. +* Studio API - Fixed FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES position to + return the beat position, rather than the tempo marker + position. +* Studio API - Fix deadlock in studio when removing an output device that + runs at a different sample rate to the system. +* Studio API - Fix deadlock in studio when removing certain USB headsets. +* Core API - Fixed rare case of DSP mixer not responding momentarily if + output mode was switched during playback. +* Core API - Fix declaration of DSP.getMeteringInfo in C# wrapper. + +Notes: +* UE4 - Now built against Unreal 4.8 + +09/06/15 1.06.04 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added tempo and marker event callbacks. See + FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER and + FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT. +* Core API - Add FMOD_DSP_DESCRIPTION::sys_register, sys_deregister and + sys_mix for DSP plugin developers, to allow a per type (not + instance) level init/shutdown/mix callback for a plugin. + +Fixes: +* Core API - Fixed MIDI playback not correctly handling CC1 (mod wheel). +* Studio API - Fixed livelock when scheduling nested events in a playlist that + have 0 duration. +* Studio API - Fixed events staying active when they have active but idle + nested events on parameters. Events now finish once their + nested parameter events go idle. +* Studio API - Fixed Scatterer sounds not being spatialized properly. + Introduced in 1.06.00. +* FSBank - Fix bug that prevented selection of FMOD ADPCM in the tool. +* Core API - Fix set3DPanLevel not respecting reverb mix when pan level + was approaching 0. +* Core API - Fix 2d channels not having the wet mix scaled for reverb when + parent ChannelGroup volume/mute functions were called. +* Unity - Remove warnings about banks already loaded +* Unity - Fix Unity Editor crashing when using FMOD_LIVEUPDATE and + FMOD_DEBUG pre-processor commands simultaneously. + +Notes: +* Studio API - Incremented bank version, requires runtime 1.06.00 or later. +* Studio API - Latest runtime supports loading old bank versions from 1.03.00. +* Studio API - Added a warning for events that haven't finished because they + are waiting for a DSP effect to go idle. +* Core API - WiiU - To comply with LotCheck requirements only the logging version + of FMOD will link with networking APIs +* Xbox One - Now built with May 2015 QFE 1 XDK. +* WiiU - Now built with SDK 2.12.13. + +22/05/15 1.06.03 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Reduced memory overhead of bank metadata. + +Fixes: +* Studio API - Fixed steal oldest polyphony behaviour using instance creation + instead of instance start time. +* Studio API - Fixed playlist instrument cutoff not applying a volume ramp down + which could cause pops when using polyphony. +* Core API - Fixed invalid memory access when loading an incorrectly formatted + or truncated IMA ADPCM wav file using FMOD_OPENMEMORY_POINT and + FMOD_CREATECOMPRESSEDSAMPLE. +* Core API - Fix rare crash due to race condition when calling Sound::Release() + just after the sound has been loaded using NON_BLOCKING. +* Core API - PS3 - Fix deadlock in streaming when using SPU Threads. +* Core API - Attempting to attach the Master ChannelGroup to a port will now + return FMOD_ERR_INVALID_PARAM. +* Core API - PS4 - Fix issues with recording at rates other than the driver + default. +* Core API - Fix crash in DSPFader when voice goes virtual with DSP effect added + at a position lower than the fader (ie post fader), and the effect + is freed. +* UE4 Integration - Fixed incorrect listener orientation. + +Notes: +* Studio API - Changed envelope follower DSP sidechain parameter to ignore + invalid values. +* Xbox One - Now built with April 2015 XDK. +* 7.1 to 5.1 downmix now lowers the volumes of the back speakers' + contribution to the surround speakers by 1.5db to lessen volume bulge + in the middle. + +06/05/15 1.06.02 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Sounds on parameters that are cross-fading in will now apply a + ramp volume up to the initial cross-fade value. This avoids pops + even if the sound has been improperly authored. +* UE4 Integration - Added support for Reverb zones. +* UE4 Integration - Exposed Studio::EventInstance::getTimelinePosition and + Studio::EventInstance::setTimelinePosition as blueprint + functions. + +Fixes: +* Studio API - Fixed transition timeline modules not crossfading their + volume properly when overlapping the lead out region. +* Studio API - Fixed C# wrapper not linking against 64bit dll when WIN64 is defined. +* Studio API - Fixed events with sidechains never naturally stopping. +* Studio API - Fixed runtime crash caused by a compiler bug for customers compiling + from source using VS2015 CTP. +* Core API - WiiU - Fixed incorrect pitch for DRC if System is running a + rate other than 48KHz or 32KHz. +* Core API - PS4 - Fix small memory leak when closing output ports. +* Core API - Fixed documentation regarding FMOD_DSP_COMPRESSOR_USESIDECHAIN and + FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN. +* Core API - WinStore - Fix System::Init() freezing when called from the UI thread. + +* UE4 Integration - Fixed bad editor performance when selecting audio components. +* UE4 Integration - Fixed several Android deployment issues. + +* Unity Integration - Fix compilation issues on iOS when using IL2CPP. +* Unity Integration - Logging libs for OSX are now included. Defining FMOD_DEBUG + will now route FMOD internal logging to the Unity console in the + OSX editor and standalone OSX builds. +* Unity Integration - Make members of the REVERB_PROPERTIES structure public. +* Unity Integration - Fix compile error on XBox One when defining FMOD_DEBUG. + +Notes: +* UE4 Integration - Merged documentation with main API documentation. + +17/04/15 1.06.01 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_CREATED, + FMOD_STUDIO_EVENT_CALLBACK_DESTROYED and + FMOD_STUDIO_EVENT_CALLBACK_START_FAILED callback types. +* Studio API - Exposed FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY and + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD as advanced + properties that can be set per instance. + +Fixes: +* Core API - Fixed Channel userdata not being reset to 0 each playSound. +* Core API - Fixed the C# wrapper for DSP.AddInput and DSP.disconnectFrom. +* Core API - PS4 - Fixed playback issue with AT9 compressed samples that have + a non-zero loop start point. +* Core API - Fix rare issues with generator DSPs or compressed channels getting + stuck looping the same fragment of audio. +* Core API - PS3 - Fix rare crash if sound stops on a channelgroup with a matrix + set in it. + +* Unity Integration - Fix banks not being loaded on standalone OSX builds. +* Unity Integration - Logging libs for windows are now included. Defining FMOD_DEBUG + will now route FMOD internal logging to the Unity console in the + Windows editor and standalone Windows builds. + +Notes: +* PS4 - Now built with SDK 2.508.051. + +10/04/15 1.06.00 - Studio API minor release +---------------------------------------------------- + +Important: +* Studio API - Scatterer sounds now steal the oldest spawned sound if the + polyphony limit has been reached when spawning a new sound. + +Features: +* Added new compression format FADPCM as a higher quality, lower CPU cost drop + in replacement for standard IMA ADPCM. This custom developed format is our new + recommendation for mobile, PS Vita and Wii U delivered exclusively via FSB. +* Core API - Improved CPU performance of convolution reverb by 30% +* Core API - Android - Improved latency by automatically resampling to the + native rate to enable the fast mixer. +* Core API - PS Vita - Removed requirement to use 48KHz mixing, default is + now 24KHz for better performance. +* Core API - Xbox One - Optimized performance for looping compressed XMA. +* Core API - Xbox One - Added support for greater than stereo XMA streams. +* Core API - Xbox One - Reduced output latency by 20ms. +* Studio API - Significantly reduced memory usage. +* Studio API - Added Studio bank loading thread. +* Studio API - Added Studio::Bank::getUserData and Studio::Bank::setUserData. +* Studio API - Added FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD callback. +* Studio API - Support for transition timeline lead-in and lead-out. +* Studio API - Added support for setting Studio async update period via + FMOD_STUDIO_ADVANCEDSETTINGS. +* Core API - PS4 - Added support for High Quality Recording API by default. + +Fixes: +* Studio API - Fixed parameter modulation being unable to go below the value + set from the public API. +* Studio API - Fixed effect bypass setting not being saved to banks. + +Notes: +* Studio API - The C# wrapper now uses System.Guid instead of FMOD.GUID. +* Studio API - Default command buffer size has been increased to 32K. +* Studio API - Studio::System::setListenerAttributes and + Studio::System::getListenerAttributes now take a listener + index in preparation for multiple listener support. +* Studio API - Deprecated Studio::ID typedef. Please use FMOD_GUID type. +* Studio API - Changed FMOD_STUDIO_EVENT_CALLBACK_TYPE from an enum to a + bitfield. Added 'callbackmask' parameter to + Studio::EventDescription::setCallback and + Studio::EventInstance::setCallback. +* Studio API - Studio::System::startRecordCommands and + Studio::System::stopRecordCommands has been renamed to + Studio::System::startCommandCapture and + Studio::System::stopCommandCapture. +* Studio API - Studio::System::playbackCommands has been renamed to + Studio::System::loadCommandReplay and now returns + a CommandReplay object. +* Studio API - Schedule delay and look-ahead has been reduced for Studio + async mode. This reduces latency and improves responsiveness + of events to parameter changes. +* Core API - System::set3DListenerAttributes checks for invalid + arguments in release. +* Core API - Thread safety no longer uses a command queue for deferring + selected API functions until the next update. The queue of + deferred functions was most often flushed by a subsequent + getter function or other setter function anyway. +* Core API - Added 'numconnected' to System::getRecordNumDrivers and + 'state' to System::getRecordDriverInfo in preperation for + changes to how recording device removal is handled. Currently + 'numconnected' will equal 'numdrivers' and 'state' will + be FMOD_DRIVER_STATE_CONNECTED. +* Core API - Some of the FMOD_PAN_ types have been renamed FMOD_DSP_PAN_ + for consistency. +* Core API - Calling ChannelControl::getAudibility on a ChannelGroup now + returns the combined audibility of itself and the parent + audibility. + +02/04/15 1.05.15 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Win - Fixed occasional deadlock when removing audio devices. +* Core API - Fixed stream crackling if initialseekposition was used immediately + followed by Channel::setPosition with a close position value. +* Core API - PS3 - Fixed six or eight channels vorbis streams crashing the SPU. +* Core API - Xbox One - Fixed rare hang when decoding small XMA compressed audio. +* Core API - Fixed DSP::getInfo not returning configwidth and confighheight + information for VST plugins. +* Core API - Fixed rare crash calling DSP::reset on the fader DSP, after + ChannelGroup::setPan/setMixLevelsOutput/setMixMatrix. This + could occur when a Studio event is started or stopped. +* Core API - PS4 - Fixed issue with non-1024 sample aligned loop-points and AT9 + compressed samples. +* Core API - Fixed DSP effect being un-removable with FMOD_ERR_DSP_INUSE after + being added to a channel and the channel stops (becoming invalid). + +Notes: +* PS3 - Now built with SDK 470.001. + +16/03/15 1.05.14 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Fixed some cases where channel group audibility was not refreshed + when fade points are active. This could happen when a Studio event + instance is paused and unpaused. +* Core API - PS3 - Fixed FMOD_PS3_INITFLAGS overlapping FMOD_INITFLAGS causing + certain FMOD_INITFLAGS to affect PS3 specific bit-stream + encoding options. +* Core API - PS3 - Fixed a rare hang when releasing a DSP that exposes + a FMOD_DSP_PARAMETER_OVERALLGAIN parameter. +* Core API - PS3 - Fixed opening URL failing with network streams. +* Core API - Xbox One - Fixed recording API, you can now specify any sample rate + to record at. Native rate of 48KHz is still recommended + for lowest latency. +* Studio API - Fixed virtualized event failing to become real if the number + of playing instances drops back below max polyphony. + +Notes: +* Core API - PS3 - Deprecated FMOD_PS3_EXTRADRIVERDATA::initflags. Due to a + bug it was being ignored. Pass the flags to System::init instead. + +25/02/15 1.05.13 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Studio::System::getBank now accepts bank filenames as input. +* Core API - Added 64bit versions of fsbank and fsbankcl tools. + +Fixes: +* Studio API - Fixed case of nested event not being destroyed even after it + had finished producing sound. +* Studio API - Fixed crash when changing output bus on an event when live update + is connected. +* Studio API - Fixed deadlock when calling Studio commands when mixer is suspended. +* Studio API - System::release now ensures release even if flushing pending commands + causes an error. +* Studio API - The name of the string bank is now added to the string bank. +* Studio API - Event instance restart now flushes parameter values before timeline + rescheduling occurs. This avoids a potential issue for transitions + with parameter conditions, where they may not have used the most + recent parameter value. +* Core API - Fix unnecessary querying of recording driver capabilities during + recording. +* Core API - PS4 - Remove AT9 workaround added in 1.05.12. Fix AT9 compressed + codecs with finite loop counts. +* Core API - PS4 - Removed stalls when an AT9 compressed sample channel is started. +* Core API - PS4 - Fix crash in recording. +* Core API - Fix multiple listener support not working properly. +* Core API - Fix user file crash if using asyncfileread callback, and file + open and close happens without any read occuring. +* Core API - Fix rare crash with Sound::release if a nonblocking setPosition + is in process and it is an FSB sound. +* Core API - Fix thread safety issue loading multiple mod/s3m/xm/it files + simultaneously. +* Core API - Fix rare crash if FMOD_ACCURATETIME was used with .mp3 file + followed by mp3 encoded FSB file after a time, both using + FMOD_CREATECOMPRESSEDSAMPLE. +* Core API - PS3 - Fixed custom DSP that use the plugindata member. + +Notes: +* Studio API - Updated programmer_sound example. +* Core API - Added plug-in inspector example. +* Xbox One - Now built with February 2015 XDK. + +06/02/15 1.05.12 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Improved memory use for events with repeated nested events. + +Fixes: +* Studio API - Fixed crash when stopping multiple one-shot events on a bus. +* Studio API - Fixed nested event polyphony from cutting off immediately, + causing pops. +* Core API - Fixed rare crash in mixer if DSP::reset is called on a + FMOD_DSP_TYPE_FADER dsp (ie ChannelControl head DSP) + after DSP::setPan/setMixLevelsOutput/setMixMatrix. +* Core API - Fixed race condition setting resampling speed while resampling + is occurring. +* Core API - Fixed crash loading mod/s3m/xm/it file using FMOD_NONBLOCKING + and FMOD_CREATECOMPRESSEDSAMPLE and then immediately calling + SoundI::release +* Core API - PS4 - Work around AT9 codec issues that have appeared when using SDK 2.000 + +22/01/15 1.05.11 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Xbox One - Added access to 7th CPU core. + +Fixes: +* Studio API - Fixed crash setting Studio event callback to null as it is + being invoked. +* Studio API - Fixed crash in hashmap reallocation when running out of memory. +* Studio API - Fixed Studio::loadBankCustom from freeing its custom userdata + before the close callback for failed banks. +* Studio API - If FMOD_OUTTPUTTYPE_WAVWRITER_NRT or NOSOUND_NRT is used as an + output mode, Studio runtime will now internally force + FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE to avoid a hang. +* Core API - Fix pop noise when 3d sound goes virtual then becomes real again, + only if ChannelControl::addDSP was used. + +Notes: +* Studio API - Studio::EventInstance::getPlaybackState will now return the state + as FMOD_STUDIO_PLAYBACK_STOPPED if the instance is invalid. +* Studio API - Studio::Bank::getLoadingState, Studio::Bank::getSampleLoadingState, + and Studio::EventDescription::getSampleLoadingState will now return + the state as FMOD_STUDIO_LOADING_STATE_UNLOADED if the object + is invalid. + +12/01/15 1.05.10 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Xbox One - Added support for recording from microphones. + +Fixes: +* Core API - PS3 - Fix deadlock in streaming sounds when linking against the + SPU thread libraries. +* Core API - Windows - Fixed crash when initializing a second ASIO system. +* Core API - Fix ChannelControl::getDSPIndex not returning an error if the dsp + did not belong in the Channel or ChannelGroup +* Core API - PS3 - Fix linker error when using libfmod_sputhreads.a +* Core API - Fixed AT9 and ACP XMA incorrectly allowing FMOD_OPENMEMORY_POINT + and FMOD_CREATESAMPLE. +* Core API - Fixed reverb wetlevel from ChannelControl::setReverbProperties + being reset after a voice goes virtual then returns as real. +* Core API - Fixed removing/adding DSPs in a ChannelControl chain copying + setDelay commands incorrectly and making channels pause when + they shouldnt +* Studio API - Reinstated support for embedded loop points in source sounds, + and fixed issue with playback of timelocked sounds. + +12/12/14 1.05.09 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Added System::registerOutput to allow the creation of + statically linked custom output modes. + +Fixes: +* Studio API - Fixed looping event cursor position from getting slightly + out of sync with scheduled position when running at 44.1kHz. +* Studio API - Fixed playlist steal-oldest polyphony returning errors + when used with extremely small durations. +* Studio API - Fixed silence after unpausing an event instance. + Introduced in 1.05.08. +* Core API - Fixed crash after setting the input format of a Return DSP + to stereo, when the mixer output format is mono. +* Core API - Windows - Fix crash calling FMOD_ASYNCREADINFO::done function + pointer when default calling convention is not cdecl. +* Core API - Fixed FMOD_SPEAKERMODE_RAW panning incorrectly during an + up or down mix. +* Core API - Fix crash when a Channel::setPosition is called on a + non-blocking stream that is going virtual. +* Core API - Fixed potential audio corruption when playing sounds with + more than 8 channels. +* Core API - Fixed emulated channels not updating their parent when + when Channel::setChannelGroup is called. +* Core API - Fixed channels having their volume reset when changing + channel group parents. +* Core API - Fixed channels not going virtual when being paused if no + other volume changes were occurring. +* Core API - Fixed FMOD_INIT_PROFILE_ENABLE enabling all DSP metering + regardless of whether FMOD_INIT_PROFILE_METER_ALL was used. +* Core API - Added volume ramp up for 3d channels coming back from virtual + to real. +* Core API - Fixed rare crash if the master channelgroup's DSP Head unit + was changed then released. +* Core API - PS3 - Fix loudness meter not functioning. +* Core API - PS3 - Re-enabled playDSP. + +Notes: +* Core API - Xbox One - Added check to ensure DSP buffer size is specified + as the default 512 samples to avoid performance + degradation of XMA decoding. +* Core API - Windows - Changed default ASIO speaker mapping to 1:1 for + outputs with more than 8 channels. + +28/11/14 1.05.08 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Added ChannelControl::setFadePointRamp helper function + that automatically adds a volume ramp using fade points. + +Fixes: +* Studio API - Fixed pops that could occur when stopping events that have + instruments scheduled to stop already. +* Studio API - Fixed pop that could occur when playing an sound + that has an AHDSR fade in. +* Studio API - Fixed indeterminism when exporting string banks that have + multiple string entries with inconsistent case. +* Core API - Android - Improved compatibility with Java 1.6. +* Core API - iOS - Added armv7s back to the universal binary. +* Core API - Windows - Fix System::getRecordDriverInfo returning + incorrect device names. Introduced in 1.05.00. +* Core API - Fix FMOD_SPEAKERMODE_RAW creating silence if playing more than + 1 sound, introduced in 1.04.15. +* Core API - Fix CELT and Vorbis FSB being allowed with FMOD_OPENMEMORY_POINT + and FMOD_CREATESAMPLE when it should in fact + return FMOD_ERR_MEMORY_CANTPOINT + +21/11/14 1.05.07 - Studio API patch release +---------------------------------------------------- + +Important: +* Studio API - Fixed scheduling for looping nested events which are cut off + from the parent event. Previously the looping nested event + would attempt to play to end but would cut off halfway through + with a noticeable click. The nested event now cuts off + immediately with a fade out ramp. + +Features: +* Core API - Android - Added ARM64 support. + +Fixes: +* Core API - Fix ChannelGroup::setMixLevelsOutput causing corrupted audio + when the channel group has an input with a channel count greater + than the system channel count. +* Core API - Fixed ChannelControl::setMute not refreshing channel audibility. +* Core API - Windows - Fix calls to DSP::getInfo() from within a custom DSP + deadlocking the system during audio device change. +* Core API - Fixed some DSP configurations with an idle first input causing + signal to be downmixed to mono. +* Core API - Fix invalid characters being printed in log messages when open + certain types of media files. +* Studio API - Fixed Studio::Bank::getEventCount and Studio::Bank::getEventList + incorrectly enumerating nested events. +* Studio API - Fixed Studio::Bus::stopAllEvents not working when snapshots or + nested events are playing. +* Studio API - Fixed "state->mInstanceCount > 0" assert that could occur when + instruments were stopped repeated times. + +Notes: +* PS Vita - Now built with SDK 3.300. +* WiiU - Now built with SDK 2.11.13. + +13/11/14 1.05.06 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Windows - Add 64bit VST support + +Fixes: +* Studio API - Fixed thread safety issue when accessing sound tables as + new banks with sound tables are being added. +* Studio API - Fixed duplicate streaming sounds keeping playing when unloading + the memory bank that it is streaming from. Now the stream + will stop if the memory bank is unloaded. +* Core API - Fixed sound going mono in certain DSP configurations. + Introduced 1.05.00. +* Core API - Fixed rare timing issue with fade points that caused the fader + DSP to generate invalid floats. +* Core API - Android - Fixed crashes due to insufficient stack size when + running ART instead of Dalvik. +* Core API - Windows - Fixed potential crash if using multiple FMOD::System + with ASIO output mode. This is not supported by ASIO + and is now disabled. +* Core API - Linux - Fixed PulseAudio device enumeration not placing the + default device at position 0. + +Notes: +* Xbox One - Now built with November 2014 XDK. +* Android - Now built with NDK r10c. +* iOS - Now built with SDK 8.1 (Xcode 6.1). +* Mac - Now built with SDK 10.10 (Xcode 6.1). +* PS4 - Now built with SDK 2.000.071 + +30/10/14 1.05.05 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Added convolution reverb example. + +Fixes: +* Studio API - Fixed various errors after deleting objects via Live Update +* Studio API - Fixed possible crash using shared waveforms across multiple banks + after some of the duplicate banks have been unloaded. +* Studio API - Fixed duplicate events becoming invalidated when the first bank that + contains them is unloaded. +* Studio API - Fixed bug in load_banks example. +* Studio API - Fixed crash when calling Studio::Bus::stopAllEvents while + playing event instances that have had release called. +* Core API - Fixed memory leaks. + +22/10/14 1.05.04 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed transition markers failing at the start of the timeline. +* Core API - PS3/X360/Wii-U - Fix vorbis seek getting stuck in an infinite loop. +* Core API - Fixed incorrect behaviour when changing the channel mode from 3D to 2D. +* FSBank - Fixed setting the cache directory and printing log messages. + +Notes: +* Studio API - Timeline transitions can be chained together with no delay. + +13/10/14 1.05.03 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added Studio::Bus::lockChannelGroup and + Studio::Bus::unlockChannelGroup. + +Fixes: +* Studio API - Fixed event fadeout cutting off DSP effects with long tails. +* Studio API - Fixed crash when accessing events with a lifetime across + duplicate banks. Note that when unloading the initial + bank for an event, that event will be invalidated. +* Core API - Fixed for enum mismatches in C# wrapper. +* Core API - Fixed FMOD_DSP_LOWPASS click when being reused, ie stopping + then starting a new sound. +* Core API - Fixed rare hang during Sound::release for sounds created as + FMOD_NONBLOCKING. +* Core API - Fixed corrupted playback of MOD/S3M/XM/IT/MID sequenced + formats. Introduced 1.04.05 +* Core API - Fixed ChannelGroup::setReverbProperties on the master channel + group causing a stack overflow. This is now disallowed as it + creates a circular dependency. +* Core API - Mac - Replaced error condition if initializing FMOD before + activating the AudioSession with a TTY warning. +* Core API - Android - Fixed Sound::readData going forever when reading + AAC audio. +* Core API - Fix the pancallbacks member of the FMOD_DSP_STATE_SYSTEMCALLBACKS + structure passed into custom DSP callbacks being NULL. +* Core API - Fix crash in mixer if user used System::playDSP and made + the dsp inactive with DSP::setByPass or DSP::setActive + +01/10/14 1.05.02 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed a bug where event sounds could have incorrectly + synchronized playback. +* Core API - Fixed compiler warning in public header. +* Studio API - Disabled embedded loop points on all sounds played by the + Studio API to fix incorrect playback of timelocked sounds. +* Studio API - Snapshot volumes are now interpolated in terms of linear gain. +* Core API - Fixed 3EQ DSP not clearing out internal state when DSP::reset is + called, potentially causing audible artifacts when reused. +* Core API - Fixed resampler inaccuracies when reading partial looping data. +* Core API - Mac - CoreAudio output mode will now allow any DSP block size + and will correctly use the desired buffer count. +* Core API - Mac - CoreAudio now correctly exposes its output AudioUnit + via the System::getOutputHandle function. +* Core API - PS3 - Fixed resampler strict aliasing bug on PPU release builds. +* Core API - PS3 - Fixed playDSP crash. +* Core API - Fixed convolution reverb input downmix +* Core API - Greatly increase speed of mixing multichannel source data. + +Notes: +* Studio API - Loudness meters saved in banks will now be bypassed to improve + performance when profiler isn't attached. +* Xbox One - Now built with September 2014 QFE 1 XDK. + +22/09/14 1.05.01 - Studio API patch release +---------------------------------------------------- + +Important: +* Fixed possible large memory blowout if certain DSP pools were exceeded. + +Features: +* Core API - Added FMOD_SYSTEM_CALLBACK_PREUPDATE and + FMOD_SYSTEM_CALLBACK_POSTUPDATE callbacks. +* Core API - iOS - Added support for multichannel output via accessory. + +Fixes: +* Studio API - Implemented Studio::Bus::stopAllEvents. +* Studio API - Fixed bus going silent when output format is stereo and system + speaker mode is 5.1. +* Studio API - Fixed Studio::System::getAdvancedSettings clearing + FMOD_STUDIO_ADVANCEDSETTINGS.cbSize and not returning + default values. +* Studio API - Fixed a bug where looping or sustaining events could + incorrectly be treated as oneshot. +* Studio API - Fixed a bug where event sounds could have incorrectly + synchronized playback. +* Core API - Fix bug with custom 3D rolloff curve points getting corrupted. +* Core API - Fixed incorrect documentation for FMOD_CHANNELCONTROL_CALLBACK. +* Core API - Fix sub-mix channel count being incorrect when playing multiple + sounds with different channel counts together. Introduced in + 1.04 +* Core API - Fix a channel DSP head's ChannelFormat not being reset if a sound + with a channel mask was played on it previously + +Notes: +* iOS - Now built with SDK 8.0 (Xcode 6.0). +* Mac - Now built with SDK 10.9 (Xcode 6.0). + +09/09/14 1.05.00 - Studio API minor release +---------------------------------------------------- + +Important: +* Studio API - Studio::MixerStrip has been replaced by Studio::Bus and Studio::VCA. + The new classes do not have a release method, as their handles + remain valid until the bank containing them is unloaded. +* Studio API - Studio::System::getEvent, Studio::System::getBus, Studio::System::getVCA, + and Studio::System::getBank now take a string path. + Functions that take an ID are now named Studio::System::getEventByID, + Studio::System::getBusByID, Studio::System::getVCAByID, and + Studio::System::getBankByID. +* Studio API - Studio::EventInstance::release no longer invalidates the + handle immediately. The handle remains valid until the event + stops and is actually destroyed. In addition, this function + now succeeds even if the event will not stop naturally. +* Studio API - Events with sounds triggered by parameters will now stop rather + than going idle when all sounds have finished and the timeline + cursor has reached the end. +* Core API - The wide string argument of System::getDriverInfo() and + System::getRecordDriverInfo() has been removed. These functions + now return UTF-8 encoded strings. +* Core API - FMOD_UNICODE flag for System::createSound() and System::createStream() + has been removed. These functions now accept UTF-8 encoded file names + to load sounds with non-ASCII characters on Windows, PS3, PS4, PS Vita, + XBox One, iOS, Android, Mac, Linux, Windows Phone, and Windows Store. +* FSBank API - FSBANK_INIT_UNICODE flag has been removed. All file name structure + members and function arguments now accept UTF-8 encoded strings. + +Features: +* Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED and + FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED callback types. +* Studio API - Added Studio::Bank::getStringCount and Studio::Bank::getStringInfo. +* Core API - Added FMOD::Debug_Initialize to configure the destination and + level of debug logging when using the logging version of FMOD. + This is a more flexible replacement for the previous + FMOD::Debug_SetLevel API. +* Core API - Android - Added support for playing AAC files (requires Android 4.2). +* Core API - Android - Reduced latency for devices that support FastMixer, see + "Basic Information" section of the docs CHM for details. +* Core API - Added DSP::setWetDryMix so any effect can have generic wet/dry + signal level control. +* Core API - Added 3D ChannelGroup support. A ChannelGroup is a 'group bus' + and it can now be positioned in 3d space, affecting the mix for + buses and channels below it. 3D Cones, geometry etc all work. + Use ChannelGroup::setMode(FMOD_3D) to enable a 3D ChannelGroup. + +Fixes: +* Studio API - Fixed transitions to the end of a loop region failing to escape + the loop. +* Studio API - Fixed sends inside events occasionally having a brief period + of full volume when the event is started. +* Core API - Fix for crash when creating multiple Systems with profiling enabled. + +Notes: +* Studio API - Transition regions no longer include the end of their range. +* Studio API - FMOD_ERR_EVENT_WONT_STOP has been removed. +* Studio API - Studio::EventInstance::start now resets all DSPs inside the + event to prevent incorrect ramping. This relies on + FMOD_DSP_RESET_CALLBACK leaving public parameters unchanged. +* Studio API - Studio::System::getEvent's unimplemented mode parameter has + been removed, along with FMOD_STUDIO_LOADING_MODE. +* Studio API - FMOD_STUDIO_PLAYBACK_IDLE and FMOD_STUDIO_EVENT_CALLBACK_IDLE + have been removed. +* Studio API - Removed deprecated function Studio::EventInstance::createSubEvent. +* Core API - Changed FMOD_FILE_ASYNCCANCEL_CALLBACK to take FMOD_ASYNCREADINFO + structure rather than void *handle. +* Core API - The FMOD_DSP_RESET_CALLBACK documentation has been updated to + make it clear that it should leave public parameters unchanged. +* Core API - PS4 - Thread affinity can now be set as a mask of allowed cores. +* Core API - iOS / Mac - Reduced default block size to 512 for lower latency. +* Core API - Android - Renamed Java interface from FMODAudioDevice to simply + FMOD, i.e. org.fmod.FMOD.init(). +* Core API - Channel::setMode moved to ChannelControl::setMode so that + ChannelGroups can now also have 2D/3D mode bits set. + +09/09/14 1.04.08 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed crash when a second system is created but never initialized. +* Studio API - Fixed a few ordering issues that can cause binary changes in + identical banks. +* Core API - Fix for pop due to unwanted volume ramping after calling + DSP::reset on fader DSP. This can happen when a Studio event + instance is stopped and then restarted. Caused by timing issue + with ChannelControl::setVolumeRamp. +* Core API - Fix crash if FMOD_DSP_TYPE_MIXER or DSP with no read/process + function is passed to System::playDSP. +* Core API - iOS - Fixed MP2 files being intercepted by AudioQueue causing an + internal error. +* Core API - XboxOne - Fixed network connect not resolving host names and + not honoring the requested time out. +* Core API - Fix rare crash if calling Channel::stop() which a non blocking + Channel::setPosition is happening with a stream. +* Core API - Winphone and Windows Store Apps - fixed detection of socket errors. +* Core API - If a user DSP is added after the master ChannelGroup's fader that + changes the output channel count to something other than the + software mixer's channel count, stuttering could occur. Fixed. +* Studio API - Windows - Fixed Studio API functions deadlocking when in + asynchronous mode and a sound device is removed. +* Core API - PS3 - Fixed some DSP parameter sets being ignored + (overwritten by SPU DMA) +* Core API - Fix System::playDSP not working with custom DSP effects that + use the read callback +* Core API - Added Memory.Initialize function to the C# wrapper. +* Core API - Fixed incorrect truncation of FMOD_CREATECOMPRESSEDSAMPLE + sounds created from MP3 or MP2 files (does not affect FSB). +* Core API - Fixed FMOD_ACCURATETIME for FMOD_CREATECOMPRESSEDSAMPLE + sounds created from MP3 or MP2 files (does not affect FSB). + +Notes: +* Core API - The master ChannelGroup's fader/head now is not responsible for + up or downmixing the signal. It is now done beyond the dsp tree, + internally within FMOD. The Master ChannelGroup's Fader can still + be forced to upmix if required with DSP::setChannelFormat. + +20/08/14 1.04.07 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed an internal error when instantiating a snapshot that + exposes intensity as a parameter. +* Core API - PS3 - Fix audio dropout/corruption when using + FMOD_SPEAKERMODE_STEREO. Usually when sidechain is involved. +* Core API - iOS - Fixed System::recordStart returning FMOD_ERR_RECORD. +* Core API - Fixed possible click noise on end of sound if using + FMOD_CREATECOMPRESSEDSAPMLE or PCM on PS3. + +Notes: +* Xbox One - Now built with July 2014 QFE1 XDK. +* PS4 - Now built with SDK 1.750.061 + +06/08/14 1.04.06 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES.subsoundIndex + to support non-blocking loading of FSB subsounds. +* Core API - Windows - FMOD now handles sound card removal + and insertion without any programmer intervention. If + System::setCallback is called with + FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED bit set, this feature + is disabled. +* Core API - Windows - System::setOutput can be called post-init now, + allowing dynamic switching between any output mode at runtime. +* Core API - iOS - Improved IMA ADPCM decoding performance especially for + arm64 variant. + +Fixes: +* Core API - Fixed bug where channels with post-fader DSP units would not play + after transitioning from virtual to real. +* Core API - Fix pops with resampler on loops. +* Core API - Fix playDSP returning FMOD_ERR_DSP_SILENCE or + FMOD_ERR_DSP_DONTPROCESS if the dsp played returned that during + query mode. +* Core API - PS3 - Fix ITEcho, SFXReverb, FFT DSP effects rarely getting + parameters reset to old values. +* Core API - Xbox One - Fixed audio corruption when playing mono streams from an + XMA FSB that has both mono and stereo subsounds. +* Core API - PS3 - Moved vorbis decode work during stream setPosition to the SPU. +* Core API - Windows - Fix System::setSoftwareFormat with differing samplerate and + speaker mode causing static. +* FSBank API - Fixed cache being incorrectly reused when replacing source files + of identical name with a different file that has an old time stamp. + +Notes: +* PS3 - Now built with SDK 460.001 + +25/07/14 1.04.05 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fix for pop when stopping events with FMOD_STUDIO_STOP_ALLOWFADEOUT. +* Studio API - Fix incorrect scheduling when Multi Sounds contain nested + events with timeline transitions. +* Studio API - Fix for nested event modules not being cleaned up when used + in a playlist module. +* Studio API - Fix for events failing to stop when they have instruments on + parameters that have Hold enabled. +* Core API - Fix combined volume ramp and fade point ramp having an incorrect + volume. +* Core API - Fix for pop when setting zero volume with vol0virtual enabled. +* Core API - Fix for pop when scheduling fade point ramps in the past. +* Core API - Fix for pop on a return bus when all incoming sends go idle. +* Core API - Fix for faders delaying going idle for a mix when volume is set + to zero without ramping. +* Core API - Fixed FSB forwards compatibility issue causing load failures. +* Core API - XboxOne - Fixed ACP race condition when shutting down / initializing + System causing XMA channels to not play. +* Core API - XboxOne - Fixed XMA compressed sample channel leak that would + eventually result in all sounds playing emulated (silent). +* Core API - WinPhone and WSA - Fixed network connection not respecting system + timeout value. +* Core API - PS3 - Fix IMA ADPCM support for ps3 not working. +* Core API - iOS - Fixed potential duplicate symbol error on link. + +Notes: +* Xbox One - Now built with July 2014 XDK. +* iOS - Now built with SDK 7.1 (Xcode 5.1.1). + +11/07/14 1.04.04 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed a bug where quantized timeline transitions could fail to + play the audio at the destination marker. +* Core API - Fix channel stealing not calling end callback in playDSP case. +* Core API - Fix rare crash if System::playDSP is called, and it steals a + channel with a sound on it, and System::update wasnt called in + between. +* Core API - Mac, iOS and Android - Improved network error reporting. + +08/07/14 1.04.03 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Added FMOD_ADVANCEDSETTINGS.randomSeed, which specifies a seed + value that FMOD will use to initialize its internal random + number generators. + +Fixes: +* Studio API - Changed isValid() functions in C# wrapper to call through to C++. +* Studio API - Fixed Studio::System::loadBankCustom file callbacks being ignored + when System::setFileSystem is using async read functions. +* Studio API - Fixed incorrect playback when starting an event instance + immediately after creating it. +* Studio API - Fixed some snapshot types causing silence on busses if loading + files older than those created with FMOD Studio 1.04.02. +* Core API - Fixed incorrect FMOD_ASYNCREADINFO.offset value passed to + FMOD_FILE_ASYNCREAD_CALLBACK when file buffering is disabled. +* Core API - Windows - Fixed WASAPI failing to initialize on certain old drivers. +* Core API - Fix FMOD_SPEAKERMODE_RAW being broken. +* Core API - Fixed System::set3DRolloffCallback not working. +* Core API - Fixed Sound::set3DCustomRolloff not working. +* Core API - Fix Geometry API not running in its own thread like it was in FMOD Ex. +* Core API - Fixed incorrect DSP clock when re-routing a ChannelGroup + immediately after adding DSPs to it. +* Profiler - Fixed nodes appearing to overlap each other if multiple outputs were + involved. +* Core API - PS4 - Fixed unnecessary file reads when playing an AT9 stream. + +27/06/14 1.04.02 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed incorrect virtualization of events that have more than + one 3D position dependent effect. +* Studio API - Studio::EventDescription::getInstanceList, + Studio::Bank::getEventList, Studio::Bank::getMixerStripList + and Studio::System::getBankList now accept a capacity of 0. +* Core API - Fixed a race condition that could lead to DSP graph changes not + being handled correctly. +* Core API - Linux - Fixed "spurious thread death event" messages appearing + when attached with GDB. +* Core API - Linux - Fixed internal PulseAudio assert if System::getNumDrivers + or System::getDriverInfo is used before System::init. +* Core API - Linux - Fixed ALSA not using correct default driver in some cases. +* Core API - Send levels set before connecting the Return DSP are now + applied immediately rather than fading in over a short time. + +19/06/14 1.04.01 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added event playback states FMOD_STUDIO_PLAYBACK_STARTING + and FMOD_STUDIO_PLAYBACK_STOPPING. + FMOD_STUDIO_PLAYBACK_STARTING will be returned after + Studio::EventInstance::start until the event + actually starts. FMOD_STUDIO_PLAYBACK_STOPPING will + be returned after Studio::EventInstance::stop until + the event actually stops. +* Core API - PS4 - Added support for background music that cannot be broadcast. + +Fixes: +* Studio API - Fixed playlist module upmixing to system speakermode when playing + multiple overlapping sounds. +* Core API - Fix streams opened with FMOD_NONBLOCKING from playing at the + incorrect position if they go virtual shortly after setPosition + is called. +* Core API - Fix EOF detection in file system causing rare extra file read past + end of file. +* Core API - Fix some FMOD_CREATECOMPRESSEDSOUND based samples finishing early + if they were playing back at a low sample rate. +* Core API - Fix a bug where DSP nodes could get stuck in an inactive state + after setting pitch to 0. + +11/06/14 1.04.00 - Studio API minor release +---------------------------------------------------- + +Important: +* Added PS3 platform support. +* Added WiiU platform support using SDK 2.10.04. +* Added Linux platform support. +* Added Windows Phone 8.1 platform support. +* FMOD_HARDWARE and FMOD_SOFTWARE flags have been removed. All voices are software + mixed in FMOD Studio. + +Features: +* Studio API - Added Studio::System::getSoundInfo for accessing sound table entries +* Studio API - Added Studio::EventInstance::setProperty, + Studio::EventInstance::getProperty and + FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY +* Studio API - Added doppler effect support +* Studio API - Added libfmodstudio.a import library for MinGW/Cygwin. + C API only, C++ linking not supported. +* Core API - Improved DSP mixing performance by about 30% +* Core API - Added new System callback type FMOD_SYSTEM_CALLBACK_THREADDESTROYED. +* Core API - System::attachChannelGroupToPort now has an argument to allow + signal to be passed to main mix. + +Fixes: +* Studio API - Fixed nested events never ending if they have a parameter with + non-zero seek speed. +* Studio API - Fixed AHDSR modulation on snapshot intensity +* Core API - Fixed incorrect fader interpolation when reparenting channels + with propagate clocks. +* Core API - Win - Fixed several issues with ASIO playback. +* Core API - Android - Fixed audio corruption on devices without NEON support. +* Core API - Fixed FMOD_CREATESOUNDEXINFO.length being handled incorrectly for + memory sounds. This length represents the amount of data to access + starting at the specified fileoffset. +* Core API - Fix truncated FSB causing zero length subsounds, now returns + FMOD_ERR_FILE_BAD + +Notes: +* Core API - Renamed C# wrapper SYSTEM_CALLBACKTYPE to SYSTEM_CALLBACK_TYPE + so it matches the C++ API. +* Core API - Renamed MinGW/Cygwin import library to libfmod.a +* Studio API - Deprecated C# wrapper functions Studio.Factory.System_Create + and Studio.System.init have been removed. + Use Studio.System.create and Studio.System.initialize instead. +* Studio API - Deprecated function Studio::EventInstance::getLoadingState has + been removed. + Use Studio::EventDescription::getSampleLoadingState instead. +* Studio API - FMOD_STUDIO_EVENT_CALLBACK now takes an + FMOD_STUDIO_EVENTINSTANCE* parameter. +* Xbox One - Now built with June 2014 XDK. + +29/05/14 1.03.09 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed truncation error when loading sample data from bank + opened with Studio::System::loadBankMemory. +* Studio API - Fixed numerical error when blending multiple snapshots with + zero intensity. +* Studio API - Fixed incorrect pitch when an instrument has a non-zero base + pitch combined with pitch automation or modulation. +* Core API - Xbox One - Fixed potential seeking inaccuracies with XMA sounds. +* Core API - Fix occasional audio pops when starting a channel or channel group. +* Core API - Fix crash when running out of memory during channel group creation. +* Core API - Fixed the C# wrapper for Sound.setDefaults and Sound.getDefaults. + +Notes: +* Studio API - C# wrapper now takes care of setting the + FMOD_STUDIO_ADVANCEDSETTINGS.cbSize and + FMOD_STUDIO_BANK_INFO.size fields. +* Core API - C# wrapper now takes care of setting the + FMOD_ADVANCEDSETTINGS.cbSize and + FMOD_CREATESOUNDEXINFO.cbsize fields. +* PS Vita - Now built with SDK 3.150.021. + +21/05/14 1.03.08 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Add FMOD_INIT_ASYNCREAD_FAST and FMOD_ASYNCREADINFO.done + method, to improve performance of asyncread callback + significantly. Instead of setting 'result', call 'done' + function pointer instead. +* Core API - Multiple channel groups can now be attached to the same output port. +* Core API - PS4 - Minor performance improvements in AT9 decoding using new SDK + features. + +Fixes: +* Core API - Windows Store - Fixed networking issues. +* Core API - Windows Store - Fixed System::getRecordDriverInfo() returning + incorrect number of channels. +* Core API - Fix System::setFileSystem asyncread callback not setting priority + values properly. +* Core API - Releasing a channel group attached to an auxiliary output port now + cleans up resources correctly. +* Core API - Channel groups attached to an auxiliary output port can now be + added as children of other channel groups. +* Core API - Fix DSPConnection::setMix() not being applied properly. +* Core API - PS Vita - Fixed potential crash during System::init if any output + related pre-init APIs are used, such as System::getNumDrivers. +* Core API - PS Vita - Fixed crash if an attempt is made to load AT9 FSBs as + a compressed sample, for PS Vita this is a streaming only format. +* Core API - Xbox One - Small improvement to XMA performance. +* Core API - Fixed the C# wrapper for System.playDSP. +* Core API - Fixed potential crash on ARM platforms when loading an FSB. + +Notes: +* PS4 - Now built with SDK 1.700. +* Android - Now built with NDK r9d. + +08/05/14 1.03.07 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Improved performance for projects with many events. +* Studio API - Improved memory usage for projects with many bus instances. +* Studio API - Added Studio::System::setCallback, Studio::System::setUserData + and Studio::System::getUserData. +* Core API - Added gapless_playback example for scheduling/setDelay usage. +* Core API - Improved performance of logging build. +* Core API - Added FMOD_SYSTEM_CALLBACK_MIDMIX callback. + +Fixes: +* Studio API - Fixed AHDSR Release not working when timelocked sounds are + stopped by a parameter condition. +* Studio API - Removed some unnecessary file seeks. +* Studio API - Fixed AHDSR Release resetting to Sustain value when instruments + with limited Max Voices are stopped repeatedly. +* Studio API - Fixed channels within paused events not going virtual. +* Studio API - Fixed AHDSR Release not working inside nested events +* Core API - Fixed downmixing to a quad speaker setup. +* Core API - Fixed fsb peak volume levels on big endian platforms. +* Core API - Fixed paused channels not going virtual. + +17/04/14 1.03.06 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Improved performance of automation and modulation + +Fixes: +* Studio API - Fixed crash when creating new automation via LiveUpdate +* Studio API - Fixed possible internal error being returned from + Studio::Bank::getSampleLoadingState when called on an + unloading bank. + +14/04/14 1.03.05 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Added ChannelControl to the C# wrapper to match the C++ API. +* Core API - Fixed the definition of ChannelControl.setDelay and + ChannelControl.getDelay in the C# wrapper. +* Core API - Replaced broken C# wrapper System.set3DSpeakerPosition and + System.get3DSpeakerPosition functions with + System.setSpeakerPosition and System.getSpeakerPosition. +* Core API - Fixed the capitalization of DSP.setMeteringEnabled, + DSP.getMeteringEnabled and DSP.getMeteringInfo in the C# + wrapper. +* Core API - Xbox 360 - Fix hang on XMA playback +* Core API - Fix crash when running out of memory loading an ogg vorbis + file. +* Core API - Fix symbol collisions when statically linking both FMOD + and Xiph libvorbis or libtremor. + +08/04/14 1.03.04 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Studio::EventInstance::start now does a full restart of the + event if already playing. Restarting events will trigger the + FMOD_STUDIO_EVENT_CALLBACK_RESTARTED callback type. +* Studio API - Added Studio::MixerStrip::setMute, and Studio::MixerStrip::getMute + for muting buses. +* Studio API - Added Studio::System::getBufferUsage and + Studio::System::resetBufferUsage for querying command and handle + buffer size usage. +* Core API - System::createSound and System::createStream now faster due to + file extension check and immediate prioritization of the relevant + codec, before scanning rest of codec types. +* Core API - Paused channels now have an effective audibility of 0 and + will go virtual if FMOD_INIT_VOL0_BECOMES_VIRTUAL is enabled. + +Fixes: +* Studio API - Added Studio.System.initialize to the C# wrapper to match the C++ API + (replacing Studio.System.init, which is now deprecated). +* Studio API - Added Studio.System.create to the C# wrapper to match the C++ API + (replacing Studio.Factory.System_Create, which is now deprecated). +* Studio API - Added missing functions to the C# wrapper: + Studio.EventInstance.get3DAttributes, + Studio.EventInstance.isVirtual, + Studio.EventInstance.setUserData, + Studio.EventInstance.getUserData, + Studio.MixerStrip.getChannelGroup, + Studio.EventDescription.getUserProperty, + Studio.EventDescription.getUserPropertyCount, + Studio.EventDescription.getUserPropertyByIndex, + Studio.EventDescription.setUserData, + Studio.EventDescription.getUserData and + Studio.System.loadBankCustom. +* Core API - Fix for VBR sounds that dont use FMOD_CREATECOMPRESSEDSAMPLE + and FMOD_ACCURATETIME not looping when FMOD_LOOP_NORMAL was set. +* Core API - XboxOne - Fixed rare mixer hang when playing XMA as a compressed + sample. +* Core API - Fix crash with combination of FMOD_OPENUSER + FMOD_NONBLOCKING and + a null pointer being passed to System::createSound/createStream. + +Notes: +* Added examples to the Programmer API documentation. +* Xbox One - Now built with March 2014 QFE1 XDK. +* Studio API - In the C# wrapper, Studio.System.init is now deprecated in favour of + Studio.System.initialize. +* Studio API - In the C# wrapper, Studio.Factory.System_Create is now deprecated in + favour of Studio.System.create. +* Studio API - Studio::EventDescription::is3D now returns true if any of its nested + events are 3D. +* Core API - FMOD_CREATESOUNDEXINFO.suggestedsoundtype now tries the suggested + type first, then tries the rest of the codecs later if that fails, + rather than returning FMOD_ERR_FORMAT. +* Core API - Custom codecs. The open callback for a user created codec plugin + now does not have to seek to 0 with the file function pointer before + doing a read. + +28/03/14 1.03.03 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed Studio::EventDescription::getInstanceCount and + Studio::EventDescription::getInstanceList incorrectly providing + data for all events in the bank, not just the queried event. +* Studio API - Added Studio::EventDescription::loadSampleData, + Studio::EventDescription::unloadSampleData and + Studio::EventDescription::getSampleLoadingState to C# wrapper. + +26/03/14 1.03.02 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added Studio::EventDescription::loadSampleData, + Studio::EventDescription::unloadSampleData and + Studio::EventDescription::getSampleLoadingState functions. +* Core API - Added FMOD_ChannelGroup_IsPlaying to C API. + +Fixes: +* Studio API - Fix for setting parameter values that could cause volume + changes without the appropriate volume ramp. +* Core API - Fix for some incorrect declarations in the C header files. +* Core API - Fixed a linker error when calling some C API functions. +* Core API - Fixed FMOD_ChannelGroup_AddGroup not returning the DSP + connection on success. +* Core API - PS4 - Fixed FMOD macros for declaring plugin functions. + +Notes: +* Studio API - Studio::EventInstance::getLoadingState is now deprecated in + favour of Studio::EventDescription::getSampleLoadingState. + +18/03/14 1.03.01 - Studio API patch release +--------------------------------------------------- + +Important: +* Core API - Blocking commands are not allowed to be called from the + non-blocking callback. Attempting to do so will log an error + and return FMOD_ERR_INVALID_THREAD. See FMOD_SOUND_NONBLOCK_CALLBACK + for more information. + +Fixes: +* Studio API - Fixed simple nested events not terminating properly when inside + multi sounds +* Core API - Fix SRS downmix crash on startup if software mixer was set to 5.1, + and the OS was set to stereo, and the system sample rate was not + 44/48/96khz +* Core API - Fix for deadlock that could occur when executing commands in the + non-blocking callback as another thread is releasing sounds. +* Core API - Fix for Channel::getPosition and ChannelControl::getDSPClock + returning errors when called on emulated channels created with + System::playDSP. +* Core API - PS4 - Fixed leak of audio output handles on shutdown. +* Core API - Fix crash in compressor when placed on a channel with a delay. + +Notes: +* PS4 - Now built with SDK 1.600.071. + +03/03/14 1.03.00 - Studio API minor release +---------------------------------------------------- + +Important: +* Added PS Vita platform support. +* Updated FMOD Studio Programmers API documentation. +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT +* Studio API - Studio API is now asynchronous by default, with the processing + occuring on a new Studio thread. Asynchronous behaviour can be + disabled with the FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE init flag. +* Studio API - Studio API classes are now all referenced as pointers. This + reflects a change in the handle system to make it thread-safe, + more performant and match the C and Core API interface. +* Studio API - Event and mixer strip paths now include a prefix in order to + guarantee uniqueness. See Studio::System::lookupID. +* Core API - Core API is now thread-safe by default. Thread safety can be + disabled with the FMOD_INIT_THREAD_UNSAFE init flag. +* Core API - Codecs must set waveformatversion to FMOD_CODEC_WAVEFORMAT_VERSION + in the FMOD_CODEC_OPEN_CALLBACK. +* Core API - Removed support for digital CD audio + +Features: +* Studio API - The new .bank file format provides improved support for backward + and forward compatibility. Future version updates will not + generally require banks to be rebuilt. +* Studio API - Added support for events duplicated across banks. +* Studio API - Added support for transition marker and loop region probability. +* Studio API - Added support for sounds on transition timelines. +* Studio API - Added asset enumeration functions: Studio::System::getBankCount, + Studio::System::getBankList, Studio::Bank::getEventCount, + Studio::Bank::getEventList, Studio::Bank::getMixerStripCount, + Studio::Bank::getMixerStripList. +* Studio API - Added path retrieval functions: Studio::System::lookupPath, + Studio::EventDescription::getPath, Studio::MixerStrip::getPath, + Studio::Bank::getPath. +* Studio API - Bank loading now takes an extra flags argument. It is possible + to load banks in non-blocking mode in which case the function + will return while the bank is still in the process of loading. +* Studio API - Added Studio::System::setAdvancedSettings. +* Studio API - Added Studio::System::getCPUUsage. +* Studio API - Studio repositories have improved performance and no longer depend + on the standard library map. +* Core API - The system callback now includes the error callback type which + will be invoked whenever a public FMOD function returns a result + which is not FMOD_OK. +* Core API - Optimize Sound::getNumSyncPoints when using large FSB files with + many subsounds and many syncpoints. +* Core API - Made improvements to virtual voices for DSP graphs using sends, + returns, fade points, and sounds with varying peak volumes. +* Core API - PS4 - Added recording support. +* Core API - XBox One - Added dll loading support. +* FSBank API - Added support for exporting peak volume per sound using the + FSBANK_BUILD_WRITEPEAKVOLUME flag. + +Fixes: +* Core API - Channels now take fade points into account for virtualisation +* Core API - Fixed pops when changing Echo DSP Delay parameter +* Core API - Xbox One - Removed a CPU spike when first playing a compressed + sample XMA. + +Notes: +* Studio API - Replaced Studio::System::lookupEventID and Studio::System::lookupBusID + with Studio::System::lookupID. +* Core API - The system callback now has an extra userdata argument that matches + the userdata specified in System::setUserData. +* Core API - Xbox One - APU allocations are now handled internally for developers + using memory callbacks or memory pools. + +24/02/14 1.02.13 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Removed stalls when removing a DSP chain from a channel +* Core API - Fixed Channel::getPosition returning incorrect value for streams + with very short loops. +* Core API - Fixed rare bug with DSP nodes not being set active in the mixer graph. +* Core API - Fixed rare bug with DSP metering not being set. +* Core API - Fixed incorrect playback of multi-channel PCM8 data. +* Core API - PS4 - Fixed issues with calling ChannelControl::setPosition on AT9 + streams and compressed samples. +* Core API - PS4 - Fixed audio glitches when using the background music port and + the system format is not 7.1 +* Core API - PS4 - Added loading of plugins from PRX files. +* Core API - Android - Fixed crash on low quality Vorbis encoded FSBs. +* Core API - Android - Fixed one time memory leak on System::release when using + OpenSL output mode. +* Studio API - Fixed playlist instruments occasionally cutting off too early. +* Studio API - Fixed rare timing issue that caused spawning instruments to trigger + too early. + +Notes: +* Xbox One - Now built with August QFE11 XDK. +* PS4 - Now built with SDK 1.600.051. + +07/01/14 1.02.12 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Fixed potential crash with net streams. +* Core API - PS4 - Fixed rare internal error in AT9 codec when channels are + reused after stopping. +* Studio API - Fixed nested events getting incorrect 3D position information + +17/12/13 1.02.11 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Added ChannelControl::setVolumeRamp and ChannelControl::getVolumeRamp + to control whether channels automatically ramp their volume changes. +* Studio API - Added FMOD_STUDIO_EVENT_CALLBACK_IDLE callback type, fired + when an event instance enters the idle state. + +Fixes: +* Studio API - Fixed FMOD_STUDIO_EVENT_CALLBACK_STOPPED callback firing when + an event instance is already stopped. +* Studio API - Fixed Studio::EventInstance::getCueCount returning 1 even on events + with no sustain points. +* Core API - Fixed ChannelControl::setDelay rarely being ignored. + +Notes: +* Core API - PCM data will now be read the main data in a single read instead + of breaking the reads up into 16kb chunks. +* Studio API - Changed behavior of Studio::EventInstance::getCue to return + FMOD_ERR_EVENT_NOTFOUND if the event has no sustain points. + +02/12/13 1.02.10 - Studio API patch release +---------------------------------------------------- + +Important: +* Core API - Updated the C ChannelGroup functions to take 64 bit integer argument. + +Fixes: +* Core API - Fix FMOD_SPEAKERMODE_SURROUND upmixing to 5.1 or 7.1 incorrectly, + ie surround left mixing into LFE and surround right into surround + right. +* Core API - PS4 - Fix playback of background music when system software format + is not 7.1. + +26/11/13 1.02.09 - Studio API patch release +---------------------------------------------------- + +Notes: +* PS4 - Now built with SDK 1.500.111 + +19/11/13 1.02.08 - Studio API patch release +---------------------------------------------------- + +Important: +* Core API - DSP clock now uses 64 bit integers. The following functions have + been modified to accept a 64 bit integer argument: ChannelControl::getDSPClock, + ChannelControl::setDelay, ChannelControl::getDelay, ChannelControl::addFadePoint, + ChannelControl::removeFadePoints, ChannelControl::getFadePoints. + +Features: +* Studio API - Added setParameterValue and setParameterValueByIndex functions in + eventInstance to wrap finding and then setting a parameter value. + +Fixes: +* Core API - Fixed positioning of 5.1 surround speakers when soundcard is + set to other surround formats +* Core API - Fixed excessive log spam making the logging version much slower +* Core API - Xbox One - Fixed rare XMA codec hang which could also manifest as + FMOD_ERR_INTERNAL. +* Core API - PS4 - Fixed crash when assigning a channel group to the controller speaker. +* Studio API - Fixed MixerStrip release not working when the user has multiple + handles to the same strip +* Studio API - Fixed pops when playing nested events that have silent tracks +* Studio API - Fixed crash when shutting down with profiler connected. +* Studio API - Fixed unused streams being created during event preloading + +Notes: +* Core API - Turned off optimization for user created DSP effects that do not call the read + callback if no sound is coming in. read callbacks will now always fire + regardless. 'shouldiprocess' callback can be defined to optimize out no input. + +12/11/13 1.02.07 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - iOS - Fixed streams returning FMOD_ERR_INTERNAL on ARM64 devices. +* Core API - iOS - Fixed automatic interruption handling not working for ARM64 + devices. +* Core API - Fix possible crash on startup, if using 5.1 mixing on a + stereo output (downmixer enabled). +* Core API - Fix setMute on master channelgroup not working. +* Studio API - Fixed AHDSR modulators starting at the wrong value when + attack time is 0 +* Studio API - Fixed Multi Sounds and Scatterer Sounds not randomizing + correctly after deleting all entries + +06/11/13 1.02.06 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - iOS - Added support for ARM64 devices and x86_64 simulator. + +Fixes: +* Studio API - Fix playback issues after running for more than 12 hours +* Core API - Fixed net streaming truncating or repeatings parts of the end + of a netstream. +* Core API - Fix crash due to missing functions in kernel32.dll on Windows XP. + +29/10/13 1.02.05 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Improved performance of Studio::System::setListenerAttributes +* Studio API - FMOD profiler can now show Studio Bus and Event instances in + the DSP node graph. + +Fixes: +* Studio API - Fixed pan jittering on events that move with the listener + +22/10/13 1.02.04 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added ability to continue loading banks when missing plugins. +* Studio API - Added FMOD_STUDIO_PARAMETER_TYPE enum to describe the type of a + parameter to FMOD_STUDIO_PARAMETER_DESCRIPTION. +* Core API - Added function to get parent sound from a subsound. +* Core API - Android - Added support for dynamic plugins. + +Fixes: +* Studio API - Trying to set an automatic parameter will return FMOD_ERR_INVALID_PARAM. +* Core API - Fix restarting a channel corrupting fader and panner positions + if effects are added. +* Core API - Fix channel restarting if 1. sound ended, 2. Channel::setVolume(0) + with FMOD_VOL0BECOMESVIRTUAL happened, 3. setVolume(>0) happened, + in between 2 system updates. +* Core API - Fixed issues on PS4 after opening an output audio port fails. +* Core API - Calling playSound on a fsb loaded with createStream will now + return FMOD_ERR_SUBSOUND. + +15/10/13 1.02.03 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - iOS - Fixed potential crash when stopping virtual channels. +* Studio API - Fixed click with cross-fade for nested events +* Studio API - Mac - Fixed link issues from certain API functions. + +Notes: +* Studio API - FMOD_Studio_System_Create now takes a headerVersion parameter + to match the C++ API + +07/10/13 1.02.02 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Fixed rare crash when using virtual voices. +* Core API - Fixed channel fade state not being preserved when switching to virtual. +* Core API - Fixed 5.1 and 7.1 downmix to stereo being off-center. +* Core API - Mac - Fixed incorrect downmix logic causing excess channels to + be dropped. + +Notes: +* Core API - changed FMOD_DSP_LIMITER_MODE parameter to bool + +01/10/13 1.02.01 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Improved performance of compressor on X86/x64 platforms. +* Studio API - Added support for new automatic parameters: Event Orientation, + Direction, Elevation and Listener Orientation + +Fixes: +* Core API - Fixed crash when downmixing to 16-bit output. +* Core API - Fixed floating point issue when setting very low pitch values. +* Studio API - Fixed sound glitch that could occur after crossfade. +* Studio API - Fix for assert when rescheduling with modified pitch. + +Notes: +* iOS - Now built with SDK 7.0. +* Mac - Now built with SDK 10.8. + +23/09/13 1.02.00 - Studio API minor release +---------------------------------------------------- + +Important: +* Added Android platform support. + +Features: +* Core API - Added FMOD_CREATESOUNDEXINFO.fileuserdata to hold user data + that will be passed into all file callbacks for the sound +* Core API - Added System::mixerSuspend and System::mixerResume for mobile + platforms to allow FMOD to be suspended when interrupted or + operating in the background. +* Core API - Added float parameter mappings support to plug-ins +* Core API - PS4 - Added Output Ports example +* Studio API - Reduced memory overhead for several core types. +* Studio API - Added Studio::System::loadBankMemory to support loading banks + from a memory buffer +* Studio API - Added Studio::System::loadBankCustom to support loading banks + using bank-specific custom file callbacks +* Studio API - Added support for placing multiple tempo markers on a timeline. +* Studio API - Better error reporting for instruments scheduled in the past. + +Fixes: +* Core API - Fix incorrect error codes being returned by C# wrapper. +* Core API - Fix bug in stereo-to-surround and surround-to-surround panning +* Core API - Fix System::playDSP not working +* Core API - Fix rare crash with DSPConnection::setMixMatrix. Studio API + could also be affected. +* Core API - Fix getMeteringInfo not clearing its values when pausing. +* Core API - Fix audio pops when restarting sounds due to downmixing. +* Core API - PS4 - Fix crash when disconnecting a channel group from an output + port. +* Core API - PS4 - Fix issue with audio channels not finishing correctly when + being played through a port. +* Core API - Xbox One - Fixed 'clicking' when a realtime decoded XMA sample + loops if adjusting pitch during playback. +* Studio API - Fix event priority not working +* Studio API - Fix Studio::EventInstance::start() returning incorrect result with + non-blocking sounds. +* Studio API - Fix memory leaks when loading corrupt banks +* Studio API - Fix channels leaking with nested instruments +* Studio API - Fix MixerStrip::setFaderLevel on the game side affecting volume + levels in the tool when connected via Live Update +* Studio API - Fix a potential crash when getting a string property with + Studio::EventDescription::getUserPropertyByIndex + +Notes: +* Studio API - Renamed Studio::System::loadBank to Studio::System::loadBankFile +* Studio API - Updated the API examples to use the new example project +* Core API - Changed FMOD_FILE_OPEN_CALLBACK userdata parameter from void** + to void* (it now comes from FMOD_CREATESOUNDEXINFO.fileuserdata + rather than being set by the open callback) +* Core API - iOS - Removed automatic handling of interruptions. Developers + should call the new System::mixerSuspend / + System::mixerResume API from their interruption handler. +* Core API - iOS - Removed all usage of AudioSession API, developers are + now encouraged to use the platform native APIs as there + is no possible conflict with FMOD. +* PS4 - Now built with SDK 1.020.041. + +02/09/13 1.01.15 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Performance optimizations. +* Studio API - Performance optimizations. + +Fixes: +* Core API - Fix oscillators not changing pitch if System::playDSP was used. +* Core API - Fix crash when setting 0 or invalid pitch. +* Studio API - Fix for some allocations not propagating FMOD_ERR_MEMORY errors. +* Studio API - Fix for memory leak when failing to load a bank. + +26/08/13 1.01.14 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Fix crash if adding an FMOD_DSP_TYPE_FADER dsp to a channelgroup. +* Core API - Xbox One - Internal WASAPI (mmdevapi.dll) threads will now have + their affinity set to match the FMOD feeder thread. + +Notes: +* Xbox One - Now built with August XDK. + +19/08/13 1.01.13 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Global mixer strips will now be automatically cleaned up when + when the events routed into them complete. + +* Studio API - Improved performance of Studio::System::Update by removing stalls + waiting on the mixer the complete. + +Fixes: +* Core API - Channel::setPitch() now returns an error if a NaN is passed in. + Fixes crashes occuring later in the mixer thread. +* Studio API - Fixed sustain points at the start of the timeline not working +* Studio API - Fixed sustain point keyoff incorrectly being ignored if the + cursor is not currently sustaining +* Studio API - Fixed sustain point keyoff incorrectly skipping sustain points + repeatedly when looping + +Notes: +* Studio API - Changed behavior of Studio::EventInstance::getCue to return + FMOD_ERR_INVALID_PARAM if the event contains no sustain points. + +12/08/13 1.01.12 - Studio API patch release +---------------------------------------------------- + +Features: +* Added FMOD SoundBank Generator tool for creating .fsb files. Both a GUI version + (fsbank.exe) and a command line version (fsbankcl.exe) are provided. + +Fixes: +* Core API - Fix FSB Vorbis seek table containing an invalid entry at the end. +* Core API - Fix cpu stall when using System::playDSP. Also if using + oscillator in studio. +* Core API - Xbox One - Fixed rare crash on System::init when using WASAPI. + +05/08/13 1.01.11 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed resource leak. +* Studio API - Fixed a crash when releasing an event instance with sub events. +* Core API - Fixed FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED not being + passed to the application. +* Core API - PS4 - Fix crashes caused by out-of-memory conditions. + FMOD_ERR_MEMORY is now returned correctly. +* Core API - Xbox One - Fixed race condition that causes a hang when playing + compressed XMA samples and streams at the same time. +* Core API - Xbox One - Fixed leak of SHAPE contexts that would cause + createSound to fail if playing and releasing lots of + XMA streams. +* Core API - Xbox One & Win - Fixed surrounds and rears being swapped in 7.1. + +29/07/13 1.01.10 - Studio API patch release +---------------------------------------------------- + +Important: +* Studio API - Changed .bank file format - API is backward compatible but must + be upgraded for compatibility with Studio tool 1.01.10 or newer. + +Fixes: +* Studio API - Fixed plugin effect sounds not working in game. +* Studio API - Fixed a crash in Studio::System::update after calling + Studio::EventDescription::releaseAllInstances +* Studio API - Fixed sustain points at the start of the timeline not working +* Studio API - Fixed sustain point keyoff incorrectly being ignored if the + cursor is not currently sustaining +* Studio API - Fixed sustain point keyoff incorrectly skipping sustain points + repeatedly when looping +* Studio API - Fixed a crash when unloading a bank that contains a nested + event that is currently playing +* Studio API - Fixed Studio::System::update sometimes failing with FMOD_ERR_INTERNAL + and leaving the system in an inconsistent state +* Core API - Xbox One - Fixed FMOD_CREATECOMPRESSEDSAMPLE XMA playback issues. + +Notes: +* Studio API - Changed behavior of Studio::EventInstance::getCue to return + FMOD_ERR_INVALID_PARAM if the event contains no sustain points. + +22/07/13 1.01.09 - Studio API patch release +---------------------------------------------------- + +Important: +* Core API - Fixed rare crash in mixer. + +Features: +* Studio API - Fixed spawning sounds not playing at correct 3D position. +* Studio API - Fixed 40ms of latency getting added for each layer of event + sound nesting. +* Core API - Optimized mixer by about 30% in some configurations. + +Fixes: +* Core API - Remove FMOD_CHANNELCONTROL union, used in ChannelControl type + callbacks, as it was incorrect and using it as a union would + have lead to corruption/crash. A simple opaque + FMOD_CHANNELCONTROL type is now used for callbacks, and the + user should just cast to the relevant channel or channelgroup + type. +* Core API - Fixed fade point interpolation on channels with pitch. +* Core API - Fixed race condition when channels were reused after stopping. +* Core API - Xbox One - Fixed hang for short (2KB) XMA files. +* Core API - Xbox One - Fixed incorrect seek offset for XMA files. +* Core API - PS4 - Added support for AT9 streams with greater than 2 channels. +* Studio API - PS4 - Fixed crash when Handle derived classes went out of scope after + the dynamic lib was unloaded + +Notes: +* PS4 - Now built with SDK 1.0. + +15/07/13 1.01.08 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added Studio::EventDescription::getMinimumDistance +* Studio API - Added Studio::EventDescription::isStream + +Fixes: +* Core API - Fixed crash / corruption from DSP Fader/Panner objects. +* Core API - Fixed mod/s3m/xm/mid playback. +* Studio API - Fixed Studio::EventDescription::isOneshot() incorrectly returning true + for an event that has a loop on the logic track. +* Linux - Fixed crash on playback of certain CELT streams. +* Xbox One - Fixed potential hangs with compressed XMA samples. +* Xbox One - Fixed potential silence if XMA sample rate was not one of 24K, 32K, + 44.1K or 48K. + +10/07/13 1.01.07 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Fix "Sample Rate Change" tag from passing through 0 rate when + EOF was hit on certain MP3 files. +* Core API - Fix crash when using FMOD_CREATECOMPRESSEDSAMPLE introduced in + 1.01.06 +* Core API - iOS - Fixed crash when using DSP Echo. +* Core API - iOS - Fixed crash in mixer due to misaligned buffers. + +08/07/13 1.01.06 - Studio API patch release +---------------------------------------------------- + +Features: +* XboxOne - Officially added support for XMA. Please note this requires the July + XDK to avoid a hang. +* Studio API - Added Studio::ParameterInstance::getDescription +* Studio API - Added EventDescription getParameter, getParameterCount and + getParameterByIndex functions + +Fixes: +* Fix Sound userdata being overwritten when FMOD_SOUND_NONBLOCKCALLBACK was + called for a 2nd or more time. +* Core API - Fix rare crash in mixer when releasing a ChannelGroup +* Core API - Fix 3D Panner DSPs and Studio Event 3d volumes not being + considered by virtual voice system. +* Core API - Fixed compressor sounding erratic and unresponsive +* Studio API - Fixed clicks when a Studio::ParameterInstance::setValue call causes + sounds to be cut off + +Notes: +* XboxOne - Now built with July XDK. +* Core API - Changed FMOD_DSP_TYPE_PAN FMOD_DSP_PAN_STEREO_POSITION + parameter to go from -100 to 100. +* Core API - Changed FMOD_DSP_TYPE_COMPRESSOR FMOD_DSP_COMPRESSOR_ATTACK + parameter to go from 0.1 to 500ms. + +28/06/13 1.01.05 - Studio API patch release +---------------------------------------------------- + +Important: +* Core API - Changed .fsb file format - ALL BANKS MUST BE REBUILT +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT + +Features: +* Studio API - Added Studio::System::unloadAll function + +Fixes: +* Core API - PS4 - Improved AT9 decoding performance, fixed issue with + when a sound has loop points not aligned to frame size, + fixed seamless looping playback glitches. +* Core API - Fixed bug that was causing virtual channels to stop prematurely. +* Core API - Fixed fade points leaking when channels go virtual. + +Notes: +* Studio API - Effect data parameter buffers are now 16-byte aligned + (128-byte aligned on PS3) +* Studio API - Added automatic header version verification to + Studio::System::create + +19/06/13 1.01.04 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Fix rare crash with Fader DSP unit. +* Studio API - Fixed some effects causing events to not stop correctly +* Studio API - Fixed multiple concurrent playbacks of one event sometimes + failing with FMOD_ERR_SUBSOUNDS returned from Studio::System::update + +Notes: +* Studio API - Changed Studio::EventInstance::getTimelinePosition to const +* PS4 - Now built with SDK 0.990.020. + +07/06/13 1.01.03 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Optimized mixer when pausing or delaying nodes. Should + provide significant speed increase for Studio runtime + projects. +* Core API - Add FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN. + +Fixes: +* Core API - Fixed silence in certain DSP configurations. +* Core API - Fixed virtual channels not stopping correctly when a parent + channelgroup stops due to an end delay +* Core API - Fixed virtual channels not cleaning up fade points correctly +* Core API - Fixed fade points being ignored when channels go from virtual + to non-virtual +* Studio API - Fixed crash when playing a multisound after unloading and + reloading it's bank. +* Studio API - Implemented Studio::Bank::loadSampleData, Studio::Bank::unloadSampleData and + Studio::Bank::getSampleLoadingState (they previously did nothing) +* Studio API - Fixed crashes and unexpected behavior with sidechains when they + are connected to multiple compressors. +* Studio API - Fixed a linker error when calling handle assignment operators +* Studio API - Fixed a crash in the game when adding a sound to an event + while connected via Live Update + +Notes: +* Core API - Specific parameter description structures like + FMOD_DSP_PARAMETER_DESC_FLOAT no longer inherit from + FMOD_DSP_PARAMETER_DESC; instead, FMOD_DSP_PARAMETER_DESC + includes a union of all the specific structures with + floatdesc, intdesc, booldesc and datadesc members. + The FMOD_DSP_INIT_PARAMDESC_xxxx macros have been updated + to reflect this. +* PS4 - Now built with SDK 0.930.060. + +31/05/13 1.01.02 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed getMixerStrip not returning a valid handle when + retrieving a VCA. + +30/05/13 1.01.01 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Core API - Fix rare crash in DSPFader. +* Studio API - Studio::EventInstance::getParameter and Studio::EventInstance::getCue now use + case-insensitive name comparison + +Notes: +* Studio API - Renamed Studio::EventInstance::getNumCues to Studio::EventInstance::getCueCount + +27/05/13 1.01.00 - Studio API minor release +---------------------------------------------------- + +Important: +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT + +Features: +* PS4 - Added support for mono and stereo AT9 FSBs. +* Core API - Optimized mixer by about 10% +* Core API - Added 'sends' which is a special type of DSPConnection that + does not try and execute the input, the output (return) just + consumes what was generated by the input (the send). See + FMOD_DSPCONNECTION_TYPE_SEND +* Core API - Added DSP::getIdle. Very useful for seeing if a signal is + still running to a DSP unit. +* Core API - Added FadePoint API - now arbitrary volume ramps can be set + anywhere on the timeline. ChannelControl::SetDelay removes + ramp in/ramp out in favour of this. See + ChannelControl::addFadePoint/removeFadePointsgetFadePoints. +* Studio API - Added Studio::EventInstance::setTimelinePosition and + Studio::EventInstance::getTimelinePosition +* Studio API - Disconnect stopped events from the DSP graph to reduce CPU usage +* Core API - removed 'sidechain' API, added FMOD_DSPCONNECTION_TYPE which is now + a parameter to DSP::addInput. FMOD_DSPCONNECTION_TYPE_STANDARD, + FMOD_DSPCONNECTION_TYPE_SIDECHAIN, and FMOD_DSPCONNECTION_TYPE_SEND + are now supported. DSPConnection::getType replaces DSPConnection::isSideChain + +Fixes: +* Core API - Fixed FSB Vorbis not working with encryption key enabled. +* Core API - Fixed virtual voices not respecting ChannelControl::setDelay +* Core API - Fixed parameter index validation when getting/setting DSP parameters. +* Core API - Fixed reverb not always idling when it should. +* Core API - Fixed bug with loop count being incorrectly set to infinite +* Core API - Optimised Echo DSP effect on x86/x64 architectures +* Core API - Fixed ChannelControl::set3DLevel, ChannelControl::set3DSpeakerSpread + and stereo 3d sounds not working +* Core API - Fixed flange effect not updating 'rate' parameter if the rate was + set before adding it to a channel or channelgroup or system object. +* Core API - PS4 - Added support for music, voice, personal device and pad speaker routing. + See System::AttachChannelGroupToPort and fmod_ps4.h +* Core API - PS4 - Added dynamic linking option. +* Studio API - Fixed stop/release behaviour of event instances containing logic markers. +* Studio API - Fixed memory corruption in Studio::System::release +* Studio API - Fixed FMOD_STUDIO_STOP_ALLOWFADEOUT cutting off delay and reverb +* PS4 - Fixed closing the FMOD::System causing platform wide networking to be shutdown + even if the system did not initialize it. + +Notes: +* XboxOne - Now built with April XDK. +* PS4 - Now built with SDK 0.930. + +09/05/13 1.00.03 - Studio API patch release +---------------------------------------------------- + +Features: +* Core API - Added memory callbacks for DSP plugins + +Fixes: +* Core API - Fixed true peak calculation in loudness meter +* Core API - Fix thread related crash in fader DSP and possibly panner DSP. +* Studio API - Fixed automatic angle parameter calculation + +12/04/13 1.00.02 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed snapshots sometimes not working on some properties +* Studio API - Fixed VCAs applying fader level twice to controlled buses + +09/04/13 1.00.01 - Studio API patch release +---------------------------------------------------- + +Important: +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT + +Features: +* PS4 & XboxOne - Reduced CPU usage with optimized SSE and AVX functions. + +Fixes: +* Core API - Fix potential crash when stopping and starting sounds quickly + and a leak for FMOD_CREATECOMPRESSED codecs which made all + sounds go virtual. +* Studio API - Fixed a crash when connecting to the game via Live Update +* Studio API - Fixed serialization of snapshots with automation + +Notes: +* XboxOne - Now built with March XDK. + +25/03/13 1.00.00 - Studio API major release +---------------------------------------------------- + +Important: +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT + +Features: +* Mac - Reduced CPU usage with optimized SSE and AVX functions. +* XboxOne - Added ability to set affinity via FMOD_XboxOne_SetThreadAffinity. +* PS4 - Added ability to set affinity via FMOD_PS4_SetThreadAffinity. + +Fixes: +* Studio API - Fixed Studio::EventDescription::getLength return incorrect values +* Studio API - Fixed playback glitches when sounds are placed end-to-end on the + timeline +* Studio API - Studio::System::lookupEventID and Studio::System::lookupBusID + now ignore case +* Studio API - Fixed playback of Sound Scatterers with non-zero pitch +* Made return DSPs go idle when there is no input from sends +* Fixed sends sometimes going silent if there are multiple sends to a + single return +* Fixed rare hang in mixer when using setDelay with a pitch on the parent + +Notes: +* Studio API - Replaced Studio::System::lookupID with Studio::System::lookupEventID + and Studio::System::lookupBusID. +* FSBank API will now always encode PCM FSBs as PCM16 instead of deciding based + on the source file format. +* PS4 - Now built with SDK 0.920. + +25/02/13 0.02.04 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Studio::System::loadBank now returns FMOD_ERR_PLUGIN_MISSING instead of + FMOD_ERR_FILE_BAD when the bank uses a missing plugin + +15/02/13 0.02.03 - Studio API patch release +---------------------------------------------------- + +Features: +* Studio API - Added Studio::System::lookupID() to look up event IDs from paths + (using any string tables present in currently loaded banks). +* Studio API - Added Studio::Bank::unload() to free loaded bank data. +* Windows - Added optimisations to the 64 bit build. + +Fixes: +* Studio API - Fixed a linker error when calling Studio::EventDescription::getID +* Fixed constant FMOD_ERR_MEMORY in the TTY and hang if FMOD_ADVANCEDSETTINGS is + used with DSPBufferPoolSize being set to 0. +* Changed custom DSPs with no shouldiprocess callback to only be processed when + their inputs are active. +* Fixed high freqency noise coming from send DSP when channel counts mismatches + the return DSP. +* Fixed metering not working via LiveUpdate +* Windows - fixed bug in 5.1 mixing in 32bit builds. + +Notes: +* XboxOne - Now built with January XDK. +* PS4 - Now built with SDK 0.915. + +18/01/13 0.02.02 - Studio API patch release +---------------------------------------------------- + +Important: +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT +* Studio API - Changed function signature for Studio::System::initialize, added + STUDIO_FLAGS field + +Features: +* Studio API - Added FMOD_STUDIO_INIT_LIVEUPDATE flag to make Live Update optional + +Fixes: +* Studio API - Fixed an internal error on instantiating a VCA when not all of + the mixer strips it controls are loaded + +Notes: +* XboxOne - Now built with December XDK. + +11/01/13 0.02.01 - Studio API patch release +---------------------------------------------------- + +Fixes: +* Studio API - Fixed Distance and Angle parameters not being created properly + by live update +* Fixed reverb effect generating denorm floats after silence + +20/12/12 0.02.00 - Studio API minor release +---------------------------------------------------- + +Features: +* Added Xbox360 support. +* Added iOS support. +* Studio API - Added sub-event instantiation via Studio::EventInstance::createSubEvent + +23/11/12 0.01.04 - Patch release +---------------------------------------------------- + +Fixes: +* Fixed a crash when calling Studio::EventInstance::release in a callback fired from + Studio::EventInstance::stop with FMOD_STUDIO_STOP_IMMEDIATE +* Fixed a linker error when using Studio::CueInstance::trigger +* Fixed a bug in volume conflict resolver + +9/11/12 0.01.03 - Patch release +---------------------------------------------------- + +Fixes: +* Fixed a linker error when using Studio::EventInstance::setPaused + +29/10/12 0.01.02 - Patch release +---------------------------------------------------- + +Fixes: +* Fixed distortion when the distance between 3D sound and the listener is greater + than the maximum attenuation distance. +* Fixed memory leaks when playing a persistent event and triggering sounds via + parameter changes. + +16/10/12 0.01.00 - Minor release +---------------------------------------------------- + +Features: +* Implemented side chaining for FMOD Compressor + +Fixes: +* Studio API - Fixed linker error when calling Studio::EventInstance::isVirtual +* Studio API - Added log message for asset not found error + +Notes: +* Second Developer Preview release + +28/09/12 0.00.04 - Patch release +---------------------------------------------------- + +Important: +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT + +Features: +* Add DSP::addSideChain and FMOD_DSP_STATE::sidechainbuffer to allow a DSP unit + to support sidechaining from the output of another DSP. + +Fixes: +* Studio API - Fixed Event::getParameter() and retrieving the name of a parameter + via EventParameter::getInfo() +* Studio API - Added version checking to bank loading, the runtime will + return FMOD_ERR_FORMAT when attempting to load an old bank + +19/09/12 0.00.03 - Patch release +---------------------------------------------------- + +Fixes: +* Fix panning issue introduced in 5.00.02 +* Fix possible crackling noises from mixer optimization in 5.00.02 + +14/09/12 0.00.02 - Patch release +---------------------------------------------------- + +Important: +* Studio API - Changed .bank file format - ALL BANKS MUST BE REBUILT + +Features: +* Optimized mixer to be 20% faster in some cases. +* Studio API - Improved performance of event playback containing mono/stereo tracks + +Fixes: +* Studio API - Fixed panning different in game to tool + +27/08/12 0.00.00 - Initial release +---------------------------------------------------- + +Notes: +* First Developer Preview release + diff --git a/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/inc/RoomProperties.h b/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/inc/RoomProperties.h new file mode 100644 index 0000000..36021bf --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/inc/RoomProperties.h @@ -0,0 +1,107 @@ +// Copyright 2017 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef RESONANCE_AUDIO_PLATFORM_COMMON_ROOM_PROPERTIES_H_ +#define RESONANCE_AUDIO_PLATFORM_COMMON_ROOM_PROPERTIES_H_ + +namespace vraudio { + +// Room surface material names, used to set room properties. +// Note that this enum is C-compatible by design to be used across external +// C/C++ and C# implementations. +enum MaterialName { + kTransparent = 0, + kAcousticCeilingTiles, + kBrickBare, + kBrickPainted, + kConcreteBlockCoarse, + kConcreteBlockPainted, + kCurtainHeavy, + kFiberGlassInsulation, + kGlassThin, + kGlassThick, + kGrass, + kLinoleumOnConcrete, + kMarble, + kMetal, + kParquetOnConcrete, + kPlasterRough, + kPlasterSmooth, + kPlywoodPanel, + kPolishedConcreteOrTile, + kSheetrock, + kWaterOrIceSurface, + kWoodCeiling, + kWoodPanel, + kUniform, + kNumMaterialNames +}; + +// Acoustic room properties. This struct can be used to describe an acoustic +// environment with a given geometry and surface properties. +// Note that this struct is C-compatible by design to be used across external +// C/C++ and C# implementations. +struct RoomProperties { + // Constructs |RoomProperties| with the default values. + RoomProperties() + : position{0.0f, 0.0f, 0.0f}, + rotation{0.0f, 0.0f, 0.0f, 1.0f}, + dimensions{0.0f, 0.0f, 0.0f}, + material_names{MaterialName::kTransparent, MaterialName::kTransparent, + MaterialName::kTransparent, MaterialName::kTransparent, + MaterialName::kTransparent, MaterialName::kTransparent}, + reflection_scalar(1.0f), + reverb_gain(1.0f), + reverb_time(1.0f), + reverb_brightness(0.0f) {} + + // Center position of the room in world space, uses right-handed coordinate + // system. + float position[3]; + + // Rotation (quaternion) of the room in world space, uses right-handed + // coordinate system. + float rotation[4]; + + // Size of the shoebox room in world space, uses right-handed coordinate + // system. + float dimensions[3]; + + // Material name of each surface of the shoebox room in this order: + // [0] (-)ive x-axis wall (left) + // [1] (+)ive x-axis wall (right) + // [2] (-)ive y-axis wall (bottom) + // [3] (+)ive y-axis wall (top) + // [4] (-)ive z-axis wall (front) + // [5] (+)ive z-axis wall (back) + MaterialName material_names[6]; + + // User defined uniform scaling factor for all reflection coefficients. + float reflection_scalar; + + // User defined reverb tail gain multiplier. + float reverb_gain; + + // Adjusts the reverberation time across all frequency bands. RT60 values + // are multiplied by this factor. Has no effect when set to 1.0f. + float reverb_time; + + // Controls the slope of a line from the lowest to the highest RT60 values + // (increases high frequency RT60s when positive, decreases when negative). + // Has no effect when set to 0.0f. + float reverb_brightness; +}; + +} // namespace vraudio + +#endif // RESONANCE_AUDIO_PLATFORM_COMMON_ROOM_PROPERTIES_H_ diff --git a/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/license.txt b/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/license.txt new file mode 100644 index 0000000..dadef8e --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/license.txt @@ -0,0 +1,189 @@ + Copyright (c) 2016, Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/readme.txt b/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/readme.txt new file mode 100644 index 0000000..d5807d4 --- /dev/null +++ b/SimpleGame/fmodstudioapi20307linux/plugins/resonance_audio/readme.txt @@ -0,0 +1,7 @@ +# Resonance Audio SDK for [FMOD](https://www.fmod.com) v1.0 + +Enables high-quality spatial audio on mobile and desktop platforms. + +To get started read the online [documentation](https://resonance-audio.github.io/resonance-audio/develop/fmod/getting-started). + +Copyright (c) 2019 Google Inc. All rights reserved. \ No newline at end of file diff --git a/SimpleGame/media/Sansation.ttf b/SimpleGame/media/Sansation.ttf new file mode 100644 index 0000000..d85fbc8 Binary files /dev/null and b/SimpleGame/media/Sansation.ttf differ diff --git a/SimpleGame/media/accords/do.wav b/SimpleGame/media/accords/do.wav new file mode 100644 index 0000000..7881b72 Binary files /dev/null and b/SimpleGame/media/accords/do.wav differ diff --git a/SimpleGame/media/accords/fa.wav b/SimpleGame/media/accords/fa.wav new file mode 100644 index 0000000..9c7a2b3 Binary files /dev/null and b/SimpleGame/media/accords/fa.wav differ diff --git a/SimpleGame/media/accords/la.wav b/SimpleGame/media/accords/la.wav new file mode 100644 index 0000000..b1c66ef Binary files /dev/null and b/SimpleGame/media/accords/la.wav differ diff --git a/SimpleGame/media/accords/mi.wav b/SimpleGame/media/accords/mi.wav new file mode 100644 index 0000000..9223be1 Binary files /dev/null and b/SimpleGame/media/accords/mi.wav differ diff --git a/SimpleGame/media/accords/re.wav b/SimpleGame/media/accords/re.wav new file mode 100644 index 0000000..76dbf30 Binary files /dev/null and b/SimpleGame/media/accords/re.wav differ diff --git a/SimpleGame/media/accords/si.wav b/SimpleGame/media/accords/si.wav new file mode 100644 index 0000000..44ebf87 Binary files /dev/null and b/SimpleGame/media/accords/si.wav differ diff --git a/SimpleGame/media/accords/sol.wav b/SimpleGame/media/accords/sol.wav new file mode 100644 index 0000000..c4c6795 Binary files /dev/null and b/SimpleGame/media/accords/sol.wav differ diff --git a/SimpleGame/media/loyal three.mp3 b/SimpleGame/media/loyal three.mp3 new file mode 100644 index 0000000..9413944 Binary files /dev/null and b/SimpleGame/media/loyal three.mp3 differ diff --git a/SimpleGame/media/notes/A1.wav b/SimpleGame/media/notes/A1.wav new file mode 100644 index 0000000..459f5fb Binary files /dev/null and b/SimpleGame/media/notes/A1.wav differ diff --git a/SimpleGame/media/notes/A2.wav b/SimpleGame/media/notes/A2.wav new file mode 100644 index 0000000..43cf18c Binary files /dev/null and b/SimpleGame/media/notes/A2.wav differ diff --git a/SimpleGame/media/notes/A3.wav b/SimpleGame/media/notes/A3.wav new file mode 100644 index 0000000..c4bd560 Binary files /dev/null and b/SimpleGame/media/notes/A3.wav differ diff --git a/SimpleGame/media/notes/B1.wav b/SimpleGame/media/notes/B1.wav new file mode 100644 index 0000000..078cf10 Binary files /dev/null and b/SimpleGame/media/notes/B1.wav differ diff --git a/SimpleGame/media/notes/B2.wav b/SimpleGame/media/notes/B2.wav new file mode 100644 index 0000000..e4300cb Binary files /dev/null and b/SimpleGame/media/notes/B2.wav differ diff --git a/SimpleGame/media/notes/C1.wav b/SimpleGame/media/notes/C1.wav new file mode 100644 index 0000000..9573fb6 Binary files /dev/null and b/SimpleGame/media/notes/C1.wav differ diff --git a/SimpleGame/media/notes/C2.wav b/SimpleGame/media/notes/C2.wav new file mode 100644 index 0000000..4c1ff41 Binary files /dev/null and b/SimpleGame/media/notes/C2.wav differ diff --git a/SimpleGame/media/notes/D1.wav b/SimpleGame/media/notes/D1.wav new file mode 100644 index 0000000..22413b6 Binary files /dev/null and b/SimpleGame/media/notes/D1.wav differ diff --git a/SimpleGame/media/notes/D2.wav b/SimpleGame/media/notes/D2.wav new file mode 100644 index 0000000..bab5a05 Binary files /dev/null and b/SimpleGame/media/notes/D2.wav differ diff --git a/SimpleGame/media/notes/E1.wav b/SimpleGame/media/notes/E1.wav new file mode 100644 index 0000000..8d0ab0e Binary files /dev/null and b/SimpleGame/media/notes/E1.wav differ diff --git a/SimpleGame/media/notes/E2.wav b/SimpleGame/media/notes/E2.wav new file mode 100644 index 0000000..1d0bda2 Binary files /dev/null and b/SimpleGame/media/notes/E2.wav differ diff --git a/SimpleGame/media/notes/F1.wav b/SimpleGame/media/notes/F1.wav new file mode 100644 index 0000000..8b3526d Binary files /dev/null and b/SimpleGame/media/notes/F1.wav differ diff --git a/SimpleGame/media/notes/F2.wav b/SimpleGame/media/notes/F2.wav new file mode 100644 index 0000000..f3917e7 Binary files /dev/null and b/SimpleGame/media/notes/F2.wav differ diff --git a/SimpleGame/media/notes/G1.wav b/SimpleGame/media/notes/G1.wav new file mode 100644 index 0000000..8b2f7ad Binary files /dev/null and b/SimpleGame/media/notes/G1.wav differ diff --git a/SimpleGame/media/notes/G2.wav b/SimpleGame/media/notes/G2.wav new file mode 100644 index 0000000..a6d11bb Binary files /dev/null and b/SimpleGame/media/notes/G2.wav differ diff --git a/SimpleGame/media/pecharunt.mp3 b/SimpleGame/media/pecharunt.mp3 new file mode 100644 index 0000000..c2e744d Binary files /dev/null and b/SimpleGame/media/pecharunt.mp3 differ diff --git a/SimpleGame/media/percussions/drums1.wav b/SimpleGame/media/percussions/drums1.wav new file mode 100644 index 0000000..8cbdba9 Binary files /dev/null and b/SimpleGame/media/percussions/drums1.wav differ diff --git a/SimpleGame/media/percussions/drums2.wav b/SimpleGame/media/percussions/drums2.wav new file mode 100644 index 0000000..e921428 Binary files /dev/null and b/SimpleGame/media/percussions/drums2.wav differ diff --git a/SimpleGame/media/percussions/drums3.wav b/SimpleGame/media/percussions/drums3.wav new file mode 100644 index 0000000..35c9391 Binary files /dev/null and b/SimpleGame/media/percussions/drums3.wav differ diff --git a/SimpleGame/src/CMakeLists.txt b/SimpleGame/src/CMakeLists.txt new file mode 100644 index 0000000..f3fbe48 --- /dev/null +++ b/SimpleGame/src/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.26) +project(simpleGame) + +if(WIN32) + message(STATUS "Platform: Windows") + set(FMOD_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../fmodwindow") + set(CPU_THING "x64") + set(FMOD_LIB_NAME "fmod_vc") + set(FMOD_DLL_NAME "fmod.dll") +elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") + message(STATUS "Platform: Linux") + set(FMOD_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../fmodstudioapi20307linux") + set(CPU_THING "x86_64") + set(FMOD_LIB_NAME "fmod") + set(FMOD_DLL_NAME "libfmod.so") +else() + message(FATAL_ERROR "Platform not supported, please update the CMake script.") +endif() + +add_executable(simpleGame + Source/Game.cpp Include/Game.hpp Source/Main.cpp + Source/RoundTarget.cpp Include/RoundTarget.hpp + Source/AudioEmitter.cpp Include/AudioEmitter.hpp +) + +target_include_directories(simpleGame PRIVATE + "Include" + "${FMOD_PATH}/api/core/inc" +) + +target_link_directories(simpleGame PRIVATE + "${FMOD_PATH}/api/core/lib/${CPU_THING}" +) + +target_link_libraries(simpleGame PUBLIC + sfml-graphics + ${FMOD_LIB_NAME} +) + +file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/../media" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") + +add_custom_command(TARGET simpleGame POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${FMOD_PATH}/api/core/lib/${CPU_THING}/${FMOD_DLL_NAME}" + "$" +) diff --git a/SimpleGame/src/Include/AudioEmitter.hpp b/SimpleGame/src/Include/AudioEmitter.hpp new file mode 100644 index 0000000..f29fb07 --- /dev/null +++ b/SimpleGame/src/Include/AudioEmitter.hpp @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +class AudioEmitter { + private: + std::unique_ptr system; + FMOD::Channel* timer{ nullptr }; + std::vector > chords; + std::vector> drums; + std::vector> notes; + int tempo{ 170 }; + std::vector> markov_matrix_chords; + std::vector> markov_matrix_melody; + int nbr_melo_max{ 4 }; + int current_beat{ 0 }; + std::vector> rythmes; + int index_note; + std::vector chordProgression; + std::vector activeChannels; + public: + AudioEmitter(); + void generateMusic(); + void audioUpdate(); + void audioEnd(); + int firstChord(); + int nextChord(int currentChord); + int firstNote(); + int nextNote(int currentNote); + int noteSecondaire(int note); + float getTime(); + float timeBeforeNewGeneration{ 0.2f }; +}; \ No newline at end of file diff --git a/SimpleGame/src/Include/Game.hpp b/SimpleGame/src/Include/Game.hpp new file mode 100644 index 0000000..23c7ad9 --- /dev/null +++ b/SimpleGame/src/Include/Game.hpp @@ -0,0 +1,34 @@ +#ifndef BOOK_GAME_HPP +#define BOOK_GAME_HPP + +#include "RoundTarget.hpp" +#include +#include "AudioEmitter.hpp" + +class Game { +public: + Game(); + Game(const Game &) = delete; + Game &operator=(const Game &) = delete; + void run(); + +private: + void processEvents(AudioEmitter& audioEmitter); + void update(sf::Time elapsedTime); + void render(); + + void updateStatistics(AudioEmitter& audioEmitter); + + static const sf::Time TimePerFrame; + + sf::RenderWindow mWindow{sf::VideoMode({640, 480}), "SFML Application"}; + sf::Texture mTexture; + RoundTarget mTarget{35.f, sf::Color::Red, 320.f, 300.f}; + sf::Font mFont; + sf::Text mStatisticsText{mFont}; + sf::Time mStatisticsUpdateTime; + + std::size_t mStatisticsNumFrames{0}; +}; + +#endif // BOOK_GAME_HPP diff --git a/SimpleGame/src/Include/RoundTarget.hpp b/SimpleGame/src/Include/RoundTarget.hpp new file mode 100644 index 0000000..65618fa --- /dev/null +++ b/SimpleGame/src/Include/RoundTarget.hpp @@ -0,0 +1,22 @@ +#ifndef SIMPLE_GAME_ROUND_TARGET_H +#define SIMPLE_GAME_ROUND_TARGET_H + +#include + +class RoundTarget { +public: + RoundTarget(float radius, sf::Color color, float x, float y); + void drawCurrent(sf::RenderWindow &window) const; + void handlePlayerInput(const sf::Keyboard::Key &key, const bool &isPressed); + void update(const sf::Time &elapsedTime); + +private: + static constexpr float TargetSpeed{100.f}; + bool mIsMovingUp{false}; + bool mIsMovingDown{false}; + bool mIsMovingRight{false}; + bool mIsMovingLeft{false}; + sf::CircleShape mShape; +}; + +#endif // SIMPLE_GAME_ROUND_TARGET_H diff --git a/SimpleGame/src/Source/AudioEmitter.cpp b/SimpleGame/src/Source/AudioEmitter.cpp new file mode 100644 index 0000000..2d4b68b --- /dev/null +++ b/SimpleGame/src/Source/AudioEmitter.cpp @@ -0,0 +1,316 @@ +#include "AudioEmitter.hpp" +#include +#include +#include +#include + +void ERRCHECK(FMOD_RESULT result) { + if (result != FMOD_OK) { + std::cout << "FMOD error: " << FMOD_ErrorString(result) << std::endl; + exit(-1); + } +} + +auto fmodSoundDeleter = [](FMOD::Sound* sound) { + if (sound) { + sound->release(); + } +}; + +AudioEmitter::AudioEmitter() { + FMOD::System* rawSystem = nullptr; + ERRCHECK(FMOD::System_Create(&rawSystem)); + + system.reset(rawSystem); + ERRCHECK(system->init(512, FMOD_INIT_NORMAL, nullptr)); + + + std::vector rawChords(7); + ERRCHECK(system->createSound("media/accords/do.wav", FMOD_LOOP_OFF, nullptr, &rawChords[0])); + ERRCHECK(system->createSound("media/accords/re.wav", FMOD_LOOP_OFF, nullptr, &rawChords[1])); + ERRCHECK(system->createSound("media/accords/mi.wav", FMOD_LOOP_OFF, nullptr, &rawChords[2])); + ERRCHECK(system->createSound("media/accords/fa.wav", FMOD_LOOP_OFF, nullptr, &rawChords[3])); + ERRCHECK(system->createSound("media/accords/sol.wav", FMOD_LOOP_OFF, nullptr, &rawChords[4])); + ERRCHECK(system->createSound("media/accords/la.wav", FMOD_LOOP_OFF, nullptr, &rawChords[5])); + ERRCHECK(system->createSound("media/accords/si.wav", FMOD_LOOP_OFF, nullptr, &rawChords[6])); + for (int i = 0; i < 7; i += 1) { + chords.push_back(std::unique_ptr(rawChords[i])); + } + + int nbr_drums = 3; + std::vector rawDrums(nbr_drums); + ERRCHECK(system->createSound("media/percussions/drums1.wav", FMOD_LOOP_OFF, nullptr, &rawDrums[0])); + ERRCHECK(system->createSound("media/percussions/drums2.wav", FMOD_LOOP_OFF, nullptr, &rawDrums[1])); + ERRCHECK(system->createSound("media/percussions/drums3.wav", FMOD_LOOP_OFF, nullptr, &rawDrums[2])); + for (int i = 0; i < nbr_drums; i += 1) { + drums.push_back(std::unique_ptr(rawDrums[i])); + } + + std::vector rawNotes(15); + ERRCHECK(system->createSound("media/notes/A1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[0])); + ERRCHECK(system->createSound("media/notes/B1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[1])); + ERRCHECK(system->createSound("media/notes/C1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[2])); + ERRCHECK(system->createSound("media/notes/D1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[3])); + ERRCHECK(system->createSound("media/notes/E1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[4])); + ERRCHECK(system->createSound("media/notes/F1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[5])); + ERRCHECK(system->createSound("media/notes/G1.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[6])); + ERRCHECK(system->createSound("media/notes/A2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[7])); + ERRCHECK(system->createSound("media/notes/B2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[8])); + ERRCHECK(system->createSound("media/notes/C2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[9])); + ERRCHECK(system->createSound("media/notes/D2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[10])); + ERRCHECK(system->createSound("media/notes/E2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[11])); + ERRCHECK(system->createSound("media/notes/F2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[12])); + ERRCHECK(system->createSound("media/notes/G2.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[13])); + ERRCHECK(system->createSound("media/notes/A3.wav", FMOD_LOOP_OFF, nullptr, &rawNotes[14])); + for (int i = 0; i < 15; i += 1) { + notes.push_back(std::unique_ptr(rawNotes[i])); + } + + + index_note = firstNote(); + + rythmes = { + {0,2,4,6}, + {0,1,2,3,4,5,6,7}, + {0,0.5,1,1.5,2,3,4,5,6,7}, + {0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5}, + {0,0.5,1,2,2.5,3,4,4.5,5,6,6.5,7}, + {0.5,1,1.5,2,3.5,4,4.5,5,6.5,7,7.5}, + {0,1,2.5,3,4,5,5.5,6.5,7,7.5}, + {0,0.75,1.5,2.5,3,3.5,5,5.5}, + {0,0.5,1,1.5,2,3,4,4.5,5,6,6.5,7,7.5}, + {0,0.5,1,1.5,2.5,3.5,4,5,6,7}, + {0,1.5,3,4,5.5,7}, + {0,0.5,1.5,2,3,4,4.5,5.5,6,7}, + {0.5,1,1.5,2,2.75,3.5,4.5,5,5.5,6,6.5,7,7.5}, + {0,0.75,1.5,2,2.75,3.5,4,4.5,5,5.5,6,7,7.5}, + {0,0.5,1.5,2,3,3.5,4.5,5,6,6.5,7.5}, + {0,1,2,2.75,3.5,4.5,5,5.5,6,6.75,7.5}, + {0.5,1,1.5,2,2.5,3.5,4.5,5,5.5,6,6.5,7}, + {0,1,1.5,2,2.5,3,3.5,4,5.5,7}, + {0,1.5,2.5,3,4,5.5,6.5,7}, + {0,1.5,3,3.5,4,5.5,7}, + {0,0.5,1.5,2,2.5,3.5,4,4.5,5,5.5}, + {0,0.5,1,2,2.5,3,4,4.5,5,6,6.5,7}, + {0,1.5,3,4.5,6,7}, + {0,0.5,1,1.5,2.5,3,3.5,4,4.5,5,5.5,6.5,7,7.5}, + {1,2,3.5,4}, + {0,1.5,3,4,5.5,7}, + {0,2,2.5,3,3.5,4.5,5.5,6.5,7}, + {0.5,1,1.5,2,3.5,4,4.5,5,5.5,6,6.5,7}, + {0,0.5,1,1.5,3,4,4.5,5,5.5,7}, + }; + + markov_matrix_chords = { + {0, 0.10, 0.00, 0.40, 0.35, 0.15, 0.00}, + // Depuis ii (1) + {0.10, 0, 0.00, 0.25, 0.65, 0.00, 0.00}, + // Depuis iii (2) + {0.00, 0.00, 0, 0.25, 0.15, 0.50, 0.10}, + // Depuis IV (3) + {0.45, 0.15, 0.00, 0, 0.25, 0.15, 0.00}, + // Depuis V (4) + {0.70, 0.00, 0.00, 0.10, 0, 0.20, 0.00}, + // Depuis vi (5) + {0.15, 0.15, 0.00, 0.45, 0.25, 0, 0.00}, + // Depuis vii° (6) + {0.80, 0.00, 0.00, 0.00, 0.20, 0.00, 0.00} + }; + + markov_matrix_melody = { + // A1 (0) + {0.05, 0.30, 0.25, 0.15, 0.10, 0.05, 0.03, 0.02, 0.02, 0.01, 0.01, 0.00, 0.00, 0.00, 0.00}, + // B1 (1) + {0.20, 0.05, 0.30, 0.20, 0.10, 0.05, 0.03, 0.02, 0.02, 0.01, 0.01, 0.00, 0.00, 0.00, 0.00}, + // C2 (2) + {0.10, 0.20, 0.05, 0.30, 0.15, 0.10, 0.05, 0.02, 0.02, 0.01, 0.00, 0.00, 0.00, 0.00, 0.00}, + // D2 (3) + {0.05, 0.15, 0.20, 0.05, 0.30, 0.15, 0.05, 0.03, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, + // E2 (4) + {0.03, 0.07, 0.15, 0.20, 0.05, 0.25, 0.15, 0.07, 0.03, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, + // F2 (5) + {0.02, 0.05, 0.10, 0.15, 0.20, 0.05, 0.25, 0.15, 0.05, 0.02, 0.01, 0.00, 0.00, 0.00, 0.00}, + // G2 (6) + {0.01, 0.03, 0.07, 0.10, 0.15, 0.20, 0.05, 0.25, 0.10, 0.03, 0.01, 0.00, 0.00, 0.00, 0.00}, + // A2 (7) - Centre tonal + {0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.15, 0.05, 0.02, 0.01, 0.00, 0.00, 0.00}, + // B2 (8) + {0.00, 0.00, 0.01, 0.03, 0.07, 0.15, 0.20, 0.25, 0.05, 0.20, 0.10, 0.05, 0.03, 0.01, 0.00}, + // C3 (9) + {0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.20, 0.15, 0.07, 0.03, 0.01}, + // D3 (10) + {0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10, 0.15, 0.20, 0.25, 0.05, 0.25, 0.15, 0.07, 0.03}, + // E3 (11) + {0.00, 0.00, 0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.20, 0.15, 0.08}, + // F3 (12) + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10, 0.15, 0.20, 0.25, 0.05, 0.25, 0.15}, + // G3 (13) + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.05, 0.28}, + // A3 (14) + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.03, 0.07, 0.10, 0.15, 0.20, 0.25, 0.05} + }; + + chordProgression.resize(4); + + int chord = firstChord(); + chordProgression[0] = chord; + for (int i = 1; i < 4; i += 1) { + chord = nextChord(chord); + chordProgression[i] = chord; + } + + FMOD::Sound* metronome_Sound; + ERRCHECK(system->createSound("media/notes/A1.wav", FMOD_DEFAULT, nullptr, &metronome_Sound)); + ERRCHECK(system->playSound(metronome_Sound, nullptr, true, &timer)); + ERRCHECK(timer->setVolume(0)); + ERRCHECK(timer->setPaused(false)); +} + +int AudioEmitter::firstChord() { + std::vector possibleChords = { 1,5,6 }; + return possibleChords[rand() % possibleChords.size()] - 1; +} + +int AudioEmitter::firstNote() { + std::vector possibleNotes = { 4,5,6,7,8,9,10,11 }; + return possibleNotes[rand() % possibleNotes.size()]; +} + +int sampleIndex(const std::vector& probabilities) { + // Créer un générateur aléatoire + static std::random_device rd; + static std::mt19937 gen(rd()); + + // Créer une distribution discrète avec les probabilités données + std::discrete_distribution<> dist(probabilities.begin(), probabilities.end()); + + // Tirer un échantillon + return dist(gen); +} + +int randomWeightedChoice(const std::vector& values, const std::vector& weights) { + if (values.size() != weights.size() || values.empty()) { + throw std::invalid_argument("Les tableaux doivent être de même taille et non vides."); + } + + // Calcul de la somme totale des poids + double totalWeight = std::accumulate(weights.begin(), weights.end(), 0.0); + if (totalWeight <= 0) { + throw std::invalid_argument("La somme des poids doit être positive."); + } + + // Générateur aléatoire + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution<> dis(0.0, totalWeight); + + double r = dis(gen); + double cumulative = 0.0; + + for (size_t i = 0; i < values.size(); ++i) { + cumulative += weights[i]; + if (r < cumulative) { + return values[i]; + } + } + + // Fallback - devrait normalement ne jamais être atteint + return values.back(); +} + +int AudioEmitter::nextChord(int currentChord) { + return sampleIndex(markov_matrix_chords[currentChord]); +} + +int AudioEmitter::nextNote(int currentNote) { + return sampleIndex(markov_matrix_melody[currentNote]); +} + +int AudioEmitter::noteSecondaire(int note) { + std::vector notesPossibles = { note - 4,note - 3,note + 3,note + 4,note + 5 }; + std::vector proba = { 0.05,0.10,0.60,0.05,0.2 }; + for (int i = 0; i < proba.size(); i += 1) { + if ((notesPossibles[i] < 0) || (notesPossibles[i] >= notes.size())) { + proba[i] = 0; + } + } + return randomWeightedChoice(notesPossibles, proba); +} + +void AudioEmitter::generateMusic() { + float beatDuration = tempo / 60.f; + unsigned int sampleRate = 48000; + int maxsize = 400; + if (activeChannels.size() > maxsize) { + for (int i = 0; i < maxsize / 2; i += 1) { + if (activeChannels[i]) { + activeChannels[i]->stop(); + } + } + } + chordProgression[0] = nextChord(chordProgression[3]); + for (int i = 1; i < 4; i += 1) { + chordProgression[i] = nextChord(chordProgression[i-1]); + } + int index_drums = rand() % 3; + int second_melody = 1; //Pas de seconde mélodie + for (int i = current_beat; i < current_beat + nbr_melo_max; i += 1) { + //Chords + FMOD::Channel* channelChords = nullptr; + int index_chord = chordProgression[i % 4]; + ERRCHECK(system->playSound(chords[index_chord].get(), nullptr, true, &channelChords)); + + unsigned long long delay = (unsigned long long)(i * beatDuration * sampleRate); + ERRCHECK(channelChords->setDelay(delay, 0, true)); + ERRCHECK(channelChords->setPaused(false)); + + activeChannels.push_back(channelChords); + //Drums + FMOD::Channel* channelDrums = nullptr; + ERRCHECK(system->playSound(drums[index_drums].get(), nullptr, true, &channelDrums)); + ERRCHECK(channelDrums->setDelay(delay, 0, true)); + ERRCHECK(channelDrums->setPaused(false)); + + activeChannels.push_back(channelDrums); + //Mélodie + std::vector rythme_melodie = rythmes[rand() % rythmes.size()]; + for (float time : rythme_melodie) { + FMOD::Channel* channelNote = nullptr; + ERRCHECK(system->playSound(notes[index_note].get(), nullptr, true, &channelNote)); + unsigned long long delayNote = (unsigned long long)((i + time / 8.f) * beatDuration * sampleRate); + ERRCHECK(channelNote->setDelay(delayNote, 0, true)); + ERRCHECK(channelNote->setPaused(false)); + if (second_melody == 0) { + FMOD::Channel* channelNoteSec = nullptr; + ERRCHECK(system->playSound(notes[noteSecondaire(index_note)].get(), nullptr, true, &channelNoteSec)); + unsigned long long delayNote = (unsigned long long)((i + time / 8.f) * beatDuration * sampleRate); + ERRCHECK(channelNoteSec->setDelay(delayNote, 0, true)); + ERRCHECK(channelNoteSec->setPaused(false)); + activeChannels.push_back(channelNoteSec); + } + index_note = nextNote(index_note); + activeChannels.push_back(channelNote); + } + } + current_beat += nbr_melo_max; +} + +void AudioEmitter::audioUpdate() { + system->update(); +} + +void AudioEmitter::audioEnd() { + for (FMOD::Channel* c : activeChannels) { + delete c; + } + timer->stop(); + system->close(); + system->release(); +} + +float AudioEmitter::getTime() { + float beatDuration = tempo / 60.f / 8.f; + unsigned long long dspClock = 0; + ERRCHECK(timer->getDSPClock(&dspClock, nullptr)); + return dspClock / 48000.f / beatDuration; +} \ No newline at end of file diff --git a/SimpleGame/src/Source/Game.cpp b/SimpleGame/src/Source/Game.cpp new file mode 100644 index 0000000..2349952 --- /dev/null +++ b/SimpleGame/src/Source/Game.cpp @@ -0,0 +1,77 @@ +#include "Game.hpp" +#include +#include +#include + +const sf::Time Game::TimePerFrame = sf::seconds(1.f / 60.f); + +Game::Game() { + assert(mFont.openFromFile("media/Sansation.ttf")); + // We do not need to do mStatisticsText.setFont(mFont); as mStatisticsText is + // initialized with a reference to mFont + mStatisticsText.setPosition({5.f, 5.f}); + mStatisticsText.setCharacterSize(10); +} + +void Game::run() { + sf::Clock clock; + sf::Time timeSinceLastUpdate = sf::Time::Zero; + AudioEmitter audioEmitter = AudioEmitter(); + audioEmitter.generateMusic(); + bool generated = false; + mWindow.setVerticalSyncEnabled(true); + while (mWindow.isOpen()) { + sf::Time elapsedTime = clock.restart(); + timeSinceLastUpdate += elapsedTime; + while (timeSinceLastUpdate > TimePerFrame) { + if (32.f - fmod(audioEmitter.getTime(), 32.f) < audioEmitter.timeBeforeNewGeneration) { + if (!generated) { + audioEmitter.generateMusic(); + generated = true; + } + } else { + generated = false; + } + timeSinceLastUpdate -= TimePerFrame; + + processEvents(audioEmitter); + audioEmitter.audioUpdate(); + update(TimePerFrame); + } + + updateStatistics(audioEmitter); + render(); + } +} + +void Game::processEvents(AudioEmitter& audioEmitter) { + while (const std::optional event = mWindow.pollEvent()) { + if (const auto *keyPressed = event->getIf()) { + mTarget.handlePlayerInput(keyPressed->code, true); + } else if (const auto *keyReleased = + event->getIf()) { + mTarget.handlePlayerInput(keyReleased->code, false); + } else if (event->is()) { + audioEmitter.audioEnd(); + mWindow.close(); + } + } +} + +void Game::update(const sf::Time elapsedTime) { mTarget.update(elapsedTime); } + +void Game::render() { + mWindow.clear(); + mTarget.drawCurrent(mWindow); + mWindow.draw(mStatisticsText); + mWindow.display(); +} + +void Game::updateStatistics(AudioEmitter& audioEmitter) { + mStatisticsText.setString(std::format( + "Mesure = {}\nBeat = {} us", ceil(audioEmitter.getTime()/8.f), + ceil(fmod(audioEmitter.getTime(),8.f)))); + + mStatisticsUpdateTime -= sf::seconds(1.0f); + mStatisticsNumFrames = 0; +} \ No newline at end of file diff --git a/SimpleGame/src/Source/Main.cpp b/SimpleGame/src/Source/Main.cpp new file mode 100644 index 0000000..e0c0f03 --- /dev/null +++ b/SimpleGame/src/Source/Main.cpp @@ -0,0 +1,6 @@ +#include "Game.hpp" + +int main() { + Game game; + game.run(); +} diff --git a/SimpleGame/src/Source/RoundTarget.cpp b/SimpleGame/src/Source/RoundTarget.cpp new file mode 100644 index 0000000..e475ed7 --- /dev/null +++ b/SimpleGame/src/Source/RoundTarget.cpp @@ -0,0 +1,39 @@ +#include "RoundTarget.hpp" + +RoundTarget::RoundTarget(const float radius, const sf::Color color, float x, + float y) { + mShape.setRadius(radius); + mShape.setFillColor(color); + mShape.setPosition({x, y}); +} + +void RoundTarget::drawCurrent(sf::RenderWindow &window) const { + window.draw(mShape); +} + +void RoundTarget::handlePlayerInput(const sf::Keyboard::Key &key, + const bool &isPressed) { + using enum sf::Keyboard::Key; + if (key == Z) + mIsMovingUp = isPressed; + else if (key == S) + mIsMovingDown = isPressed; + else if (key == Q) + mIsMovingLeft = isPressed; + else if (key == D) + mIsMovingRight = isPressed; +} + +void RoundTarget::update(const sf::Time &elapsedTime) { + sf::Vector2f movement{0.f, 0.f}; + if (mIsMovingUp) + movement.y -= TargetSpeed; + if (mIsMovingDown) + movement.y += TargetSpeed; + if (mIsMovingLeft) + movement.x -= TargetSpeed; + if (mIsMovingRight) + movement.x += TargetSpeed; + + mShape.move(movement * elapsedTime.asSeconds()); +} diff --git a/SimpleGame/src_original/CMakeLists.txt b/SimpleGame/src_original/CMakeLists.txt new file mode 100644 index 0000000..d151490 --- /dev/null +++ b/SimpleGame/src_original/CMakeLists.txt @@ -0,0 +1,13 @@ +add_executable(simpleGameOriginal + Source/Game.cpp Source/Main.cpp + ) + +target_include_directories(simpleGameOriginal + PRIVATE + Include +) + +target_link_libraries(simpleGameOriginal PUBLIC sfml-graphics) + +# The following command is executed only when cmake is executed +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/../media DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) \ No newline at end of file diff --git a/SimpleGame/src_original/Include/Game.hpp b/SimpleGame/src_original/Include/Game.hpp new file mode 100644 index 0000000..c4390cd --- /dev/null +++ b/SimpleGame/src_original/Include/Game.hpp @@ -0,0 +1,38 @@ +#ifndef BOOK_GAME_HPP +#define BOOK_GAME_HPP + +#include + +class Game { +public: + Game(); + Game(const Game &) = delete; + Game &operator=(const Game &) = delete; + void run(); + +private: + void processEvents(); + void update(sf::Time elapsedTime); + void render(); + + void updateStatistics(sf::Time elapsedTime); + void handlePlayerInput(sf::Keyboard::Key key, bool isPressed); + + static const float PlayerSpeed; + static const sf::Time TimePerFrame; + + sf::RenderWindow mWindow{sf::VideoMode({640, 480}), "SFML Application"}; + sf::Texture mTexture; + sf::CircleShape mTarget; + sf::Font mFont; + sf::Text mStatisticsText{mFont}; + sf::Time mStatisticsUpdateTime; + + std::size_t mStatisticsNumFrames{0}; + bool mIsMovingUp{false}; + bool mIsMovingDown{false}; + bool mIsMovingRight{false}; + bool mIsMovingLeft{false}; +}; + +#endif // BOOK_GAME_HPP diff --git a/SimpleGame/src_original/Include/StringHelpers.hpp b/SimpleGame/src_original/Include/StringHelpers.hpp new file mode 100644 index 0000000..d3ecd27 --- /dev/null +++ b/SimpleGame/src_original/Include/StringHelpers.hpp @@ -0,0 +1,11 @@ +#ifndef BOOK_STRINGHELPERS_HPP +#define BOOK_STRINGHELPERS_HPP + +#include + +// Since std::to_string doesn't work on MinGW we have to implement +// our own to support all platforms. +template std::string toString(const T &value); + +#include "StringHelpers.inl" +#endif // BOOK_STRINGHELPERS_HPP diff --git a/SimpleGame/src_original/Include/StringHelpers.inl b/SimpleGame/src_original/Include/StringHelpers.inl new file mode 100644 index 0000000..ce1b36d --- /dev/null +++ b/SimpleGame/src_original/Include/StringHelpers.inl @@ -0,0 +1,6 @@ + +template std::string toString(const T &value) { + std::stringstream stream; + stream << value; + return stream.str(); +} diff --git a/SimpleGame/src_original/Source/Game.cpp b/SimpleGame/src_original/Source/Game.cpp new file mode 100644 index 0000000..34cdda1 --- /dev/null +++ b/SimpleGame/src_original/Source/Game.cpp @@ -0,0 +1,99 @@ +#include "Game.hpp" +#include "StringHelpers.hpp" + +const float Game::PlayerSpeed = 100.f; +const sf::Time Game::TimePerFrame = sf::seconds(1.f / 60.f); + +Game::Game() { + mTarget.setRadius(50.f); + mTarget.setFillColor(sf::Color::Cyan); + mTarget.setPosition({100.f, 100.f}); + + assert(mFont.openFromFile("media/Sansation.ttf")); + // We do not need to do mStatisticsText.setFont(mFont); as mStatisticsText is + // initialized with a reference to mFont + mStatisticsText.setPosition({5.f, 5.f}); + mStatisticsText.setCharacterSize(10); +} + +void Game::run() { + sf::Clock clock; + sf::Time timeSinceLastUpdate = sf::Time::Zero; + while (mWindow.isOpen()) { + sf::Time elapsedTime = clock.restart(); + timeSinceLastUpdate += elapsedTime; + while (timeSinceLastUpdate > TimePerFrame) { + timeSinceLastUpdate -= TimePerFrame; + + processEvents(); + update(TimePerFrame); + } + + updateStatistics(elapsedTime); + render(); + } +} + +void Game::processEvents() { + while (const std::optional event = mWindow.pollEvent()) { + if (const auto *keyPressed = event->getIf()) { + handlePlayerInput(keyPressed->code, true); + } else if (const auto *keyReleased = + event->getIf()) { + handlePlayerInput(keyReleased->code, false); + } else if (event->is()) { + mWindow.close(); + } + } +} + +void Game::update(sf::Time elapsedTime) { + sf::Vector2f movement(0.f, 0.f); + if (mIsMovingUp) + movement.y -= PlayerSpeed; + if (mIsMovingDown) + movement.y += PlayerSpeed; + if (mIsMovingLeft) + movement.x -= PlayerSpeed; + if (mIsMovingRight) + movement.x += PlayerSpeed; + + mTarget.move(movement * elapsedTime.asSeconds()); +} + +void Game::render() { + mWindow.clear(); + mWindow.draw(mTarget); + mWindow.draw(mStatisticsText); + mWindow.display(); +} + +void Game::updateStatistics(const sf::Time elapsedTime) { + mStatisticsUpdateTime += elapsedTime; + mStatisticsNumFrames += 1; + + if (mStatisticsUpdateTime >= sf::seconds(1.0f)) { + mStatisticsText.setString( + "Frames / Second = " + toString(mStatisticsNumFrames) + "\n" + + "Time / Update = " + + toString(mStatisticsUpdateTime.asMicroseconds() / + mStatisticsNumFrames) + + " us"); + + mStatisticsUpdateTime -= sf::seconds(1.0f); + mStatisticsNumFrames = 0; + } +} + +void Game::handlePlayerInput(const sf::Keyboard::Key key, + const bool isPressed) { + using enum sf::Keyboard::Key; + if (key == Z) + mIsMovingUp = isPressed; + else if (key == S) + mIsMovingDown = isPressed; + else if (key == Q) + mIsMovingLeft = isPressed; + else if (key == D) + mIsMovingRight = isPressed; +} diff --git a/SimpleGame/src_original/Source/Main.cpp b/SimpleGame/src_original/Source/Main.cpp new file mode 100644 index 0000000..e0c0f03 --- /dev/null +++ b/SimpleGame/src_original/Source/Main.cpp @@ -0,0 +1,6 @@ +#include "Game.hpp" + +int main() { + Game game; + game.run(); +}