diff transform/ModelTransformerFactory.cpp @ 653:12578237b99c

* Move the plugin dialog configuration guff out into a callback
author Chris Cannam
date Fri, 08 Oct 2010 11:19:16 +0100
parents 5ab561f664f2
children b4a8d8221eaf
line wrap: on
line diff
--- a/transform/ModelTransformerFactory.cpp	Fri Oct 08 09:32:57 2010 +0100
+++ b/transform/ModelTransformerFactory.cpp	Fri Oct 08 11:19:16 2010 +0100
@@ -26,10 +26,6 @@
 #include "plugin/RealTimePluginFactory.h"
 #include "plugin/PluginXml.h"
 
-#ifndef NO_SV_GUI
-#include "widgets/PluginParameterDialog.h"
-#endif
-
 #include "data/model/DenseTimeValueModel.h"
 
 #include <vamp-hostsdk/PluginHostAdapter.h>
@@ -52,30 +48,14 @@
 {
 }
 
-bool
-ModelTransformerFactory::getChannelRange(TransformId identifier,
-                                         Vamp::PluginBase *plugin,
-                                         int &minChannels, int &maxChannels)
-{
-    Vamp::Plugin *vp = 0;
-    if ((vp = dynamic_cast<Vamp::Plugin *>(plugin)) ||
-        (vp = dynamic_cast<Vamp::PluginHostAdapter *>(plugin))) {
-        minChannels = vp->getMinChannelCount();
-        maxChannels = vp->getMaxChannelCount();
-        return true;
-    } else {
-        return TransformFactory::getInstance()->
-            getTransformChannelRange(identifier, minChannels, maxChannels);
-    }
-}
-
 ModelTransformer::Input
 ModelTransformerFactory::getConfigurationForTransform(Transform &transform,
                                                       const std::vector<Model *> &candidateInputModels,
                                                       Model *defaultInputModel,
                                                       AudioPlaySource *source,
                                                       size_t startFrame,
-                                                      size_t duration)
+                                                      size_t duration,
+                                                      UserConfigurator *configurator)
 {
     ModelTransformer::Input input(0);
 
@@ -87,12 +67,12 @@
     Model *inputModel = candidateInputModels[0];
     QStringList candidateModelNames;
     QString defaultModelName;
-    std::map<QString, Model *> modelMap;
+    QMap<QString, Model *> modelMap;
     for (size_t i = 0; i < candidateInputModels.size(); ++i) {
         QString modelName = candidateInputModels[i]->objectName();
         QString origModelName = modelName;
         int dupcount = 1;
-        while (modelMap.find(modelName) != modelMap.end()) {
+        while (modelMap.contains(modelName)) {
             modelName = tr("%1 <%2>").arg(origModelName).arg(++dupcount);
         }
         modelMap[modelName] = candidateInputModels[i];
@@ -103,21 +83,14 @@
     }
 
     QString id = transform.getPluginIdentifier();
-    QString output = transform.getOutput();
-    QString outputLabel = "";
-    QString outputDescription = "";
     
-    bool ok = false;
+    bool ok = true;
     QString configurationXml = m_lastConfigurations[transform.getIdentifier()];
 
     std::cerr << "last configuration: " << configurationXml.toStdString() << std::endl;
 
     Vamp::PluginBase *plugin = 0;
 
-    bool frequency = false;
-    bool effect = false;
-    bool generator = false;
-
     if (FeatureExtractionPluginFactory::instanceFor(id)) {
 
         std::cerr << "getConfigurationForTransform: instantiating Vamp plugin" << std::endl;
@@ -126,50 +99,17 @@
             FeatureExtractionPluginFactory::instanceFor(id)->instantiatePlugin
             (id, inputModel->getSampleRate());
 
-        if (vp) {
-
-            plugin = vp;
-            frequency = (vp->getInputDomain() == Vamp::Plugin::FrequencyDomain);
-
-            std::vector<Vamp::Plugin::OutputDescriptor> od =
-                vp->getOutputDescriptors();
-            if (od.size() > 1) {
-                for (size_t i = 0; i < od.size(); ++i) {
-                    if (od[i].identifier == output.toStdString()) {
-                        outputLabel = od[i].name.c_str();
-                        outputDescription = od[i].description.c_str();
-                        break;
-                    }
-                }
-            }
-        }
+        plugin = vp;
 
     } else if (RealTimePluginFactory::instanceFor(id)) {
 
         RealTimePluginFactory *factory = RealTimePluginFactory::instanceFor(id);
         const RealTimePluginDescriptor *desc = factory->getPluginDescriptor(id);
 
-        if (desc->audioInputPortCount > 0 && 
-            desc->audioOutputPortCount > 0 &&
-            !desc->isSynth) {
-            effect = true;
-        }
-
-        if (desc->audioInputPortCount == 0) {
-            generator = true;
-        }
-
-        if (output != "A") {
-            int outputNo = output.toInt();
-            if (outputNo >= 0 && outputNo < int(desc->controlOutputPortCount)) {
-                outputLabel = desc->controlOutputPortNames[outputNo].c_str();
-            }
-        }
-
         size_t sampleRate = inputModel->getSampleRate();
         size_t blockSize = 1024;
         size_t channels = 1;
-        if (effect && source) {
+        if (source) {
             sampleRate = source->getTargetSampleRate();
             blockSize = source->getTargetBlockSize();
             channels = source->getTargetChannelCount();
@@ -179,10 +119,6 @@
             (id, 0, 0, sampleRate, blockSize, channels);
 
         plugin = rtp;
-
-        if (effect && source && rtp) {
-            source->setAuditioningEffect(rtp);
-        }
     }
 
     if (plugin) {
@@ -200,111 +136,22 @@
         // whatever the user chose last time around
         PluginXml(plugin).setParametersFromXml(configurationXml);
 
-#ifndef NO_SV_GUI
-        int sourceChannels = 1;
-        if (dynamic_cast<DenseTimeValueModel *>(inputModel)) {
-            sourceChannels = dynamic_cast<DenseTimeValueModel *>(inputModel)
-                ->getChannelCount();
-        }
-
-        int minChannels = 1, maxChannels = sourceChannels;
-        getChannelRange(transform.getIdentifier(), plugin,
-                        minChannels, maxChannels);
-
-        int targetChannels = sourceChannels;
-        if (!effect) {
-            if (sourceChannels < minChannels) targetChannels = minChannels;
-            if (sourceChannels > maxChannels) targetChannels = maxChannels;
-        }
-
-        int defaultChannel = -1; //!!! no longer saved! [was context.channel]
-
-        PluginParameterDialog *dialog = new PluginParameterDialog(plugin);
-
-        dialog->setMoreInfoUrl(TransformFactory::getInstance()->
-                               getTransformInfoUrl(transform.getIdentifier()));
-
-        if (candidateModelNames.size() > 1 && !generator) {
-            dialog->setCandidateInputModels(candidateModelNames,
-                                            defaultModelName);
-        }
-
-        if (startFrame != 0 || duration != 0) {
-            dialog->setShowSelectionOnlyOption(true);
-        }
-
-        if (targetChannels > 0) {
-            dialog->setChannelArrangement(sourceChannels, targetChannels,
-                                          defaultChannel);
+        if (configurator) {
+            ok = configurator->configure(input, transform, plugin,
+                                         inputModel, source,
+                                         startFrame, duration,
+                                         modelMap,
+                                         candidateModelNames,
+                                         defaultModelName);
         }
         
-        dialog->setOutputLabel(outputLabel, outputDescription);
-        
-        dialog->setShowProcessingOptions(true, frequency);
-
-        if (dialog->exec() == QDialog::Accepted) {
-            ok = true;
-        }
-
-        QString selectedInput = dialog->getInputModel();
-        if (selectedInput != "") {
-            if (modelMap.find(selectedInput) != modelMap.end()) {
-                inputModel = modelMap[selectedInput];
-                std::cerr << "Found selected input \"" << selectedInput.toStdString() << "\" in model map, result is " << inputModel << std::endl;
-            } else {
-                std::cerr << "Failed to find selected input \"" << selectedInput.toStdString() << "\" in model map" << std::endl;
-            }
-        } else {
-            std::cerr << "Selected input empty: \"" << selectedInput.toStdString() << "\"" << std::endl;
-        }
-        
-        // Write parameters back to transform object
-        TransformFactory::getInstance()->
-            setParametersFromPlugin(transform, plugin);
-
-        input.setChannel(dialog->getChannel());
-        
-        //!!! The dialog ought to be taking & returning transform
-        //objects and input objects and stuff rather than passing
-        //around all this misc stuff, but that's for tomorrow
-        //(whenever that may be)
-
-        if (startFrame != 0 || duration != 0) {
-            if (dialog->getSelectionOnly()) {
-                transform.setStartTime(RealTime::frame2RealTime
-                                       (startFrame, inputModel->getSampleRate()));
-                transform.setDuration(RealTime::frame2RealTime
-                                      (duration, inputModel->getSampleRate()));
-            }
-        }
-
-        size_t stepSize = 0, blockSize = 0;
-        WindowType windowType = HanningWindow;
-
-        dialog->getProcessingParameters(stepSize,
-                                        blockSize,
-                                        windowType);
-
-        transform.setStepSize(stepSize);
-        transform.setBlockSize(blockSize);
-        transform.setWindowType(windowType);
-
-#endif
 
         TransformFactory::getInstance()->
             makeContextConsistentWithPlugin(transform, plugin);
 
         configurationXml = PluginXml(plugin).toXmlString();
 
-#ifndef NO_SV_GUI
-        delete dialog;
-#endif
-
-        if (effect && source) {
-            source->setAuditioningEffect(0); // will delete our plugin
-        } else {
-            delete plugin;
-        }
+        delete plugin;
     }
 
     if (ok) {