Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
de2b8c9
list DLLs in VST dir
sqrvrt Mar 13, 2026
35fcba1
load VST to get metadata
sqrvrt Mar 19, 2026
4d783a2
distinguish instruments from effects
sqrvrt Mar 19, 2026
913d9e2
adapt VstEffect to use VstList
sqrvrt Mar 19, 2026
9c7078f
basic fix for broken load fail detection
sqrvrt Mar 19, 2026
47e732b
Add checksum verification; yeet QObject from VstList parents
sqrvrt Mar 20, 2026
cae2345
store cache; fix hash returning pointer instead
sqrvrt Mar 20, 2026
47b374a
merge SubPluginFeatures impls and move them to VstBase
sqrvrt Mar 20, 2026
64d4223
Add display-related functions
sqrvrt Mar 20, 2026
01732a3
babysit Qt5
sqrvrt Mar 20, 2026
403398d
actually follow symlinks
sqrvrt Mar 20, 2026
fef856e
babysit Qt5 even harder
sqrvrt Mar 20, 2026
ad4b0bc
use plugin name on instrument load
sqrvrt Mar 21, 2026
a7b1147
same thing but for VstEffect
sqrvrt Mar 21, 2026
75a5d49
try to fix broken windows build
sqrvrt Mar 22, 2026
13a37a4
scan global paths for VSTs
sqrvrt Mar 22, 2026
b860255
deduplicate VSTs
sqrvrt Mar 22, 2026
e88a0f5
make vst loading optional; fix windows build
sqrvrt Mar 23, 2026
7bf6150
Show Vestige as regular instrument when no VST plugins are found
sqrvrt Mar 24, 2026
047739c
Merge branch 'master' of github.com:LMMS/lmms into vst-listing
sqrvrt Mar 27, 2026
4649bc7
Merge remote-tracking branch 'upstream/master' into vst-listing
sqrvrt Jul 19, 2026
3ff8f44
add toggle for vst load on scan
sqrvrt Jul 19, 2026
2b653f0
yeet deduplication logic, use hashes as keys instead
sqrvrt Jul 19, 2026
eb8ca26
friendship ended with md5; sha256 is my new best friend
sqrvrt Jul 19, 2026
e1170a6
fix build fail????
sqrvrt Jul 19, 2026
48be5e2
fix build fail 2
sqrvrt Jul 19, 2026
e01319d
fix build fail 3
sqrvrt Jul 19, 2026
71d27a4
shut up windows
sqrvrt Jul 19, 2026
1352004
display scan progress
sqrvrt Jul 19, 2026
9f20573
babysit qt5 even harder
sqrvrt Aug 6, 2026
6fbe823
Merge remote-tracking branch 'upstream/master' into vst-listing
sqrvrt Aug 6, 2026
5645f7b
bump literally only so that CI reruns
sqrvrt Aug 6, 2026
ae7787a
so apparently CI doesn't run on empty commits
sqrvrt Aug 6, 2026
36de6db
actually no it does, github was just broken
sqrvrt Aug 7, 2026
9fbf0ca
maybe fix msvc build fail
sqrvrt Aug 7, 2026
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
4 changes: 2 additions & 2 deletions include/Plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class LMMS_EXPORT Plugin : public Model, public JournallingObject
//! Descriptor holds information about a plugin - every external plugin
//! has to instantiate such a Descriptor in an extern "C"-section so that
//! the plugin-loader is able to access information about the plugin
struct Descriptor
struct LMMS_EXPORT Descriptor
{
const char * name;
const char * displayName;
Expand Down Expand Up @@ -132,7 +132,7 @@ class LMMS_EXPORT Plugin : public Model, public JournallingObject
SubPluginFeatures, which are like values
in a key-value map).
*/
struct Key
struct LMMS_EXPORT Key
{
using AttributeMap = QMap<QString, QString>;

Expand Down
2 changes: 2 additions & 0 deletions include/SetupDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ private slots:
void toggleAnimateAFP(bool enabled);
void vstEmbedMethodChanged();
void toggleVSTAlwaysOnTop(bool en);
void toggleVstScanExec(bool enabled) { m_vstScanExec = enabled; };
void toggleDisableAutoQuit(bool enabled);
void toggleMixSanitization(bool enabled);

Expand Down Expand Up @@ -173,6 +174,7 @@ private slots:
QString m_vstEmbedMethod;
QCheckBox * m_vstAlwaysOnTopCheckBox;
bool m_vstAlwaysOnTop;
bool m_vstScanExec;
bool m_disableAutoQuit;

using AswMap = QMap<QString, AudioDeviceSetupWidget*>;
Expand Down
24 changes: 18 additions & 6 deletions plugins/Vestige/Vestige.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@
#include "SubWindow.h"
#include "TextFloat.h"
#include "VstPlugin.h"
#include "VstSubPluginFeatures.h"
#include "VstList.h"

namespace lmms
{
Expand Down Expand Up @@ -81,7 +83,9 @@ Plugin::Descriptor Q_DECL_EXPORT vestige_plugin_descriptor =
"so",
# endif
#endif
nullptr,
(!ConfigManager::inst()->value("app", "vstscanexec", "0").toInt() || VstList::inst()->plugins().empty())
? nullptr // makes Vestige appear as a plugin by itself
: new VstSubPluginFeatures(Plugin::Type::Instrument),
} ;

}
Expand Down Expand Up @@ -149,8 +153,8 @@ class VstInstrumentPlugin : public VstPlugin



