int CFollowScreenings::exec(CMenuTarget* /*parent*/, const std::string & actionKey) { unsigned long a; if (1 == sscanf(actionKey.c_str(), "%lu", &a)) { int ix = 0; CChannelEventList::iterator e; for (e = followlist.begin(); e != followlist.end(); e++, ix++) if ((time_t)a == e->startTime) { time_t start = e->startTime - (ANNOUNCETIME + 120); time_t stop = e->startTime + e->duration; CTimerd::TimerList overlappingTimers = Timer.getOverlappingTimers(start, stop); CTimerd::TimerList::iterator i; for (i = overlappingTimers.begin(); i != overlappingTimers.end(); i++) if (i->eventType == CTimerd::TIMER_RECORD) { if (channel_id == i->channel_id && e->startTime == i->epg_starttime) { Timer.removeTimerEvent(i->eventID); if (!forwarders.empty()) forwarders[ix]->iconName_Info_right = ""; #if 0 else ShowMsg(LOCALE_TIMER_EVENTREMOVED_TITLE, LOCALE_TIMER_EVENTREMOVED_MSG, CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO); #endif return menu_return::RETURN_REPAINT; } if (!SAME_TRANSPONDER(channel_id, i->channel_id)) { if (!askUserOnTimerConflict(start, stop, channel_id)) return menu_return::RETURN_REPAINT; } } if (g_Timerd->addRecordTimerEvent(channel_id, e->startTime, e->startTime + e->duration, e->eventID, e->startTime, e->startTime - (ANNOUNCETIME + 120 ), apids, true, e->startTime - (ANNOUNCETIME + 120) > time(NULL), recDir, true) == -1) { //FIXME -- no error handling, but this shouldn't happen ... } else { if (!forwarders.empty()) forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_REC; #if 0 else ShowMsg(LOCALE_TIMER_EVENTRECORD_TITLE, LOCALE_TIMER_EVENTRECORD_MSG, CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO); #endif return menu_return::RETURN_REPAINT; } break; // for } return menu_return::RETURN_EXIT_ALL; } show(); return menu_return::RETURN_EXIT_ALL; }
void CFollowScreenings::updateRightIcon(int ix, time_t start, unsigned int duration) { time_t stop = start + duration; start -= (ANNOUNCETIME + 120); CTimerd::TimerList overlappingTimers = Timer.getOverlappingTimers(start, stop); start += (ANNOUNCETIME + 120); CTimerd::TimerList::iterator i; for (i = overlappingTimers.begin(); i != overlappingTimers.end(); i++) if (i->eventType == CTimerd::TIMER_RECORD) { if (channel_id == i->channel_id && start == i->epg_starttime) { forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_REC; return; } if (!SAME_TRANSPONDER(channel_id, i->channel_id)) { forwarders[ix]->iconName_Info_right = NEUTRINO_ICON_IMPORTANT; return; } } }
bool CStreamManager::Parse(int fd, stream_pids_t &pids, t_channel_id &chid) { char cbuf[512]; char *bp; FILE * fp = fdopen(fd, "r+"); if(fp == NULL) { perror("fdopen"); return false; } cbuf[0] = 0; bp = &cbuf[0]; /* read one line */ while (bp - &cbuf[0] < (int) sizeof(cbuf)) { unsigned char c; int res = read(fd, &c, 1); if(res < 0) { perror("read"); return false; } if ((*bp++ = c) == '\n') break; } *bp++ = 0; bp = &cbuf[0]; printf("CStreamManager::Parse: got %s\n", cbuf); /* send response to http client */ if (!strncmp(cbuf, "GET /", 5)) { fprintf(fp, "HTTP/1.1 200 OK\r\nServer: streamts (%s)\r\n\r\n", "ts" /*&argv[1][1]*/); fflush(fp); bp += 5; } else { printf("Received garbage\n"); return false; } #ifndef ENABLE_MULTI_CHANNEL /* parse stdin / url path, start dmx filters */ do { int pid; int res = sscanf(bp, "%x", &pid); if(res == 1) { printf("New pid: 0x%x\n", pid); pids.insert(pid); } } while ((bp = strchr(bp, ',')) && (bp++)); #endif chid = CZapit::getInstance()->GetCurrentChannelID(); CZapitChannel * channel = CZapit::getInstance()->GetCurrentChannel(); int mode = CNeutrinoApp::getInstance()->getMode(); if (mode == NeutrinoMessages::mode_standby && streams.empty()) { printf("CStreamManager::Parse: wakeup zapit..\n"); cpuFreq->SetCpuFreq(g_settings.cpufreq * 1000 * 1000); g_Zapit->setStandby(false); g_Zapit->getMode(); } if(pids.empty()) { #ifdef ENABLE_MULTI_CHANNEL t_channel_id tmpid; bp = &cbuf[5]; if (sscanf(bp, "id=%llx", &tmpid) == 1) { printf("############################# channel_id %llx\n", tmpid); CZapitChannel * tmpchan = CServiceManager::getInstance()->FindChannel(tmpid); if (tmpchan && (tmpid != chid) && SAME_TRANSPONDER(tmpid, chid)) { printf("############################# channel_id %llx -> zap\n", tmpid); bool ret = g_Zapit->zapTo_record(tmpid) > 0; if (ret) { channel = tmpchan; chid = tmpid; } } } if(CRecordManager::getInstance()->RecordingStatus(chid)) { printf("CStreamManager::Parse: channel %llx recorded, aborting..\n", chid); return false; } #ifdef ENABLE_PIP t_channel_id pip_channel_id = CZapit::getInstance()->GetPipChannelID(); if ((chid == pip_channel_id) && (channel->getRecordDemux() == channel->getPipDemux())) { printf("CStreamManager::Parse: channel %llx used for pip, aborting..\n", chid); return false; } #endif #endif printf("CStreamManager::Parse: no pids in url, using channel %llx pids\n", chid); if(!channel) return false; //pids.insert(0); //pids.insert(channel->getPmtPid()); pids.insert(channel->getVideoPid()); for (int i = 0; i < channel->getAudioChannelCount(); i++) pids.insert(channel->getAudioChannel(i)->pid); } CGenPsi psi; for (stream_pids_t::iterator it = pids.begin(); it != pids.end(); ++it) { if (*it == channel->getVideoPid()) { printf("CStreamManager::Parse: genpsi vpid %x (%d)\n", *it, channel->type); psi.addPid(*it, channel->type ? EN_TYPE_AVC : EN_TYPE_VIDEO, 0); } else { for (int i = 0; i < channel->getAudioChannelCount(); i++) { if (*it == channel->getAudioChannel(i)->pid) { CZapitAudioChannel::ZapitAudioChannelType atype = channel->getAudioChannel(i)->audioChannelType; printf("CStreamManager::Parse: genpsi apid %x (%d)\n", *it, atype); if(channel->getAudioChannel(i)->audioChannelType == CZapitAudioChannel::EAC3){ psi.addPid(*it, EN_TYPE_AUDIO_EAC3, atype, channel->getAudioChannel(i)->description.c_str()); }else{ psi.addPid(*it, EN_TYPE_AUDIO, atype, channel->getAudioChannel(i)->description.c_str()); } } } } } //add pcr pid if(channel->getPcrPid() != channel->getVideoPid()){ pids.insert(channel->getPcrPid()); psi.addPid(channel->getPcrPid(), EN_TYPE_PCR, 0); } //add teletext pid if (g_settings.recording_stream_vtxt_pid && channel->getTeletextPid() != 0){ pids.insert(channel->getTeletextPid()); psi.addPid(channel->getTeletextPid(), EN_TYPE_TELTEX, 0, channel->getTeletextLang()); } //add dvb sub pid if (g_settings.recording_stream_subtitle_pids){ for (int i = 0 ; i < (int)channel->getSubtitleCount() ; ++i) { CZapitAbsSub* s = channel->getChannelSub(i); if (s->thisSubType == CZapitAbsSub::DVB) { if(i>9)//max sub pids break; CZapitDVBSub* sd = reinterpret_cast<CZapitDVBSub*>(s); pids.insert(sd->pId); psi.addPid( sd->pId, EN_TYPE_DVBSUB, 0, sd->ISO639_language_code.c_str() ); } } } psi.genpsi(fd); return !pids.empty(); }