From ac1f4741a43cd9ab6ff5ff5a6f6bd52f3995a121 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 16 Jan 2019 22:46:47 +0100 Subject: [PATCH] Add some controls for locking the master speed to 100%. --- futatabi/behringer_cmd_pl1.midimapping | 4 ++++ futatabi/futatabi_midi_mapping.proto | 4 ++++ futatabi/lock.svg | 18 ++++++++++++++++ futatabi/mainwindow.cpp | 29 ++++++++++++++++++++++---- futatabi/mainwindow.h | 2 ++ futatabi/mainwindow.qrc | 5 +++++ futatabi/mainwindow.ui | 27 +++++++++++++++++------- futatabi/midi_mapper.cpp | 5 +++++ futatabi/midi_mapper.h | 6 ++++++ meson.build | 1 + 10 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 futatabi/lock.svg create mode 100644 futatabi/mainwindow.qrc diff --git a/futatabi/behringer_cmd_pl1.midimapping b/futatabi/behringer_cmd_pl1.midimapping index 9b6e439..c2ff473 100644 --- a/futatabi/behringer_cmd_pl1.midimapping +++ b/futatabi/behringer_cmd_pl1.midimapping @@ -39,3 +39,7 @@ preview_enabled: { note_number: 27 } # The slider (pitch bend) is mapped to master speed. master_speed: { controller_number: 128 } + +# Master speed lock is mapped to lock. +toggle_lock: { note_number: 25 } +locked: { note_number: 25 } diff --git a/futatabi/futatabi_midi_mapping.proto b/futatabi/futatabi_midi_mapping.proto index c1415cd..0487b96 100644 --- a/futatabi/futatabi_midi_mapping.proto +++ b/futatabi/futatabi_midi_mapping.proto @@ -45,6 +45,10 @@ message MIDIMappingProto { optional int32 play_bank = 25; optional MIDILightProto play_enabled = 26; + optional MIDIButtonProto toggle_lock = 36; + optional int32 toggle_lock_bank = 37; + optional MIDILightProto locked = 38; + optional MIDIButtonProto cue_in = 27; optional int32 cue_in_bank = 28; optional MIDILightProto cue_in_enabled = 29; // In practice always true currently. diff --git a/futatabi/lock.svg b/futatabi/lock.svg new file mode 100644 index 0000000..c6d82e8 --- /dev/null +++ b/futatabi/lock.svg @@ -0,0 +1,18 @@ + + + + lock + https://www.gnu.org/licenses/gpl-3.0.txt + + + + + + + + + + + + + diff --git a/futatabi/mainwindow.cpp b/futatabi/mainwindow.cpp index c69f67a..77b1cfe 100644 --- a/futatabi/mainwindow.cpp +++ b/futatabi/mainwindow.cpp @@ -182,6 +182,7 @@ MainWindow::MainWindow() ui->stop_btn->setEnabled(false); connect(ui->speed_slider, &QAbstractSlider::valueChanged, this, &MainWindow::speed_slider_changed); + connect(ui->speed_lock_btn, &QPushButton::clicked, this, &MainWindow::speed_lock_clicked); connect(ui->playlist_duplicate_btn, &QPushButton::clicked, this, &MainWindow::playlist_duplicate); @@ -629,10 +630,18 @@ void MainWindow::stop_clicked() void MainWindow::speed_slider_changed(int percent) { float speed = percent / 100.0f; - ui->speed_label->setText(QString::fromStdString(to_string(percent) + "%")); + ui->speed_lock_btn->setText(QString::fromStdString(" " + to_string(percent) + "%")); live_player->set_master_speed(speed); } +void MainWindow::speed_lock_clicked() +{ + // TODO: Make for a less abrupt transition if we're not already at 100%. + ui->speed_slider->setValue(100); // Also actually sets the master speed and updates the label. + ui->speed_slider->setEnabled(!ui->speed_lock_btn->isChecked()); + midi_mapper.set_locked(ui->speed_lock_btn->isChecked()); +} + void MainWindow::live_player_done() { playlist_selection_changed(); @@ -1200,6 +1209,14 @@ void MainWindow::play() }); } +void MainWindow::toggle_lock() +{ + post_to_main_thread([this] { + ui->speed_lock_btn->setChecked(!ui->speed_lock_btn->isChecked()); + speed_lock_clicked(); + }); +} + void MainWindow::jog(int delta) { post_to_main_thread([this, delta] { @@ -1239,14 +1256,18 @@ void MainWindow::set_master_speed(float speed) speed = min(max(speed, 0.1f), 2.0f); post_to_main_thread([this, speed] { + if (ui->speed_lock_btn->isChecked()) { + return; + } + int percent = lrintf(speed * 100.0f); ui->speed_slider->blockSignals(true); ui->speed_slider->setValue(percent); ui->speed_slider->blockSignals(false); - ui->speed_label->setText(QString::fromStdString(to_string(percent) + "%")); - }); + ui->speed_lock_btn->setText(QString::fromStdString(" " + to_string(percent) + "%")); - live_player->set_master_speed(speed); + live_player->set_master_speed(speed); + }); } void MainWindow::cue_in() diff --git a/futatabi/mainwindow.h b/futatabi/mainwindow.h index c7d0ac7..469cb0e 100644 --- a/futatabi/mainwindow.h +++ b/futatabi/mainwindow.h @@ -43,6 +43,7 @@ public: void preview() override; void queue() override; void play() override; + void toggle_lock() override; void jog(int delta) override; void switch_camera(unsigned camera_idx) override; void set_master_speed(float speed) override; @@ -130,6 +131,7 @@ private: void play_clicked(); void stop_clicked(); void speed_slider_changed(int percent); + void speed_lock_clicked(); void live_player_done(); void live_player_clip_progress(const std::map &progress, double time_remaining); void set_output_status(const std::string &status); diff --git a/futatabi/mainwindow.qrc b/futatabi/mainwindow.qrc new file mode 100644 index 0000000..1efc65e --- /dev/null +++ b/futatabi/mainwindow.qrc @@ -0,0 +1,5 @@ + + + lock.svg + + diff --git a/futatabi/mainwindow.ui b/futatabi/mainwindow.ui index e0a4680..da05caf 100644 --- a/futatabi/mainwindow.ui +++ b/futatabi/mainwindow.ui @@ -142,6 +142,9 @@ + + false + 10 @@ -157,24 +160,32 @@ - + - + 0 0 - 40 + 72 0 - 100% + 100% - - Qt::AlignCenter + + + :/lock.svg + + + + true + + + true @@ -522,6 +533,8 @@
jpeg_frame_view.h
- + + + diff --git a/futatabi/midi_mapper.cpp b/futatabi/midi_mapper.cpp index 1e26985..d1cfea2 100644 --- a/futatabi/midi_mapper.cpp +++ b/futatabi/midi_mapper.cpp @@ -141,6 +141,8 @@ void MIDIMapper::note_on_received(int note) bind(&ControllerReceiver::queue, receiver)); match_button(note, MIDIMappingProto::kPlayFieldNumber, MIDIMappingProto::kPlayBankFieldNumber, bind(&ControllerReceiver::play, receiver)); + match_button(note, MIDIMappingProto::kToggleLockFieldNumber, MIDIMappingProto::kToggleLockBankFieldNumber, + bind(&ControllerReceiver::toggle_lock, receiver)); unsigned num_cameras = std::min(MAX_STREAMS, mapping_proto->camera_size()); for (unsigned camera_idx = 0; camera_idx < num_cameras; ++camera_idx) { @@ -228,6 +230,9 @@ void MIDIMapper::update_lights_lock_held() if (play_enabled_light) { activate_mapped_light(*mapping_proto, MIDIMappingProto::kPlayEnabledFieldNumber, &active_lights); } + if (locked_light) { + activate_mapped_light(*mapping_proto, MIDIMappingProto::kLockedFieldNumber, &active_lights); + } if (current_highlighted_camera >= 0 && current_highlighted_camera < mapping_proto->camera_size()) { const CameraMIDIMappingProto &camera = mapping_proto->camera(current_highlighted_camera); activate_mapped_light(camera, CameraMIDIMappingProto::kIsCurrentFieldNumber, &active_lights); diff --git a/futatabi/midi_mapper.h b/futatabi/midi_mapper.h index 0dd14ce..7b489ab 100644 --- a/futatabi/midi_mapper.h +++ b/futatabi/midi_mapper.h @@ -32,6 +32,7 @@ public: virtual void preview() = 0; virtual void queue() = 0; virtual void play() = 0; + virtual void toggle_lock() = 0; virtual void jog(int delta) = 0; virtual void switch_camera(unsigned camera_idx) = 0; virtual void set_master_speed(float speed) = 0; @@ -68,6 +69,10 @@ public: play_enabled_light = enabled; refresh_lights(); } + void set_locked(bool locked) { + locked_light = locked; + refresh_lights(); + } void highlight_camera_input(int stream_idx) { // -1 for none. current_highlighted_camera = stream_idx; refresh_lights(); @@ -99,6 +104,7 @@ private: std::atomic preview_enabled_light{false}; std::atomic queue_enabled_light{false}; std::atomic play_enabled_light{false}; + std::atomic locked_light{true}; std::atomic current_highlighted_camera{-1}; MIDIDevice midi_device; diff --git a/meson.build b/meson.build index e3e194c..c66d4a7 100644 --- a/meson.build +++ b/meson.build @@ -275,6 +275,7 @@ proto_generated = gen.process('futatabi/state.proto', 'futatabi/frame.proto', 'f moc_files = qt5.preprocess( moc_headers: ['futatabi/mainwindow.h', 'futatabi/jpeg_frame_view.h', 'futatabi/clip_list.h'], ui_files: ['futatabi/mainwindow.ui'], + qresources: ['futatabi/mainwindow.qrc'], dependencies: qt5deps) # Flow objects. -- 2.39.2