VestigeInstrument::VestigeInstrument( InstrumentTrack * _instrument_track ) :
Instrument(_instrument_track, &vestige_plugin_descriptor, nullptr, Flag::IsSingleStreamed | Flag::IsMidiBased),
VestigeInstrument::VestigeInstrument(InstrumentTrack* instrumentTrack, Plugin::Descriptor::SubPluginFeatures::Key* key) :
Instrument(instrumentTrack, &vestige_plugin_descriptor, nullptr, Flag::IsSingleStreamed | Flag::IsMidiBased),
m_plugin( nullptr ),
m_pluginMutex(),
m_subWindow( nullptr ),
Expand All @@ -159,12 +163,17 @@ VestigeInstrument::VestigeInstrument( InstrumentTrack * _instrument_track ) :
p_subWindow( nullptr )
{
// now we need a play-handle which cares for calling play()
auto iph = new InstrumentPlayHandle(this, _instrument_track);
auto iph = new InstrumentPlayHandle(this, instrumentTrack);
Engine::audioEngine()->addPlayHandle( iph );

connect( ConfigManager::inst(), SIGNAL( valueChanged(QString,QString,QString) ),
this, SLOT( handleConfigChange(QString, QString, QString) ),
Qt::QueuedConnection );
if (auto& path = key->attributes["file"]; !path.isEmpty())
{
loadFile(path);
setDisplayName(key->displayName());
}
}


