xair-api 2.3.2__py3-none-any.whl → 2.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
xair_api/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from .xair import request_remote_obj as connect
2
2
 
3
- _ALL__ = ["connect"]
3
+ _ALL__ = ['connect']
xair_api/adapter.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from .bus import Bus as IBus
2
+ from .headamp import HeadAmp as IHeadAmp
2
3
  from .lr import LR as ILR
3
4
  from .rtn import AuxRtn as IAuxRtn
4
5
  from .rtn import FxRtn as IFxRtn
@@ -7,34 +8,40 @@ from .rtn import FxRtn as IFxRtn
7
8
  class Bus(IBus):
8
9
  @property
9
10
  def address(self):
10
- return f"/bus/{str(self.index).zfill(2)}"
11
+ return f'/bus/{str(self.index).zfill(2)}'
11
12
 
12
13
 
13
14
  class AuxRtn(IAuxRtn):
14
15
  @property
15
16
  def address(self):
16
- return f"/auxin/{str(self.index).zfill(2)}"
17
+ return f'/auxin/{str(self.index).zfill(2)}'
17
18
 
18
19
 
19
20
  class FxRtn(IFxRtn):
20
21
  @property
21
22
  def address(self):
22
- return f"/fxrtn/{str(self.index).zfill(2)}"
23
+ return f'/fxrtn/{str(self.index).zfill(2)}'
23
24
 
24
25
 
25
26
  class MainStereo(ILR):
26
27
  @property
27
28
  def address(self) -> str:
28
- return "/main/st"
29
+ return '/main/st'
29
30
 
30
31
 
31
32
  class MainMono(ILR):
32
33
  @property
33
34
  def address(self) -> str:
34
- return "/main/m"
35
+ return '/main/m'
35
36
 
36
37
 
37
38
  class Matrix(ILR):
38
39
  @property
39
40
  def address(self) -> str:
40
- return f"/mtx/{str(self.index).zfill(2)}"
41
+ return f'/mtx/{str(self.index).zfill(2)}'
42
+
43
+
44
+ class HeadAmp(IHeadAmp):
45
+ @property
46
+ def address(self):
47
+ return f'/headamp/{str(self.index).zfill(3)}'
xair_api/bus.py CHANGED
@@ -16,10 +16,10 @@ class IBus(abc.ABC):
16
16
  self.logger = logger.getChild(self.__class__.__name__)
17
17
 
18
18
  def getter(self, param: str):
19
- return self._remote.query(f"{self.address}/{param}")
19
+ return self._remote.query(f'{self.address}/{param}')
20
20
 
21
21
  def setter(self, param: str, val: int):
22
- self._remote.send(f"{self.address}/{param}", val)
22
+ self._remote.send(f'{self.address}/{param}', val)
23
23
 
24
24
  @abc.abstractmethod
25
25
  def address(self):
@@ -39,12 +39,12 @@ class Bus(IBus):
39
39
  Returns a Bus class of a kind.
40
40
  """
41
41
  BUS_cls = type(
42
- f"Bus{remote.kind}",
42
+ f'Bus{remote.kind}',
43
43
  (cls,),
44
44
  {
45
45
  **{
46
46
  _cls.__name__.lower(): type(
47
- f"{_cls.__name__}{remote.kind}", (_cls, cls), {}
47
+ f'{_cls.__name__}{remote.kind}', (_cls, cls), {}
48
48
  )(remote, index)
49
49
  for _cls in (
50
50
  Config,
@@ -56,11 +56,11 @@ class Bus(IBus):
56
56
  Group,
57
57
  )
58
58
  },
59
- "mute": mute_prop(),
59
+ 'mute': mute_prop(),
60
60
  },
61
61
  )
62
62
  return BUS_cls(remote, index)
63
63
 
64
64
  @property
65
65
  def address(self) -> str:
66
- return f"/bus/{self.index}"
66
+ return f'/bus/{self.index}'
xair_api/config.py CHANGED
@@ -15,10 +15,10 @@ class IConfig(abc.ABC):
15
15
  self.logger = logger.getChild(self.__class__.__name__)
16
16
 
17
17
  def getter(self, param: str):
18
- return self._remote.query(f"{self.address}/{param}")
18
+ return self._remote.query(f'{self.address}/{param}')
19
19
 
20
20
  def setter(self, param: str, val: int):
21
- self._remote.send(f"{self.address}/{param}", val)
21
+ self._remote.send(f'{self.address}/{param}', val)
22
22
 
23
23
  @abc.abstractmethod
24
24
  def address(self):
@@ -36,37 +36,37 @@ class Config(IConfig):
36
36
  Returns a Config class of a kind.
37
37
  """
