#!/usr/bin/env python3 # # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution # Copyright (C)2013-2016 Philemon # # 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 . """ 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)