2
2
3
3
from math import ceil
4
4
from mpf .core .logging import LogMixin
5
+ from mpf .core .settings_controller import SettingEntry
6
+
7
+ VARIABLE_NAME = "fast_audio_%s_volume"
8
+ SETTING_TYPE = "hw_volume"
5
9
6
10
7
11
class FASTAudioInterface (LogMixin ):
@@ -17,9 +21,9 @@ def __init__(self, platform, communicator):
17
21
self .machine = platform .machine
18
22
self .communicator = communicator
19
23
self .amps = {
20
- 'main' : {'name' : 'fast_audio_main' , 'label' : "Speakers" },
21
- 'sub' : {'name' : 'fast_audio_sub' , 'label' : "Subwoofer" },
22
- 'headphones' : {'name' : 'fast_audio_headphones' , 'label' : "Headphones" }
24
+ 'main' : {'name' : 'fast_audio_main' , 'label' : "Speakers" , 'sort' : 0 },
25
+ 'sub' : {'name' : 'fast_audio_sub' , 'label' : "Subwoofer" , 'sort' : 1 },
26
+ 'headphones' : {'name' : 'fast_audio_headphones' , 'label' : "Headphones" , 'sort' : 2 }
23
27
}
24
28
self .control_pin_pulse_times = list ()
25
29
@@ -35,30 +39,41 @@ def _initialize(self, **kwargs):
35
39
self ._register_event_handlers ()
36
40
37
41
def _configure_machine_vars (self ):
38
- for amp_name in self .amps :
39
- var_name = f'fast_audio_{ amp_name } _volume'
40
-
41
- # Is there a race condition on first boot if the linked amp
42
- # comes in the iteration before 'main' is written?
43
- if amp_name != 'main' and self .communicator .config [f'link_{ amp_name } _to_main' ]:
44
- self .machine .variables .set_machine_var (
45
- name = var_name ,
46
- value = self .machine .variables .get_machine_var ('fast_audio_main_volume' ),
47
- persist = self .communicator .config ['persist_volume_settings' ]
48
- )
49
- elif not self .machine .variables .is_machine_var (var_name ):
50
- self .machine .variables .set_machine_var (
51
- name = var_name ,
52
- value = self .communicator .config [f'default_{ amp_name } _volume' ],
53
- persist = self .communicator .config ['persist_volume_settings' ]
54
- )
42
+ # See if main volume has been defined yet, otherwise use default
43
+ main_volume = self .machine .variables .get_machine_var ('fast_audio_main_volume' )
44
+ if main_volume is None :
45
+ main_volume = self .communicator .config ['default_main_volume' ]
46
+
47
+ for amp_name , settings in self .amps .items ():
48
+
49
+ default_value = self .communicator .config [f'default_{ amp_name } _volume' ]
50
+ if self .communicator .config .get (f'link_{ amp_name } _to_main' , False ):
51
+ machine_var_name = VARIABLE_NAME % "main"
52
+ else :
53
+ machine_var_name = VARIABLE_NAME % amp_name
54
+
55
+ # Create a machine variable if one doesn't exist
56
+ if not self .machine .variables .is_machine_var (machine_var_name ):
57
+ self .machine .variables .set_machine_var (machine_var_name , default_value ,
58
+ self .communicator .config ['persist_volume_settings' ])
59
+
60
+ # Identify the machine var for this amp
61
+ settings ["machine_var" ] = machine_var_name
62
+ self .machine .settings .add_setting (SettingEntry (
63
+ settings ['name' ],
64
+ settings ['label' ],
65
+ settings ['sort' ],
66
+ machine_var_name ,
67
+ default_value ,
68
+ None ,
69
+ SETTING_TYPE
70
+ ))
55
71
56
72
def _init_amps (self ):
57
73
for amp_name , amp in self .amps .items ():
58
74
amp ['steps' ] = self .communicator .config [f'{ amp_name } _steps' ]
59
75
amp ['max_volume' ] = self .communicator .config [f'max_hw_volume_{ amp_name } ' ]
60
76
amp ['levels_list' ] = self .communicator .config [f'{ amp_name } _levels_list' ]
61
- amp ['link_to_main' ] = self .communicator .config [f'link_{ amp_name } _to_main' ]
62
77
63
78
# Just set everything here. The communicator will send the
64
79
# config as part of its init process later
@@ -71,7 +86,8 @@ def _init_amps(self):
71
86
# if we have a levels list in the config, make sure the steps num is right
72
87
amp ['steps' ] = len (amp ['levels_list' ]) - 1
73
88
74
- if amp ['link_to_main' ] and len (amp ['levels_list' ]) != len (self .amps ['main' ]['levels_list' ]):
89
+ if self .communicator .config [f'link_{ amp_name } _to_main' ] and \
90
+ len (amp ['levels_list' ]) != len (self .amps ['main' ]['levels_list' ]):
75
91
raise AssertionError (f"Cannot link { amp_name } to main. The number of volume steps must be the same. "
76
92
f"Main has { len (self .amps ['main' ]['levels_list' ])} steps, "
77
93
f"but { amp_name } has { len (amp ['levels_list' ])} steps." )
@@ -135,7 +151,6 @@ def send_volume_to_hw(self, amp_name=None, send_now=True):
135
151
for each_amp_name in self .amps :
136
152
self .send_volume_to_hw (each_amp_name , send_now )
137
153
return
138
-
139
154
self .communicator .set_volume (amp_name , self .get_volume (amp_name ), send_now )
140
155
141
156
def _set_volume (self , amp_name , value = 0 , ** kwargs ):
@@ -155,19 +170,13 @@ def _set_volume(self, amp_name, value=0, **kwargs):
155
170
#self.platform.debug_log("Writing FAST amp volume %s to %s (decimal)", amp_name, value)
156
171
self .send_volume_to_hw (amp_name )
157
172
158
- if amp_name == 'main' :
159
- for other_amp_name , other_amp in self .amps .items ():
160
- if other_amp_name != amp_name and other_amp ['link_to_main' ]:
161
- # Update the machine var, which will be caught and handled
162
- self ._set_machine_var_volume (other_amp_name , value )
163
-
164
173
def get_volume (self , amp_name , ** kwargs ):
165
174
"""Return the current volume of the specified amp."""
166
175
del kwargs
167
- return self .machine .variables .get_machine_var (f'fast_audio_ { amp_name } _volume' )
176
+ return self .machine .variables .get_machine_var (self . amps [ amp_name ][ "machine_var" ]) or 0
168
177
169
178
def _set_machine_var_volume (self , amp_name , value ):
170
- self .machine .variables .set_machine_var (f'fast_audio_ { amp_name } _volume' , value )
179
+ self .machine .variables .set_machine_var (self . amps [ amp_name ][ "machine_var" ] , value )
171
180
172
181
def temp_volume (self , amp_name , change = 1 , ** kwargs ):
173
182
"""Temporarily change the volume by the specified number of units, up or down.
0 commit comments