Enigma ide(O_sync)

Alles rund um das grafische Benutzerinterface Enigma
Schawee
Interessierter
Interessierter
Beiträge: 30
Registriert: Montag 31. Mai 2004, 13:44

Enigma ide(O_sync)

Beitrag von Schawee »

da enigma die option O_sync nicht hat,hier mal eine diff,es läuft mit meine sagem und ide-if einwandfrei.
ist nur die diff der record.cpp.einbauen in die setup_extra sollte weiter kein problem sein.

Code: Alles auswählen

--- record.cpp.org	2006-10-05 14:35:16.000000000 +0200
+++ record.cpp	2006-09-01 11:31:16.000000000 +0200
@@ -302,7 +302,15 @@
 		if (eBackgroundFileEraser::getInstance())
 			eBackgroundFileEraser::getInstance()->erase((tfilename+".$$$").c_str());
 	}
-	outfd=::open(tfilename.c_str(), O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE, 0555);
+	if (access("/var/etc/.O_SYNC", R_OK) == 0)
+	{
+		outfd=::open(tfilename.c_str(),O_SYNC|O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, 0555);
+	}
+	else
+	{
+		outfd=::open(tfilename.c_str(), O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE, 0555);
+	}
+	
 
 	if (outfd < 0)
 	{


gleich noch der fix für die busybox 1.21 ,das die platte auch wieder ausgeschalten wird.

Code: Alles auswählen

--- enigma_dyn_conf.cpp.org	2005-10-30 16:45:16.000000000 +0100
+++ enigma_dyn_conf.cpp	2006-10-07 22:35:00.000000000 +0200
@@ -175,12 +175,12 @@
 	eConfig::getInstance()->getKey("/extras/hdparm-m", ac);
 	if (ti)
 	{
-		cmd.sprintf("hdparm -S %d /dev/ide/host0/bus0/target0/lun0/disc", ti);
+		cmd.sprintf("hdparm -S%d /dev/ide/host0/bus0/target0/lun0/disc", ti);
 		system(cmd.c_str());
 	}
 	if (ac)
 	{
-		cmd.sprintf("hdparm -M %d /dev/ide/host0/bus0/target0/lun0/disc", ac);
+		cmd.sprintf("hdparm -M%d /dev/ide/host0/bus0/target0/lun0/disc", ac);
 		system(cmd.c_str());
 	}
 #endif
Coronas
Developer
Beiträge: 196
Registriert: Dienstag 16. Oktober 2001, 00:00

Beitrag von Coronas »

Hi,

ich habe gerade die O_SYNC-Sache eingecheckt, allerdings achtet enigma jetzt auf das Vorhandensein der Datei /var/etc/.o_sync, da die anderen Optionen auch ausnahmslos kleingeschrieben wurden. Danke für den Hinweis!
cu
KaLiBo
Neugieriger
Neugieriger
Beiträge: 9
Registriert: Sonntag 8. Oktober 2006, 00:34

Beitrag von KaLiBo »

@Schawee, ich hab den Patch auch mal eingebaut. Scheint irgendwie nicht nur gut zu laufen, sondern ich bilde mir ein, dass es "ohne" gar nicht erst richtig aufzeichnet. Verspätetes Danke an dieser Stelle.

@Coronas, da der Patch wirklich so gut läuft (nur Dbox2 getestet), hab ich hier die Abfrage auf Vorhandensein umgedreht. Ich denke er sollte defaultmässig eingeschaltet sein, also wird bei mir abgefragt, ob /var/etc/.no_o_sync vorhanden ist. Wenn nicht, nimmt die Box mit O_SYNC Patch auf. Ich finde das so sinnvoller.

Wenn Du meine Meinung teilst, kannst Du es ja so einchecken:

Code: Alles auswählen

	if (access("/var/etc/.no_o_sync", F_OK) == 0)
	{
	outfd=::open(tfilename.c_str(), O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE, 0555);
	}
	else
	{
	outfd=::open(tfilename.c_str(),O_SYNC|O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, 0555);
	}
In der setup_extra entsprechend negieren. Wenn es irgendwie Probleme mit der Dreambox geben sollte, dann sollte man es so lassen, wie von Schawee vorgeschlagen.

Gruss
Coronas
Developer
Beiträge: 196
Registriert: Dienstag 16. Oktober 2001, 00:00

Beitrag von Coronas »

Stimme dir zu, sowohl bei einer Philips als auch bei einer Nokia-dbox ist die Aufnahme ohne O_Sync nichts geworden. Ich werde allerdings, da ich mangels Hardware und Zeit nicht alle dbox/dreambox Konfigurationen testen kann, ein Präprozessor Makro einbauen, so dass das alles, was mit .no_o_sync zusammenhängt, nur bei nicht-Dreamboxen übersetzt wird.
KaLiBo
Neugieriger
Neugieriger
Beiträge: 9
Registriert: Sonntag 8. Oktober 2006, 00:34

Beitrag von KaLiBo »

Achso mit #ifdef's ist das natürlich galant. Dann dürfte es keinen Konflikt mit der Dream geben.

Habs zwar nicht getestet (nur im cvs-view angeguckt), sieht aber ok aus. :wink:
KaLiBo
Neugieriger
Neugieriger
Beiträge: 9
Registriert: Sonntag 8. Oktober 2006, 00:34

Beitrag von KaLiBo »

Ich hab jetzt mal ein wenig mit den SYNCs gespielt, und einige Fortschritte beim Playback erreichen können. ZB. das Spulen.

Es ist immer noch miserabel; manchmal gehts, manchmal nicht, aber ich glaube ich bin auf einem guten Weg. Das Parsen bis zum Abspielen geht aber damit pfeilschnell. Bild + Ton kommt unmittelbar, wenn der Film auf Anfang stand.

/lib/dvb/dvbservice.cpp

Code: Alles auswählen

                        if ( service.path ) // recorded ts
                        {
                                // we try to find manual the correct sid
-                               int fd = open( service.path.c_str(), O_RDONLY|O_LARGEFILE );
+                               int fd = open( service.path.c_str(), O_RDONLY|O_LARGEFILE|O_SYNC|O_RSYNC );
                                if ( fd < 0 )
                                        eDebug("open %s failed");
                                else
/lib/dvb/servicedvb.cpp

Code: Alles auswählen

        if (sourcefd >= 0)
                ::close(sourcefd);

-       sourcefd=::open(tfilename.c_str(), O_RDONLY|O_LARGEFILE);
+       sourcefd=::open(tfilename.c_str(), O_RDONLY|O_LARGEFILE|O_SYNC|O_RSYNC);
        if (sourcefd >= 0)
        {
                off64_t slicesize=this->slicesize;
/lib/dvb/servicedvb.cpp weiter unten

Code: Alles auswählen

                        l=convertLatin1UTF8(l);
                if (node.descr)
                        l=node.descr;
-               int fd=open(node.path.c_str(), O_RDONLY|O_LARGEFILE);
+               int fd=open(node.path.c_str(), O_RDONLY|O_LARGEFILE|O_SYNC|O_RSYNC);
                if (fd < 0)
                        return 0;
                __u8 packet[188];
Zuvor war es ja so, dass nach dem Betätigen des Spulens das Abspielen bis zum nächsten "Stop" im Eimer war. Dumm, wenn man es mitten im Film gemacht hat, denn dann muss man ja wieder ganz von vorne beginnen.
Also hiermit lässt sich das Spulen "wenigstens" schonmal soweit austricksen, dass man zB. 6 Minuten am Stück vorspult, Pause drückt, und wieder Play. Wenn der Thread im Eimer ist, 64x vorspulen, pause, play. Wenn noch immer futsch, rückwärts 64x, pause, play. Irgendwann fängt es sich wieder, und es geht ganz normal weiter, sogar lippensynchron. Manchmal läuft ein 6-minuten-Sprung auch direkt lippensynchron weiter.
Übrigens: Das 8x Spulen löppt überhaupt nicht Das 16x Spulen auch nicht wirklich. Beim 32/64-fach Spulen gibts aber jetzt schonmal Echtzeit-Bild-Refresh, während es rattert; gelegentlich auch mal temporäre Ton-Schnipsel. Zuvor war ja alles tot/schwarz, und auch un-rettbar.

Mit dem Workaround kann man zwar erstmal nix anfangen, aber evtl. kann man die Spul-Funktionen schonmal so umstricken, indem man ein "Zwangs-Pause" vor das Play eingebaut. Evtl. stimmt auch der "Divisor" 188 (Bytes) nicht an allen Stellen, bzw. wird in der Hektik übergangen, oder er verirrt sich irgendwo dazwischen, und findet das erste Byte der 188-Sequenz nicht wieder.
Es wäre jedenfalls schonmal ein Ansatz, um an den entsprechenden Stellen anzusetzen. Das Ganze bezieht sich natürlich auf die DBox2, und getestet mit IDE-IF-Festplatte :wink: Könnte aber durchaus sein, dass dann hinterher auch NFS damit läuft.