diff framework/MainWindowBase.cpp @ 166:2c2029007618

* "ffwd-similar" * stop when ffwding to end
author Chris Cannam
date Tue, 03 Mar 2009 21:48:03 +0000
parents 07d8dac78edc
children 875a21ad7a95
line wrap: on
line diff
--- a/framework/MainWindowBase.cpp	Fri Feb 27 13:59:42 2009 +0000
+++ b/framework/MainWindowBase.cpp	Tue Mar 03 21:48:03 2009 +0000
@@ -2030,6 +2030,7 @@
     } else {
 
         size_t resolution = 0;
+        if (pane) frame = pane->alignFromReference(frame);
         if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(),
                                       frame, resolution, Layer::SnapRight)) {
             if (pane) frame = pane->alignToReference(frame);
@@ -2045,6 +2046,13 @@
     }
     
     m_viewManager->setPlaybackFrame(frame);
+
+    if (frame == getMainModel()->getEndFrame() &&
+        m_playSource &&
+        m_playSource->isPlaying() &&
+        !m_viewManager->getPlayLoopMode()) {
+        stop();
+    }
 }
 
 void
@@ -2068,6 +2076,44 @@
 }
 
 void
+MainWindowBase::ffwdSimilar()
+{
+    if (!getMainModel()) return;
+
+    Layer *layer = getSnapLayer();
+    if (!layer) { ffwd(); return; }
+
+    Pane *pane = m_paneStack->getCurrentPane();
+    size_t sr = getMainModel()->getSampleRate();
+
+    int frame = m_viewManager->getPlaybackFrame();
+
+    size_t resolution = 0;
+    if (pane) frame = pane->alignFromReference(frame);
+    if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(),
+                                    frame, resolution, Layer::SnapRight)) {
+        if (pane) frame = pane->alignToReference(frame);
+    } else {
+        frame = getMainModel()->getEndFrame();
+    }
+        
+    if (frame < 0) frame = 0;
+
+    if (m_viewManager->getPlaySelectionMode()) {
+        frame = m_viewManager->constrainFrameToSelection(size_t(frame));
+    }
+    
+    m_viewManager->setPlaybackFrame(frame);
+
+    if (frame == getMainModel()->getEndFrame() &&
+        m_playSource &&
+        m_playSource->isPlaying() &&
+        !m_viewManager->getPlayLoopMode()) {
+        stop();
+    }
+}
+
+void
 MainWindowBase::rewind()
 {
     if (!getMainModel()) return;
@@ -2086,9 +2132,7 @@
         RealTime ct = RealTime::frame2RealTime(frame, sr);
         ct = ct - RealTime::fromSeconds(0.25);
         if (ct < RealTime::zeroTime) ct = RealTime::zeroTime;
-//        std::cerr << "rewind: frame " << frame << " -> ";
         frame = RealTime::realTime2Frame(ct, sr);
-//        std::cerr << frame << std::endl;
     }
 
     if (!layer) {
@@ -2102,9 +2146,9 @@
     } else {
 
         size_t resolution = 0;
+        if (pane) frame = pane->alignFromReference(frame);
         if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(),
                                       frame, resolution, Layer::SnapLeft)) {
-            
             if (pane) frame = pane->alignToReference(frame);
         } else {
             frame = getMainModel()->getStartFrame();
@@ -2134,6 +2178,37 @@
     m_viewManager->setPlaybackFrame(frame);
 }
 
+void
+MainWindowBase::rewindSimilar()
+{
+    if (!getMainModel()) return;
+
+    Layer *layer = getSnapLayer();
+    if (!layer) { rewind(); return; }
+
+    Pane *pane = m_paneStack->getCurrentPane();
+    size_t sr = getMainModel()->getSampleRate();
+
+    int frame = m_viewManager->getPlaybackFrame();
+
+    size_t resolution = 0;
+    if (pane) frame = pane->alignFromReference(frame);
+    if (layer->snapToSimilarFeature(m_paneStack->getCurrentPane(),
+                                    frame, resolution, Layer::SnapLeft)) {
+        if (pane) frame = pane->alignToReference(frame);
+    } else {
+        frame = getMainModel()->getStartFrame();
+    }
+        
+    if (frame < 0) frame = 0;
+
+    if (m_viewManager->getPlaySelectionMode()) {
+        frame = m_viewManager->constrainFrameToSelection(size_t(frame));
+    }
+    
+    m_viewManager->setPlaybackFrame(frame);
+}
+
 Layer *
 MainWindowBase::getSnapLayer() const
 {