Két megjelenítő váltás, frekvencia állítás

Sokat kerestem azt, hogy hová tegyem a témát, de nem találtam neki jobb helyet.

Picit hosszú leszek, mégpedig azért, mert szeretném a szituációmat körülírni hátha van valakinek bármiféle ötlete meglátása.

Ubuntu 9.4-et használok a laptopomon és megtetszett, ezért arra gondoltam a házimozi célra használt gépemen is megpróbálkozom a linuxal. A felállás a következő. Egy vetítő dvi kimeneten és egy lcd tv, a vga kimeneten. Mindkettőt egy pc hajtja. A pc-t távval vezérlem, és távval váltok a két megjelenítő közt is és a vertikális frekvencia frissítések közt is. A vetítőt 1280x720 felbontással 48hz-en vagy 50hz-en hajtom, míg az lcd tv-t 1360x768-on 60Hz-en. a lejátszandó anyagokat felbontástól függően postprocesselem különféle módon automatikusan nem kézzel választva. A pc-n van egy frontend ahol távval tudom kiválasztani a lejátszandó média fájlt.

Elkezdtem nézegetni linuxon milyen lehetőségek vannak. A frontendre mythtv vagy xbmc a befutó. A távvezérlésre lirc (mi más). A kimenetek és frekvencia közti váltást az xrandr-el kívánom megoldani.

Először a videó kimenetek és frissítési frekvencia közti váltást próbáltam volna megoldani. Utánaolvastam és A laptopomon szépen ki is próbáltam sikeresen. Az xrandr-el tudtam felbontás és frekvenciát is állítani dinamikusan. Akkor gondoltam kipróbálom a htpc-n is. Jött a pofára esés, mert ott több gondom is támadt. Először is nem látja az xrandr az összes kimenetet, csak egy defaultot attól függően a dvi kimenet be van-e dugva vagy sem. A dvi erősebb és ha be van dugva a vga nem látszik. Továbbá a frekvencia állítás hibaüzenettel elszáll, még akkor is ha az épp aktuális frekvenciára váltok. nvidia gf 9400-as kártyám van, míg a laptopomban egy alaplapi inteles vga kártya van (Intel Mobile Intel® GM45 Express Chipset).

ezt a htpc-n kapom:

xrandr --output default --mode 1280x720

X Error of failed request: 175
Major opcode of failed request: 153 (RANDR)
Minor opcode of failed request: 29 ()
Serial number of failed request: 20
Current serial number in output stream: 20

Utánagugliztam és találtam hasonló problémát, de ott forgatni akarta valakia képet és a megoldás amit javasoltak az volt, hogy egy vendorspecifikus opcióval ezt engedélyezze. Írták azt is, hogy az EDID információk figyelembevételét is tiltani kell esetleg, de ez persze nem magyarázza azt, hogy miért nem tudok arra a módra váltani amiben a gép az adott pillanatban működik.

Úgy gondolom, hogy a megoldás iránya az, hogy nvidia-settings-el csinálok egy nekem tetsző xorg.conf-ot és akkor mennek majd a dolgok. most nem tudom próbálni, mert éppen nyaralok és csak laptopom van, de gondoltam megpróbálom a dolgot addig is körbejárni.

Hozzászólások

Szerintem inkább nyaralj, öregkorodban bánni fogod a rengeteg man page olvasást :-)

Nekem hasonló felállásom van Linux alatt (MythTv tök jól megy). Csak egy kérdés: miért akarod állítgatni a frekvenciákat? Nekem régen Nvidia kártyám volt, és azon mintha nem ment volna az xrandr (tessék a gyártónál drivert reklamálni). Én simán beállítottam az xorg.conf-ban a frekvenciákat azt ment. Igaz, ha lekérdeztem akoor baromságokat írt ki.

Hogy a kérdésre is válaszoljak: Szerintem valami xorg.conf beállítás fog hibádzni.

-- Csak egy kérdés: miért akarod állítgatni a frekvenciákat?

Elsősorban nem a frekvenciákat akarom állítgatni, hanem a kimenetek közt akarok váltani. A projektorom viszont két frissítési freki kell a 24p HD filmekhez és 25 fps pal dvd-hez. igaz dvd-ket rendkívül ritkán nézek már. ritkán előfordul pal formatumú sorozatrész is, de rendkívül ritka.

Van egy lcd tv ami hd ready és VGA kimeneten van, neki 1360x768 kell 60Hz-en. A vetítőm dvi-on van és azt 1280x720-al kell etetni 48Hz-en vagy 50Hz-en. Ez utóbbi a 25-os pal filmekhez. Alapból a vetítőmet 60Hz-el hajtja a linux, de az nem jó egyik médiához sem.

Időközben megtaláltam a megoldást és beteszem ide hátha valaki számára érdekes a téma.

Itt az alábbi működő xorg.conf-om.

# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings: version 1.0 (buildd@crested) Sun Feb 1 20:25:37 UTC 2009

Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "Module"
Load "dbe"
Load "extmod"
Load "type1"
Load "freetype"
Load "glx"
EndSection

Section "ServerFlags"
Option "Xinerama" "0"
EndSection

Section "InputDevice"
# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection

# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings: version 1.0 (buildd@crested) Sun Feb 1 20:25:37 UTC 2009

Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "Module"
Load "dbe"
Load "extmod"
Load "type1"
Load "freetype"
Load "glx"
EndSection

