changeset 164:62ceae757fe0

Re-analyse frames when selection changes (this only pulls up a set of new candidates for now, can't do anything with them and the old ones are never removed)
author Chris Cannam
date Thu, 30 Jan 2014 17:33:55 +0000
parents ec196bd2f068
children ebcfb8dce020
files .hgsubstate src/Analyser.cpp src/Analyser.h src/MainWindow.cpp src/MainWindow.h
diffstat 5 files changed, 57 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsubstate	Wed Jan 29 17:34:28 2014 +0000
+++ b/.hgsubstate	Thu Jan 30 17:33:55 2014 +0000
@@ -2,4 +2,4 @@
 27d4e7152c954bf3c4387319db088fb3cd02436b sv-dependency-builds
 f72d58d1ccb0736f4ab40853986d5952e0dd8321 svapp
 a2689db084f49daf0dcac1bea13d33c51f600266 svcore
-5f9c0147d1d6302edac372e4d5747ae615d57638 svgui
+15b5c679b90924f4bdfc0afac2c97355d841bfbe svgui
--- a/src/Analyser.cpp	Wed Jan 29 17:34:28 2014 +0000
+++ b/src/Analyser.cpp	Thu Jan 30 17:33:55 2014 +0000
@@ -88,9 +88,6 @@
     error = addAnalyses();
     if (error != "") return error;
 
-    error = addTestCandidates();
-    if (error != "") return error;
-
     loadState(Audio);
     loadState(PitchTrack);
     loadState(Notes);
@@ -102,6 +99,12 @@
 }
 
 QString
+Analyser::reAnalyseSelection(Selection sel)
+{
+    return addTestCandidates(sel);
+}
+
+QString
 Analyser::addVisualisations()
 {
     TransformFactory *tf = TransformFactory::getInstance();
@@ -244,7 +247,7 @@
 }
 
 QString
-Analyser::addTestCandidates()
+Analyser::addTestCandidates(Selection sel)
 {
     TransformFactory *tf = TransformFactory::getInstance();
     
@@ -264,8 +267,20 @@
     t.setStepSize(256);
     t.setBlockSize(2048);
 
-    t.setStartTime(RealTime::fromSeconds(10.785));
-    t.setDuration(RealTime::fromSeconds(1.2));
+    RealTime start = RealTime::frame2RealTime
+        (sel.getStartFrame(), m_fileModel->getSampleRate());
+
+    RealTime end = RealTime::frame2RealTime
+        (sel.getEndFrame(), m_fileModel->getSampleRate());
+
+    RealTime duration;
+
+    if (sel.getEndFrame() > sel.getStartFrame()) {
+        duration = end - start;
+    }
+
+    t.setStartTime(start);
+    t.setDuration(duration);
 
     transforms.push_back(t);
 
--- a/src/Analyser.h	Wed Jan 29 17:34:28 2014 +0000
+++ b/src/Analyser.h	Thu Jan 30 17:33:55 2014 +0000
@@ -22,6 +22,7 @@
 #include <vector>
 
 #include "framework/Document.h"
+#include "base/Selection.h"
 
 class WaveFileModel;
 class Pane;
@@ -82,6 +83,13 @@
 
     void getEnclosingSelectionScope(size_t f, size_t &f0, size_t &f1);
 
+    /**
+     * Analyse the selection and add candidates layers for the region
+     * it contains. Returns "" on success or a user-readable error
+     * string on failure.
+     */
+    QString reAnalyseSelection(Selection sel);
+
 signals:
     void layersChanged();
 
@@ -96,7 +104,7 @@
     QString addWaveform();
     QString addAnalyses();
 
-    QString addTestCandidates();
+    QString addTestCandidates(Selection sel);
 
     // Document::LayerCreationHandler method
     void layersCreated(std::vector<Layer *>, std::vector<Layer *>);
--- a/src/MainWindow.cpp	Wed Jan 29 17:34:28 2014 +0000
+++ b/src/MainWindow.cpp	Thu Jan 30 17:33:55 2014 +0000
@@ -147,6 +147,9 @@
     m_viewManager->setShowCentreLine(false);
     m_viewManager->setOverlayMode(ViewManager::MinimalOverlays);
 
+    connect(m_viewManager, SIGNAL(selectionChanged()),
+	    this, SLOT(selectionChanged()));
+
     QFrame *frame = new QFrame;
     setCentralWidget(frame);
 
@@ -1623,7 +1626,27 @@
     
     cerr << "MainWindow::doubleClickSelectInvoked(" << frame << "): [" << f0 << "," << f1 << "]" << endl;
 
-    m_viewManager->setSelection(Selection(f0, f1));
+    Selection sel(f0, f1);
+    m_viewManager->setSelection(sel);
+}
+
+void
+MainWindow::selectionChanged()
+{
+    MultiSelection::SelectionList selections = m_viewManager->getSelections();
+
+    cerr << "MainWindow::selectionChanged" << endl;
+
+    if (!selections.empty()) {
+        Selection sel = *selections.begin();
+        cerr << "MainWindow::selectionChanged: have selection" << endl;
+        QString error = m_analyser->reAnalyseSelection(sel);
+        if (error != "") {
+            QMessageBox::critical
+                (this, tr("Failed to analyse selection"),
+                 tr("<b>Analysis failed</b><p>%2</p>").arg(error));
+        }
+    }
 }
 
 void
--- a/src/MainWindow.h	Wed Jan 29 17:34:28 2014 +0000
+++ b/src/MainWindow.h	Thu Jan 30 17:33:55 2014 +0000
@@ -149,6 +149,8 @@
     virtual void about();
     virtual void keyReference();
 
+    virtual void selectionChanged();
+
 protected:
     Analyser      *m_analyser;