Merge branch 'master' of git.opendreambox.org:/git/enigma2
authorghost <andreas.monzner@multimedia-labs.de>
Tue, 3 Mar 2009 10:51:10 +0000 (11:51 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Tue, 3 Mar 2009 10:51:10 +0000 (11:51 +0100)
lib/base/filepush.cpp
lib/python/Components/MediaPlayer.py
lib/python/Plugins/Extensions/DVDPlayer/plugin.py
lib/python/Screens/InfoBarGenerics.py

index 1999707..ed2a218 100644 (file)
@@ -189,9 +189,13 @@ void eFilePushThread::thread()
                        if (m_send_pvr_commit && !already_empty)
                        {
                                eDebug("sending PVR commit");
+                               
+                               struct pollfd pfd[1] = {m_fd_dest, POLLHUP};
+                               poll(pfd, 1, 10000);
+                               sleep(5); /* HACK to allow ES buffer to drain */
                                already_empty = 1;
-                               if (::ioctl(m_fd_dest, PVR_COMMIT) < 0 && errno == EINTR)
-                                       continue;
+//                             if (::ioctl(m_fd_dest, PVR_COMMIT) < 0 && errno == EINTR)
+//                                     continue;
                                eDebug("commit done");
                                                /* well check again */
                                continue;
index 87ba977..12f2727 100644 (file)
@@ -25,7 +25,7 @@ def PlaylistEntryComponent(serviceref, state):
        text = serviceref.getName()
        if text is "":
                text = path.split(serviceref.getPath().split('/')[-1])[1]
-       res.append((eListboxPythonMultiContent.TYPE_TEXT,25, 0, 470, 32, 0, RT_VALIGN_CENTER, text))
+       res.append((eListboxPythonMultiContent.TYPE_TEXT,25, 1, 470, 22, 0, RT_VALIGN_CENTER, text))
        png = None
        if state == STATE_PLAY:
                png = PlayIcon
@@ -39,7 +39,7 @@ def PlaylistEntryComponent(serviceref, state):
                png = ForwardIcon
 
        if png is not None:
-               res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 0, 16, 16, png))
+               res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 3, 16, 16, png))
 
        return res
 
@@ -47,7 +47,7 @@ class PlayList(MenuList):
        def __init__(self, enableWrapAround = False):
                MenuList.__init__(self, [], enableWrapAround, eListboxPythonMultiContent)
                self.l.setFont(0, gFont("Regular", 18))
-               self.l.setItemHeight(22)
+               self.l.setItemHeight(23)
                self.currPlaying = -1
                self.oldCurrPlaying = -1
                self.serviceHandler = eServiceCenter.getInstance()
index 80629c5..ebcf4f8 100644 (file)
@@ -14,6 +14,7 @@ from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 from Components.config import config
 from Tools.Directories import pathExists, fileExists
 from Components.Harddisk import harddiskmanager
+from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier
 
 import servicedvd # load c++ part of dvd player plugin
 
@@ -345,28 +346,15 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
                        })
 
                self.onClose.append(self.__onClose)
-               self.physicalDVD = False
-               self.dvd_device = None
+               hotplugNotifier.append(self.hotplugCB)
+               
                if dvd_device:
-                               self.dvd_device = dvd_device
-                               self.physicalDVD = True
+                       self.physicalDVD = True
                else:
-                       devicepath = harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD())
-                       if pathExists(devicepath):
-                               from Components.Scanner import scanDevice
-                               res = scanDevice(devicepath)
-                               list = [ (r.description, r, res[r], self.session) for r in res ]
-                               if list:
-                                       (desc, scanner, files, session) = list[0]
-                                       for file in files:
-                                               print file
-                                               if file.mimetype == "video/x-dvd":
-                                                       self.dvd_device = devicepath
-                                                       print "physical dvd found:", self.dvd_device
-                                                       self.physicalDVD = True
+                       self.scanHotplug()
 
                self.dvd_filelist = dvd_filelist
