mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-14 19:43:42 +00:00
v4p: turn off the display after timeout
This commit is contained in:
@@ -244,7 +244,10 @@ int us_drm_dpms_power_off(us_drm_s *drm) {
|
|||||||
assert(drm->run->fd >= 0);
|
assert(drm->run->fd >= 0);
|
||||||
switch (_drm_check_status(drm)) {
|
switch (_drm_check_status(drm)) {
|
||||||
case 0: break;
|
case 0: break;
|
||||||
case -2: return -2;
|
case -2: return 0; // Unplugged, nice
|
||||||
|
// Во время переключения DPMS монитор моргает один раз состоянием disconnected,
|
||||||
|
// а потом почему-то снова оказывается connected. Так что просто считаем,
|
||||||
|
// что отсоединенный монитор на этом этапе - это нормально.
|
||||||
default: return -1;
|
default: return -1;
|
||||||
}
|
}
|
||||||
_drm_ensure_dpms_power(drm, false);
|
_drm_ensure_dpms_power(drm, false);
|
||||||
|
|||||||
@@ -172,17 +172,20 @@ static void _main_loop(void) {
|
|||||||
dev->dma_required = true;
|
dev->dma_required = true;
|
||||||
|
|
||||||
int once = 0;
|
int once = 0;
|
||||||
|
ldf blank_at_ts = 0;
|
||||||
int drm_opened = -1;
|
int drm_opened = -1;
|
||||||
while (!atomic_load(&_g_stop)) {
|
while (!atomic_load(&_g_stop)) {
|
||||||
# define CHECK(x_arg) if ((x_arg) < 0) { goto close; }
|
# define CHECK(x_arg) if ((x_arg) < 0) { goto close; }
|
||||||
|
|
||||||
if (drm_opened <= 0) {
|
if (drm_opened <= 0) {
|
||||||
|
blank_at_ts = 0;
|
||||||
CHECK(drm_opened = us_drm_open(drm, NULL));
|
CHECK(drm_opened = us_drm_open(drm, NULL));
|
||||||
}
|
}
|
||||||
assert(drm_opened > 0);
|
assert(drm_opened > 0);
|
||||||
|
|
||||||
if (atomic_load(&_g_ustreamer_online)) {
|
if (atomic_load(&_g_ustreamer_online)) {
|
||||||
US_ONCE({ US_LOG_ERROR("DRM: Online stream is active, stopping capture ..."); });
|
blank_at_ts = 0;
|
||||||
|
US_ONCE({ US_LOG_INFO("DRM: Online stream is active, stopping capture ..."); });
|
||||||
CHECK(us_drm_wait_for_vsync(drm));
|
CHECK(us_drm_wait_for_vsync(drm));
|
||||||
CHECK(us_drm_expose_stub(drm, US_DRM_STUB_BUSY, NULL));
|
CHECK(us_drm_expose_stub(drm, US_DRM_STUB_BUSY, NULL));
|
||||||
_slowdown();
|
_slowdown();
|
||||||
@@ -190,18 +193,26 @@ static void _main_loop(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (us_device_open(dev) < 0) {
|
if (us_device_open(dev) < 0) {
|
||||||
/*CHECK(us_drm_wait_for_vsync(drm));
|
ldf now_ts = us_get_now_monotonic();
|
||||||
CHECK(us_drm_expose_stub(drm, US_DRM_STUB_NO_SIGNAL, NULL));*/
|
if (blank_at_ts == 0) {
|
||||||
CHECK(us_drm_dpms_power_off(drm));
|
blank_at_ts = now_ts + 5;
|
||||||
|
}
|
||||||
|
if (now_ts <= blank_at_ts) {
|
||||||
|
CHECK(us_drm_wait_for_vsync(drm));
|
||||||
|
CHECK(us_drm_expose_stub(drm, US_DRM_STUB_NO_SIGNAL, NULL));
|
||||||
|
} else {
|
||||||
|
US_ONCE({ US_LOG_INFO("DRM: Turning off the display by timeout ..."); });
|
||||||
|
CHECK(us_drm_dpms_power_off(drm));
|
||||||
|
}
|
||||||
_slowdown();
|
_slowdown();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
once = 0;
|
||||||
|
blank_at_ts = 0;
|
||||||
us_drm_close(drm);
|
us_drm_close(drm);
|
||||||
CHECK(drm_opened = us_drm_open(drm, dev));
|
CHECK(drm_opened = us_drm_open(drm, dev));
|
||||||
|
|
||||||
once = 0;
|
|
||||||
|
|
||||||
us_hw_buffer_s *prev_hw = NULL;
|
us_hw_buffer_s *prev_hw = NULL;
|
||||||
while (!atomic_load(&_g_stop)) {
|
while (!atomic_load(&_g_stop)) {
|
||||||
if (atomic_load(&_g_ustreamer_online)) {
|
if (atomic_load(&_g_ustreamer_online)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user