diff --git a/lib/libdvbsub/dvbsub.cpp b/lib/libdvbsub/dvbsub.cpp index a70ebc73e..7411f1731 100644 --- a/lib/libdvbsub/dvbsub.cpp +++ b/lib/libdvbsub/dvbsub.cpp @@ -73,10 +73,10 @@ int dvbsub_init() { int dvbsub_pause() { if(reader_running) { + dvbsub_paused = true; if(dvbSubtitleConverter) { dvbSubtitleConverter->Pause(true); } - dvbsub_paused = true; printf("[dvb-sub] paused\n"); } @@ -89,7 +89,6 @@ int dvbsub_start(int pid) return 0; } - if(pid) { if(pid != dvbsub_pid) dvbsub_pause(); @@ -108,7 +107,7 @@ int dvbsub_start(int pid) printf("[dvb-sub] started with pid 0x%x\n", pid); } - return 0; + return 1; } int dvbsub_stop() @@ -290,7 +289,6 @@ static void* dvbsub_thread(void* /*arg*/) while(dvbsub_running) { uint8_t* packet; int64_t pts; - int pts_dts_flag; int dataoffset; int packlen; diff --git a/lib/libtuxtxt/Makefile.am b/lib/libtuxtxt/Makefile.am index c4d95e4ef..a9fe2fc0e 100644 --- a/lib/libtuxtxt/Makefile.am +++ b/lib/libtuxtxt/Makefile.am @@ -1,6 +1,7 @@ INCLUDES = \ -I$(top_srcdir)/src/zapit/include \ - -I$(top_srcdir)/lib/libcoolstream + -I$(top_srcdir)/lib/libcoolstream \ + -I$(top_srcdir)/src AM_CPPFLAGS = -fno-rtti -fno-exceptions diff --git a/lib/libtuxtxt/teletext.h b/lib/libtuxtxt/teletext.h index 15e37d510..58a0b0c50 100644 --- a/lib/libtuxtxt/teletext.h +++ b/lib/libtuxtxt/teletext.h @@ -5,8 +5,9 @@ extern int tuxtxt_init(); extern void tuxtxt_close(); extern void tuxtxt_start(int tpid); // Start caching extern int tuxtxt_stop(); // Stop caching -extern int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h, int page = 0); +extern int tuxtx_main(int _rc, int pid, int page = 0); void tuxtx_stop_subtitle(); -int tuxtx_subtitle_running(int pid, int page); +int tuxtx_subtitle_running(int pid, int page, int *running); +void tuxtx_pause_subtitle(bool pause = 1); #endif diff --git a/lib/libtuxtxt/tuxtxt.cpp b/lib/libtuxtxt/tuxtxt.cpp index bca296420..e896790bc 100644 --- a/lib/libtuxtxt/tuxtxt.cpp +++ b/lib/libtuxtxt/tuxtxt.cpp @@ -15,6 +15,7 @@ #include "tuxtxt.h" #include +#include "driver/framebuffer.h" void FillRect(int x, int y, int w, int h, int color) { @@ -1477,20 +1478,45 @@ void eval_l25() * main loop * ******************************************************************************/ -static int subtitle_mode; static pthread_t ttx_sub_thread; static int reader_running; +static int ttx_paused; +static int ttx_req_pause; static void* reader_thread(void * /*arg*/) { printf("TuxTxt subtitle thread started\n"); reader_running = 1; + ttx_paused = 0; while(reader_running) { - RenderPage(); + if(ttx_paused) + usleep(10); + else + RenderPage(); + if(ttx_req_pause) { + ttx_req_pause = 0; + ttx_paused = 1; + } } CleanUp(); tuxtxt_close(); printf("TuxTxt subtitle thread stopped\n"); + pthread_exit(NULL); +} + +void tuxtx_pause_subtitle(bool pause) +{ + if(!reader_running) + return; + + if(!pause) + ttx_paused = 0; + else { + ttx_req_pause = 1; + while(!ttx_paused) + sleep(10); + printf("TuxTxt subtitle paused\n"); + } } void tuxtx_stop_subtitle() @@ -1502,8 +1528,11 @@ void tuxtx_stop_subtitle() ttx_sub_thread = NULL; } -int tuxtx_subtitle_running(int pid, int page) +int tuxtx_subtitle_running(int pid, int page, int *running) { + if(running) + *running = reader_running; + if(reader_running && (tuxtxt_cache.vtxtpid == pid) && (tuxtxt_cache.page == page)) { return 1; @@ -1511,11 +1540,11 @@ int tuxtx_subtitle_running(int pid, int page) return 0; } -int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h, int page) +int tuxtx_main(int _rc, int pid, int page) { char cvs_revision[] = "$Revision: 1.95 $"; - subtitle_mode = 0; + bool use_gui = 1; //printf("to init tuxtxt\n");fflush(stdout); #if !TUXTXT_CFG_STANDALONE int initialized = tuxtxt_init(); @@ -1523,7 +1552,7 @@ int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h, int pag tuxtxt_cache.page = 0x100; if(page) { tuxtxt_cache.page = page; - subtitle_mode = 1; + use_gui = 1; } #endif @@ -1539,7 +1568,12 @@ int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h, int pag } rc = _rc; - lfb = (unsigned char *) _fb; + lfb = (unsigned char *) CFrameBuffer::getInstance()->getFrameBufferPointer(); + + int x = CFrameBuffer::getInstance()->getScreenX(); + int y = CFrameBuffer::getInstance()->getScreenY(); + int w = CFrameBuffer::getInstance()->getScreenWidth(); + int h = CFrameBuffer::getInstance()->getScreenHeight(); tuxtxt_cache.vtxtpid = pid; @@ -1582,7 +1616,7 @@ int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h, int pag if (Init() == 0) return 0; - if(subtitle_mode) { + if(!use_gui) { pthread_create(&ttx_sub_thread, 0, reader_thread, (void *) NULL); return 1; } diff --git a/src/gui/audio_select.cpp b/src/gui/audio_select.cpp index b9c8f321a..7826776ed 100644 --- a/src/gui/audio_select.cpp +++ b/src/gui/audio_select.cpp @@ -135,7 +135,7 @@ int CAudioSelectMenuHandler::doMenu () char item[64]; sprintf(item, "TTX: %s (pid %x page %03X)", sd->ISO639_language_code.c_str(), sd->pId, page); AudioSelector.addItem(new CMenuForwarderNonLocalized(item /*sd->ISO639_language_code.c_str()*/, - !tuxtx_subtitle_running(sd->pId, page), NULL, &SubtitleChanger, spid, CRCInput::convertDigitToKey(++count))); + !tuxtx_subtitle_running(sd->pId, page, NULL), NULL, &SubtitleChanger, spid, CRCInput::convertDigitToKey(++count))); } } if(sep_added) { diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 8f349e213..f7d913f9b 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -2597,23 +2597,23 @@ void CNeutrinoApp::RealRun(CMenuWidget &mainMenu) if( ( mode == mode_tv ) || ( ( mode == mode_radio ) ) ) { if( (msg == NeutrinoMessages::SHOW_EPG) /* || (msg == CRCInput::RC_info) */ ) { //g_EpgData->show( g_Zapit->getCurrentServiceID() ); - dvbsub_pause(); + StopSubtitles(); g_EpgData->show(live_channel_id); - dvbsub_start(0); + StartSubtitles(); } else if( msg == CRCInput::RC_epg ) { - dvbsub_pause(); + StopSubtitles(); g_EventList->exec(live_channel_id, channelList->getActiveChannelName()); - dvbsub_start(0); + StartSubtitles(); } else if( msg == CRCInput::RC_text) { g_RCInput->clearRCMsg(); if(g_settings.mode_clock) InfoClock->StopClock(); - dvbsub_pause(); + StopSubtitles(); + tuxtx_stop_subtitle(); - tuxtx_main(g_RCInput->getFileHandle(), frameBuffer->getFrameBufferPointer(), g_RemoteControl->current_PIDs.PIDs.vtxtpid, - frameBuffer->getScreenX(), frameBuffer->getScreenY(), frameBuffer->getScreenWidth(), frameBuffer->getScreenHeight()); + tuxtx_main(g_RCInput->getFileHandle(), g_RemoteControl->current_PIDs.PIDs.vtxtpid); frameBuffer->paintBackground(); //if(!g_settings.cacheTXT) @@ -2622,11 +2622,11 @@ void CNeutrinoApp::RealRun(CMenuWidget &mainMenu) AudioMute(current_muted, true); if(g_settings.mode_clock) InfoClock->StartClock(); - dvbsub_start(0); + StartSubtitles(); } else if( msg == CRCInput::RC_setup ) { if(!g_settings.minimode) { - dvbsub_pause(); + StopSubtitles(); if(g_settings.mode_clock) InfoClock->StopClock(); mainMenu.exec(NULL, ""); @@ -2634,7 +2634,7 @@ void CNeutrinoApp::RealRun(CMenuWidget &mainMenu) AudioMute(current_muted, true); if(g_settings.mode_clock) InfoClock->StartClock(); - dvbsub_start(0); + StartSubtitles(); saveSetup(NEUTRINO_SETTINGS_FILE); } } @@ -2659,7 +2659,7 @@ void CNeutrinoApp::RealRun(CMenuWidget &mainMenu) } else if( msg == (neutrino_msg_t) g_settings.key_subchannel_up ) { if(g_RemoteControl->subChannels.size() > 0) { - dvbsub_pause(); + StopSubtitles(); g_RemoteControl->subChannelUp(); g_InfoViewer->showSubchan(); } else @@ -2667,7 +2667,7 @@ void CNeutrinoApp::RealRun(CMenuWidget &mainMenu) } else if( msg == (neutrino_msg_t) g_settings.key_subchannel_down ) { if(g_RemoteControl->subChannels.size()> 0) { - dvbsub_pause(); + StopSubtitles(); g_RemoteControl->subChannelDown(); g_InfoViewer->showSubchan(); } else @@ -2679,15 +2679,15 @@ void CNeutrinoApp::RealRun(CMenuWidget &mainMenu) InfoClock->StopClock(); g_settings.mode_clock=false; } else { - dvbsub_pause(); + StopSubtitles(); int res = channelList->numericZap( msg ); if(res < 0) - dvbsub_start(0); + StartSubtitles(); } } else if( msg == (neutrino_msg_t) g_settings.key_lastchannel ) { // Quick Zap - dvbsub_pause(); + StopSubtitles(); channelList->numericZap( msg ); } else if( msg == (neutrino_msg_t) g_settings.key_plugin ) { @@ -2706,11 +2706,11 @@ printf("[neutrino] timeshift try, recordingstatus %d, rec dir %s, timeshift dir if(g_RemoteControl->is_video_started) { if(recordingstatus) { - //dvbsub_pause(); + //StopSubtitles(); moviePlayerGui->exec(NULL, tmode); - //dvbsub_start(0); + //StartSubtitles(); } else if(msg != CRCInput::RC_rewind) { - //dvbsub_pause(); + //StopSubtitles(); if(g_settings.temp_timeshift) { startAutoRecord(true); } else { @@ -2718,9 +2718,9 @@ printf("[neutrino] timeshift try, recordingstatus %d, rec dir %s, timeshift dir doGuiRecord(g_settings.network_nfs_recordingdir, true); } if(recordingstatus) { - //dvbsub_pause(); + //StopSubtitles(); moviePlayerGui->exec(NULL, tmode); - //dvbsub_start(0); + //StartSubtitles(); } } } @@ -2738,30 +2738,30 @@ printf("[neutrino] direct record\n"); } } else if( msg == CRCInput::RC_red ) { - dvbsub_pause(); + StopSubtitles(); showUserMenu(SNeutrinoSettings::BUTTON_RED); - dvbsub_start(0); + StartSubtitles(); } else if( (msg == CRCInput::RC_green) || ((msg == CRCInput::RC_audio) && !g_settings.audio_run_player) ) { - dvbsub_pause(); + StopSubtitles(); showUserMenu(SNeutrinoSettings::BUTTON_GREEN); - dvbsub_start(0); + StartSubtitles(); } else if( msg == CRCInput::RC_yellow ) { // NVODs - dvbsub_pause(); + StopSubtitles(); showUserMenu(SNeutrinoSettings::BUTTON_YELLOW); - dvbsub_start(0); + StartSubtitles(); } else if( msg == CRCInput::RC_blue ) { - dvbsub_pause(); + StopSubtitles(); showUserMenu(SNeutrinoSettings::BUTTON_BLUE); - dvbsub_start(0); + StartSubtitles(); } else if( (msg == CRCInput::RC_audio) && g_settings.audio_run_player) { - dvbsub_pause(); + StopSubtitles(); audioPlayer->exec(NULL, ""); - dvbsub_start(0); + StartSubtitles(); } else if( msg == CRCInput::RC_video || msg == CRCInput::RC_play ) { bool show = true; @@ -2771,13 +2771,13 @@ printf("[neutrino] direct record\n"); delete zapProtection; } if(show) { - //dvbsub_pause(); + //StopSubtitles(); if( mode == mode_radio ) videoDecoder->StopPicture(); moviePlayerGui->exec(NULL, "tsmoviebrowser"); if( mode == mode_radio ) videoDecoder->ShowPicture(DATADIR "/neutrino/icons/radiomode.jpg"); - //dvbsub_start(0); + //StartSubtitles(); } } else if (CRCInput::isNumeric(msg) && g_RemoteControl->director_mode ) { @@ -2796,9 +2796,9 @@ printf("[neutrino] direct record\n"); // show Infoviewer if(show_info && channelList->getSize()) { - dvbsub_pause(); + StopSubtitles(); g_InfoViewer->showTitle(channelList->getActiveChannelNumber(), channelList->getActiveChannelName(), channelList->getActiveSatellitePosition(), channelList->getActiveChannel_ChannelID()); // UTF-8 - dvbsub_start(0); + StartSubtitles(); } } #if 0 @@ -2935,7 +2935,7 @@ int CNeutrinoApp::handleMsg(const neutrino_msg_t msg, neutrino_msg_data_t data) if(g_settings.mode_clock) InfoClock->StopClock(); - dvbsub_pause(); + StopSubtitles(); int nNewChannel = -1; int old_num = 0; @@ -2981,8 +2981,9 @@ _repeat: if(g_settings.mode_clock) InfoClock->StartClock(); + /* FIXME: more check for StartSubtitles() like was no zap ?? */ if(mode == mode_tv) - dvbsub_start(0); + StartSubtitles(); return messages_return::handled; } } @@ -3714,7 +3715,7 @@ void CNeutrinoApp::tvMode( bool rezap ) g_InfoViewer->lcdUpdateTimer = g_RCInput->addTimer( LCD_UPDATE_TIME_TV_MODE, false ); CVFD::getInstance()->ShowIcon(VFD_ICON_RADIO, false); if(!rezap) - dvbsub_start(0); + StartSubtitles(); } CVFD::getInstance()->setMode(CVFD::MODE_TVRADIO); @@ -3808,7 +3809,7 @@ void CNeutrinoApp::standbyMode( bool bOnOff ) if( mode == mode_scart ) { //g_Controld->setScartMode( 0 ); } - dvbsub_pause(); + StopSubtitles(); frameBuffer->useBackground(false); frameBuffer->paintBackground(); @@ -3879,7 +3880,7 @@ void CNeutrinoApp::standbyMode( bool bOnOff ) startAutoRecord(true); } wasshift = false; - dvbsub_start(0); + StartSubtitles(); } } @@ -3890,7 +3891,7 @@ printf("radioMode: rezap %s\n", rezap ? "yes" : "no"); g_RCInput->killTimer(g_InfoViewer->lcdUpdateTimer); g_InfoViewer->lcdUpdateTimer = g_RCInput->addTimer( LCD_UPDATE_TIME_RADIO_MODE, false ); CVFD::getInstance()->ShowIcon(VFD_ICON_TV, false); - dvbsub_pause(); + StopSubtitles(); } CVFD::getInstance()->setMode(CVFD::MODE_TVRADIO); CVFD::getInstance()->ShowIcon(VFD_ICON_RADIO, true); @@ -4736,3 +4737,24 @@ void CNeutrinoApp::saveKeys(const char * fname) tconfig.setString( "repeat_genericblocker", g_settings.repeat_genericblocker ); tconfig.saveConfig(fname); } + +void CNeutrinoApp::StopSubtitles() +{ + int ttx, dvbpid; + + dvbpid = dvbsub_getpid(); + tuxtx_subtitle_running(0, 0, &ttx); + + if(dvbpid) + dvbsub_pause(); + if(ttx) { + tuxtx_pause_subtitle(true); + frameBuffer->paintBackground(); + } +} + +void CNeutrinoApp::StartSubtitles() +{ + dvbsub_start(0); + tuxtx_pause_subtitle(false); +} diff --git a/src/neutrino.h b/src/neutrino.h index 1dec7d85f..694ddf501 100644 --- a/src/neutrino.h +++ b/src/neutrino.h @@ -262,5 +262,7 @@ public: }; void SetChannelMode(int mode); void quickZap(int msg); + void StopSubtitles(); + void StartSubtitles(); }; #endif diff --git a/src/system/setting_helpers.cpp b/src/system/setting_helpers.cpp index 4ac2cf48f..2eea5559a 100644 --- a/src/system/setting_helpers.cpp +++ b/src/system/setting_helpers.cpp @@ -599,6 +599,7 @@ printf("CSubtitleChangeExec::exec: action %s\n", actionKey.c_str()); if(!strncmp(actionKey.c_str(), "DVB", 3)) { char * pidptr = strchr(actionKey.c_str(), ':'); int pid = atoi(pidptr+1); + tuxtx_stop_subtitle(); dvbsub_pause(); dvbsub_start(pid); } else { @@ -610,8 +611,8 @@ printf("CSubtitleChangeExec::exec: action %s\n", actionKey.c_str()); int page = strtol(ptr, NULL, 16); printf("CSubtitleChangeExec::exec: TTX, pid %x page %x\n", pid, page); tuxtx_stop_subtitle(); - tuxtx_main(g_RCInput->getFileHandle(), CFrameBuffer::getInstance()->getFrameBufferPointer(), pid, - CFrameBuffer::getInstance()->getScreenX(), CFrameBuffer::getInstance()->getScreenY(), CFrameBuffer::getInstance()->getScreenWidth(), CFrameBuffer::getInstance()->getScreenHeight(), page); + dvbsub_stop(); + tuxtx_main(g_RCInput->getFileHandle(), pid, page); } return menu_return::RETURN_EXIT; }