aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Effect/ladspa/ladspahost.cpp641
-rw-r--r--src/plugins/Effect/ladspa/ladspahost.h39
-rw-r--r--src/plugins/Effect/ladspa/settingsdialog.cpp44
-rw-r--r--src/plugins/Effect/ladspa/settingsdialog.h11
-rw-r--r--src/plugins/Effect/ladspa/settingsdialog.ui4
5 files changed, 322 insertions, 417 deletions
diff --git a/src/plugins/Effect/ladspa/ladspahost.cpp b/src/plugins/Effect/ladspa/ladspahost.cpp
index b1c4c7f8c..dec305e60 100644
--- a/src/plugins/Effect/ladspa/ladspahost.cpp
+++ b/src/plugins/Effect/ladspa/ladspahost.cpp
@@ -37,22 +37,23 @@
LADSPAHost *LADSPAHost::m_instance = 0;
+/* Based on xmms_ladspa */
+
LADSPAHost::LADSPAHost(QObject *parent) : QObject(parent)
{
- m_chan = 0;
- m_freq = 0;
+ m_chan = 2;
+ m_freq = 44100;
m_instance = this;
- findAllPlugins();
+ loadModules();
QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
int p = settings.value("LADSPA/plugins_number", 0).toInt();
for(int i = 0; i < p; ++i)
{
QString section = QString("LADSPA_%1/").arg(i);
- int id = settings.value(section +"id").toInt();
- QString file = settings.value(section +"file").toString();
- int ports = settings.value(section +"ports").toInt();
+ settings.beginGroup(section);
+ int id = settings.value("id").toInt();
LADSPAPlugin *plugin = 0;
foreach(LADSPAPlugin *p, plugins())
@@ -66,12 +67,12 @@ LADSPAHost::LADSPAHost(QObject *parent) : QObject(parent)
if(!plugin)
continue;
- LADSPAEffect *effect = addPlugin(plugin);
- for(int j = 0; j < ports; ++j)
- {
- double value = settings.value(section + QString("port%1").arg(j)).toDouble();
- effect->knobs[j] = value;
- }
+ LADSPAEffect *effect = createEffect(plugin);
+ foreach (LADSPAControl *c, effect->controls)
+ c->value = settings.value(QString("port%1").arg(c->port), c->value).toFloat();
+
+ m_effects.append(effect);
+ settings.endGroup();
}
}
@@ -79,47 +80,49 @@ LADSPAHost::~LADSPAHost()
{
m_instance = 0;
QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
+ for(int i = 0; i < settings.value("LADSPA/plugins_number", 0).toInt(); ++i)
+ {
+ settings.remove(QString("LADSPA_%1/").arg(i));
+ }
settings.setValue("LADSPA/plugins_number", m_effects.count());
for(int i = 0; i < m_effects.count(); ++i)
{
QString section = QString("LADSPA_%1/").arg(i);
- settings.setValue(section +"id", (quint64)m_effects[i]->descriptor->UniqueID);
- settings.setValue(section +"file", m_effects[i]->fileName);
+ settings.beginGroup(section);
- int ports = qMin((int)m_effects[i]->descriptor->PortCount, MAX_KNOBS);
- settings.setValue(section +"ports", ports);
- for(int j = 0; j < ports; ++j)
- {
- settings.setValue(section + QString("port%1").arg(j),
- m_effects[i]->knobs[j]);
- }
+ settings.setValue("id", (quint64)m_effects[i]->plugin->desc->UniqueID);
+
+ foreach (LADSPAControl *c, m_effects[i]->controls)
+ settings.setValue(QString("port%1").arg(c->port), c->value);
+
+ settings.endGroup();
}
- foreach(LADSPAEffect *effect, m_effects)
- unload(effect);
+ unloadModules();
}
void LADSPAHost::configure(quint32 freq, int chan)
{
m_chan = chan;
m_freq = freq;
- foreach(LADSPAEffect *e, m_effects)
+
+ foreach (LADSPAEffect *e, m_effects)
{
- const LADSPA_Descriptor *descriptor = e->descriptor;
- if (e->handle)
+ //deactivate effect
+ deactivateEffect(e);
+ //update controls for new sample rate
+ for(int i = 0; i < e->controls.count(); ++i)
{
- if (descriptor->deactivate)
- descriptor->deactivate(e->handle);
- descriptor->cleanup(e->handle);
- e->handle = 0;
- }
- if (e->handle2)
- {
- if (descriptor->deactivate)
- descriptor->deactivate(e->handle2);
- descriptor->cleanup(e->handle2);
- e->handle2 = 0;
+ LADSPAControl *c = e->controls[i];
+ unsigned long port = c->port;
+ if(LADSPA_IS_HINT_SAMPLE_RATE(e->plugin->desc->PortRangeHints[port].HintDescriptor))
+ {
+ double value = c->value;
+ delete c;
+ e->controls[i] = createControl(e->plugin->desc, port);
+ e->controls[i]->value = value; //restore value
+ }
}
- bootPlugin(e);
+ activateEffect(e);
}
}
@@ -128,21 +131,10 @@ LADSPAHost* LADSPAHost::instance()
return m_instance;
}
-QList <LADSPAPlugin *> LADSPAHost::plugins()
-{
- return m_plugins;
-}
-
-QList <LADSPAEffect *> LADSPAHost::effects()
-{
- return m_effects;
-}
-
-/*Based on xmms_ladspa */
-void LADSPAHost::findAllPlugins()
+void LADSPAHost::loadModules()
{
- while(!m_plugins.isEmpty()) /* empty list */
- delete m_plugins.takeFirst();
+ if(!m_modules.isEmpty())
+ return;
QString ladspa_path = qgetenv("LADSPA_PATH");
QStringList directories;
@@ -158,385 +150,296 @@ void LADSPAHost::findAllPlugins()
else
directories = ladspa_path.split(':');
foreach(QString dir, directories)
- findPlugins(dir);
+ findModules(dir);
}
-LADSPAEffect *LADSPAHost::load(const QString &filename, long int num)
+void LADSPAHost::findModules(const QString &path)
{
- LADSPA_Descriptor_Function descriptor_fn;
- LADSPAEffect *instance = new LADSPAEffect;
-
- instance->fileName = filename;
- instance->library = dlopen(qPrintable(filename), RTLD_LAZY);
- instance->handle = 0;
- instance->handle2 = 0;
- if (!instance->library)
- {
- delete instance;
- return 0;
- }
- descriptor_fn = (LADSPA_Descriptor_Function) dlsym(instance->library, "ladspa_descriptor");
- if (!descriptor_fn)
+ QDir dir (path);
+ dir.setFilter(QDir::Files | QDir::Hidden);
+ dir.setSorting(QDir::Name);
+ QFileInfoList files = dir.entryInfoList((QStringList() << "*.so"));
+
+ foreach(QFileInfo file, files)
{
- dlclose(instance->library);
- delete instance;
- return 0;
- }
- instance->descriptor = descriptor_fn(num);
+ void *library = dlopen(qPrintable(file.absoluteFilePath ()), RTLD_LAZY);
+ if (!library)
+ continue;
- return instance;
-}
+ LADSPA_Descriptor_Function descriptor_fn = (LADSPA_Descriptor_Function) dlsym(library, "ladspa_descriptor");
+ if (!descriptor_fn)
+ {
+ dlclose(library);
+ continue;
+ }
-void LADSPAHost::unload(LADSPAEffect *instance)
-{
- const LADSPA_Descriptor *descriptor = instance->descriptor;
+ m_modules.append(library);
- if (instance->handle)
- {
- if (descriptor->deactivate)
- descriptor->deactivate(instance->handle);
- descriptor->cleanup(instance->handle);
- instance->handle = 0;
- }
- if (instance->handle2)
- {
- if (descriptor->deactivate)
- descriptor->deactivate(instance->handle2);
- descriptor->cleanup(instance->handle2);
- instance->handle2 = 0;
- }
+ unsigned long k = 0;
+ const LADSPA_Descriptor *descriptor;
- if (instance->library)
- {
- dlclose(instance->library);
- instance->library = 0;
+ while((descriptor = descriptor_fn(k)) != 0)
+ {
+ if(LADSPA_IS_INPLACE_BROKEN(descriptor->Properties))
+ {
+ qWarning("LADSPAHost: plugin %s is ignored due to LADSPA_PROPERTY_INPLACE_BROKEN property", descriptor->Name);
+ continue;
+ }
+ LADSPAPlugin *plugin = new LADSPAPlugin;
+ plugin->name = strdup(descriptor->Name);
+ plugin->id = k;
+ plugin->unique_id = descriptor->UniqueID;
+ plugin->desc = descriptor;
+ m_plugins.append(plugin);
+ k++;
+ }
}
- m_effects.removeAll(instance);
- qDeleteAll(instance->controls);
- delete instance;
}
-void LADSPAHost::bootPlugin(LADSPAEffect *instance)
+void LADSPAHost::unloadModules()
{
- const LADSPA_Descriptor *descriptor = instance->descriptor;
-
- instance->handle = descriptor->instantiate(descriptor, m_freq);
- if (m_chan > 1 && !instance->stereo)
+ while(!m_effects.isEmpty())
{
- /* Create an additional instance */
- instance->handle2 = descriptor->instantiate(descriptor, m_freq);
+ LADSPAEffect *e = m_effects.takeLast();
+ deactivateEffect(e);
+ delete e;
}
+ qDeleteAll(m_plugins);
+ m_plugins.clear();
+ while (!m_modules.isEmpty())
+ dlclose(m_modules.takeFirst());
+}
- portAssign(instance);
+LADSPAEffect *LADSPAHost::createEffect(LADSPAPlugin *plugin)
+{
+ LADSPAEffect *effect = new LADSPAEffect;
+ effect->plugin = plugin;
- if (descriptor->activate)
+ for(unsigned long port = 0; port < plugin->desc->PortCount; port++)
{
- descriptor->activate(instance->handle);
- if (instance->handle2)
- descriptor->activate(instance->handle2);
+ LADSPA_PortDescriptor d = plugin->desc->PortDescriptors[port];
+ if (LADSPA_IS_PORT_CONTROL(d))
+ {
+ effect->controls << createControl(plugin->desc, port);
+ }
+ else if(LADSPA_IS_PORT_AUDIO(d))
+ {
+ if(LADSPA_IS_PORT_INPUT(d))
+ effect->in_ports << port;
+ if(LADSPA_IS_PORT_OUTPUT(d))
+ effect->out_ports << port;
+ }
}
+ return effect;
}
-int LADSPAHost::applyEffect(float *data, size_t samples)
+LADSPAControl *LADSPAHost::createControl(const LADSPA_Descriptor *desc, unsigned long port)
{
- LADSPAEffect *instance;
- uint k;
+ const LADSPA_PortRangeHint hint = desc->PortRangeHints[port];
+ LADSPA_Data fact, min, max, step, start;
- if (m_effects.isEmpty())
- return samples;
+ LADSPAControl *c = new LADSPAControl;
+ c->name = QString(desc->PortNames[port]);
+ c->port = port;
- if (m_chan == 1)
+ if (LADSPA_IS_HINT_TOGGLED(hint.HintDescriptor))
{
- memcpy(m_left, data, samples * sizeof(float));
-
- foreach(instance, m_effects)
- {
- if (instance->handle)
- instance->descriptor->run(instance->handle, samples);
- }
- for (k = 0; k < samples; ++k)
- data[k] = qBound(-1.0f, m_left[k], 1.0f);
+ c->type = LADSPAControl::BUTTON;
+ c->min = 0;
+ c->max = 0;
+ c->step = 0;
+ c->value = 0;
+ return c;
}
+
+ if (LADSPA_IS_HINT_SAMPLE_RATE(hint.HintDescriptor))
+ fact = m_freq;
else
+ fact = 1.0f;
+
+ if (LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor))
+ min = hint.LowerBound * fact;
+ else
+ min = -10000.0f;
+
+ if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor))
+ max = hint.UpperBound * fact;
+ else
+ max = 10000.0f;
+
+ if (10000.0f <= max - min) // infinity
+ step = 5.0f;
+ else if (100.0f < max - min) // 100.0 ... lots
+ step = 5.0f;
+ else if (10.0f < max - min) // 10.0 ... 100.0
+ step = 0.5f;
+ else if (1.0f < max - min) // 1.0 ... 10.0
+ step = 0.05f;
+ else // 0.0 ... 1.0
+ step = 0.005f;
+
+ if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor))
{
- for (k = 0; k < samples; k += 2)
- {
- m_left[k >> 1] = data[k];
- m_right[k >> 1] = data[k+1];
- }
- foreach(instance, m_effects)
- {
- if (instance->handle)
- instance->descriptor->run(instance->handle, samples >> 1);
- if (instance->handle2)
- instance->descriptor->run(instance->handle2, samples >> 1);
- }
- for (k = 0; k < samples; k+=2)
- {
- data[k] = qBound(-1.0f, m_left[k >> 1], 1.0f);
- data[k+1] = qBound(-1.0f, m_right[k>> 1], 1.0f);
- }
+ if (step < 1.0f)
+ step = 1.0f;
}
- return samples;
+
+ if (LADSPA_IS_HINT_DEFAULT_MINIMUM(hint.HintDescriptor))
+ start = min;
+ else if (LADSPA_IS_HINT_DEFAULT_LOW(hint.HintDescriptor))
+ start = min * 0.75f + max * 0.25f;
+ else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(hint.HintDescriptor))
+ start = min * 0.5f + max * 0.5f;
+ else if (LADSPA_IS_HINT_DEFAULT_HIGH(hint.HintDescriptor))
+ start = min * 0.25f + max * 0.75f;
+ else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(hint.HintDescriptor))
+ start = max;
+ else if (LADSPA_IS_HINT_DEFAULT_0(hint.HintDescriptor))
+ start = 0.0f;
+ else if (LADSPA_IS_HINT_DEFAULT_1(hint.HintDescriptor))
+ start = 1.0f;
+ else if (LADSPA_IS_HINT_DEFAULT_100(hint.HintDescriptor))
+ start = 100.0f;
+ else if (LADSPA_IS_HINT_DEFAULT_440(hint.HintDescriptor))
+ start = 440.0f;
+ else if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor))
+ start = min;
+ else if (max >= 0.0f && min <= 0.0f)
+ start = 0.0f;
+ else
+ start = min * 0.5f + max * 0.5f;
+
+ if(LADSPA_IS_PORT_OUTPUT(desc->PortDescriptors[port]))
+ c->type = LADSPAControl::LABEL;
+ else
+ c->type = LADSPAControl::SLIDER;
+ c->min = min;
+ c->max = max;
+ c->step = step;
+ c->value = start;
+ return c;
}
-void LADSPAHost::portAssign(LADSPAEffect *instance)
+void LADSPAHost::activateEffect(LADSPAEffect *e)
{
- unsigned long port;
- unsigned long inputs = 0, outputs = 0;
- const LADSPA_Descriptor *plugin = instance->descriptor;
+ const LADSPA_Descriptor *desc = e->plugin->desc;
+ int instance_count = 1;
- for (port = 0; port < plugin->PortCount; ++port)
+ if(e->out_ports.isEmpty())
+ {
+ qWarning("LADSPAHost: unsupported plugin: %s", desc->Name);
+ return;
+ }
+ else if(e->in_ports.isEmpty())
{
- if (LADSPA_IS_PORT_CONTROL(plugin->PortDescriptors[port]))
+ if(m_chan % e->out_ports.count())
{
- if (port < MAX_KNOBS)
- {
- plugin->connect_port(instance->handle, port, &(instance->knobs[port]));
- if (instance->handle2)
- plugin->connect_port(instance->handle2, port, &(instance->knobs[port]));
- }
- else
- {
- plugin->connect_port(instance->handle, port, m_trash);
- if (instance->handle2)
- plugin->connect_port(instance->handle2, port, m_trash);
- }
-
+ qWarning("LADSPAHost: plugin %s does not support %d channels", desc->Name, m_chan);
+ return;
}
- else if (LADSPA_IS_PORT_AUDIO(plugin->PortDescriptors[port]))
+ instance_count = m_chan / e->out_ports.count();
+ }
+ else if(e->in_ports.count() == e->out_ports.count())
+ {
+ if(m_chan % e->in_ports.count())
{
-
- if (LADSPA_IS_PORT_INPUT(plugin->PortDescriptors[port]))
- {
- if (inputs == 0)
- {
- plugin->connect_port(instance->handle, port, m_left);
- if (instance->handle2)
- plugin->connect_port(instance->handle2, port, m_right);
- }
- else if (inputs == 1 && instance->stereo)
- {
- plugin->connect_port(instance->handle, port, m_right);
- }
- else
- {
- plugin->connect_port(instance->handle, port, m_trash);
- if (instance->handle2)
- plugin->connect_port(instance->handle2, port, m_trash);
- }
- inputs++;
-
- }
- else if (LADSPA_IS_PORT_OUTPUT(plugin->PortDescriptors[port]))
- {
- if (outputs == 0)
- {
- plugin->connect_port(instance->handle, port, m_left);
- if (instance->handle2)
- plugin->connect_port(instance->handle2, port, m_right);
- }
- else if (outputs == 1 && instance->stereo)
- {
- plugin->connect_port(instance->handle, port, m_right);
- }
- else
- {
- plugin->connect_port(instance->handle, port, m_trash);
- if (instance->handle2)
- plugin->connect_port(instance->handle2, port, m_trash);
- }
- outputs++;
- }
+ qWarning("LADSPAHost: plugin %s does not support %d channels", desc->Name, m_chan);
+ return;
}
+ instance_count = m_chan / e->in_ports.count();
+ }
+ else
+ {
+ qWarning("LADSPAHost: unsupported plugin: %s", desc->Name);
+ return;
}
-}
-
-void LADSPAHost::findPlugins(const QString &path_entry)
-{
- LADSPAPlugin *plugin;
- void *library = 0;
- LADSPA_Descriptor_Function descriptor_fn;
- const LADSPA_Descriptor *descriptor;
- long int k;
- unsigned long int port, input, output;
-
- QDir dir (path_entry);
- dir.setFilter(QDir::Files | QDir::Hidden);
- dir.setSorting(QDir::Name);
- QFileInfoList files = dir.entryInfoList((QStringList() << "*.so"));
- foreach(QFileInfo file, files)
+ int in_at = 0, out_at = 0;
+ for(int i = 0; i < instance_count; ++i)
{
- library = dlopen(qPrintable(file.absoluteFilePath ()), RTLD_LAZY);
- if (library == 0)
+ LADSPA_Handle handle = desc->instantiate(desc, m_freq);
+
+ foreach (LADSPAControl *c, e->controls)
{
- continue;
+ desc->connect_port(handle, c->port, &c->value);
}
- descriptor_fn = (LADSPA_Descriptor_Function) dlsym(library, "ladspa_descriptor");
- if (descriptor_fn == 0)
+ foreach (int port, e->in_ports)
{
- dlclose(library);
- continue;
+ desc->connect_port(handle, port, m_buf[in_at++]);
}
-
- for (k = 0;; ++k)
+ foreach (int port, e->out_ports)
{
- descriptor = descriptor_fn(k);
- if (descriptor == 0)
- {
- break;
- }
- plugin = new LADSPAPlugin;
- plugin->name = strdup(descriptor->Name);
- plugin->fileName = file.absoluteFilePath ();
- plugin->id = k;
- plugin->unique_id = descriptor->UniqueID;
- for (input = output = port = 0; port < descriptor->PortCount; ++port)
- {
- if (LADSPA_IS_PORT_AUDIO(descriptor->PortDescriptors[port]))
- {
- if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[port]))
- input++;
- if (LADSPA_IS_PORT_OUTPUT(descriptor->PortDescriptors[port]))
- output++;
- }
- else if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[port]))
- {
- }
- }
- plugin->stereo = (input >= 2 && output >= 2);
- m_plugins.append(plugin);
+ qDebug("connect: %d", port);
+ desc->connect_port(handle, port, m_buf[out_at++]);
}
- dlclose(library);
+
+ if(desc->activate)
+ desc->activate(handle);
+ e->handles << handle;
}
}
-LADSPAEffect *LADSPAHost::addPlugin(LADSPAPlugin *plugin)
+void LADSPAHost::deactivateEffect(LADSPAEffect *e)
{
- if (!plugin)
- return 0;
- LADSPAEffect *instance;
- if (!(instance = load(plugin->fileName, plugin->id)))
- return 0;
- instance->stereo = plugin->stereo;
- if (m_chan && m_freq)
- bootPlugin(instance);
- initialize(instance);
- m_effects.append(instance);
- return instance;
+ const LADSPA_Descriptor *desc = e->plugin->desc;
+ foreach (LADSPA_Handle handle, e->handles)
+ {
+ if(desc->deactivate)
+ desc->deactivate(handle);
+ desc->cleanup(handle);
+ }
+ e->handles.clear();
}
-void LADSPAHost::initialize(LADSPAEffect *instance)
+QList <LADSPAPlugin *> LADSPAHost::plugins()
{
- const LADSPA_Descriptor *plugin = instance->descriptor;
- const LADSPA_PortRangeHint *hints = plugin->PortRangeHints;
- LADSPA_Data fact, min, max, step, start;
-
- for (unsigned long k = 0; k < MAX_KNOBS && k < plugin->PortCount; ++k)
- {
- if (!LADSPA_IS_PORT_CONTROL(plugin->PortDescriptors[k]))
- continue;
-
- LADSPAControl *c = new LADSPAControl;
- c->name = QString(plugin->PortNames[k]);
-
- if (LADSPA_IS_HINT_TOGGLED(hints[k].HintDescriptor))
- {
- c->type = LADSPAControl::BUTTON;
- c->min = 0;
- c->max = 0;
- c->step = 0;
- c->value = &instance->knobs[k];
- instance->controls << c;
- continue;
- }
-
- if (LADSPA_IS_HINT_SAMPLE_RATE(hints[k].HintDescriptor))
- fact = m_freq;
- else
- fact = 1.0f;
-
- if (LADSPA_IS_HINT_BOUNDED_BELOW(hints[k].HintDescriptor))
- min = hints[k].LowerBound * fact;
- else
- min = -10000.0f;
+ return m_plugins;
+}
- if (LADSPA_IS_HINT_BOUNDED_ABOVE(hints[k].HintDescriptor))
- max = hints[k].UpperBound * fact;
- else
- max = 10000.0f;
+QList <LADSPAEffect *> LADSPAHost::effects()
+{
+ return m_effects;
+}
- /* infinity */
- if (10000.0f <= max - min)
- {
- step = 5.0f;
+void LADSPAHost::load(LADSPAPlugin *plugin)
+{
+ LADSPAEffect *e = createEffect(plugin);
+ activateEffect(e);
+ m_effects.append(e);
+}
- /* 100.0 ... lots */
- }
- else if (100.0f < max - min)
- {
- step = 5.0f;
+void LADSPAHost::unload(LADSPAEffect *effect)
+{
+ m_effects.removeAll(effect);
+ deactivateEffect(effect);
+ delete effect;
+}
- /* 10.0 ... 100.0 */
- }
- else if (10.0f < max - min)
- {
- step = 0.5f;
+int LADSPAHost::applyEffect(float *data, size_t samples)
+{
+ if (m_effects.isEmpty())
+ return samples;
- /* 1.0 ... 10.0 */
- }
- else if (1.0f < max - min)
- {
- step = 0.05f;
+ size_t frames = samples / m_chan;
- /* 0.0 ... 1.0 */
- }
- else
- {
- step = 0.005f;
- }
+ for(size_t i = 0; i < frames; ++i)
+ {
+ for(int c = 0; c < m_chan; c++)
+ m_buf[c][i] = data[i*m_chan + c];
+ }
- if (LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor))
+ for(int i = 0; i < m_effects.count(); ++i)
+ {
+ for(int j = 0; j < m_effects[i]->handles.count(); ++j)
{
- if (step < 1.0f)
- step = 1.0f;
+ m_effects[i]->plugin->desc->run(m_effects[i]->handles[j], frames);
}
+ }
- if (LADSPA_IS_HINT_DEFAULT_MINIMUM(hints[k].HintDescriptor))
- start = min;
- else if (LADSPA_IS_HINT_DEFAULT_LOW(hints[k].HintDescriptor))
- start = min * 0.75f + max * 0.25f;
- else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(hints[k].HintDescriptor))
- start = min * 0.5f + max * 0.5f;
- else if (LADSPA_IS_HINT_DEFAULT_HIGH(hints[k].HintDescriptor))
- start = min * 0.25f + max * 0.75f;
- else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(hints[k].HintDescriptor))
- start = max;
- else if (LADSPA_IS_HINT_DEFAULT_0(hints[k].HintDescriptor))
- start = 0.0f;
- else if (LADSPA_IS_HINT_DEFAULT_1(hints[k].HintDescriptor))
- start = 1.0f;
- else if (LADSPA_IS_HINT_DEFAULT_100(hints[k].HintDescriptor))
- start = 100.0f;
- else if (LADSPA_IS_HINT_DEFAULT_440(hints[k].HintDescriptor))
- start = 440.0f;
- else if (LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor))
- start = min;
- else if (max >= 0.0f && min <= 0.0f)
- start = 0.0f;
- else
- start = min * 0.5f + max * 0.5f;
-
- instance->knobs[k] = start;
- if(LADSPA_IS_PORT_OUTPUT(plugin->PortDescriptors[k]))
- c->type = LADSPAControl::LABEL;
- else
- c->type = LADSPAControl::SLIDER;
- c->min = min;
- c->max = max;
- c->step = step;
- c->value = &instance->knobs[k];
- instance->controls << c;
+ for(size_t i = 0; i < frames; ++i)
+ {
+ for(int c = 0; c < m_chan; c++)
+ data[i*m_chan + c] = m_buf[c][i];
}
+ return samples;
}
diff --git a/src/plugins/Effect/ladspa/ladspahost.h b/src/plugins/Effect/ladspa/ladspahost.h
index df83c8083..06ff6173b 100644
--- a/src/plugins/Effect/ladspa/ladspahost.h
+++ b/src/plugins/Effect/ladspa/ladspahost.h
@@ -40,10 +40,9 @@ class LADSPAPlugin
{
public:
QString name;
- QString fileName;
long id;
long unique_id;
- bool stereo;
+ const LADSPA_Descriptor *desc;
};
class LADSPAControl
@@ -58,21 +57,18 @@ public:
double min;
double max;
double step;
- LADSPA_Data *value;
+ LADSPA_Data value;
int type;
+ int port;
QString name;
};
class LADSPAEffect
{
public:
- void *library;
- QString fileName;
- bool stereo;
- const LADSPA_Descriptor *descriptor;
- LADSPA_Handle handle; /* left or mono */
- LADSPA_Handle handle2; /* right stereo */
- LADSPA_Data knobs[MAX_KNOBS];
+ LADSPAPlugin *plugin;
+ QList<int> in_ports, out_ports;
+ QList <LADSPA_Handle> handles;
QList <LADSPAControl*> controls;
};
@@ -89,26 +85,27 @@ public:
void configure(quint32 freq, int chan);
QList <LADSPAPlugin *> plugins();
QList <LADSPAEffect *> effects();
- LADSPAEffect *addPlugin(LADSPAPlugin * plugin);
- void unload(LADSPAEffect *instance);
+ void load(LADSPAPlugin *plugin);
+ void unload(LADSPAEffect *effect);
+
static LADSPAHost* instance();
private:
- void bootPlugin(LADSPAEffect *instance);
- void findAllPlugins();
- void findPlugins(const QString &path);
- LADSPAEffect *load(const QString &path, long num);
- void portAssign(LADSPAEffect *instance);
- void initialize(LADSPAEffect *instance);
-
+ void loadModules();
+ void findModules(const QString &path);
+ void unloadModules();
+ LADSPAEffect *createEffect(LADSPAPlugin *plugin);
+ LADSPAControl *createControl(const LADSPA_Descriptor *desc, unsigned long port);
+ void activateEffect(LADSPAEffect *e);
+ void deactivateEffect(LADSPAEffect *e);
QList <LADSPAPlugin *> m_plugins;
QList <LADSPAEffect *> m_effects;
- LADSPA_Data m_left[MAX_SAMPLES], m_right[MAX_SAMPLES], m_trash[MAX_SAMPLES];
-
static LADSPAHost *m_instance;
int m_chan;
quint32 m_freq;
+ QList<void *> m_modules;
+ LADSPA_Data m_buf[9][MAX_SAMPLES];
};
#endif
diff --git a/src/plugins/Effect/ladspa/settingsdialog.cpp b/src/plugins/Effect/ladspa/settingsdialog.cpp
index 2d79485f6..a156efd11 100644
--- a/src/plugins/Effect/ladspa/settingsdialog.cpp
+++ b/src/plugins/Effect/ladspa/settingsdialog.cpp
@@ -27,6 +27,7 @@
#include <QLabel>
#include <QIcon>
#include <qmmp/qmmp.h>
+#include "ui_settingsdialog.h"
#include "ladspaslider.h"
#include "ladspabutton.h"
#include "ladspahost.h"
@@ -35,16 +36,17 @@
SettingsDialog::SettingsDialog(QWidget *parent)
: QDialog(parent)
{
- ui.setupUi(this);
+ m_ui = new Ui::SettingsDialog;
+ m_ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose, true);
- ui.loadButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowRight));
- ui.unloadButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowLeft));
- ui.configureButton->setIcon(QIcon::fromTheme("configure"));
+ m_ui->loadButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowRight));
+ m_ui->unloadButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowLeft));
+ m_ui->configureButton->setIcon(QIcon::fromTheme("configure"));
m_model = new QStandardItemModel(0, 2, this);
m_model->setHeaderData(0, Qt::Horizontal, tr("UID"));
m_model->setHeaderData(1, Qt::Horizontal, tr("Name"));
- ui.pluginsTreeView->setModel(m_model);
+ m_ui->pluginsTreeView->setModel(m_model);
if(!LADSPAHost::instance())
new LADSPAHost(qApp);
@@ -57,21 +59,23 @@ SettingsDialog::SettingsDialog(QWidget *parent)
m_model->setData(m_model->index(i, 0), (uint) plugin_list[i]->unique_id);
m_model->setData(m_model->index(i, 1), plugin_list[i]->name);
}
- ui.pluginsTreeView->resizeColumnToContents (0);
- ui.pluginsTreeView->resizeColumnToContents (1);
+ m_ui->pluginsTreeView->resizeColumnToContents (0);
+ m_ui->pluginsTreeView->resizeColumnToContents (1);
updateRunningPlugins();
}
SettingsDialog::~SettingsDialog()
-{}
+{
+ delete m_ui;
+}
void SettingsDialog::on_loadButton_clicked()
{
LADSPAHost *l = LADSPAHost::instance();
- QModelIndex index = ui.pluginsTreeView->currentIndex ();
+ QModelIndex index = m_ui->pluginsTreeView->currentIndex ();
if(index.isValid())
{
- l->addPlugin(l->plugins().at(index.row()));
+ l->load(l->plugins().at(index.row()));
updateRunningPlugins();
}
}
@@ -79,7 +83,7 @@ void SettingsDialog::on_loadButton_clicked()
void SettingsDialog::on_unloadButton_clicked()
{
LADSPAHost *l = LADSPAHost::instance();
- QModelIndex index = ui.runningListWidget->currentIndex ();
+ QModelIndex index = m_ui->runningListWidget->currentIndex ();
if(index.isValid())
{
l->unload(l->effects().at(index.row()));
@@ -90,13 +94,13 @@ void SettingsDialog::on_unloadButton_clicked()
void SettingsDialog::on_configureButton_clicked()
{
LADSPAHost *l = LADSPAHost::instance();
- QModelIndex index = ui.runningListWidget->currentIndex ();
+ QModelIndex index = m_ui->runningListWidget->currentIndex ();
if(!index.isValid())
return;
LADSPAEffect *effect = l->effects().at(index.row());
QDialog *dialog = new QDialog(this);
- dialog->setWindowTitle(effect->descriptor->Name);
+ dialog->setWindowTitle(effect->plugin->desc->Name);
QFormLayout *formLayout = new QFormLayout(dialog);
LADSPAButton *button = 0;
LADSPASlider *slider = 0;
@@ -107,17 +111,17 @@ void SettingsDialog::on_configureButton_clicked()
switch ((int) c->type)
{
case LADSPAControl::BUTTON:
- button = new LADSPAButton(c->value, dialog);
+ button = new LADSPAButton(&c->value, dialog);
button->setText(c->name);
formLayout->addRow(button);
break;
case LADSPAControl::SLIDER:
- slider = new LADSPASlider(c->min, c->max, c->step, c->value, dialog);
+ slider = new LADSPASlider(c->min, c->max, c->step, &c->value, dialog);
formLayout->addRow(c->name, slider);
break;
case LADSPAControl::LABEL:
label = new QLabel(this);
- label->setText(QString("%1").arg(*c->value));
+ label->setText(QString("%1").arg(c->value));
label->setFrameStyle(QFrame::StyledPanel);
label->setFrameShadow(QFrame::Sunken);
formLayout->addRow(c->name, label);
@@ -141,9 +145,7 @@ void SettingsDialog::accept()
void SettingsDialog::updateRunningPlugins()
{
- ui.runningListWidget->clear();
- QList <LADSPAEffect *> plugin_list = LADSPAHost::instance()->effects();
-
- for(int i = 0; i < plugin_list.size(); ++i)
- ui.runningListWidget->addItem(plugin_list[i]->descriptor->Name);
+ m_ui->runningListWidget->clear();
+ foreach(LADSPAEffect *e, LADSPAHost::instance()->effects())
+ m_ui->runningListWidget->addItem(e->plugin->desc->Name);
}
diff --git a/src/plugins/Effect/ladspa/settingsdialog.h b/src/plugins/Effect/ladspa/settingsdialog.h
index f4db41ee4..158ac1ee9 100644
--- a/src/plugins/Effect/ladspa/settingsdialog.h
+++ b/src/plugins/Effect/ladspa/settingsdialog.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008 by Ilya Kotov *
+ * Copyright (C) 2008-2015 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -21,12 +21,15 @@
#define SETTINGSDIALOG_H
#include <QDialog>
-#include "ui_settingsdialog.h"
class QStandardItemModel;
+namespace Ui {
+class SettingsDialog;
+}
+
/**
- @author Ilya Kotov <forkotov02@hotmail.ru>
+ @author Ilya Kotov <forkotov02@hotmail.ru>
*/
class SettingsDialog : public QDialog
{
@@ -46,7 +49,7 @@ private slots:
private:
void updateRunningPlugins();
- Ui::SettingsDialog ui;
+ Ui::SettingsDialog *m_ui;
QStandardItemModel *m_model;
};
diff --git a/src/plugins/Effect/ladspa/settingsdialog.ui b/src/plugins/Effect/ladspa/settingsdialog.ui
index 79bd7b6c9..c8e78fe43 100644
--- a/src/plugins/Effect/ladspa/settingsdialog.ui
+++ b/src/plugins/Effect/ladspa/settingsdialog.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>427</width>
- <height>406</height>
+ <width>547</width>
+ <height>505</height>
</rect>
</property>
<property name="windowTitle">