You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
2.3KB

  1. #include "common.hpp"
  2. #include "random.hpp"
  3. #include "asset.hpp"
  4. #include "midi.hpp"
  5. #include "rtmidi.hpp"
  6. #include "keyboard.hpp"
  7. #include "gamepad.hpp"
  8. #include "bridge.hpp"
  9. #include "settings.hpp"
  10. #include "engine/Engine.hpp"
  11. #include "app/Scene.hpp"
  12. #include "plugin.hpp"
  13. #include "app.hpp"
  14. #include "patch.hpp"
  15. #include "ui.hpp"
  16. #include <unistd.h>
  17. #include <osdialog.h>
  18. #ifdef ARCH_WIN
  19. #include <Windows.h>
  20. #endif
  21. using namespace rack;
  22. int main(int argc, char *argv[]) {
  23. #ifdef ARCH_WIN
  24. // Windows global mutex to prevent multiple instances
  25. // Handle will be closed by Windows when the process ends
  26. HANDLE instanceMutex = CreateMutex(NULL, true, app::NAME);
  27. if (GetLastError() == ERROR_ALREADY_EXISTS) {
  28. osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported.");
  29. exit(1);
  30. }
  31. (void) instanceMutex;
  32. #endif
  33. bool devMode = false;
  34. std::string patchPath;
  35. // Parse command line arguments
  36. int c;
  37. opterr = 0;
  38. while ((c = getopt(argc, argv, "ds:u:")) != -1) {
  39. switch (c) {
  40. case 'd': {
  41. devMode = true;
  42. } break;
  43. case 's': {
  44. asset::systemDir = optarg;
  45. } break;
  46. case 'u': {
  47. asset::userDir = optarg;
  48. } break;
  49. default: break;
  50. }
  51. }
  52. if (optind < argc) {
  53. patchPath = argv[optind];
  54. }
  55. // Initialize environment
  56. asset::init(devMode);
  57. logger::init(devMode);
  58. // Log environment
  59. INFO("%s %s", app::NAME, app::VERSION);
  60. if (devMode)
  61. INFO("Development mode");
  62. INFO("System directory: %s", asset::systemDir.c_str());
  63. INFO("User directory: %s", asset::userDir.c_str());
  64. random::init();
  65. midi::init();
  66. rtmidiInit();
  67. bridgeInit();
  68. keyboard::init();
  69. gamepad::init();
  70. ui::init();
  71. plugin::init(devMode);
  72. windowInit();
  73. INFO("Initialized environment");
  74. // Initialize app
  75. settings.load(asset::user("settings.json"));
  76. app::init();
  77. APP->scene->devMode = devMode;
  78. APP->patch->init(patchPath);
  79. INFO("Initialized app");
  80. APP->engine->start();
  81. APP->window->run();
  82. INFO("Window closed");
  83. APP->engine->stop();
  84. // Destroy app
  85. APP->patch->save(asset::user("autosave.vcv"));
  86. app::destroy();
  87. settings.save(asset::user("settings.json"));
  88. INFO("Cleaned up app");
  89. // Destroy environment
  90. windowDestroy();
  91. plugin::destroy();
  92. ui::destroy();
  93. bridgeDestroy();
  94. midi::destroy();
  95. INFO("Cleaned up environment");
  96. logger::destroy();
  97. return 0;
  98. }