1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4     Sonic Visualiser
5     An audio file viewer and annotation editor.
6     Centre for Digital Music, Queen Mary, University of London.
7 
8     This program is free software; you can redistribute it and/or
9     modify it under the terms of the GNU General Public License as
10     published by the Free Software Foundation; either version 2 of the
11     License, or (at your option) any later version.  See the file
12     COPYING included with this distribution for more information.
13 */
14 
15 /*
16    This is a modified version of a source file from the
17    Rosegarden MIDI and audio sequencer and notation editor.
18    This file copyright 2000-2006 Chris Cannam and Richard Bown.
19 */
20 
21 #ifndef SV_LADSPA_PLUGIN_FACTORY_H
22 #define SV_LADSPA_PLUGIN_FACTORY_H
23 
24 #include "RealTimePluginFactory.h"
25 #include "api/ladspa.h"
26 
27 #include "PluginScan.h"
28 
29 #include <vector>
30 #include <map>
31 #include <set>
32 #include <QString>
33 
34 class LADSPAPluginInstance;
35 
36 class LADSPAPluginFactory : public RealTimePluginFactory
37 {
38 public:
39     virtual ~LADSPAPluginFactory();
40 
41     void discoverPlugins() override;
42 
43     const std::vector<QString> &getPluginIdentifiers() const override;
44 
45     void enumeratePlugins(std::vector<QString> &list) override;
46 
47     const RealTimePluginDescriptor *getPluginDescriptor(QString identifier) const override;
48 
49     RealTimePluginInstance *instantiatePlugin(QString identifier,
50                                                       int clientId,
51                                                       int position,
52                                                       sv_samplerate_t sampleRate,
53                                                       int blockSize,
54                                                       int channels) override;
55 
56     QString getPluginCategory(QString identifier) override;
57 
58     QString getPluginLibraryPath(QString identifier) override;
59 
60     float getPortMinimum(const LADSPA_Descriptor *, int port);
61     float getPortMaximum(const LADSPA_Descriptor *, int port);
62     float getPortDefault(const LADSPA_Descriptor *, int port);
63     float getPortQuantization(const LADSPA_Descriptor *, int port);
64     int getPortDisplayHint(const LADSPA_Descriptor *, int port);
65 
66     static std::vector<QString> getPluginPath();
67 
68 protected:
69     LADSPAPluginFactory();
70     friend class RealTimePluginFactory;
71 
getPluginType()72     virtual PluginScan::PluginType getPluginType() const {
73         return PluginScan::LADSPAPlugin;
74     }
75 
76     virtual std::vector<QString> getLRDFPath(QString &baseUri);
77 
78     virtual void discoverPluginsFrom(QString soName);
79     virtual void generateTaxonomy(QString uri, QString base);
80     virtual void generateFallbackCategories();
81 
82     void releasePlugin(RealTimePluginInstance *, QString) override;
83 
84     virtual const LADSPA_Descriptor *getLADSPADescriptor(QString identifier);
85 
86     void loadLibrary(QString soName);
87     void unloadLibrary(QString soName);
88     void unloadUnusedLibraries();
89 
90     std::vector<QString> m_identifiers;
91     std::map<QString, QString> m_libraries; // identifier -> full file path
92     std::map<QString, RealTimePluginDescriptor *> m_rtDescriptors;
93 
94     std::map<QString, QString> m_taxonomy;
95     std::map<unsigned long, QString> m_lrdfTaxonomy;
96     std::map<unsigned long, std::map<int, float> > m_portDefaults;
97 
98     std::set<RealTimePluginInstance *> m_instances;
99 
100     typedef std::map<QString, void *> LibraryHandleMap;
101     LibraryHandleMap m_libraryHandles;
102 };
103 
104 #endif
105 
106