Ticket #9511: 103-livetv_buffer_underrun_v2.patch

File 103-livetv_buffer_underrun_v2.patch, 4.5 KB (added by Jiri Fojtasek <jiri.fojtasek@…>, 7 years ago)

patch v2

  • libs/libmythtv/fileringbuffer.cpp

    diff -u -r -p mythtv.102/libs/libmythtv/fileringbuffer.cpp mythtv/libs/libmythtv/fileringbuffer.cpp
    old new bool FileRingBuffer::OpenFile(const QStr 
    349349        }
    350350    }
    351351
    352     setswitchtonext = false;
    353352    ateof = false;
    354353    commserror = false;
    355354    numfailures = 0;
  • libs/libmythtv/mythplayer.cpp

    diff -u -r -p mythtv.102/libs/libmythtv/mythplayer.cpp mythtv/libs/libmythtv/mythplayer.cpp
    old new void MythPlayer::SwitchToProgram(void) 
    22712271
    22722272    bool newIsDummy = player_ctx->tvchain->GetCardType(newid) == "DUMMY";
    22732273
     2274    if (!newIsDummy)
     2275    {
     2276        player_ctx->buffer->OpenFile(
     2277            pginfo->GetPlaybackURL(), RingBuffer::kDefaultOpenTimeout);
     2278    }
    22742279    SetPlayingInfo(*pginfo);
    22752280    Pause();
    22762281    ChangeSpeed();
    void MythPlayer::SwitchToProgram(void) 
    22842289        return;
    22852290    }
    22862291
    2287     player_ctx->buffer->OpenFile(
    2288         pginfo->GetPlaybackURL(), RingBuffer::kDefaultOpenTimeout);
    2289 
    22902292    if (!player_ctx->buffer->IsOpen())
    22912293    {
    22922294        VERBOSE(VB_IMPORTANT, LOC_ERR + "SwitchToProgram's OpenFile failed " +
  • libs/libmythtv/ringbuffer.cpp

    diff -u -r -p mythtv.102/libs/libmythtv/ringbuffer.cpp mythtv/libs/libmythtv/ringbuffer.cpp
    old new void RingBuffer::ResetReadAhead(long lon 
    450450    internalreadpos = newinternal;
    451451    ateof = false;
    452452    readsallowed = false;
    453     setswitchtonext = false;
    454453    generalWait.wakeAll();
    455454
    456455    rbwlock.unlock();
    void RingBuffer::run(void) 
    698697
    699698        // These are conditions where we want to sleep to allow
    700699        // other threads to do stuff.
    701         if (setswitchtonext || (ateof && readsallowed))
     700        if (ateof && readsallowed)
    702701        {
    703702            ignore_for_read_timing = true;
    704703            generalWait.wait(&rwlock, 1000);
    void RingBuffer::run(void) 
    706705        }
    707706
    708707        int read_return = -1;
    709         if (totfree >= readblocksize && !commserror &&
    710             !ateof && !setswitchtonext)
     708        if (totfree >= readblocksize && !commserror && !ateof)
    711709        {
    712710            // limit the read size
    713711            totfree = readblocksize;
    void RingBuffer::run(void) 
    842840
    843841        VERBOSE(VB_FILE|VB_EXTRA, LOC + "@ end of read ahead loop");
    844842
    845         if (readsallowed || commserror || ateof || setswitchtonext ||
     843        if (readsallowed || commserror || ateof ||
    846844            (wanttoread <= used && wanttoread > 0))
    847845        {
    848846            // To give other threads a good chance to handle these
    void RingBuffer::run(void) 
    851849            generalWait.wakeAll();
    852850            rwlock.unlock();
    853851            usleep(5 * 1000);
    854             rwlock.lockForRead();           
     852            rwlock.lockForRead();
    855853        }
    856854        else
    857855        {
    858856            // yield if we have nothing to do...
    859857            if (!request_pause &&
    860                 (used >= fill_threshold || ateof || setswitchtonext))
     858                (used >= fill_threshold || ateof))
    861859            {
    862860                generalWait.wait(&rwlock, 1000);
    863861            }
    bool RingBuffer::WaitForAvail(int count) 
    945943        generalWait.wait(&rwlock, 250);
    946944        avail = ReadBufAvail();
    947945
    948         if ((ateof || setswitchtonext) && avail < count)
     946        if (ateof && avail < count)
    949947            count = avail;
    950948
    951949        if (avail < count)
    bool RingBuffer::WaitForAvail(int count) 
    972970                }
    973971            }
    974972
    975             bool quit = livetvchain && (livetvchain->NeedsToSwitch() ||
    976                                         livetvchain->NeedsToJump() ||
    977                                         setswitchtonext);
    978 
    979             if (elapsed > 16000 || quit)
     973            if (elapsed > 16000)
    980974            {
    981                 if (!quit)
    982                     VERBOSE(VB_IMPORTANT, LOC_ERR + "Waited " +
     975                VERBOSE(VB_IMPORTANT, LOC_ERR + "Waited " +
    983976                            QString("%1").arg(elapsed/1000) +
    984977                            " seconds for data, aborting.");
    985                 else
    986                     VERBOSE(VB_IMPORTANT, LOC + "Timing out wait due to "
    987                             "impending livetv switch.");
    988 
    989978                return false;
    990979            }
    991980        }