Ticket #9665: fixes_0_24_pause.diff

File fixes_0_24_pause.diff, 17.5 KB (added by markk, 14 years ago)
  • mythtv/libs/libmythtv/mythplayer.h

    diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h
    index 87f8753..d3d4d70 100644
    a b class MPUBLIC MythPlayer 
    173173    PIPLocation GetNextPIPLocation(void) const;
    174174
    175175    // Bool Gets
     176    bool    IsPaused(void)                    { return allpaused;      }
    176177    bool    GetRawAudioState(void) const;
    177178    bool    GetLimitKeyRepeat(void) const     { return limitKeyRepeat; }
    178179    bool    GetEof(void);
  • mythtv/libs/libmythtv/playercontext.cpp

    diff --git a/mythtv/libs/libmythtv/playercontext.cpp b/mythtv/libs/libmythtv/playercontext.cpp
    index 2464bdd..5a238dc 100644
    a b PlayerContext::PlayerContext(const QString &inUseID) : 
    4242    // Fast forward state
    4343    ff_rew_state(0), ff_rew_index(0), ff_rew_speed(0),
    4444    // Other state
    45     paused(false), playingState(kState_None),
     45    playingState(kState_None),
    4646    errored(false),
    4747    // pseudo states
    4848    pseudoLiveTVRec(NULL), pseudoLiveTVState(kPseudoNormalLiveTV),
  • mythtv/libs/libmythtv/playercontext.h

    diff --git a/mythtv/libs/libmythtv/playercontext.h b/mythtv/libs/libmythtv/playercontext.h
    index 97faf89..e2f6b28 100644
    a b class MPUBLIC PlayerContext 
    184184    int                 ff_rew_index;
    185185    /// Caches value of ff_rew_speeds[ff_rew_index]
    186186    int                 ff_rew_speed;
    187     bool                paused;
    188187    TVState             playingState;
    189188
    190189    bool                errored;
  • mythtv/libs/libmythtv/tv_play.cpp

    diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
    index baf1d23..f17fd37 100644
    a b bool TV::Init(bool createWindow) 
    11781178    }
    11791179
    11801180    PlayerContext *mctx = GetPlayerReadLock(0, __FILE__, __LINE__);
    1181     mctx->paused = false;
    11821181    mctx->ff_rew_state = 0;
    11831182    mctx->ff_rew_index = kInitFFRWSpeed;
    11841183    mctx->ff_rew_speed = 0;
    void TV::HandleEndOfPlaybackTimerEvent(void) 
    31113110void TV::HandleIsNearEndWhenEmbeddingTimerEvent(void)
    31123111{
    31133112    PlayerContext *actx = GetPlayerReadLock(-1, __FILE__, __LINE__);
    3114 
    3115     bool toggle = !actx->paused && !StateIsLiveTV(GetState(actx));
    3116 
    3117     if (toggle)
     3113    if (!StateIsLiveTV(GetState(actx)))
    31183114    {
    31193115        actx->LockDeletePlayer(__FILE__, __LINE__);
    3120 
    3121         toggle = actx->player && actx->player->IsEmbedding()
    3122                            && actx->player->IsNearEnd();
    3123 
     3116        bool toggle = actx->player && actx->player->IsEmbedding() &&
     3117                      actx->player->IsNearEnd() && !actx->player->IsPaused();
    31243118        actx->UnlockDeletePlayer(__FILE__, __LINE__);
    3125 
    31263119        if (toggle)
    31273120            DoTogglePause(actx, true);
    31283121    }
    void TV::HandleEndOfRecordingExitPromptTimerEvent(void) 
    31553148            jumped_back = false;
    31563149
    31573150        do_prompt = mctx->player->IsNearEnd() && !jumped_back &&
    3158             !mctx->player->IsEmbedding() && !mctx->paused;
     3151            !mctx->player->IsEmbedding() && !mctx->player->IsPaused();
    31593152    }
    31603153    mctx->UnlockDeletePlayer(__FILE__, __LINE__);
    31613154
    bool TV::ActiveHandleAction(PlayerContext *ctx, 
    39213914        DoPlay(ctx);
    39223915    else if (has_action("PAUSE", actions))
    39233916    {
    3924         if (ctx->paused)
     3917        if (ContextIsPaused(ctx, __FILE__, __LINE__))
    39253918            SendMythSystemPlayEvent("PLAY_UNPAUSED", ctx->playingInfo);
    39263919        else
    39273920            SendMythSystemPlayEvent("PLAY_PAUSED", ctx->playingInfo);
    void TV::ProcessNetworkControlCommand(PlayerContext *ctx, 
    44824475    }
    44834476    else if (tokens.size() == 3 && tokens[1] == "SPEED")
    44844477    {
     4478        bool paused = ContextIsPaused(ctx, __FILE__, __LINE__);
     4479
    44854480        if (tokens[2] == "0x")
    44864481        {
    44874482            NormalSpeed(ctx);
    44884483            StopFFRew(ctx);
    4489 
    4490             if (!ctx->paused)
     4484            if (!paused)
    44914485                DoTogglePause(ctx, true);
    44924486        }
    44934487        else
    void TV::ProcessNetworkControlCommand(PlayerContext *ctx, 
    45294523                float searchSpeed = fabs(tmpSpeed);
    45304524                unsigned int index;
    45314525
    4532                 if (ctx->paused)
     4526                if (paused)
    45334527                    DoTogglePause(ctx, true);
    45344528
    45354529                if (tmpSpeed == 0.0f)
    void TV::ProcessNetworkControlCommand(PlayerContext *ctx, 
    45374531                    NormalSpeed(ctx);
    45384532                    StopFFRew(ctx);
    45394533
    4540                     if (!ctx->paused)
     4534                    if (!paused)
    45414535                        DoTogglePause(ctx, true);
    45424536                }
    45434537                else if (tmpSpeed == 1.0f)
    void TV::ProcessNetworkControlCommand(PlayerContext *ctx, 
    46754669        if (tokens[2] == "POSITION")
    46764670        {
    46774671            QString speedStr;
    4678 
    4679             if (ctx->paused)
     4672            if (ContextIsPaused(ctx, __FILE__, __LINE__))
    46804673            {
    46814674                speedStr = "pause";
    46824675            }
    void TV::DoPlay(PlayerContext *ctx) 
    55225515        ctx->player->Play(ctx->ts_normal, true);
    55235516        ctx->ff_rew_speed = 0;
    55245517    }
    5525     else if (ctx->paused || (ctx->ff_rew_speed != 0))
     5518    else if (ctx->player->IsPaused() || (ctx->ff_rew_speed != 0))
    55265519    {
    55275520        ctx->player->Play(ctx->ts_normal, true);
    5528         ctx->paused = false;
    55295521        ctx->ff_rew_speed = 0;
    55305522    }
    55315523    ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    float TV::DoTogglePauseStart(PlayerContext *ctx) 
    55555547        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    55565548        return 0.0f;
    55575549    }
    5558     if (ctx->paused)
     5550    if (ctx->player->IsPaused())
    55595551    {
    55605552        ctx->player->Play(ctx->ts_normal, true);
    55615553    }
    float TV::DoTogglePauseStart(PlayerContext *ctx) 
    55715563        ctx->player->Pause();
    55725564    }
    55735565    ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    5574 
    5575     ctx->paused = !ctx->paused;
    5576 
    55775566    return time;
    55785567}
    55795568
    void TV::DoTogglePauseFinish(PlayerContext *ctx, float time, bool showOSD) 
    55855574    if (ctx->buffer && ctx->buffer->InDVDMenuOrStillFrame())
    55865575        return;
    55875576
    5588     if (ctx->paused)
     5577    if (ContextIsPaused(ctx, __FILE__, __LINE__))
    55895578    {
    55905579        if (ctx->buffer)
    55915580            ctx->buffer->WaitForPause();
    bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 
    56895678    {
    56905679        DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask));
    56915680    }
    5692     else if (actx->paused)
     5681    else if (ContextIsPaused(actx, __FILE__, __LINE__))
    56935682    {
    56945683        if (!isDVD)
    56955684        {
    void TV::ChangeSpeed(PlayerContext *ctx, int direction) 
    57915780{
    57925781    int old_speed = ctx->ff_rew_speed;
    57935782
    5794     if (ctx->paused)
     5783    if (ContextIsPaused(ctx, __FILE__, __LINE__))
    57955784        ctx->ff_rew_speed = -4;
    57965785
    57975786    ctx->ff_rew_speed += direction;
    void TV::ChangeSpeed(PlayerContext *ctx, int direction) 
    58275816        return;
    58285817    }
    58295818    ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    5830 
    5831     ctx->paused = false;
    58325819    DoPlayerSeek(ctx, time);
    58335820    UpdateOSDSeekMessage(ctx, mesg, kOSDTimeout_Med);
    58345821
    void TV::ChangeFFRew(PlayerContext *ctx, int direction) 
    58885875    else
    58895876    {
    58905877        NormalSpeed(ctx);
    5891         ctx->paused = false;
    58925878        ctx->ff_rew_state = direction;
    58935879        SetFFRew(ctx, kInitFFRWSpeed);
    58945880    }
    void TV::ToggleInputs(PlayerContext *ctx, uint inputid) 
    64476433        return;
    64486434    }
    64496435
    6450     // If Nuppel Video Player is paused, unpause it
    6451     if (ctx->paused)
     6436    // If MythPlayer is paused, unpause it
     6437    if (ContextIsPaused(ctx, __FILE__, __LINE__))
    64526438    {
    64536439        HideOSDWindow(ctx, "osd_status");
    64546440        GetMythUI()->DisableScreensaver();
    6455         ctx->paused = false;
    64566441    }
    64576442
    64586443    const QString curinputname = ctx->recorder->GetInput();
    void TV::ChangeChannel(PlayerContext *ctx, int direction) 
    67776762
    67786763    QString oldinputname = ctx->recorder->GetInput();
    67796764
    6780     if (ctx->paused)
     6765    if (ContextIsPaused(ctx, __FILE__, __LINE__))
    67816766    {
    67826767        HideOSDWindow(ctx, "osd_status");
    67836768        GetMythUI()->DisableScreensaver();
    6784         ctx->paused = false;
    67856769    }
    67866770
    67876771    // Save the current channel if this is the first time
    void TV::ChangeChannel(PlayerContext *ctx, uint chanid, const QString &chan) 
    68906874    if (getit || !ctx->recorder || !ctx->recorder->CheckChannel(channum))
    68916875        return;
    68926876
    6893     if (ctx->paused)
     6877    if (ContextIsPaused(ctx, __FILE__, __LINE__))
    68946878    {
    68956879        HideOSDWindow(ctx, "osd_status");
    68966880        GetMythUI()->DisableScreensaver();
    6897         ctx->paused = false;
    68986881    }
    68996882
    69006883    // Save the current channel if this is the first time
    bool TV::ClearOSD(const PlayerContext *ctx) 
    70197002/** \fn TV::ToggleOSD(const PlayerContext*, bool includeStatus)
    70207003 *  \brief Cycle through the available Info OSDs.
    70217004 */
    7022 void TV::ToggleOSD(const PlayerContext *ctx, bool includeStatusOSD)
     7005void TV::ToggleOSD(PlayerContext *ctx, bool includeStatusOSD)
    70237006{
    70247007    OSD *osd = GetOSDLock(ctx);
    70257008    bool hideAll    = false;
    70267009    bool showStatus = false;
    7027     if (ctx->paused || !osd)
     7010    if (ContextIsPaused(ctx, __FILE__, __LINE__) || !osd)
    70287011    {
    70297012        ReturnOSDLock(ctx, osd);
    70307013        return;
    vector<bool> TV::DoSetPauseState(PlayerContext *lctx, const vector<bool> &pause) 
    76607643    vector<float> times;
    76617644    for (uint i = 0; lctx && i < player.size() && i < pause.size(); i++)
    76627645    {
    7663         was_paused.push_back(GetPlayer(lctx,i)->paused);
     7646        PlayerContext *actx = GetPlayer(lctx, i);
     7647        if (actx)
     7648            was_paused.push_back(ContextIsPaused(actx, __FILE__, __LINE__));
    76647649        float time = 0.0f;
    76657650        if (pause[i] ^ was_paused.back())
    76667651            time = DoTogglePauseStart(GetPlayer(lctx,i));
    void TV::DoEditSchedule(int editType) 
    77117696    bool isNearEnd = false;
    77127697    bool isLiveTV = StateIsLiveTV(GetState(actx));
    77137698    bool allowEmbedding = false;
     7699    bool paused = false;
    77147700
    77157701    {
    77167702        actx->LockDeletePlayer(__FILE__, __LINE__);
    7717         pause_active = !actx->player || !actx->player->getVideoOutput();
    7718         if (actx->player && actx->player->getVideoOutput())
    7719             allowEmbedding = actx->player->getVideoOutput()->AllowPreviewEPG();
    7720 
    7721         if (!pause_active)
     7703        pause_active = !actx->player;
     7704        if (actx->player)
    77227705        {
    7723             long long margin = (long long)
    7724                 (actx->last_framerate * actx->player->GetAudioStretchFactor());
    7725             isNearEnd = actx->player->IsNearEnd(margin);
     7706            pause_active = !actx->player->getVideoOutput();
     7707            paused = actx->player->IsPaused();
     7708            if (actx->player->getVideoOutput())
     7709                allowEmbedding = actx->player->getVideoOutput()->AllowPreviewEPG();
     7710            if (!pause_active)
     7711            {
     7712                long long margin = (long long)
     7713                    (actx->last_framerate * actx->player->GetAudioStretchFactor());
     7714                isNearEnd = actx->player->IsNearEnd(margin);
     7715            }
    77267716        }
    77277717        actx->UnlockDeletePlayer(__FILE__, __LINE__);
    77287718    }
    void TV::DoEditSchedule(int editType) 
    77327722    pause_active |= kScheduleProgramFinder == editType;
    77337723    pause_active |=
    77347724        !isLiveTV && (!db_continue_embedded || isNearEnd);
    7735     pause_active |= actx->paused;
     7725    pause_active |= paused;
    77367726    vector<bool> do_pause;
    77377727    do_pause.insert(do_pause.begin(), true, player.size());
    77387728    do_pause[find_player_index(actx)] = pause_active;
    void TV::ChangeTimeStretch(PlayerContext *ctx, int dir, bool allowEdit) 
    78757865
    78767866    ctx->ts_normal = new_ts_normal;
    78777867
    7878     if (!ctx->paused)
    7879     {
    7880         ctx->LockDeletePlayer(__FILE__, __LINE__);
    7881         if (ctx->player)
     7868    ctx->LockDeletePlayer(__FILE__, __LINE__);
     7869    if (ctx->player && !ctx->player->IsPaused())
    78827870            ctx->player->Play(ctx->ts_normal, true);
    7883         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    7884     }
     7871    ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    78857872
    78867873    if (!browsehelper->IsBrowsing())
    78877874    {
    void TV::ShowOSDAlreadyEditing(PlayerContext *ctx) 
    90539040    if (osd)
    90549041    {
    90559042        osd->DialogQuit();
    9056         bool was_paused = ctx->paused;
     9043        bool was_paused = ContextIsPaused(ctx, __FILE__, __LINE__);
    90579044        if (!was_paused)
    90589045            DoTogglePause(ctx, true);
    90599046
    void TV::HandleOSDAlreadyEditing(PlayerContext *ctx, QString action, 
    90749061    if (!DialogIsVisible(ctx, OSD_DLG_EDITING))
    90759062        return;
    90769063
     9064    bool paused = ContextIsPaused(ctx, __FILE__, __LINE__);
     9065
    90779066    if (action == "STOP")
    90789067    {
    90799068        ctx->LockPlayingInfo(__FILE__, __LINE__);
    90809069        if (ctx->playingInfo)
    90819070            ctx->playingInfo->SaveEditing(false);
    90829071        ctx->UnlockPlayingInfo(__FILE__, __LINE__);
    9083         if (!was_paused && ctx->paused)
     9072        if (!was_paused && paused)
    90849073            DoTogglePause(ctx, true);
    90859074    }
    90869075    else // action == "CONTINUE"
    void TV::HandleOSDAlreadyEditing(PlayerContext *ctx, QString action, 
    90909079        {
    90919080            ctx->playingInfo->SaveEditing(false);
    90929081            editmode = ctx->player->EnableEdit();
    9093             if (!editmode && !was_paused && ctx->paused)
     9082            if (!editmode && !was_paused && paused)
    90949083                DoTogglePause(ctx, false);
    90959084        }
    90969085        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    void TV::OSDDialogEvent(int result, QString text, QString action) 
    95949583
    95959584        StopFFRew(actx);
    95969585
    9597         if (actx->paused)
     9586        if (ContextIsPaused(actx, __FILE__, __LINE__))
    95989587            DoTogglePause(actx, true);
    95999588
    96009589        ChangeTimeStretch(actx, 0, !floatRead);   // just display
    void TV::ITVRestart(PlayerContext *ctx, bool isLive) 
    1121811207    uint chanid = 0;
    1121911208    uint cardid = 0;
    1122011209
    11221     if (ctx->paused)
     11210    if (ContextIsPaused(ctx, __FILE__, __LINE__))
    1122211211        return;
    1122311212
    1122411213    ctx->LockPlayingInfo(__FILE__, __LINE__);
    void TV::ShowOSDStopWatchingRecording(PlayerContext *ctx) 
    1141911408    if ((ctx != GetPlayer(ctx, 0)))
    1142011409        return;
    1142111410
    11422     if (!ctx->paused)
     11411    if (!ContextIsPaused(ctx, __FILE__, __LINE__))
    1142311412        DoTogglePause(ctx, false);
    1142411413
    1142511414    QString message;
    void TV::ShowOSDPromptDeleteRecording(PlayerContext *ctx, QString title, 
    1154011529
    1154111530    ClearOSD(ctx);
    1154211531
    11543     bool paused = ctx->paused;
     11532    bool paused = ContextIsPaused(ctx, __FILE__, __LINE__);
    1154411533    if (!paused)
    1154511534        DoTogglePause(ctx, false);
    1154611535
    bool TV::PromptRecGroupPassword(PlayerContext *ctx) 
    1169111680    if (!lastProgram)
    1169211681        return false;
    1169311682
    11694     bool stayPaused = ctx->paused;
    11695     if (!ctx->paused)
     11683    bool paused = ContextIsPaused(ctx, __FILE__, __LINE__);
     11684    bool stayPaused = paused;
     11685    if (!paused)
    1169611686        DoTogglePause(ctx, false);
    1169711687    QString recGroupPassword;
    1169811688    lastProgram->SetRecordingGroup(lastProgram->QueryRecordingGroup());
    bool TV::PromptRecGroupPassword(PlayerContext *ctx) 
    1171711707        {
    1171811708            SetOSDMessage(ctx, tr("Password Failed"));
    1171911709
    11720             if (ctx->paused && !stayPaused)
     11710            if (ContextIsPaused(ctx, __FILE__, __LINE__) && !stayPaused)
    1172111711                DoTogglePause(ctx, false);
    1172211712
    1172311713            return false;
    1172411714        }
    1172511715    }
    1172611716
    11727     if (ctx->paused && !stayPaused)
     11717    if (ContextIsPaused(ctx, __FILE__, __LINE__) && !stayPaused)
    1172811718        DoTogglePause(ctx, false);
    1172911719
    1173011720    return true;
    void TV::HandleUDPNotifyEvent(void) 
    1180611796    ReturnPlayerLock(mctx);
    1180711797}
    1180811798
     11799bool TV::ContextIsPaused(PlayerContext *ctx, const char *file, int location)
     11800{
     11801    if (!ctx)
     11802        return false;
     11803    bool paused = false;
     11804    ctx->LockDeletePlayer(file, location);
     11805    if (ctx->player)
     11806        paused = ctx->player->IsPaused();
     11807    ctx->UnlockDeletePlayer(file, location);
     11808    return paused;
     11809}
     11810
    1180911811OSD *TV::GetOSDL(const char *file, int location)
    1181011812{
    1181111813    PlayerContext *actx = GetPlayerReadLock(-1, file, location);
  • mythtv/libs/libmythtv/tv_play.h

    diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h
    index 64f80c7..205cd7a 100644
    a b class MPUBLIC TV : public QObject 
    307307    static EMBEDRETURNVOIDSCHEDIT RunScheduleEditorPtr;
    308308
    309309  private:
     310    bool ContextIsPaused(PlayerContext *ctx, const char *file, int location);
    310311    void SetActive(PlayerContext *lctx, int index, bool osd_msg);
    311312
    312313    PlayerContext       *GetPlayerWriteLock(
    class MPUBLIC TV : public QObject 
    462463                                const QStringList &actions);
    463464
    464465    bool ClearOSD(const PlayerContext*);
    465     void ToggleOSD(const PlayerContext*, bool includeStatusOSD);
     466    void ToggleOSD(PlayerContext*, bool includeStatusOSD);
    466467    void UpdateOSDProgInfo(const PlayerContext*, const char *whichInfo);
    467468    void UpdateOSDStatus(const PlayerContext *ctx, QString title, QString desc,
    468469                         QString value, int type, QString units,
  • mythtv/libs/libmythtv/tvbrowsehelper.cpp

    diff --git a/mythtv/libs/libmythtv/tvbrowsehelper.cpp b/mythtv/libs/libmythtv/tvbrowsehelper.cpp
    index d3f2abf..d08db85 100644
    a b  
    66#include "playercontext.h"
    77#include "remoteencoder.h"
    88#include "recordinginfo.h"
     9#include "mythplayer.h"
    910#include "tv_play.h"
    1011
    1112#define GetPlayer(X,Y) GetPlayerHaveLock(X, Y, __FILE__ , __LINE__)
    bool TVBrowseHelper::BrowseStart(PlayerContext *ctx, bool skip_browse) 
    6566    if (m_ctx)
    6667        return m_ctx == ctx;
    6768
    68     if (ctx->paused)
     69    bool paused = false;
     70    ctx->LockDeletePlayer(__FILE__, __LINE__);
     71    if (ctx->player)
     72        paused = ctx->player->IsPaused();
     73    ctx->UnlockDeletePlayer(__FILE__, __LINE__);
     74    if (paused)
    6975        return false;
    7076
    7177    m_tv->ClearOSD(ctx);