38
38
  LINKS_cls = _make_links_mixins[remote.kind.id_]
39
- MUTEGROUP_cls = type("MuteGroup", (Config.MuteGroup, cls), {})
40
- MONITOR_cls = type("ConfigMonitor", (Config.Monitor, cls), {})
39
+ MUTEGROUP_cls = type('MuteGroup', (Config.MuteGroup, cls), {})
40
+ MONITOR_cls = type('ConfigMonitor', (Config.Monitor, cls), {})
41
41
  CONFIG_cls = type(
42
- f"Config{remote.kind}",
42
+ f'Config{remote.kind}',
43
43
  (cls, LINKS_cls),
44
44
  {
45
- "mute_group": tuple(MUTEGROUP_cls(remote, i) for i in range(4)),
46
- "monitor": MONITOR_cls(remote),
45
+ 'mute_group': tuple(MUTEGROUP_cls(remote, i) for i in range(4)),
46
+ 'monitor': MONITOR_cls(remote),
47
47
  },
48
48
  )
49
49
  return CONFIG_cls(remote)
50
50
 
51
51
  @property
52
52
  def address(self) -> str:
53
- return "/config"
53
+ return '/config'
54
54
 
55
55
  @property
56
56
  def amixenable(self) -> bool:
57
- return self.getter("mute")[0] == 1
57
+ return self.getter('mute')[0] == 1
58
58
 
59
59
  @amixenable.setter
60
60
  def amixenable(self, val: bool):
61
- self.setter("amixenable", 1 if val else 0)
61
+ self.setter('amixenable', 1 if val else 0)
62
62
 
63
63
  @property
64
64
  def amixlock(self) -> bool:
65
- return self.getter("amixlock")[0] == 1
65
+ return self.getter('amixlock')[0] == 1
66
66
 
67
67
  @amixlock.setter
68
68
  def amixlock(self, val: bool):
69
- self.setter("amixlock", 1 if val else 0)
69
+ self.setter('amixlock', 1 if val else 0)
70
70
 
71
71
  class MuteGroup:
72
72
  def __init__(self, remote, i):
@@ -76,128 +76,128 @@ class Config(IConfig):
76
76
  @property
77
77
  def address(self) -> str:
78
78
  root = super(Config.MuteGroup, self).address
79
- return f"{root}/mute"
79
+ return f'{root}/mute'
80
80
 
81
81
  @property
82
82
  def on(self) -> bool:
83
- return self.getter(f"{self.i}")[0] == 1
83
+ return self.getter(f'{self.i}')[0] == 1
84
84
 
85
85
  @on.setter
86
86
  def on(self, val: bool):
87
- self.setter(f"{self.i}", 1 if val else 0)
87
+ self.setter(f'{self.i}', 1 if val else 0)
88
88
 
89
89
  class Monitor:
90
90
  @property
91
91
  def address(self) -> str:
92
92
  root = super(Config.Monitor, self).address
93
- return f"{root}/solo"
93
+ return f'{root}/solo'
94
94
 
95
95
  @property
96
96
  @util.db_from
97
97
  def level(self) -> float:
98
- return self.getter("level")[0]
98
+ return self.getter('level')[0]
99
99
 
100
100
  @level.setter
101
101
  @util.db_to
102
102
  def level(self, val: float):
103
- self.setter("level", val)
103
+ self.setter('level', val)
104
104
 
105
105
  @property
106
106
  def source(self) -> int:
107
- return int(self.getter("source")[0])
107
+ return int(self.getter('source')[0])
108
108
 
109
109
  @source.setter
110
110
  def source(self, val: int):
111
- self.setter("source", val)
111
+ self.setter('source', val)
112
112
 
113
113
  @property