Section "ServerFlags"
Option "Xinerama" "0"
EndSection

Section "InputDevice"
# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection

Section "Monitor"
# HorizSync source: edid, VertRefresh source: edid
Identifier "Monitor0"
VendorName "Unknown"
ModelName "IFS InFocusIN78-H"
HorizSync 16.0 - 69.0
VertRefresh 43.0 - 85.0
Option "DPMS"
Option "ExactModeTimingsDVI" "True"
Option "UseEDIDDpi" "False"
Option "UseEDIDFreqs" "False"
Modeline "1280x720_48.00" 58.05 1280 1328 1456 1632 720 721 724 741 -HSync +Vsync
EndSection

Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 9400 GT"
EndSection

Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "TwinView" "1"
Option "TwinViewXineramaInfoOrder" "DFP-0"
Option "metamodes" "DFP: 1280x720_48.00 +0+0,CRT: NULL +0+0; CRT: nvidia-auto-select +0+0,DFP: NULL +0+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection

Szóval a "Device" részben van három opció amivel amennyiben a megjelenítő nem adja vissza rendesen a támogatott üzemmódot, akkor ezt figyelmen kívül lehet hagyni.

Option "ExactModeTimingsDVI" "True"
Option "UseEDIDDpi" "False"
Option "UseEDIDFreqs" "False"

Nem 100%, hogy mindhárom kell, de a doksik alapján én bemásoltam és működik.

Szintén a "Device" részben van a plussz "Modeline" sor is, hogy ismerje az X az adott 48Hz-es módot. A "Modeline" sort rengeteg módon lehet generálni, én egy kis programmal csináltam (http://gtf.sourceforge.net/).

Modeline "1280x720_48.00" 58.05 1280 1328 1456 1632 720 721 724 741 -HSync +Vsync

Fontos, hogy a screen részben a problémás screen legyen benne ami az én esetemben a vetítő, mivel ott az EDID infókat tiltani kell a 48hz-hez. A tv mehetett a defaultban. A twinview-el előállított xorg.conf-ot, módosítanom kellett mert a barmafarka nvidia-settings nem álítja a preferált monitort be rendesen, hanem összekutyulja.

Ezek után az xrandr két üzemmódot mutat, amit beállítottam a metamode-ban

xrandr

1280x720 50.0*
1360x768 51.0 50.0

ezek után a két megjelenítő közt elegánsan váltok

xrandr -s 0
xrandr -s 1

vagy

xrandr -s 1280x720
xrandr -s 1360x768

Lehet további üzemmódokat definiálni, de akkor azt be kell írni a metamode részbe, ahol az egyes beállításpárokat ; választja el egymástól és azt a kimenetet amit nem akarunk megjeleníteni azt NULL +0+0 kell megadni.

Beteszem azt is, hogy mi alapján túrtam ki a megoldást.

Ezek amiatt íródtak alapvetően, hogy a játékokkal játszókat a két monitoros felállás megszívatja, de nekünk is jó amit kitúrtak.

http://ubuntu.kareeser.com/?p=9

igazából a fenti hivatkozza az alábbi, de a fentivel érdemes kezdeni.

http://www.ltyer.com/wordpress/tutorial-xo...-a-dual-display

Itt olvasható, hogy

It all has to do with how the graphics card handles its outputs to the X windows system. nVIDIA cards use a cross-platform technology called TwinView, which allows it to output to two displays, merged into one, much like a traditional Windows system. Unfortunately, because the two displays are merged, running xrandr yields this output:

Screen 0: minimum 1024 x 768, current 2960 x 1050, maximum 2960 x 1050
default connected 2960x1050+0+0 0mm x 0mm
2960x1050 50.0*

… at least, on my system. I have two displays configured, one at 1680×1050, and another at 1280×1024. Combined, they output as 2960×1050.

Az nvidia ha mind a két kimenete él egy kártyának, akkor a "TwinView"-nak nevezett módszert használja, ilyenkor látható mind a két kártya, de a barmafarka ezt összevonja, és egyben mutatja egy "default" név alatt, ezért keresgéljük hiába a kimeneteket, amik mondjuk egy intel kártya esetében megvannak.

Szóval a trükk az, hogy bekapcsoljuk a twinwiev-t, mert ha nem kapcsoljuk be nem tudjuk elérni a másik megjelenítőt.

Ebben az esetben a metmode-ban vannak leírva az üzemmódok.

pl.

Section "Screen"
Option "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: nvidia-auto-select +1680+0"
EndSection

Látszik, hogy a két dvi kimenet képernyője egymás mellé van rakva, mert a virtuális induló koordináta az első képernyő szélességével x irányban "odébb" van.

Aztán ezt módosítja oly módon, hogy hozzátesz meg egy módot, mégpedig úgy, hogy a mellette lévő képernyőt letiltja.

Section "Screen"
Option "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: nvidia-auto-select +1680+0; DFP-0: 1680x1050 +0+0,NULL"
EndSection

Ezek után lesz egy olyan mód, ahol az egyik képernyő látszik csak.

xrandr

Screen 0: minimum 1024 x 768, current 2960 x 1050, maximum 2960 x 1050
default connected 2960x1050+0+0 0mm x 0mm
2960x1050 50.0*
1680x1050 51.0