#!/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 is 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)