global_mixer->set_frame_ready_callback(output, [this]{
QMetaObject::invokeMethod(this, "update", Qt::AutoConnection);
emit transition_names_updated(global_mixer->get_transition_names());
+ emit resolution_updated(output);
});
glDisable(GL_BLEND);
signals:
void clicked();
void transition_names_updated(std::vector<std::string> transition_names);
+ void resolution_updated(Mixer::Output output);
private:
Mixer::Output output;
transition_btn3 = ui->transition_btn3;
qRegisterMetaType<std::vector<std::string>>("std::vector<std::string>");
connect(ui->me_preview, &GLWidget::transition_names_updated, this, &MainWindow::set_transition_names);
+ qRegisterMetaType<Mixer::Output>("Mixer::Output");
}
void MainWindow::resizeEvent(QResizeEvent* event)
// Hook up the click.
connect(ui_display->display, &GLWidget::clicked, bind(&MainWindow::channel_clicked, this, i));
+ // Let the theme update the text whenever the resolution changed.
+ connect(ui_display->display, &GLWidget::resolution_updated, this, &MainWindow::update_channel_name);
+
// Hook up the keyboard key.
QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_1 + i), this);
connect(shortcut, &QShortcut::activated, bind(&MainWindow::channel_clicked, this, i));
}
}
+void MainWindow::update_channel_name(Mixer::Output output)
+{
+ if (output >= Mixer::OUTPUT_INPUT0) {
+ unsigned channel = output - Mixer::OUTPUT_INPUT0;
+ previews[channel]->label->setText(global_mixer->get_channel_name(output).c_str());
+ }
+}
+
void MainWindow::transition_clicked(int transition_number)
{
global_mixer->transition_clicked(transition_number);
#include <vector>
#include <sys/time.h>
+#include "mixer.h"
+
class GLWidget;
class QResizeEvent;
class MainWindow;
} // namespace Ui
-class Mixer;
class QPushButton;
class MainWindow : public QMainWindow
void channel_clicked(int channel_number);
void wb_button_clicked(int channel_number);
void set_transition_names(std::vector<std::string> transition_names);
+ void update_channel_name(Mixer::Output output);
void cutoff_knob_changed(int value);
void limiter_threshold_knob_changed(int value);
void compressor_threshold_knob_changed(int value);
-- to the next.
local FADE_SIGNAL_NUM = 4
+-- Last width/height/resolution for each channel, if we have it.
+local last_resolution = {}
+
-- Utility function to help creating many similar chains that can differ
-- in a free set of chosen parameters.
function make_cartesian_product(parms, callback)
return 4
end
+-- Helper function to write e.g. ā720pā.
+function get_channel_resolution(signal_num)
+ if last_resolution[signal_num] then
+ if last_resolution[signal_num].height == 0 or
+ last_resolution[signal_num].height == 525 then
+ return "no signal"
+ elseif last_resolution[signal_num].interlaced then
+ return (last_resolution[signal_num].height * 2) .. "i"
+ else
+ return last_resolution[signal_num].height .. "p"
+ end
+ else
+ return "no signal"
+ end
+end
+
-- Returns the name for each additional channel (starting from 2).
--- Called only once for each channel, at the start of the program.
+-- Called at the start of the program, and then each frame for live
+-- channels in case they change resolution.
function channel_name(channel)
if channel == 2 then
- return "Input 1"
+ return "Input 1 (" .. get_channel_resolution(0) .. ")"
elseif channel == 3 then
- return "Input 2"
+ return "Input 2 (" .. get_channel_resolution(1) .. ")"
elseif channel == 4 then
return "Side-by-side"
elseif channel == 5 then
-- NOTE: The chain returned must be finalized with the Y'CbCr flag
-- if and only if num==0.
function get_chain(num, t, width, height, signals)
+ for signal_num=0,1 do
+ last_resolution[signal_num] = {
+ width = signals:get_width(signal_num),
+ height = signals:get_height(signal_num),
+ interlaced = signals:get_interlaced(signal_num)
+ }
+ end
+
if num == 0 then -- Live.
if live_signal_num == INPUT0_SIGNAL_NUM or live_signal_num == INPUT1_SIGNAL_NUM then -- Plain input.
local input_type = get_input_type(signals, live_signal_num)