Commits

Felix Krull committed 75c1973

Explicitly disconnect GObject signals.

Comments (0)

Files changed (4)

 import gst
 import gobject
 
-from rgain import GainData, GSTError
+from rgain import GainData, GSTError, util
 
 GST_TAG_REFERENCE_LEVEL = "replaygain-reference-level"
 
         exc_slot[0] = exc
         loop.quit()
     rg = ReplayGain(*args, **kwargs)
-    rg.connect("all-finished", on_finished)
-    rg.connect("error", on_error)
-    loop = gobject.MainLoop()
-    rg.start()
-    loop.run()
+    with util.gobject_signals(rg,
+        ("all-finished", on_finished),
+        ("error", on_error),):
+        loop = gobject.MainLoop()
+        rg.start()
+        loop.run()
     if exc_slot[0] is not None:
         raise exc_slot[0]
     return (rg.track_data, rg.album_data)

rgain/script/__init__.py

         mp3_format="default")
     
     return opts
-

rgain/script/replaygain.py

 
 import gobject
 
-from rgain import rgio
+from rgain import rgio, util
 from rgain.script import ou, un, Error, common_options
 
 
         loop.quit()
     
     rg = rgcalc.ReplayGain(files, True, ref_level)
-    rg.connect("all-finished", on_finished)
-    rg.connect("track-started", on_trk_started)
-    rg.connect("track-finished", on_trk_finished)
-    rg.connect("error", on_error)
-    loop = gobject.MainLoop()
-    rg.start()
-    loop.run()
+    with util.gobject_signals(rg,
+        ("all-finished", on_finished),
+        ("track-started", on_trk_started),
+        ("track-finished", on_trk_finished),
+        ("error", on_error),):
+        loop = gobject.MainLoop()
+        rg.start()
+        loop.run()
     if exc_slot[0] is not None:
         raise exc_slot[0]
     return rg.track_data, rg.album_data
+# -*- coding: utf-8 -*-
+# 
+# Copyright (c) 2009, 2010, 2012 Felix Krull <f_krull@gmx.de>
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+import contextlib
+
+import gobject
+
+@contextlib.contextmanager
+def gobject_signals(obj, *signals):
+    """Context manager to connect and disconnect GObject signals using a ``with``
+    statement.
+    """
+    signal_ids = []
+    try:
+        for signal in signals:
+            signal_ids.append(obj.connect(*signal))
+        yield
+    finally:
+        for signal_id in signal_ids:
+            obj.disconnect(signal_id)