[mythtv] Patch: FF/Rew single-key speed toggle w/feedback

Joseph A. Caputo jcaputo1 at comcast.net
Wed Mar 5 00:24:02 EST 2003


I don't know about anyone else, but I hate having to move my fingers
over to the number keys on the remote when I want to change the FF/Rew
speed.  So, I took a cue from my DVD player remote and wrote this
patch.  On my DVD player, which supports up to 16X FF/Rew, each
successive press of the FF or Rew key cycles the speed up to the next
increment, while displaying feedback on the OSD, i.e., "2X", "4X", etc. 
I've tried to do something similar here.  The only thing is, I wasn't
sure how the FF/Rew scaling factor relates to the "true" playback speed,
so I made some guesses, which are probably wrong.

I there is interest in this modification, I'd appreciate feedback on a
few things:

- Text to display for each scale factor
- When you reach the max. speed in either direction, should it "roll
over" to the first speed, or should it exit FF/Rew mode?  (My DVD player
does the latter, but I currently have the code doing the former)

Also, at the moment I have the FF/Rew always starting at scale factor
1.0, and then when it rolls over it cycles through 0, 0.25 & 0.50. 
Obviously this would have to change if the rollover behavior is
elminated.

Also included in this patch is a minor bugfix where the code retained an
indication of being in FF or Rew mode for one extra keypress when
StickKeys was OFF.

Feedback is greatly appreciated.

-Joe C.




-------------- next part --------------
? MC.diff
? nohup.out
? libs/libvbitext/.qmake.internal.cache
? programs/mythprogfind/.qmake.internal.cache
Index: libs/libmythtv/tv_play.cpp
===================================================================
RCS file: /var/lib/cvs/MC/libs/libmythtv/tv_play.cpp,v
retrieving revision 1.34
diff -u -d -r1.34 tv_play.cpp
--- libs/libmythtv/tv_play.cpp	3 Mar 2003 04:54:53 -0000	1.34
+++ libs/libmythtv/tv_play.cpp	5 Mar 2003 05:10:03 -0000
@@ -43,6 +43,37 @@
 #define wsEnter         0x8d + 256
 #define wsReturn        0x0d + 256
 
+enum SeekSpeeds {
+  SSPEED_NORMAL_WITH_DISPLAY,
+  SSPEED_SLOW_1,
+  SSPEED_SLOW_2,
+  SSPEED_NORMAL,
+  SSPEED_FAST_1,
+  SSPEED_FAST_2,
+  SSPEED_FAST_3,
+  SSPEED_FAST_4,
+  SSPEED_FAST_5,
+  SSPEED_FAST_6,
+  SSPEED_MAX
+};
+
+struct SeekSpeedInfo {
+  QString   dispString;
+  float  scaling;
+};
+
+SeekSpeedInfo  seek_speed_array[] =
+  {{"", 0.0},
+   {"1/4X", 0.25},
+   {"1/2X", 0.50},
+   {"1X", 1.00},
+   {"1.5X", 1.50},
+   {"2X", 2.24},
+   {"3X", 3.34},
+   {"8X", 7.48},
+   {"10X", 11.18},
+   {"16X", 16.72}};
+
 void *SpawnDecode(void *param)
 {
     NuppelVideoPlayer *nvp = (NuppelVideoPlayer *)param;
@@ -543,6 +574,7 @@
     paused = false;
     doing_ff = false;
     doing_rew = false;
+    ff_rew_index = SSPEED_NORMAL;
     ff_rew_scaling = 1.0;
 
     nvp = NULL;
@@ -594,6 +626,7 @@
     stickykeys = gContext->GetNumSetting("StickyKeys");
     doing_ff = false;
     doing_rew = false;
+    ff_rew_index = SSPEED_NORMAL;
     ff_rew_scaling = 1.0;
 
     int pausecheck = 0;
@@ -623,7 +656,7 @@
                     DoFF();
                 else if (doing_rew)
                     DoRew();
-                if (ff_rew_scaling > 0)
+                if (ff_rew_index > SSPEED_NORMAL)
                     usleep(50000);
             }
         }
