annotate service/audioInputLevels/audioInputLevelsAlsa.py @ 709:95556cacb6e1

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