Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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;
}