# HG changeset patch # User cannam # Date 1227618967 0 # Node ID 6579e441f2febe7dd63eef41a50b89fa05787ad1 # Parent 93c81a6c917a8c09590135eee9660152dc7526a0 * Ensure that output descriptors are re-queried after a call to initialise, setParameter or selectProgram (following "What can depend on a parameter?" section of programmers guide) diff -r 93c81a6c917a -r 6579e441f2fe src/vamp-hostsdk/PluginBufferingAdapter.cpp --- a/src/vamp-hostsdk/PluginBufferingAdapter.cpp Tue Nov 25 12:34:45 2008 +0000 +++ b/src/vamp-hostsdk/PluginBufferingAdapter.cpp Tue Nov 25 13:16:07 2008 +0000 @@ -475,6 +475,8 @@ bool success = m_plugin->initialise(m_channels, m_stepSize, m_blockSize); + std::cerr << "PluginBufferingAdapter::initialise: success = " << success << std::endl; + if (success) { // Re-query outputs; properties such as bin count may have // changed on initialise @@ -489,6 +491,8 @@ PluginBufferingAdapter::Impl::getOutputDescriptors() const { if (m_outputs.empty()) { + std::cerr << "PluginBufferingAdapter::getOutputDescriptors: querying anew" << std::endl; + m_outputs = m_plugin->getOutputDescriptors(); } diff -r 93c81a6c917a -r 6579e441f2fe src/vamp-sdk/PluginAdapter.cpp --- a/src/vamp-sdk/PluginAdapter.cpp Tue Nov 25 12:34:45 2008 +0000 +++ b/src/vamp-sdk/PluginAdapter.cpp Tue Nov 25 13:16:07 2008 +0000 @@ -98,8 +98,10 @@ static void vampReleaseFeatureSet(VampFeatureList *fs); + void checkOutputMap(Plugin *plugin); + void markOutputsChanged(Plugin *plugin); + void cleanup(Plugin *plugin); - void checkOutputMap(Plugin *plugin); unsigned int getOutputCount(Plugin *plugin); VampOutputDescriptor *getOutputDescriptor(Plugin *plugin, unsigned int i); @@ -325,7 +327,7 @@ VampPluginHandle PluginAdapterBase::Impl::vampInstantiate(const VampPluginDescriptor *desc, - float inputSampleRate) + float inputSampleRate) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << ")" << std::endl; @@ -372,16 +374,18 @@ int PluginAdapterBase::Impl::vampInitialise(VampPluginHandle handle, - unsigned int channels, - unsigned int stepSize, - unsigned int blockSize) + unsigned int channels, + unsigned int stepSize, + unsigned int blockSize) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampInitialise(" << handle << ", " << channels << ", " << stepSize << ", " << blockSize << ")" << std::endl; #endif - bool result = ((Plugin *)handle)->initialise - (channels, stepSize, blockSize); + Impl *adapter = lookupAdapter(handle); + if (!adapter) return 0; + bool result = ((Plugin *)handle)->initialise(channels, stepSize, blockSize); + adapter->markOutputsChanged((Plugin *)handle); return result ? 1 : 0; } @@ -421,6 +425,7 @@ if (!adapter) return; Plugin::ParameterList &list = adapter->m_parameters; ((Plugin *)handle)->setParameter(list[param].identifier, value); + adapter->markOutputsChanged((Plugin *)handle); } unsigned int @@ -442,7 +447,7 @@ void PluginAdapterBase::Impl::vampSelectProgram(VampPluginHandle handle, - unsigned int program) + unsigned int program) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampSelectProgram(" << handle << ", " << program << ")" << std::endl; @@ -450,8 +455,11 @@ Impl *adapter = lookupAdapter(handle); if (!adapter) return; + Plugin::ProgramList &list = adapter->m_programs; ((Plugin *)handle)->selectProgram(list[program]); + + adapter->markOutputsChanged((Plugin *)handle); } unsigned int @@ -511,7 +519,7 @@ VampOutputDescriptor * PluginAdapterBase::Impl::vampGetOutputDescriptor(VampPluginHandle handle, - unsigned int i) + unsigned int i) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampGetOutputDescriptor(" << handle << ", " << i << ")" << std::endl; @@ -559,8 +567,7 @@ Impl *adapter = lookupAdapter(handle); if (!adapter) return 0; - return adapter->process((Plugin *)handle, - inputBuffers, sec, nsec); + return adapter->process((Plugin *)handle, inputBuffers, sec, nsec); } VampFeatureList * @@ -628,26 +635,46 @@ void PluginAdapterBase::Impl::checkOutputMap(Plugin *plugin) { - if (m_pluginOutputs.find(plugin) == m_pluginOutputs.end() || - !m_pluginOutputs[plugin]) { + OutputMap::iterator i = m_pluginOutputs.find(plugin); + + if (i == m_pluginOutputs.end() || !i->second) { + m_pluginOutputs[plugin] = new Plugin::OutputList (plugin->getOutputDescriptors()); + // std::cerr << "PluginAdapterBase::Impl::checkOutputMap: Have " << m_pluginOutputs[plugin]->size() << " outputs for plugin " << plugin->getIdentifier() << std::endl; } } +void +PluginAdapterBase::Impl::markOutputsChanged(Plugin *plugin) +{ + OutputMap::iterator i = m_pluginOutputs.find(plugin); + +// std::cerr << "PluginAdapterBase::Impl::markOutputsChanged" << std::endl; + + if (i != m_pluginOutputs.end()) { + + Plugin::OutputList *list = i->second; + m_pluginOutputs.erase(i); + delete list; + } +} + unsigned int PluginAdapterBase::Impl::getOutputCount(Plugin *plugin) { checkOutputMap(plugin); + return m_pluginOutputs[plugin]->size(); } VampOutputDescriptor * PluginAdapterBase::Impl::getOutputDescriptor(Plugin *plugin, - unsigned int i) + unsigned int i) { checkOutputMap(plugin); + Plugin::OutputDescriptor &od = (*m_pluginOutputs[plugin])[i];