# HG changeset patch # User matthiasm # Date 1403082792 -3600 # Node ID 0b08d860081b4f15f6eed5609f73750d865e1956 # Parent 11ba706b1e7a9861661b664eaa1fd0e1d0078340 changed the way the cursor works diff -r 11ba706b1e7a -r 0b08d860081b .hgsubstate --- a/.hgsubstate Mon Jun 16 16:26:09 2014 +0100 +++ b/.hgsubstate Wed Jun 18 10:13:12 2014 +0100 @@ -1,6 +1,6 @@ e32a354434aa5fa7440efa17b716aacd761049fa chp 236814e07bd07473958c1ff89103124536a0c3c8 dataquay -062f0e49187789937b6162d2904b1af20872ed5e pyin +e637cf9160029c6d429bf89fedca157619ca8da8 pyin 553a5f65ef64811747a6613f759622d655db63c1 sv-dependency-builds f5c914661f6fdc7f05c2c980b0d21350d5933428 svapp 3efc20c59a947a137ed7fc715b2a3b0de6c02200 svcore diff -r 11ba706b1e7a -r 0b08d860081b src/MainWindow.cpp --- a/src/MainWindow.cpp Mon Jun 16 16:26:09 2014 +0100 +++ b/src/MainWindow.cpp Wed Jun 18 10:13:12 2014 +0100 @@ -3285,5 +3285,73 @@ settings.endGroup(); } - - +void +MainWindow::ffwd() +{ + if (!getMainModel()) return; + + int frame = m_viewManager->getPlaybackFrame(); + ++frame; + + size_t sr = getMainModel()->getSampleRate(); + + // The step is supposed to scale and be as wide as a step of + // m_defaultFfwdRwdStep seconds at zoom level 512 and sr = 44100 + size_t framesPerPixel = m_viewManager->getGlobalZoom(); + size_t defaultZoom = (512 * 44100) / sr; + + float scaler = (framesPerPixel * 1.0f) / defaultZoom; + + + frame = RealTime::realTime2Frame + (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep * scaler, sr); + if (frame > int(getMainModel()->getEndFrame())) { + 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 == (int)getMainModel()->getEndFrame() && + m_playSource && + m_playSource->isPlaying() && + !m_viewManager->getPlayLoopMode()) { + stop(); + } +} + +void +MainWindow::rewind() +{ + if (!getMainModel()) return; + + int frame = m_viewManager->getPlaybackFrame(); + if (frame > 0) --frame; + + size_t sr = getMainModel()->getSampleRate(); + + // The step is supposed to scale and be as wide as a step of + // m_defaultFfwdRwdStep seconds at zoom level 512 and sr = 44100 + size_t framesPerPixel = m_viewManager->getGlobalZoom(); + size_t defaultZoom = (512 * 44100) / sr; + + float scaler = (framesPerPixel * 1.0f) / defaultZoom; + frame = RealTime::realTime2Frame + (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep * scaler, sr); + if (frame < int(getMainModel()->getStartFrame())) { + frame = getMainModel()->getStartFrame(); + } + + if (frame < 0) frame = 0; + + if (m_viewManager->getPlaySelectionMode()) { + frame = m_viewManager->constrainFrameToSelection(size_t(frame)); + } + + m_viewManager->setPlaybackFrame(frame); +} diff -r 11ba706b1e7a -r 0b08d860081b src/MainWindow.h --- a/src/MainWindow.h Mon Jun 16 16:26:09 2014 +0100 +++ b/src/MainWindow.h Wed Jun 18 10:13:12 2014 +0100 @@ -187,6 +187,9 @@ void selectOneNoteRight(); void selectOneNoteLeft(); + void ffwd(); + void rewind(); + protected: Analyser *m_analyser;