]> git.sesse.net Git - nageru/commitdiff
Split cue padding into separate in and out settings.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 29 Jan 2019 20:29:21 +0000 (21:29 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 29 Jan 2019 20:29:43 +0000 (21:29 +0100)
futatabi/flags.cpp
futatabi/flags.h
futatabi/mainwindow.cpp
futatabi/mainwindow.h
futatabi/mainwindow.ui
futatabi/state.proto

index c5bc722f5c6fa2eaeb3eecaf24a981da004cf2e8..fa1fe6ec5878177a56472bd449ae343985b7a097 100644 (file)
@@ -17,8 +17,9 @@ enum LongOption {
        OPTION_SLOW_DOWN_INPUT = 1001,
        OPTION_HTTP_PORT = 1002,
        OPTION_TALLY_URL = 1003,
-       OPTION_CUE_POINT_PADDING = 1004,
-       OPTION_MIDI_MAPPING = 1005
+       OPTION_CUE_IN_POINT_PADDING = 1004,
+       OPTION_CUE_OUT_POINT_PADDING = 1005,
+       OPTION_MIDI_MAPPING = 1006
 };
 
 void usage()
@@ -37,7 +38,8 @@ void usage()
        fprintf(stderr, "                                  2 = default (realtime 720p on fast embedded GPUs)\n");
        fprintf(stderr, "                                  3 = good (realtime 720p on GTX 970 or so)\n");
        fprintf(stderr, "                                  4 = best (not realtime on any current GPU)\n");
-       fprintf(stderr, "      --cue-point-padding SECS    move cue-in/cue-out N seconds earlier/later on set\n");
+       fprintf(stderr, "      --cue-in-point-padding SECS   move cue-in N seconds earlier on set\n");
+       fprintf(stderr, "      --cue-out-point-padding SECS  move cue-out N seconds later on set\n");
        fprintf(stderr, "  -d, --working-directory DIR     where to store frames and database\n");
        fprintf(stderr, "      --http-port PORT            which port to listen on for output\n");
        fprintf(stderr, "      --tally-url URL             URL to get tally color from (polled every 100 ms)\n");
@@ -56,7 +58,8 @@ void parse_flags(int argc, char *const argv[])
                { "working-directory", required_argument, 0, 'd' },
                { "http-port", required_argument, 0, OPTION_HTTP_PORT },
                { "tally-url", required_argument, 0, OPTION_TALLY_URL },
-               { "cue-point-padding", required_argument, 0, OPTION_CUE_POINT_PADDING },
+               { "cue-in-point-padding", required_argument, 0, OPTION_CUE_IN_POINT_PADDING },
+               { "cue-out-point-padding", required_argument, 0, OPTION_CUE_OUT_POINT_PADDING },
                { "midi-mapping", required_argument, 0, OPTION_MIDI_MAPPING },
                { 0, 0, 0, 0 }
        };
@@ -102,9 +105,13 @@ void parse_flags(int argc, char *const argv[])
                case OPTION_TALLY_URL:
                        global_flags.tally_url = optarg;
                        break;
-               case OPTION_CUE_POINT_PADDING:
-                       global_flags.cue_point_padding_seconds = atof(optarg);
-                       global_flags.cue_point_padding_set = true;
+               case OPTION_CUE_IN_POINT_PADDING:
+                       global_flags.cue_in_point_padding_seconds = atof(optarg);
+                       global_flags.cue_in_point_padding_set = true;
+                       break;
+               case OPTION_CUE_OUT_POINT_PADDING:
+                       global_flags.cue_out_point_padding_seconds = atof(optarg);
+                       global_flags.cue_out_point_padding_set = true;
                        break;
                case OPTION_MIDI_MAPPING:
                        global_flags.midi_mapping_filename = optarg;
@@ -125,7 +132,8 @@ void parse_flags(int argc, char *const argv[])
                usage();
                exit(1);
        }
