Take icons from the right place
[gregoa/zavai.git] / zavai / audio.py
index 37b483f72724c7b75df4101ad56dbcb7b40ed61a..9d7835e89488405e7dd3acd59bfae9ae90602700 100755 (executable)
 import zavai
 import struct
 import gobject
+import os
+import os.path
+import subprocess
+import signal
 #import sys
-#import os
-#import os.path
 #import time
-#import signal
-#import optparse
 #import dbus
-#import dbus.mainloop.glib
-#import subprocess
+
+class Recorder(zavai.Resource):
+    def __init__(self, registry):
+        super(Recorder, self).__init__()
+        self.registry = registry
+        self.recorder = None
+
+    def shutdown(self):
+        self.stop()
+
+    def start(self, filename):
+        if self.recorder is not None: return
+
+        self.registry.resource("audio").connect("audio", self)
+
+        self.recorder = subprocess.Popen(
+            ["arecord", "-D", "hw", "-f", "cd", "-r", "8000", "-t", "wav", filename])
+
+    def stop(self):
+        if self.recorder is None: return
+
+        os.kill(self.recorder.pid, signal.SIGINT)
+        self.recorder.wait()
+        self.recorder = None
+
+        self.registry.resource("audio").disconnect("audio", self)
 
 
 # TODO:
@@ -36,7 +60,7 @@ import gobject
 #  - if plugged, redo headest mixer settings
 class Audio(zavai.Service):
     "Handle mixer settings, audio recording and headset button presses"
-    def __init__(self, registry):
+    def __init__(self, registry, name):
         super(Audio, self).__init__(["audio", "button", "jack"])
 
         conf = registry.resource("conf")
@@ -84,10 +108,6 @@ class Audio(zavai.Service):
         self.input_fd.close()
         self.input_fd = None
 
-#        if self.recorder is not None:
-#            os.kill(self.recorder.pid, signal.SIGINT)
-#            self.recorder.wait()
-
         # Restore mixer settings
         self.load_scenario(self.saved_scenario)
 
@@ -118,7 +138,7 @@ class Audio(zavai.Service):
 
     def mixer_for_headset(self, force=False):
         if not force and self.has_headset: return
-        info("Setting mixer for headset")
+        zavai.info("Setting mixer for headset")
         # TODO: find out how to disable the handset microphone: this does not
         # seem to be sufficient
         self.mixer_set_many(
@@ -132,7 +152,7 @@ class Audio(zavai.Service):
 
     def mixer_for_handset(self, force=False):
         if not force and not self.has_headset: return
-        info("Setting mixer for handset")
+        zavai.info("Setting mixer for handset")
         self.mixer_set_many(
                 ("DAPM Handset Mic", "unmute"),
                 ("DAPM Headset Mic", "mute"),
@@ -145,42 +165,44 @@ class Audio(zavai.Service):
 #    def set_basename(self, basename):
 #        self.basename = basename
 #
-#    def start_recording(self):
-#        if self.basename is None:
-#            raise RuntimeError("Recording requested but basename not set")
-#        self.recorder = subprocess.Popen(
-#            ["arecord", "-D", "hw", "-f", "cd", "-r", "8000", "-t", "wav", self.basename + ".wav"])
-#
 #    def start_levels(self):
 #        self.recorder = subprocess.Popen(
 #            ["arecord", "-D", "hw", "-f", "cd", "-r", "8000", "-t", "wav", "-V", "stereo", "/dev/null"])
 
     def save_scenario(self, name):
-        res = subprocess.call(["alsactl", "store", "-f", name])
-        if res != 0:
-            raise RuntimeError("Saving audio scenario to '%s' failed" % name)
+        while True:
+                res = subprocess.call(["alsactl", "store", "-f", name])
+                if res == 0: return
+                if res > 0:
+                    raise RuntimeError("Saving audio scenario to '%s' failed" % name)
 
     def load_scenario(self, name):
-        res = subprocess.call(["alsactl", "restore", "-f", name])
-        if res != 0:
-            raise RuntimeError("Loading audio scenario '%s' failed with error %d" % (name, res))
+        while True:
+                res = subprocess.call(["alsactl", "restore", "-f", name])
+                if res == 0: return
+                if res > 0:
+                    raise RuntimeError("Loading audio scenario '%s' failed with error %d" % (name, res))
 
     def mixer_set(self, name, *args):
         args = map(str, args)
-        res = subprocess.call(["amixer", "-q", "set", name] + args)
-        if res != 0:
-            raise RuntimeError("Setting mixer '%s' to %s failed with error %d" % (name, " ".join(args), res))
+        while True:
+                res = subprocess.call(["amixer", "-q", "set", name] + args)
+                if res == 0: return
+                if res > 0:
+                    raise RuntimeError("Setting mixer '%s' to %s failed with error %d" % (name, " ".join(args), res))
 
     def mixer_set_many(self, *args):
         """Perform many mixer set operations via amixer --stdin"""
-        proc = subprocess.Popen(["amixer", "-q", "--stdin"], stdin=subprocess.PIPE)
         cmd_input = []
         for k, v in args:
             cmd_input.append("sset " + repr(k) + " " + repr(v))
-        (out, err) = proc.communicate(input="\n".join(cmd_input))
-        res = proc.wait()
-        if res != 0:
-            raise RuntimeError("Setting mixer failed with error %d" % res)
+        while True:
+                proc = subprocess.Popen(["amixer", "-q", "--stdin"], stdin=subprocess.PIPE)
+                (out, err) = proc.communicate(input="\n".join(cmd_input))
+                res = proc.wait()
+                if res == 0: return
+                if res > 0:
+                    raise RuntimeError("Setting mixer failed with error %d" % res)
 
 
 #class Hub: