summaryrefslogtreecommitdiff
path: root/libs/ardour/audioanalyser.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-02-02 17:22:04 +0000
committerDavid Robillard <d@drobilla.net>2008-02-02 17:22:04 +0000
commit80c3677c837cc9eb432df3d65a34aba543fa7258 (patch)
treeca23bb7e5bff6c35c151d73221002a9ce3abfe1a /libs/ardour/audioanalyser.cc
parent9f63ab9931e6478472853bdda58da47ea29ac125 (diff)
Merge with 2.0-ongoing R2988
git-svn-id: svn://localhost/ardour2/branches/3.0@2991 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/audioanalyser.cc')
-rw-r--r--libs/ardour/audioanalyser.cc46
1 files changed, 27 insertions, 19 deletions
diff --git a/libs/ardour/audioanalyser.cc b/libs/ardour/audioanalyser.cc
index 4cc99a5d5e..9da404e5bf 100644
--- a/libs/ardour/audioanalyser.cc
+++ b/libs/ardour/audioanalyser.cc
@@ -18,13 +18,19 @@ using namespace ARDOUR;
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
@@ -73,29 +79,28 @@ 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;
@@ -108,7 +113,6 @@ AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
to_read = min ((len - pos), bufsize);
if (src->read (data, pos, to_read, channel) != to_read) {
- cerr << "bad read\n";
goto out;
}
@@ -118,14 +122,14 @@ AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
memset (data + to_read, 0, (bufsize - to_read));
}
- 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;
-
+
if (pos >= len) {
done = true;
}
@@ -133,9 +137,9 @@ AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
/* 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;
}
@@ -146,10 +150,14 @@ AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
ofile.close ();
if (ret) {
- g_remove (path.c_str());
+ 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());
}
+
if (data) {
- delete data;
+ delete [] data;
}
return ret;