#include "capture_pump.h" #include #include #include #include "hooks/graphics/graphics.h" namespace api::capture_pump { namespace { std::array CONSUMER_M; // read once per capture from the present thread, so it stays lock free std::atomic CLAIMED[GRAPHICS_CAPTURE_SCREEN_NO] {}; bool valid_screen(int screen) { return 0 <= screen && screen < static_cast(GRAPHICS_CAPTURE_SCREEN_NO); } } bool capture_direct(int screen, std::shared_ptr &out, int divide, uint64_t *timestamp, int *width, int *height) { if (!valid_screen(screen)) { return false; } std::lock_guard lock(CONSUMER_M[screen]); graphics_capture_trigger(screen); return graphics_capture_receive_raw( screen, out, divide, timestamp, width, height); } bool claim_screen(int screen) { if (!valid_screen(screen)) { return false; } return !CLAIMED[screen].exchange(true); } void release_screen(int screen) { if (!valid_screen(screen)) { return; } CLAIMED[screen] = false; } bool screen_claimed(int screen) { if (!valid_screen(screen)) { return false; } return CLAIMED[screen]; } }