Added note about cgroup2 protection
[ampy.git] / device.py
1 #!/usr/bin/python3
2
3 import json
4 import os
5 import sys
6
7 import pyaudio
8
9 PARAMFILE = '/var/lib/ampy/params.json'
10
11 p = pyaudio.PyAudio()
12
13
14 def main():
15     import argparse
16
17     parser = argparse.ArgumentParser(description='Ampy configuration tool')
18     parser.add_argument(
19             'device',
20             metavar='channel',
21             help='set audio input channel to use',
22             type=int,
23             choices=range(p.get_device_count()),
24             nargs='?',
25             )
26     args = parser.parse_args()
27
28     # Read the old values
29
30     params = {}
31     params_device = None
32     try:
33         with open(PARAMFILE) as f:
34             params = json.loads(f.read())
35         params_device = params['alsadevice']
36     except FileNotFoundError:
37         print(file=sys.stderr)
38         print("Parameters file not found. Device has never been selected?",
39               file=sys.stderr)
40     except json.decoder.JSONDecodeError:
41         print(file=sys.stderr)
42         print("{} is corrupted: Try deleting it?".format(PARAMFILE),
43               file=sys.stderr)
44     except KeyError:
45         print(file=sys.stderr)
46         print("Parameter file has no device value. "
47               " Device has never been selected?",
48               file=sys.stderr)
49
50     # Store the new value in device var and in file
51
52     stored = False
53     if args.device is None:
54         # No argument? Use the existing params
55         device = params_device
56     else:
57         if args.device == params_device:
58             # No change
59             device = params_device
60         else:
61             params['alsadevice'] = args.device
62             try:
63                 with open(PARAMFILE+'.new', 'w') as f:
64                     f.write(json.dumps(params))
65                 os.rename(PARAMFILE+'.new', PARAMFILE)
66                 device = args.device
67                 stored = True
68             except PermissionError:
69                 device = params_device
70                 print(file=sys.stderr)
71                 print("ERROR Permission denied. Are you in group ampy?"
72                       " Try sudo -u ampy ...",
73                       file=sys.stderr)
74
75     # Print state
76
77     print('Audio input devices:')
78     for i in range(p.get_device_count()):
79         print(' * ' if i == device else '   ',
80               i,
81               p.get_device_info_by_index(i)['name'])
82
83     if device is None:
84         print()
85         print("Which audio input device would you like to listen to?")
86         print("Please pick a number.")
87     if stored:
88         print()
89         print("Value stored. Please restart ampy daemon.")
90
91
92 if __name__ == '__main__':
93     main()