Mercurial > hg > svcore
changeset 64:4d59dc469b0f
* Ensure plugin parameters for a transform are saved in the .sv file and
restored in case the plugin has to be run again
* Make plugin dialog offer options for mixdown/single-channel use if the
file has more than one channels but the plugin only accepts one
* Fix incorrect samplerate playback for second file loaded if its samplerate
differed from first
* Add Zoom to Fit and Select Visible Range menu options, split out Import
Audio into main model and secondary model options
* Add stubs for cut, copy and paste operations (not implemented yet)
author | Chris Cannam |
---|---|
date | Thu, 30 Mar 2006 13:18:11 +0000 |
parents | ba405e5e69d3 |
children | e1aad27029e3 |
files | transform/FeatureExtractionPluginTransform.cpp transform/FeatureExtractionPluginTransform.h transform/RealTimePluginTransform.cpp transform/RealTimePluginTransform.h transform/TransformFactory.cpp transform/TransformFactory.h |
diffstat | 6 files changed, 91 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/transform/FeatureExtractionPluginTransform.cpp Wed Mar 29 12:35:17 2006 +0000 +++ b/transform/FeatureExtractionPluginTransform.cpp Thu Mar 30 13:18:11 2006 +0000 @@ -29,10 +29,12 @@ FeatureExtractionPluginTransform::FeatureExtractionPluginTransform(Model *inputModel, QString pluginId, + int channel, QString configurationXml, QString outputName) : Transform(inputModel), m_plugin(0), + m_channel(channel), m_descriptor(0), m_outputFeatureNo(0) { @@ -223,7 +225,7 @@ if (channelCount == 1) { got = input->getValues - (-1, blockFrame, blockFrame + blockSize, buffers[0]); + (m_channel, blockFrame, blockFrame + blockSize, buffers[0]); while (got < blockSize) { buffers[0][got++] = 0.0; }
--- a/transform/FeatureExtractionPluginTransform.h Wed Mar 29 12:35:17 2006 +0000 +++ b/transform/FeatureExtractionPluginTransform.h Thu Mar 30 13:18:11 2006 +0000 @@ -26,6 +26,7 @@ public: FeatureExtractionPluginTransform(Model *inputModel, QString plugin, + int channel, QString configurationXml = "", QString outputName = ""); virtual ~FeatureExtractionPluginTransform(); @@ -34,6 +35,7 @@ virtual void run(); FeatureExtractionPlugin *m_plugin; + int m_channel; FeatureExtractionPlugin::OutputDescriptor *m_descriptor; int m_outputFeatureNo;
--- a/transform/RealTimePluginTransform.cpp Wed Mar 29 12:35:17 2006 +0000 +++ b/transform/RealTimePluginTransform.cpp Thu Mar 30 13:18:11 2006 +0000 @@ -27,11 +27,13 @@ RealTimePluginTransform::RealTimePluginTransform(Model *inputModel, QString pluginId, + int channel, QString configurationXml, QString units, int output) : Transform(inputModel), m_plugin(0), + m_channel(channel), m_outputNo(output) { std::cerr << "RealTimePluginTransform::RealTimePluginTransform: plugin " << pluginId.toStdString() << ", output " << output << std::endl; @@ -105,6 +107,8 @@ size_t sampleRate = input->getSampleRate(); int channelCount = input->getChannelCount(); + if (m_channel != -1) channelCount = 1; + size_t blockSize = m_plugin->getBufferSize(); float **buffers = m_plugin->getAudioInputBuffers(); @@ -127,7 +131,7 @@ if (channelCount == 1) { got = input->getValues - (-1, blockFrame, blockFrame + blockSize, buffers[0]); + (m_channel, blockFrame, blockFrame + blockSize, buffers[0]); while (got < blockSize) { buffers[0][got++] = 0.0; }
--- a/transform/RealTimePluginTransform.h Wed Mar 29 12:35:17 2006 +0000 +++ b/transform/RealTimePluginTransform.h Thu Mar 30 13:18:11 2006 +0000 @@ -26,6 +26,7 @@ public: RealTimePluginTransform(Model *inputModel, QString plugin, + int channel, QString configurationXml = "", QString units = "", int output = 0); @@ -35,6 +36,7 @@ virtual void run(); RealTimePluginInstance *m_plugin; + int m_channel; int m_outputNo; // just casts
--- a/transform/TransformFactory.cpp Wed Mar 29 12:35:17 2006 +0000 +++ b/transform/TransformFactory.cpp Thu Mar 30 13:18:11 2006 +0000 @@ -23,6 +23,8 @@ #include "widgets/PluginParameterDialog.h" +#include "model/DenseTimeValueModel.h" + #include <iostream> #include <set> @@ -296,8 +298,44 @@ } bool +TransformFactory::getTransformChannelRange(TransformName name, + int &min, int &max) +{ + QString id = name.section(':', 0, 2); + + if (FeatureExtractionPluginFactory::instanceFor(id)) { + + FeatureExtractionPlugin *plugin = + FeatureExtractionPluginFactory::instanceFor(id)-> + instantiatePlugin(id, 48000); + if (!plugin) return false; + + min = plugin->getMinChannelCount(); + max = plugin->getMaxChannelCount(); + delete plugin; + + return true; + + } else if (RealTimePluginFactory::instanceFor(id)) { + + const RealTimePluginDescriptor *descriptor = + RealTimePluginFactory::instanceFor(id)-> + getPluginDescriptor(id); + if (!descriptor) return false; + + min = descriptor->audioInputPortCount; + max = descriptor->audioInputPortCount; + + return true; + } + + return false; +} + +bool TransformFactory::getConfigurationForTransform(TransformName name, Model *inputModel, + int &channel, QString &configurationXml) { QString id = name.section(':', 0, 2); @@ -325,11 +363,31 @@ if (configurationXml != "") { plugin->setParametersFromXml(configurationXml); } - PluginParameterDialog *dialog = new PluginParameterDialog(plugin); + + int sourceChannels = 1; + if (dynamic_cast<DenseTimeValueModel *>(inputModel)) { + sourceChannels = dynamic_cast<DenseTimeValueModel *>(inputModel) + ->getChannelCount(); + } + + int minChannels = 1, maxChannels = sourceChannels; + getTransformChannelRange(name, minChannels, maxChannels); + + int targetChannels = sourceChannels; + if (sourceChannels < minChannels) targetChannels = minChannels; + if (sourceChannels > maxChannels) targetChannels = maxChannels; + + int defaultChannel = channel; + + PluginParameterDialog *dialog = new PluginParameterDialog(plugin, + sourceChannels, + targetChannels, + defaultChannel); if (dialog->exec() == QDialog::Accepted) { ok = true; } configurationXml = plugin->toXmlString(); + channel = dialog->getChannel(); delete dialog; delete plugin; } @@ -341,21 +399,25 @@ Transform * TransformFactory::createTransform(TransformName name, Model *inputModel, - QString configurationXml, bool start) + int channel, QString configurationXml, bool start) { Transform *transform = 0; + //!!! use channel + QString id = name.section(':', 0, 2); QString output = name.section(':', 3); if (FeatureExtractionPluginFactory::instanceFor(id)) { transform = new FeatureExtractionPluginTransform(inputModel, id, + channel, configurationXml, output); } else if (RealTimePluginFactory::instanceFor(id)) { transform = new RealTimePluginTransform(inputModel, id, + channel, configurationXml, getTransformUnits(name), output.toInt()); @@ -371,9 +433,10 @@ Model * TransformFactory::transform(TransformName name, Model *inputModel, - QString configurationXml) + int channel, QString configurationXml) { - Transform *t = createTransform(name, inputModel, configurationXml, false); + Transform *t = createTransform(name, inputModel, channel, + configurationXml, false); if (!t) return 0;
--- a/transform/TransformFactory.h Wed Mar 29 12:35:17 2006 +0000 +++ b/transform/TransformFactory.h Thu Mar 30 13:18:11 2006 +0000 @@ -65,6 +65,7 @@ * is acceptable, false if the operation should be cancelled. */ bool getConfigurationForTransform(TransformName name, Model *inputModel, + int &channel, QString &configurationXml); /** @@ -81,7 +82,7 @@ * when no longer needed. */ Model *transform(TransformName name, Model *inputModel, - QString configurationXml = ""); + int channel, QString configurationXml = ""); /** * Full description of a transform, suitable for putting on a menu. @@ -103,6 +104,15 @@ */ bool isTransformConfigurable(TransformName name); + /** + * If the transform has a prescribed number or range of channel + * inputs, return true and set minChannels and maxChannels to the + * minimum and maximum number of channel inputs the transform can + * accept. + */ + bool getTransformChannelRange(TransformName name, + int &minChannels, int &maxChannels); + //!!! Need some way to indicate that the input model has changed / //been deleted so as not to blow up backgrounded transform! -- Or //indeed, if the output model has been deleted -- could equally @@ -115,7 +125,7 @@ protected: Transform *createTransform(TransformName name, Model *inputModel, - QString configurationXml, bool start); + int channel, QString configurationXml, bool start); struct TransformIdent {