# HG changeset patch # User Chris Cannam # Date 1286533156 -3600 # Node ID 12578237b99cad0b3708e503035785447bfa83e6 # Parent 8676bacf228fca59f94558ae06f4e9abdc91f515 * Move the plugin dialog configuration guff out into a callback diff -r 8676bacf228f -r 12578237b99c config.pri.in --- 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@ diff -r 8676bacf228f -r 12578237b99c transform/ModelTransformerFactory.cpp --- 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 @@ -52,30 +48,14 @@ { } -bool -ModelTransformerFactory::getChannelRange(TransformId identifier, - Vamp::PluginBase *plugin, - int &minChannels, int &maxChannels) -{ - Vamp::Plugin *vp = 0; - if ((vp = dynamic_cast(plugin)) || - (vp = dynamic_cast(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 &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 modelMap; + QMap 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 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(inputModel)) { - sourceChannels = dynamic_cast(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) { diff -r 8676bacf228f -r 12578237b99c transform/ModelTransformerFactory.h --- 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 +#include #include #include @@ -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 &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 TransformerSet; TransformerSet m_runningTransformers; - bool getChannelRange(TransformId identifier, - Vamp::PluginBase *plugin, int &min, int &max); - static ModelTransformerFactory *m_instance; };