-               self.onFirstExecBegin.append(self.showFileBrowser)
+               self.onFirstExecBegin.append(self.opened)
                self.service = None
                self.in_menu = False
 
@@ -513,6 +501,8 @@ 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" ))
                self.session.openWithCallback(self.exitCB, ChoiceBox, title=_("Leave DVD Player?"), list = choices)
 
        def sendKey(self, key):
@@ -581,23 +571,22 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
        def keyCancel(self):
                self.askLeavePlayer()
 
-       def showFileBrowser(self):
-               if self.physicalDVD and len(self.dvd_filelist) == 0:
-                       if self.dvd_device == harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD()):
-                               self.session.openWithCallback(self.DVDdriveCB, MessageBox, text=_("Do you want to play DVD in drive?"), timeout=5 )
-                       else:
-                               self.DVDdriveCB(True)
-               elif len(self.dvd_filelist) == 1:
+       def opened(self):
+               if len(self.dvd_filelist) == 1:
+                       # opened via autoplay
                        self.FileBrowserClosed(self.dvd_filelist[0])
+               elif self.physicalDVD:
+                       # opened from menu with dvd in drive
+                       self.session.openWithCallback(self.playPhysicalCB, MessageBox, text=_("Do you want to play DVD in drive?"), timeout=5 )
                else:
+                       # opened from menu without dvd in drive
                        self.session.openWithCallback(self.FileBrowserClosed, FileBrowser, self.dvd_filelist)
-       
-       def DVDdriveCB(self, answer):
+
+       def playPhysicalCB(self, answer):
                if answer == True:
-                       self.FileBrowserClosed(self.dvd_device)
+                       self.FileBrowserClosed(harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD()))
                else:
                        self.session.openWithCallback(self.FileBrowserClosed, FileBrowser)
-                       self.physicalDVD = False
 
        def FileBrowserClosed(self, val):
                curref = self.session.nav.getCurrentlyPlayingServiceReference()
@@ -627,13 +616,18 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
                                #else
                                if self.service:
                                        self.service = None
-                               self.showFileBrowser()
+                               self.session.openWithCallback(self.FileBrowserClosed, FileBrowser)
+                       if answer[1] == "playPhysical":
+                               if self.service:
+                                       self.service = None
+                               self.playPhysicalCB(True)
                        else:
                                pass
 
        def __onClose(self):
                self.restore_infobar_seek_config()
                self.session.nav.playService(self.oldService)
+               hotplugNotifier.remove(self.hotplugCB)
 
        def playLastCB(self, answer): # overwrite infobar cuesheet function
                print "playLastCB", answer, self.resume_point
@@ -660,6 +654,30 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP
        def calcRemainingTime(self):
                return 0
 
+       def hotplugCB(self, dev, media_state):
+               print "[hotplugCB]", dev, media_state
+               if dev == harddiskmanager.getCD():
+                       if media_state == "1":
+                               self.scanHotplug()
+                       else:
+                               self.physicalDVD = False
+
+       def scanHotplug(self):
+               devicepath = harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD())
+               if pathExists(devicepath):
+                       from Components.Scanner import scanDevice
+                       res = scanDevice(devicepath)
+                       list = [ (r.description, r, res[r], self.session) for r in res ]
+                       if list:
+                               (desc, scanner, files, session) = list[0]
+                               for file in files:
+                                       print file
+                                       if file.mimetype == "video/x-dvd":
+                                               print "physical dvd found:", devicepath
+                                               self.physicalDVD = True
+                                               return
+               self.physicalDVD = False
+
 def main(session, **kwargs):
        session.open(DVDPlayer)
 
index 1594b3a..20a239a 100644 (file)
@@ -668,11 +668,6 @@ class InfoBarSeek:
                                iPlayableService.evEOF: self.__evEOF,
                                iPlayableService.evSOF: self.__evSOF,
                        })