Expand Down Expand Up @@ -1182,9 +1191,12 @@ extern "C"
{

// necessary for getting instance out of shared lib
Q_DECL_EXPORT Plugin * lmms_plugin_main( Model *m, void * )
Q_DECL_EXPORT Plugin * lmms_plugin_main(Model* m, void* data)
{
return new VestigeInstrument( static_cast<InstrumentTrack *>( m ) );
return new VestigeInstrument{
static_cast<InstrumentTrack*>(m),
static_cast<Plugin::Descriptor::SubPluginFeatures::Key*>(data)
};
}


Expand Down
2 changes: 1 addition & 1 deletion plugins/Vestige/Vestige.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class VestigeInstrument : public Instrument
{
Q_OBJECT
public:
VestigeInstrument( InstrumentTrack * _instrument_track );
VestigeInstrument(InstrumentTrack* instrumentTrack, Plugin::Descriptor::SubPluginFeatures::Key* data);
virtual ~VestigeInstrument();

virtual void play( SampleFrame* _working_buffer );
Expand Down
57 changes: 30 additions & 27 deletions plugins/VstBase/RemoteVstPlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,9 @@ class RemoteVstPlugin : public RemotePluginClient
{
public:
#ifdef SYNC_WITH_SHM_FIFO
RemoteVstPlugin( const std::string& _shm_in, const std::string& _shm_out );
RemoteVstPlugin(const std::string& _shm_in, const std::string& _shm_out, bool skipInit = false);
#else
RemoteVstPlugin( const char * socketPath );
RemoteVstPlugin(const char* socketPath, bool skipInit = false);
#endif
virtual ~RemoteVstPlugin();

Expand Down Expand Up @@ -491,16 +491,17 @@ class RemoteVstPlugin : public RemotePluginClient
};

Sync m_sync;
bool m_skipInit;
};




#ifdef SYNC_WITH_SHM_FIFO
RemoteVstPlugin::RemoteVstPlugin( const std::string& _shm_in, const std::string& _shm_out ) :
RemoteVstPlugin::RemoteVstPlugin(const std::string& _shm_in, const std::string& _shm_out, bool skipInit) :
RemotePluginClient( _shm_in, _shm_out ),
#else
RemoteVstPlugin::RemoteVstPlugin( const char * socketPath ) :
RemoteVstPlugin::RemoteVstPlugin(const char * socketPath, bool skipInit) :
RemotePluginClient( socketPath ),
#endif
m_libInst( nullptr ),
Expand All @@ -519,7 +520,8 @@ RemoteVstPlugin::RemoteVstPlugin( const char * socketPath ) :
m_midiEvents(),
m_bpm( 0 ),
m_currentSamplePos( 0 ),
m_currentProgram(-1)
m_currentProgram(-1),
m_skipInit{skipInit}
{
__plugin = this;

Expand Down Expand Up @@ -749,26 +751,25 @@ void RemoteVstPlugin::init( const std::string & _plugin_file )

setResumed( true );

debugMessage( "creating editor\n" );
initEditor();
debugMessage( "editor successfully created\n" );
if (!m_skipInit) {
debugMessage( "creating editor\n" );
initEditor();
debugMessage( "editor successfully created\n" );
}


// now post some information about our plugin
sendMessage( message( IdVstPluginWindowID ).addInt( m_windowID ) );

sendMessage( message( IdVstPluginEditorGeometry ).
addInt( m_windowWidth ).
addInt( m_windowHeight ) );
sendMessage( message( IdVstPluginName ).addString( pluginName() ) );
debugMessage( std::string("plugin name: ") + pluginName() + "\n" );
sendMessage( message( IdVstPluginVersion ).addInt( pluginVersion() ) );
sendMessage( message( IdVstPluginVendorString ).
addString( pluginVendorString() ) );
sendMessage( message( IdVstPluginProductString ).
addString( pluginProductString() ) );
sendMessage( message( IdVstParameterCount ).
addInt( m_plugin->numParams ) );
sendMessage(message(IdVstPluginWindowID).addInt(m_windowID));

sendMessage(message(IdVstPluginEditorGeometry).addInt(m_windowWidth).addInt(m_windowHeight));
sendMessage(message(IdVstPluginName).addString(pluginName()));
debugMessage(std::string("plugin name: ") + pluginName() + "\n");
sendMessage(message(IdVstPluginVersion).addInt(pluginVersion()));
sendMessage(message(IdVstPluginVendorString).addString(pluginVendorString()));
sendMessage(message(IdVstPluginProductString).addString(pluginProductString()));
sendMessage(message(IdVstParameterCount).addInt(m_plugin->numParams));

if (m_plugin->flags & effFlagsIsSynth) { sendMessage(message(IdVstIsSynth)); }

sendMessage( IdInitDone );

Expand Down Expand Up @@ -1034,7 +1035,7 @@ bool RemoteVstPlugin::load( const std::string & _plugin_file )

sendMessage( message( IdVstPluginUniqueID ).addString( id ) );

pluginDispatch( effOpen );
if (!m_skipInit){ pluginDispatch(effOpen); }

return true;
}
Expand Down Expand Up @@ -2480,9 +2481,9 @@ int main( int _argc, char * * _argv )
using lmms::RemoteVstPlugin;

#ifdef SYNC_WITH_SHM_FIFO
if( _argc < 4 )
if( _argc < 5 )
#else
if( _argc < 3 )
if( _argc < 4 )
#endif
{
fprintf( stderr, "not enough arguments\n" );
Expand Down Expand Up @@ -2540,13 +2541,15 @@ int main( int _argc, char * * _argv )
}

#endif
bool skipInit;
{
#ifdef SYNC_WITH_SHM_FIFO
int embedMethodIndex = 3;
#else
int embedMethodIndex = 2;
#endif
std::string embedMethod = _argv[embedMethodIndex];
skipInit = _argv[embedMethodIndex+1][0] != '0';

if ( embedMethod == "none" )
{
Expand Down Expand Up @@ -2590,9 +2593,9 @@ int main( int _argc, char * * _argv )
// constructor automatically will process messages until it receives
// a IdVstLoadPlugin message and processes it
#ifdef SYNC_WITH_SHM_FIFO
__plugin = new RemoteVstPlugin( _argv[1], _argv[2] );
__plugin = new RemoteVstPlugin{_argv[1], _argv[2], skipInit};
#else
__plugin = new RemoteVstPlugin( _argv[1] );
__plugin = new RemoteVstPlugin{_argv[1], skipInit};
#endif

if( __plugin->isInitialized() )
Expand Down
Loading
Loading