From 31da8e0a0f3f9ffe02c47af2ef4b6cb040893700 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 6 Jul 2018 16:07:01 +0100 Subject: [PATCH] many comfort features and fixed audio bug --- effects/transformeffect.cpp | 4 ++-- mainwindow.cpp | 14 +++++++++-- mainwindow.h | 4 ++++ mainwindow.ui | 20 +++++++++++++++- olive.pro.user | 2 +- panels/timeline.cpp | 8 +++++++ panels/timeline.h | 2 ++ playback/audio.cpp | 2 +- playback/cacher.cpp | 10 ++++++-- playback/playback.cpp | 2 +- ui/timelinewidget.cpp | 46 ++++++++++++++++++++----------------- 11 files changed, 83 insertions(+), 31 deletions(-) diff --git a/effects/transformeffect.cpp b/effects/transformeffect.cpp index 8240de467..316d1ebc1 100644 --- a/effects/transformeffect.cpp +++ b/effects/transformeffect.cpp @@ -35,11 +35,11 @@ TransformEffect::TransformEffect(Clip* c) : Effect(c) { ui_layout->addWidget(new QLabel("Scale:"), 1, 0); scale_x = new LabelSlider(); scale_x->set_minimum_value(0); - scale_x->set_maximum_value(1200); + scale_x->set_maximum_value(3000); ui_layout->addWidget(scale_x, 1, 1); scale_y = new LabelSlider(); scale_y->set_minimum_value(0); - scale_y->set_maximum_value(1200); + scale_y->set_maximum_value(3000); ui_layout->addWidget(scale_y, 1, 2); uniform_scale_box = new QCheckBox(); diff --git a/mainwindow.cpp b/mainwindow.cpp index 24f1afdf1..ca4f53b89 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -51,7 +51,7 @@ MainWindow::MainWindow(QWidget *parent) : qApp->setStyle(QStyleFactory::create("Fusion")); QPalette darkPalette; - darkPalette.setColor(QPalette::Window, QColor(53,53,53)); + darkPalette.setColor(QPalette::Window, QColor(53,53,53)); darkPalette.setColor(QPalette::WindowText, Qt::white); darkPalette.setColor(QPalette::Base, QColor(25,25,25)); darkPalette.setColor(QPalette::AlternateBase, QColor(53,53,53)); @@ -79,7 +79,6 @@ MainWindow::MainWindow(QWidget *parent) : ui->centralWidget->setMaximumSize(0, 0); setDockNestingEnabled(true); - // TODO maybe replace these with non-pointers later on? panel_project = new Project(this); panel_effect_controls = new EffectControls(this); @@ -495,6 +494,8 @@ void MainWindow::on_actionNon_Drop_Frame_triggered() void MainWindow::toolMenu_About_To_Be_Shown() { ui->actionEdit_Tool_Also_Seeks->setChecked(panel_timeline->edit_tool_also_seeks); ui->actionEdit_Tool_Selects_Links->setChecked(panel_timeline->edit_tool_selects_links); + ui->actionSelecting_Also_Seeks->setChecked(panel_timeline->select_also_seeks); + ui->actionSeek_to_the_End_of_Pastes->setChecked(panel_timeline->paste_seeks); } void MainWindow::on_actionEdit_Tool_Selects_Links_triggered() { @@ -510,3 +511,12 @@ void MainWindow::on_actionDuplicate_triggered() { panel_project->duplicate_selected(); } } + +void MainWindow::on_actionSelecting_Also_Seeks_triggered() { + panel_timeline->select_also_seeks = !panel_timeline->select_also_seeks; +} + +void MainWindow::on_actionSeek_to_the_End_of_Pastes_triggered() +{ + panel_timeline->paste_seeks = !panel_timeline->paste_seeks; +} diff --git a/mainwindow.h b/mainwindow.h index 2f2f7d7b5..18786aded 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -131,6 +131,10 @@ private slots: void on_actionDuplicate_triggered(); + void on_actionSelecting_Also_Seeks_triggered(); + + void on_actionSeek_to_the_End_of_Pastes_triggered(); + private: Ui::MainWindow *ui; void setup_layout(); diff --git a/mainwindow.ui b/mainwindow.ui index ddda3d263..8a314f4c2 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -24,7 +24,7 @@ 0 0 653 - 29 + 17 @@ -126,8 +126,10 @@ + + @@ -538,6 +540,22 @@ Ctrl+D + + + true + + + Selecting Also Seeks + + + + + true + + + Seek to the End of Pastes + + diff --git a/olive.pro.user b/olive.pro.user index 347b468fa..a653d1720 100644 --- a/olive.pro.user +++ b/olive.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/panels/timeline.cpp b/panels/timeline.cpp index b2376fdd8..26d467f65 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -34,6 +34,8 @@ Timeline::Timeline(QWidget *parent) : rect_select_proc = false; edit_tool_selects_links = false; edit_tool_also_seeks = false; + select_also_seeks = false; + paste_seeks = true; snapping = true; last_frame = 0; playhead = 0; @@ -623,12 +625,14 @@ void Timeline::paste() { } delete_areas_and_relink(delete_areas); + long paste_end = 0; QVector added_clips; for (int i=0;icopy(); cc->timeline_in += playhead; cc->timeline_out += playhead; + if (cc->timeline_out > paste_end) paste_end = cc->timeline_out; cc->sequence = sequence; added_clips.append(cc); sequence->add_clip(cc); @@ -637,6 +641,10 @@ void Timeline::paste() { relink_clips_using_ids(clip_clipboard, added_clips); redraw_all_clips(true); + + if (paste_seeks) { + seek(paste_end); + } } } diff --git a/panels/timeline.h b/panels/timeline.h index d1e1eed2a..16e0d02e9 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -101,8 +101,10 @@ public: QTimer playback_updater; // shared information + bool select_also_seeks; bool edit_tool_selects_links; bool edit_tool_also_seeks; + bool paste_seeks; int tool; long cursor_frame; int cursor_track; diff --git a/playback/audio.cpp b/playback/audio.cpp index 56057782f..3d6373096 100644 --- a/playback/audio.cpp +++ b/playback/audio.cpp @@ -56,7 +56,7 @@ void clear_audio_ibuffer() { int get_buffer_offset_from_frame(long frame) { if (frame >= audio_ibuffer_frame) { - return av_samples_get_buffer_size(NULL, av_get_channel_layout_nb_channels(sequence->audio_layout), ((frame-audio_ibuffer_frame)/sequence->frame_rate)*sequence->audio_frequency, AV_SAMPLE_FMT_S16, 1); + return av_samples_get_buffer_size(NULL, av_get_channel_layout_nb_channels(sequence->audio_layout), qRound(((frame-audio_ibuffer_frame)/sequence->frame_rate)*sequence->audio_frequency), AV_SAMPLE_FMT_S16, 1); } else { qDebug() << "[WARNING] get_buffer_offset_from_frame called incorrectly"; return 0; diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 8b81e991e..f85b9e59b 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -36,10 +36,9 @@ void cache_audio_worker(Clip* c) { c->need_new_audio_frame = false; if (c->audio_just_reset) { // get precise sample offset for the elected clip_in from this audio frame - float target_sts = 0; if (c->audio_target_frame < c->timeline_in) { - target_sts = playhead_to_seconds(c, c->clip_in); + target_sts = clip_frame_to_seconds(c, c->clip_in); } else { target_sts = playhead_to_seconds(c, c->audio_target_frame); } @@ -82,6 +81,13 @@ void cache_audio_worker(Clip* c) { retrieve_next_frame_raw_data(c, frame); nb_bytes = av_samples_get_buffer_size(NULL, frame->channels, frame->nb_samples, static_cast(frame->format), 1); c->frame_sample_index -= nb_bytes; + + // code DISGUSTINGLY copy/pasted from above + int offset = audio_ibuffer_read - c->audio_buffer_write; + if (offset > 0) { + c->audio_buffer_write += offset; + c->frame_sample_index += offset; + } } while (c->frame_sample_index < nb_bytes) { if (c->audio_buffer_write >= audio_ibuffer_read+half_buffer || c->audio_buffer_write >= get_buffer_offset_from_frame(c->timeline_out)) { diff --git a/playback/playback.cpp b/playback/playback.cpp index cc0807d8d..998f84173 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -175,7 +175,7 @@ void get_clip_frame(Clip* c, long playhead) { float playhead_to_seconds(Clip* c, long playhead) { // returns time in seconds - return (std::max((long) 0, playhead - c->timeline_in) + c->clip_in)/c->sequence->frame_rate; + return (qMax((long) 0, playhead - c->timeline_in) + c->clip_in)/c->sequence->frame_rate; } long seconds_to_clip_frame(Clip* c, float seconds) { diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 077476abe..5918e5930 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -224,6 +224,10 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { if (clip != NULL) { panel_timeline->selections.append({clip->timeline_in, clip->timeline_out, clip->track}); + if (panel_timeline->select_also_seeks) { + panel_timeline->seek(clip->timeline_in); + } + // if alt is not down, select links if (!(event->modifiers() & Qt::AltModifier)) { for (int i=0;ilinked.size();i++) { @@ -440,7 +444,7 @@ void TimelineWidget::init_ghosts() { g.old_in = g.in; g.old_out = g.out; g.old_track = g.track; - g.old_clip_in = g.clip_in; + g.old_clip_in = g.clip_in; if (panel_timeline->trim_target > -1 || panel_timeline->tool == TIMELINE_TOOL_SLIP) { // used for trim ops @@ -567,30 +571,30 @@ void TimelineWidget::update_ghosts(QPoint& mouse_pos) { } validate_snapping(g, &frame_diff); - } + } - // resize ghosts - for (int i=0;ighosts.size();i++) { - Ghost& g = panel_timeline->ghosts[i]; + // resize ghosts + for (int i=0;ighosts.size();i++) { + Ghost& g = panel_timeline->ghosts[i]; - if (panel_timeline->trim_in) { - g.in = g.old_in + frame_diff; - g.clip_in = g.old_clip_in + frame_diff; - } else { - g.out = g.old_out + frame_diff; - } - } + if (panel_timeline->trim_in) { + g.in = g.old_in + frame_diff; + g.clip_in = g.old_clip_in + frame_diff; + } else { + g.out = g.old_out + frame_diff; + } + } - // resize selections - for (int i=0;iselections.size();i++) { - Selection& s = panel_timeline->selections[i]; + // resize selections + for (int i=0;iselections.size();i++) { + Selection& s = panel_timeline->selections[i]; - if (panel_timeline->trim_in) { - s.in = s.old_in + frame_diff; - } else { - s.out = s.old_out + frame_diff; - } - } + if (panel_timeline->trim_in) { + s.in = s.old_in + frame_diff; + } else { + s.out = s.old_out + frame_diff; + } + } } else if (panel_timeline->tool == TIMELINE_TOOL_POINTER || panel_timeline->importing) { // only move clips on pointer (not ripple or rolling) // validate ghosts for (int i=0;ighosts.size();i++) {