X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=main.cpp;h=e2d2cec4ee42c46f12527c9f29be3972302cb0ea;hp=9ea610f04d59c8d7dd1a8f98feb246a519a4dfd5;hb=refs%2Fheads%2Fmultichannel_audio;hpb=bbf08db0aecea0a021b07def18bf41dee2724898 diff --git a/main.cpp b/main.cpp index 9ea610f..e2d2cec 100644 --- a/main.cpp +++ b/main.cpp @@ -1,14 +1,36 @@ +extern "C" { +#include +} +#include +#include +#include +#include +#include // IWYU pragma: keep #include -#include +#include +#include +#include #include -#include +#include +#include "context.h" +#include "flags.h" +#include "image_input.h" #include "mainwindow.h" #include "mixer.h" int main(int argc, char *argv[]) { - setenv("QT_XCB_GL_INTEGRATION", "xcb_egl", 0); + parse_flags(argc, argv); + + if (global_flags.va_display.empty() || + global_flags.va_display[0] != '/') { + // We normally use EGL for zerocopy, but if we use VA against DRM + // instead of against X11, we turn it off, and then don't need EGL. + setenv("QT_XCB_GL_INTEGRATION", "xcb_egl", 0); + } + setlinebuf(stdout); + av_register_all(); QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); QApplication app(argc, argv); @@ -19,13 +41,41 @@ int main(int argc, char *argv[]) fmt.setProfile(QSurfaceFormat::CoreProfile); fmt.setMajorVersion(3); fmt.setMinorVersion(1); + + // Turn off vsync, since Qt generally gives us at most frame rate + // (display frequency) / (number of QGLWidgets active). + fmt.setSwapInterval(0); + QSurfaceFormat::setDefaultFormat(fmt); + QGLFormat::setDefaultFormat(QGLFormat::fromSurfaceFormat(fmt)); + + global_share_widget = new QGLWidget(); + MainWindow mainWindow; - mainWindow.resize(QSize(1280, 720)); + mainWindow.resize(QSize(1500, 850)); mainWindow.show(); + app.installEventFilter(&mainWindow); // For white balance color picking. + + // Even on an otherwise unloaded system, it would seem writing the recording + // to disk (potentially terabytes of data as time goes by) causes Nageru + // to be pushed out of RAM. If we have the right privileges, simply lock us + // into memory for better realtime behavior. + if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) { + perror("mlockall()"); + fprintf(stderr, "Failed to lock Nageru into RAM. You probably want to\n"); + fprintf(stderr, "increase \"memlock\" for your user in limits.conf\n"); + fprintf(stderr, "for better realtime behavior.\n"); + uses_mlock = false; + } else { + uses_mlock = true; + } + int rc = app.exec(); - mixer_quit(); + global_mixer->quit(); + mainWindow.mixer_shutting_down(); + delete global_mixer; + ImageInput::shutdown_updaters(); return rc; }