X-Git-Url: https://git.aubio.org/?p=vamp-aubio-plugins.git;a=blobdiff_plain;f=plugins%2FSilence.cpp;h=c58e21757352b3aed134c9f58047c48f4c57ecbd;hp=7369276e93a6f7221ec14ec443020e7c0540d270;hb=3b28404361abfb6b4df9d0ab2ae23f3034b75b34;hpb=340474448bee6047ee27d4d7b80bd9f1477bc810 diff --git a/plugins/Silence.cpp b/plugins/Silence.cpp index 7369276..c58e217 100644 --- a/plugins/Silence.cpp +++ b/plugins/Silence.cpp @@ -21,27 +21,20 @@ using std::vector; using std::cerr; using std::endl; -Silence::Silence(float inputSampleRate, unsigned int apiVersion) : +Silence::Silence(float inputSampleRate) : Plugin(inputSampleRate), - m_apiVersion(apiVersion), m_ibuf(0), m_pbuf(0), - m_tmpptrs(0), m_threshold(-80), m_prevSilent(false), m_first(true) { - if (m_apiVersion == 1) { - cerr << "vamp-aubio: WARNING: using compatibility version 1 of the Vamp API for silence\n" - << "detector plugin: upgrade your host to v2 for proper duration support" << endl; - } } Silence::~Silence() { if (m_ibuf) del_fvec(m_ibuf); if (m_pbuf) del_fvec(m_pbuf); - if (m_tmpptrs) delete[] m_tmpptrs; } string @@ -71,8 +64,7 @@ Silence::getMaker() const int Silence::getPluginVersion() const { - if (m_apiVersion == 1) return 2; - return 3; + return 4; } string @@ -84,13 +76,16 @@ Silence::getCopyright() const bool Silence::initialise(size_t channels, size_t stepSize, size_t blockSize) { - m_channelCount = channels; + if (channels != 1) { + std::cerr << "Silence::initialise: channels must be 1" << std::endl; + return false; + } + m_stepSize = stepSize; m_blockSize = blockSize; - m_ibuf = new_fvec(stepSize, channels); - m_pbuf = new_fvec(stepSize, channels); - m_tmpptrs = new smpl_t *[channels]; + m_ibuf = new_fvec(stepSize); + m_pbuf = new_fvec(stepSize); return true; } @@ -122,6 +117,7 @@ Silence::getParameterDescriptors() const desc = ParameterDescriptor(); desc.identifier = "silencethreshold"; desc.name = "Silence Threshold"; + desc.description = "Threshold for silence detection"; desc.minValue = -120; desc.maxValue = 0; desc.defaultValue = -80; @@ -157,50 +153,27 @@ Silence::getOutputDescriptors() const OutputDescriptor d; - if (m_apiVersion == 1) { - - d.identifier = "silencestart"; - d.name = "Beginnings of Silent Regions"; - d.description = "Return a single instant at the point where each silent region begins"; - d.hasFixedBinCount = true; - d.binCount = 0; - d.hasKnownExtents = false; - d.sampleType = OutputDescriptor::VariableSampleRate; - d.sampleRate = 0; - list.push_back(d); - - d.identifier = "silenceend"; - d.name = "Ends of Silent Regions"; - d.description = "Return a single instant at the point where each silent region ends"; - d.hasFixedBinCount = true; - d.binCount = 0; - d.hasKnownExtents = false; - d.sampleType = OutputDescriptor::VariableSampleRate; - d.sampleRate = 0; - list.push_back(d); - - } else { + d.identifier = "silent"; + d.name = "Silent Regions"; + d.description = "Return an interval covering each silent region"; + d.hasFixedBinCount = true; + d.binCount = 0; + d.hasKnownExtents = false; + d.sampleType = OutputDescriptor::VariableSampleRate; + d.sampleRate = 0; + d.hasDuration = true; + list.push_back(d); - d.identifier = "silent"; - d.name = "Silent Regions"; - d.description = "Return an interval covering each silent region"; - d.hasFixedBinCount = true; - d.binCount = 0; - d.hasKnownExtents = false; - d.sampleType = OutputDescriptor::VariableSampleRate; - d.sampleRate = 0; - list.push_back(d); - - d.identifier = "noisy"; - d.name = "Non-Silent Regions"; - d.description = "Return an interval covering each non-silent region"; - d.hasFixedBinCount = true; - d.binCount = 0; - d.hasKnownExtents = false; - d.sampleType = OutputDescriptor::VariableSampleRate; - d.sampleRate = 0; - list.push_back(d); - } + d.identifier = "noisy"; + d.name = "Non-Silent Regions"; + d.description = "Return an interval covering each non-silent region"; + d.hasFixedBinCount = true; + d.binCount = 0; + d.hasKnownExtents = false; + d.sampleType = OutputDescriptor::VariableSampleRate; + d.sampleRate = 0; + d.hasDuration = true; + list.push_back(d); d.identifier = "silencelevel"; d.name = "Silence Test"; @@ -224,9 +197,7 @@ Silence::process(const float *const *inputBuffers, Vamp::RealTime timestamp) { for (size_t i = 0; i < m_stepSize; ++i) { - for (size_t j = 0; j < m_channelCount; ++j) { - fvec_write_sample(m_ibuf, inputBuffers[j][i], j, i); - } + fvec_set_sample(m_ibuf, inputBuffers[0][i], i); } bool silent = aubio_silence_detection(m_ibuf, m_threshold); @@ -246,13 +217,9 @@ Silence::process(const float *const *inputBuffers, fvec_t vec; vec.length = incr * 4; - vec.channels = m_channelCount; - vec.data = m_tmpptrs; for (size_t i = 0; i < m_stepSize - incr * 4; i += incr) { - for (size_t j = 0; j < m_channelCount; ++j) { - m_tmpptrs[j] = m_ibuf->data[j] + i; - } + vec.data = m_ibuf->data + i; bool subsilent = aubio_silence_detection(&vec, m_threshold); if (silent == subsilent) { off = i; @@ -262,9 +229,7 @@ Silence::process(const float *const *inputBuffers, if (silent && (off == 0)) { for (size_t i = 0; i < m_stepSize - incr; i += incr) { - for (size_t j = 0; j < m_channelCount; ++j) { - m_tmpptrs[j] = m_pbuf->data[j] + m_stepSize - i - incr; - } + vec.data = m_pbuf->data + m_stepSize - i - incr; bool subsilent = aubio_silence_detection(&vec, m_threshold); if (!subsilent) { off = -(long)i; @@ -286,27 +251,21 @@ Silence::process(const float *const *inputBuffers, feature.values.clear(); - if (m_apiVersion == 1) { + if (!m_first) { + feature.timestamp = m_lastChange; + feature.hasDuration = true; + feature.duration = featureStamp - m_lastChange; if (silent) { - returnFeatures[0].push_back(feature); - } else { + // non-silent regions feature + // (becoming silent, so this is a non-silent region) returnFeatures[1].push_back(feature); - } - } else { - if (!m_first) { - feature.timestamp = m_lastChange; - feature.hasDuration = true; - feature.duration = featureStamp - m_lastChange; - if (silent) { - // becoming silent, so this is a non-silent region - returnFeatures[1].push_back(feature); - } else { - // becoming non-silent, so this is a silent region - returnFeatures[0].push_back(feature); - } - } - m_lastChange = featureStamp; + } else { + // silent regions feature + // (becoming non-silent, so this is a silent region) + returnFeatures[0].push_back(feature); + } } + m_lastChange = featureStamp; m_prevSilent = silent; m_first = false; @@ -315,7 +274,7 @@ Silence::process(const float *const *inputBuffers, // swap ibuf and pbuf data pointers, so that this block's data is // available in pbuf when processing the next block, without // having to allocate new storage for it - smpl_t **tmpdata = m_ibuf->data; + smpl_t *tmpdata = m_ibuf->data; m_ibuf->data = m_pbuf->data; m_pbuf->data = tmpdata; @@ -329,21 +288,33 @@ Silence::getRemainingFeatures() { FeatureSet returnFeatures; - if (m_prevSilent) { - if (m_lastTimestamp > m_lastChange) { - Feature feature; - feature.hasTimestamp = true; - feature.timestamp = m_lastChange; - feature.hasDuration = true; - feature.duration = m_lastTimestamp - m_lastChange; - if (m_prevSilent) { - returnFeatures[0].push_back(feature); - } else { - returnFeatures[1].push_back(feature); - } +// std::cerr << "Silence::getRemainingFeatures: m_lastTimestamp = " << m_lastTimestamp << ", m_lastChange = " << m_lastChange << ", m_apiVersion = " << m_apiVersion << ", m_prevSilent = " << m_prevSilent << std::endl; + + if (m_lastTimestamp > m_lastChange) { + + Feature feature; + feature.hasTimestamp = true; + + feature.timestamp = m_lastChange; + feature.hasDuration = true; + feature.duration = m_lastTimestamp - m_lastChange; + if (m_prevSilent) { + // silent regions feature + returnFeatures[0].push_back(feature); + } else { + // non-silent regions feature + returnFeatures[1].push_back(feature); + } + + if (!m_prevSilent) { + Feature silenceTestFeature; + silenceTestFeature.hasTimestamp = true; + silenceTestFeature.timestamp = m_lastTimestamp; + silenceTestFeature.values.push_back(0); + returnFeatures[2].push_back(silenceTestFeature); } } - return FeatureSet(); + return returnFeatures; }