From ec86648ba1772001c26d23845d54ac7254cc92e5 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 31 Oct 2019 00:14:55 +0100 Subject: [PATCH] Fix an issue where it was not possible to add new infinite clips to a playlist that was already playing. Non-infinite clips were okay all along, but infinite clips would have zero (well, negative) length. --- futatabi/mainwindow.cpp | 27 +++++++++++++++------------ futatabi/mainwindow.h | 1 + 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/futatabi/mainwindow.cpp b/futatabi/mainwindow.cpp index f55ad0e..0ebb75c 100644 --- a/futatabi/mainwindow.cpp +++ b/futatabi/mainwindow.cpp @@ -629,10 +629,7 @@ void MainWindow::defer_timer_expired() void MainWindow::content_changed() { // If we are playing, update the part of the playlist that's not playing yet. - vector clips; - for (unsigned row = 0; row < playlist_clips->size(); ++row) { - clips.emplace_back(*playlist_clips->clip_with_id(row)); - } + vector clips = get_playlist(0, playlist_clips->size()); live_player->splice_play(clips); // Serialize the state. @@ -693,14 +690,7 @@ void MainWindow::play_clicked() } unsigned start_row = selected->selectedRows(0)[0].row(); - vector clips; - for (unsigned row = start_row; row < playlist_clips->size(); ++row) { - ClipWithID clip = *playlist_clips->clip_with_id(row); - if (clip.clip.pts_out == -1) { - clip.clip.pts_out = clip.clip.pts_in + int64_t(TIMEBASE) * 86400 * 7; // One week; effectively infinite, but without overflow issues. - } - clips.emplace_back(clip); - } + vector clips = get_playlist(start_row, playlist_clips->size()); live_player->play(clips); playlist_clips->set_progress({ { start_row, 0.0f } }); ui->playlist->selectionModel()->clear(); @@ -1054,6 +1044,19 @@ void MainWindow::clip_list_selection_changed(const QModelIndex ¤t, const Q enable_or_disable_queue_button(); } +vector MainWindow::get_playlist(size_t start_row, size_t end_row) +{ + vector clips; + for (unsigned row = start_row; row < end_row; ++row) { + ClipWithID clip = *playlist_clips->clip_with_id(row); + if (clip.clip.pts_out == -1) { + clip.clip.pts_out = clip.clip.pts_in + int64_t(TIMEBASE) * 86400 * 7; // One week; effectively infinite, but without overflow issues. + } + clips.emplace_back(clip); + } + return clips; +} + void MainWindow::report_disk_space(off_t free_bytes, double estimated_seconds_left) { char time_str[256]; diff --git a/futatabi/mainwindow.h b/futatabi/mainwindow.h index 592309a..1fbfb94 100644 --- a/futatabi/mainwindow.h +++ b/futatabi/mainwindow.h @@ -168,6 +168,7 @@ private: void playlist_selection_changed(); void clip_list_selection_changed(const QModelIndex ¤t, const QModelIndex &previous); + std::vector get_playlist(size_t start_row, size_t end_row); void resizeEvent(QResizeEvent *event) override; bool eventFilter(QObject *watched, QEvent *event) override; -- 2.39.2