Ticket #4492: playspeeds.patch

File playspeeds.patch, 11.8 KB (added by Ron Frazier <ron@…>, 13 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