# HG changeset patch # User cannam # Date 1143826789 0 # Node ID c66551966b5f6f61aae09794d4eecffeb0dc4453 # Parent 8f10d35a409013ac41a32f33b0709c36b3d1b193 * Fix a couple of memory management and corruption bugs * Some textual fixes diff -r 8f10d35a4090 -r c66551966b5f Makefile --- a/Makefile Fri Mar 31 16:26:28 2006 +0000 +++ b/Makefile Fri Mar 31 17:39:49 2006 +0000 @@ -1,11 +1,11 @@ -all: examples/plugins.so host/simplehost test +all: examples_ host_ test -examples/plugins.so: +examples_: $(MAKE) -C examples all -host/simplehost: +host_: $(MAKE) -C host all test: diff -r 8f10d35a4090 -r c66551966b5f examples/SpectralCentroid.cpp --- a/examples/SpectralCentroid.cpp Fri Mar 31 16:26:28 2006 +0000 +++ b/examples/SpectralCentroid.cpp Fri Mar 31 17:39:49 2006 +0000 @@ -36,16 +36,13 @@ #include "SpectralCentroid.h" -/* -#include "dsp/transforms/FFT.h" -#include "base/Window.h" -*/ - using std::string; using std::vector; using std::cerr; using std::endl; +#include + SpectralCentroid::SpectralCentroid(float inputSampleRate) : Plugin(inputSampleRate), @@ -75,7 +72,7 @@ string SpectralCentroid::getMaker() const { - return "QMUL"; + return "Queen Mary, University of London"; } int @@ -87,7 +84,7 @@ string SpectralCentroid::getCopyright() const { - return "GPL"; + return "Freely redistributable (BSD license)"; } bool @@ -157,21 +154,6 @@ return FeatureSet(); } -/* - for (size_t i = 0; i < m_blockSize; ++i) { - m_workBuffer[i] = inputBuffers[0][i]; - m_workBuffer[i + m_blockSize] = 0.0; - } - - Window(HanningWindow, m_blockSize).cut(m_workBuffer); - - FFT::process(m_blockSize, false, - m_workBuffer, - m_workBuffer + m_blockSize, - m_workBuffer + m_blockSize*2, - m_workBuffer + m_blockSize*3); -*/ - double numLin = 0.0, numLog = 0.0, denom = 0.0; for (size_t i = 1; i < m_blockSize/2; ++i) { diff -r 8f10d35a4090 -r c66551966b5f examples/ZeroCrossing.cpp --- a/examples/ZeroCrossing.cpp Fri Mar 31 16:26:28 2006 +0000 +++ b/examples/ZeroCrossing.cpp Fri Mar 31 17:39:49 2006 +0000 @@ -68,7 +68,7 @@ string ZeroCrossing::getMaker() const { - return "QMUL"; + return "Queen Mary, University of London"; } int @@ -80,7 +80,7 @@ string ZeroCrossing::getCopyright() const { - return "GPL"; + return "Freely redistributable (BSD license)"; } bool diff -r 8f10d35a4090 -r c66551966b5f vamp-sdk/PluginAdapter.cpp --- a/vamp-sdk/PluginAdapter.cpp Fri Mar 31 16:26:28 2006 +0000 +++ b/vamp-sdk/PluginAdapter.cpp Fri Mar 31 17:39:49 2006 +0000 @@ -62,8 +62,10 @@ m_descriptor.parameterCount = m_parameters.size(); m_descriptor.parameters = (const VampParameterDescriptor **) malloc(m_parameters.size() * sizeof(VampParameterDescriptor)); + + unsigned int i; - for (unsigned int i = 0; i < m_parameters.size(); ++i) { + for (i = 0; i < m_parameters.size(); ++i) { VampParameterDescriptor *desc = (VampParameterDescriptor *) malloc(sizeof(VampParameterDescriptor)); desc->name = strdup(m_parameters[i].name.c_str()); @@ -81,7 +83,7 @@ m_descriptor.programs = (const char **) malloc(m_programs.size() * sizeof(const char *)); - for (unsigned int i = 0; i < m_programs.size(); ++i) { + for (i = 0; i < m_programs.size(); ++i) { m_descriptor.programs[i] = strdup(m_programs[i].c_str()); } @@ -316,16 +318,19 @@ PluginAdapterBase::vampReleaseFeatureSet(VampFeatureList **fs) { if (!fs) return; + for (unsigned int i = 0; fs[i]; ++i) { + for (unsigned int j = 0; j < fs[i]->featureCount; ++j) { VampFeature *feature = &fs[i]->features[j]; if (feature->values) free((void *)feature->values); if (feature->label) free((void *)feature->label); - free((void *)feature); } + if (fs[i]->features) free((void *)fs[i]->features); free((void *)fs[i]); } + free((void *)fs); } @@ -373,15 +378,19 @@ desc->hasFixedValueCount = od.hasFixedValueCount; desc->valueCount = od.valueCount; - desc->valueNames = (const char **) - malloc(od.valueCount * sizeof(const char *)); + if (od.valueCount > 0) { + desc->valueNames = (const char **) + malloc(od.valueCount * sizeof(const char *)); - for (unsigned int i = 0; i < od.valueCount; ++i) { - if (i < od.valueNames.size()) { - desc->valueNames[i] = strdup(od.valueNames[i].c_str()); - } else { - desc->valueNames[i] = 0; + for (unsigned int i = 0; i < od.valueCount; ++i) { + if (i < od.valueNames.size()) { + desc->valueNames[i] = strdup(od.valueNames[i].c_str()); + } else { + desc->valueNames[i] = 0; + } } + } else { + desc->valueNames = 0; } desc->hasKnownExtents = od.hasKnownExtents; @@ -435,28 +444,49 @@ malloc((n + 1) * sizeof(VampFeatureList *)); for (unsigned int i = 0; i < n; ++i) { + fs[i] = (VampFeatureList *)malloc(sizeof(VampFeatureList)); + if (features.find(i) == features.end()) { + fs[i]->featureCount = 0; fs[i]->features = 0; - } else { - Plugin::FeatureSet::const_iterator fi = - features.find(i); - const Plugin::FeatureList &fl = fi->second; - fs[i]->featureCount = fl.size(); - fs[i]->features = (VampFeature *)malloc(fl.size() * - sizeof(VampFeature)); - for (unsigned int j = 0; j < fl.size(); ++j) { - fs[i]->features[j].hasTimestamp = fl[j].hasTimestamp; - fs[i]->features[j].sec = fl[j].timestamp.sec; - fs[i]->features[j].nsec = fl[j].timestamp.nsec; - fs[i]->features[j].valueCount = fl[j].values.size(); - fs[i]->features[j].values = (float *)malloc - (fs[i]->features[j].valueCount * sizeof(float)); - for (unsigned int k = 0; k < fs[i]->features[j].valueCount; ++k) { - fs[i]->features[j].values[k] = fl[j].values[k]; - } - fs[i]->features[j].label = strdup(fl[j].label.c_str()); + continue; + } + + Plugin::FeatureSet::const_iterator fi = features.find(i); + + const Plugin::FeatureList &fl = fi->second; + + fs[i]->featureCount = fl.size(); + + if (fs[i]->featureCount == 0) { + fs[i]->features = 0; + continue; + } + + fs[i]->features = (VampFeature *)malloc(fl.size() * sizeof(VampFeature)); + + for (unsigned int j = 0; j < fl.size(); ++j) { + + VampFeature *feature = &fs[i]->features[j]; + + feature->hasTimestamp = fl[j].hasTimestamp; + feature->sec = fl[j].timestamp.sec; + feature->nsec = fl[j].timestamp.nsec; + feature->valueCount = fl[j].values.size(); + feature->label = strdup(fl[j].label.c_str()); + + if (feature->valueCount == 0) { + feature->values = 0; + continue; + } + + feature->values = (float *)malloc + (feature->valueCount * sizeof(float)); + + for (unsigned int k = 0; k < feature->valueCount; ++k) { + feature->values[k] = fl[j].values[k]; } } } diff -r 8f10d35a4090 -r c66551966b5f vamp-sdk/PluginHostAdapter.cpp --- a/vamp-sdk/PluginHostAdapter.cpp Fri Mar 31 16:26:28 2006 +0000 +++ b/vamp-sdk/PluginHostAdapter.cpp Fri Mar 31 17:39:49 2006 +0000 @@ -223,7 +223,7 @@ d.hasFixedValueCount = sd->hasFixedValueCount; d.valueCount = sd->valueCount; for (unsigned int j = 0; j < sd->valueCount; ++j) { - d.valueNames.push_back(sd->valueNames[i] ? sd->valueNames[i] : ""); + d.valueNames.push_back(sd->valueNames[j] ? sd->valueNames[j] : ""); } d.hasKnownExtents = sd->hasKnownExtents; d.minValue = sd->minValue; @@ -286,6 +286,8 @@ PluginHostAdapter::convertFeatures(VampFeatureList **features, FeatureSet &fs) { + if (!features) return; + for (unsigned int i = 0; features[i]; ++i) { VampFeatureList &list = *features[i]; @@ -302,8 +304,10 @@ for (unsigned int k = 0; k < list.features[j].valueCount; ++k) { feature.values.push_back(list.features[j].values[k]); } - - feature.label = list.features[j].label; + + if (list.features[j].label) { + feature.label = list.features[j].label; + } fs[i].push_back(feature); }