📄 gui_main.cpp
字号:
"toggled",
GTK_SIGNAL_FUNC(on_record_enabled_button),
NULL);
gtk_widget_show(record_enabled_button);
// create second row
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
// settings summary
record_settings_label = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(record_settings_label), 0.0, 0.5);
gtk_widget_show(record_settings_label);
gtk_box_pack_start(GTK_BOX(hbox), record_settings_label, TRUE, TRUE, 0);
// settings button
record_settings_button = gtk_button_new_with_label(" Settings... ");
gtk_box_pack_start(GTK_BOX(hbox), record_settings_button, FALSE, FALSE, 5);
gtk_signal_connect(GTK_OBJECT(record_settings_button),
"clicked",
GTK_SIGNAL_FUNC(on_record_settings_button),
NULL);
gtk_widget_show(record_settings_button);
// finalize
gtk_container_add(GTK_CONTAINER(frame), vbox);
gtk_widget_show(frame);
}
static void LayoutTransmitFrame(GtkWidget* box)
{
GtkWidget *frame;
GtkWidget *vbox, *hbox;
frame = gtk_frame_new("Transmission");
gtk_frame_set_label_align(GTK_FRAME(frame), frameLabelAlignment, 0);
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 5);
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
// create first row, homogenous
hbox = gtk_hbox_new(TRUE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
// enabled button
transmit_enabled_button = gtk_check_button_new_with_label("Enabled");
gtk_box_pack_start(GTK_BOX(hbox), transmit_enabled_button, TRUE, TRUE, 5);
gtk_signal_connect(GTK_OBJECT(transmit_enabled_button),
"toggled",
GTK_SIGNAL_FUNC(on_transmit_enabled_button),
NULL);
gtk_widget_show(transmit_enabled_button);
// create second row
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
// settings summary
transmit_settings_label = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(transmit_settings_label), 0.0, 0.5);
gtk_widget_show(transmit_settings_label);
gtk_box_pack_start(GTK_BOX(hbox), transmit_settings_label, TRUE, TRUE, 0);
// settings button
transmit_settings_button = gtk_button_new_with_label(" Settings... ");
gtk_box_pack_start(GTK_BOX(hbox),
transmit_settings_button, FALSE, FALSE, 5);
gtk_signal_connect(GTK_OBJECT(transmit_settings_button),
"clicked",
GTK_SIGNAL_FUNC(on_transmit_settings_button),
NULL);
gtk_widget_show(transmit_settings_button);
// finalize
gtk_container_add(GTK_CONTAINER(frame), vbox);
gtk_widget_show(frame);
}
// Control frame
void LayoutControlFrame(GtkWidget* box)
{
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *separator;
GtkObject* adjustment;
frame = gtk_frame_new("Control");
gtk_frame_set_label_align(GTK_FRAME(frame), frameLabelAlignment, 0);
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_end(GTK_BOX(box), frame, FALSE, FALSE, 5);
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
gtk_container_add(GTK_CONTAINER(frame), vbox);
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
label = gtk_label_new(" Duration:");
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
adjustment = gtk_adjustment_new(
MyConfig->GetIntegerValue(CONFIG_APP_DURATION),
1, 24 * 60 * 60, 1, 0, 0);
duration_spinner = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), 1, 0);
gtk_signal_connect(GTK_OBJECT(duration_spinner),
"changed",
GTK_SIGNAL_FUNC(on_duration_changed),
GTK_OBJECT(duration_spinner));
gtk_widget_show(duration_spinner);
gtk_box_pack_start(GTK_BOX(hbox), duration_spinner, FALSE, FALSE, 5);
durationUnitsIndex = 0; // temporary
duration_units_menu = CreateOptionMenu(NULL,
durationUnitsNames,
sizeof(durationUnitsNames) / sizeof(char*),
durationUnitsIndex,
GTK_SIGNAL_FUNC(on_duration_units_menu_activate));
gtk_box_pack_start(GTK_BOX(hbox), duration_units_menu, FALSE, FALSE, 5);
// vertical separator
separator = gtk_vseparator_new();
gtk_widget_show(separator);
gtk_box_pack_start(GTK_BOX(hbox), separator, FALSE, FALSE, 0);
start_button = gtk_button_new();
start_button_label = gtk_label_new(" Start ");
gtk_misc_set_alignment(GTK_MISC(start_button_label), 0.5, 0.5);
gtk_container_add(GTK_CONTAINER(start_button), start_button_label);
gtk_widget_show(start_button_label);
gtk_box_pack_start(GTK_BOX(hbox), start_button, TRUE, TRUE, 5);
gtk_signal_connect(GTK_OBJECT(start_button),
"clicked",
GTK_SIGNAL_FUNC(on_start_button),
NULL);
gtk_widget_show(start_button);
// separator
separator = gtk_hseparator_new();
gtk_widget_show(separator);
gtk_box_pack_start(GTK_BOX(vbox), separator, TRUE, TRUE, 0);
// second row
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
label = gtk_label_new(" Configuration File:");
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
config_file_entry = gtk_entry_new_with_max_length(256);
gtk_entry_set_text(GTK_ENTRY(config_file_entry),
MyConfig->GetFileName());
gtk_widget_show(config_file_entry);
gtk_box_pack_start(GTK_BOX(hbox), config_file_entry, TRUE, TRUE, 5);
// config file load button
load_config_button = gtk_button_new_with_label(" Load... ");
gtk_signal_connect(GTK_OBJECT(load_config_button),
"clicked",
GTK_SIGNAL_FUNC(on_load_config_button),
NULL);
gtk_widget_show(load_config_button);
gtk_box_pack_start(GTK_BOX(hbox), load_config_button, FALSE, FALSE, 5);
// config file save button
save_config_button = gtk_button_new_with_label(" Save ");
gtk_signal_connect(GTK_OBJECT(save_config_button),
"clicked",
GTK_SIGNAL_FUNC(on_save_config_button),
NULL);
gtk_widget_show(save_config_button);
gtk_box_pack_start(GTK_BOX(hbox), save_config_button, FALSE, FALSE, 5);
gtk_widget_show(frame); // show control frame
}
// Status frame
void LayoutStatusFrame(GtkWidget* box)
{
GtkWidget *frame;
GtkWidget *frame_vbox;
GtkWidget *vbox, *hbox;
GtkWidget *separator;
frame = gtk_frame_new("Status");
gtk_frame_set_label_align(GTK_FRAME(frame), frameLabelAlignment, 0);
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_end(GTK_BOX(box), frame, FALSE, FALSE, 5);
// frame vbox
frame_vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(frame_vbox);
gtk_container_add(GTK_CONTAINER(frame), frame_vbox);
// first row
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(frame_vbox), hbox, FALSE, FALSE, 2);
media_source_label = gtk_label_new(" Source:");
gtk_misc_set_alignment(GTK_MISC(media_source_label), 0.0, 0.5);
gtk_widget_show(media_source_label);
gtk_box_pack_start(GTK_BOX(hbox), media_source_label, TRUE, TRUE, 5);
media_source = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(media_source), 1.0, 0.5);
gtk_widget_show(media_source);
gtk_box_pack_start(GTK_BOX(hbox), media_source, TRUE, TRUE, 5);
// separator
separator = gtk_hseparator_new();
gtk_widget_show(separator);
gtk_box_pack_start(GTK_BOX(frame_vbox), separator, TRUE, TRUE, 0);
// second row
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(frame_vbox), hbox, FALSE, FALSE, 2);
// vbox for time labels
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5);
start_time_label = gtk_label_new(" Start Time:");
gtk_misc_set_alignment(GTK_MISC(start_time_label), 0.0, 0.5);
gtk_widget_show(start_time_label);
gtk_box_pack_start(GTK_BOX(vbox), start_time_label, TRUE, TRUE, 0);
duration_label = gtk_label_new(" Current Duration:");
gtk_misc_set_alignment(GTK_MISC(duration_label), 0.0, 0.5);
gtk_widget_show(duration_label);
gtk_box_pack_start(GTK_BOX(vbox), duration_label, TRUE, TRUE, 0);
current_time_label = gtk_label_new(" Current Time:");
gtk_misc_set_alignment(GTK_MISC(current_time_label), 0.0, 0.5);
gtk_widget_show(current_time_label);
gtk_box_pack_start(GTK_BOX(vbox), current_time_label, TRUE, TRUE, 0);
finish_time_label = gtk_label_new(" Finish Time:");
gtk_misc_set_alignment(GTK_MISC(finish_time_label), 0.0, 0.5);
gtk_widget_show(finish_time_label);
gtk_box_pack_start(GTK_BOX(vbox), finish_time_label, TRUE, TRUE, 0);
// vbox for time values
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
start_time = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(start_time), 1.0, 0.5);
gtk_widget_show(start_time);
gtk_box_pack_start(GTK_BOX(vbox), start_time, TRUE, TRUE, 0);
duration = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(duration), 1.0, 0.5);
gtk_widget_show(duration);
gtk_box_pack_start(GTK_BOX(vbox), duration, TRUE, TRUE, 0);
current_time = gtk_label_new(" ");
gtk_misc_set_alignment(GTK_MISC(current_time), 1.0, 0.5);
gtk_widget_show(current_time);
gtk_box_pack_start(GTK_BOX(vbox), current_time, TRUE, TRUE, 0);
finish_time = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(finish_time), 1.0, 0.5);
gtk_widget_show(finish_time);
gtk_box_pack_start(GTK_BOX(vbox), finish_time, TRUE, TRUE, 0);
// vbox for time units
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
start_time_units = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(start_time_units), 1.0, 0.5);
gtk_widget_show(start_time_units);
gtk_box_pack_start(GTK_BOX(vbox), start_time_units, TRUE, TRUE, 0);
duration_units = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(duration_units), 1.0, 0.5);
gtk_widget_show(duration_units);
gtk_box_pack_start(GTK_BOX(vbox), duration_units, TRUE, TRUE, 0);
current_time_units = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(current_time_units), 1.0, 0.5);
gtk_widget_show(current_time_units);
gtk_box_pack_start(GTK_BOX(vbox), current_time_units, TRUE, TRUE, 0);
finish_time_units = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(finish_time_units), 1.0, 0.5);
gtk_widget_show(finish_time_units);
gtk_box_pack_start(GTK_BOX(vbox), finish_time_units, TRUE, TRUE, 0);
// separator
separator = gtk_hseparator_new();
gtk_widget_show(separator);
gtk_box_pack_start(GTK_BOX(frame_vbox), separator, TRUE, TRUE, 0);
// third row
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(frame_vbox), hbox, FALSE, FALSE, 2);
// vbox for size labels
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5);
current_size_label = gtk_label_new(" Current Size:");
gtk_misc_set_alignment(GTK_MISC(current_size_label), 0.0, 0.5);
gtk_widget_show(current_size_label);
gtk_box_pack_start(GTK_BOX(vbox), current_size_label, TRUE, TRUE, 0);
final_size_label = gtk_label_new(" Estimated Final Size:");
gtk_misc_set_alignment(GTK_MISC(final_size_label), 0.0, 0.5);
gtk_widget_show(final_size_label);
gtk_box_pack_start(GTK_BOX(vbox), final_size_label, TRUE, TRUE, 0);
// vbox for size values
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
current_size = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(current_size), 1.0, 0.5);
gtk_widget_show(current_size);
gtk_box_pack_start(GTK_BOX(vbox), current_size, TRUE, TRUE, 0);
final_size = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(final_size), 1.0, 0.5);
gtk_widget_show(final_size);
gtk_box_pack_start(GTK_BOX(vbox), final_size, TRUE, TRUE, 0);
// vbox for size units
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
current_size_units = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(current_size_units), 1.0, 0.5);
gtk_widget_show(current_size_units);
gtk_box_pack_start(GTK_BOX(vbox), current_size_units, TRUE, TRUE, 0);
final_size_units = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(final_size_units), 1.0, 0.5);
gtk_widget_show(final_size_units);
gtk_box_pack_start(GTK_BOX(vbox), final_size_units, TRUE, TRUE, 0);
// separator
separator = gtk_hseparator_new();
gtk_widget_show(separator);
gtk_box_pack_start(GTK_BOX(frame_vbox), separator, TRUE, TRUE, 0);
// fourth row
hbox = gtk_hbox_new(FALSE, 1);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(frame_vbox), hbox, FALSE, FALSE, 2);
actual_fps_label = gtk_label_new(" Video Frame Rate:");
gtk_misc_set_alignment(GTK_MISC(actual_fps_label), 0.0, 0.5);
gtk_widget_show(actual_fps_label);
gtk_box_pack_start(GTK_BOX(hbox), actual_fps_label, TRUE, TRUE, 5);
actual_fps = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(actual_fps), 1.0, 0.5);
gtk_widget_show(actual_fps);
gtk_box_pack_start(GTK_BOX(hbox), actual_fps, FALSE, FALSE, 0);
actual_fps_units = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(actual_fps_units), 1.0, 0.5);
gtk_widget_show(actual_fps_units);
gtk_box_pack_start(GTK_BOX(hbox), actual_fps_units, FALSE, FALSE, 5);
gtk_widget_show(frame); // show control frame
}
/*
* Main routine - set up window
*/
int gui_main(int argc, char **argv, CLiveConfig* pConfig)
{
MyConfig = pConfig;
AVFlow = new CAVMediaFlow(pConfig);
gtk_init(&argc, &argv);
// Setup main window
main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, FALSE, TRUE);
char buffer[80];
snprintf(buffer, sizeof(buffer), "cisco mp4live %s", VERSION);
gtk_window_set_title(GTK_WINDOW(main_window), buffer);
gtk_signal_connect(GTK_OBJECT(main_window),
"delete_event",
GTK_SIGNAL_FUNC(delete_event),
NULL);
// main boxes
main_hbox = gtk_hbox_new(FALSE, 1);
gtk_container_set_border_width(GTK_CONTAINER(main_hbox), 4);
gtk_widget_show(main_hbox);
gtk_container_add(GTK_CONTAINER(main_window), main_hbox);
main_vbox1 = gtk_vbox_new(FALSE, 1);
gtk_container_set_border_width(GTK_CONTAINER(main_vbox1), 4);
gtk_widget_show(main_vbox1);
gtk_box_pack_start(GTK_BOX(main_hbox), main_vbox1, FALSE, FALSE, 5);
main_vbox2 = gtk_vbox_new(FALSE, 1);
gtk_container_set_border_width(GTK_CONTAINER(main_vbox2), 4);
gtk_widget_show(main_vbox2);
gtk_box_pack_start(GTK_BOX(main_hbox), main_vbox2, FALSE, FALSE, 5);
// Video Preview
NewVideoWindow();
// Video Frame
LayoutVideoFrame(main_vbox2);
// Audio Frame
LayoutAudioFrame(main_vbox2);
// Recording Frame
LayoutRecordingFrame(main_vbox2);
// Transmission Frame
LayoutTransmitFrame(main_vbox2);
// Status frame
LayoutStatusFrame(main_vbox1);
// Control frame
LayoutControlFrame(main_vbox1);
DisplayAllSettings();
gtk_widget_show(main_window);
if (MyConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) {
AVFlow->StartVideoPreview();
}
// "press" start button
if (MyConfig->m_appAutomatic) {
on_start_button(start_button, NULL);
}
gtk_main();
delete AVFlow;
return 0;
}
/* end gui_main.cpp */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -