MarkusE Magst du dir bitte beiliegende Version anschauen? And den XXX-Stellen möchte ich mir die Kommentare noch etwas anschauen, aber ansonsten sollte es aus meiner Sicht so passen.
Beiträge von kls
-
-
Wenn der Sender die Zeiten im Event korrekt anpasst, sollte es richtig funktionieren.
-
MarkusE Kann es sein, dass mit deinem Patch in dem Fall, dass vom Sender keine EIT-Daten kommen (aus welchen Gründen auch immer) die Aufnahme nie startet? In der bisherigen Version würde er zumindest die vorgegebene Zeit aufnehmen, aber durch das 'return false' im Falle, dass die Aufnahme noch nicht begonnen hat, wird sie auch nie beginnen.
-
Welchen Sinn macht es, Timer zu programmieren, von denen man von vornherein weiß, dass sie nicht gleichzeitig aufnehmen können?
Und warum beginnt Timer C verspätet?
-
Besteht die Möglichkeit den Wert in das Setup zu verlagern? Als Konstante im Code ist das doch eher etwas unflexibel.
Welchen Wert würdest du denn wählen, wenn es einstellbar wäre?
-
Was wäre denn stattdessen von folgender Variante zu halten?
Diff
Alles anzeigen--- timers.c 2024/03/03 15:47:09 5.19 +++ timers.c 2024/03/05 10:31:42 @@ -22,6 +22,7 @@ // value! #define VPSGRACE 15 // seconds we still record after the running status of a VPS event has changed to "not running" +#define PRIORITYGRACE 1 // --- cTimer ---------------------------------------------------------------- @@ -50,6 +51,7 @@ start = now->tm_hour * 100 + now->tm_min; stop = 0; vpsNotRunning = 0; + priorityGrace = 0; if (!Setup.InstantRecordTime && channel && (Instant || Pause)) { LOCK_SCHEDULES_READ; if (const cSchedule *Schedule = Schedules->GetSchedule(channel)) { @@ -190,6 +192,7 @@ remote = NULL; event = NULL; vpsNotRunning = 0; + priorityGrace = 0; if (!PatternTimer || PatternTimer->HasFlags(tfVps)) { if (Event->Vps() && (PatternTimer || Setup.UseVps)) SetFlags(tfVps); @@ -260,6 +263,7 @@ priority = Timer.priority; lifetime = Timer.lifetime; vpsNotRunning = 0; + priorityGrace = 0; strncpy(pattern, Timer.pattern, sizeof(pattern)); strncpy(file, Timer.file, sizeof(file)); free(aux); @@ -624,7 +628,16 @@ } else vpsNotRunning = 0; - return running || time(NULL) < vpsNotRunning + VPSGRACE; + if (running || time(NULL) < vpsNotRunning + VPSGRACE) + return true; + if (vpsNotRunning && t < event->EndTime()) { + if (!priorityGrace) + dsyslog("timer %s for event %s set grace priority to %d", *ToDescr(), *Event()->ToDescr(), PRIORITYGRACE); + priorityGrace = PRIORITYGRACE; + return true; + } + priorityGrace = 0; + return false; } // ...otherwise we fall back to normal timer handling below (note: Margin == 0!) } @@ -942,6 +955,7 @@ SetFlags(tfRecording); else ClrFlags(tfRecording); + priorityGrace = 0; isyslog("timer %s %s", *ToDescr(), Recording ? "start" : "stop"); } --- timers.h 2024/03/03 15:47:09 5.10 +++ timers.h 2024/03/05 10:08:21 @@ -46,6 +46,7 @@ int start; ///< the start and stop time of this timer as given by the user, int stop; ///< in the form hhmm, with hh (00..23) and mm (00..59) added as hh*100+mm int priority; + mutable int priorityGrace; int lifetime; mutable char pattern[NAME_MAX * 2 + 1]; // same size as 'file', to be able to initially fill 'pattern' with 'file' in the 'Edit timer' menu mutable char file[NAME_MAX * 2 + 1]; // *2 to be able to hold 'title' and 'episode', which can each be up to 255 characters long @@ -70,7 +71,7 @@ int WeekDays(void) const { return weekdays; } int Start(void) const { return start; } int Stop(void) const { return stop; } - int Priority(void) const { return priority; } + int Priority(void) const { return priorityGrace ? priorityGrace : priority; } int Lifetime(void) const { return lifetime; } const char *Pattern(void) const { return pattern; } const char *File(void) const { return file; }
- Ändert keine Interfaces.
- Wenn VPS+VPSGRACE abgelaufen ist, wird mit niedriger Priorität weiter bis zum Ende der Event-Zeit aufgenommen, womit auch gleichzeitig sichergestellt ist, dass der Event aktuell bleibt.
- Evtl. wäre noch darüber nachzudenken, ob priorityGrace '1' sein soll, oder besser 'priority - 1', oder ganz anders.
-
Ich denke mal, es müsste auch gehen, wenn lastScan auf 0 initialisiert und entsprechend abgefragt wird.
Bitte schau dir mal beiliegende Fassung an und sag Bescheid, ob das so OK wäre.
Die dsyslog() Ausgaben habe ich zu Testen noch aktiv gelassen, die werde ich am Schluss noch auskommentieren.
-
Was genau hat es denn mit 'firstCall' auf sich?
Ist das nicht bereits dadurch klar, ob es eine scanList gibt?
Übersehe ich da was?
-
An dieser Stelle mal wieder der Hinweis, dass ich Beiträge immer gerne in HISTORY und CONTRIBUTORS namentlich nenne, sofern mir der Realname bekannt ist.
-
Ich denke, es sollte eher so aussehen:
Diff
Alles anzeigen--- recording.c 2024/01/24 13:24:51 5.26 +++ recording.c 2024/03/04 14:03:44 @@ -1543,7 +1543,8 @@ dsyslog("activated name checking for initial read of video directory"); initial = false; } - if (Recordings == deletedRecordings || initial || !Recordings->GetByName(buffer)) { + cRecording *Recording = NULL; + if (Recordings == deletedRecordings || initial || !(Recording = Recordings->GetByName(buffer))) { cRecording *r = new cRecording(buffer); if (r->Name()) { r->NumFrames(); // initializes the numFrames member @@ -1557,6 +1558,8 @@ else delete r; } + else if (Recording) + Recording->ReadInfo(); StateKey.Remove(); } else
Ansonsten wird das info File auch für DeletedRecordings gelesen, was unnötig ist.
Ausserdem sollte nicht info->Read() direkt aufgerufen werden, sondern Recording->ReadInfo(), da sich ja u.U. auch andere Parameter geändert haben könnten.
Bitte damit nochmal testen.
-
Was passiert denn, wenn eine Klasse von cDevice ableitet und MaySwitchTransponder selbst nicht implementiert? Dann müsste doch neu kompilieren reichen (?).
Dann ja.
Und was passiert, wenn wenn eine Klasse von cDevice ableitet und MaySwitchTransponder selbst implementiert?
error: 'virtual bool cDevice::MaySwitchTransponder(const cChannel*, int) const'
was hidden [-Werror=overloaded-virtual]
Welche Änderungen mussten damals in den Plugins, die cDevice ableiten, durchgeführt werden?
Sie mussten den neuen Parameter hinzufügen.
-
-
MarkusE Hilf mir mal bitte, ich sehe irgendwie nicht, wie dieser Patch das Starten der Threads verhindert.
-
Dieser Patch ändert das Interface von cDevice::MaySwitchTransponder(). Wenn ich ihn übernehme, müssten alle Plugins, die von cDevice ableiten (z.B. sat-ip, iptv), entsprechend geändert werden. Ein einfaches Neucompilieren würde da nicht reichen.
Welche dieser
dreizwei Vorgehensweisen soll es sein?1. eine neue Developer-Version
2. ein Macro, das diese Änderung aktiviert (default: deaktiviert)
3. einfach einbauen und es "krachen" lassen -
Wobei ich mittlerweile eher zu der Aussage
Aber wie kann bei %u ein encoding error auftauchen - das sind doch nur Zahlen.
tendiere - wenn es nur um Zahlen geht, kann da doch eigentlich nichts schiefgehen.
Ich werde die Stelle also wohl erstmal so lassen, wie sie ist.
-
Ich glaube, so wäre korrekter.
Da muss ich nochmal nachhaken. Wieso wurde aus der 2 eine 1?
Eigentlich müsste es doch sogar 3 sein. Wenn sprintf() aufgerufen wird, ist das erste Byte von buffer schon mit dem Code ('S', 'T',...) belegt, also -1. Es muss aber noch Platz bleiben für das 'W' oder 'E' (-2), sowie für die abschließende 0 (-3).Die Prüfung auf 'l < (sizeof(buffer) - 1' ist m.E. unnötig, da das snprintf() schon sicherstellt.Korrektur: Hab gerade nochmal 'man snprintf' gelesen.
Also eher so (oder übersehe ich was?):
Code
Alles anzeigencString cSource::ToString(int Code) { char buffer[16]; char *q = buffer; *q++ = (Code & st_Mask) >> 24; if (int n = Position(Code)) { int l = snprintf(q, sizeof(buffer) - 2, "%u.%u", abs(n) / 10, abs(n) % 10); // can't simply use "%g" here since the silly 'locale' messes up the decimal point if (l > 0) { q += l; *q++ = (n < 0) ? 'W' : 'E'; } } *q = 0; return buffer; }
-
Würde es dir etwas ausmachen eine Datei namens .gitignore in VDR aufzunehmen?
Ja. Ich mag ich keine Dot-Dateien ausliefern.
-
Nachdem es schon etliche friends gibt, durchaus sinnvoll.
-
Hier der komplette Patch inklusive menu.c.
-
Hier mal der erste Teil der Änderungen als Patch.
Sieht gut aus.
Ich hab noch die nicht mehr benötigten "mutable" sowie die Deklaration von nameSourceMode entfernt.
Anbei der Patch, wie ich ihn übernehmen würde.
Den Teil in menu.c kann ich selber machen.