19 #include <QCoreApplication>
21 #include <QLibraryInfo>
22 #include <QPluginLoader>
50 class BackendManager::BackendManagerPrivate {
52 QList<MIDIInput*> m_inputsList;
53 QList<MIDIOutput*> m_outputsList;
55 QString m_inputBackend{QLatin1String(
"Network")};
56 #if defined(Q_OS_LINUX)
57 QStringList m_outputBackends{QLatin1String(
"SonivoxEAS"),QLatin1String(
"FluidSynth"),QLatin1String(
"ALSA")};
58 #elif defined(Q_OS_DARWIN)
59 QStringList m_outputBackends{QLatin1String(
"DLS Synth"),QLatin1String(
"FluidSynth"),QLatin1String(
"CoreMIDI")};
60 #elif defined(Q_OS_WINDOWS)
61 QStringList m_outputBackends{QLatin1String(
"Windows MM"),QLatin1String(
"FluidSynth")};
62 #elif defined(Q_OS_UNIX)
63 QStringList m_outputBackends{QLatin1String(
"FluidSynth"),QLatin1String(
"OSS")};
65 QStringList m_outputBackends{m_inputBackend};
68 ~BackendManagerPrivate()
75 m_outputsList.clear();
77 void appendDir(
const QString& candidate, QStringList& result)
79 QDir checked(candidate.trimmed());
81 if (checked.exists() && !result.contains(checked.absolutePath())) {
82 result << checked.absolutePath();
92 QVariantMap defaultSettings {
93 { QSTR_DRUMSTICKRT_PUBLICNAMEIN, QStringLiteral(
"MIDI In")},
94 { QSTR_DRUMSTICKRT_PUBLICNAMEOUT, QStringLiteral(
"MIDI Out")}
112 QString appPath = QCoreApplication::applicationDirPath() + QDir::separator();
113 #if defined(Q_OS_WIN)
114 d->appendDir( appPath + QSTR_DRUMSTICK, result );
115 d->appendDir( appPath +
"../lib/" + QSTR_DRUMSTICK, result );
117 #if defined(Q_OS_MAC)
118 d->appendDir( appPath + QStringLiteral(
"../PlugIns/") + QSTR_DRUMSTICK, result );
122 #if defined(LIBSUFFIX)
123 libs << QString(
"../%1/").arg(QT_STRINGIFY(LIBSUFFIX));
125 foreach(
const QString& lib, libs) {
126 d->appendDir( appPath + lib + QSTR_DRUMSTICK, result );
129 d->appendDir( appPath +
".." + QDir::separator() + QSTR_DRUMSTICK, result );
130 QByteArray envdir = qgetenv(QSTR_DRUMSTICKRT.toLatin1());
132 if(!envdir.isEmpty()) {
133 d->appendDir(QString(envdir), result );
135 d->appendDir( QDir::homePath() + QDir::separator() + QSTR_DRUMSTICK, result );
136 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
137 d->appendDir( QLibraryInfo::location(QLibraryInfo::PluginsPath) + QDir::separator() + QSTR_DRUMSTICK, result );
139 d->appendDir( QLibraryInfo::path(QLibraryInfo::PluginsPath) + QDir::separator() + QSTR_DRUMSTICK, result );
141 foreach(
const QString& path, QCoreApplication::libraryPaths()) {
142 d->appendDir( path + QDir::separator() + QSTR_DRUMSTICK, result );
154 settings->beginGroup(QSTR_DRUMSTICKRT_GROUP);
155 const QStringList allKeys = settings->allKeys();
157 for(
const auto &k : allKeys) {
158 tmpMap.insert(k, settings->value(k));
160 settings->endGroup();
176 d->appendDir(map.value(QSTR_DRUMSTICKRT_PATH).toString(), paths);
177 name_in = map.value(QSTR_DRUMSTICKRT_PUBLICNAMEIN).toString();
178 name_out = map.value(QSTR_DRUMSTICKRT_PUBLICNAMEOUT).toString();
179 names << map.value(QSTR_DRUMSTICKRT_EXCLUDED).toStringList();
180 names << (name_in.isEmpty() ? QStringLiteral(
"MIDI In") : name_in);
181 names << (name_out.isEmpty() ? QStringLiteral(
"MIDI Out") : name_out);
189 foreach(
const QString& dir, paths) {
190 QDir pluginsDir(dir);
191 foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
192 if (QLibrary::isLibrary(fileName)) {
193 QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
194 QObject *obj = loader.instance();
195 if (obj !=
nullptr) {
196 MIDIInput *input = qobject_cast<MIDIInput*>(obj);
197 if (input !=
nullptr && !d->m_inputsList.contains(input)) {
198 if (!name_in.isEmpty()) {
202 d->m_inputsList << input;
204 MIDIOutput *output = qobject_cast<MIDIOutput*>(obj);
205 if (output !=
nullptr && !d->m_outputsList.contains(output)) {
206 if (!name_out.isEmpty()) {
210 d->m_outputsList << output;
219 foreach(
QObject* obj, QPluginLoader::staticInstances()) {
220 if (obj !=
nullptr) {
221 MIDIInput *input = qobject_cast<MIDIInput*>(obj);
222 if (input !=
nullptr && !d->m_inputsList.contains(input)) {
223 if (!name_in.isEmpty()) {
227 d->m_inputsList << input;
229 MIDIOutput *output = qobject_cast<MIDIOutput*>(obj);
230 if (output !=
nullptr && !d->m_outputsList.contains(output)) {
231 if (!name_out.isEmpty()) {
235 d->m_outputsList << output;
244 return d->m_inputsList;
249 return d->m_outputsList;
254 foreach (
MIDIInput* i, d->m_inputsList) {
274 QStringList names{name};
275 names << d->m_inputBackend;
276 names.removeDuplicates();
277 if (!names.isEmpty()) {
278 foreach(
const QString& n, names) {
279 foreach(
MIDIInput* input, d->m_inputsList) {
291 QStringList names{name};
292 names << d->m_outputBackends;
293 names.removeDuplicates();
294 if (!names.isEmpty()) {
295 foreach(
const QString& n, names) {
296 foreach(
MIDIOutput* output, d->m_outputsList) {
306 const QString BackendManager::QSTR_DRUMSTICK = QStringLiteral(
"drumstick2");
307 const QString BackendManager::QSTR_DRUMSTICK_VERSION = QStringLiteral(QT_STRINGIFY(VERSION));
308 const QString BackendManager::QSTR_DRUMSTICKRT = QStringLiteral(
"DRUMSTICKRT");
309 const QString BackendManager::QSTR_DRUMSTICKRT_GROUP = QStringLiteral(
"DrumstickRT");
310 const QString BackendManager::QSTR_DRUMSTICKRT_PUBLICNAMEIN = QStringLiteral(
"PublicNameIN");
311 const QString BackendManager::QSTR_DRUMSTICKRT_PUBLICNAMEOUT = QStringLiteral(
"PublicNameOUT");
312 const QString BackendManager::QSTR_DRUMSTICKRT_EXCLUDED = QStringLiteral(
"ExcludedNames");
313 const QString BackendManager::QSTR_DRUMSTICKRT_PATH = QStringLiteral(
"BackendsPath");
321 return BackendManager::QSTR_DRUMSTICK_VERSION;
BackendManager class declaration.
The QObject class is the base class of all Qt objects.
The QSettings class provides persistent platform-independent application settings.
QList< MIDIInput * > availableInputs()
availableInputs
virtual ~BackendManager()
~BackendManager destructor
BackendManager()
BackendManager constructor.
MIDIOutput * outputBackendByName(const QString name)
outputBackendByName
void refresh(QSettings *settings=nullptr)
refresh the list of backends
QList< MIDIOutput * > availableOutputs()
availableOutputs
MIDIOutput * findOutput(QString name)
findOutput returns the backend corresponding to the provided name, or a suitable output instead.
MIDIInput * findInput(QString name)
findInput returns the backend corresponding to the provided name, or a suitable input instead.
QStringList defaultPaths()
defaultPaths
MIDIInput * inputBackendByName(const QString name)
inputBackendByName
virtual void setExcludedConnections(QStringList conns)=0
setExcludedConnections
virtual QString backendName()=0
backendName
virtual void setPublicName(QString name)=0
setPublicName
QString DRUMSTICK_EXPORT drumstickLibraryVersion()
drumstickLibraryVersion provides the Drumstick version as an edited QString