The Channel+/- keys can now be used to jump between errors while replaying a recording

This commit is contained in:
Klaus Schmidinger 2024-10-11 14:10:50 +02:00
parent 5a626fef9f
commit b4c538cff7
5 changed files with 53 additions and 4 deletions

View File

@ -3368,6 +3368,7 @@ Stefan Hofmann <stefan.hofmann@t-online.de>
for suggesting to implement support for remote controls that only have a combined
"Play/Pause" key instead of separate keys for "Play" and "Pause"
for a fix for compilers that don't like non-constant format strings
for suggesting to implement jumping between errors while replaying a recording
Stefan Blochberger <Stefan.Blochberger@gmx.de>
for suggesting to automatically display the progress display whenever replay of a

View File

@ -10030,3 +10030,5 @@ Video Disk Recorder Revision History
(reported by Markus Ehrnsperger, fix suggested by Winfried Köhler).
- Fixed expiring of one-time VPS timers in case there is more than one event with the
same VPS time (suggested by Markus Ehrnsperger).
- The Channel+/- keys can now be used to jump between errors while replaying a recording
(suggested by Stefan Hofmann).

4
MANUAL
View File

@ -50,8 +50,8 @@ Version 2.7
Next Next/previous channel group (in live tv mode)
Prev or next/previous editing mark (in replay mode)
Channel+ channel up
Channel- channel down
Channel+ channel up (live view), next error (replay)
Channel- channel down (live view), previous error (replay)
PrevChannel previous channel
Power shutdown

47
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.c 5.17 2024/09/19 09:49:02 kls Exp $
* $Id: menu.c 5.18 2024/10/11 14:10:50 kls Exp $
*/
#include "menu.h"
@ -6097,6 +6097,47 @@ void cReplayControl::MarkMove(int Frames, bool MarkRequired)
}
}
void cReplayControl::ErrorJump(bool Forward)
{
const cErrors *Errors = GetErrors();
int NumErrors = Errors ? Errors->Size() : 0;
if (NumErrors > 0) {
int Current, Total;
if (GetIndex(Current, Total)) {
if (Forward) {
int Offset = 0;
for (int i = 0; i < NumErrors; i++) {
int Position = Errors->At(i);
if (Position > Current + Offset) {
int NextIFrame = SkipFrames(Position - Current) + Offset; // this takes us to the I-frame at or right after Position
if (NextIFrame > Position) {
if (SkipFrames(Offset + 1) == NextIFrame) { // means Current is the I-frame right before Position
Offset = NextIFrame - Current;
continue;
}
}
Goto(Position, true); // this takes us to the I-frame at or right before Position
return;
}
}
if (Current < Total)
Goto(Total, true);
}
else {
for (int i = NumErrors - 1; i >= 0; i--) {
if (Errors->At(i) < Current) {
int Position = Errors->At(i);
Goto(Position, true); // this takes us to the I-frame at or right before Position
return;
}
}
if (Current > 0)
Goto(0, true);
}
}
}
}
void cReplayControl::EditCut(void)
{
if (*fileName) {
@ -6241,6 +6282,10 @@ eOSState cReplayControl::ProcessKey(eKeys Key)
case kMarkSkipBack: MarkMove(-adaptiveSkipper.GetValue(RAWKEY(Key)), false); break;
case kMarkSkipForward|k_Repeat:
case kMarkSkipForward: MarkMove(+adaptiveSkipper.GetValue(RAWKEY(Key)), false); break;
case kChanUp|k_Repeat:
case kChanUp: ErrorJump(true); break;
case kChanDn|k_Repeat:
case kChanDn: ErrorJump(false); break;
case kEditCut: EditCut(); break;
case kEditTest: EditTest(); break;
default: {

3
menu.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.h 5.4 2024/09/19 09:49:02 kls Exp $
* $Id: menu.h 5.5 2024/10/11 14:10:50 kls Exp $
*/
#ifndef __MENU_H
@ -316,6 +316,7 @@ private:
void MarkToggle(void);
void MarkJump(bool Forward);
void MarkMove(int Frames, bool MarkRequired);
void ErrorJump(bool Forward);
void EditCut(void);
void EditTest(void);
public: