summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2009-05-10 12:04:45 (GMT)
committerFelix Domke <tmbinc@elitedvb.net>2009-05-10 12:04:45 (GMT)
commit946fb003e4be2e1485308d7fc5bb7274732751a3 (patch)
tree8cc44adc5dc7a7885632c410925e4e6d6c7d332d /lib
parenta012dfc95def3f4043f5b0bb319f1f4073592543 (diff)
parentd245191dd27ad9884c33ad3a76992dc6c4e8f33b (diff)
Merge branch 'master' of /home/tmbinc/enigma2-git
Diffstat (limited to 'lib')
-rw-r--r--lib/base/smartptr.h3
-rw-r--r--lib/dvb/decoder.cpp30
-rw-r--r--lib/dvb/decoder.h8
-rw-r--r--lib/dvb/frontend.cpp4
-rw-r--r--lib/dvb_ci/dvbci.cpp68
-rw-r--r--lib/dvb_ci/dvbci.h2
-rwxr-xr-xlib/python/Components/Keyboard.py47
-rwxr-xr-x[-rw-r--r--]lib/python/Components/Makefile.am3
-rwxr-xr-x[-rw-r--r--]lib/python/Components/SetupDevices.py7
-rw-r--r--lib/python/Plugins/Extensions/DVDPlayer/plugin.py6
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py2
-rw-r--r--lib/python/Screens/EpgSelection.py12
-rw-r--r--lib/python/enigma_python.i10
-rw-r--r--lib/service/iservice.h12
-rw-r--r--lib/service/servicedvb.cpp13
-rw-r--r--lib/service/servicedvbrecord.cpp30
-rw-r--r--lib/service/servicedvbrecord.h5
-rw-r--r--lib/service/servicemp3.cpp9
18 files changed, 193 insertions, 78 deletions
diff --git a/lib/base/smartptr.h b/lib/base/smartptr.h
index ac6b9eb..a2c6691 100644
--- a/lib/base/smartptr.h
+++ b/lib/base/smartptr.h
@@ -57,11 +57,10 @@ public:
#ifndef SWIG
T* grabRef() { if (!ptr) return 0; ptr->AddRef(); return ptr; }
T* &ptrref() { ASSERT(!ptr); return ptr; }
+ operator bool() const { return !!this->ptr; }
#endif
T* operator->() const { ptrAssert(ptr); return ptr; }
operator T*() const { return this->ptr; }
-
- operator bool() const { return !!this->ptr; }
};
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp
index 0280fe5..30a80d1 100644
--- a/lib/dvb/decoder.cpp
+++ b/lib/dvb/decoder.cpp
@@ -12,8 +12,10 @@
#define dmxPesFilterParams dmx_pes_filter_params
#define DMX_PES_VIDEO0 DMX_PES_VIDEO
#define DMX_PES_AUDIO0 DMX_PES_AUDIO
+#define DMX_PES_PCR0 DMX_PES_PCR
#define DMX_PES_VIDEO1 DMX_PES_VIDEO
#define DMX_PES_AUDIO1 DMX_PES_AUDIO
+#define DMX_PES_PCR1 DMX_PES_PCR
#include <ost/dmx.h>
#include <ost/video.h>
#include <ost/audio.h>
@@ -203,8 +205,7 @@ int eDVBAudio::startPid(int pid, int type)
eDebug("failed (%m)");
else
eDebug("ok");
- freeze();
-
+ freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState
eDebugNoNewLine("AUDIO_PLAY - ");
if (::ioctl(m_fd, AUDIO_PLAY) < 0)
eDebug("failed (%m)");
@@ -285,7 +286,7 @@ int eDVBAudio::getPTS(pts_t &now)
eDVBAudio::~eDVBAudio()
{
- unfreeze();
+ unfreeze(); // why unfreeze here... but not unfreeze video in ~eDVBVideo ?!?
if (m_fd >= 0)
::close(m_fd);
if (m_fd_demux >= 0)
@@ -448,7 +449,7 @@ int eDVBVideo::startPid(int pid, int type)
return -errno;
}
eDebug("ok");
- freeze();
+ freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState
eDebugNoNewLine("VIDEO_PLAY - ");
if (::ioctl(m_fd, VIDEO_PLAY) < 0)
eDebug("failed (%m)");
@@ -687,7 +688,7 @@ int eDVBVideo::getFrameRate()
DEFINE_REF(eDVBPCR);
-eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
+eDVBPCR::eDVBPCR(eDVBDemux *demux, int dev): m_demux(demux), m_dev(dev)
{
char filename[128];
#if HAVE_DVB_API_VERSION < 3
@@ -746,7 +747,7 @@ int eDVBPCR::startPid(int pid)
pes.pid = pid;
pes.input = DMX_IN_FRONTEND;
pes.output = DMX_OUT_DECODER;
- pes.pes_type = DMX_PES_PCR;
+ pes.pes_type = m_dev ? DMX_PES_PCR1 : DMX_PES_PCR0; /* FIXME */
pes.flags = 0;
eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - pcr - ", pid);
if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
@@ -783,7 +784,8 @@ eDVBPCR::~eDVBPCR()
DEFINE_REF(eDVBTText);
-eDVBTText::eDVBTText(eDVBDemux *demux): m_demux(demux)
+eDVBTText::eDVBTText(eDVBDemux *demux, int dev)
+ :m_demux(demux), m_dev(dev)
{
char filename[128];
#if HAVE_DVB_API_VERSION < 3
@@ -805,7 +807,7 @@ int eDVBTText::startPid(int pid)
pes.pid = pid;
pes.input = DMX_IN_FRONTEND;
pes.output = DMX_OUT_DECODER;
- pes.pes_type = DMX_PES_TELETEXT;
+ pes.pes_type = m_dev ? DMX_PES_TELETEXT1 : DMX_PES_TELETEXT0; // FIXME
pes.flags = 0;
eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - ttx - ", pid);
@@ -815,7 +817,7 @@ int eDVBTText::startPid(int pid)
return -errno;
}
eDebug("ok");
- eDebugNoNewLine("DEMUX_START - pcr - ");
+ eDebugNoNewLine("DEMUX_START - ttx - ");
if (::ioctl(m_fd_demux, DMX_START) < 0)
{
eDebug("failed(%m)");
@@ -961,7 +963,7 @@ int eTSMPEGDecoder::setState()
{
if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
{
- m_pcr = new eDVBPCR(m_demux);
+ m_pcr = new eDVBPCR(m_demux, m_decoder);
if (m_pcr->startPid(m_pcrpid))
res = -1;
}
@@ -992,7 +994,7 @@ int eTSMPEGDecoder::setState()
{
if ((m_textpid >= 0) && (m_textpid < 0x1FFF) && !nott)
{
- m_text = new eDVBTText(m_demux);
+ m_text = new eDVBTText(m_demux, m_decoder);
if (m_text->startPid(m_textpid))
res = -1;
}
@@ -1093,7 +1095,7 @@ eTSMPEGDecoder::~eTSMPEGDecoder()
RESULT eTSMPEGDecoder::setVideoPID(int vpid, int type)
{
- if (m_vpid != vpid)
+ if ((m_vpid != vpid) || (m_vtype != type))
{
m_changed |= changeVideo;
m_vpid = vpid;
@@ -1174,7 +1176,9 @@ RESULT eTSMPEGDecoder::play()
if (!m_changed)
return 0;
}
- else
+// else
+/* commented out because the changeState is needed to unfreeze decoders in decoder::setState... needed by normal pmt changes
+tmbinc please recheck this! */
{
m_state = statePlay;
m_changed |= changeState;
diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h
index 51be514..3bfc70c 100644
--- a/lib/dvb/decoder.h
+++ b/lib/dvb/decoder.h
@@ -80,9 +80,9 @@ class eDVBPCR: public iObject
DECLARE_REF(eDVBPCR);
private:
ePtr<eDVBDemux> m_demux;
- int m_fd_demux;
+ int m_fd_demux, m_dev;
public:
- eDVBPCR(eDVBDemux *demux);
+ eDVBPCR(eDVBDemux *demux, int dev);
#if HAVE_DVB_API_VERSION < 3
int setPid(int pid);
int startPid();
@@ -98,9 +98,9 @@ class eDVBTText: public iObject
DECLARE_REF(eDVBTText);
private:
ePtr<eDVBDemux> m_demux;
- int m_fd_demux;
+ int m_fd_demux, m_dev;
public:
- eDVBTText(eDVBDemux *demux);
+ eDVBTText(eDVBDemux *demux, int dev);
int startPid(int pid);
void stop();
virtual ~eDVBTText();
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index a2ccf3b..e5e83b4 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -379,7 +379,7 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters
terrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC_Auto)
diff = 1 << 30;
else
- diff = abs(terrestrial.frequency - oterrestrial.frequency);
+ diff = abs(terrestrial.frequency - oterrestrial.frequency) / 1000;
return 0;
default:
return -1;
@@ -403,7 +403,7 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const
return 0;
case iDVBFrontend::feTerrestrial:
hash = 0xEEEE0000;
- hash |= (terrestrial.frequency/1000)&0xFFFF;
+ hash |= (terrestrial.frequency/1000000)&0xFFFF;
return 0;
default:
return -1;
diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp
index ce1f7d6..9583db5 100644
--- a/lib/dvb_ci/dvbci.cpp
+++ b/lib/dvb_ci/dvbci.cpp
@@ -200,43 +200,39 @@ int eDVBCIInterfaces::cancelEnq(int slotid)
void eDVBCIInterfaces::ciRemoved(eDVBCISlot *slot)
{
- eDebug("CI Slot %d: removed... usecount %d", slot->getSlotID(), slot->use_count);
- for (PMTHandlerList::iterator it(m_pmt_handlers.begin());
- it != m_pmt_handlers.end(); ++it)
+ if (slot->use_count)
{
- eServiceReferenceDVB ref;
- it->pmthandler->getServiceReference(ref);
- eDebugCI("check %s cislot %p %d\n", ref.toString().c_str(), it->cislot, it->cislot?it->cislot->getSlotID() : -1);
- slot->removeService(ref.getServiceID().get());
- if (slot->use_count && !--slot->use_count)
+ eDebug("CI Slot %d: removed... usecount %d", slot->getSlotID(), slot->use_count);
+ for (PMTHandlerList::iterator it(m_pmt_handlers.begin());
+ it != m_pmt_handlers.end(); ++it)
{
- if (slot->linked_next)
- slot->linked_next->setSource(slot->current_source);
- else // last CI in chain
- setInputSource(slot->current_tuner, slot->current_source);
-
if (it->cislot == slot) // remove the base slot
- {
it->cislot = slot->linked_next;
- eDebugCI("base removed.. so slot is now %p", it->cislot);
- }
- else
+ else if (it->cislot)
{
- eDebugCI("not base removed.. %d", it->cislot->getSlotID());
- eDVBCISlot *tmp = it->cislot;
- while(tmp->linked_next != slot)
- tmp = tmp->linked_next;
- ASSERT(tmp);
- if (slot->linked_next)
- tmp->linked_next = slot->linked_next;
- else
- tmp->linked_next = 0;
+ eDVBCISlot *prevSlot = it->cislot, *hSlot = it->cislot->linked_next;
+ while (hSlot)
+ {
+ if (hSlot == slot) {
+ prevSlot->linked_next = slot->linked_next;
+ break;
+ }
+ prevSlot = hSlot;
+ hSlot = hSlot->linked_next;
+ }
}
- slot->linked_next=0;
- slot->user_mapped=false;
}
+ if (slot->linked_next)
+ slot->linked_next->setSource(slot->current_source);
+ else // last CI in chain
+ setInputSource(slot->current_tuner, slot->current_source);
+ slot->linked_next = 0;
+ slot->use_count=0;
+ slot->plugged=true;
+ slot->user_mapped=false;
+ slot->removeService(0xFFFF);
+ recheckPMTHandlers();
}
- recheckPMTHandlers();
}
static bool canDescrambleMultipleServices(int slotid)
@@ -268,22 +264,22 @@ void eDVBCIInterfaces::recheckPMTHandlers()
eDVBCISlot *tmp = it->cislot;
eDVBServicePMTHandler *pmthandler = it->pmthandler;
eDVBServicePMTHandler::program p;
- bool first_plugged_cis_exist = false;
+ bool plugged_cis_exist = false;
pmthandler->getServiceReference(ref);
pmthandler->getService(service);
eDebugCI("recheck %p %s", pmthandler, ref.toString().c_str());
for (eSmartPtrList<eDVBCISlot>::iterator ci_it(m_slots.begin()); ci_it != m_slots.end(); ++ci_it)
- if (ci_it->first_plugged && ci_it->getCAManager())
+ if (ci_it->plugged && ci_it->getCAManager())
{
- eDebug("Slot %d first plugged", ci_it->getSlotID());
- ci_it->first_plugged = false;
- first_plugged_cis_exist = true;
+ eDebug("Slot %d plugged", ci_it->getSlotID());
+ ci_it->plugged = false;
+ plugged_cis_exist = true;
}
// check if this pmt handler has already assigned CI(s) .. and this CI(s) are already running
- if (!first_plugged_cis_exist)
+ if (!plugged_cis_exist)
{
while(tmp)
{
@@ -1041,7 +1037,7 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr)
use_count = 0;
linked_next = 0;
user_mapped = false;
- first_plugged = true;
+ plugged = true;
slotid = nr;
diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h
index cdaaf90..de84e18 100644
--- a/lib/dvb_ci/dvbci.h
+++ b/lib/dvb_ci/dvbci.h
@@ -65,7 +65,7 @@ class eDVBCISlot: public iObject, public Object
int current_tuner;
bool user_mapped;
void data(int);
- bool first_plugged;
+ bool plugged;
public:
enum {stateRemoved, stateInserted, stateInvalid, stateResetted};
eDVBCISlot(eMainloop *context, int nr);
diff --git a/lib/python/Components/Keyboard.py b/lib/python/Components/Keyboard.py
new file mode 100755
index 0000000..820d103
--- /dev/null
+++ b/lib/python/Components/Keyboard.py
@@ -0,0 +1,47 @@
+from Components.Console import Console
+from os import listdir as os_listdir, path as os_path
+from re import compile as re_compile
+
+class Keyboard:
+ def __init__(self):
+ self.keyboardmaps = []
+ self.readKeyboardMapFiles()
+
+ def readKeyboardMapFiles(self):
+ for keymapfile in os_listdir('/usr/share/keymaps/'):
+ if (keymapfile.endswith(".info")):
+ f = open('/usr/share/keymaps/' + keymapfile)
+ mapfile = None
+ mapname = None
+ for line in f:
+ m = re_compile('^\s*(\w+)\s*=\s*(.*)\s*$').match(line)
+ if m:
+ key, val = m.groups()
+ if key == 'kmap':
+ mapfile = val
+ if key == 'name':
+ mapname = val
+ if (mapfile is not None) and (mapname is not None):
+ self.keyboardmaps.append(( mapfile,mapname))
+ f.close()
+
+ if len(self.keyboardmaps) == 0:
+ self.keyboardmaps = [('dream-de.kmap', 'Dreambox Keyboard Deutsch'), ('eng.kmap', 'Keyboard English')]
+
+ def activateKeyboardMap(self, index):
+ try:
+ keymap = self.keyboardmaps[index]
+ print "Activating keymap:",keymap[1]
+ keymappath = '/usr/share/keymaps/' + keymap[0]
+ if os_path.exists(keymappath):
+ Console().ePopen(("loadkmap < " + str(keymappath)))
+ except:
+ print "Selected keymap does not exist!"
+
+ def getKeyboardMaplist(self):
+ return self.keyboardmaps
+
+ def getDefaultKeyboardMap(self):
+ return 'eng.kmap'
+
+keyboard = Keyboard()
diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am
index 67cec18..85e4d3e 100644..100755
--- a/lib/python/Components/Makefile.am
+++ b/lib/python/Components/Makefile.am
@@ -18,4 +18,5 @@ install_PYTHON = \
MultiContent.py MediaPlayer.py TunerInfo.py VideoWindow.py ChoiceList.py \
Element.py Playlist.py ParentalControl.py ParentalControlList.py \
Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \
- Task.py language_cache.py Console.py ResourceManager.py TuneTest.py
+ Task.py language_cache.py Console.py ResourceManager.py TuneTest.py \
+ Keyboard.py
diff --git a/lib/python/Components/SetupDevices.py b/lib/python/Components/SetupDevices.py
index 71fb1e4..b037ea7 100644..100755
--- a/lib/python/Components/SetupDevices.py
+++ b/lib/python/Components/SetupDevices.py
@@ -1,6 +1,7 @@
from config import config, ConfigSelection, ConfigSubsection, ConfigOnOff, ConfigText
from Components.Timezones import timezones
from Components.Language import language
+from Components.Keyboard import keyboard
def InitSetupDevices():
@@ -11,8 +12,12 @@ def InitSetupDevices():
config.timezone.val = ConfigSelection(default = timezones.getDefaultTimezone(), choices = timezones.getTimezoneList())
config.timezone.val.addNotifier(timezoneNotifier)
+ def keyboardNotifier(configElement):
+ keyboard.activateKeyboardMap(configElement.index)
+
config.keyboard = ConfigSubsection();
- config.keyboard.keymap = ConfigSelection(choices = [("en", _("English")), ("de",_("German"))])
+ config.keyboard.keymap = ConfigSelection(default = keyboard.getDefaultKeyboardMap(), choices = keyboard.getKeyboardMaplist())
+ config.keyboard.keymap.addNotifier(keyboardNotifier)
def languageNotifier(configElement):
language.activateLanguage(configElement.value)
diff --git a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py
index e77b894..32e3593 100644
--- a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py
+++ b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py
@@ -502,8 +502,10 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
choices = [(_("Exit"), "exit"), (_("Continue playing"), "play")]
if True or not self.physicalDVD:
choices.insert(1,(_("Return to file browser"), "browser"))
- if self.physicalDVD and not self.session.nav.getCurrentlyPlayingServiceReference().toString().endswith(harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD())):
- choices.insert(0,(_("Play DVD"), "playPhysical" ))
+ if self.physicalDVD:
+ cur = self.session.nav.getCurrentlyPlayingServiceReference()
+ if cur and not cur.toString().endswith(harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD())):
+ choices.insert(0,(_("Play DVD"), "playPhysical" ))
self.session.openWithCallback(self.exitCB, ChoiceBox, title=_("Leave DVD Player?"), list = choices)
def sendKey(self, key):
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py
index 65361ad..3925fc4 100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py
@@ -244,7 +244,7 @@ class RestoreMenu(Screen):
if (file.endswith(".tar.gz")):
self.flist.append((file))
self.entry = True
- self["filelist"].l.setList(self.flist)
+ self["filelist"].l.setList(self.flist)
def KeyOk(self):
if (self.exe == False) and (self.entry == True):
diff --git a/lib/python/Screens/EpgSelection.py b/lib/python/Screens/EpgSelection.py
index d09ed00..3dde7e2 100644
--- a/lib/python/Screens/EpgSelection.py
+++ b/lib/python/Screens/EpgSelection.py
@@ -6,6 +6,8 @@ from Components.Label import Label
from Components.EpgList import EPGList, EPG_TYPE_SINGLE, EPG_TYPE_SIMILAR, EPG_TYPE_MULTI
from Components.ActionMap import ActionMap
from Components.TimerSanityCheck import TimerSanityCheck
+from Components.Sources.ServiceEvent import ServiceEvent
+from Components.Sources.Event import Event
from Screens.TimerEdit import TimerSanityConflict
from Screens.EventView import EventViewSimple
from Screens.MessageBox import MessageBox
@@ -33,6 +35,8 @@ class EPGSelection(Screen):
self["key_red"] = Button("")
self.closeRecursive = False
self.saved_title = None
+ self["Service"] = ServiceEvent()
+ self["Event"] = Event()
if isinstance(service, str) and eventid != None:
self.type = EPG_TYPE_SIMILAR
self["key_yellow"] = Button()
@@ -153,6 +157,7 @@ class EPGSelection(Screen):
l.moveToService(self.session.nav.getCurrentlyPlayingServiceReference())
elif self.type == EPG_TYPE_SINGLE:
service = self.currentService
+ self["Service"].newService(service.ref)
if self.saved_title is None:
self.saved_title = self.instance.getTitle()
title = self.saved_title + ' - ' + service.getServiceName()
@@ -306,6 +311,7 @@ class EPGSelection(Screen):
self.key_red_choice = self.EMPTY
return
event = cur[0]
+ self["Event"].newEvent(event)
if self.type == EPG_TYPE_MULTI:
count = self["list"].getCurrentChangeCount()
if self.ask_time != -1:
@@ -328,8 +334,12 @@ class EPGSelection(Screen):
else:
datestr = '%s %d.%d.'%(_("Today"), begTime[2], begTime[1])
self["date"].setText(datestr)
+ if cur[1] is None:
+ self["Service"].newService(None)
+ else:
+ self["Service"].newService(cur[1].ref)
- if cur[1] is None or cur[1].getServiceName() == "":
+ if cur[1] is None or cur[1].getServiceName() == "":
if self.key_green_choice != self.EMPTY:
self["key_green"].setText("")
self.key_green_choice = self.EMPTY
diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i
index bdf1b14..fe0e71e 100644
--- a/lib/python/enigma_python.i
+++ b/lib/python/enigma_python.i
@@ -262,7 +262,10 @@ RESULT SwigFromPython(ePtr<gPixmap> &result, PyObject *obj)
res = 0;
result = 0;
- if (SWIG_Python_ConvertPtr(obj, (void **)&res, SWIGTYPE_p_ePtrTgPixmap_t, SWIG_POINTER_EXCEPTION | 0))
+#ifndef SWIGTYPE_p_ePtrT_gPixmap_t
+#define SWIGTYPE_p_ePtrT_gPixmap_t SWIGTYPE_p_ePtrTgPixmap_t
+#endif
+ if (SWIG_Python_ConvertPtr(obj, (void **)&res, SWIGTYPE_p_ePtrT_gPixmap_t, SWIG_POINTER_EXCEPTION | 0))
return -1;
if (!res)
return -1;
@@ -277,7 +280,10 @@ PyObject *New_eServiceReference(const eServiceReference &ref)
PyObject *New_iRecordableServicePtr(const ePtr<iRecordableService> &ptr)
{
ePtr<iRecordableService> *result = new ePtr<iRecordableService>(ptr);
- return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_ePtrTiRecordableService_t, 1);
+#ifndef SWIGTYPE_p_ePtrT_iRecordableService_t
+#define SWIGTYPE_p_ePtrT_iRecordableService_t SWIGTYPE_p_ePtrTiRecordableService_t
+#endif
+ return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_ePtrT_iRecordableService_t, 1);
}
%}
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index 7b85c8f..22ffde6 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -138,6 +138,10 @@ public:
data[3]=data3;
data[4]=data4;
}
+ operator bool() const
+ {
+ return valid();
+ }
#endif
eServiceReference(int type, int flags, const std::string &path)
: type(type), flags(flags), path(path)
@@ -170,10 +174,6 @@ public:
return r < 0;
return path < c.path;
}
- operator bool() const
- {
- return valid();
- }
int valid() const
{
@@ -867,7 +867,8 @@ public:
evRecordStopped,
evNewProgramInfo,
evRecordFailed,
- evRecordWriteError
+ evRecordWriteError,
+ evNewEventInfo
};
enum {
NoError=0,
@@ -899,6 +900,7 @@ public:
virtual RESULT stop()=0;
virtual SWIG_VOID(RESULT) frontendInfo(ePtr<iFrontendInformation> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) stream(ePtr<iStreamableService> &SWIG_OUTPUT)=0;
+ virtual SWIG_VOID(RESULT) subServices(ePtr<iSubserviceList> &SWIG_OUTPUT)=0;
};
SWIG_TEMPLATE_TYPEDEF(ePtr<iRecordableService>, iRecordableServicePtr);
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index c844216..45a12ce 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -1737,7 +1737,7 @@ int eDVBServicePlay::selectAudioStream(int i)
m_current_audio_pid = apid;
- if (m_decoder->setAudioPID(apid, apidtype))
+ if (m_is_primary && m_decoder->setAudioPID(apid, apidtype))
{
eDebug("set audio pid failed");
return -4;
@@ -2307,6 +2307,9 @@ void eDVBServicePlay::updateDecoder()
m_decode_demux->getMPEGDecoder(m_decoder, m_is_primary);
if (m_decoder)
m_decoder->connectVideoEvent(slot(*this, &eDVBServicePlay::video_event), m_video_event_connection);
+ }
+ if (m_decode_demux && m_is_primary)
+ {
m_teletext_parser = new eDVBTeletextParser(m_decode_demux);
m_teletext_parser->connectNewPage(slot(*this, &eDVBServicePlay::newSubtitlePage), m_new_subtitle_page_connection);
m_subtitle_parser = new eDVBSubtitleParser(m_decode_demux);
@@ -2375,9 +2378,11 @@ void eDVBServicePlay::updateDecoder()
else
m_decoder->setSyncPCR(-1);
- m_decoder->setTextPID(tpid);
-
- m_teletext_parser->start(program.textPid);
+ if (m_is_primary)
+ {
+ m_decoder->setTextPID(tpid);
+ m_teletext_parser->start(program.textPid);
+ }
if (vpid > 0 && vpid < 0x2000)
;
diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp
index 6978849..d9cdb51 100644
--- a/lib/service/servicedvbrecord.cpp
+++ b/lib/service/servicedvbrecord.cpp
@@ -389,7 +389,7 @@ int eDVBServiceRecord::doRecord()
std::set_difference(
m_pids_active.begin(), m_pids_active.end(),
pids_to_record.begin(), pids_to_record.end(),
- std::inserter(new_pids, new_pids.begin())
+ std::inserter(obsolete_pids, obsolete_pids.begin())
);
for (std::set<int>::iterator i(new_pids.begin()); i != new_pids.end(); ++i)
@@ -503,6 +503,8 @@ void eDVBServiceRecord::gotNewEvent()
eDebug("[eDVBServiceRecord] now running: %s (%d seconds)", event_now->getEventName().c_str(), event_now->getDuration());
m_last_event_id = event_id;
+
+ m_event((iRecordableService*)this, evNewEventInfo);
}
void eDVBServiceRecord::saveCutlist()
@@ -548,3 +550,29 @@ void eDVBServiceRecord::saveCutlist()
}
}
+
+RESULT eDVBServiceRecord::subServices(ePtr<iSubserviceList> &ptr)
+{
+ ptr = this;
+ return 0;
+}
+
+int eDVBServiceRecord::getNumberOfSubservices()
+{
+ ePtr<eServiceEvent> evt;
+ if (!m_event_handler.getEvent(evt, 0))
+ return evt->getNumOfLinkageServices();
+ return 0;
+}
+
+RESULT eDVBServiceRecord::getSubservice(eServiceReference &sub, unsigned int n)
+{
+ ePtr<eServiceEvent> evt;
+ if (!m_event_handler.getEvent(evt, 0))
+ {
+ if (!evt->getLinkageService(sub, m_ref, n))
+ return 0;
+ }
+ sub.type=eServiceReference::idInvalid;
+ return -1;
+}
diff --git a/lib/service/servicedvbrecord.h b/lib/service/servicedvbrecord.h
index e70547f..319fbb7 100644
--- a/lib/service/servicedvbrecord.h
+++ b/lib/service/servicedvbrecord.h
@@ -13,6 +13,7 @@
class eDVBServiceRecord: public eDVBServiceBase,
public iRecordableService,
public iStreamableService,
+ public iSubserviceList,
public Object
{
DECLARE_REF(eDVBServiceRecord);
@@ -25,10 +26,14 @@ public:
RESULT stream(ePtr<iStreamableService> &ptr);
RESULT getError(int &error) { error = m_error; return 0; }
RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
+ RESULT subServices(ePtr<iSubserviceList> &ptr);
/* streamable service */
PyObject *getStreamingData();
+ // iSubserviceList
+ int getNumberOfSubservices();
+ RESULT getSubservice(eServiceReference &subservice, unsigned int n);
private:
enum { stateIdle, statePrepared, stateRecording };
bool m_simulate;
diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
index f8eb194..79098f2 100644
--- a/lib/service/servicemp3.cpp
+++ b/lib/service/servicemp3.cpp
@@ -441,6 +441,7 @@ RESULT eServiceMP3::pause()
RESULT eServiceMP3::unpause()
{
+ m_subtitle_pages.clear();
if (!m_gst_playbin || m_state != stRunning)
return -1;
@@ -476,6 +477,8 @@ RESULT eServiceMP3::getLength(pts_t &pts)
RESULT eServiceMP3::seekTo(pts_t to)
{
+ m_subtitle_pages.clear();
+
if (!m_gst_playbin)
return -1;
@@ -1277,7 +1280,7 @@ void eServiceMP3::pushSubtitles()
GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin),"subtitle_sink");
GstClock *clock;
clock = gst_element_get_clock (appsink);
- do
+ while ( !m_subtitle_pages.empty() )
{
page = m_subtitle_pages.front();
@@ -1296,7 +1299,7 @@ void eServiceMP3::pushSubtitles()
m_subtitle_widget->setPage(page);
m_subtitle_pages.pop_front();
}
- } while ( !m_subtitle_pages.empty() );
+ } ;
gst_object_unref (clock);
}
@@ -1330,6 +1333,7 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
g_object_get (G_OBJECT (m_gst_playbin), "current-text", &text_pid, NULL);
eDebug ("eServiceMP3::switched to subtitle stream %i", text_pid);
+ m_subtitle_pages.clear();
return 0;
@@ -1342,6 +1346,7 @@ error_out:
RESULT eServiceMP3::disableSubtitles(eWidget *parent)
{
eDebug("eServiceMP3::disableSubtitles");
+ m_subtitle_pages.clear();
delete m_subtitle_widget;
m_subtitle_widget = 0;
return 0;