怎样才能从应用程序中专门驱动 HDMI 输出,而不允许操作系统自动配置它以进行显示输出?
例如,使用标准 DVI/VGA 作为主显示器,但使用设备文件将 Mplayer 视频输出发送到 HDMI。
这是一个很难通过谷歌回答的问题。几乎所有结果都与通过 HDMI 制作音频有关。
(在这里编辑)
下面的评论提到使用单独的 Xorg 服务器。尽管这是一个有用的想法,但它并没有回答我提出的一个问题,以及我暗示的一个问题:
1) 如果它在另一个显示器之前加载,或者如果它是唯一的显示器(仅使用 SSH 登录时),我如何防止 Linux 将控制台放在该显示器上?2)如果没有X怎么办?我想直接将图形驱动到适配器。我可以使用标准功能从代码中执行此操作,而不直接与驱动程序交互(可能已过时,但使用 SVGALib 或其他一些非 X 图形层)?
(在这里编辑)
我查看了 SVGALib(它是旧的)和 SDL。后者在 X 内部和外部都可以工作,甚至提供对 OpenGL 的访问。我通过某处的论坛链接找到了 1.3 版本,但网站和 FTP 似乎都只有 1.2 版本。总的来说,SDL 是一个很好的解决方案,但它有以下两个具体的缺点:
1) 一般的 create-device 调用接受设备索引,但完全忽略它:
(src/video/bwindow/SDL_bvideo.cc)
BE_CreateDevice(int devindex)
特定于驱动程序的调用似乎具有相同的缺陷。例如,DirectFB(我假设它在控制台下提供图形):
(src/video/directfb/SDL_DirectFB_video.c)
DirectFB_CreateDevice(int devindex)
这些函数的主体似乎都没有设置设备索引的现有位置......毫无疑问,由于缺乏对它们构建的标准接口的支持。
2) 无论何时选择适配器,SDL 似乎都会自动将所有显示器连接在一起。示例“testsprite2.c”(与库一起提供)接受“--display”参数,该参数在“common.c”(所有示例的通用功能)中处理。您可以看到,它使用“--display”参数所做的只是在一个大的组合画布中计算该屏幕的 X/Y 坐标:
if (SDL_strcasecmp(argv[index], "--display") == 0) {
++index;
if (!argv[index]) {
return -1;
}
state->display = SDL_atoi(argv[index]);
if (SDL_WINDOWPOS_ISUNDEFINED(state->window_x)) {
state->window_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
state->window_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
}
if (SDL_WINDOWPOS_ISCENTERED(state->window_x)) {
state->window_x = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
state->window_y = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
}
return 2;
}
因此,如果它们在同一个适配器上,则无法将它们与另一台显示器隔离开来。SDL 将无法工作。
除非有与 SDL 类似的解决方案,或者将特定设备 (devindex) 设置在适当的位置是微不足道的(可能不是这种情况,因此可能是它未实现的原因),它似乎独家和完全专用使用屏幕的最佳选择是在分配给您的第二台设备的单独 Xorg 实例下编写您自己的窗口管理器。