diff --git a/src/gui/channellist.cpp b/src/gui/channellist.cpp index 2c6874c6d..aea3b78ac 100644 --- a/src/gui/channellist.cpp +++ b/src/gui/channellist.cpp @@ -63,6 +63,7 @@ #include #include #include +#include #include #include @@ -130,6 +131,8 @@ CChannelList::CChannelList(const char * const pName, bool phistoryMode, bool _vl move_state = beDefault; edit_state = false; channelsChanged = false; + + paint_events_index = -2; } CChannelList::~CChannelList() @@ -161,6 +164,8 @@ void CChannelList::updateEvents(unsigned int from, unsigned int to) return; size_t chanlist_size = to - from; + if (chanlist_size <= 0) // WTF??? + return; CChannelEventList events; if (displayNext) { @@ -188,16 +193,18 @@ void CChannelList::updateEvents(unsigned int from, unsigned int to) for (uint32_t count = 0; count < chanlist_size; count++) p_requested_channels[count] = (*chanlist)[count + from]->getEpgID(); - CEitManager::getInstance()->getChannelEvents(events, p_requested_channels, chanlist_size); + CChannelEventList levents; + CEitManager::getInstance()->getChannelEvents(levents, p_requested_channels, chanlist_size); for (uint32_t count=0; count < chanlist_size; count++) { (*chanlist)[count + from]->currentEvent = CChannelEvent(); - for (CChannelEventList::iterator e = events.begin(); e != events.end(); ++e) { + for (CChannelEventList::iterator e = levents.begin(); e != levents.end(); ++e) { if (((*chanlist)[count + from]->getEpgID()&0xFFFFFFFFFFFFULL) == e->get_channel_id()) { (*chanlist)[count + from]->currentEvent = *e; break; } } } + levents.clear(); delete[] p_requested_channels; } } @@ -934,6 +941,8 @@ int CChannelList::show() } } + paint_events(-2); // cancel paint_events thread + if (move_state == beMoving) cancelMoveChannel(); if (edit_state) @@ -2315,9 +2324,70 @@ void CChannelList::paintPig (int _x, int _y, int w, int h) } void CChannelList::paint_events(int index) +{ + if (index == -2 && paint_events_index > -2) { + pthread_mutex_lock(&paint_events_mutex); + paint_events_index = index; + sem_post(&paint_events_sem); + pthread_join(paint_events_thr, NULL); + sem_destroy(&paint_events_sem); + pthread_mutex_unlock(&paint_events_mutex); + } else if (paint_events_index == -2) { + if (index == -2) + return; + // First paint_event. No need to lock. + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP); + pthread_mutex_init(&paint_events_mutex, &attr); + + sem_init(&paint_events_sem, 0, 0); + paint_events_index = index; + if (!pthread_create(&paint_events_thr, NULL, paint_events, (void *) this)) + sem_post(&paint_events_sem); + else + paint_events_index = -2; + } else { + pthread_mutex_lock(&paint_events_mutex); + paint_events_index = index; + pthread_mutex_unlock(&paint_events_mutex); + sem_post(&paint_events_sem); + } +} + +void *CChannelList::paint_events(void *arg) +{ + CChannelList *me = (CChannelList *) arg; + me->paint_events(); + pthread_exit(NULL); +} + +void CChannelList::paint_events() +{ + set_threadname(__func__); + + while (paint_events_index != -2) { + sem_wait(&paint_events_sem); + if (paint_events_index < 0) + continue; + while(!sem_trywait(&paint_events_sem)); + int current_index = paint_events_index; + + CChannelEventList evtlist; + readEvents((*chanlist)[current_index]->getChannelID(), evtlist); + if (current_index == paint_events_index) { + pthread_mutex_lock(&paint_events_mutex); + if (current_index == paint_events_index) + paint_events_index = -1; + pthread_mutex_unlock(&paint_events_mutex); + paint_events(evtlist); + } + } +} + +void CChannelList::paint_events(CChannelEventList &evtlist) { ffheight = g_Font[eventFont]->getHeight(); - readEvents((*chanlist)[index]->getEpgID()); frameBuffer->paintBoxRel(x+ width,y+ theight+pig_height, infozone_width, infozone_height,COL_MENUCONTENT_PLUS_0); char startTime[10]; @@ -2379,8 +2449,6 @@ void CChannelList::paint_events(int index) } i++; } - if ( !evtlist.empty() ) - evtlist.clear(); } static bool sortByDateTime (const CChannelEvent& a, const CChannelEvent& b) @@ -2388,7 +2456,7 @@ static bool sortByDateTime (const CChannelEvent& a, const CChannelEvent& b) return a.startTime < b.startTime; } -void CChannelList::readEvents(const t_channel_id channel_id) +void CChannelList::readEvents(const t_channel_id channel_id, CChannelEventList &evtlist) { CEitManager::getInstance()->getEventsServiceKey(channel_id , evtlist); diff --git a/src/gui/channellist.h b/src/gui/channellist.h index d1bd179e4..49d057105 100644 --- a/src/gui/channellist.h +++ b/src/gui/channellist.h @@ -46,6 +46,8 @@ #include #include +#include +#include enum { LIST_MODE_FAV, @@ -117,6 +119,11 @@ private: int infozone_height; int previous_channellist_additional; + int paint_events_index; + sem_t paint_events_sem; + pthread_t paint_events_thr; + pthread_mutex_t paint_events_mutex; + const char * unit_short_minute; CEPGData epgData; @@ -147,9 +154,11 @@ private: void calcSize(); std::string MaxChanNr(); void paintPig(int x, int y, int w, int h); + void paint_events(); void paint_events(int index); - CChannelEventList evtlist; - void readEvents(const t_channel_id channel_id); + void paint_events(CChannelEventList &evtlist); + static void *paint_events(void *arg); + void readEvents(const t_channel_id channel_id, CChannelEventList &evtlist); void showdescription(int index); typedef std::pair epg_pair; std::vector epgText; diff --git a/src/gui/components/cc_frm_signalbars.cpp b/src/gui/components/cc_frm_signalbars.cpp index edc7804c2..4dc677e93 100644 --- a/src/gui/components/cc_frm_signalbars.cpp +++ b/src/gui/components/cc_frm_signalbars.cpp @@ -29,7 +29,6 @@ #include #include -#include #include "cc_frm_signalbars.h" #include @@ -193,7 +192,9 @@ void CSignalBar::initSBarName() void CSignalBar::Refresh() { //get current value from frontend - sb_signal = sb_frontend->getSignalStrength(); + sb_signal = 0; + if (sb_frontend) + sb_signal = sb_frontend->getSignalStrength(); //reinit items with current values initSBItems(); @@ -243,7 +244,9 @@ void CSignalBar::paint(bool do_save_bg) void CSignalNoiseRatioBar::Refresh() { //get current value from frontend - sb_signal = sb_frontend->getSignalNoiseRatio(); + sb_signal = 0; + if (sb_frontend) + sb_signal = sb_frontend->getSignalNoiseRatio(); //reinit items with current values initSBItems(); @@ -256,7 +259,7 @@ CSignalBox::CSignalBox(const int& xpos, const int& ypos, const int& w, const int initVarSigBox(); vertical = vert; - sbx_frontend = (frontend_ref == NULL) ? CFEManager::getInstance()->getLiveFE() : frontend_ref; + sbx_frontend = frontend_ref; x = xpos; y = ypos; width = w; @@ -339,7 +342,6 @@ void CSignalBox::paintScale() void CSignalBox::paint(bool do_save_bg) { //paint frame and body - initSignalItems(); if (!is_painted) paintForm(do_save_bg); diff --git a/src/gui/components/cc_frm_signalbars.h b/src/gui/components/cc_frm_signalbars.h index c27b69962..b69516a6c 100644 --- a/src/gui/components/cc_frm_signalbars.h +++ b/src/gui/components/cc_frm_signalbars.h @@ -116,7 +116,7 @@ class CSignalBar : public CComponentsForm, public CCTextScreen CSignalBar(const int& xpos, const int& ypos, const int& w, const int& h, CFrontend *frontend_ref, const std::string& sb_name = "SIG", CComponentsForm *parent = NULL); ///assigns the current used frontend, simplified a tuner object, see frontend_c.h - virtual void setFrontEnd(CFrontend *frontend_ref){sb_frontend = frontend_ref;}; + virtual void setFrontEnd(CFrontend *frontend_ref){if (sb_frontend != frontend_ref) {sb_lastsig = 0; sb_frontend = frontend_ref;}} ///assigns font for caption virtual void setTextFont(Font* font_text){sb_font = font_text;}; ///sets the caption color, see also property 'sb_caption_color' @@ -291,12 +291,12 @@ class CSignalBox : public CComponentsForm, public CCTextScreen public: ///class constructor for signal noise ratio. - CSignalBox(const int& xpos, const int& ypos, const int& w, const int& h, CFrontend *frontend_ref = NULL, const bool vertical = true, CComponentsForm *parent = NULL, const std::string& sig_name = "SIG", const std::string& snr_name = "SNR" ); + CSignalBox(const int& xpos, const int& ypos, const int& w, const int& h, CFrontend *frontend_ref, const bool vertical = true, CComponentsForm *parent = NULL, const std::string& sig_name = "SIG", const std::string& snr_name = "SNR" ); ///returns the signal object, type = CSignalBar* CSignalBar* getScaleObject(){return sbar;}; ///returns the signal noise ratio object, type = CSignalNoiseRatioBar* - CSignalNoiseRatioBar* getLabelObject(){return snrbar;} + CSignalNoiseRatioBar* getLabelObject(){return snrbar;}; ///assigns the current used frontend, simplified a tuner object, see frontend_c.h void setFrontEnd(CFrontend *frontend_ref){sbx_frontend = frontend_ref;} diff --git a/src/gui/infoviewer.cpp b/src/gui/infoviewer.cpp index b7bbd40d7..0a5930ccb 100644 --- a/src/gui/infoviewer.cpp +++ b/src/gui/infoviewer.cpp @@ -1742,13 +1742,13 @@ void CInfoViewer::showSNR () } if (sigbox == NULL){ int sigbox_offset = ChanWidth *10/100; - sigbox = new CSignalBox(BoxStartX + sigbox_offset, y_numbox+ChanHeight/2, ChanWidth - 2*sigbox_offset, ChanHeight/2, CFEManager::getInstance()->getLiveFE(), true, NULL, "S", "Q"); + sigbox = new CSignalBox(BoxStartX + sigbox_offset, y_numbox+ChanHeight/2, ChanWidth - 2*sigbox_offset, ChanHeight/2, NULL, true, NULL, "S", "Q"); sigbox->setTextColor(COL_INFOBAR_TEXT); sigbox->setColorBody(numbox->getColorBody()); sigbox->doPaintBg(false); sigbox->enableTboxSaveScreen(numbox->getColBodyGradientMode()); - }else - sigbox->setFrontEnd(CFEManager::getInstance()->getLiveFE()); + } + sigbox->setFrontEnd(CFEManager::getInstance()->getLiveFE()); sigbox->paint(CC_SAVE_SCREEN_NO); } if(showButtonBar) diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 90c181476..9a2fd4b17 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -2154,9 +2154,9 @@ TIMER_START(); CHintBox * hintBox = new CHintBox(LOCALE_MESSAGEBOX_INFO, g_Locale->getText(LOCALE_NEUTRINO_STARTING)); //NI show startlogo - bool ng_startlogo = false; + bool startlogo = false; if (!show_startwizard) { - ng_startlogo = true; + startlogo = true; } else { hintBox->paint(); @@ -2204,7 +2204,7 @@ TIMER_START(); g_videoSettings->setVideoSettings(); //NI show startlogo - if (ng_startlogo) { + if (startlogo) { frameBuffer->showFrame("start.jpg"); } @@ -2326,8 +2326,8 @@ TIMER_START(); } //NI - show startlogo - if(ng_startlogo) { - ng_startlogo = false; + if (startlogo) { + startlogo = false; sleep(3); frameBuffer->stopFrame(); }