-       if (global_flags.cue_point_padding_seconds < 0.0) {
+       if (global_flags.cue_in_point_padding_seconds < 0.0 ||
+           global_flags.cue_out_point_padding_seconds < 0.0) {
                fprintf(stderr, "Cue point padding cannot be negative.\n");
                usage();
                exit(1);
index 4252235872299fd591e57677409daabf952b47ea..88379b539ef7a4174489f57b56652de814268a26 100644 (file)
@@ -15,8 +15,10 @@ struct Flags {
        uint16_t http_port = DEFAULT_HTTPD_PORT;
        double output_framerate = 60000.0 / 1001.0;
        std::string tally_url;
-       double cue_point_padding_seconds = 0.0;  // Can be changed in the menus.
-       bool cue_point_padding_set = false;
+       double cue_in_point_padding_seconds = 0.0;  // Can be changed in the menus.
+       bool cue_in_point_padding_set = false;
+       double cue_out_point_padding_seconds = 0.0;  // Can be changed in the menus.
+       bool cue_out_point_padding_set = false;
        std::string midi_mapping_filename;  // Empty for none.
 };
 extern Flags global_flags;
index 84b855a931335c16c16af897c3ca1a33dafac028..a5592930e2a3217df0b980db3d65165a362c4781 100644 (file)
@@ -65,8 +65,11 @@ MainWindow::MainWindow()
                        global_flags.interpolation_quality = settings.interpolation_quality() - 1;
                }
        }
-       if (!global_flags.cue_point_padding_set) {
-               global_flags.cue_point_padding_seconds = settings.cue_point_padding_seconds();  // Default 0 is fine.
+       if (!global_flags.cue_in_point_padding_set) {
+               global_flags.cue_in_point_padding_seconds = settings.cue_in_point_padding_seconds();  // Default 0 is fine.
+       }
+       if (!global_flags.cue_out_point_padding_set) {
+               global_flags.cue_out_point_padding_seconds = settings.cue_out_point_padding_seconds();  // Default 0 is fine.
        }
        if (global_flags.interpolation_quality == 0) {
                // Allocate something just for simplicity; we won't be using it
@@ -115,27 +118,49 @@ MainWindow::MainWindow()
        connect(ui->quality_3_action, &QAction::toggled, bind(&MainWindow::quality_toggled, this, 3, _1));
        connect(ui->quality_4_action, &QAction::toggled, bind(&MainWindow::quality_toggled, this, 4, _1));
 
-       // The cue point padding group.
-       QActionGroup *padding_group = new QActionGroup(ui->interpolation_menu);
-       padding_group->addAction(ui->padding_0_action);
-       padding_group->addAction(ui->padding_1_action);
-       padding_group->addAction(ui->padding_2_action);
-       padding_group->addAction(ui->padding_5_action);
-       if (global_flags.cue_point_padding_seconds <= 1e-3) {
-               ui->padding_0_action->setChecked(true);
-       } else if (fabs(global_flags.cue_point_padding_seconds - 1.0) < 1e-3) {
-               ui->padding_1_action->setChecked(true);
-       } else if (fabs(global_flags.cue_point_padding_seconds - 2.0) < 1e-3) {
-               ui->padding_2_action->setChecked(true);
-       } else if (fabs(global_flags.cue_point_padding_seconds - 5.0) < 1e-3) {
-               ui->padding_5_action->setChecked(true);
+       // The cue-in point padding group.
+       QActionGroup *in_padding_group = new QActionGroup(ui->in_padding_menu);
+       in_padding_group->addAction(ui->in_padding_0_action);
+       in_padding_group->addAction(ui->in_padding_1_action);
+       in_padding_group->addAction(ui->in_padding_2_action);
+       in_padding_group->addAction(ui->in_padding_5_action);
+       if (global_flags.cue_in_point_padding_seconds <= 1e-3) {
+               ui->in_padding_0_action->setChecked(true);
+       } else if (fabs(global_flags.cue_in_point_padding_seconds - 1.0) < 1e-3) {
+               ui->in_padding_1_action->setChecked(true);
+       } else if (fabs(global_flags.cue_in_point_padding_seconds - 2.0) < 1e-3) {
+               ui->in_padding_2_action->setChecked(true);
+       } else if (fabs(global_flags.cue_in_point_padding_seconds - 5.0) < 1e-3) {
+               ui->in_padding_5_action->setChecked(true);
+       } else {
+               // Nothing to check, which is fine.
+       }
+       connect(ui->in_padding_0_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 0.0, _1));
+       connect(ui->in_padding_1_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 1.0, _1));
+       connect(ui->in_padding_2_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 2.0, _1));
+       connect(ui->in_padding_5_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 5.0, _1));
+
+       // Same for the cue-out padding.
+       QActionGroup *out_padding_group = new QActionGroup(ui->out_padding_menu);
+       out_padding_group->addAction(ui->out_padding_0_action);
+       out_padding_group->addAction(ui->out_padding_1_action);
+       out_padding_group->addAction(ui->out_padding_2_action);
+       out_padding_group->addAction(ui->out_padding_5_action);
+       if (global_flags.cue_out_point_padding_seconds <= 1e-3) {
+               ui->out_padding_0_action->setChecked(true);
+       } else if (fabs(global_flags.cue_out_point_padding_seconds - 1.0) < 1e-3) {
+               ui->out_padding_1_action->setChecked(true);
+       } else if (fabs(global_flags.cue_out_point_padding_seconds - 2.0) < 1e-3) {
+               ui->out_padding_2_action->setChecked(true);
+       } else if (fabs(global_flags.cue_out_point_padding_seconds - 5.0) < 1e-3) {
+               ui->out_padding_5_action->setChecked(true);
        } else {
                // Nothing to check, which is fine.
        }
