davemds pushed a commit to branch master.

http://git.enlightenment.org/enlightenment/modules/edgar.git/commit/?id=684fb7fc9056463623b9d7da303567783baba529

commit 684fb7fc9056463623b9d7da303567783baba529
Author: davemds <[email protected]>
Date:   Sat Aug 30 11:13:55 2014 +0200

    Audio: gracefully handle pulse disconnection
    
    Also moved the address_lookup function for readability
---
 GADGETS/audio/__init__.py | 72 +++++++++++++++++++++++++++--------------------
 1 file changed, 42 insertions(+), 30 deletions(-)

diff --git a/GADGETS/audio/__init__.py b/GADGETS/audio/__init__.py
index e53aed3..47580b0 100644
--- a/GADGETS/audio/__init__.py
+++ b/GADGETS/audio/__init__.py
@@ -52,8 +52,9 @@ class Gadget(e.Gadget):
         super().instance_destroyed(obj)
 
     def speaker_click_cb(self, obj, sig, source):
-        ch = self.pulse.channels[0]
-        ch.mute_toggle()
+        if self.pulse.channels:
+            ch = self.pulse.channels[0]
+            ch.mute_toggle()
 
     def speaker_update(self, speaker):
         if self.pulse and len(self.pulse.channels) > 0:
@@ -62,15 +63,16 @@ class Gadget(e.Gadget):
             speaker.message_send(0, (ch.muted, left, right))
 
     def speaker_wheel_cb(self, obj, sig, source):
-        ch = self.pulse.channels[0]
-        vol = ch.volume
-        if sig == 'mouse,wheel,0,1':
-            new_vol = vol - 3000
-        elif sig == 'mouse,wheel,0,-1':
-            new_vol = vol + 3000
-        else:
-            return
-        ch.volume_set(min(max(0, new_vol), 65500))
+        if self.pulse.channels:
+            ch = self.pulse.channels[0]
+            vol = ch.volume
+            if sig == 'mouse,wheel,0,1':
+                new_vol = vol - 3000
+            elif sig == 'mouse,wheel,0,-1':
+                new_vol = vol + 3000
+            else:
+                return
+            ch.volume_set(min(max(0, new_vol), 65500))
 
     def popup_created(self, popup):
         super().popup_created(popup)
@@ -348,6 +350,25 @@ class PulseAudio_Client(object):
 
         self.try_to_connect()
 
+    def address_lookup(self):
+        """ Search the address of the pulse dbus socket """
+        # 1. try the environment var
+        addr = os.environ.get('PULSE_DBUS_SERVER')
+        if addr: return addr
+
+        # 2. well-known system-wide daemon socket
+        if os.access('/run/pulse/dbus-socket', os.R_OK | os.W_OK):
+            return 'unix:path=/run/pulse/dbus-socket'
+
+        # 3. dbus lookup on the SessionBus
+        try:
+            bus = dbus.SessionBus()
+            obj = bus.get_object('org.PulseAudio1', 
'/org/pulseaudio/server_lookup1')
+            return obj.Get('org.PulseAudio.ServerLookup1', 'Address',
+                           dbus_interface=dbus.PROPERTIES_IFACE)
+        except:
+            return None
+
     def try_to_connect(self):
         if self.connect() is False:
             ecore.Timer(5.0, self.try_to_connect)
@@ -363,6 +384,7 @@ class PulseAudio_Client(object):
                                                    
mainloop=DBusEcoreMainLoop())
         except:
             return False
+        self.conn.call_on_disconnection(self.disconnect_cb)
 
         # get all available channels
         self.all_channels_add()
@@ -386,6 +408,15 @@ class PulseAudio_Client(object):
                                           path_keyword='obj_path')
         return True
 
+    def disconnect_cb(self, conn):
+        for ch in self.channels:
+            _instance.channel_removed(ch)
+            del ch
+        self.conn = None
+        self.srv_addr = None
+        self.channels = []
+        ecore.Timer(1.0, self.try_to_connect)
+
     def channel_signal_cb(self, *args, signal):
         obj_path = args[0]
         if signal == 'NewSink':
@@ -411,25 +442,6 @@ class PulseAudio_Client(object):
                     ch.mute_changed_signal_cb(*args)
                 break
 
-    def address_lookup(self):
-        """ Search the address of the pulse dbus socket """
-        # 1. try the environment var
-        addr = os.environ.get('PULSE_DBUS_SERVER')
-        if addr: return addr
-
-        # 2. well-known system-wide daemon socket
-        if os.access('/run/pulse/dbus-socket', os.R_OK | os.W_OK):
-            return 'unix:path=/run/pulse/dbus-socket'
-
-        # 3. dbus lookup on the SessionBus
-        try:
-            bus = dbus.SessionBus()
-            obj = bus.get_object('org.PulseAudio1', 
'/org/pulseaudio/server_lookup1')
-            return obj.Get('org.PulseAudio.ServerLookup1', 'Address',
-                           dbus_interface=dbus.PROPERTIES_IFACE)
-        except:
-            return None
-
     def _fuckyoupulse(self, ay):
         return ''.join([ chr(byte) for byte in ay ])
 

-- 


Reply via email to