/* Neutrino-GUI - DBoxII-Project Copyright (C) 2001 Steffen Hehn 'McClean' Homepage: http://dbox.cyberphoria.org/ Copyright (C) 2012-2013 Stefan Seyfried License: GPL This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "infoviewer_bb.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gui/keybind_setup.h" #include #include #include #include #include #include #include #include #include #include #include #include #include //NI #include extern CRemoteControl *g_RemoteControl; /* neutrino.cpp */ extern cVideo * videoDecoder; #define COL_INFOBAR_BUTTONS_BACKGROUND (COL_MENUFOOT_PLUS_0) CInfoViewerBB::CInfoViewerBB() { frameBuffer = CFrameBuffer::getInstance(); is_visible = false; scrambledErr = false; scrambledErrSave = false; scrambledNoSig = false; scrambledNoSigSave = false; scrambledT = 0; #if 0 if(!scrambledT) { pthread_create(&scrambledT, NULL, scrambledThread, (void*) this) ; pthread_detach(scrambledT); } #endif hddscale = NULL; sysscale = NULL; bbIconInfo[0].x = 0; bbIconInfo[0].h = 0; BBarY = 0; BBarFontY = 0; foot = NULL; ca_bar = NULL; Init(); } void CInfoViewerBB::Init() { hddwidth = 0; bbIconMaxH = 0; bbButtonMaxH = 0; bbIconMinX = 0; bbButtonMaxX = 0; fta = true; minX = 0; //NI init DecEndx = 0; decode = UNKNOWN; camCI = false; int CiSlots = cCA::GetInstance()->GetNumberCISlots(); int acc = 0; while (acc < CiSlots && acc < 2) { if (cCA::GetInstance()->ModulePresent(CA_SLOT_TYPE_CI, acc)) { printf("CI: CAM found in Slot %i\n", acc); camCI = true; } else printf("CI: CAM not found\n"); acc++; } for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) { tmp_bbButtonInfoText[i] = ""; bbButtonInfo[i].x = -1; } // not really a CComponentsFooter but let's take its height CComponentsFooter footer; InfoHeightY_Info = footer.getHeight(); ca_h = 0; initBBOffset(); changePB(); } CInfoViewerBB::~CInfoViewerBB() { if(scrambledT) { pthread_cancel(scrambledT); scrambledT = 0; } ResetModules(); } CInfoViewerBB* CInfoViewerBB::getInstance() { static CInfoViewerBB* InfoViewerBB = NULL; if(!InfoViewerBB) { InfoViewerBB = new CInfoViewerBB(); } return InfoViewerBB; } bool CInfoViewerBB::checkBBIcon(const char * const icon, int *w, int *h) { frameBuffer->getIconSize(icon, w, h); if ((*w != 0) && (*h != 0)) return true; return false; } void CInfoViewerBB::getBBIconInfo() { bbIconMaxH = 0; initBBOffset(); BBarY = g_InfoViewer->BoxEndY + bottom_bar_offset; BBarFontY = BBarY + InfoHeightY_Info - (InfoHeightY_Info - g_Font[SNeutrinoSettings::FONT_TYPE_MENU_FOOT]->getHeight()) / 2; /* center in buttonbar */ bbIconMinX = g_InfoViewer->BoxEndX - OFFSET_INNER_MID; int curMode = CNeutrinoApp::getInstance()->getMode(); bool isRadioMode = (curMode == NeutrinoModes::mode_radio || curMode == NeutrinoModes::mode_webradio); bool isTSMode = (curMode == NeutrinoModes::mode_ts); bool firstIcon = true; for (int i = 0; i < CInfoViewerBB::ICON_MAX; i++) { int w = 0, h = 0; bool iconView = false; switch (i) { case CInfoViewerBB::ICON_SUBT: //no radio if (!isRadioMode) iconView = checkBBIcon(NEUTRINO_ICON_SUBT, &w, &h); break; case CInfoViewerBB::ICON_VTXT: //no radio if (!isRadioMode) iconView = checkBBIcon(NEUTRINO_ICON_VTXT, &w, &h); break; case CInfoViewerBB::ICON_RT: if (isRadioMode && g_settings.radiotext_enable) iconView = checkBBIcon(NEUTRINO_ICON_RADIOTEXTGET, &w, &h); break; case CInfoViewerBB::ICON_DD: if( g_settings.infobar_show_dd_available ) iconView = checkBBIcon(NEUTRINO_ICON_DD, &w, &h); break; case CInfoViewerBB::ICON_16_9: //no radio if (!isRadioMode) iconView = checkBBIcon(NEUTRINO_ICON_16_9, &w, &h); break; case CInfoViewerBB::ICON_RES: //no radio if (!isRadioMode && g_settings.infobar_show_res < 2) iconView = checkBBIcon(NEUTRINO_ICON_RESOLUTION_1280, &w, &h); break; case CInfoViewerBB::ICON_CA: if (g_settings.infobar_casystem_display == 2) iconView = checkBBIcon(NEUTRINO_ICON_SCRAMBLED2, &w, &h); break; case CInfoViewerBB::ICON_TUNER: if (CFEManager::getInstance()->getEnabledCount() > 1 && g_settings.infobar_show_tuner == 1 && !isTSMode && !IS_WEBCHAN(g_InfoViewer->get_current_channel_id())) iconView = checkBBIcon(NEUTRINO_ICON_TUNER_1, &w, &h); break; default: break; } if (iconView) { if (firstIcon) firstIcon = false; else bbIconMinX -= OFFSET_INNER_SMALL; bbIconMinX -= w; bbIconInfo[i].x = bbIconMinX; bbIconInfo[i].h = h; } else bbIconInfo[i].x = -1; } for (int i = 0; i < CInfoViewerBB::ICON_MAX; i++) { if (bbIconInfo[i].x != -1) bbIconMaxH = std::max(bbIconMaxH, bbIconInfo[i].h); } if (g_settings.infobar_show_sysfs_hdd) bbIconMinX -= hddwidth + OFFSET_INNER_MID; //NI } void CInfoViewerBB::getBBButtonInfo() { bbButtonMaxH = 0; bbButtonMaxX = g_InfoViewer->ChanInfoX; int bbButtonMaxW = 0; int mode = NeutrinoModes::mode_unknown; int pers = -1; for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) { int w = 0, h = 0; bool active; std::string text, icon; switch (i) { case CInfoViewerBB::BUTTON_RED: pers = SNeutrinoSettings::P_MAIN_RED_BUTTON; icon = NEUTRINO_ICON_BUTTON_RED; frameBuffer->getIconSize(icon.c_str(), &w, &h); mode = CNeutrinoApp::getInstance()->getMode(); if (mode == NeutrinoModes::mode_ts) { text = CKeybindSetup::getMoviePlayerButtonName(CRCInput::RC_red, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; } text = CUserMenu::getUserMenuButtonName(0, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; text = g_settings.usermenu[SNeutrinoSettings::BUTTON_RED]->title; break; case CInfoViewerBB::BUTTON_GREEN: pers = SNeutrinoSettings::P_MAIN_GREEN_BUTTON; icon = NEUTRINO_ICON_BUTTON_GREEN; frameBuffer->getIconSize(icon.c_str(), &w, &h); mode = CNeutrinoApp::getInstance()->getMode(); if (mode == NeutrinoModes::mode_ts) { text = CKeybindSetup::getMoviePlayerButtonName(CRCInput::RC_green, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; } text = CUserMenu::getUserMenuButtonName(1, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; text = g_settings.usermenu[SNeutrinoSettings::BUTTON_GREEN]->title; break; case CInfoViewerBB::BUTTON_YELLOW: pers = SNeutrinoSettings::P_MAIN_YELLOW_BUTTON; icon = NEUTRINO_ICON_BUTTON_YELLOW; frameBuffer->getIconSize(icon.c_str(), &w, &h); mode = CNeutrinoApp::getInstance()->getMode(); if (mode == NeutrinoModes::mode_ts) { text = CKeybindSetup::getMoviePlayerButtonName(CRCInput::RC_yellow, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; } text = CUserMenu::getUserMenuButtonName(2, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; text = g_settings.usermenu[SNeutrinoSettings::BUTTON_YELLOW]->title; break; case CInfoViewerBB::BUTTON_BLUE: pers = SNeutrinoSettings::P_MAIN_BLUE_BUTTON; icon = NEUTRINO_ICON_BUTTON_BLUE; frameBuffer->getIconSize(icon.c_str(), &w, &h); mode = CNeutrinoApp::getInstance()->getMode(); if (mode == NeutrinoModes::mode_ts) { text = CKeybindSetup::getMoviePlayerButtonName(CRCInput::RC_blue, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; } text = CUserMenu::getUserMenuButtonName(3, active, g_settings.infobar_buttons_usertitle); if (!text.empty()) break; text = g_settings.usermenu[SNeutrinoSettings::BUTTON_BLUE]->title; break; default: break; } //label audio control button in movieplayer mode if (mode == NeutrinoModes::mode_ts && !CMoviePlayerGui::getInstance().timeshift) { if (text == g_Locale->getText(LOCALE_MPKEY_AUDIO) && !g_settings.infobar_buttons_usertitle) text = CMoviePlayerGui::getInstance(false).CurrentAudioName(); // use instance_mp } bbButtonInfo[i].w = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_FOOT]->getRenderWidth(text) + w + OFFSET_INNER_MID; bbButtonInfo[i].cx = w + OFFSET_INNER_SMALL; bbButtonInfo[i].h = h; bbButtonInfo[i].text = text; bbButtonInfo[i].icon = icon; if (pers > -1 && (g_settings.personalize[pers] != CPersonalizeGui::PERSONALIZE_ACTIVE_MODE_ENABLED)) active = false; bbButtonInfo[i].active = active; } // Calculate position/size of buttons minX = std::min(bbIconMinX, g_InfoViewer->ChanInfoX + (((g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX) * 75) / 100)); int MaxBr = minX - (g_InfoViewer->ChanInfoX + OFFSET_INNER_MID); bbButtonMaxX = g_InfoViewer->ChanInfoX + OFFSET_INNER_MID; int br = 0, count = 0; for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) { if (!bbButtonInfo[i].active) bbButtonInfo[i].paint = false; else { count++; bbButtonInfo[i].paint = true; br += bbButtonInfo[i].w; bbButtonInfo[i].x = bbButtonMaxX; bbButtonMaxX += bbButtonInfo[i].w; bbButtonMaxW = std::max(bbButtonMaxW, bbButtonInfo[i].w); } } if (br > MaxBr) printf("[infoviewer_bb:%s#%d] width br (%d) > MaxBr (%d) count %d\n", __func__, __LINE__, br, MaxBr, count); bbButtonMaxX = g_InfoViewer->ChanInfoX + OFFSET_INNER_MID; int step = MaxBr / 4; if (count > 0) { /* avoid div-by-zero :-) */ step = MaxBr / count; count = 0; for (int i = 0; i < BUTTON_MAX; i++) { if (!bbButtonInfo[i].paint) continue; bbButtonInfo[i].x = bbButtonMaxX + step * count; // printf("%s: i = %d count = %d b.x = %d\n", __func__, i, count, bbButtonInfo[i].x); count++; } } else { printf("[infoviewer_bb:%s#%d: count <= 0???\n", __func__, __LINE__); bbButtonInfo[BUTTON_RED].x = bbButtonMaxX; bbButtonInfo[BUTTON_GREEN].x = bbButtonMaxX + step; bbButtonInfo[BUTTON_YELLOW].x = bbButtonMaxX + 2*step; bbButtonInfo[BUTTON_BLUE].x = bbButtonMaxX + 3*step; } } void CInfoViewerBB::showBBButtons(bool paintFooter) { if (!is_visible) return; int i; bool paint = false; if (g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_LEFT || g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_RIGHT || g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_CENTER || g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_HIGHER_CENTER) g_InfoViewer->isVolscale = CVolume::getInstance()->hideVolscale(); else g_InfoViewer->isVolscale = false; getBBButtonInfo(); for (i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) { if (tmp_bbButtonInfoText[i] != bbButtonInfo[i].text) { paint = true; break; } } if (paint) { fb_pixel_t *pixbuf = NULL; int buf_x = bbIconMinX - OFFSET_INNER_SMALL; int buf_y = BBarY; int buf_w = g_InfoViewer->BoxEndX-buf_x; int buf_h = InfoHeightY_Info; if (paintFooter) { pixbuf = new fb_pixel_t[buf_w * buf_h]; //printf("\nbuf_x: %d, buf_y: %d, buf_w: %d, buf_h: %d, pixbuf: %p\n \n", buf_x, buf_y, buf_w, buf_h, pixbuf); frameBuffer->SaveScreen(buf_x, buf_y, buf_w, buf_h, pixbuf); paintFoot(); if (pixbuf != NULL) { if (g_settings.theme.infobar_gradient_bottom) frameBuffer->waitForIdle("CInfoViewerBB::showBBButtons"); frameBuffer->RestoreScreen(buf_x, buf_y, buf_w, buf_h, pixbuf); delete [] pixbuf; } } int last_x = minX; for (i = BUTTON_MAX; i > 0;) { --i; if ((bbButtonInfo[i].x <= g_InfoViewer->ChanInfoX) || (bbButtonInfo[i].x >= g_InfoViewer->BoxEndX) || (!bbButtonInfo[i].paint)) continue; if (bbButtonInfo[i].x > 0) { if (bbButtonInfo[i].x + bbButtonInfo[i].w > last_x) /* text too long */ bbButtonInfo[i].w = last_x - bbButtonInfo[i].x; last_x = bbButtonInfo[i].x; if (bbButtonInfo[i].w - bbButtonInfo[i].cx <= 0) { printf("[infoviewer_bb:%d cannot paint icon %d (not enough space)\n", __LINE__, i); continue; } if (bbButtonInfo[i].active) { frameBuffer->paintIcon(bbButtonInfo[i].icon, bbButtonInfo[i].x, BBarY, InfoHeightY_Info); g_Font[SNeutrinoSettings::FONT_TYPE_MENU_FOOT]->RenderString(bbButtonInfo[i].x + bbButtonInfo[i].cx, BBarFontY, bbButtonInfo[i].w - bbButtonInfo[i].cx, bbButtonInfo[i].text, COL_MENUFOOT_TEXT); } } } for (i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) { tmp_bbButtonInfoText[i] = bbButtonInfo[i].text; } } if (g_InfoViewer->isVolscale) CVolume::getInstance()->showVolscale(); } void CInfoViewerBB::showBBIcons(const int modus, const std::string & icon) { if ((bbIconInfo[modus].x <= g_InfoViewer->ChanInfoX) || (bbIconInfo[modus].x >= g_InfoViewer->BoxEndX)) return; if ((modus >= CInfoViewerBB::ICON_SUBT) && (modus < CInfoViewerBB::ICON_MAX) && (bbIconInfo[modus].x != -1) && (is_visible)) { frameBuffer->paintIcon(icon, bbIconInfo[modus].x, BBarY, InfoHeightY_Info, 1, true, !g_settings.theme.infobar_gradient_bottom, COL_INFOBAR_BUTTONS_BACKGROUND); } } void CInfoViewerBB::paintshowButtonBar(bool noTimer/*=false*/) { if (!is_visible) return; getBBIconInfo(); for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) { tmp_bbButtonInfoText[i] = ""; } if (!noTimer) g_InfoViewer->sec_timer_id = g_RCInput->addTimer(1*1000*1000, false); if (g_settings.infobar_casystem_display < 2) paint_ca_bar(); paintFoot(); g_InfoViewer->showSNR(); // Buttons showBBButtons(); //NI if (g_settings.infobar_casystem_display < 2) paint_cam_icons(); #if 0 scrambledCheck(true); #endif paint_ca_icons(0); // Icons, starting from right showIcon_SubT(); showIcon_VTXT(); showIcon_DD(); showIcon_16_9(); showIcon_Resolution(); showIcon_Tuner(); showSysfsHdd(); } void CInfoViewerBB::paintFoot(int w) { int width = (w == 0) ? g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX : w; if (foot == NULL) foot = new CComponentsShapeSquare(g_InfoViewer->ChanInfoX, BBarY, width, InfoHeightY_Info, NULL, CC_SHADOW_ON); foot->setColorBody(COL_INFOBAR_BUTTONS_BACKGROUND); foot->enableColBodyGradient(g_settings.theme.infobar_gradient_bottom, COL_INFOBAR_PLUS_0, g_settings.theme.infobar_gradient_bottom_direction); foot->setCorner(RADIUS_LARGE, CORNER_BOTTOM); foot->paint(CC_SAVE_SCREEN_NO); } void CInfoViewerBB::showIcon_SubT() { if (!is_visible) return; bool have_sub = false; CZapitChannel * cc = CNeutrinoApp::getInstance()->channelList->getChannel(CNeutrinoApp::getInstance()->channelList->getActiveChannelNumber()); if (cc && cc->getSubtitleCount()) have_sub = true; showBBIcons(CInfoViewerBB::ICON_SUBT, (have_sub) ? NEUTRINO_ICON_SUBT : NEUTRINO_ICON_SUBT_GREY); } void CInfoViewerBB::showIcon_VTXT() { if (!is_visible) return; showBBIcons(CInfoViewerBB::ICON_VTXT, (g_RemoteControl->current_PIDs.PIDs.vtxtpid != 0) ? NEUTRINO_ICON_VTXT : NEUTRINO_ICON_VTXT_GREY); } void CInfoViewerBB::showIcon_DD() { if (!is_visible || !g_settings.infobar_show_dd_available) return; std::string dd_icon; if ((g_RemoteControl->current_PIDs.PIDs.selected_apid < g_RemoteControl->current_PIDs.APIDs.size()) && (g_RemoteControl->current_PIDs.APIDs[g_RemoteControl->current_PIDs.PIDs.selected_apid].is_ac3)) dd_icon = NEUTRINO_ICON_DD; else dd_icon = g_RemoteControl->has_ac3 ? NEUTRINO_ICON_DD_AVAIL : NEUTRINO_ICON_DD_GREY; showBBIcons(CInfoViewerBB::ICON_DD, dd_icon); } void CInfoViewerBB::showIcon_RadioText(bool rt_available) { if (!is_visible || !g_settings.radiotext_enable) return; std::string rt_icon; if (rt_available) rt_icon = (g_Radiotext->S_RtOsd) ? NEUTRINO_ICON_RADIOTEXTGET : NEUTRINO_ICON_RADIOTEXTWAIT; else rt_icon = NEUTRINO_ICON_RADIOTEXTOFF; showBBIcons(CInfoViewerBB::ICON_RT, rt_icon); } void CInfoViewerBB::showIcon_16_9() { if (!is_visible) return; if ((g_InfoViewer->aspectRatio == 0) || ( g_RemoteControl->current_PIDs.PIDs.vpid == 0 ) || (g_InfoViewer->aspectRatio != videoDecoder->getAspectRatio())) { if (g_InfoViewer->chanready && (g_RemoteControl->current_PIDs.PIDs.vpid > 0 || IS_WEBCHAN(g_InfoViewer->get_current_channel_id()))) g_InfoViewer->aspectRatio = videoDecoder->getAspectRatio(); else g_InfoViewer->aspectRatio = 0; showBBIcons(CInfoViewerBB::ICON_16_9, (g_InfoViewer->aspectRatio > 2) ? NEUTRINO_ICON_16_9 : NEUTRINO_ICON_16_9_GREY); } } void CInfoViewerBB::showIcon_Resolution() { if ((!is_visible) || (g_settings.infobar_show_res == 2)) //show resolution icon is off return; if (CNeutrinoApp::getInstance()->getMode() == NeutrinoModes::mode_radio || CNeutrinoApp::getInstance()->getMode() == NeutrinoModes::mode_webradio) return; const char *icon_name = NULL; #if 0 if ((scrambledNoSig) || ((!fta) && (scrambledErr))) #endif if (!g_InfoViewer->chanready || videoDecoder->getBlank()) { icon_name = NEUTRINO_ICON_RESOLUTION_000; } else { int xres, yres, framerate; if (g_settings.infobar_show_res == 0) {//show resolution icon on infobar videoDecoder->getPictureInfo(xres, yres, framerate); switch (yres) { case 2160: icon_name = NEUTRINO_ICON_RESOLUTION_2160; break; case 1920: icon_name = NEUTRINO_ICON_RESOLUTION_1920; break; case 1088: case 1080: icon_name = NEUTRINO_ICON_RESOLUTION_1080; break; case 1440: icon_name = NEUTRINO_ICON_RESOLUTION_1440; break; case 1280: icon_name = NEUTRINO_ICON_RESOLUTION_1280; break; case 720: icon_name = NEUTRINO_ICON_RESOLUTION_720; break; case 704: icon_name = NEUTRINO_ICON_RESOLUTION_704; break; case 576: icon_name = NEUTRINO_ICON_RESOLUTION_576; break; case 544: icon_name = NEUTRINO_ICON_RESOLUTION_544; break; case 528: icon_name = NEUTRINO_ICON_RESOLUTION_528; break; case 480: icon_name = NEUTRINO_ICON_RESOLUTION_480; break; case 382: icon_name = NEUTRINO_ICON_RESOLUTION_382; break; case 352: icon_name = NEUTRINO_ICON_RESOLUTION_352; break; case 288: icon_name = NEUTRINO_ICON_RESOLUTION_288; break; default: icon_name = NEUTRINO_ICON_RESOLUTION_000; break; } } if (g_settings.infobar_show_res == 1) {//show simple resolution icon on infobar videoDecoder->getPictureInfo(xres, yres, framerate); if (yres > 1088) icon_name = NEUTRINO_ICON_RESOLUTION_UHD; else if (yres > 704) icon_name = NEUTRINO_ICON_RESOLUTION_HD; else if (yres > 0) icon_name = NEUTRINO_ICON_RESOLUTION_SD; else icon_name = NEUTRINO_ICON_RESOLUTION_000; } } showBBIcons(CInfoViewerBB::ICON_RES, icon_name); } void CInfoViewerBB::showIcon_CA() { std::string sIcon = ""; #if 0 if (CNeutrinoApp::getInstance()->getMode() != NeutrinoModes::mode_radio) { if (scrambledNoSig) sIcon = NEUTRINO_ICON_SCRAMBLED2_BLANK; else { if (fta) sIcon = NEUTRINO_ICON_SCRAMBLED2_GREY; else sIcon = (scrambledErr) ? NEUTRINO_ICON_SCRAMBLED2_RED : NEUTRINO_ICON_SCRAMBLED2; } } else #endif sIcon = (fta) ? NEUTRINO_ICON_SCRAMBLED2_GREY : NEUTRINO_ICON_SCRAMBLED2; showBBIcons(CInfoViewerBB::ICON_CA, sIcon); } void CInfoViewerBB::showIcon_Tuner() { if (CFEManager::getInstance()->getEnabledCount() <= 1 || !g_settings.infobar_show_tuner || NeutrinoModes::mode_ts == CNeutrinoApp::getInstance()->getMode() || IS_WEBCHAN(g_InfoViewer->get_current_channel_id())) { return; } std::string icon_name; switch (CFEManager::getInstance()->getLiveFE()->getNumber()) { case 1: icon_name = NEUTRINO_ICON_TUNER_2; break; case 2: icon_name = NEUTRINO_ICON_TUNER_3; break; case 3: icon_name = NEUTRINO_ICON_TUNER_4; break; case 0: default: icon_name = NEUTRINO_ICON_TUNER_1; break; } showBBIcons(CInfoViewerBB::ICON_TUNER, icon_name); } void CInfoViewerBB::showSysfsHdd() { if (g_settings.infobar_show_sysfs_hdd) { // sysfs info int percent = 0; uint64_t t, u; if (get_fs_usage("/", t, u)) percent = (int)((u * 100ULL) / t); showBarSys(percent); // hdd info showBarHdd(cHddStat::getInstance()->getPercent()); } } void CInfoViewerBB::showBarSys(int percent) { if (is_visible) { int sysscale_height = InfoHeightY_Info/4; sysscale->reset(); sysscale->doPaintBg(false); sysscale->setDimensionsAll(bbIconMinX, BBarY + InfoHeightY_Info/2 - OFFSET_INNER_MIN - sysscale_height, hddwidth, sysscale_height); sysscale->setValues(percent, 100); sysscale->paint(); } } void CInfoViewerBB::showBarHdd(int percent) { if (is_visible) { int hddscale_height = InfoHeightY_Info/4; hddscale->reset(); hddscale->doPaintBg(false); hddscale->setDimensionsAll(bbIconMinX, BBarY + InfoHeightY_Info/2 + OFFSET_INNER_MIN, hddwidth, hddscale_height); hddscale->setValues(percent, 100); hddscale->paint(); if (percent < 0) { // mark undetected hdd fill level strike through frameBuffer->paintHLineRel(bbIconMinX, hddwidth, BBarY + InfoHeightY_Info/2 + OFFSET_INNER_MIN + hddscale_height/2, COL_INFOBAR_BUTTONS_BACKGROUND); } } } void CInfoViewerBB::paint_ca_icon(int caid, const char *icon, int &icon_space_offset) { char buf[20]; int endx = g_InfoViewer->BoxEndX - OFFSET_INNER_MID - (g_settings.infobar_casystem_frame ? FRAME_WIDTH_MIN + OFFSET_INNER_SMALL : 0); int py = g_InfoViewer->BoxEndY + OFFSET_INNER_SMALL; int px = 0; static std::map > icon_map; const int icon_space = OFFSET_INNER_SMALL, icon_number = 12; static int icon_offset[icon_number] = {0,0,0,0,0,0,0,0,0,0,0,0}; static int icon_sizeW [icon_number] = {0,0,0,0,0,0,0,0,0,0,0,0}; static bool init_flag = false; if (!init_flag) { init_flag = true; int icon_sizeH = 0, index = 0; std::map >::const_iterator it; icon_map[0x0000] = std::make_pair(index++,"dec"); //NI icon_map[0x0E00] = std::make_pair(index++,"powervu"); icon_map[0x1000] = std::make_pair(index++,"tan"); icon_map[0x2600] = std::make_pair(index++,"biss"); icon_map[0x4A00] = std::make_pair(index++,"d"); icon_map[0x0600] = std::make_pair(index++,"ird"); icon_map[0x0100] = std::make_pair(index++,"seca"); icon_map[0x0500] = std::make_pair(index++,"via"); icon_map[0x1800] = std::make_pair(index++,"nagra"); icon_map[0x0B00] = std::make_pair(index++,"conax"); icon_map[0x0D00] = std::make_pair(index++,"cw"); icon_map[0x0900] = std::make_pair(index ,"nds"); for (it=icon_map.begin(); it!=icon_map.end(); ++it) { snprintf(buf, sizeof(buf), "%s_%s", (*it).second.second, (*it).second.first==0 ? "na" : "white"); //NI frameBuffer->getIconSize(buf, &icon_sizeW[(*it).second.first], &icon_sizeH); } for (int j = 0; j < icon_number; j++) { for (int i = j; i < icon_number; i++) { icon_offset[j] += icon_sizeW[i] + icon_space; } } } caid &= 0xFF00; if (icon_offset[icon_map[caid].first] == 0) return; if (g_settings.infobar_casystem_display == 0) { px = endx - (icon_offset[icon_map[caid].first] - icon_space ); } else { icon_space_offset += icon_sizeW[icon_map[caid].first]; px = endx - icon_space_offset; icon_space_offset += icon_space; //NI } if (px) { snprintf(buf, sizeof(buf), "%s_%s", icon_map[caid].second, icon); if ((px >= (endx-OFFSET_INNER_MID)) || (px <= 0)) printf("#####[%s:%d] Error paint icon %s, px: %d, py: %d, endx: %d, icon_offset: %d\n", __FUNCTION__, __LINE__, buf, px, py, endx, icon_offset[icon_map[caid].first]); else if (strstr(buf,"dec_white") == 0) //NI frameBuffer->paintIcon(buf, px, py); } } void CInfoViewerBB::paint_ca_icons(int notfirst) { //NI int acaid = 0; if (g_settings.show_ecm && (notfirst || g_settings.infobar_casystem_display > 1)) //bad mess :( acaid = check_ecmInfo(); if (g_settings.infobar_casystem_display == 3) return; if(NeutrinoModes::mode_ts == CNeutrinoApp::getInstance()->getMode() && !CMoviePlayerGui::getInstance().timeshift){ if (g_settings.infobar_casystem_display == 2) { fta = true; showIcon_CA(); } return; } int caids[] = { 0x900, 0xD00, 0xB00, 0x1800, 0x0500, 0x0100, 0x600, 0x4a00, 0x2600, 0x1000, 0x0E00, 0x0000 }; const char *green = "green"; //NI const char *white = "white"; const char *yellow = "yellow"; int icon_space_offset = 0; //NI const char *dec_icon_name[] = {"na","na","fta","int","card","net"}; decode = UNKNOWN; if(!g_InfoViewer->chanready) { if (g_settings.infobar_casystem_display == 2) { fta = true; showIcon_CA(); } else if(g_settings.infobar_casystem_display == 0) { for (int i = 0; i < (int)(sizeof(caids)/sizeof(int)); i++) { paint_ca_icon(caids[i], white, icon_space_offset); } } return; } CZapitChannel * channel = CZapit::getInstance()->GetCurrentChannel(); if(!channel) return; if (g_settings.infobar_casystem_display == 2) { fta = channel->camap.empty(); showIcon_CA(); return; } if(!notfirst) { //NI - check ecm.info acaid = check_ecmInfo(); if(acaid == 0){ if(camCI) decode = CARD; } //NI - map betacrypt to nagra if((acaid & 0xFF00)== 0x1700 && (caids[3]& 0xFF00) == 0x1800) acaid=0x1800; for (int i = 0; i < (int)(sizeof(caids)/sizeof(int)); i++) { //printf("caids[%i] = %X\n",i,caids[i]); //NI bool dcaid = false; //NI bool found = false; for(casys_map_iterator_t it = channel->camap.begin(); it != channel->camap.end(); ++it) { int caid = (*it) & 0xFF00; if (caid == 0x1700) caid = 0x0600; if((found = (caid == caids[i]))) { //NI //printf(" ****** caid = %X - acaid = %X ******\n", caid, acaid & 0xFF00); dcaid = ((caid) == (acaid & 0xFF00)); fta=false; break; } } //NI - decode info if(i == (int)(sizeof(caids)/sizeof(int))-1) { paint_ca_icon(caids[i], fta ? "fta" : dec_icon_name[decode], icon_space_offset); continue; } if(g_settings.infobar_casystem_display == 0) paint_ca_icon(caids[i], (found ? (dcaid ? green : yellow) : white), icon_space_offset); //NI else if(found) paint_ca_icon(caids[i], (dcaid ? green : yellow), icon_space_offset); //NI } //NI if (camCI) paint_cam_icons(); } } void CInfoViewerBB::paint_ca_bar() { initBBOffset(); int ca_x = g_InfoViewer->ChanInfoX; int ca_y = g_InfoViewer->BoxEndY; int ca_w = g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX; if (g_settings.infobar_casystem_frame) { ca_x += OFFSET_INNER_MID; ca_w -= 2*OFFSET_INNER_MID; } if (ca_bar == NULL) ca_bar = new CComponentsShapeSquare(ca_x, ca_y, ca_w, ca_h, NULL, CC_SHADOW_ON, COL_INFOBAR_CASYSTEM_PLUS_2, COL_INFOBAR_CASYSTEM_PLUS_0); //ca_bar->setColorBody(COL_INFOBAR_CASYSTEM_PLUS_0); ca_bar->enableColBodyGradient(g_settings.theme.infobar_gradient_bottom, COL_INFOBAR_BUTTONS_BACKGROUND, g_settings.theme.infobar_gradient_bottom_direction); ca_bar->enableShadow(CC_SHADOW_ON, OFFSET_SHADOW/2, true); if (g_settings.infobar_casystem_frame) { ca_bar->setFrameThickness(FRAME_WIDTH_MIN); ca_bar->setCorner(RADIUS_SMALL, CORNER_ALL); } ca_bar->paint(CC_SAVE_SCREEN_NO); //NI #if 0 if (g_settings.infobar_casystem_dotmatrix) { int xcnt = (g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX - (g_settings.infobar_casystem_frame ? 24 : 0)) / 4; int ycnt = (bottom_bar_offset - (g_settings.infobar_casystem_frame ? 14 : 0)) / 4; for (int i = 0; i < xcnt; i++) { for (int j = 0; j < ycnt; j++) { frameBuffer->paintBoxRel((g_InfoViewer->ChanInfoX + (g_settings.infobar_casystem_frame ? 14 : 2)) + i*4, g_InfoViewer->BoxEndY + (g_settings.infobar_casystem_frame ? 4 : 2) + j*4, 2, 2, COL_INFOBAR_PLUS_1); } } } #endif } void CInfoViewerBB::changePB() { hddwidth = frameBuffer->getScreenWidth(true) / 100 * 10; // 10 percent of screen width if (!hddscale) { hddscale = new CProgressBar(); hddscale->setType(CProgressBar::PB_REDRIGHT); } if (!sysscale) { sysscale = new CProgressBar(); sysscale->setType(CProgressBar::PB_REDRIGHT); } } void CInfoViewerBB::reset_allScala() { hddscale->reset(); sysscale->reset(); //lasthdd = lastsys = -1; } void CInfoViewerBB::ResetModules() { if (hddscale){ delete hddscale; hddscale = NULL; } if (sysscale){ delete sysscale; sysscale = NULL; } if (foot){ delete foot; foot = NULL; } if (ca_bar){ delete ca_bar; ca_bar = NULL; } } void CInfoViewerBB::initBBOffset() { int icon_w = 0, icon_h = 0; frameBuffer->getIconSize("nagra_white", &icon_w, &icon_h); // take any ca icon to get its height ca_h = icon_h + 2*OFFSET_INNER_SMALL; bottom_bar_offset = 0; if (g_settings.infobar_casystem_display < 2) { if (g_settings.infobar_casystem_frame) bottom_bar_offset = ca_h + OFFSET_SHADOW/2 + OFFSET_INNER_SMALL; else bottom_bar_offset = ca_h; } } void* CInfoViewerBB::scrambledThread(void *arg) { pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); CInfoViewerBB *infoViewerBB = static_cast(arg); while(1) { if (infoViewerBB->is_visible) infoViewerBB->scrambledCheck(); usleep(500*1000); } return 0; } void CInfoViewerBB::scrambledCheck(bool force) { scrambledErr = false; scrambledNoSig = false; if (videoDecoder->getBlank()) { if (videoDecoder->getPlayState()) scrambledErr = true; else scrambledNoSig = true; } if ((scrambledErr != scrambledErrSave) || (scrambledNoSig != scrambledNoSigSave) || force) { paint_ca_icons(0); showIcon_Resolution(); scrambledErrSave = scrambledErr; scrambledNoSigSave = scrambledNoSig; } } //NI void CInfoViewerBB::paint_cam_icons() { std::ostringstream buf; int emu_pic_startx = g_InfoViewer->ChanInfoX + OFFSET_INNER_MID + (g_settings.infobar_casystem_frame ? FRAME_WIDTH_MIN + OFFSET_INNER_SMALL : 0); int py = g_InfoViewer->BoxEndY + OFFSET_INNER_SMALL; const char *icon_name[] = {"mgcamd","doscam","ncam","oscam","cccam","newcs","gbox"}; const int icon_space = OFFSET_INNER_SMALL; int icon_sizeH = 0; int icon_sizeW = 0; bool useCI = CCamManager::getInstance()->getUseCI(); bool filter_channels = CCamManager::getInstance()->getChannelFilter(); for (int i=0; i < (int)(sizeof(icon_name)/sizeof(icon_name[0])); i++) { if ( getpidof(icon_name[i]) ) { buf.str(""); buf << icon_name[i] << "_green"; if(strstr(icon_name[i], "doscam") || strstr(icon_name[i], "ncam") || strstr(icon_name[i], "oscam")) { if(camCI && useCI && filter_channels) { buf.str(""); buf << icon_name[i] << "_yellow"; } } frameBuffer->paintIcon(buf.str().c_str(), emu_pic_startx, py ); frameBuffer->getIconSize(buf.str().c_str(), &icon_sizeW, &icon_sizeH); emu_pic_startx += icon_space; emu_pic_startx += icon_sizeW; } } if (camCI) { if (useCI) frameBuffer->paintIcon("ci+_green", emu_pic_startx, py); else frameBuffer->paintIcon("ci+_grey", emu_pic_startx, py); } } //NI ecm-Info int CInfoViewerBB::check_ecmInfo() { int caid = 0; CFileHelpers fh; if (fh.copyFile("/tmp/ecm.info", "/tmp/ecm.info.tmp", 0644)) { g_InfoViewer->md5_ecmInfo = filehash((char *)"/tmp/ecm.info.tmp"); caid = parse_ecmInfo("/tmp/ecm.info.tmp"); } return caid; } int CInfoViewerBB::parse_ecmInfo(const char * file) { int acaid = 0; char *buffer; ssize_t read; size_t len; std::string ecm_txt(""); FILE *fh; int w = 0; int ecm_width = 0; int ecm_height = 0; Font * ecm_font = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_ECMINFO]; int font_height = ecm_font->getHeight(); buffer=NULL; if((fh = fopen(file, "r"))) { while ((read = getline(&buffer, &len, fh)) != -1) { if (g_settings.show_ecm) { w = ecm_font->getRenderWidth(buffer); ecm_width = std::max(w, ecm_width); ecm_height += font_height; ecm_txt += buffer; } if ( !acaid && strstr(buffer, "0x") ) { if(sscanf(buffer, "%*[^9-0]%x", &acaid ) == 1) continue; } else if ( strstr(buffer, "source:") || //mgcamd strstr(buffer, "decode:") || //gbox strstr(buffer, "address:") || //cccam strstr(buffer, "protocol:") || //doscam or oscam constcw strstr(buffer, "from:")) //oscam { if ( strstr(buffer, "emu") || //mgcamd strstr(buffer, "constcw") || //doscam or oscam constcw strstr(buffer, "cache3") || //oscam with cacheex strstr(buffer, "Internal")) //gbox { decode = LOCAL; } else if ( strstr(buffer, "slot") || //gbox strstr(buffer, "/dev/sci") || //cccam strstr(buffer, "local") || //oscam strstr(buffer, "com")) { decode = CARD; } else if ( strstr(buffer, "net") || //mgcamd strstr(buffer, "Network") || //gbox strstr(buffer, ".")) //oscam { if ( strstr(buffer, "localhost") || strstr(buffer, "127.0.0.1")) decode = CARD; else decode = REMOTE; } } } fclose(fh); remove(file); if(buffer) free(buffer); } if (g_settings.show_ecm) { if(decode == UNKNOWN || decode == NA || ecm_txt.empty()) { g_InfoViewer->ecmInfoBox_hide(); } else { g_InfoViewer->ecmInfoBox_show(ecm_txt.c_str(), ecm_width, ecm_height, ecm_font); } } return(acaid); }