-               self.eofState = 0
-               self.eofTimer = eTimer()
-               self.eofTimer.timeout.get().append(self.doEof)
-               self.eofInhibitTimer = eTimer()
-               self.eofInhibitTimer.timeout.get().append(self.inhibitEof)
 
                self.minSpeedBackward = useSeekBackHack and 16 or 0
 
@@ -808,9 +803,6 @@ class InfoBarSeek:
        def __serviceStarted(self):
                self.seekstate = self.SEEK_STATE_PLAY
                self.__seekableStatusChanged()
-               if self.eofState != 0:
-                       self.eofTimer.stop()
-               self.eofState = 0
 
        def setSeekState(self, state):
                service = self.session.nav.getCurrentService()
@@ -872,16 +864,6 @@ class InfoBarSeek:
                seekable = self.getSeek()
                if seekable is None:
                        return
-               prevstate = self.seekstate
-               if self.eofState == 1:
-                       self.eofState = 2
-                       self.inhibitEof()
-               if self.seekstate == self.SEEK_STATE_EOF:
-                       if prevstate == self.SEEK_STATE_PAUSE:
-                               self.setSeekState(self.SEEK_STATE_PAUSE)
-                       else:
-                               self.setSeekState(self.SEEK_STATE_PLAY)
-               self.eofInhibitTimer.start(200, True)
                seekable.seekTo(pts)
 
        def doSeekRelative(self, pts):
@@ -889,15 +871,12 @@ class InfoBarSeek:
                if seekable is None:
                        return
                prevstate = self.seekstate
-               if self.eofState == 1:
-                       self.eofState = 2
-                       self.inhibitEof()
+
                if self.seekstate == self.SEEK_STATE_EOF:
                        if prevstate == self.SEEK_STATE_PAUSE:
                                self.setSeekState(self.SEEK_STATE_PAUSE)
                        else:
                                self.setSeekState(self.SEEK_STATE_PLAY)
-               self.eofInhibitTimer.start(200, True)
                seekable.seekRelative(pts<0 and -1 or 1, abs(pts))
                if abs(pts) > 100 and config.usage.show_infobar_on_skip.value:
                        self.showAfterSeek()
@@ -1009,44 +988,19 @@ class InfoBarSeek:
                return False
                
        def __evEOF(self):
-               if self.eofState == 0 and self.seekstate != self.SEEK_STATE_EOF:
-                       self.eofState = 1
-                       time = self.calcRemainingTime()
-                       if not time:
-                               time = 3000   # Failed to calc, use default
-                       elif time == 0:
-                               time = 300    # Passed end, shortest wait
-                       elif time > 15000:
-                               self.eofState = -2  # Too long, block eof
-                               time = 15000
-                       else:
-                               time += 1000  # Add margin
-                       self.eofTimer.start(time, True)
-
-       def inhibitEof(self):
-               if self.eofState >= 1:
-                       self.eofState = -self.eofState
-                       self.eofTimer.stop()
-                       self.doEof()
-
-       def doEof(self):
                if self.seekstate == self.SEEK_STATE_EOF:
                        return
-               if self.eofState == -2 or self.isStateBackward(self.seekstate):
-                       self.eofState = 0
-                       return
 
-               # if we are seeking, we try to end up ~1s before the end, and pause there.
-               eofstate = self.eofState
+               # if we are seeking forward, we try to end up ~1s before the end, and pause there.
                seekstate = self.seekstate
-               self.eofState = 0
-               if not self.seekstate == self.SEEK_STATE_PAUSE:
+               if self.seekstate != self.SEEK_STATE_PAUSE:
                        self.setSeekState(self.SEEK_STATE_EOF)
-               if eofstate == -1 or not seekstate in (self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE):
+
+               if seekstate not in (self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE): # if we are seeking
                        seekable = self.getSeek()
                        if seekable is not None:
                                seekable.seekTo(-1)
-               if eofstate == 1 and seekstate == self.SEEK_STATE_PLAY:
+               if seekstate == self.SEEK_STATE_PLAY: # regular EOF
                        self.doEofInternal(True)
                else:
                        self.doEofInternal(False)