Skip to content

Split SDL project up into more managable pieces #473

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Apr 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Installer.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "set -euxo pipefail\n\necho BUILT_PRODUCTS_DIR $BUILT_PRODUCTS_DIR\nls \"$BUILT_PRODUCTS_DIR\"\n\nmkdir -p \"$TEMP_DIR\"\n\nSDL_PKG=\"$BUILT_PRODUCTS_DIR/ProjectM-SDL.pkg\"\nMUSIC_PLUGIN_PKG=\"$BUILT_PRODUCTS_DIR/ProjectM-MusicPlugin.pkg\"\n\n#productbuild --timestamp --sign '5926VBQM6Y' --package $SDL_PKG --package $MUSIC_PLUGIN_PKG \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\"\nproductbuild --timestamp --sign '5926VBQM6Y' --distribution mac/Distribution.xml --package-path \"$BUILT_PRODUCTS_DIR\" \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\"\n#productbuild --package \"$SDL_PKG\" --package \"$MUSIC_PLUGIN_PKG\" \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\"\n\necho \"Created installer package $BUILT_PRODUCTS_DIR/ProjectM.pkg\"\n\ncp -rp \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\" \"$SRCROOT/\"\n";
shellScript = "set -euxo pipefail\n\necho BUILT_PRODUCTS_DIR $BUILT_PRODUCTS_DIR\nls \"$BUILT_PRODUCTS_DIR\"\n\nmkdir -p \"$TEMP_DIR\"\n\nSDL_PKG=\"$BUILT_PRODUCTS_DIR/ProjectM-SDL.pkg\"\nMUSIC_PLUGIN_PKG=\"$BUILT_PRODUCTS_DIR/ProjectM-MusicPlugin.pkg\"\n\n\n#productbuild --timestamp --sign '5926VBQM6Y' --package $SDL_PKG --package $MUSIC_PLUGIN_PKG \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\"\nproductbuild --timestamp --sign '5926VBQM6Y' --distribution mac/Distribution.xml --package-path \"$BUILT_PRODUCTS_DIR\" \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\"\n#productbuild --package \"$SDL_PKG\" --package \"$MUSIC_PLUGIN_PKG\" \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\"\n\necho \"Created installer package $BUILT_PRODUCTS_DIR/ProjectM.pkg\"\n\ncp -rp \"$BUILT_PRODUCTS_DIR/ProjectM.pkg\" \"$SRCROOT/\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
Expand Down
7 changes: 7 additions & 0 deletions msvc/projectMSDL.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@
<ItemGroup>
<ClCompile Include="$(MSBuildThisFileDirectory)../src\projectM-sdl\projectM_SDL_main.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)../src\projectM-sdl\pmSDL.cpp" />
<ClCompile Include="..\src\projectM-sdl\audioCapture.cpp" />
<ClCompile Include="..\src\projectM-sdl\loopback.cpp" />
<ClCompile Include="..\src\projectM-sdl\setup.cpp" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="\MilkdropPresetFactory.vcxproj">
Expand Down Expand Up @@ -181,6 +184,10 @@
</Image>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\projectM-sdl\audioCapture.hpp" />
<ClInclude Include="..\src\projectM-sdl\loopback.hpp" />
<ClInclude Include="..\src\projectM-sdl\pmSDL.hpp" />
<ClInclude Include="..\src\projectM-sdl\setup.hpp" />
<ClInclude Include="resource.h" />
</ItemGroup>
<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion src/libprojectM/PCM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ void PCM::freePCM()

#ifndef NDEBUG

#include <PresetLoader.hpp>
#include "PresetLoader.hpp"

