[Sugar-devel] [PATCH Sugar] Inhibit power suspend while playing text to speech - OLPC #11830
Paul Fox
pgf at laptop.org
Wed May 9 11:56:44 EDT 2012
gonzalo wrote:
> On Wed, May 9, 2012 at 12:42 PM, Paul Fox <pgf at laptop.org> wrote:
>
> > i would much prefer that we could prevent suspend during any
> > audio playback, rather than have to have anyone that wants
> > to make noise do it individually.
> >
> >
> But this should be done at a lower level, right?
yes, sorry -- that comment wasn't really directed at sugar.
>
> > that being said, you can eliminate any of the code below that deals
> > with the ohm keystore. if we move away from powerd, it likely won't
> > be back to ohmd.
> >
> >
> Thanks. I was not sure if needed.
i'd say that code supporting ohm can be removed anywhere you happen
to find it, these days.
paul
>
> Gonzalo
>
>
> > paul
> >
> > godiard at sugarlabs.org wrote:
> > > From: Gonzalo Odiard <godiard at gmail.com>
> > >
> > > To avoid stoping playing the text when the xo go to sleep.
> > > This patch creates a file in /var/run/powerd-inhibit-suspend/
> > > and remove it when finish. Is the same technique used in activities
> > > (the code is copied from Distance activity) but we need decide
> > > if is the right thing to do in sugar.
> > >
> > > Signed-off-by: Gonzalo Odiard <gonzalo at laptop.org>
> > > ---
> > > src/jarabe/model/speech.py | 69
> > ++++++++++++++++++++++++++++++++++++++++----
> > > 1 file changed, 63 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/src/jarabe/model/speech.py b/src/jarabe/model/speech.py
> > > index 1cb0ad4..24f4152 100644
> > > --- a/src/jarabe/model/speech.py
> > > +++ b/src/jarabe/model/speech.py
> > > @@ -21,6 +21,7 @@ import gconf
> > > import gst
> > > import gtk
> > > import gobject
> > > +import dbus
> > >
> > >
> > > DEFAULT_PITCH = 0
> > > @@ -30,6 +31,10 @@ DEFAULT_RATE = 0
> > >
> > > _speech_manager = None
> > >
> > > +# directory exists if powerd is running. create a file here,
> > > +# named after our pid, to inhibit suspend.
> > > +POWERD_INHIBIT_DIR = '/var/run/powerd-inhibit-suspend'
> > > +
> > >
> > > class SpeechManager(gobject.GObject):
> > >
> > > @@ -138,7 +143,20 @@ class _GstSpeechPlayer(gobject.GObject):
> > > gobject.GObject.__init__(self)
> > > self._pipeline = None
> > >
> > > + self.using_powerd = False
> > > + if not self.powerd_running():
> > > + try:
> > > + bus = dbus.SystemBus()
> > > + proxy = bus.get_object('org.freedesktop.ohm',
> > > + '/org/freedesktop/ohm/Keystore')
> > > + self.ohm_keystore = dbus.Interface(
> > > + proxy, 'org.freedesktop.ohm.Keystore')
> > > + except dbus.DBusException, e:
> > > + logging.warning("Error setting OHM inhibit: %s", e)
> > > + self.ohm_keystore = None
> > > +
> > > def restart_sound_device(self):
> > > + self._inhibit_suspend()
> > > if self._pipeline is None:
> > > logging.debug('Trying to restart not initialized sound
> > device')
> > > return
> > > @@ -147,6 +165,7 @@ class _GstSpeechPlayer(gobject.GObject):
> > > self.emit('play')
> > >
> > > def pause_sound_device(self):
> > > + self._allow_suspend()
> > > if self._pipeline is None:
> > > return
> > >
> > > @@ -154,6 +173,7 @@ class _GstSpeechPlayer(gobject.GObject):
> > > self.emit('pause')
> > >
> > > def stop_sound_device(self):
> > > + self._allow_suspend()
> > > if self._pipeline is None:
> > > return
> > >
> > > @@ -172,12 +192,9 @@ class _GstSpeechPlayer(gobject.GObject):
> > > bus.connect('message', self.__pipe_message_cb)
> > >
> > > def __pipe_message_cb(self, bus, message):
> > > - if message.type == gst.MESSAGE_EOS:
> > > - self._pipeline.set_state(gst.STATE_NULL)
> > > - self.emit('stop')
> > > - elif message.type == gst.MESSAGE_ERROR:
> > > - self._pipeline.set_state(gst.STATE_NULL)
> > > - self.emit('stop')
> > > + if message.type == gst.MESSAGE_EOS or \
> > > + message.type == gst.MESSAGE_ERROR:
> > > + self.stop_sound_device()
> > >
> > > def speak(self, pitch, rate, voice_name, text):
> > > # TODO workaround for http://bugs.sugarlabs.org/ticket/1801
> > > @@ -223,6 +240,46 @@ class _GstSpeechPlayer(gobject.GObject):
> > > locale, best)
> > > return best
> > >
> > > + def powerd_running(self):
> > > + self.using_powerd = os.access(POWERD_INHIBIT_DIR, os.W_OK)
> > > + logging.debug("using_powerd: %d", self.using_powerd)
> > > + return self.using_powerd
> > > +
> > > + def _inhibit_suspend(self):
> > > + if self.using_powerd:
> > > + fd = open(POWERD_INHIBIT_DIR + "/%u" % os.getpid(), 'w')
> > > + logging.debug("inhibit_suspend file is %s" % \
> > > + POWERD_INHIBIT_DIR + "/%u" %
> > os.getpid())
> > > + fd.close()
> > > + return True
> > > +
> > > + if self.ohm_keystore is not None:
> > > + try:
> > > + self.ohm_keystore.SetKey('suspend.inhibit', 1)
> > > + return self.ohm_keystore.GetKey('suspend.inhibit')
> > > + except dbus.exceptions.DBusException:
> > > + logging.warning("failed to inhibit suspend")
> > > + return False
> > > + else:
> > > + return False
> > > +
> > > + def _allow_suspend(self):
> > > + if self.using_powerd:
> > > + os.unlink(POWERD_INHIBIT_DIR + "/%u" % os.getpid())
> > > + logging.debug("allow_suspend unlinking %s" % \
> > > + POWERD_INHIBIT_DIR + "/%u" %
> > os.getpid())
> > > + return True
> > > +
> > > + if self.ohm_keystore is not None:
> > > + try:
> > > + self.ohm_keystore.SetKey('suspend.inhibit', 0)
> > > + return self.ohm_keystore.GetKey('suspend.inhibit')
> > > + except dbus.exceptions.DBusException:
> > > + logging.error("failed to allow suspend")
> > > + return False
> > > + else:
> > > + return False
> > > +
> > >
> > > def get_speech_manager():
> > > global _speech_manager
> > > --
> > > 1.7.10.1
> > >
> > > _______________________________________________
> > > Sugar-devel mailing list
> > > Sugar-devel at lists.sugarlabs.org
> > > http://lists.sugarlabs.org/listinfo/sugar-devel
> >
> > =---------------------
> > paul fox, pgf at laptop.org
> >
>
>
>
> --
> Gonzalo Odiard
> SugarLabs Argentina
=---------------------
paul fox, pgf at laptop.org
More information about the Sugar-devel
mailing list