-       connect(ui->padding_0_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 0.0, _1));
-       connect(ui->padding_1_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 1.0, _1));
-       connect(ui->padding_2_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 2.0, _1));
-       connect(ui->padding_5_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 5.0, _1));
+       connect(ui->out_padding_0_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 0.0, _1));
+       connect(ui->out_padding_1_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 1.0, _1));
+       connect(ui->out_padding_2_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 2.0, _1));
+       connect(ui->out_padding_5_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 5.0, _1));
 
        global_disk_space_estimator = new DiskSpaceEstimator(bind(&MainWindow::report_disk_space, this, _1, _2));
        disk_free_label = new QLabel(this);
@@ -324,7 +349,7 @@ void MainWindow::cue_in_clicked()
                cliplist_clips->mutable_back()->pts_in = current_pts;
        } else {
                Clip clip;
-               clip.pts_in = max<int64_t>(current_pts - lrint(global_flags.cue_point_padding_seconds * TIMEBASE), 0);
+               clip.pts_in = max<int64_t>(current_pts - lrint(global_flags.cue_in_point_padding_seconds * TIMEBASE), 0);
                cliplist_clips->add_clip(clip);
                playlist_selection_changed();
        }
@@ -343,7 +368,7 @@ void MainWindow::cue_out_clicked()
                return;
        }
 
-       cliplist_clips->mutable_back()->pts_out = current_pts + lrint(global_flags.cue_point_padding_seconds * TIMEBASE);
+       cliplist_clips->mutable_back()->pts_out = current_pts + lrint(global_flags.cue_out_point_padding_seconds * TIMEBASE);
 
        // Select the item so that we can jog it.
        ui->clip_list->setFocus();
@@ -609,7 +634,8 @@ void MainWindow::save_settings()
 {
        SettingsProto settings;
        settings.set_interpolation_quality(global_flags.interpolation_quality + 1);
-       settings.set_cue_point_padding_seconds(global_flags.cue_point_padding_seconds);
+       settings.set_cue_in_point_padding_seconds(global_flags.cue_in_point_padding_seconds);
+       settings.set_cue_out_point_padding_seconds(global_flags.cue_out_point_padding_seconds);
        db.store_settings(settings);
 }
 
@@ -1130,12 +1156,21 @@ void MainWindow::quality_toggled(int quality, bool checked)
        save_settings();
 }
 
-void MainWindow::padding_toggled(double seconds, bool checked)
+void MainWindow::in_padding_toggled(double seconds, bool checked)
+{
+       if (!checked) {
+               return;
+       }
+       global_flags.cue_in_point_padding_seconds = seconds;
+       save_settings();
+}
+
+void MainWindow::out_padding_toggled(double seconds, bool checked)
 {
        if (!checked) {
                return;
        }
-       global_flags.cue_point_padding_seconds = seconds;
+       global_flags.cue_out_point_padding_seconds = seconds;
        save_settings();
 }
 
