Fix crash on relayering.
[ardour.git] / libs / ardour / audioanalyser.cc
index 9da404e5bf5e7c3df83eec5b3be7349fc4418c00..53b60f9eaa0626accbdc23fc1ee7dcfee94eb639 100644 (file)
@@ -1,13 +1,18 @@
-#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"
 
@@ -119,7 +124,7 @@ AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
                /* 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));
                }
                
                features = plugin->process (bufs, RealTime::fromSeconds ((double) pos / sample_rate));
@@ -128,7 +133,7 @@ AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
                        goto out;
                }
 
-               pos += stepsize;
+               pos += min (stepsize, to_read);
 
                if (pos >= len) {
                        done = true;
@@ -156,9 +161,7 @@ AudioAnalyser::analyse (const string& path, Readable* src, uint32_t channel)
                g_rename (tmp_path.c_str(), path.c_str());
        }
 
-       if (data) {
-               delete [] data;
-       }
+       delete [] data;
 
        return ret;
 }