static void display_deactivate(struct uterm_display *disp) { if (!display_is_online(disp)) return; if (disp->dumb.saved_crtc) { if (disp->video->flags & VIDEO_AWAKE) { drmModeSetCrtc(disp->video->dumb.fd, disp->dumb.saved_crtc->crtc_id, disp->dumb.saved_crtc->buffer_id, disp->dumb.saved_crtc->x, disp->dumb.saved_crtc->y, &disp->dumb.conn_id, 1, &disp->dumb.saved_crtc->mode); } drmModeFreeCrtc(disp->dumb.saved_crtc); disp->dumb.saved_crtc = NULL; } destroy_rb(disp, &disp->dumb.rb[1]); destroy_rb(disp, &disp->dumb.rb[0]); disp->current_mode = NULL; disp->flags &= ~(DISPLAY_ONLINE | DISPLAY_VSYNC); log_info("deactivating display %p", disp); }
static void handle_free (struct neon_handle * h) { ne_uri_free (h->purl); g_free (h->purl); destroy_rb (& h->rb); pthread_mutex_destroy (& h->reader_status.mutex); pthread_cond_destroy (& h->reader_status.cond); g_free (h->icy_metadata.stream_name); g_free (h->icy_metadata.stream_title); g_free (h->icy_metadata.stream_url); g_free (h->icy_metadata.stream_contenttype); g_free (h->url); g_free (h); }
static int display_activate(struct uterm_display *disp, struct uterm_mode *mode) { struct uterm_video *video = disp->video; int ret, crtc, i; drmModeRes *res; drmModeConnector *conn; drmModeEncoder *enc; if (!video || !video_is_awake(video) || !mode) return -EINVAL; if (display_is_online(disp)) return -EINVAL; log_info("activating display %p to %ux%u", disp, mode->dumb.info.hdisplay, mode->dumb.info.vdisplay); res = drmModeGetResources(video->dumb.fd); if (!res) { log_err("cannot get resources for display %p", disp); return -EFAULT; } conn = drmModeGetConnector(video->dumb.fd, disp->dumb.conn_id); if (!conn) { log_err("cannot get connector for display %p", disp); drmModeFreeResources(res); return -EFAULT; } crtc = -1; for (i = 0; i < conn->count_encoders; ++i) { enc = drmModeGetEncoder(video->dumb.fd, conn->encoders[i]); if (!enc) continue; crtc = find_crtc(video, res, enc); drmModeFreeEncoder(enc); if (crtc >= 0) break; } drmModeFreeConnector(conn); drmModeFreeResources(res); if (crtc < 0) { log_warn("cannot find crtc for new display"); return -ENODEV; } disp->dumb.crtc_id = crtc; disp->dumb.current_rb = 0; disp->current_mode = mode; disp->dumb.saved_crtc = drmModeGetCrtc(video->dumb.fd, disp->dumb.crtc_id); ret = init_rb(disp, &disp->dumb.rb[0]); if (ret) goto err_saved; ret = init_rb(disp, &disp->dumb.rb[1]); if (ret) goto err_rb; ret = drmModeSetCrtc(video->dumb.fd, disp->dumb.crtc_id, disp->dumb.rb[0].fb, 0, 0, &disp->dumb.conn_id, 1, &disp->current_mode->dumb.info); if (ret) { log_err("cannot set drm-crtc"); ret = -EFAULT; goto err_fb; } disp->flags |= DISPLAY_ONLINE; return 0; err_fb: destroy_rb(disp, &disp->dumb.rb[1]); err_rb: destroy_rb(disp, &disp->dumb.rb[0]); err_saved: disp->current_mode = NULL; if (disp->dumb.saved_crtc) { drmModeFreeCrtc(disp->dumb.saved_crtc); disp->dumb.saved_crtc = NULL; } return ret; }