Mercurial > code > home > repos > homeauto
diff service/audioInputLevels/audioInputLevelsAlsa.py @ 82:d288bc1174d4
audio input levels to graphite
Ignore-this: b1422609f3bf51778b8b2284ca914916
author | drewp@bigasterisk.com |
---|---|
date | Fri, 02 Aug 2013 07:55:45 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/audioInputLevels/audioInputLevelsAlsa.py Fri Aug 02 07:55:45 2013 -0700 @@ -0,0 +1,59 @@ +from __future__ import division +import argparse, alsaaudio, time, numpy, galena, socket + +def sendRecentAudio(accum, galenaOut, prefix): + samples = numpy.concatenate(accum) + samples = abs(samples / (1<<15)) + + galenaOut.send(prefix + '.avg', numpy.average(samples)) + galenaOut.send(prefix + '.max', numpy.amax(samples)) + +def sendForever(card, prefix, periodSec, galenaOut): + inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card) + inp.setchannels(1) + inp.setrate(44100) + inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) + inp.setperiodsize(64) + + readSleepSec = .05 + lastSendTime = 0 + accum = [] + while True: + + # I was getting machine hangs on an eeePC and I tried anything + # to make it not crash. I think this helped. + time.sleep(readSleepSec) + + now = time.time() + if now - lastSendTime > periodSec * 2: + print "late: %s sec since last send and we have %s samples" % ( + now - lastSendTime, sum(len(x) for x in accum)) + + nframes, data = inp.read() + if nframes <= 0: + #print 'nframes', nframes, len(data) + continue # i get -32 a lot, don't know why + samples = numpy.fromstring(data, dtype=numpy.int16) + accum.append(samples) + + # -readSleepSec is in here to make sure we send a little too + # often (harmless) instead of missing a period sometimes, + # which makes a gap in the graph + if now > lastSendTime + periodSec - readSleepSec: + sendRecentAudio(accum, galenaOut, prefix) + lastSendTime = time.time() + + accum[:] = [] + +parser = argparse.ArgumentParser() +parser.add_argument( + '--card', required=True, + help='alsa card name (see list of unindented lines from `arecord -L`)') + +args = parser.parse_args() +sendForever( + prefix='system.house.audio.%s' % socket.gethostname(), + periodSec=2, + card=args.card, + galenaOut=galena.Galena(host='bang'), +)