1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #!/usr/bin/env python3
- #
- # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
- # Copyright (C)2013-2016 Philemon <mmgen-py@yandex.com>
- #
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
- """
- mmgen_node_tools.Sound: audio-related functions for MMGen node tools
- """
- import sys,os,time
- from mmgen.util import die
- from mmgen_node_tools.Util import do_system
- _alsa_config_file = '/tmp/alsa-config-' + os.path.basename(sys.argv[0])
- _dvols = { 'Master': 78, 'Speaker': 78, 'Headphone': 15, 'PCM': 190 }
- def timespec2secs(ts):
- import re
- mul = { 's': 1, 'm': 60, 'h': 60*60, 'd': 60*60*24 }
- pat = r'^([0-9]+)([smhd]*)$'
- m = re.match(pat,ts)
- if m == None:
- die(2,"'%s': invalid time specifier" % ts)
- a,b = m.groups()
- return int(a) * (mul[b] if b else 1)
- def parse_repeat_spec(rs):
- return [(timespec2secs(i),timespec2secs(j))
- for i,j in [a.split(':') for a in rs.split(',')]]
- def init_sound():
- def _restore_sound():
- # msg('Restoring sound volume')
- do_system('sudo alsactl restore -f ' + _alsa_config_file)
- os.unlink(_alsa_config_file)
- import atexit
- atexit.register(_restore_sound)
- do_system('sudo alsactl store -f ' + _alsa_config_file)
- def play_sound(fn,vol,repeat_spec='',remote_host='',kill_flg=None,testing=False):
- if not remote_host:
- do_system('sudo alsactl store -f ' + _alsa_config_file)
- for k in 'Master','Speaker','Headphone':
- do_system(('sudo amixer -q set %s on' % k),testing)
- # do_system('amixer -q set Headphone off')
- vols = dict([(k,int(_dvols[k] * float(vol) / 100)) for k in _dvols])
- for k in vols:
- do_system('sudo amixer -q set %s %s' % (k,vols[k]),testing)
- fn = os.path.expanduser(fn)
- cmd = (
- 'aplay -q %s' % fn,
- 'ssh %s mmnode-play-sound -v%d %s' % (remote_host,vol,fn)
- )[bool(remote_host)]
- if repeat_spec and kill_flg:
- for interval,duration in parse_repeat_spec(repeat_spec):
- start = time.time()
- while time.time() < start + duration:
- do_system(cmd,testing)
- if kill_flg.wait(interval):
- if not remote_host:
- do_system('sudo alsactl restore -f ' + _alsa_config_file)
- return
- else: # Play once
- do_system(cmd,testing)
- if not remote_host:
- do_system('sudo alsactl restore -f ' + _alsa_config_file)
|