diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index 1754c7d76..002265d2a 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -944,6 +944,9 @@ menu.hint_record_apid_std Schließt bei einer Aufnahme die durch den Sender defi menu.hint_record_apids Konfigurieren Sie die Tonspuren für die Aufnahme menu.hint_record_apply Hiermit werden die Aufnahmeoptionen übernommen menu.hint_record_chandir Diese Option speichert Aufnahmen mit dem Namen des Kanals in ein eigenes Verzeichnis +menu.hint_record_data Dataspuren ( Teletext, Untertitel) für die Aufnahme +menu.hint_record_data_dvbsub Untertitel Spur zu Aufnehme Hinzufügen +menu.hint_record_data_vtxt Teletext Spur zu Aufnehme Hinzufügen menu.hint_record_dir Wählen Sie das Aufnahmeverzeichnis menu.hint_record_end Wählen Sie zwischen max. Aufnahmezeit oder einem Aufnahmeende anhand der EPG-Daten menu.hint_record_slow_warn Zeige Warnung, wenn der Aufnahmepuffer zu überlaufen droht @@ -1515,7 +1518,9 @@ recordingmenu.apids Tonspuren recordingmenu.apids_ac3 AC3 Tonspuren aufnehmen recordingmenu.apids_alt Alternative Tonspuren aufn. recordingmenu.apids_std Standard Tonspur aufnehmen +recordingmenu.datapdis Dataspuren recordingmenu.defdir Aufnahmeverzeichnis +recordingmenu.dvbsub_pids Untertitel aufnahmen recordingmenu.end_of_recording_epg EPG aktuelles Event recordingmenu.end_of_recording_max max. Aufnahmezeit recordingmenu.end_of_recording_name Ende der Sofortaufnahme @@ -1537,6 +1542,7 @@ recordingmenu.slow_warn Warnung bei langsamen Aufnahmemedien recordingmenu.timeshift Timeshift recordingmenu.tsdir Timeshift Aufnahmeverzeichnis recordingmenu.vcr Videorekorder +recordingmenu.vtxt_pid Teletext aufnehmen recordingmenu.zap_on_announce Umschalten bei Ankündigung recordtimer.announce Die Aufnahme beginnt in wenigen Minuten. repeatblocker.hint_1 Mindestzeit (in ms) zwischen 2 Tastendrücken diff --git a/data/locale/english.locale b/data/locale/english.locale index ff10725c5..f03ff96f8 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -944,6 +944,9 @@ menu.hint_record_apid_std Record first audio pid menu.hint_record_apids Configure audio pids to record menu.hint_record_apply Apply record options menu.hint_record_chandir Create directory with name of channel\nto store recording +menu.hint_record_data Record (VideoText, subtitles) data streams +menu.hint_record_data_dvbsub subtitle stream +menu.hint_record_data_vtxt VideoText stream menu.hint_record_dir Select directory to store recordings menu.hint_record_end Stop direct record after max. time\nor after current event end time menu.hint_record_slow_warn Show warning, when record buffer is close to overflow @@ -1515,7 +1518,9 @@ recordingmenu.apids Audio streams recordingmenu.apids_ac3 record AC3 streams recordingmenu.apids_alt record alternative streams recordingmenu.apids_std record standard stream +recordingmenu.datapdis Data streams recordingmenu.defdir Recording directory +recordingmenu.dvbsub_pids record dvbsub stream recordingmenu.end_of_recording_epg EPG act. Event recordingmenu.end_of_recording_max max. Recordingtime recordingmenu.end_of_recording_name Endtime of Recording @@ -1537,6 +1542,7 @@ recordingmenu.slow_warn Enable slow record warning recordingmenu.timeshift Timeshift recordingmenu.tsdir Timeshift directory recordingmenu.vcr vcr +recordingmenu.vtxt_pid record teletext recordingmenu.zap_on_announce zap on recording announce recordtimer.announce Recording starts in a few minutes repeatblocker.hint_1 Shortest time (in ms) to recognize 2 keystrokes diff --git a/src/driver/genpsi.cpp b/src/driver/genpsi.cpp index 266b727fd..cd350cf22 100644 --- a/src/driver/genpsi.cpp +++ b/src/driver/genpsi.cpp @@ -1,6 +1,7 @@ /* Copyright (c) 2004 gmo18t, Germany. All rights reserved. Copyright (C) 2012 CoolStream International Ltd + Copyright (C) 2013 Jacek Jendrzej This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -124,8 +125,15 @@ CGenPsi::CGenPsi() nba = 0; vpid = 0; vtype = 0; + + vtxtpid = 0; + vtxtlang[0] = 'g'; + vtxtlang[1] = 'e'; + vtxtlang[2] = 'r'; memset(apid, 0, sizeof(apid)); memset(atypes, 0, sizeof(atypes)); + nsub = 0; + memset(dvbsubpid, 0, sizeof(dvbsubpid)); } uint32_t CGenPsi::calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len) @@ -147,7 +155,7 @@ uint32_t CGenPsi::calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len) return crc; } -void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3) +void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3, const char *data) { switch(pidtype) { @@ -165,8 +173,22 @@ void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3) nba++; break; case EN_TYPE_TELTEX: + vtxtpid = pid; + if(data != NULL){ + vtxtlang[0] = data[0]; + vtxtlang[1] = data[1]; + vtxtlang[2] = data[2]; + } + break; + case EN_TYPE_DVBSUB: + dvbsubpid[nsub] = pid; + if(data != NULL){ + dvbsublang[nsub][0] = data[0]; + dvbsublang[nsub][1] = data[1]; + dvbsublang[nsub][2] = data[2]; + } + nsub++; break; - default: break; } @@ -232,6 +254,8 @@ int CGenPsi::genpsi(int fd) //-- (II) build PAT -- data_len = COPY_TEMPLATE(pkt, pkt_pat); +// pkt[0xf]= 0xE0 | (pmtpid>>8); +// pkt[0x10] = pmtpid & 0xFF; //-- calculate CRC -- calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 ); //-- write TS packet -- @@ -241,6 +265,12 @@ int CGenPsi::genpsi(int fd) data_len = COPY_TEMPLATE(pkt, pkt_pmt); //-- adjust len dependent to count of audio streams -- data_len += (SIZE_STREAM_TAB_ROW * (nba-1)); + if(vtxtpid){ + data_len += (SIZE_STREAM_TAB_ROW * (1))+10;//add teletext row length + } + if(nsub){ + data_len += ((SIZE_STREAM_TAB_ROW+10) * nsub);//add dvbsub row length + } patch_len = data_len - OFS_HDR_2 + 1; pkt[OFS_HDR_2+1] |= (patch_len>>8); pkt[OFS_HDR_2+2] = (patch_len & 0xFF); @@ -266,13 +296,61 @@ int CGenPsi::genpsi(int fd) pkt[ofs+3] = 0xF0; pkt[ofs+4] = 0x00; } + + //teletext + if(vtxtpid){ + ofs += SIZE_STREAM_TAB_ROW; + pkt[ofs] = 0x06; //teletext stream type; + pkt[ofs+1] = 0xE0 | vtxtpid>>8; + pkt[ofs+2] = vtxtpid&0xff; + pkt[ofs+3] = 0xf0; + pkt[ofs+4] = 0x0A; // ES_info_length + pkt[ofs+5] = 0x52; //DVB-DescriptorTag: 82 (0x52) [= stream_identifier_descriptor] + pkt[ofs+6] = 0x01; // descriptor_length + pkt[ofs+7] = 0x03; //component_tag + pkt[ofs+8] = 0x56; // DVB teletext tag + pkt[ofs+9] = 0x05; // descriptor length + pkt[ofs+10] = vtxtlang[0]; //language code[0] + pkt[ofs+11] = vtxtlang[1]; //language code[1] + pkt[ofs+12] = vtxtlang[2]; //language code[2] + pkt[ofs+13] = (/*descriptor_magazine_number*/ 0x01 & 0x06) | ((/*descriptor_type*/ 0x01 << 3) & 0xF8); + pkt[ofs+14] = 0x00 ; //Teletext_page_number + } + + //dvbsub + for (i=0; i 0 || vtxtpid) + ofs += 10; + + pkt[ofs] = 0x06;//subtitle stream type; + pkt[ofs+1] = 0xE0 | dvbsubpid[i]>>8; + pkt[ofs+2] = dvbsubpid[i] & 0xFF; + pkt[ofs+3] = 0xF0; + pkt[ofs+4] = 0x0A; // es info length + pkt[ofs+5] = 0x59; // DVB sub tag + pkt[ofs+6] = 0x08; // descriptor length + pkt[ofs+7] = dvbsublang[i][0]; //language code[0] + pkt[ofs+8] = dvbsublang[i][1]; //language code[1] + pkt[ofs+9] = dvbsublang[i][2]; //language code[2] + pkt[ofs+10] = 0x20; //subtitle_stream.subtitling_type + pkt[ofs+11] = 0x01>>8; //composition_page_id + pkt[ofs+12] = 0x01&0xff; //composition_page_id + pkt[ofs+13] = 0x01>>8; //ancillary_page_id + pkt[ofs+14] = 0x01&0xff; //ancillary_page_id + } + //-- calculate CRC -- calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 ); //-- write TS packet -- write(fd, pkt, SIZE_TS_PKT); + //-- finish -- vpid=0; nba=0; + nsub = 0; + vtxtpid = 0; fdatasync(fd); return 1; } diff --git a/src/driver/genpsi.h b/src/driver/genpsi.h index 3e5c0a051..1fce949d6 100644 --- a/src/driver/genpsi.h +++ b/src/driver/genpsi.h @@ -28,21 +28,26 @@ #define EN_TYPE_TELTEX 0x02 #define EN_TYPE_PCR 0x03 #define EN_TYPE_AVC 0x04 +#define EN_TYPE_DVBSUB 0x06 class CGenPsi { private: - short nba; + short nba, nsub; uint16_t vpid; uint8_t vtype; + uint16_t vtxtpid; + char vtxtlang[3]; uint16_t apid[10]; short atypes[10]; + uint16_t dvbsubpid[10]; + char dvbsublang[10][3]; static int copy_template(uint8_t *dst, uint8_t *src, int len); uint32_t calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len); public: CGenPsi(); - void addPid(uint16_t pid,uint16_t pidtype, short isAC3); + void addPid(uint16_t pid,uint16_t pidtype, short isAC3, const char *data = NULL); int genpsi(int fd); }; #endif diff --git a/src/driver/record.cpp b/src/driver/record.cpp index b1b2a74ba..d7c0626c6 100644 --- a/src/driver/record.cpp +++ b/src/driver/record.cpp @@ -72,7 +72,7 @@ extern "C" { } //------------------------------------------------------------------------- -CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift, bool stream_vtxt_pid, bool stream_pmt_pid) +CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift, bool stream_vtxt_pid, bool stream_pmt_pid, bool stream_subtitle_pids ) { channel_id = eventinfo->channel_id; epgid = eventinfo->epgID; @@ -86,6 +86,8 @@ CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, StreamVTxtPid = stream_vtxt_pid; StreamPmtPid = stream_pmt_pid; + StreamSubtitlePids = stream_subtitle_pids; + Directory = dir; autoshift = timeshift; numpids = 0; @@ -166,10 +168,26 @@ record_error_msg_t CRecordInstance::Start(CZapitChannel * channel) apids[numpids++] = recMovieInfo->audioPids[i].epgAudioPid; psi.addPid(recMovieInfo->audioPids[i].epgAudioPid, EN_TYPE_AUDIO, recMovieInfo->audioPids[i].atype); } + if ((StreamVTxtPid) && (allpids.PIDs.vtxtpid != 0)){ + apids[numpids++] = allpids.PIDs.vtxtpid; + psi.addPid(allpids.PIDs.vtxtpid, EN_TYPE_TELTEX, 0, channel->getTeletextLang()); + } + if (StreamSubtitlePids){ + 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(s); + apids[numpids++] = sd->pId; + psi.addPid( sd->pId, EN_TYPE_DVBSUB, 0, sd->ISO639_language_code.c_str() ); + } + } + + } psi.genpsi(fd); - if ((StreamVTxtPid) && (allpids.PIDs.vtxtpid != 0)) - apids[numpids++] = allpids.PIDs.vtxtpid; if ((StreamPmtPid) && (allpids.PIDs.pmtpid != 0)) apids[numpids++] = allpids.PIDs.pmtpid; @@ -666,6 +684,7 @@ CRecordManager::CRecordManager() { StreamVTxtPid = false; StreamPmtPid = false; + StreamSubtitlePids = false; StopSectionsd = false; //recordingstatus = 0; recmap.clear(); @@ -879,7 +898,7 @@ bool CRecordManager::Record(const CTimerd::RecordingInfo * const eventinfo, cons else newdir = Directory; - inst = new CRecordInstance(eventinfo, newdir, timeshift, StreamVTxtPid, StreamPmtPid); + inst = new CRecordInstance(eventinfo, newdir, timeshift, StreamVTxtPid, StreamPmtPid, StreamSubtitlePids); inst->frontend = frontend; error_msg = inst->Record(); diff --git a/src/driver/record.h b/src/driver/record.h index b8ee4be99..b854f8876 100644 --- a/src/driver/record.h +++ b/src/driver/record.h @@ -83,6 +83,7 @@ class CRecordInstance time_t epg_time; time_t start_time; bool StreamVTxtPid; + bool StreamSubtitlePids; bool StreamPmtPid; unsigned short apids[REC_MAX_APIDS]; unsigned int numpids; @@ -107,7 +108,7 @@ class CRecordInstance record_error_msg_t Start(CZapitChannel * channel); void WaitRecMsg(time_t StartTime, time_t WaitTime); public: - CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift = false, bool stream_vtxt_pid = false, bool stream_pmt_pid = false); + CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift = false, bool stream_vtxt_pid = false, bool stream_pmt_pid = false, bool stream_subtitle_pids = false); ~CRecordInstance(); record_error_msg_t Record(); @@ -146,6 +147,7 @@ class CRecordManager : public CMenuTarget /*, public CChangeObserver*/ std::string Directory; std::string TimeshiftDirectory; bool StreamVTxtPid; + bool StreamSubtitlePids; bool StreamPmtPid; bool StopSectionsd; int last_mode; @@ -201,11 +203,12 @@ class CRecordManager : public CMenuTarget /*, public CChangeObserver*/ bool RunStartScript(void); bool RunStopScript(void); - void Config(const bool stopsectionsd, const bool stream_vtxt_pid, const bool stream_pmt_pid) + void Config(const bool stopsectionsd, const bool stream_vtxt_pid, const bool stream_pmt_pid, bool stream_subtitle_pids ) { - StopSectionsd = stopsectionsd; - StreamVTxtPid = stream_vtxt_pid; - StreamPmtPid = stream_pmt_pid; + StopSectionsd = stopsectionsd; + StreamVTxtPid = stream_vtxt_pid; + StreamSubtitlePids = stream_subtitle_pids; + StreamPmtPid = stream_pmt_pid; }; void SetDirectory(const char * const directory) { Directory = directory; }; void SetTimeshiftDirectory(const char * const directory) { TimeshiftDirectory = directory; }; diff --git a/src/gui/record_setup.cpp b/src/gui/record_setup.cpp index 599754ece..a31d92f76 100644 --- a/src/gui/record_setup.cpp +++ b/src/gui/record_setup.cpp @@ -229,6 +229,13 @@ int CRecordSetup::showRecordSetup() mf->setHint("", LOCALE_MENU_HINT_RECORD_APIDS); recordingSettings->addItem(mf); + //datasettings + CMenuWidget recordingaDataSettings(LOCALE_MAINSETTINGS_RECORDING, NEUTRINO_ICON_SETTINGS, width, MN_WIDGET_ID_RECORDSETUP_DATASETTINGS); + showRecordDataSetup(&recordingaDataSettings); + mf = new CMenuForwarder(LOCALE_RECORDINGMENU_DATAPIDS, true, NULL, &recordingaDataSettings, NULL, CRCInput::RC_1); + mf->setHint("", LOCALE_MENU_HINT_RECORD_DATA); + recordingSettings->addItem(mf); + int res = recordingSettings->exec(NULL, ""); delete recordingSettings; return res; @@ -291,6 +298,22 @@ void CRecordSetup::showRecordAudioSetup(CMenuWidget *menu_audiosettings) menu_audiosettings->addItem(aoj3); } +void CRecordSetup::showRecordDataSetup(CMenuWidget *menu_datasettings) +{ + //recording data pids + + //teletext pids + CMenuOptionChooser* doj1 = new CMenuOptionChooser(LOCALE_RECORDINGMENU_VTXT_PID, &g_settings.recording_stream_vtxt_pid, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this); + CMenuOptionChooser* doj2 = new CMenuOptionChooser(LOCALE_RECORDINGMENU_DVBSUB_PIDS, &g_settings.recording_stream_subtitle_pids, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this); + + doj1->setHint("", LOCALE_MENU_HINT_RECORD_DATA_VTXT); + doj2->setHint("", LOCALE_MENU_HINT_RECORD_DATA_DVBSUB); + + menu_datasettings->addIntroItems(LOCALE_RECORDINGMENU_DATAPIDS); + menu_datasettings->addItem(doj1); + menu_datasettings->addItem(doj2); +} + void CRecordSetup::showRecordTimeShiftSetup(CMenuWidget *menu_ts) { menu_ts->addIntroItems(LOCALE_RECORDINGMENU_TIMESHIFT); diff --git a/src/gui/record_setup.h b/src/gui/record_setup.h index d9693e034..996d31a5d 100644 --- a/src/gui/record_setup.h +++ b/src/gui/record_setup.h @@ -44,6 +44,8 @@ class CRecordSetup : public CMenuTarget, public CChangeObserver int showRecordSetup(); void showRecordTimerSetup(CMenuWidget *menu_timersettings); void showRecordAudioSetup(CMenuWidget *menu_audiosettings); + void showRecordDataSetup(CMenuWidget *menu_datasettings); + void showRecordTimeShiftSetup(CMenuWidget *menu_ts); public: diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 42bc68f1e..7be65d004 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -579,6 +579,7 @@ int CNeutrinoApp::loadSetup(const char * fname) g_settings.shutdown_timer_record_type = configfile.getBool("shutdown_timer_record_type" , false); g_settings.recording_stream_vtxt_pid = configfile.getBool("recordingmenu.stream_vtxt_pid" , false); + g_settings.recording_stream_subtitle_pids = configfile.getBool("recordingmenu.stream_subtitle_pids", false); g_settings.recording_stream_pmt_pid = configfile.getBool("recordingmenu.stream_pmt_pid" , false); g_settings.recording_choose_direct_rec_dir = configfile.getInt32( "recording_choose_direct_rec_dir", 0 ); g_settings.recording_epg_for_filename = configfile.getBool("recording_epg_for_filename" , true); @@ -994,17 +995,18 @@ void CNeutrinoApp::saveSetup(const char * fname) configfile.setInt32 ("recording_type", g_settings.recording_type); configfile.setBool ("recording_stopsectionsd" , g_settings.recording_stopsectionsd ); - configfile.setInt32 ("recording_audio_pids_default" , g_settings.recording_audio_pids_default); + configfile.setInt32 ("recording_audio_pids_default" , g_settings.recording_audio_pids_default ); configfile.setBool ("recording_zap_on_announce" , g_settings.recording_zap_on_announce ); - configfile.setBool ("shutdown_timer_record_type" , g_settings.shutdown_timer_record_type ); + configfile.setBool ("shutdown_timer_record_type" , g_settings.shutdown_timer_record_type ); configfile.setBool ("recordingmenu.stream_vtxt_pid" , g_settings.recording_stream_vtxt_pid ); - configfile.setBool ("recordingmenu.stream_pmt_pid" , g_settings.recording_stream_pmt_pid ); + configfile.setBool ("recordingmenu.stream_subtitle_pids" , g_settings.recording_stream_subtitle_pids ); + configfile.setBool ("recordingmenu.stream_pmt_pid" , g_settings.recording_stream_pmt_pid ); configfile.setInt32 ("recording_choose_direct_rec_dir" , g_settings.recording_choose_direct_rec_dir); configfile.setBool ("recording_epg_for_filename" , g_settings.recording_epg_for_filename ); configfile.setBool ("recording_epg_for_end" , g_settings.recording_epg_for_end ); - configfile.setBool ("recording_save_in_channeldir" , g_settings.recording_save_in_channeldir ); - configfile.setBool ("recording_slow_warning" , g_settings.recording_slow_warning ); + configfile.setBool ("recording_save_in_channeldir" , g_settings.recording_save_in_channeldir ); + configfile.setBool ("recording_slow_warning" , g_settings.recording_slow_warning ); // default plugin for movieplayer configfile.setString ( "movieplayer_plugin", g_settings.movieplayer_plugin ); @@ -1630,7 +1632,7 @@ void CNeutrinoApp::InitZapper() void CNeutrinoApp::setupRecordingDevice(void) { CRecordManager::getInstance()->SetDirectory(g_settings.network_nfs_recordingdir); - CRecordManager::getInstance()->Config(g_settings.recording_stopsectionsd, g_settings.recording_stream_vtxt_pid, g_settings.recording_stream_pmt_pid); + CRecordManager::getInstance()->Config(g_settings.recording_stopsectionsd, g_settings.recording_stream_vtxt_pid, g_settings.recording_stream_pmt_pid, g_settings.recording_stream_subtitle_pids); } static void CSSendMessage(uint32_t msg, uint32_t data) diff --git a/src/neutrino_menue.h b/src/neutrino_menue.h index 179bb84af..3efe11bd3 100644 --- a/src/neutrino_menue.h +++ b/src/neutrino_menue.h @@ -82,6 +82,7 @@ enum MN_WIDGET_ID MN_WIDGET_ID_RECORDSETUP_TIMESHIFT, MN_WIDGET_ID_RECORDSETUP_TIMERSETTINGS, MN_WIDGET_ID_RECORDSETUP_AUDIOSETTINGS, + MN_WIDGET_ID_RECORDSETUP_DATASETTINGS, //vfd setup MN_WIDGET_ID_VFDSETUP, diff --git a/src/system/locals.h b/src/system/locals.h index 8fc8c9ee8..79ced4f47 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -971,6 +971,9 @@ typedef enum LOCALE_MENU_HINT_RECORD_APIDS, LOCALE_MENU_HINT_RECORD_APPLY, LOCALE_MENU_HINT_RECORD_CHANDIR, + LOCALE_MENU_HINT_RECORD_DATA, + LOCALE_MENU_HINT_RECORD_DATA_DVBSUB, + LOCALE_MENU_HINT_RECORD_DATA_VTXT, LOCALE_MENU_HINT_RECORD_DIR, LOCALE_MENU_HINT_RECORD_END, LOCALE_MENU_HINT_RECORD_SLOW_WARN, @@ -1542,6 +1545,8 @@ typedef enum LOCALE_RECORDINGMENU_APIDS_AC3, LOCALE_RECORDINGMENU_APIDS_ALT, LOCALE_RECORDINGMENU_APIDS_STD, + LOCALE_RECORDINGMENU_DATAPIDS, + LOCALE_RECORDINGMENU_DVBSUB_PIDS, LOCALE_RECORDINGMENU_DEFDIR, LOCALE_RECORDINGMENU_END_OF_RECORDING_EPG, LOCALE_RECORDINGMENU_END_OF_RECORDING_MAX, @@ -1564,6 +1569,7 @@ typedef enum LOCALE_RECORDINGMENU_TIMESHIFT, LOCALE_RECORDINGMENU_TSDIR, LOCALE_RECORDINGMENU_VCR, + LOCALE_RECORDINGMENU_VTXT_PID, LOCALE_RECORDINGMENU_ZAP_ON_ANNOUNCE, LOCALE_RECORDTIMER_ANNOUNCE, LOCALE_REPEATBLOCKER_HINT_1, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index cef32f0e9..bdeb03bd3 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -971,6 +971,9 @@ const char * locale_real_names[] = "menu.hint_record_apids", "menu.hint_record_apply", "menu.hint_record_chandir", + "menu.hint_record_data", + "menu.hint_record_data_dvbsub", + "menu.hint_record_data_vtxt", "menu.hint_record_dir", "menu.hint_record_end", "menu.hint_record_slow_warn", @@ -1542,6 +1545,8 @@ const char * locale_real_names[] = "recordingmenu.apids_ac3", "recordingmenu.apids_alt", "recordingmenu.apids_std", + "recordingmenu.datapdis", + "recordingmenu.dvbsub_pids", "recordingmenu.defdir", "recordingmenu.end_of_recording_epg", "recordingmenu.end_of_recording_max", @@ -1564,6 +1569,7 @@ const char * locale_real_names[] = "recordingmenu.timeshift", "recordingmenu.tsdir", "recordingmenu.vcr", + "recordingmenu.vtxt_pid", "recordingmenu.zap_on_announce", "recordtimer.announce", "repeatblocker.hint_1", diff --git a/src/system/settings.h b/src/system/settings.h index c30e3246a..e5aced076 100644 --- a/src/system/settings.h +++ b/src/system/settings.h @@ -325,14 +325,15 @@ struct SNeutrinoSettings int recording_audio_pids_std; int recording_audio_pids_alt; int recording_audio_pids_ac3; - int recording_stream_vtxt_pid; - int recording_stream_pmt_pid; + int recording_stream_vtxt_pid; + int recording_stream_subtitle_pids; + int recording_stream_pmt_pid; int recording_choose_direct_rec_dir; int recording_epg_for_filename; int recording_epg_for_end; int recording_save_in_channeldir; - int recording_zap_on_announce; - int recording_slow_warning; + int recording_zap_on_announce; + int recording_slow_warning; int shutdown_timer_record_type; int filesystem_is_utf8;