comparison framework/MainWindowBase.cpp @ 708:721eb532840d

Fix to avoid ffwd/rwd getting stuck at a single point if it translates to the playback frame again on alignment
author Chris Cannam
date Mon, 16 Sep 2019 13:28:40 +0100
parents b5000a78249a
children 8e9702c0b9c7
comparison
equal deleted inserted replaced
707:94ca0ade69b6 708:721eb532840d
3348 void 3348 void
3349 MainWindowBase::ffwd() 3349 MainWindowBase::ffwd()
3350 { 3350 {
3351 if (!getMainModel()) return; 3351 if (!getMainModel()) return;
3352 3352
3353 sv_frame_t frame = m_viewManager->getPlaybackFrame(); 3353 sv_frame_t playbackFrame = m_viewManager->getPlaybackFrame();
3354 ++frame; 3354 sv_frame_t frame = playbackFrame + 1;
3355 3355
3356 Pane *pane = m_paneStack->getCurrentPane(); 3356 Pane *pane = m_paneStack->getCurrentPane();
3357 Layer *layer = getSnapLayer(); 3357 Layer *layer = getSnapLayer();
3358 sv_samplerate_t sr = getMainModel()->getSampleRate(); 3358 sv_samplerate_t sr = getMainModel()->getSampleRate();
3359 3359
3360 if (!layer) { 3360 if (!pane || !layer) {
3361 3361
3362 frame = RealTime::realTime2Frame 3362 frame = RealTime::realTime2Frame
3363 (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep, sr); 3363 (RealTime::frame2RealTime(frame, sr) + m_defaultFfwdRwdStep, sr);
3364 if (frame > getMainModel()->getEndFrame()) { 3364 if (frame > getMainModel()->getEndFrame()) {
3365 frame = getMainModel()->getEndFrame(); 3365 frame = getMainModel()->getEndFrame();
3366 } 3366 }
3367 3367
3368 } else { 3368 } else {
3369 3369
3370 sv_frame_t pframe = pane->alignFromReference(frame);
3370 int resolution = 0; 3371 int resolution = 0;
3371 if (pane) frame = pane->alignFromReference(frame); 3372 bool success = false;
3372 if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), 3373
3373 frame, resolution, Layer::SnapRight)) { 3374 while (layer->snapToFeatureFrame(pane, pframe, resolution,
3374 if (pane) frame = pane->alignToReference(frame); 3375 Layer::SnapRight)) {
3376 if (pane->alignToReference(pframe) > playbackFrame) {
3377 success = true;
3378 break;
3379 } else {
3380 ++pframe;
3381 }
3382 }
3383
3384 if (success) {
3385 frame = pane->alignToReference(pframe);
3375 } else { 3386 } else {
3376 frame = getMainModel()->getEndFrame(); 3387 frame = getMainModel()->getEndFrame();
3377 } 3388 }
3378 } 3389 }
3379 3390
3383 frame = m_viewManager->constrainFrameToSelection(frame); 3394 frame = m_viewManager->constrainFrameToSelection(frame);
3384 } 3395 }
3385 3396
3386 m_viewManager->setPlaybackFrame(frame); 3397 m_viewManager->setPlaybackFrame(frame);
3387 3398
3388 if (frame == getMainModel()->getEndFrame() && 3399 if (frame >= getMainModel()->getEndFrame() &&
3389 m_playSource && 3400 m_playSource &&
3390 m_playSource->isPlaying() && 3401 m_playSource->isPlaying() &&
3391 !m_viewManager->getPlayLoopMode()) { 3402 !m_viewManager->getPlayLoopMode()) {
3392 stop(); 3403 stop();
3393 } 3404 }
3452 void 3463 void
3453 MainWindowBase::rewind() 3464 MainWindowBase::rewind()
3454 { 3465 {
3455 if (!getMainModel()) return; 3466 if (!getMainModel()) return;
3456 3467
3457 sv_frame_t frame = m_viewManager->getPlaybackFrame(); 3468 sv_frame_t playbackFrame = m_viewManager->getPlaybackFrame();
3469 sv_frame_t frame = playbackFrame;
3458 if (frame > 0) --frame; 3470 if (frame > 0) --frame;
3459 3471
3460 Pane *pane = m_paneStack->getCurrentPane(); 3472 Pane *pane = m_paneStack->getCurrentPane();
3461 Layer *layer = getSnapLayer(); 3473 Layer *layer = getSnapLayer();
3462 sv_samplerate_t sr = getMainModel()->getSampleRate(); 3474 sv_samplerate_t sr = getMainModel()->getSampleRate();
3469 ct = ct - RealTime::fromSeconds(0.15); 3481 ct = ct - RealTime::fromSeconds(0.15);
3470 if (ct < RealTime::zeroTime) ct = RealTime::zeroTime; 3482 if (ct < RealTime::zeroTime) ct = RealTime::zeroTime;
3471 frame = RealTime::realTime2Frame(ct, sr); 3483 frame = RealTime::realTime2Frame(ct, sr);
3472 } 3484 }
3473 3485
3474 if (!layer) { 3486 if (!pane || !layer) {
3475 3487
3476 frame = RealTime::realTime2Frame 3488 frame = RealTime::realTime2Frame
3477 (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep, sr); 3489 (RealTime::frame2RealTime(frame, sr) - m_defaultFfwdRwdStep, sr);
3478 if (frame < getMainModel()->getStartFrame()) { 3490 if (frame < getMainModel()->getStartFrame()) {
3479 frame = getMainModel()->getStartFrame(); 3491 frame = getMainModel()->getStartFrame();
3480 } 3492 }
3481 3493
3482 } else { 3494 } else {
3483 3495
3496 sv_frame_t pframe = pane->alignFromReference(frame);
3484 int resolution = 0; 3497 int resolution = 0;
3485 if (pane) frame = pane->alignFromReference(frame); 3498 bool success = false;
3486 if (layer->snapToFeatureFrame(m_paneStack->getCurrentPane(), 3499
3487 frame, resolution, Layer::SnapLeft)) { 3500 while (layer->snapToFeatureFrame(pane, pframe, resolution,
3488 if (pane) frame = pane->alignToReference(frame); 3501 Layer::SnapLeft)) {
3502 if (pane->alignToReference(pframe) < playbackFrame ||
3503 pframe <= 0) {
3504 success = true;
3505 break;
3506 } else {
3507 --pframe;
3508 }
3509 }
3510
3511 if (success) {
3512 frame = pane->alignToReference(pframe);
3489 } else { 3513 } else {
3490 frame = getMainModel()->getStartFrame(); 3514 frame = getMainModel()->getStartFrame();
3491 } 3515 }
3492 } 3516 }
3493 3517