Ticket #4492: playspeeds.patch

File playspeeds.patch, 11.8 KB (added by Ron Frazier <ron@…>, 4 years ago)

supports configurable playback speeds

  • libs/libmythtv/tv_play.h

     
    444444 
    445445    bool    smartForward; 
    446446    int     stickykeys; 
    447     float   ff_rew_repos; 
    448447    bool    ff_rew_reverse; 
    449448    bool    jumped_back; ///< Used by PromptDeleteRecording  
    450449    vector<int> ff_rew_speeds; 
     450    vector<int> slowmo_speeds; 
     451    vector<float> ff_rew_repos; 
    451452 
    452453    uint    vbimode; 
    453454 
     
    524525     */ 
    525526    float normal_speed;  
    526527    float prev_speed; 
     528    float current_speed; 
    527529 
    528530    float frameRate;     ///< Estimated framerate from recorder 
    529531 
  • libs/libmythtv/tv_play.cpp

     
    497497      osd_general_timeout(2), osd_prog_info_timeout(3), 
    498498      autoCommercialSkip(CommSkipOff), tryUnflaggedSkip(false), 
    499499      smartForward(false), stickykeys(0), 
    500       ff_rew_repos(1.0f), ff_rew_reverse(false), 
     500      ff_rew_reverse(false), 
    501501      jumped_back(false), 
    502502      vbimode(VBIMode::None), 
    503503      // State variables 
     
    528528      // Fast forward state 
    529529      doing_ff_rew(0), ff_rew_index(0), speed_index(0), 
    530530      // 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), 
    532532      // Estimated framerate from recorder 
    533533      frameRate(30.0f), 
    534534      // CC/Teletext input state variables 
     
    627627    tryUnflaggedSkip     = gContext->GetNumSetting("TryUnflaggedSkip", 0); 
    628628    smartForward         = gContext->GetNumSetting("SmartForward", 0); 
    629629    stickykeys           = gContext->GetNumSetting("StickyKeys"); 
    630     ff_rew_repos         = gContext->GetNumSetting("FFRewReposTime", 100)/100.0; 
    631630    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])); 
    636631 
     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 
    637660    vbimode = VBIMode::Parse(gContext->GetSetting("VbiFormat")); 
    638661 
    639662    if (createWindow) 
     
    19461969    speed_index = 0; 
    19471970    sleep_index = 0; 
    19481971    normal_speed = 1.0f; 
     1972    current_speed = normal_speed; 
    19491973 
    19501974    pbinfoLock.lock(); 
    19511975    if (playbackinfo) 
     
    20302054    ff_rew_index = kInitFFRWSpeed; 
    20312055    speed_index = 0; 
    20322056    normal_speed = 1.0f; 
     2057    current_speed = 1.0f; 
    20332058    sleep_index = 0; 
    20342059 
    20352060    int updatecheck = 0; 
     
    22792304            speed_index = 0; 
    22802305            doing_ff_rew = 0; 
    22812306            ff_rew_index = kInitFFRWSpeed; 
     2307            current_speed = normal_speed; 
    22822308            UpdateOSDSeekMessage(PlayMesg(), osd_general_timeout); 
    22832309        } 
    22842310 
     
    22882314        { 
    22892315            // got changed in nvp due to close to end of file 
    22902316            normal_speed = 1.0f; 
     2317            current_speed = 1.0f; 
     2318 
    22912319            UpdateOSDSeekMessage(PlayMesg(), osd_general_timeout); 
    22922320        } 
    22932321 
     
    35523580            { 
    35533581                StopFFRew(); 
    35543582                normal_speed = 1.0f; 
     3583                current_speed = 1.0f; 
    35553584                ChangeTimeStretch(0, false); 
    35563585 
    35573586                return; 
     
    36023631                stretch >= 0.48) 
    36033632            { 
    36043633                normal_speed = stretch;   // alter speed before display 
     3634                current_speed = normal_speed; 
    36053635                ChangeTimeStretch(0, false); 
    36063636            } 
    36073637        } 
     
    36133643            if (paused) 
    36143644                DoPause(); 
    36153645 
    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            }; 
    36383654        } 
    36393655        else 
    36403656            VERBOSE(VB_IMPORTANT, 
     
    36713687        { 
    36723688            QString speedStr; 
    36733689 
    3674             switch (speed_index) 
     3690            speedStr = QString("%1X").arg(current_speed); 
     3691            if ((current_speed > 0.0f) && (current_speed < 1.0f) && (speed_index != 0)) 
    36753692            { 
    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            }; 
    36873695 
    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  
    36933696            struct StatusPosInfo posInfo; 
    36943697            nvp->calcSliderPos(posInfo, true); 
    36953698 
     
    39663969        time = StopFFRew(); 
    39673970        activenvp->Play(normal_speed, true); 
    39683971        speed_index = 0; 
     3972        current_speed = normal_speed; 
    39693973    } 
    39703974    else if (paused || (speed_index != 0)) 
    39713975    { 
    39723976        activenvp->Play(normal_speed, true); 
    39733977        paused = false; 
    39743978        speed_index = 0; 
     3979        current_speed = normal_speed; 
    39753980    } 
    39763981 
    39773982 
     
    40174022    if (paused) 
    40184023    { 
    40194024        activenvp->Play(normal_speed, true); 
     4025        current_speed = normal_speed; 
    40204026    } 
    40214027    else  
    40224028    { 
     
    40284034        } 
    40294035         
    40304036        activenvp->Pause(); 
     4037        current_speed = 0; 
    40314038    } 
    40324039 
    40334040    paused = !paused; 
     
    41304137        return; 
    41314138 
    41324139    speed_index = 0; 
     4140    current_speed = normal_speed; 
    41334141    activenvp->Play(normal_speed, true); 
    41344142} 
    41354143 
     
    41384146    int old_speed = speed_index; 
    41394147 
    41404148    if (paused) 
    4141         speed_index = -4; 
     4149        speed_index = -slowmo_speeds.size() - 1; 
    41424150 
    41434151    speed_index += direction; 
    41444152 
     
    41464154    float speed; 
    41474155    QString mesg; 
    41484156 
    4149     switch (speed_index) 
     4157    if (speed_index == 0) 
    41504158    { 
    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(); 
    41614161    } 
     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    }; 
    41624179 
    4163     if (!activenvp->Play((speed_index==0)?normal_speed:speed, speed_index==0)) 
     4180    if (!activenvp->Play(speed, speed_index==0)) 
    41644181    { 
    41654182        speed_index = old_speed; 
    41664183        return; 
    41674184    } 
     4185    current_speed = speed; 
    41684186 
    41694187    paused = false; 
    41704188    DoNVPSeek(time); 
     
    41794197        return time; 
    41804198 
    41814199    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]; 
    41834201    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]; 
    41854203 
    41864204    doing_ff_rew = 0; 
    41874205    ff_rew_index = kInitFFRWSpeed; 
     4206    current_speed = normal_speed; 
    41884207 
    41894208    activenvp->Play(normal_speed, true); 
    41904209 
     
    42484267        speed = -ff_rew_speeds[ff_rew_index]; 
    42494268    } 
    42504269 
     4270    current_speed = (float)speed; 
    42514271    activenvp->Play((float)speed, (speed == 1) && (doing_ff_rew > 0)); 
    42524272    UpdateOSDSeekMessage(mesg, -1); 
    42534273} 
     
    58975917    normal_speed = new_normal_speed; 
    58985918 
    58995919    if (!paused) 
     5920    { 
    59005921        activenvp->Play(normal_speed, true); 
     5922        current_speed = normal_speed; 
     5923    }; 
    59015924 
    59025925    QString text = QString(tr("Time Stretch %1X")).arg(normal_speed); 
    59035926 
     
    73117334        int i = ((kAspect_14_9 == j) ? kAspect_16_9 : 
    73127335                 ((kAspect_16_9 == j) ? kAspect_14_9 : j)); 
    73137336 
    7314         bool sel = (i != kAspect_Off) ? (aspectoverride == i) : 
     7337        bool sel = (i != kAspect_Off) ? (aspectoverride == i) : 
    73157338            (aspectoverride <= kAspect_Off) || (aspectoverride >= kAspect_END); 
    73167339        subitem = new OSDGenericTree(item, toString((AspectOverrideMode) i), 
    73177340                                     QString("TOGGLEASPECT%1").arg(i), 
     
    73227345    item = new OSDGenericTree(treeMenu, tr("Adjust Fill")); 
    73237346    for (int i = kAdjustFill_Off; i < kAdjustFill_END; i++) 
    73247347    { 
    7325         bool sel = (i != kAdjustFill_Off) ? (adjustfill == i) : 
     7348        bool sel = (i != kAdjustFill_Off) ? (adjustfill == i) : 
    73267349            (adjustfill <= kAdjustFill_Off) || (adjustfill >= kAdjustFill_END); 
    73277350        subitem = new OSDGenericTree(item, toString((AdjustFillMode) i), 
    73287351                                     QString("TOGGLEFILL%1").arg(i), 
     
    80428065        chain->JumpTo(-1, 1); 
    80438066 
    80448067        activenvp->Play(normal_speed, true, false); 
     8068        current_speed = normal_speed; 
    80458069        activerbuffer->IgnoreLiveEOF(false); 
    80468070    } 
    80478071