Ticket #1147: 1147.patch
File 1147.patch, 8.0 KB (added by , 18 years ago) |
---|
-
programs/mythfrontend/playbackbox.cpp
179 179 180 180 bool displayCat = gContext->GetNumSetting("DisplayRecGroupIsCategory", 0); 181 181 int defaultView = gContext->GetNumSetting("DisplayGroupDefaultView", 0); 182 int initialFilt = gContext->GetNumSetting("QueryInitialFilter", 0); 182 183 183 184 progLists[""]; 184 185 titleList << ""; … … 258 259 setNoErase(); 259 260 gContext->addListener(this); 260 261 261 if ((recGroupPassword != "") || (titleList.count() <= 1) || 262 (gContext->GetNumSetting("QueryInitialFilter", 0))) 263 { 262 if (!recGroupPassword.isEmpty() || (titleList.count() <= 1) || initialFilt) 264 263 showRecGroupChooser(); 265 }266 264 267 265 gContext->addCurrentLocation((type == Delete)? "DeleteBox":"PlaybackBox"); 268 266 } … … 271 269 { 272 270 gContext->removeListener(this); 273 271 gContext->removeCurrentLocation(); 272 274 273 killPlayerSafe(); 275 delete previewVideoRefreshTimer; 276 delete fillListTimer; 277 delete theme; 278 delete drawTransPixmap; 274 275 if (previewVideoRefreshTimer) 276 { 277 previewVideoRefreshTimer->disconnect(this); 278 previewVideoRefreshTimer->deleteLater(); 279 previewVideoRefreshTimer = NULL; 280 } 281 282 if (fillListTimer) 283 { 284 fillListTimer->disconnect(this); 285 fillListTimer->deleteLater(); 286 fillListTimer = NULL; 287 } 288 289 if (freeSpaceTimer) 290 { 291 freeSpaceTimer->disconnect(this); 292 freeSpaceTimer->deleteLater(); 293 freeSpaceTimer = NULL; 294 } 295 296 if (theme) 297 { 298 delete theme; 299 theme = NULL; 300 } 301 302 if (drawTransPixmap) 303 { 304 delete drawTransPixmap; 305 drawTransPixmap = NULL; 306 } 279 307 280 308 if (curitem) 309 { 281 310 delete curitem; 311 curitem = NULL; 312 } 313 282 314 if (delitem) 315 { 283 316 delete delitem; 317 delitem = NULL; 318 } 284 319 285 320 if (lastProgram) 321 { 286 322 delete lastProgram; 323 lastProgram = NULL; 324 } 287 325 326 // disconnect preview generators 288 327 QMutexLocker locker(&previewGeneratorLock); 289 328 QMap<QString, PreviewGenerator*>::iterator it = previewGenerator.begin(); 290 329 for (;it != previewGenerator.end(); ++it) … … 293 332 (*it)->disconnectSafe(); 294 333 } 295 334 296 // free preview pixmap after preview generators 297 // no longer sending usany new previews.335 // free preview pixmap after preview generators are 336 // no longer telling us about any new previews. 298 337 if (previewPixmap) 338 { 299 339 delete previewPixmap; 340 previewPixmap = NULL; 341 } 300 342 } 301 343 302 344 void PlaybackBox::setDefaultView(int defaultView) … … 616 658 QMap<QString, QString> infoMap; 617 659 QPainter tmp(&pix); 618 660 619 if (previewVideoPlaying == true)661 if (previewVideoPlaying) 620 662 previewVideoState = kChanging; 621 663 622 664 LayerSet *container = NULL; … … 695 737 else 696 738 itype->hide(); 697 739 } 740 741 container->Draw(&tmp, 6, (type == Delete) ? 1 : 0); 698 742 } 699 743 700 if (container && type != Delete)701 container->Draw(&tmp, 6, 0);702 else703 container->Draw(&tmp, 6, 1);704 705 744 tmp.end(); 706 745 p->drawPixmap(pr.topLeft(), pix); 707 746 708 747 previewVideoStartTimer.start(); 709 748 previewVideoStartTimerOn = true; 710 711 749 } 712 750 713 751 void PlaybackBox::updateInfo(QPainter *p) … … 747 785 748 786 /* show a still frame if the user doesn't want a video preview or nvp 749 787 * hasn't started playing the video preview yet */ 750 if (((!previewVideoEnabled) || !previewVideoPlaying || 788 if (curitem && !playingSomething && 789 (!previewVideoEnabled || 790 !previewVideoPlaying || 751 791 (previewVideoState == kStarting) || 752 (previewVideoState == kChanging)) && curitem)792 (previewVideoState == kChanging))) 753 793 { 754 if (!playingSomething) 755 { 756 QPixmap temp = getPixmap(curitem); 757 if (temp.width() > 0) 758 { 759 p->drawPixmap(drawVideoBounds.x(), drawVideoBounds.y(), temp); 760 } 761 } 794 QPixmap temp = getPixmap(curitem); 795 if (temp.width() > 0) 796 p->drawPixmap(drawVideoBounds.x(), drawVideoBounds.y(), temp); 762 797 } 763 798 764 799 /* keep calling killPlayer() to handle nvp cleanup */ 765 800 /* until killPlayer() is done */ 766 if (previewVideoKillState != kDone) 767 { 768 if (!killPlayer()) 769 return; 770 } 801 if (previewVideoKillState != kDone && !killPlayer()) 802 return; 771 803 772 804 /* if we aren't supposed to have a preview playing then always go */ 773 805 /* to the stopping previewVideoState */ … … 1542 1574 1543 1575 bool PlaybackBox::killPlayer(void) 1544 1576 { 1577 QMutexLocker locker(&previewVideoUnsafeKillLock); 1578 1545 1579 previewVideoPlaying = false; 1546 1580 1547 1581 /* if we don't have nvp to deal with then we are done */ … … 1559 1593 1560 1594 if (previewVideoKillState == kNvpToPlay) 1561 1595 { 1562 if (previewVideoNVP->IsPlaying() || (previewVideoKillTimeout.elapsed() > 2000)) 1596 if (previewVideoNVP->IsPlaying() || 1597 (previewVideoKillTimeout.elapsed() > 2000)) 1563 1598 { 1564 1599 previewVideoKillState = kNvpToStop; 1565 1600 … … 1572 1607 1573 1608 if (previewVideoKillState == kNvpToStop) 1574 1609 { 1575 if (!previewVideoNVP->IsPlaying() || (previewVideoKillTimeout.elapsed() > 2000)) 1610 if (!previewVideoNVP->IsPlaying() || 1611 (previewVideoKillTimeout.elapsed() > 2000)) 1576 1612 { 1577 1613 pthread_join(previewVideoThread, NULL); 1578 1614 previewVideoThreadRunning = true; … … 1779 1815 1780 1816 void PlaybackBox::showMenu() 1781 1817 { 1782 previewVideoState = kStopping; 1783 killPlayer(); 1818 { 1819 QMutexLocker locker(&previewVideoKillLock); 1820 setEnabled(false); 1821 previewVideoState = kStopping; 1822 while (!killPlayer()) 1823 usleep(2500); 1824 previewVideoRefreshTimer->stop(); 1825 previewVideoState = kStopped; 1826 setEnabled(true); 1827 } 1784 1828 1785 previewVideoRefreshTimer->stop();1786 previewVideoPlaying = false;1787 1788 1829 popup = new MythPopupBox(gContext->GetMainWindow(), drawPopupSolid, 1789 1830 drawPopupFgColor, drawPopupBgColor, 1790 1831 drawPopupSelColor, "menu popup"); … … 3533 3574 */ 3534 3575 void PlaybackBox::previewReady(const ProgramInfo *pginfo) 3535 3576 { 3577 // lock QApplication so that we don't remove pixmap 3578 // from under a running paint event. 3579 qApp->lock(); 3580 3536 3581 // If we are still displaying this preview update it. 3537 3582 if (pginfo->recstartts == previewStartts && 3538 3583 pginfo->chanid == previewChanid && 3539 previewLastModified == previewFilets) 3584 previewLastModified == previewFilets && 3585 titleList.count() > 1) 3540 3586 { 3541 // lock QApplication so that we don't remove pixmap 3542 // from under a running paint event. 3543 qApp->lock(); 3544 QPixmap *pix = previewPixmap; 3545 previewPixmap = NULL; 3546 qApp->unlock(); 3587 if (previewPixmap) 3588 { 3589 delete previewPixmap; 3590 previewPixmap = NULL; 3591 } 3547 3592 3548 3593 // ask for repaint 3549 update(); 3550 3551 // delete the old blank pixmap 3552 if (pix) 3553 delete pix; 3594 update(drawVideoBounds); 3554 3595 } 3596 qApp->unlock(); 3555 3597 } 3556 3598 3557 3599 QPixmap PlaybackBox::getPixmap(ProgramInfo *pginfo) … … 3590 3632 return *previewPixmap; 3591 3633 } 3592 3634 3635 paintSkipUpdate = false; // repaint background next time around 3636 3593 3637 if (previewPixmap) 3594 3638 { 3595 3639 delete previewPixmap; -
programs/mythfrontend/playbackbox.h
381 381 pthread_t previewVideoThread; 382 382 383 383 mutable QMutex previewVideoKillLock; 384 mutable QMutex previewVideoUnsafeKillLock; 384 385 killStateType previewVideoKillState; 385 386 MythTimer previewVideoKillTimeout; 386 387