Skip to content

Commit

Permalink
fix(macos): prevent indefinite hanging if screen capture is not granted
Browse files Browse the repository at this point in the history
Currently, if Sunshine has not yet been granted the screen capture
permission, the program simply hangs indefinitely on startup when it
attempts to probe for usable encoders. This is not desirable because
it prevents testing and using all of the parts of Sunshine that do not
require the screen capture permission.

With this patch, the encoder probing will simply fail instead of
hanging indefinitely if Sunshine does not yet have the screen capture
permission.

Note that Sunshine already prints out an error message telling the user
that the screen capture permission is needed. The bug is that Sunshine
currently indefinitely hangs shortly after printing that message.
  • Loading branch information
cathyjf committed Nov 2, 2024
1 parent 03253fc commit 4e22479
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/platform/macos/display.mm
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "src/platform/common.h"
#include "src/platform/macos/av_img_t.h"
#include "src/platform/macos/av_video.h"
#include "src/platform/macos/misc.h"
#include "src/platform/macos/nv12_zero_device.h"

#include "src/config.h"
Expand Down Expand Up @@ -100,6 +101,13 @@

int
dummy_img(img_t *img) override {
if (!platf::is_screen_capture_allowed()) {
// If we don't have the screen capture permission, this function will hang
// indefinitely without doing anything useful. Exit instead to avoid this.
// A non-zero return value indicates failure to the calling function.
return 1;
}

auto signal = [av_capture capture:^(CMSampleBufferRef sampleBuffer) {
auto new_sample_buffer = std::make_shared<av_sample_buf_t>(sampleBuffer);
auto new_pixel_buffer = std::make_shared<av_pixel_buf_t>(new_sample_buffer->buf);
Expand Down
5 changes: 5 additions & 0 deletions src/platform/macos/misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@

#include <CoreGraphics/CoreGraphics.h>

namespace platf {
bool
is_screen_capture_allowed();
}

namespace dyn {
typedef void (*apiproc)();

Expand Down
12 changes: 12 additions & 0 deletions src/platform/macos/misc.mm
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,16 @@
CGRequestScreenCaptureAccess(void) __attribute__((weak_import));
#endif

namespace {
auto screen_capture_allowed = std::atomic<bool> { false };
} // namespace

// Return whether screen capture is allowed for this process.
bool
is_screen_capture_allowed() {
return screen_capture_allowed;
}

std::unique_ptr<deinit_t>
init() {
// This will generate a warning about CGPreflightScreenCaptureAccess and
Expand All @@ -68,6 +78,8 @@
return nullptr;
}
#pragma clang diagnostic pop
// Record that we determined that we have the screen capture permission.
screen_capture_allowed = true;
return std::make_unique<deinit_t>();
}

Expand Down

0 comments on commit 4e22479

Please sign in to comment.