Serial foot pedals
Here are some pedals for controlling the mpd (music player daemon) for easier transcribing of lectures. Play the audio with any mpd client, then run this to use pedals for pause and rewind-2-secs.
Uses pyserial and py-libmpdclient.
#!/usr/local/bin/python import serial,time,mpdclient class RetryingMpdController: def __init__(self,**kw): self.mpd_kw = kw self.reconnect() def reconnect(self): self.mpd = mpdclient.MpdController(**self.mpd_kw) print "connecting to mpd" def __getattr__(self,attr): def retrying_method(*args): func = getattr(self.mpd,attr) try: func(*args) except mpdclient.MpdError: self.reconnect() func(*args) return retrying_method class Pedals: """ connect RTS to DSR and CTS like so (pin numbers are for 9-pin serial port): pin 7 RTS -->-----------+ | left / | pin 6 DSR <-------/ o---+ | right / | pin 8 CTS <-------/ o---+ """ def __init__(self,*actions): self.ser = serial.Serial(port="/dev/ttyS0",rtscts=1) self.ser.setRTS(1) self.prev = False,False self.actions = actions def poll(self): pedals = self.ser.getDSR(),self.ser.getCTS() for which in range(2): if pedals[which] and not self.prev[which]: self.actions[which]() self.prev = pedals class Playback: def __init__(self): self.mpd = RetryingMpdController(host='localhost',port=6600) def rewind(self,secs=2): pos,length,frac = self.mpd.getSongPosition() self.mpd.seek(seconds=pos-secs) def pause(self): self.mpd.pause() play = Playback() ped = Pedals(play.rewind, play.pause) print "monitoring pedals (press ctrl-c to exit)..." while 1: ped.poll() time.sleep(.01)