114
114
  def sourcetrim(self) -> float:
115
- return round(util.lin_get(-18, 18, self.getter("sourcetrim")[0]), 1)
115
+ return round(util.lin_get(-18, 18, self.getter('sourcetrim')[0]), 1)
116
116
 
117
117
  @sourcetrim.setter
118
118
  def sourcetrim(self, val: float):
119
119
  if not -18 <= val <= 18:
120
120
  self.logger.warning(
121
- f"sourcetrim got {val}, expected value in range -18.0 to 18.0"
121
+ f'sourcetrim got {val}, expected value in range -18.0 to 18.0'
122
122
  )
123
- self.setter("sourcetrim", util.lin_set(-18, 18, val))
123
+ self.setter('sourcetrim', util.lin_set(-18, 18, val))
124
124
 
125
125
  @property
126
126
  def chmode(self) -> bool:
127
- return self.getter("chmode")[0] == 1
127
+ return self.getter('chmode')[0] == 1
128
128
 
129
129
  @chmode.setter
130
130
  def chmode(self, val: bool):
131
- self.setter("chmode", 1 if val else 0)
131
+ self.setter('chmode', 1 if val else 0)
132
132
 
133
133
  @property
134
134
  def busmode(self) -> bool:
135
- return self.getter("busmode")[0] == 1
135
+ return self.getter('busmode')[0] == 1
136
136
 
137
137
  @busmode.setter
138
138
  def busmode(self, val: bool):
139
- self.setter("busmode", 1 if val else 0)
139
+ self.setter('busmode', 1 if val else 0)
140
140
 
141
141
  @property
142
142
  def dimgain(self) -> int:
143
- return int(util.lin_get(-40, 0, self.getter("dimatt")[0]))
143
+ return int(util.lin_get(-40, 0, self.getter('dimatt')[0]))
144
144
 
145
145
  @dimgain.setter
146
146
  def dimgain(self, val: int):
147
147
  if not -40 <= val <= 0:
148
148
  self.logger.warning(
149
- f"dimgain got {val}, expected value in range -40 to 0"
149
+ f'dimgain got {val}, expected value in range -40 to 0'
150
150
  )
151
- self.setter("dimatt", util.lin_set(-40, 0, val))
151
+ self.setter('dimatt', util.lin_set(-40, 0, val))
152
152
 
153
153
  @property
154
154
  def dim(self) -> bool:
155
- return self.getter("dim")[0] == 1
155
+ return self.getter('dim')[0] == 1
156
156
 
157
157
  @dim.setter
158
158
  def dim(self, val: bool):
159
- self.setter("dim", 1 if val else 0)
159
+ self.setter('dim', 1 if val else 0)
160
160
 
161
161
  @property
162
162
  def mono(self) -> bool:
163
- return self.getter("mono")[0] == 1
163
+ return self.getter('mono')[0] == 1
164
164
 
165
165
  @mono.setter
166
166
  def mono(self, val: bool):
167
- self.setter("mono", 1 if val else 0)
167
+ self.setter('mono', 1 if val else 0)
168
168
 
169
169
  @property
170
170
  def mute(self) -> bool:
171
- return self.getter("mute")[0] == 1
171
+ return self.getter('mute')[0] == 1
172
172
 
173
173
  @mute.setter
174
174
  def mute(self, val: bool):
175
- self.setter("mute", 1 if val else 0)
175
+ self.setter('mute', 1 if val else 0)
176
176
 
177
177
  @property
178
178
  def dimfpl(self) -> bool:
179
- return self.getter("dimfpl")[0] == 1
179
+ return self.getter('dimfpl')[0] == 1
180
180
 
181
181
  @dimfpl.setter
182
182
  def dimfpl(self, val: bool):
183
- self.setter("dimfpl", 1 if val else 0)
183
+ self.setter('dimfpl', 1 if val else 0)
184
184
 
185
185
 
186
186
  def _make_links_mixin(kind):
187
187
  """Creates a links mixin"""
