From: Enrico Zini Date: Mon, 15 Jun 2009 15:49:10 +0000 (+0800) Subject: Implemented GPX + Audio recording X-Git-Url: https://git.toastfreeware.priv.at/gregoa/zavai.git/commitdiff_plain/367d8f4ea207ec3ef0d29bbfd60809017ae00c3c?hp=db4d40a5e3825a664d95f1bca17056a71adcf12f Implemented GPX + Audio recording --- diff --git a/plugins/55_gpx_trace.py b/plugins/55_gpx_trace.py index 28b00f8..d85f41d 100644 --- a/plugins/55_gpx_trace.py +++ b/plugins/55_gpx_trace.py @@ -25,7 +25,7 @@ class GPXTracer(gtk.ToggleAction): def __init__(self, registry, **kw): self.state = 0 - super(GPXTracer, self).__init__("menu.main.gps.toggle", self.states[self.state], None, None) + super(GPXTracer, self).__init__("menu.main.gps.gpx", self.states[self.state], None, None) self.registry = registry self.set_active(False) @@ -61,7 +61,49 @@ class GPXWaypoint(gtk.Action): def on_activate(self, *args): self.gpx.waypoint() +class GPXAudioTracer(gtk.ToggleAction): + states = [_("Start GPX and audio trace"), _("Stop GPX and audio trace")] + + def __init__(self, registry, **kw): + self.state = 0 + super(GPXAudioTracer, self).__init__("menu.main.gps.gpxaudio", self.states[self.state], None, None) + + self.registry = registry + self.recorder = zavai.Recorder(registry) + self.set_active(False) + + self.connect("toggled", self.on_toggle) + + def shutdown(self): + self.recorder.stop() + super(GPXAudioTracer, self).shutdown() + + def on_toggle(self, *args): + self.state = (self.state + 1) % len(self.states) + self.set_property("label", self.states[self.state]) + if self.get_active(): + self.start() + else: + self.stop() + + def start(self): + zavai.info("GPX trace started") + self.registry.resource("gpx").connect("gpx", self) + self.gpx.add_activity_monitor(self.on_gpx_activity_changed) + + def stop(self): + zavai.info("GPX trace ended") + self.registry.resource("gpx").disconnect("gpx", self) + self.recorder.stop() + self.gpx.del_activity_monitor(self.on_gpx_activity_changed) + + def on_gpx_activity_changed(self, gpx, state): + if state: + self.recorder.start(gpx.basename + ".wav") + else: + self.recorder.stop() def init(conf = None, registry = None, **kw): registry.register(GPXTracer(registry)) + registry.register(GPXAudioTracer(registry)) registry.register(GPXWaypoint(registry)) diff --git a/zavai/__init__.py b/zavai/__init__.py index 6c4c82b..147c581 100644 --- a/zavai/__init__.py +++ b/zavai/__init__.py @@ -23,7 +23,7 @@ from registry import Registry, Resource, Service, get_parent, default_label from menu import Menu, MenuButton, LinkButton, ToggleButton from app import Zavai, Applet from gps import GPS, GPX -from audio import Audio +from audio import Audio, Recorder def warn(*args): import sys diff --git a/zavai/audio.py b/zavai/audio.py index 37b483f..b7345d6 100755 --- a/zavai/audio.py +++ b/zavai/audio.py @@ -29,6 +29,31 @@ import gobject #import dbus.mainloop.glib #import subprocess +class Recorder(zavai.Resource): + def __init__(self, registry): + super(Recorder, self).__init__() + self.registry = registry + + 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: # - hook into the headset plugged/unplugged event @@ -84,10 +109,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) @@ -145,12 +166,6 @@ 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"])