@@ -760,14 +793,46 @@
         }
         case wsRight: case 'd': case 'D': 
         {
-            doing_ff = true;
+	  if (stickykeys)
+	    {
+	      if (doing_ff)
+		{
+		  ff_rew_index = (++ff_rew_index % SSPEED_MAX);
+		}
+	      else
+		{
+		  doing_ff = true;
+		  ff_rew_index = SSPEED_NORMAL;
+		}
+	    }
+	  else
+	    {
+	      ff_rew_index = SSPEED_NORMAL;
+	    }
+
             doing_rew = false;
             DoFF(); 
             break;
         }
         case wsLeft: case 'a': case 'A': 
         {
-            doing_rew = true;
+	  if (stickykeys)
+	    {
+	      if (doing_rew)
+		{
+		  ff_rew_index = (++ff_rew_index % SSPEED_MAX);
+		}
+	      else
+		{
+		  doing_rew = true;
+		  ff_rew_index = SSPEED_NORMAL;
+		}
+	    }
+	  else
+	    {
+	      ff_rew_index = SSPEED_NORMAL;
+	    }
+
             doing_ff = false;
             DoRew(); 
             break;
@@ -817,16 +882,16 @@
             {
                 switch (keypressed)
                 {
-                    case wsZero:   case '0': ff_rew_scaling =  0.00; break;
-                    case wsOne:    case '1': ff_rew_scaling =  0.25; break;
-                    case wsTwo:    case '2': ff_rew_scaling =  0.50; break;
-                    case wsThree:  case '3': ff_rew_scaling =  1.00; break;
-                    case wsFour:   case '4': ff_rew_scaling =  1.50; break;
-                    case wsFive:   case '5': ff_rew_scaling =  2.24; break;
-                    case wsSix:    case '6': ff_rew_scaling =  3.34; break;
-                    case wsSeven:  case '7': ff_rew_scaling =  7.48; break;
-                    case wsEight:  case '8': ff_rew_scaling = 11.18; break;
-                    case wsNine:   case '9': ff_rew_scaling = 16.72; break;
+                    case wsZero:   case '0': ff_rew_index = SSPEED_NORMAL_WITH_DISPLAY; break;
+                    case wsOne:    case '1': ff_rew_index = SSPEED_SLOW_1; break;
+                    case wsTwo:    case '2': ff_rew_index = SSPEED_SLOW_2; break;
+                    case wsThree:  case '3': ff_rew_index = SSPEED_NORMAL; break;
+                    case wsFour:   case '4': ff_rew_index = SSPEED_FAST_1; break;
+                    case wsFive:   case '5': ff_rew_index = SSPEED_FAST_2; break;
+                    case wsSix:    case '6': ff_rew_index = SSPEED_FAST_3; break;
+                    case wsSeven:  case '7': ff_rew_index = SSPEED_FAST_4; break;
+                    case wsEight:  case '8': ff_rew_index = SSPEED_FAST_5; break;
+                    case wsNine:   case '9': ff_rew_index = SSPEED_FAST_6; break;
 
                     default:
                        doing_ff = false;
@@ -1119,11 +1184,15 @@
     if (internalState == kState_WatchingLiveTV)
         slidertype = true;
 
+    ff_rew_scaling = seek_speed_array[ff_rew_index].scaling;
+    QString scaleString = "Forward ";
+    scaleString += seek_speed_array[ff_rew_index].dispString;
+
     if (activenvp == nvp)
     {
         QString desc = "";
         int pos = calcSliderPos((int)(fftime * ff_rew_scaling), desc);
-        osd->StartPause(pos, slidertype, "Forward", desc, 2);
+        osd->StartPause(pos, slidertype, scaleString, desc, 2);
     }
 
     activenvp->FastForward(fftime * ff_rew_scaling);
@@ -1135,11 +1204,15 @@
     if (internalState == kState_WatchingLiveTV)
         slidertype = true;
 
+    ff_rew_scaling = seek_speed_array[ff_rew_index].scaling;
+    QString scaleString = "Rewind ";
+    scaleString += seek_speed_array[ff_rew_index].dispString;
+
     if (activenvp == nvp)
     {
         QString desc = "";
         int pos = calcSliderPos(0 - (int)(rewtime * ff_rew_scaling), desc);
-        osd->StartPause(pos, slidertype, "Rewind", desc, 2);
+        osd->StartPause(pos, slidertype, scaleString, desc, 2);
     }
 
     activenvp->Rewind(rewtime * ff_rew_scaling);
Index: libs/libmythtv/tv_play.h
===================================================================
RCS file: /var/lib/cvs/MC/libs/libmythtv/tv_play.h,v
retrieving revision 1.20
diff -u -d -r1.20 tv_play.h
--- libs/libmythtv/tv_play.h	3 Mar 2003 04:54:53 -0000	1.20
+++ libs/libmythtv/tv_play.h	5 Mar 2003 05:10:03 -0000
@@ -141,6 +141,7 @@
     int stickykeys;
     bool doing_ff;
     bool doing_rew;
+    int ff_rew_index;
     float ff_rew_scaling;
 
     OSD *osd;


More information about the mythtv-dev mailing list