From 5d8f1728c74ec2833192b84a05c26d18ce43d887 Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Tue, 23 Oct 2018 19:14:52 +0200 Subject: [PATCH 1/3] Added support for Radio Data System (RDS). --- pvr.hts/addon.xml.in | 2 +- pvr.hts/changelog.txt | 6 + src/tvheadend/HTSPDemuxer.cpp | 234 +++++++++++++++++++++------------- src/tvheadend/HTSPDemuxer.h | 4 + 4 files changed, 158 insertions(+), 88 deletions(-) diff --git a/pvr.hts/addon.xml.in b/pvr.hts/addon.xml.in index 61957aa4..655d9b2c 100644 --- a/pvr.hts/addon.xml.in +++ b/pvr.hts/addon.xml.in @@ -1,7 +1,7 @@ @ADDON_DEPENDS@ diff --git a/pvr.hts/changelog.txt b/pvr.hts/changelog.txt index 3f16ae56..2ac66df9 100644 --- a/pvr.hts/changelog.txt +++ b/pvr.hts/changelog.txt @@ -1,3 +1,9 @@ +4.4.0 +- Add support for Radio Data System (RDS) + +4.3.11 +- updated language files from Transifex + 4.3.10 - Add support for fanart image for recordings if supplied by tvheadend (tvh4.3+). diff --git a/src/tvheadend/HTSPDemuxer.cpp b/src/tvheadend/HTSPDemuxer.cpp index 8c583fb9..896813c1 100644 --- a/src/tvheadend/HTSPDemuxer.cpp +++ b/src/tvheadend/HTSPDemuxer.cpp @@ -32,6 +32,12 @@ #define INVALID_SEEKTIME (-1) #define SPEED_NORMAL (1000) // x1 playback speed +// Not all streams reported to Kodi are directly from tvh, some are created by pvr.hts. +// We need a unique stream index for every stream - tvh-supplied and pvr.hts-created. +// Easiest way is to add a fixed offset to all stream indexes delivered by tvh and to +// use numbers less than TVH_STREAM_INDEX_OFFSET for streams created by pvr.hts. +static const int TVH_STREAM_INDEX_OFFSET = 1000; + using namespace ADDON; using namespace P8PLATFORM; using namespace tvheadend; @@ -384,6 +390,39 @@ bool HTSPDemuxer::ProcessMessage ( const char *method, htsmsg_t *m ) return true; } +void HTSPDemuxer::ProcessRDS(uint32_t idx, const void* bin, size_t binlen) +{ + const uint8_t* data = static_cast(bin); + const size_t offset = binlen - 1; + + static const uint8_t RDS_IDENTIFIER = 0xFD; + + if (data[offset] == RDS_IDENTIFIER) + { + // RDS data present, obtain length. + uint8_t rdslen = data[offset - 1]; + if (rdslen > 0) + { + DemuxPacket* pkt = PVR->AllocateDemuxPacket(rdslen); + if (!pkt) + return; + + uint8_t* rdsdata = new uint8_t[rdslen]; + + // Reassemble UECP block. mpeg stream contains data in reverse order! + for (int i = offset - 2, j = 0; i > 3 && i > offset - 2 - rdslen; i--, j++) + rdsdata[j] = data[i]; + + memcpy(pkt->pData, rdsdata, rdslen); + pkt->iSize = rdslen; + pkt->iStreamId = idx - TVH_STREAM_INDEX_OFFSET; + + m_pktBuffer.Push(pkt); + delete [] rdsdata; + } + } +} + void HTSPDemuxer::ParseMuxPacket ( htsmsg_t *m ) { uint32_t idx, u32; @@ -411,6 +450,8 @@ void HTSPDemuxer::ParseMuxPacket ( htsmsg_t *m ) return; } + idx += TVH_STREAM_INDEX_OFFSET; + /* Drop packets for unknown streams */ if (m_streamStat.find(idx) == m_streamStat.end()) { @@ -464,18 +505,111 @@ void HTSPDemuxer::ParseMuxPacket ( htsmsg_t *m ) m_startTime = time(nullptr); } m_pktBuffer.Push(pkt); + + // Process RDS data, if present. + ProcessRDS(idx, bin, binlen); } else PVR->FreeDemuxPacket(pkt); } -void HTSPDemuxer::ParseSubscriptionStart ( htsmsg_t *m ) +bool HTSPDemuxer::AddStream(const char* type, uint32_t idx, htsmsg_field_t *f) { - htsmsg_t *l; - htsmsg_field_t *f; - DemuxPacket *pkt; + CodecDescriptor codecDescriptor = CodecDescriptor::GetCodecByName(type); + xbmc_codec_t codec = codecDescriptor.Codec(); + + if (codec.codec_type == XBMC_CODEC_TYPE_UNKNOWN) + return false; + + m_streamStat[idx] = 0; + + PVR_STREAM_PROPERTIES::PVR_STREAM stream = {}; + stream.iCodecType = codec.codec_type; + stream.iCodecId = codec.codec_id; + stream.iPID = idx; + + /* Subtitle ID */ + if ((stream.iCodecType == XBMC_CODEC_TYPE_SUBTITLE) && + !strcmp("DVBSUB", type)) + { + uint32_t composition_id = 0, ancillary_id = 0; + htsmsg_get_u32(&f->hmf_msg, "composition_id", &composition_id); + htsmsg_get_u32(&f->hmf_msg, "ancillary_id" , &ancillary_id); + stream.iSubtitleInfo = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); + } + + /* Language */ + if (stream.iCodecType == XBMC_CODEC_TYPE_SUBTITLE || + stream.iCodecType == XBMC_CODEC_TYPE_AUDIO || + stream.iCodecType == XBMC_CODEC_TYPE_RDS) + { + const char *language; + if ((language = htsmsg_get_str(&f->hmf_msg, "language")) != NULL) + strncpy(stream.strLanguage, language, sizeof(stream.strLanguage) - 1); + } + + /* Audio data */ + if (stream.iCodecType == XBMC_CODEC_TYPE_AUDIO) + { + stream.iChannels = htsmsg_get_u32_or_default(&f->hmf_msg, "channels", 2); + stream.iSampleRate = htsmsg_get_u32_or_default(&f->hmf_msg, "rate", 48000); + } + + /* RDS data */ + if (stream.iCodecType == XBMC_CODEC_TYPE_AUDIO && + !strcmp("MPEG2AUDIO", type)) + { + // Add RDS stream for the mpeg2 audio stream. It can contain embedded RDS data. + if (!AddStream("rds", idx - TVH_STREAM_INDEX_OFFSET, f)) + return false; + } + /* Video */ + if (stream.iCodecType == XBMC_CODEC_TYPE_VIDEO) + { + stream.iWidth = htsmsg_get_u32_or_default(&f->hmf_msg, "width", 0); + stream.iHeight = htsmsg_get_u32_or_default(&f->hmf_msg, "height", 0); + + /* Ignore this message if the stream details haven't been determined + yet, a new message will be sent once they have. This is fixed in + some versions of tvheadend and is here for backward compatibility. */ + if (stream.iWidth == 0 || stream.iHeight == 0) + { + Logger::Log(LogLevel::LEVEL_DEBUG, "Ignoring subscriptionStart, stream details missing"); + return false; + } + + /* Setting aspect ratio to zero will cause XBMC to handle changes in it */ + stream.fAspect = 0.0f; + + uint32_t duration; + if ((duration = htsmsg_get_u32_or_default(&f->hmf_msg, "duration", 0)) > 0) + { + stream.iFPSScale = duration; + stream.iFPSRate = DVD_TIME_BASE; + } + } + + /* We can only use PVR_STREAM_MAX_STREAMS streams */ + if (m_streams.size() < PVR_STREAM_MAX_STREAMS) + { + Logger::Log(LogLevel::LEVEL_DEBUG, " id: %d, type %s, codec: %u", idx, type, stream.iCodecId); + m_streams.emplace_back(stream); + return true; + } + else + { + Logger::Log(LogLevel::LEVEL_INFO, "Maximum stream limit reached ignoring id: %d, type %s, codec: %u", idx, type, + stream.iCodecId); + return false; + } +} + +void HTSPDemuxer::ParseSubscriptionStart ( htsmsg_t *m ) +{ /* Validate */ + htsmsg_t* l; + if ((l = htsmsg_get_list(m, "streams")) == NULL) { Logger::Log(LogLevel::LEVEL_ERROR, "malformed subscriptionStart: 'streams' missing"); @@ -490,102 +624,28 @@ void HTSPDemuxer::ParseSubscriptionStart ( htsmsg_t *m ) Logger::Log(LogLevel::LEVEL_DEBUG, "demux subscription start"); /* Process each */ + htsmsg_field_t* f; HTSMSG_FOREACH(f, l) { - uint32_t idx, u32; - const char *type; - if (f->hmf_type != HMF_MAP) continue; + + const char *type; if ((type = htsmsg_get_str(&f->hmf_msg, "type")) == NULL) continue; + + uint32_t idx; if (htsmsg_get_u32(&f->hmf_msg, "index", &idx)) continue; - /* Find stream */ - m_streamStat[idx] = 0; - PVR_STREAM_PROPERTIES::PVR_STREAM stream = {}; - - Logger::Log(LogLevel::LEVEL_DEBUG, "demux subscription start"); - - CodecDescriptor codecDescriptor = CodecDescriptor::GetCodecByName(type); - xbmc_codec_t codec = codecDescriptor.Codec(); - - if (codec.codec_type != XBMC_CODEC_TYPE_UNKNOWN) - { - stream.iCodecType = codec.codec_type; - stream.iCodecId = codec.codec_id; - stream.iPID = idx; - - /* Subtitle ID */ - if ((stream.iCodecType == XBMC_CODEC_TYPE_SUBTITLE) && - !strcmp("DVBSUB", type)) - { - uint32_t composition_id = 0, ancillary_id = 0; - htsmsg_get_u32(&f->hmf_msg, "composition_id", &composition_id); - htsmsg_get_u32(&f->hmf_msg, "ancillary_id" , &ancillary_id); - stream.iSubtitleInfo = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); - } - - /* Language */ - if (stream.iCodecType == XBMC_CODEC_TYPE_SUBTITLE || - stream.iCodecType == XBMC_CODEC_TYPE_AUDIO) - { - const char *language; - - if ((language = htsmsg_get_str(&f->hmf_msg, "language")) != NULL) - strncpy(stream.strLanguage, language, sizeof(stream.strLanguage) - 1); - } - - /* Audio data */ - if (stream.iCodecType == XBMC_CODEC_TYPE_AUDIO) - { - stream.iChannels = htsmsg_get_u32_or_default(&f->hmf_msg, "channels", 2); - stream.iSampleRate = htsmsg_get_u32_or_default(&f->hmf_msg, "rate", 48000); - } - - /* Video */ - if (stream.iCodecType == XBMC_CODEC_TYPE_VIDEO) - { - stream.iWidth = htsmsg_get_u32_or_default(&f->hmf_msg, "width", 0); - stream.iHeight = htsmsg_get_u32_or_default(&f->hmf_msg, "height", 0); - - /* Ignore this message if the stream details haven't been determined - yet, a new message will be sent once they have. This is fixed in - some versions of tvheadend and is here for backward compatibility. */ - if (stream.iWidth == 0 || stream.iHeight == 0) - { - Logger::Log(LogLevel::LEVEL_DEBUG, "Ignoring subscriptionStart, stream details missing"); - return; - } - - /* Setting aspect ratio to zero will cause XBMC to handle changes in it */ - stream.fAspect = 0.0f; - - if ((u32 = htsmsg_get_u32_or_default(&f->hmf_msg, "duration", 0)) > 0) - { - stream.iFPSScale = u32; - stream.iFPSRate = DVD_TIME_BASE; - } - } - - /* We can only use PVR_STREAM_MAX_STREAMS streams */ - if (m_streams.size() < PVR_STREAM_MAX_STREAMS) - { - Logger::Log(LogLevel::LEVEL_DEBUG, " id: %d, type %s, codec: %u", idx, type, stream.iCodecId); - m_streams.emplace_back(stream); - } - else - { - Logger::Log(LogLevel::LEVEL_INFO, "Maximum stream limit reached ignoring id: %d, type %s, codec: %u", idx, type, - stream.iCodecId); - } - } + idx += TVH_STREAM_INDEX_OFFSET; + AddStream(type, idx, f); } /* Update streams */ Logger::Log(LogLevel::LEVEL_DEBUG, "demux stream change"); - pkt = PVR->AllocateDemuxPacket(0); + + DemuxPacket* pkt = PVR->AllocateDemuxPacket(0); pkt->iStreamId = DMX_SPECIALID_STREAMCHANGE; m_pktBuffer.Push(pkt); diff --git a/src/tvheadend/HTSPDemuxer.h b/src/tvheadend/HTSPDemuxer.h index c344ba71..1f8ca2fd 100644 --- a/src/tvheadend/HTSPDemuxer.h +++ b/src/tvheadend/HTSPDemuxer.h @@ -110,6 +110,10 @@ class HTSPDemuxer void ParseTimeshiftStatus(htsmsg_t *m); void ParseDescrambleInfo(htsmsg_t *m); + bool AddStream(const char* type, uint32_t idx, htsmsg_field_t *f); + + void ProcessRDS(uint32_t idx, const void* bin, size_t binlen); + mutable P8PLATFORM::CMutex m_mutex; HTSPConnection &m_conn; P8PLATFORM::SyncedBuffer m_pktBuffer; From fe0a7ab94b8b4083605480a9a60b3e00a62a49e2 Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Tue, 23 Oct 2018 21:23:22 +0200 Subject: [PATCH 2/3] Time to say good bye to the 'unstable software disclaimer'. --- pvr.hts/addon.xml.in | 60 -------------------------------------------- 1 file changed, 60 deletions(-) diff --git a/pvr.hts/addon.xml.in b/pvr.hts/addon.xml.in index 655d9b2c..61a849a9 100644 --- a/pvr.hts/addon.xml.in +++ b/pvr.hts/addon.xml.in @@ -121,66 +121,6 @@ Giao tiếp cho Tvheadend; hỗ trợ truyền phát và thu chương trình Live TV, hẹn giờ, và hiển thị lịch chiếu (EPG) Tvheadend 前端,支持直播电视和录像流媒体、电子节目单、定时器 Tvheadend前端,支援的串流媒體包含有直播電視和錄製節目,電子節目表,定時器 等 - Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, vermorsde ure, of enige ander ongewensde effekte... - This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляното време и други нежелани ефекти. - Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualssevol altres efectes no desitjats.. - Tento software není stabilní! Autoři nejsou žádným způsobem zodpovědní za neúspěšná nahrávání, chybné časovače, ztracený čas nebo jakékoliv jiné nežádoucí výsledky… - Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. - Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser. - Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewünschte Effekte. - Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα.. - This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. - ¡Este software es inestable! Los autores no se responsabilizan de grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado... - ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... - See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. - Software hau beta bertsioan dago! Egilea ez da arduratzen grabaketa erroretaz, kronometro erroreak, hordu galduak edo beste edozein ondorio ezerosotaz - Tämä on epävakaa ohjelma! Sen tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksista, haaskatusta ajasta, verenpaineen noususta tai mistään muusta epäsuotuisasta vaikutuksesta. - Ce logiciel est instable ! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. - Logiciel en cours d'élaboration ! Les auteurs ne sont en aucun cas responsables de l'échec des enregistrements, programmations défectueuses, temps perdu ou autres effets indésirables. - Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. - זוהי איננה הרחבה יציבה! המפתחים אינם אחראים על כשלון בניגון, זמנים שגויים במדריך השידורים, שעות מבוזבזות או כל תופעה לא רצויה אחרת. - Ovo je nestabilan softver! Autori nisu ni na koji način odgovorni za neuspjelo snimanje, netočna vremena snimanja, izgubljene sate, ili bilo koje druge nepoželjne učinke. - Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... - Սա անկայուն ծրագրային ապահովում է: Հեղինակները պատասխանատու չեն վատ ձայնագրումների, սխալ ժամանակացույցերի, կորած ժամանակի կամ այլ ոչ ցանկալի երևույթների համար: - Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... - Þetta er óstöðugur hugbúnaður! Höfundarnir eru á engann hátt ábyrgir fyrir misheppnuðum upptökum, röngum upptökutímum, klukkustundum sem að fóru í súginn eða nokkrum öðrum óæskilegum áhrifum. - Questo software è instabile! Gli autori non sono in alcun modo responsabili per registrazioni fallite, timers incorretti, ore perse, o qualsiasi altro effetto indesiderato. - これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 - 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. - Tai yra nestabili programinė įranga! Autorius jokiu būdu nėra neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](Kodi.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] - Šī ir nestabila programmatūra! Autori nav atbildīgi par nesanākušiem ierakstiem, nepareiziem taimeriem, iztērētām stundām vai jebkādiem citiem nevēlamiem efektiem.. - This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects. - Тус програм нь гүйцэд хийгдэж дуусаагүй! Зохиогч нь алдаатай бичлэг, цагийн буруу хөтлөлт, алдагдсан цаг хугацаа эсвэл бусад ямар нэгэн хүсээгүй үр дүнд хариуцлага хүлээхгүй. - Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. - Dan il-programm mhuwiex stabbli! L-Awturi m'humiex responsabbli bl-ebda mod għal rekordings li ma jirnexxewx, arloġġi żbaljati, siegħat moħlija, jew kwalunkwe effett ieħor mhux mixtieq. - Dette er ustabilt programvare! Forfatterne er ikke ansvarlig på noen måte for ødelagte opptak, uriktige tidsur, bortkastede timer, eller andre uønskede hendelser… - Dit is instabiele software! De auteurs zijn op geen enkele wijze verantwoordelijk voor de mislukte opnames, onjuiste timers, verspilde uren, of een andere ongewenste effecten. - Oprogramowanie nadal jest w fazie rozwoju i jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za nieudane nagrania, błędy w harmonogramie nagrań, zmarnowany czas ani jakiekolwiek inne niepożądane efekty. - Este é um software instável! Os autores não são responsáveis por falhas nas gravações, agendamentos incorretos, horas desperdiçadas, ou quaisquer outros efeitos indesejáveis... - Este software é instável! Os autores não podem ser responsabilizados por gravações falhadas, temporizadores incorretos, horas desperdiçadas ou qualquer outro tipo de efeitos indesejáveis... - Această parte din program nu este stabilă! Autorii nu sunt în niciun caz responsabili pentru înregistrările eșuate, cronometre incorecte, ore pierdute sau orice alt efect nedorit. - Это нестабильная программа! Авторы не несут ответственности за неудачную запись, неправильные таймеры, потраченное время и другие нежелательные последствия. - මෙය අස්ථිර මෘදුකාංගයකි! මෙහි සිදුවන පටිගත කිරීම් අසාර්ථක වීම්, සාවද්‍ය මුහුර්තක, නාස්ති වූ කාලයන්, හෝ වෙනත් යමිකිසි නුසුදුසු බලපෑම් සඳහා කතෘ වග කියනු නොලැබේ. - Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. - To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... - Ky program nuk është ende stabil! Autorët e këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tilla të padëshirueshme. - Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправне тајмере, изгубљене сате, или било које друге нежељене ефекте... - Ovaj softver je nestabilan! Autori ni na koji način nisu odgovorni za neuspela snimanja, neispravne tajmere, izgubljene sate, ili bilo koje druge neželjene efekte... - Detta är ostabil programvara! Upphovsmännen är inte ansvariga för felaktiga inspelningar, inkorrekta timers, slösad tid eller andra oönskade effekter.. - To je niystabilny softwer! Autōry niy sōm ôdpedzialne za niypodarzōne graniy, niynŏleżne godziny EPG, stracōne godziny i inksze niychciane efekty. - ఇది అస్థిర సాఫ్ట్వేర్! విఫలమైన రికార్డింగ్లు, తప్పు టైమర్లు, వృధా గంటల, లేదా ఏ ఇతర అవాంఛనీయ ప్రభావాలకు ఏ విధంగా రచయితలు భాద్యుతులు కారు. - Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. - นี่คือโปรแกรมที่ยังไม่เสถียร! ผู้เขียนไม่อยู่ในทางที่จะรับผิดชอบในการบันทึกที่ล้มเหลว, การตั้งเวลาที่ไม่ถูกต้อง, การเสียเวลา, หรือผลกระทบที่ไม่พึงประสงค์อื่น ๆ.. - Bu kararsız bir yazılımdır! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. - Це нестабільна програма! Автори не несуть відповідальності за зіпсовані записи, неправильні таймери, втрачений час та інші небажані ефекти. - Đây là phần mềm không ổn định! Các tác giả không chịu trách nhiệm đối với bản ghi âm thất bại, giờ không chính xác, giờ lãng phí, hoặc bất kỳ tác dụng không mong muốn khác.. - 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 - 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @PLATFORM@ From 6dc6cf9780e5bdc675554748a0b4a400d3d1c4dd Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Tue, 23 Oct 2018 21:30:34 +0200 Subject: [PATCH 3/3] Settings: Enable async EPG data transfer by default. --- pvr.hts/changelog.txt | 1 + pvr.hts/resources/settings.xml | 2 +- src/tvheadend/Settings.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pvr.hts/changelog.txt b/pvr.hts/changelog.txt index 2ac66df9..dd66e92a 100644 --- a/pvr.hts/changelog.txt +++ b/pvr.hts/changelog.txt @@ -1,5 +1,6 @@ 4.4.0 - Add support for Radio Data System (RDS) +- Enable async EPG data transfer by default 4.3.11 - updated language files from Transifex diff --git a/pvr.hts/resources/settings.xml b/pvr.hts/resources/settings.xml index cf6e0565..79761505 100644 --- a/pvr.hts/resources/settings.xml +++ b/pvr.hts/resources/settings.xml @@ -39,7 +39,7 @@ - + diff --git a/src/tvheadend/Settings.cpp b/src/tvheadend/Settings.cpp index 78b57c05..8d119c07 100644 --- a/src/tvheadend/Settings.cpp +++ b/src/tvheadend/Settings.cpp @@ -34,7 +34,7 @@ const std::string Settings::DEFAULT_PASSWORD = ""; const int Settings::DEFAULT_CONNECT_TIMEOUT = 10000; // millisecs const int Settings::DEFAULT_RESPONSE_TIMEOUT = 5000; // millisecs const bool Settings::DEFAULT_TRACE_DEBUG = false; -const bool Settings::DEFAULT_ASYNC_EPG = false; +const bool Settings::DEFAULT_ASYNC_EPG = true; const bool Settings::DEFAULT_PRETUNER_ENABLED = false; const int Settings::DEFAULT_TOTAL_TUNERS = 1; // total tuners > 1 => predictive tuning active const int Settings::DEFAULT_PRETUNER_CLOSEDELAY = 10; // secs