[Sugar-devel] [PATCH Sugar] Inhibit power suspend while playing text to speech - OLPC #11830

Gonzalo Odiard godiard at sugarlabs.org
Wed May 9 11:54:42 EDT 2012


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?



> 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.

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20120509/89661397/attachment-0001.html>


More information about the Sugar-devel mailing list