X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/02aac9d371ca28b52a0c0b635b38fbb912f596ed..796ca1530ab14e7694e5569d136ca128619d8e07:/lib/python/Screens/InfoBarGenerics.py diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index fc3f011c..9d610dc8 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -402,10 +402,12 @@ class InfoBarTuner: self.timer.timeout.get().append(self.updateTunerInfo) self.timer.start(500) - def log2(self,val): + def calc(self,val): if not val: return 0 - return (long)(log(val)/log(2)) + if val < 2500: + return (long)(log(val)/log(2)) + return val*100/65535 def updateTunerInfo(self): if self.instance.isVisible(): @@ -424,7 +426,7 @@ class InfoBarTuner: self["ber_count"].setText("%d"%(ber)) self["snr_progress"].setValue(snr) self["agc_progress"].setValue(agc) - self["ber_progress"].setValue(self.log2(ber)) + self["ber_progress"].setValue(self.calc(ber)) class InfoBarEvent: """provides a current/next event info display""" @@ -443,6 +445,24 @@ class InfoBarServiceName: self["ServiceName"] = ServiceName(self.session.nav) class InfoBarPVR: + + # ispause, isff, issm, skip + SEEK_STATE_PLAY = (0, 0, 0, 0) + SEEK_STATE_PAUSE = (1, 0, 0, 0) + SEEK_STATE_FF_2X = (0, 2, 0, 0) + SEEK_STATE_FF_4X = (0, 4, 0, 0) + SEEK_STATE_FF_8X = (0, 8, 0, 0) + SEEK_STATE_FF_32X = (0, 0, 0, 32) + SEEK_STATE_FF_64X = (0, 0, 0, 64) + + SEEK_STATE_BACK_4X = (0, 0, 0, -4) + SEEK_STATE_BACK_32X = (0, 0, 0, -32) + SEEK_STATE_BACK_64X = (0, 0, 0, -64) + + SEEK_STATE_SM_HALF = (0, 0, 2, 0) + SEEK_STATE_SM_QUARTER = (0, 0, 4, 0) + SEEK_STATE_SM_EIGHTH = (0, 0, 8, 0) + """handles PVR specific actions like seeking, pause""" def __init__(self): self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions", @@ -453,12 +473,45 @@ class InfoBarPVR: "seekFwd": (self.seekFwd, "skip forward"), "seekBack": (self.seekBack, "skip backward"), }) + + self.seekstate = self.SEEK_STATE_PLAY + self.seekTimer = eTimer() + self.seekTimer.timeout.get().append(self.seekTimerFired) + self.skipinterval = 500 # 500ms skip interval + + def seekTimerFired(self): + if self.skipmode > 0: + self.doSeek(+1, self.skipmode * self.skipinterval) + else: + self.doSeek(-1, -self.skipmode * self.skipinterval) + + def setSeekState(self, state): + oldstate = self.seekstate + self.seekstate = state + + service = self.session.nav.getCurrentService() + if service is None: + return + + pauseable = service.pause() + + for i in range(4): + if oldstate[i] != self.seekstate[i]: + (self.session.nav.pause, pauseable.setFastForward, pauseable.setSlowMotion, self.setSkipMode)[i](self.seekstate[i]) + + def setSkipMode(self, skipmode): + self.skipmode = skipmode + if skipmode == 0: + self.seekTimer.stop() + else: + self.seekTimer.start(500) + def pauseService(self): - self.session.nav.pause(1) + self.setSeekState(self.SEEK_STATE_PAUSE); def unPauseService(self): - self.session.nav.pause(0) + self.setSeekState(self.SEEK_STATE_PLAY); def doSeek(self, dir, seektime): service = self.session.nav.getCurrentService() @@ -471,10 +524,40 @@ class InfoBarPVR: seekable.seekRelative(dir, 90 * seektime) def seekFwd(self): - self.doSeek(+1, 60000) + lookup = { + self.SEEK_STATE_PLAY: self.SEEK_STATE_FF_2X, + self.SEEK_STATE_PAUSE: self.SEEK_STATE_SM_EIGHTH, + self.SEEK_STATE_FF_2X: self.SEEK_STATE_FF_4X, + self.SEEK_STATE_FF_4X: self.SEEK_STATE_FF_8X, + self.SEEK_STATE_FF_8X: self.SEEK_STATE_FF_32X, + self.SEEK_STATE_FF_32X: self.SEEK_STATE_FF_64X, + self.SEEK_STATE_FF_64X: self.SEEK_STATE_FF_64X, + self.SEEK_STATE_BACK_4X: self.SEEK_STATE_PLAY, + self.SEEK_STATE_BACK_32X: self.SEEK_STATE_BACK_4X, + self.SEEK_STATE_BACK_64X: self.SEEK_STATE_BACK_32X, + self.SEEK_STATE_SM_HALF: self.SEEK_STATE_SM_HALF, + self.SEEK_STATE_SM_QUARTER: self.SEEK_STATE_SM_HALF, + self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_SM_QUARTER + } + self.setSeekState(lookup[self.seekstate]); def seekBack(self): - self.doSeek(-1, 60000) + lookup = { + self.SEEK_STATE_PLAY: self.SEEK_STATE_BACK_4X, + self.SEEK_STATE_PAUSE: self.SEEK_STATE_PAUSE, + self.SEEK_STATE_FF_2X: self.SEEK_STATE_PLAY, + self.SEEK_STATE_FF_4X: self.SEEK_STATE_FF_2X, + self.SEEK_STATE_FF_8X: self.SEEK_STATE_FF_4X, + self.SEEK_STATE_FF_32X: self.SEEK_STATE_FF_8X, + self.SEEK_STATE_FF_64X: self.SEEK_STATE_FF_32X, + self.SEEK_STATE_BACK_4X: self.SEEK_STATE_BACK_32X, + self.SEEK_STATE_BACK_32X: self.SEEK_STATE_BACK_64X, + self.SEEK_STATE_BACK_64X: self.SEEK_STATE_BACK_64X, + self.SEEK_STATE_SM_HALF: self.SEEK_STATE_SM_QUARTER, + self.SEEK_STATE_SM_QUARTER: self.SEEK_STATE_SM_EIGHTH, + self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_PAUSE + } + self.setSeekState(lookup[self.seekstate]); class InfoBarInstantRecord: """Instant Record - handles the instantRecord action in order to