annotate service/audioInputLevels/audioInputLevelsAlsa.py @ 887:64a2ba088665

audio input levels to graphite Ignore-this: b1422609f3bf51778b8b2284ca914916 darcs-hash:20130802145545-312f9-64fa9ffcb82dc26e67591f28b16633add6299cd0
author drewp <drewp@bigasterisk.com>
date Fri, 02 Aug 2013 07:55:45 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
887
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 from __future__ import division
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 import argparse, alsaaudio, time, numpy, galena, socket
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 def sendRecentAudio(accum, galenaOut, prefix):
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 samples = numpy.concatenate(accum)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 samples = abs(samples / (1<<15))
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 galenaOut.send(prefix + '.avg', numpy.average(samples))
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 galenaOut.send(prefix + '.max', numpy.amax(samples))
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 def sendForever(card, prefix, periodSec, galenaOut):
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 inp.setchannels(1)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 inp.setrate(44100)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15 inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 inp.setperiodsize(64)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 readSleepSec = .05
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19 lastSendTime = 0
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20 accum = []
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 while True:
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 # I was getting machine hangs on an eeePC and I tried anything
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 # to make it not crash. I think this helped.
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 time.sleep(readSleepSec)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 now = time.time()
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 if now - lastSendTime > periodSec * 2:
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 print "late: %s sec since last send and we have %s samples" % (
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 now - lastSendTime, sum(len(x) for x in accum))
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 nframes, data = inp.read()
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 if nframes <= 0:
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 #print 'nframes', nframes, len(data)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 continue # i get -32 a lot, don't know why
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36 samples = numpy.fromstring(data, dtype=numpy.int16)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37 accum.append(samples)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39 # -readSleepSec is in here to make sure we send a little too
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 # often (harmless) instead of missing a period sometimes,
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 # which makes a gap in the graph
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 if now > lastSendTime + periodSec - readSleepSec:
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43 sendRecentAudio(accum, galenaOut, prefix)
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
44 lastSendTime = time.time()
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
45
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 accum[:] = []
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 parser = argparse.ArgumentParser()
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 parser.add_argument(
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50 '--card', required=True,
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51 help='alsa card name (see list of unindented lines from `arecord -L`)')
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 args = parser.parse_args()
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54 sendForever(
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55 prefix='system.house.audio.%s' % socket.gethostname(),
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 periodSec=2,
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57 card=args.card,
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 galenaOut=galena.Galena(host='bang'),
64a2ba088665 audio input levels to graphite
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 )