-#include <vamp-sdk/hostext/PluginLoader.h>
+#include <cstring>
+
+#include "vamp-hostsdk/PluginLoader.h"
+
#include <glibmm/miscutils.h>
#include <glibmm/fileutils.h>
#include <glib/gstdio.h> // for g_remove()
-#include <pbd/error.h>
+#include "pbd/error.h"
-#include <ardour/audioanalyser.h>
-#include <ardour/readable.h>
-#include <ardour/readable.h>
+#include "ardour/audioanalyser.h"
+#include "ardour/readable.h"
+#include "ardour/readable.h"
+
+#include <cstring>
#include "i18n.h"
AudioAnalyser::AudioAnalyser (float sr, AnalysisPluginKey key)
: sample_rate (sr)
- , plugin (0)
, plugin_key (key)
{
+ /* create VAMP plugin and initialize */
+
+ if (initialize_plugin (plugin_key, sample_rate)) {
+ error << string_compose (_("cannot load VAMP plugin \"%1\""), key) << endmsg;
+ throw failed_constructor();
+ }
}
AudioAnalyser::~AudioAnalyser ()
{
+ delete plugin;
}
int
AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
{
ofstream ofile;
- Plugin::FeatureSet onsets;
+ Plugin::FeatureSet features;
int ret = -1;
bool done = false;
Sample* data = 0;
nframes64_t len = src->readable_length();
nframes64_t pos = 0;
float* bufs[1] = { 0 };
+ string tmp_path;
if (!path.empty()) {
- ofile.open (path.c_str());
+
+ /* store data in tmp file, not the real one */
+
+ tmp_path = path;
+ tmp_path += ".tmp";
+
+ ofile.open (tmp_path.c_str());
if (!ofile) {
goto out;
}
}
- /* create VAMP percussion onset plugin and initialize */
-
- if (plugin == 0) {
- if (initialize_plugin (plugin_key, sample_rate)) {
- goto out;
- }
- }
-
data = new Sample[bufsize];
bufs[0] = data;
to_read = min ((len - pos), bufsize);
if (src->read (data, pos, to_read, channel) != to_read) {
- cerr << "bad read\n";
goto out;
}
/* zero fill buffer if necessary */
if (to_read != bufsize) {
- memset (data + to_read, 0, (bufsize - to_read));
+ memset (data + to_read, 0, (bufsize - to_read) * sizeof (Sample));
}
- onsets = plugin->process (bufs, RealTime::fromSeconds ((double) pos / sample_rate));
+ features = plugin->process (bufs, RealTime::fromSeconds ((double) pos / sample_rate));
- if (use_features (onsets, (path.empty() ? &ofile : 0))) {
+ if (use_features (features, (path.empty() ? 0 : &ofile))) {
goto out;
}
- pos += stepsize;
-
+ pos += min (stepsize, to_read);
+
if (pos >= len) {
done = true;
}
/* finish up VAMP plugin */
- onsets = plugin->getRemainingFeatures ();
+ features = plugin->getRemainingFeatures ();
- if (use_features (onsets, (path.empty() ? &ofile : 0))) {
+ if (use_features (features, (path.empty() ? &ofile : 0))) {
goto out;
}
ofile.close ();
if (ret) {
- g_remove (path.c_str());
- }
- if (data) {
- delete data;
+ g_remove (tmp_path.c_str());
+ } else if (!path.empty()) {
+ /* move the data file to the requested path */
+ g_rename (tmp_path.c_str(), path.c_str());
}
+ delete [] data;
+
return ret;
}