Ticket #4492: playspeeds.patch
File playspeeds.patch, 11.8 KB (added by , 16 years ago) |
---|
-
libs/libmythtv/tv_play.h
444 444 445 445 bool smartForward; 446 446 int stickykeys; 447 float ff_rew_repos;448 447 bool ff_rew_reverse; 449 448 bool jumped_back; ///< Used by PromptDeleteRecording 450 449 vector<int> ff_rew_speeds; 450 vector<int> slowmo_speeds; 451 vector<float> ff_rew_repos; 451 452 452 453 uint vbimode; 453 454 … … 524 525 */ 525 526 float normal_speed; 526 527 float prev_speed; 528 float current_speed; 527 529 528 530 float frameRate; ///< Estimated framerate from recorder 529 531 -
libs/libmythtv/tv_play.cpp
497 497 osd_general_timeout(2), osd_prog_info_timeout(3), 498 498 autoCommercialSkip(CommSkipOff), tryUnflaggedSkip(false), 499 499 smartForward(false), stickykeys(0), 500 ff_rew_re pos(1.0f), ff_rew_reverse(false),500 ff_rew_reverse(false), 501 501 jumped_back(false), 502 502 vbimode(VBIMode::None), 503 503 // State variables … … 528 528 // Fast forward state 529 529 doing_ff_rew(0), ff_rew_index(0), speed_index(0), 530 530 // Time Stretch state 531 normal_speed(1.0f), prev_speed(1.5f), 531 normal_speed(1.0f), prev_speed(1.5f), current_speed(1.0f), 532 532 // Estimated framerate from recorder 533 533 frameRate(30.0f), 534 534 // CC/Teletext input state variables … … 627 627 tryUnflaggedSkip = gContext->GetNumSetting("TryUnflaggedSkip", 0); 628 628 smartForward = gContext->GetNumSetting("SmartForward", 0); 629 629 stickykeys = gContext->GetNumSetting("StickyKeys"); 630 ff_rew_repos = gContext->GetNumSetting("FFRewReposTime", 100)/100.0;631 630 ff_rew_reverse = gContext->GetNumSetting("FFRewReverse", 1); 632 int def[8] = { 3, 5, 10, 20, 30, 60, 120, 180 };633 for (uint i = 0; i < sizeof(def)/sizeof(def[0]); i++)634 ff_rew_speeds.push_back(635 gContext->GetNumSetting(QString("FFRewSpeed%1").arg(i), def[i]));636 631 632 int def1[8] = {3, 5, 10, 20, 30, 60, 120, 180}; 633 int def_repos = gContext->GetNumSetting("FFRewReposTime", 100); 634 for (uint i = 0; i < sizeof(def1)/sizeof(def1[0]); i++) 635 { 636 int speed = gContext->GetNumSetting(QString("FFRewSpeed%1").arg(i), 637 def1[i]); 638 if (speed > 0) 639 { 640 ff_rew_speeds.push_back(speed); 641 int repos = gContext->GetNumSetting(QString("FFRewReposTime%1"). 642 arg(i), def_repos); 643 if (repos < 0) repos = def_repos; 644 ff_rew_repos.push_back(repos / 100.0); 645 }; 646 }; 647 648 int def2[4] = {3, 8, 16, 0}; 649 for (uint i = 0; i < sizeof(def2)/sizeof(def2[0]); i++) 650 { 651 int speed = gContext->GetNumSetting(QString("SlowMotionSpeed%1"). 652 arg(i), def2[i]); 653 if (speed > 0) 654 slowmo_speeds.push_back(speed); 655 }; 656 657 658 659 637 660 vbimode = VBIMode::Parse(gContext->GetSetting("VbiFormat")); 638 661 639 662 if (createWindow) … … 1946 1969 speed_index = 0; 1947 1970 sleep_index = 0; 1948 1971 normal_speed = 1.0f; 1972 current_speed = normal_speed; 1949 1973 1950 1974 pbinfoLock.lock(); 1951 1975 if (playbackinfo) … … 2030 2054 ff_rew_index = kInitFFRWSpeed; 2031 2055 speed_index = 0; 2032 2056 normal_speed = 1.0f; 2057 current_speed = 1.0f; 2033 2058 sleep_index = 0; 2034 2059 2035 2060 int updatecheck = 0; … … 2279 2304 speed_index = 0; 2280 2305 doing_ff_rew = 0; 2281 2306 ff_rew_index = kInitFFRWSpeed; 2307 current_speed = normal_speed; 2282 2308 UpdateOSDSeekMessage(PlayMesg(), osd_general_timeout); 2283 2309 } 2284 2310 … … 2288 2314 { 2289 2315 // got changed in nvp due to close to end of file 2290 2316 normal_speed = 1.0f; 2317 current_speed = 1.0f; 2318 2291 2319 UpdateOSDSeekMessage(PlayMesg(), osd_general_timeout); 2292 2320 } 2293 2321 … … 3552 3580 { 3553 3581 StopFFRew(); 3554 3582 normal_speed = 1.0f; 3583 current_speed = 1.0f; 3555 3584 ChangeTimeStretch(0, false); 3556 3585 3557 3586 return; … … 3602 3631 stretch >= 0.48) 3603 3632 { 3604 3633 normal_speed = stretch; // alter speed before display 3634 current_speed = normal_speed; 3605 3635 ChangeTimeStretch(0, false); 3606 3636 } 3607 3637 } … … 3613 3643 if (paused) 3614 3644 DoPause(); 3615 3645 3616 if (tokens[2] == "16x") 3617 ChangeSpeed(5 - speed_index); 3618 else if (tokens[2] == "8x") 3619 ChangeSpeed(4 - speed_index); 3620 else if (tokens[2] == "4x") 3621 ChangeSpeed(3 - speed_index); 3622 else if (tokens[2] == "3x") 3623 ChangeSpeed(2 - speed_index); 3624 else if (tokens[2] == "2x") 3625 ChangeSpeed(1 - speed_index); 3626 else if (tokens[2] == "1x") 3627 ChangeSpeed(0 - speed_index); 3628 else if (tokens[2] == "1/2x") 3629 ChangeSpeed(-1 - speed_index); 3630 else if (tokens[2] == "1/3x") 3631 ChangeSpeed(-2 - speed_index); 3632 else if (tokens[2] == "1/4x") 3633 ChangeSpeed(-3 - speed_index); 3634 else if (tokens[2] == "1/8x") 3635 ChangeSpeed(-4 - speed_index); 3636 else if (tokens[2] == "1/16x") 3637 ChangeSpeed(-5 - speed_index); 3646 for (uint i = 0; i < slowmo_speeds.size(); i++) 3647 { 3648 if (tokens[2] == QString("1/%1x").arg(slowmo_speeds[i])) 3649 { 3650 ChangeSpeed(-i - 1 - speed_index); 3651 break; 3652 }; 3653 }; 3638 3654 } 3639 3655 else 3640 3656 VERBOSE(VB_IMPORTANT, … … 3671 3687 { 3672 3688 QString speedStr; 3673 3689 3674 switch (speed_index) 3690 speedStr = QString("%1X").arg(current_speed); 3691 if ((current_speed > 0.0f) && (current_speed < 1.0f) && (speed_index != 0)) 3675 3692 { 3676 case 4: speedStr = "16x"; break; 3677 case 3: speedStr = "8x"; break; 3678 case 2: speedStr = "3x"; break; 3679 case 1: speedStr = "2x"; break; 3680 case 0: speedStr = "1x"; break; 3681 case -1: speedStr = "1/3x"; break; 3682 case -2: speedStr = "1/8x"; break; 3683 case -3: speedStr = "1/16x"; break; 3684 case -4: speedStr = "0x"; break; 3685 default: speedStr = "1x"; break; 3686 } 3693 speedStr = QString("1/%1X").arg(slowmo_speeds[-speed_index - 1]); 3694 }; 3687 3695 3688 if (doing_ff_rew == -1)3689 speedStr = QString("-%1").arg(speedStr);3690 else if (normal_speed != 1.0)3691 speedStr = QString("%1X").arg(normal_speed);3692 3693 3696 struct StatusPosInfo posInfo; 3694 3697 nvp->calcSliderPos(posInfo, true); 3695 3698 … … 3966 3969 time = StopFFRew(); 3967 3970 activenvp->Play(normal_speed, true); 3968 3971 speed_index = 0; 3972 current_speed = normal_speed; 3969 3973 } 3970 3974 else if (paused || (speed_index != 0)) 3971 3975 { 3972 3976 activenvp->Play(normal_speed, true); 3973 3977 paused = false; 3974 3978 speed_index = 0; 3979 current_speed = normal_speed; 3975 3980 } 3976 3981 3977 3982 … … 4017 4022 if (paused) 4018 4023 { 4019 4024 activenvp->Play(normal_speed, true); 4025 current_speed = normal_speed; 4020 4026 } 4021 4027 else 4022 4028 { … … 4028 4034 } 4029 4035 4030 4036 activenvp->Pause(); 4037 current_speed = 0; 4031 4038 } 4032 4039 4033 4040 paused = !paused; … … 4130 4137 return; 4131 4138 4132 4139 speed_index = 0; 4140 current_speed = normal_speed; 4133 4141 activenvp->Play(normal_speed, true); 4134 4142 } 4135 4143 … … 4138 4146 int old_speed = speed_index; 4139 4147 4140 4148 if (paused) 4141 speed_index = - 4;4149 speed_index = -slowmo_speeds.size() - 1; 4142 4150 4143 4151 speed_index += direction; 4144 4152 … … 4146 4154 float speed; 4147 4155 QString mesg; 4148 4156 4149 switch (speed_index)4157 if (speed_index == 0) 4150 4158 { 4151 case 4: speed = 16.0; mesg = QString(tr("Speed 16X")); break; 4152 case 3: speed = 8.0; mesg = QString(tr("Speed 8X")); break; 4153 case 2: speed = 3.0; mesg = QString(tr("Speed 3X")); break; 4154 case 1: speed = 2.0; mesg = QString(tr("Speed 2X")); break; 4155 case 0: speed = 1.0; mesg = PlayMesg(); break; 4156 case -1: speed = 1.0 / 3; mesg = QString(tr("Speed 1/3X")); break; 4157 case -2: speed = 1.0 / 8; mesg = QString(tr("Speed 1/8X")); break; 4158 case -3: speed = 1.0 / 16; mesg = QString(tr("Speed 1/16X")); break; 4159 case -4: DoPause(); return; break; 4160 default: speed_index = old_speed; return; break; 4159 speed = normal_speed; 4160 mesg = PlayMesg(); 4161 4161 } 4162 else if (speed_index > 0) 4163 { 4164 speed_index = min(speed_index, (int)ff_rew_speeds.size()); 4165 speed = ff_rew_speeds[speed_index - 1]; 4166 mesg = QString(tr("Speed")+(" %1X")).arg(speed); 4167 } 4168 else if (speed_index >= (int)-slowmo_speeds.size()) 4169 { 4170 int divisor = slowmo_speeds[-speed_index - 1]; 4171 speed = 1.0f / divisor; 4172 mesg = QString(tr("Speed")+(" 1/%1X")).arg(divisor); 4173 } 4174 else 4175 { 4176 DoPause(); 4177 return; 4178 }; 4162 4179 4163 if (!activenvp->Play( (speed_index==0)?normal_speed:speed, speed_index==0))4180 if (!activenvp->Play(speed, speed_index==0)) 4164 4181 { 4165 4182 speed_index = old_speed; 4166 4183 return; 4167 4184 } 4185 current_speed = speed; 4168 4186 4169 4187 paused = false; 4170 4188 DoNVPSeek(time); … … 4179 4197 return time; 4180 4198 4181 4199 if (doing_ff_rew > 0) 4182 time = -ff_rew_speeds[ff_rew_index] * ff_rew_repos ;4200 time = -ff_rew_speeds[ff_rew_index] * ff_rew_repos[ff_rew_index]; 4183 4201 else 4184 time = ff_rew_speeds[ff_rew_index] * ff_rew_repos ;4202 time = ff_rew_speeds[ff_rew_index] * ff_rew_repos[ff_rew_index]; 4185 4203 4186 4204 doing_ff_rew = 0; 4187 4205 ff_rew_index = kInitFFRWSpeed; 4206 current_speed = normal_speed; 4188 4207 4189 4208 activenvp->Play(normal_speed, true); 4190 4209 … … 4248 4267 speed = -ff_rew_speeds[ff_rew_index]; 4249 4268 } 4250 4269 4270 current_speed = (float)speed; 4251 4271 activenvp->Play((float)speed, (speed == 1) && (doing_ff_rew > 0)); 4252 4272 UpdateOSDSeekMessage(mesg, -1); 4253 4273 } … … 5897 5917 normal_speed = new_normal_speed; 5898 5918 5899 5919 if (!paused) 5920 { 5900 5921 activenvp->Play(normal_speed, true); 5922 current_speed = normal_speed; 5923 }; 5901 5924 5902 5925 QString text = QString(tr("Time Stretch %1X")).arg(normal_speed); 5903 5926 … … 7311 7334 int i = ((kAspect_14_9 == j) ? kAspect_16_9 : 7312 7335 ((kAspect_16_9 == j) ? kAspect_14_9 : j)); 7313 7336 7314 7337 bool sel = (i != kAspect_Off) ? (aspectoverride == i) : 7315 7338 (aspectoverride <= kAspect_Off) || (aspectoverride >= kAspect_END); 7316 7339 subitem = new OSDGenericTree(item, toString((AspectOverrideMode) i), 7317 7340 QString("TOGGLEASPECT%1").arg(i), … … 7322 7345 item = new OSDGenericTree(treeMenu, tr("Adjust Fill")); 7323 7346 for (int i = kAdjustFill_Off; i < kAdjustFill_END; i++) 7324 7347 { 7325 7348 bool sel = (i != kAdjustFill_Off) ? (adjustfill == i) : 7326 7349 (adjustfill <= kAdjustFill_Off) || (adjustfill >= kAdjustFill_END); 7327 7350 subitem = new OSDGenericTree(item, toString((AdjustFillMode) i), 7328 7351 QString("TOGGLEFILL%1").arg(i), … … 8042 8065 chain->JumpTo(-1, 1); 8043 8066 8044 8067 activenvp->Play(normal_speed, true, false); 8068 current_speed = normal_speed; 8045 8069 activerbuffer->IgnoreLiveEOF(false); 8046 8070 } 8047 8071