#define TEST(cond) if (!verify(__FILE__ ": " #cond,cond)) return false
#define TEST2(str,cond) if (!verify(str,cond)) return false
Expand Down
2 changes: 0 additions & 2 deletions src/libprojectM/libprojectM.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,6 @@
1668542B2105E4BD0042793A /* Renderable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Renderable.cpp; path = Renderer/Renderable.cpp; sourceTree = "<group>"; };
1668542C2105E4BD0042793A /* PipelineContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PipelineContext.cpp; path = Renderer/PipelineContext.cpp; sourceTree = "<group>"; };
1668542D2105E4BD0042793A /* MilkdropWaveform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MilkdropWaveform.cpp; path = Renderer/MilkdropWaveform.cpp; sourceTree = "<group>"; };
168404F425D82ED70001F02C /* StaticGlShaders.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = StaticGlShaders.cpp; path = Renderer/StaticGlShaders.cpp; sourceTree = "<group>"; };
168404FE25D82FB80001F02C /* Intrinsics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Intrinsics.h; sourceTree = "<group>"; };
1687172320C33DF300947E7E /* TextureManager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = TextureManager.hpp; path = Renderer/TextureManager.hpp; sourceTree = "<group>"; };
1687172420C33DF300947E7E /* Renderable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Renderable.hpp; path = Renderer/Renderable.hpp; sourceTree = "<group>"; };
Expand Down Expand Up @@ -446,7 +445,6 @@
isa = PBXGroup;
children = (
168A57C62516226900E802A0 /* StaticGlShaders.cpp */,
168404F425D82ED70001F02C /* StaticGlShaders.cpp */,
166854412105E4C20042793A /* etc */,
1687172220C33DDF00947E7E /* headers */,
168C689F20BB265D000AFC1B /* hlslparser */,
Expand Down
2 changes: 1 addition & 1 deletion src/libprojectM/projectM-opengl.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// Enable openGL extra checks, better not be enabled in release build
#define OGL_DEBUG 0

// Unlock FPS for rendering benchmarks, it disables Vblank/Vsync and prints drawned frames count within a 5s test run
// Unlock FPS for rendering benchmarks, it disables Vblank/Vsync and prints drawn frame count within a 5s test run
#define UNLOCK_FPS 0

// If a shader compilation failure occurs, it dumps shader source into /tmp instead of stderr
Expand Down
4 changes: 2 additions & 2 deletions src/libprojectM/projectM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ bool projectM::writeConfig(const std::string & configFile, const Settings & sett
config.add("Easter Egg Parameter", settings.easterEgg);
config.add("Shuffle Enabled", settings.shuffleEnabled);
config.add("Soft Cut Ratings Enabled", settings.softCutRatingsEnabled);
std::fstream file(configFile.c_str());
std::fstream file(configFile.c_str(), std::ios_base::trunc | std::ios_base::out);
if (file) {
file << config;
return true;
Expand All @@ -164,7 +164,7 @@ bool projectM::writeConfig(const std::string & configFile, const Settings & sett



void projectM::readConfig (const std::string & configFile )
void projectM::readConfig (const std::string & configFile)
{
std::cout << "[projectM] config file: " << configFile << std::endl;

Expand Down
4 changes: 3 additions & 1 deletion src/projectM-sdl/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ ${my_CFLAGS} \
${SDL_CFLAGS}

bin_PROGRAMS = projectMSDL
projectMSDL_SOURCES = pmSDL.cpp projectM_SDL_main.cpp pmSDL.hpp
projectMSDL_SOURCES = pmSDL.cpp projectM_SDL_main.cpp pmSDL.hpp \
setup.cpp setup.hpp loopback.cpp loopback.hpp \
audioCapture.cpp audioCapture.hpp
projectMSDL_LDADD =
#projectMSDL_LDADD += -lasan
projectMSDL_LDADD += ${SDL_LIBS} ../libprojectM/libprojectM.la
Expand Down
18 changes: 18 additions & 0 deletions src/projectM-sdl/SDLprojectM.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@
168F715921124C0E001806E7 /* config.inp in Support files */ = {isa = PBXBuildFile; fileRef = 16B52AAA21105A6900830F34 /* config.inp */; };
168F715A21124C14001806E7 /* fonts in Support files */ = {isa = PBXBuildFile; fileRef = C3D30B8F1BF02BE5009AAACD /* fonts */; };
168F718021126256001806E7 /* AppIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 168F717F21126256001806E7 /* AppIcon.icns */; };
168FECCD25EA83F800E3E133 /* loopback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 168FECCB25EA83F800E3E133 /* loopback.cpp */; };
168FECD425EA86E900E3E133 /* setup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 168FECD225EA86E900E3E133 /* setup.cpp */; };
169BC64024CC3B56007B7829 /* presets in Copy Files */ = {isa = PBXBuildFile; fileRef = C307DFD31D565B57002F6B9E /* presets */; };
169BC64224CC3FCA007B7829 /* presets in Support files */ = {isa = PBXBuildFile; fileRef = C307DFD31D565B57002F6B9E /* presets */; };
169BC65024CC8401007B7829 /* fonts in Copy Files */ = {isa = PBXBuildFile; fileRef = C3D30B8F1BF02BE5009AAACD /* fonts */; };
16CFA3AC25EABCB100E7893C /* audioCapture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 16CFA3AA25EABCB100E7893C /* audioCapture.cpp */; };
C345215C1BF025A9001707D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C345215B1BF025A9001707D2 /* OpenGL.framework */; };
/* End PBXBuildFile section */

