enum cacheID
{
cVPID, cAPID, cTPID, cPCRPID, cAC3PID,
- cVTYPE, cACHANNEL, cAC3DELAY, cPCMDELAY, cacheMax
+ cVTYPE, cACHANNEL, cAC3DELAY, cPCMDELAY,
+ cSUBTITLE, cacheMax
};
int getCacheEntry(cacheID);
self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
{
iPlayableService.evStart: self.__serviceStarted,
+ iPlayableService.evUpdatedInfo: self.__updatedInfo
})
def __serviceStarted(self):
- # reenable if it was enabled
- r = self.__subtitles_enabled
+ self.cached_subtitle_checked = False
+ self.subtitle_window.hide()
self.__subtitles_enabled = False
- self.__selected_subtitle = None
- self.setSubtitlesEnable(r)
+
+ def __updatedInfo(self):
+ if not self.cached_subtitle_checked:
+ subtitle = self.getCurrentServiceSubtitle()
+ self.cached_subtitle_checked = True
+ if subtitle:
+ self.__selected_subtitle = subtitle.getCachedSubtitle()
+ if self.__selected_subtitle:
+ subtitle.enableSubtitles(self.subtitle_window.instance, self.selected_subtitle)
+ self.subtitle_window.show()
+ self.__subtitles_enabled = True
def getCurrentServiceSubtitle(self):
service = self.session.nav.getCurrentService()
else:
if subtitle:
subtitle.disableSubtitles(self.subtitle_window.instance)
-
- self.subtitle_window.hide()
self.__subtitles_enabled = False
+ self.subtitle_window.hide()
def setSelectedSubtitle(self, subtitle):
- if self.__selected_subtitle != subtitle and self.subtitles_enabled:
- # kick
- self.__selected_subtitle = subtitle
- self.__serviceStarted()
- else:
- self.__selected_subtitle = subtitle
+ self.__selected_subtitle = subtitle
subtitles_enabled = property(lambda self: self.__subtitles_enabled, setSubtitlesEnable)
selected_subtitle = property(lambda self: self.__selected_subtitle, setSelectedSubtitle)
else:
sel = None
for x in self.getSubtitleList():
- if sel and sel == x:
+ if sel and sel[:4] == x[:4]: #ignore Language code in compare
text = _("Running")
else:
text = _("Enable")
def enableSubtitle(self, subtitles):
if self.infobar.selected_subtitle != subtitles:
- print "enable subtitles", subtitles
self.infobar.subtitles_enabled = False
self.infobar.selected_subtitle = subtitles
self.infobar.subtitles_enabled = True
virtual RESULT enableSubtitles(eWidget *parent, PyObject *entry)=0;
virtual RESULT disableSubtitles(eWidget *parent)=0;
virtual PyObject *getSubtitleList()=0;
+ virtual PyObject *getCachedSubtitle()=0;
};
TEMPLATE_TYPEDEF(ePtr<iSubtitleOutput>, iSubtitleOutputPtr);
if (type == 1) // teletext subtitles
{
- int page, magazine;
+ int page, magazine, pid;
if (tuplesize < 4)
goto error_out;
return -1;
}
- // PyTuple_GET_ITEM(tuple, 1); //we dont need pid yet
+ entry = PyTuple_GET_ITEM(tuple, 1);
+ if (!PyInt_Check(entry))
+ goto error_out;
+ pid = PyInt_AsLong(entry);
+
entry = PyTuple_GET_ITEM(tuple, 2);
if (!PyInt_Check(entry))
goto error_out;
m_subtitle_widget = new eSubtitleWidget(parent);
m_subtitle_widget->resize(parent->size()); /* full size */
m_teletext_parser->setPageAndMagazine(page, magazine);
+ if (m_dvb_service)
+ m_dvb_service->setCacheEntry(eDVBService::cSUBTITLE,((pid&0xFFFF)<<16)|((page&0xFF)<<8)|(magazine&0xFF));
}
else if (type == 0)
{
m_subtitle_widget = new eSubtitleWidget(parent);
m_subtitle_widget->resize(parent->size()); /* full size */
m_subtitle_parser->start(pid, composition_page_id, ancillary_page_id);
+ if (m_dvb_service)
+ m_dvb_service->setCacheEntry(eDVBService::cSUBTITLE, ((pid&0xFFFF)<<16)|((composition_page_id&0xFF)<<8)|(ancillary_page_id&0xFF));
}
else
goto error_out;
m_teletext_parser->setPageAndMagazine(0,0);
m_subtitle_pages.clear();
}
+ if (m_dvb_service)
+ m_dvb_service->setCacheEntry(eDVBService::cSUBTITLE, -1);
return 0;
}
+PyObject *eDVBServicePlay::getCachedSubtitle()
+{
+ if (m_dvb_service)
+ {
+ int tmp = m_dvb_service->getCacheEntry(eDVBService::cSUBTITLE);
+ if (tmp != -1)
+ {
+ unsigned int data = (unsigned int)tmp;
+ int pid = (data&0xFFFF0000)>>16;
+ PyObject *tuple = PyTuple_New(4);
+ eDVBServicePMTHandler::program program;
+ eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
+ if (!h.getProgramInfo(program))
+ {
+ if (program.textPid==pid) // teletext
+ PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(1)); // type teletext
+ else
+ PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0)); // type dvb
+ PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong((data&0xFFFF0000)>>16)); // pid
+ PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong((data&0xFF00)>>8)); // composition_page / page
+ PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(data&0xFF)); // ancillary_page / magazine
+ return tuple;
+ }
+ }
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
PyObject *eDVBServicePlay::getSubtitleList()
{
if (!m_teletext_parser)
RESULT enableSubtitles(eWidget *parent, PyObject *entry);
RESULT disableSubtitles(eWidget *parent);
PyObject *getSubtitleList();
+ PyObject *getCachedSubtitle();
// iAudioDelay
int getAC3Delay();