Bei mir sieht das so aus:
--- dvbplayer.c.orig 2024-10-26 18:26:01.000000000 +0200
+++ dvbplayer.c 2024-10-30 15:52:52.000000000 +0100
@@ -740,19 +740,26 @@
void cDvbPlayer::Play(void)
{
+ bool resyncAfterSlowForward = false;
if (playMode != pmPlay) {
LOCK_THREAD;
if (playMode == pmStill || playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) {
if (!(DeviceHasIBPTrickSpeed() && playDir == pdForward))
Empty();
}
+ if (playMode == pmSlow && playDir == pdForward) {
+ resyncAfterPause = true;
+ resyncAfterSlowForward = true;
+ }
DevicePlay();
playMode = pmPlay;
playDir = pdForward;
if (resyncAfterPause) {
- int Current, Total;
- if (GetIndex(Current, Total, true))
+ int Current, Total;
+ if (GetIndex(Current, Total, resyncAfterSlowForward ? false : true)) {
+ Empty();
Goto(Current);
+ }
resyncAfterPause = false;
}
}
Display More
GoTo verwende ich also doch, ermittle aber den Index bei einer vorherigen "Zeitlupe vorwärts" nicht mit SnapToIFrame
bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false);
// Returns the current and total frame index, optionally snapped to the
// nearest I-frame.
Ob der zusätzliche Empty()-Aufruf bei jedem resyncAfterPause notwendig ist oder nicht auch von resyncAfterSlowForward abhängig sein sollte, muss ich mir nochmal anschauen.
softhdodroid hat weiter keine Änderungen. void Mute() enthält
SkipAudio = 1;
AudioFlushBuffers();
Quote
Meine Vermutung: softhddevice setzt durch das DeviceMute SkipAudio, was dem VDR durch die Rückgabe von size in PlayAudio() signalisiert, dass die Audiopakete angenommen worden sind. Die landen aber nicht im Ringbuffer. Bei Mute ist das schon richtig, weil die PTS ja weiterlaufen soll und dem VDR vorgetäuscht wird, dass die Audiopakete verarbeitet wurden. Bei Trickspeed ist das aber schlecht.
Ja, das dürfte eine zutreffende Analyse sein. Was ich noch nicht sicher weiss: was ist mit StreamFreezed = 1;, das in Freeze gesetzt wird? Ich glaube das bleibt auch bei der Zeitlupe so. Das führt dann dazu, dass PlayAudio return 0 zurückgibt (wenn SkipAudio nicht gesetzt ist, was zu return size führen würde).
Besser wäre es, wir finden einen anderen Weg den alsa-Ton stumm zu schalten. Aber das scheint wohl nur über den alsamixer zu gehen und es dürfte schwierig sein, das in C++ mit einem für alle Umgebungen passenden Code zu machen (?)
Ohne SkipAudio und ohne AudioFlushBuffers in Mute funktioniert alles wie es soll- aber die Zeitlupe bleibt nach einiger Zeit stehen, weil vdr das Senden weiterer Videopakete einstellt. Da PlayAudio dann 0 zurückgibt, unterstellt vdr wohl, dass das device auch nicht mehr in der Lage ist, Videopakete anzunehmen. siehe auch RE: Rückgabewert von cDevice::Poll wird ignoriert
virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
///< Plays the given data block as audio.
///< Data points to exactly one complete PES packet of the given Length.
///< Id indicates the type of audio data this packet holds.
///< PlayAudio() shall process the packet either as a whole (returning
///< Length) or not at all (returning 0 or -1 and setting 'errno' accordingly).
///< Returns the number of bytes actually taken from Data, or -1
///< in case of an error.