Expand Down Expand Up @@ -144,12 +147,18 @@
168F714921120210001806E7 /* ProjectM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ProjectM.app; sourceTree = BUILT_PRODUCTS_DIR; };
168F714B21120211001806E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
168F717F21126256001806E7 /* AppIcon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon.icns; sourceTree = "<group>"; };
168FECCB25EA83F800E3E133 /* loopback.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = loopback.cpp; sourceTree = "<group>"; };
168FECCC25EA83F800E3E133 /* loopback.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = loopback.hpp; sourceTree = "<group>"; };
168FECD225EA86E900E3E133 /* setup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = setup.cpp; sourceTree = "<group>"; };
168FECD325EA86E900E3E133 /* setup.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = setup.hpp; sourceTree = "<group>"; };
169501FE1F7009E9008FAF86 /* pmSDL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pmSDL.cpp; sourceTree = "<group>"; };
169501FF1F7009E9008FAF86 /* pmSDL.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pmSDL.hpp; sourceTree = "<group>"; };
169BC64B24CC8353007B7829 /* SDL2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SDL2.framework; sourceTree = "<group>"; };
169BC64D24CC83CD007B7829 /* SDL2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SDL2.framework; sourceTree = "<group>"; };
16B52AA8211054E900830F34 /* projectMSDL-pkg.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "projectMSDL-pkg.plist"; sourceTree = "<group>"; };
16B52AAA21105A6900830F34 /* config.inp */ = {isa = PBXFileReference; lastKnownFileType = text; path = config.inp; sourceTree = "<group>"; };
16CFA3AA25EABCB100E7893C /* audioCapture.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = audioCapture.cpp; sourceTree = "<group>"; };
16CFA3AB25EABCB100E7893C /* audioCapture.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = audioCapture.hpp; sourceTree = "<group>"; };
C307DFD31D565B57002F6B9E /* presets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = presets; path = ../../presets; sourceTree = "<group>"; };
C34521441BF02294001707D2 /* SDLprojectM */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SDLprojectM; sourceTree = BUILT_PRODUCTS_DIR; };
C345214E1BF022A5001707D2 /* projectM_SDL_main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = projectM_SDL_main.cpp; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -233,6 +242,12 @@
C345213B1BF02293001707D2 = {
isa = PBXGroup;
children = (
16CFA3AA25EABCB100E7893C /* audioCapture.cpp */,
16CFA3AB25EABCB100E7893C /* audioCapture.hpp */,
168FECD225EA86E900E3E133 /* setup.cpp */,
168FECD325EA86E900E3E133 /* setup.hpp */,
168FECCB25EA83F800E3E133 /* loopback.cpp */,
168FECCC25EA83F800E3E133 /* loopback.hpp */,
C60BD8E1259CF3CA0038831F /* SDLprojectM.entitlements */,
169501FF1F7009E9008FAF86 /* pmSDL.hpp */,
169501FE1F7009E9008FAF86 /* pmSDL.cpp */,
Expand Down Expand Up @@ -412,6 +427,9 @@
files = (
16355BFE2143C0F400B3748F /* projectM_SDL_main.cpp in Sources */,
16355BFF2143C0F600B3748F /* pmSDL.cpp in Sources */,
168FECCD25EA83F800E3E133 /* loopback.cpp in Sources */,
168FECD425EA86E900E3E133 /* setup.cpp in Sources */,
16CFA3AC25EABCB100E7893C /* audioCapture.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
152 changes: 152 additions & 0 deletions src/projectM-sdl/audioCapture.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
#include "audioCapture.hpp"

int projectMSDL::initAudioInput() {
// params for audio input
SDL_AudioSpec want, have;

// requested format
// https://wiki.libsdl.org/SDL_AudioSpec#Remarks
SDL_zero(want);
want.freq = 44100;
want.format = AUDIO_F32; // float
want.channels = 2; // mono might be better?
// lower might reduce latency
want.samples = PCM::maxsamples;
want.callback = projectMSDL::audioInputCallbackF32;
want.userdata = this;

audioDeviceID = SDL_OpenAudioDevice(SDL_GetAudioDeviceName(selectedAudioDevice, true), true, &want, &have, 0);

if (audioDeviceID == 0) {
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Failed to open audio capture device: %s", SDL_GetError());
return 0;
}

// read characteristics of opened capture device
SDL_Log("Opened audio capture device index=%i devId=%i: %s", selectedAudioDevice, audioDeviceID, SDL_GetAudioDeviceName(selectedAudioDevice, true));
std::string deviceToast = SDL_GetAudioDeviceName(selectedAudioDevice, true); // Example: Microphone rear
deviceToast += " selected";
projectM::setToastMessage(deviceToast);
#ifdef DEBUG
SDL_Log("Samples: %i, frequency: %i, channels: %i, format: %i", have.samples, have.freq, have.channels, have.format);
#endif
audioChannelsCount = have.channels;
audioSampleRate = have.freq;
audioSampleCount = have.samples;
audioFormat = have.format;
audioInputDevice = audioDeviceID;

return 1;
}

void projectMSDL::audioInputCallbackF32(void *userdata, unsigned char *stream, int len) {
projectMSDL *app = (projectMSDL *) userdata;
// printf("\nLEN: %i\n", len);
// for (int i = 0; i < 64; i++)
// printf("%X ", stream[i]);
// stream is (i think) samples*channels floats (native byte order) of len BYTES
if (app->audioChannelsCount == 1)
app->pcm()->addPCMfloat((float *)stream, len/sizeof(float));
else if (app->audioChannelsCount == 2)
app->pcm()->addPCMfloat_2ch((float *)stream, len/sizeof(float));
else {
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Multichannel audio not supported");
SDL_Quit();
}
}

void projectMSDL::audioInputCallbackS16(void *userdata, unsigned char *stream, int len) {
// printf("LEN: %i\n", len);
projectMSDL *app = (projectMSDL *) userdata;
short pcm16[2][512];

for (int i = 0; i < 512; i++) {
for (int j = 0; j < app->audioChannelsCount; j++) {
pcm16[j][i] = stream[i+j];
}
}
app->pcm()->addPCM16(pcm16);
}

int projectMSDL::toggleAudioInput() {
// trigger a toggle with CMD-I or CTRL-I
if (wasapi) { // we are currently on WASAPI, so we are going to revert to a microphone/line-in input.
if (this->openAudioInput())
this->beginAudioCapture();
CurAudioDevice = 0;
selectedAudioDevice = CurAudioDevice;
this->wasapi = false; // Track wasapi as off so projectMSDL will stop listening to WASAPI loopback in pmSDL_main.
}
else {
this->endAudioCapture(); // end current audio capture.
CurAudioDevice++; // iterate device index
if (CurAudioDevice >= NumAudioDevices) { // We reached outside the boundaries of available audio devices.
CurAudioDevice = 0; // Return to first audio device in the index.
#ifdef WASAPI_LOOPBACK
// If we are at the boundary and WASAPI is enabled then let's load WASAPI instead.
projectM::setToastMessage("Loopback audio selected");
SDL_Log("Loopback audio selected");
this->fakeAudio = false; // disable fakeAudio in case it was enabled.
this->wasapi = true; // Track wasapi as on so projectMSDL will listen to it.
#else
if (NumAudioDevices == 1) // If WASAPI_LOOPBACK was not enabled and there is only one audio device, it's pointless to toggle anything.
{
SDL_Log("There is only one audio capture device. There is nothing to toggle at this time.");
return 1;
}
// If WASAPI_LOOPBACK is not enabled and we have multiple input devices, return to device index 0 and let's listen to that device.
selectedAudioDevice = CurAudioDevice;
initAudioInput();
this->beginAudioCapture();
#endif
}
else {
// This is a normal scenario where we move forward in the audio device index.
selectedAudioDevice = CurAudioDevice;
initAudioInput();
this->beginAudioCapture();
}
}
return 1;
}

int projectMSDL::openAudioInput() {
fakeAudio = false; // if we are opening an audio input then there is no need for fake audio.
// get audio driver name (static)
#ifdef DEBUG
const char* driver_name = SDL_GetCurrentAudioDriver();
SDL_Log("Using audio driver: %s\n", driver_name);
#endif

// get audio input device
NumAudioDevices = SDL_GetNumAudioDevices(true); // capture, please

CurAudioDevice = 0;
if (NumAudioDevices == 0) {
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "No audio capture devices found");
projectM::setToastMessage("No audio capture devices found: using simulated audio");
fakeAudio = true;
return 0;
}
#ifdef DEBUG
for (unsigned int i = 0; i < NumAudioDevices; i++) {
SDL_Log("Found audio capture device %d: %s", i, SDL_GetAudioDeviceName(i, true));
}
#endif

// default selected Audio Device to 0.
selectedAudioDevice = 0;
initAudioInput();

return 1;
}

void projectMSDL::beginAudioCapture() {
// allocate a buffer to store PCM data for feeding in
SDL_PauseAudioDevice(audioDeviceID, false);
}

void projectMSDL::endAudioCapture() {
SDL_PauseAudioDevice(audioDeviceID, true);
SDL_CloseAudioDevice(audioDeviceID);
}
6 changes: 6 additions & 0 deletions src/projectM-sdl/audioCapture.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef audioCapture_hpp
#define audioCapture_hpp

#include "pmSDL.hpp"

#endif /* audioCapture_hpp */
31 changes: 13 additions & 18 deletions src/projectM-sdl/config.inp
Original file line number Diff line number Diff line change
@@ -1,28 +1,23 @@
# config.inp
# Configuration File for projectM

#Texture Size = 1024 # Size of internal rendering texture

Mesh X = 708 # Width of PerPixel Equation mesh
Mesh Y = 400 # Height of PerPixel Equation mesh
FPS = 60 # Frames Per Second
Fullscreen = false
Window Width = 512 # startup window width
Window Height = 512 # startup window height

Mesh X = 708 # Width of PerPixel Equation mesh
Mesh Y = 400 # Height of PerPixel Equation mesh
FPS = 60 # Frames Per Second
Smooth Transition Duration = 1 # in seconds
Preset Duration = 10 # in seconds

Hard Cuts Enabled = false # Hard Cuts are preset transitions that occur when your music becomes louder. They only occur after a hard cut duration threshold has passed.
Hard Cut Duration = 60 # Number of seconds before you become eligible for a hard cut.
Hard Cut Sensitivity = 1.0 # Volume sensitivity before a hard cut is triggered.

Beat Sensitivity = 1.0 # Beat Sensitivity impacts how reactive your visualizations are to volume, bass, mid-range, and treble. Default 1.0. Range: 0 - 5 (from "dead" to VERY reactive).
Preset Duration = 10 # in seconds
Hard Cuts Enabled = false # Hard Cuts are preset transitions that occur when your music becomes louder. They only occur after a hard cut duration threshold has passed.
Hard Cut Duration = 60 # Number of seconds before you become eligible for a hard cut.
Hard Cut Sensitivity = 1.0 # Volume sensitivity before a hard cut is triggered.
Beat Sensitivity = 1.0 # Beat Sensitivity impacts how reactive your visualizations are to volume, bass, mid-range, and treble. Default 1.0. Range: 0 - 5 (from "dead" to VERY reactive).

# mostly ignored in projectM-SDL
#Texture Size = 1024 # Size of internal rendering texture
Window Width = 512 # startup window width
Window Height = 512 # startup window height
Fullscreen = false
Easter Egg Parameter = 1

Aspect Correction = true # Custom Shape Aspect Correction

Preset Path = presets # preset location
Title Font = Vera.ttf
Menu Font = VeraMono.ttf
Loading