index 5fd09542a5a5d5e2ef5c87e69fe69a0d630c2ad5..2eeacc3c0ff31e4a521a68e4e4382b00ea60c88c 100644 (file)
@@ -177,7 +177,8 @@ private:
        void undo_triggered();
        void redo_triggered();
        void quality_toggled(int quality, bool checked);
-       void padding_toggled(double seconds, bool checked);
+       void in_padding_toggled(double seconds, bool checked);
+       void out_padding_toggled(double seconds, bool checked);
 
        void highlight_camera_input(int stream_idx);
        void enable_or_disable_preview_button();
index addfbe2856c5beb5c2f93cdd61832c87e996efe1..c94b58c8d20ab11a0eab9f7f139bd92365266c33 100644 (file)
      <addaction name="quality_3_action"/>
      <addaction name="quality_4_action"/>
     </widget>
-    <widget class="QMenu" name="padding_menu">
+    <widget class="QMenu" name="in_padding_menu">
      <property name="title">
-      <string>Cue point &amp;padding</string>
+      <string>Cue &amp;in point padding</string>
      </property>
-     <addaction name="padding_0_action"/>
-     <addaction name="padding_1_action"/>
-     <addaction name="padding_2_action"/>
-     <addaction name="padding_5_action"/>
+     <addaction name="in_padding_0_action"/>
+     <addaction name="in_padding_1_action"/>
+     <addaction name="in_padding_2_action"/>
+     <addaction name="in_padding_5_action"/>
+    </widget>
+    <widget class="QMenu" name="out_padding_menu">
+     <property name="title">
+      <string>Cue &amp;out point padding</string>
+     </property>
+     <addaction name="out_padding_0_action"/>
+     <addaction name="out_padding_1_action"/>
+     <addaction name="out_padding_2_action"/>
+     <addaction name="out_padding_5_action"/>
     </widget>
     <addaction name="interpolation_menu"/>
-    <addaction name="padding_menu"/>
+    <addaction name="in_padding_menu"/>
+    <addaction name="out_padding_menu"/>
     <addaction name="menu_Export"/>
     <addaction name="midi_mapping_action"/>
     <addaction name="exit_action"/>
     <string>Best (&amp;4) (not realtime on any current GPU)</string>
    </property>
   </action>
-  <action name="padding_0_action">
+  <action name="in_padding_0_action">
    <property name="checkable">
     <bool>true</bool>
    </property>
     <string>&amp;0 seconds</string>
    </property>
   </action>
-  <action name="padding_1_action">
+  <action name="in_padding_1_action">
    <property name="checkable">
     <bool>true</bool>
    </property>
     <string>&amp;1 second</string>
    </property>
   </action>
-  <action name="padding_2_action">
+  <action name="in_padding_2_action">
    <property name="checkable">
     <bool>true</bool>
    </property>
     <string>&amp;2 seconds</string>
    </property>
   </action>
-  <action name="padding_5_action">
+  <action name="in_padding_5_action">
    <property name="checkable">
     <bool>true</bool>
    </property>
     <string>Setup MIDI controller…</string>
    </property>
   </action>
+  <action name="out_padding_0_action">
+   <property name="text">
+    <string>&amp;0 seconds</string>
+   </property>
+  </action>
+  <action name="out_padding_1_action">
+   <property name="text">
+    <string>&amp;1 seconds</string>
+   </property>
+  </action>
+  <action name="out_padding_2_action">
+   <property name="text">
+    <string>&amp;2 seconds</string>
+   </property>
+  </action>
+  <action name="out_padding_5_action">
+   <property name="text">
+    <string>&amp;5 seconds</string>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
index 36a9fa0e896d92370ca781c141412fed07e140b3..ea996b7655e8678cc241100d63435713e7002973 100644 (file)
@@ -21,5 +21,6 @@ message StateProto {
 
 message SettingsProto {
        int32 interpolation_quality = 1;  // 0 = unset, 1 = quality 0, 2 = quality 1, etc.
-       double cue_point_padding_seconds = 2;
+       double cue_in_point_padding_seconds = 2;
+       double cue_out_point_padding_seconds = 3;
 }