188
188
  return type(
189
- f"Links{kind}",
189
+ f'Links{kind}',
190
190
  (),
191
191
  {
192
- "link_eq": bool_prop("linkcfg/eq"),
193
- "link_dyn": bool_prop("linkcfg/dyn"),
194
- "link_fader_mute": bool_prop("linkcfg/fdrmute"),
192
+ 'link_eq': bool_prop('linkcfg/eq'),
193
+ 'link_dyn': bool_prop('linkcfg/dyn'),
194
+ 'link_fader_mute': bool_prop('linkcfg/fdrmute'),
195
195
  **{
196
- f"chlink{i}_{i+1}": bool_prop(f"chlink/{i}-{i+1}")
196
+ f'chlink{i}_{i+1}': bool_prop(f'chlink/{i}-{i+1}')
197
197
  for i in range(1, kind.num_strip, 2)
198
198
  },
199
199
  **{
200
- f"buslink{i}_{i+1}": bool_prop(f"buslink/{i}-{i+1}")
200
+ f'buslink{i}_{i+1}': bool_prop(f'buslink/{i}-{i+1}')
201
201
  for i in range(1, kind.num_bus, 2)
202
202
  },
203
203
  },
xair_api/dca.py CHANGED
@@ -13,10 +13,10 @@ class IDCA(abc.ABC):
13
13
  self.logger = logger.getChild(self.__class__.__name__)
14
14
 
15
15
  def getter(self, param: str) -> tuple:
16
- return self._remote.query(f"{self.address}/{param}")
16
+ return self._remote.query(f'{self.address}/{param}')
17
17
 
18
18
  def setter(self, param: str, val: int):
19
- self._remote.send(f"{self.address}/{param}", val)
19
+ self._remote.send(f'{self.address}/{param}', val)
20
20
 
21
21
  @abc.abstractmethod
22
22
  def address(self):
@@ -28,15 +28,15 @@ class DCA(IDCA):
28
28
 
29
29
  @property
30
30
  def address(self) -> str:
31
- return f"/dca/{self.index}"
31
+ return f'/dca/{self.index}'
32
32
 
33
33
  @property
34
34
  def on(self) -> bool:
35
- return self.getter("on")[0] == 1
35
+ return self.getter('on')[0] == 1
36
36
 
37
37
  @on.setter
38
38
  def on(self, val: bool):
39
- self.setter("on", 1 if val else 0)
39
+ self.setter('on', 1 if val else 0)
40
40
 
41
41
  @property
42
42
  def mute(self) -> bool:
@@ -48,16 +48,16 @@ class DCA(IDCA):
48
48
 
49
49
  @property
50
50
  def name(self) -> str:
51
- return self.getter("config/name")[0]
51
+ return self.getter('config/name')[0]
52
52
 
53
53
  @name.setter
54
54
  def name(self, val: str):
55
- self.setter("config/name", val)
55
+ self.setter('config/name', val)
56
56
 
57
57
  @property
58
58
  def color(self) -> int:
59
- return self.getter("config/color")[0]
59
+ return self.getter('config/color')[0]
60
60
 
61
61
  @color.setter
62
62
  def color(self, val: int):
63
- self.setter("config/color", val)
63
+ self.setter('config/color', val)
xair_api/errors.py CHANGED
@@ -10,5 +10,5 @@ class XAirRemoteConnectionTimeoutError(XAirRemoteError):
10
10
  self.port = port
11
11
 
12
12
  super().__init__(
13
- f"Timeout attempting to connect to mixer at {self.ip}:{self.port}"
13
+ f'Timeout attempting to connect to mixer at {self.ip}:{self.port}'
14
14
  )
xair_api/fx.py CHANGED
@@ -16,10 +16,10 @@ class IFX(abc.ABC):
16
16
  self.logger = logger.getChild(self.__class__.__name__)
17
17
 
18
18
  def getter(self, param: str):
19
- return self._remote.query(f"{self.address}/{param}")
19
+ return self._remote.query(f'{self.address}/{param}')
20
20
 
21
21
  def setter(self, param: str, val: int):
22
- self._remote.send(f"{self.address}/{param}", val)
22
+ self._remote.send(f'{self.address}/{param}', val)
23
23
 
24
24
  @abc.abstractmethod
25
25
  def address(self):
@@ -31,15 +31,15 @@ class FX(IFX):
31
31
 
32
32
  @property
33
33
  def address(self) -> str:
34
- return f"/fx/{self.index}"
34
+ return f'/fx/{self.index}'
35
35
 
36
36
  @property
37
37
  def type(self) -> int:
38
- return self.getter("type")[0]
38
+ return self.getter('type')[0]
39
39
 
40
40
  @type.setter
41
41
  def type(self, val: int):
42
- self.setter("type", val)
42
+ self.setter('type', val)
43
43
 
44
44
 
45
45
  class FXSend(IFX):
@@ -55,20 +55,20 @@ class FXSend(IFX):
55
55
  Returns an FXSend class of a kind.
56
56
  """
57
57
  FXSEND_cls = type(
58
- f"FXSend{remote.kind}",
58
+ f'FXSend{remote.kind}',
59
59
  (cls,),
60
60
  {
61
61
  **{
62
62
  _cls.__name__.lower(): type(
63
- f"{_cls.__name__}{remote.kind}", (_cls, cls), {}
63
+ f'{_cls.__name__}{remote.kind}', (_cls, cls), {}
64
64
  )(remote, index)
65
65
  for _cls in (Config, Mix, Group)
66
66
  },
67
- "mute": mute_prop(),
67
+ 'mute': mute_prop(),
68
68
  },
69
69
  )
70
70
  return FXSEND_cls(remote, index)
71
71
 
72
72
  @property
73
73
  def address(self) -> str:
74
- return f"/fxsend/{self.index}"
74
+ return f'/fxsend/{self.index}'
xair_api/headamp.py ADDED
@@ -0,0 +1,49 @@
1
+ import abc
2
+ import logging
3
+
4
+ from . import util
5
+
6
+ logger = logging.getLogger(__name__)
7
+
8
+
9
+ class IHeadAmp(abc.ABC):
10
+ """Abstract Base Class for headamps"""
11
+
12
+ def __init__(self, remote, index: int):
13
+ self._remote = remote
14
+ self.index = index + 1
15
+ self.logger = logger.getChild(self.__class__.__name__)
16
+
17
+ def getter(self, param: str):
18
+ return self._remote.query(f'{self.address}/{param}')
19
+
20
+ def setter(self, param: str, val: int):
21
+ self._remote.send(f'{self.address}/{param}', val)
22
+
23
+ @abc.abstractmethod
24
+ def address(self):
25
+ pass
26
+
27
+
28
+ class HeadAmp(IHeadAmp):
29
+ """Concrete class for headamps"""
30
+
31
+ @property
32
+ def address(self):
33
+ return f'/headamp/{str(self.index).zfill(2)}'
34
+
35
+ @property
36
+ def gain(self):
37
+ return round(util.lin_get(-12, 60, self.getter('gain')[0]), 1)
38
+
39
+ @gain.setter
40
+ def gain(self, val):
41
+ self.setter('gain', util.lin_set(-12, 60, val))
42
+
43
+ @property
44
+ def phantom(self):
45
+ return self.getter('phantom')[0] == 1
46
+
47
+ @phantom.setter
48
+ def phantom(self, val):
49
+ self.setter('phantom', 1 if val else 0)
xair_api/kinds.py CHANGED
@@ -1,45 +1,44 @@
1
1
  from dataclasses import dataclass
2
2
 
3
3
 
4
- @dataclass
4
+ @dataclass(frozen=True)
5
5
  class KindMap:
6
+ id_: str
7
+
6
8
  def __str__(self) -> str:
7
9
  return self.id_
8
10
 
9
11
 
10
- @dataclass
12
+ @dataclass(frozen=True)
11
13
  class X32KindMap(KindMap):
12
- id_: str
13
14
  num_dca: int = 8
14
15
  num_strip: int = 32
15
16
  num_bus: int = 16
16
17
  num_fx: int = 8
17
18
  num_auxrtn: int = 8
18
19
  num_matrix: int = 6
20
+ num_headamp: int = 127
19
21
 
20
22
 
21
- @dataclass
23
+ @dataclass(frozen=True)
22
24
  class XR18KindMap(KindMap):
23
25
  # note ch 17-18 defined as aux return
24
- id_: str
25
26
  num_dca: int = 4
26
27
  num_strip: int = 16
27
28
  num_bus: int = 6
28
29
  num_fx: int = 4
29
30
 
30
31
 
31
- @dataclass
32
+ @dataclass(frozen=True)
32
33
  class XR16KindMap(KindMap):
33
- id_: str
34
34
  num_dca: int = 4
35
35
  num_strip: int = 16
36
36
  num_bus: int = 4
37
37
  num_fx: int = 4
38
38
 
39
39
 
40
- @dataclass
40
+ @dataclass(frozen=True)
41
41
  class XR12KindMap(KindMap):
42
- id_: str
43
42
  num_dca: int = 4
44
43
  num_strip: int = 12
45
44
  num_bus: int = 2
@@ -47,11 +46,11 @@ class XR12KindMap(KindMap):
47
46
 
48
47
 
49
48
  _kinds = {
50
- "X32": X32KindMap(id_="X32"),
51
- "MR18": XR18KindMap(id_="MR18"),
52
- "XR18": XR18KindMap(id_="XR18"),
53
- "XR16": XR16KindMap(id_="XR16"),
54
- "XR12": XR12KindMap(id_="XR12"),
49
+ 'X32': X32KindMap(id_='X32'),
50
+ 'MR18': XR18KindMap(id_='MR18'),
51
+ 'XR18': XR18KindMap(id_='XR18'),
52
+ 'XR16': XR16KindMap(id_='XR16'),
53
+ 'XR12': XR12KindMap(id_='XR12'),
55
54
  }
56
55
 
57
56
 
@@ -59,4 +58,4 @@ def get(kind_id):
59
58
  return _kinds[kind_id]
60
59
 
61
60
 
62
- all = list(kind for kind in _kinds.values())
61
+ all = list(_kinds.values())
xair_api/lr.py CHANGED
@@ -18,10 +18,10 @@ class ILR(abc.ABC):
18
18
  self.logger = logger.getChild(self.__class__.__name__)
19
19
 
20
20
  def getter(self, param: str):
21
- return self._remote.query(f"{self.address}/{param}")
21
+ return self._remote.query(f'{self.address}/{param}')
22
22
 
23
23
  def setter(self, param: str, val: int):
24
- self._remote.send(f"{self.address}/{param}", val)
24
+ self._remote.send(f'{self.address}/{param}', val)
25
25
 
26
26
  @abc.abstractmethod
27
27
  def address(self):
@@ -41,12 +41,12 @@ class LR(ILR):
41
41
  Returns an LR class of a kind.
42
42
  """
43
43
  LR_cls = type(
44
- f"LR{remote.kind}",
44
+ f'LR{remote.kind}',
45
45
  (cls,),
46
46
  {
47
47
  **{
48
48
  _cls.__name__.lower(): type(
49
- f"{_cls.__name__}{remote.kind}", (_cls, cls), {}
49
+ f'{_cls.__name__}{remote.kind}', (_cls, cls), {}
50
50
  )(remote, index)
51
51
  for _cls in (
52
52
  Config,
@@ -57,11 +57,11 @@ class LR(ILR):
57
57
  Mix,
58
58
  )
59
59
  },
60
- "mute": mute_prop(),
60
+ 'mute': mute_prop(),
61
61
  },
62
62
  )
63
63
  return LR_cls(remote, index)
64
64
 
65
65
  @property
66
66
  def address(self) -> str:
67
- return "/lr"
67
+ return '/lr'
xair_api/meta.py CHANGED
@@ -50,7 +50,7 @@ def float_prop(param):
50
50
 
51
51
 
52
52
  def geq_prop(param):
53
- param = param.replace("_", ".")
53
+ param = param.replace('_', '.')
54
54
 
55
55
  def fget(self) -> float:
56
56
  return round(lin_get(-15, 15, self.getter(param)[0]), 1)
@@ -58,7 +58,7 @@ def geq_prop(param):
58
58
  def fset(self, val):
59
59
  if not -15 <= val <= 15:
60
60
  self.logger.warning(
61
- f"slider_{param} got {val}, expected value in range -15.0 to 15.0"
61
+ f'slider_{param} got {val}, expected value in range -15.0 to 15.0'
62
62
  )
63
63
  self.setter(param, lin_set(-15, 15, val))
64
64