diff --git a/obs/obs-app.cpp b/obs/obs-app.cpp index 75b08b02a..be1d306b7 100644 --- a/obs/obs-app.cpp +++ b/obs/obs-app.cpp @@ -524,7 +524,15 @@ bool OBSApp::InitTheme() OBSApp::OBSApp(int &argc, char **argv, profiler_name_store_t *store) : QApplication(argc, argv), profilerNameStore(store) -{} +{ + sleepInhibitor = os_inhibit_sleep_create("OBS Video/audio"); +} + +OBSApp::~OBSApp() +{ + os_inhibit_sleep_set_active(sleepInhibitor, false); + os_inhibit_sleep_destroy(sleepInhibitor); +} static void move_basic_to_profiles(void) { diff --git a/obs/obs-app.hpp b/obs/obs-app.hpp index 7e57379e2..93bf53c06 100644 --- a/obs/obs-app.hpp +++ b/obs/obs-app.hpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +66,9 @@ private: QPointer mainWindow; profiler_name_store_t *profilerNameStore = nullptr; + os_inhibit_t *sleepInhibitor = nullptr; + int sleepInhibitRefs = 0; + bool InitGlobalConfig(); bool InitGlobalConfigDefaults(); bool InitLocale(); @@ -72,6 +76,7 @@ private: public: OBSApp(int &argc, char **argv, profiler_name_store_t *store); + ~OBSApp(); void AppInit(); bool OBSInit(); @@ -109,6 +114,21 @@ public: const char *OutputAudioSource() const; const char *GetRenderModule() const; + + inline void IncrementSleepInhibition() + { + if (!sleepInhibitor) return; + if (sleepInhibitRefs++ == 0) + os_inhibit_sleep_set_active(sleepInhibitor, true); + } + + inline void DecrementSleepInhibition() + { + if (!sleepInhibitor) return; + if (sleepInhibitRefs == 0) return; + if (--sleepInhibitRefs == 0) + os_inhibit_sleep_set_active(sleepInhibitor, false); + } }; int GetConfigPath(char *path, size_t size, const char *name); diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index 841167af9..6f255d7cd 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -924,8 +924,6 @@ void OBSBasic::OBSInit() connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDisplay); - sleepInhibitor = os_inhibit_sleep_create("OBS Video/audio"); - os_inhibit_sleep_set_active(sleepInhibitor, true); show(); } @@ -1178,9 +1176,6 @@ OBSBasic::~OBSBasic() } } #endif - - os_inhibit_sleep_set_active(sleepInhibitor, false); - os_inhibit_sleep_destroy(sleepInhibitor); } void OBSBasic::SaveProjectNow() @@ -3080,8 +3075,9 @@ void OBSBasic::StopStreaming() if (outputHandler->StreamingActive()) outputHandler->StopStreaming(); - if (!outputHandler->Active()) { + if (!outputHandler->Active() && !ui->profileMenu->isEnabled()) { ui->profileMenu->setEnabled(true); + App()->DecrementSleepInhibition(); } } @@ -3092,8 +3088,9 @@ void OBSBasic::ForceStopStreaming() if (outputHandler->StreamingActive()) outputHandler->ForceStopStreaming(); - if (!outputHandler->Active()) { + if (!outputHandler->Active() && !ui->profileMenu->isEnabled()) { ui->profileMenu->setEnabled(true); + App()->DecrementSleepInhibition(); } } @@ -3113,6 +3110,11 @@ void OBSBasic::StreamDelayStarting(int sec) ui->streamButton->setMenu(startStreamMenu); ui->statusbar->StreamDelayStarting(sec); + + if (ui->profileMenu->isEnabled()) { + ui->profileMenu->setEnabled(false); + App()->IncrementSleepInhibition(); + } } void OBSBasic::StreamDelayStopping(int sec) @@ -3138,7 +3140,12 @@ void OBSBasic::StreamingStart() ui->streamButton->setText(QTStr("Basic.Main.StopStreaming")); ui->streamButton->setEnabled(true); ui->statusbar->StreamStarted(outputHandler->streamOutput); - ui->profileMenu->setEnabled(false); + + if (ui->profileMenu->isEnabled()) { + ui->profileMenu->setEnabled(false); + App()->IncrementSleepInhibition(); + } + blog(LOG_INFO, STREAMING_START); } @@ -3175,8 +3182,10 @@ void OBSBasic::StreamingStop(int code) ui->streamButton->setText(QTStr("Basic.Main.StartStreaming")); ui->streamButton->setEnabled(true); - if (!outputHandler->Active()) + if (!outputHandler->Active() && !ui->profileMenu->isEnabled()) { ui->profileMenu->setEnabled(true); + App()->DecrementSleepInhibition(); + } blog(LOG_INFO, STREAMING_STOP); @@ -3207,8 +3216,9 @@ void OBSBasic::StopRecording() if (outputHandler->RecordingActive()) outputHandler->StopRecording(); - if (!outputHandler->Active()) { + if (!outputHandler->Active() && !ui->profileMenu->isEnabled()) { ui->profileMenu->setEnabled(true); + App()->DecrementSleepInhibition(); } } @@ -3216,7 +3226,12 @@ void OBSBasic::RecordingStart() { ui->statusbar->RecordingStarted(outputHandler->fileOutput); ui->recordButton->setText(QTStr("Basic.Main.StopRecording")); - ui->profileMenu->setEnabled(false); + + if (ui->profileMenu->isEnabled()) { + ui->profileMenu->setEnabled(false); + App()->IncrementSleepInhibition(); + } + blog(LOG_INFO, RECORDING_START); } @@ -3242,8 +3257,9 @@ void OBSBasic::RecordingStop(int code) QTStr("Output.RecordError.Msg")); } - if (!outputHandler->Active()) { + if (!outputHandler->Active() && !ui->profileMenu->isEnabled()) { ui->profileMenu->setEnabled(true); + App()->DecrementSleepInhibition(); } } diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp index 78a40ecfa..4595069eb 100644 --- a/obs/window-basic-main.hpp +++ b/obs/window-basic-main.hpp @@ -92,7 +92,6 @@ private: QPointer cpuUsageTimer; os_cpu_usage_info_t *cpuUsageInfo = nullptr; - os_inhibit_t *sleepInhibitor = nullptr; OBSService service; std::unique_ptr outputHandler; diff --git a/obs/window-projector.cpp b/obs/window-projector.cpp index 505e52cf4..ff23406f1 100644 --- a/obs/window-projector.cpp +++ b/obs/window-projector.cpp @@ -25,12 +25,15 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_) }; connect(this, &OBSQTDisplay::DisplayCreated, addDrawCallback); + + App()->IncrementSleepInhibition(); } OBSProjector::~OBSProjector() { if (source) obs_source_dec_showing(source); + App()->DecrementSleepInhibition(); } void OBSProjector::Init(int monitor)