changeset 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 8676bacf228f
children 0d639fe81481
files config.pri.in transform/ModelTransformerFactory.cpp transform/ModelTransformerFactory.h
diffstat 3 files changed, 38 insertions(+), 180 deletions(-) [+]
line wrap: on
line diff
--- a/config.pri.in	Fri Oct 08 09:32:57 2010 +0100
+++ b/config.pri.in	Fri Oct 08 11:19:16 2010 +0100
@@ -1,9 +1,6 @@
 
 DEFINES += @HAVES@
 
-##!!!
-DEFINES += NO_SV_GUI
-
 QMAKE_CC = @CC@
 QMAKE_CXX = @CXX@
 
--- 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) {
--- a/transform/ModelTransformerFactory.h	Fri Oct 08 09:32:57 2010 +0100
+++ b/transform/ModelTransformerFactory.h	Fri Oct 08 11:19:16 2010 +0100
@@ -23,6 +23,7 @@
 
 #include <vamp-hostsdk/PluginBase.h>
 
+#include <QMap>
 #include <map>
 #include <set>
 
@@ -37,12 +38,27 @@
 
     static ModelTransformerFactory *getInstance();
 
+    class UserConfigurator {
+    public:
+        virtual bool configure(ModelTransformer::Input &input,
+                               Transform &transform,
+                               Vamp::PluginBase *plugin,
+                               Model *inputModel,
+                               AudioPlaySource *source,
+                               size_t startFrame,
+                               size_t duration,
+                               const QMap<QString, Model *> &modelMap,
+                               QStringList candidateModelNames,
+                               QString defaultModelName) = 0;
+    };
+
     /**
-     * Fill out the configuration for the given transform (by asking
-     * the user, most likely).  Returns the selected input model and
-     * channel if the transform is acceptable, or an input with a null
-     * model if the operation should be cancelled.  Audio play source
-     * may be used to audition effects plugins, if provided.
+     * Fill out the configuration for the given transform (may include
+     * asking the user by calling back on the UserConfigurator).
+     * Returns the selected input model and channel if the transform
+     * is acceptable, or an input with a null model if the operation
+     * should be cancelled.  Audio play source may be used to audition
+     * effects plugins, if provided.
      */
     ModelTransformer::Input
     getConfigurationForTransform(Transform &transform,
@@ -50,7 +66,8 @@
                                  Model *defaultInputModel,
                                  AudioPlaySource *source = 0,
                                  size_t startFrame = 0,
-                                 size_t duration = 0);
+                                 size_t duration = 0,
+                                 UserConfigurator *configurator = 0);
     
     /**
      * Return the output model resulting from applying the named
@@ -85,9 +102,6 @@
     typedef std::set<ModelTransformer *> TransformerSet;
     TransformerSet m_runningTransformers;
 
-    bool getChannelRange(TransformId identifier,
-                         Vamp::PluginBase *plugin, int &min, int &max);
-
     static ModelTransformerFactory *m_instance;
 };