From 8bc5eff73c06649d984f3190d134728db4f1c4d0 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Tue, 24 May 2011 12:51:40 +0000 Subject: [PATCH] * morituri/common/task.py: add task argument to TaskRunner.schedule so we can get exceptions. Add .schedule method to Task to pass self. * morituri/common/checksum.py: * morituri/common/encode.py: * morituri/common/gstreamer.py: * morituri/program/cdparanoia.py: * morituri/program/cdrdao.py: Adapt. --- ChangeLog | 12 ++++++++++++ morituri/common/checksum.py | 8 ++++---- morituri/common/encode.py | 10 +++++----- morituri/common/gstreamer.py | 4 ++-- morituri/common/task.py | 20 +++++++++++++++----- morituri/program/cdparanoia.py | 8 ++++---- morituri/program/cdrdao.py | 4 ++-- 7 files changed, 44 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5bb9ec6..98ecad6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2011-05-24 Thomas Vander Stichele + + * morituri/common/task.py: + add task argument to TaskRunner.schedule so we can get exceptions. + Add .schedule method to Task to pass self. + * morituri/common/checksum.py: + * morituri/common/encode.py: + * morituri/common/gstreamer.py: + * morituri/program/cdparanoia.py: + * morituri/program/cdrdao.py: + Adapt. + 2011-05-24 Thomas Vander Stichele * morituri/test/test_common_encode.py: diff --git a/morituri/common/checksum.py b/morituri/common/checksum.py index e28e732..5e6e4b1 100644 --- a/morituri/common/checksum.py +++ b/morituri/common/checksum.py @@ -133,7 +133,7 @@ class ChecksumTask(gstreamer.GstPipelineTask): def play(): self.pipeline.set_state(gst.STATE_PLAYING) return False - self.runner.schedule(0, play) + self.schedule(0, play) #self.pipeline.set_state(gst.STATE_PLAYING) self.debug('scheduled setting to play') @@ -193,13 +193,13 @@ class ChecksumTask(gstreamer.GstPipelineTask): framesDone = frame - self._frameStart progress = float(framesDone) / float((self._frameLength)) # marshall to the main thread - self.runner.schedule(0, self.setProgress, progress) + self.schedule(0, self.setProgress, progress) def _eos_cb(self, sink): # get the last one; FIXME: why does this not get to us before ? #self._new_buffer_cb(sink) self.debug('eos, scheduling stop') - self.runner.schedule(0, self.stop) + self.schedule(0, self.stop) class CRC32Task(ChecksumTask): """ @@ -311,7 +311,7 @@ class TRMTask(gstreamer.GstPipelineTask): # in the case of checksum def bus_eos_cb(self, bus, message): gst.debug('eos, scheduling stop') - self.runner.schedule(0, self.stop) + self.schedule(0, self.stop) def bus_tag_cb(self, bus, message): diff --git a/morituri/common/encode.py b/morituri/common/encode.py index a069f9a..e5edbb3 100644 --- a/morituri/common/encode.py +++ b/morituri/common/encode.py @@ -217,7 +217,7 @@ class EncodeTask(gstreamer.GstPipelineTask): # update progress based on buffer offset (expected to be in samples) # versus length in samples # marshal to main thread - self.runner.schedule(0, self.setProgress, + self.schedule(0, self.setProgress, float(buffer.offset) / self._length) # don't drop the buffer @@ -225,7 +225,7 @@ class EncodeTask(gstreamer.GstPipelineTask): def bus_eos_cb(self, bus, message): self.debug('eos, scheduling stop') - self.runner.schedule(0, self.stop) + self.schedule(0, self.stop) def _message_element_cb(self, bus, message): if message.src != self._level: @@ -281,7 +281,7 @@ class TagReadTask(gstreamer.GstPipelineTask): def bus_eos_cb(self, bus, message): self.debug('eos, scheduling stop') - self.runner.schedule(0, self.stop) + self.schedule(0, self.stop) def bus_tag_cb(self, bus, message): taglist = message.parse_tag() @@ -344,14 +344,14 @@ class TagWriteTask(task.Task): def play(): self._pipeline.set_state(gst.STATE_PLAYING) return False - self.runner.schedule(0, play) + self.schedule(0, play) #self._pipeline.set_state(gst.STATE_PLAYING) self.debug('scheduled setting to play') def _message_eos_cb(self, bus, message): self.debug('eos, scheduling stop') - self.runner.schedule(0, self.stop) + self.schedule(0, self.stop) def stop(self): # here to avoid import gst eating our options diff --git a/morituri/common/gstreamer.py b/morituri/common/gstreamer.py index 802c6f4..34d9d64 100644 --- a/morituri/common/gstreamer.py +++ b/morituri/common/gstreamer.py @@ -106,7 +106,7 @@ class GstPipelineTask(task.Task): if self.playing: self.debug('scheduling setting pipeline to PLAYING') - self.runner.schedule(0, playLater) + self.schedule(0, playLater) def stop(self): self.debug('stopping') @@ -169,4 +169,4 @@ class GstPipelineTask(task.Task): exc = GstException(*message.parse_error()) self.setAndRaiseException(exc) self.debug('error, scheduling stop') - self.runner.schedule(0, self.stop) + self.schedule(0, self.stop) diff --git a/morituri/common/task.py b/morituri/common/task.py index ec71be4..8dd68d8 100644 --- a/morituri/common/task.py +++ b/morituri/common/task.py @@ -155,6 +155,10 @@ class Task(object, log.Loggable): self.debug('set exception, %r, %r' % ( exception, self.exceptionMessage)) + def schedule(self, delta, callable, *args, **kwargs): + self.runner.schedule(self, delta, callable, *args, **kwargs) + + def addListener(self, listener): """ Add a listener for task status changes. @@ -210,7 +214,7 @@ class ITaskListener(object): class DummyTask(Task): def start(self, runner): Task.start(self, runner) - self.runner.schedule(1.0, self._wind) + self.schedule(1.0, self._wind) def _wind(self): self.setProgress(min(self.progress + 0.1, 1.0)) @@ -219,7 +223,7 @@ class DummyTask(Task): self.stop() return - self.runner.schedule(1.0, self._wind) + self.schedule(1.0, self._wind) class BaseMultiTask(Task, ITaskListener): """ @@ -433,10 +437,16 @@ class SyncRunner(TaskRunner, ITaskListener): self.stopped(task) - def schedule(self, delta, callable, *args, **kwargs): + def schedule(self, task, delta, callable, *args, **kwargs): def c(): - callable(*args, **kwargs) - return False + try: + callable(*args, **kwargs) + return False + except Exception, e: + self.debug('exception when calling scheduled callable %r', + callable) + task.setException(e) + raise gobject.timeout_add(int(delta * 1000L), c) ### ITaskListener methods diff --git a/morituri/program/cdparanoia.py b/morituri/program/cdparanoia.py index 4c3bd1f..1bf560c 100644 --- a/morituri/program/cdparanoia.py +++ b/morituri/program/cdparanoia.py @@ -274,7 +274,7 @@ class ReadTrackTask(task.Task): raise - self.runner.schedule(1.0, self._read, runner) + self.schedule(1.0, self._read, runner) def _read(self, runner): ret = self._popen.recv_err() @@ -282,7 +282,7 @@ class ReadTrackTask(task.Task): if self._popen.poll() is not None: self._done() return - self.runner.schedule(0.01, self._read, runner) + self.schedule(0.01, self._read, runner) return self._buffer += ret @@ -315,11 +315,11 @@ class ReadTrackTask(task.Task): # 0 does not give us output before we complete, 1.0 gives us output # too late - self.runner.schedule(0.01, self._read, runner) + self.schedule(0.01, self._read, runner) def _poll(self, runner): if self._popen.poll() is None: - self.runner.schedule(1.0, self._poll, runner) + self.schedule(1.0, self._poll, runner) return self._done() diff --git a/morituri/program/cdrdao.py b/morituri/program/cdrdao.py index 671832f..6a8d9c8 100644 --- a/morituri/program/cdrdao.py +++ b/morituri/program/cdrdao.py @@ -270,7 +270,7 @@ class CDRDAOTask(task.Task): self._popen.pid, self.options) self.debug('command: cdrdao %s', ' '.join(self.options)) - self.runner.schedule(1.0, self._read, runner) + self.schedule(1.0, self._read, runner) def _read(self, runner): try: @@ -288,7 +288,7 @@ class CDRDAOTask(task.Task): if self._popen.poll() is None and self.runner: # not finished yet - self.runner.schedule(1.0, self._read, runner) + self.schedule(1.0, self._read, runner) return self._done()