from abc import abstractmethod from typing import Union from .iremote import IRemote class Adapter(IRemote): """Adapter to the common interface.""" @abstractmethod def ins(self): pass @abstractmethod def outs(self): pass @abstractmethod def input(self): pass @abstractmethod def output(self): pass def identifier(self): pass def getter(self, index: int = None, direction: str = None) -> Union[int, dict]: if index is None: return self._remote.get_num_devices(direction) vals = self._remote.get_device_description(index, direction) types = {1: "mme", 3: "wdm", 4: "ks", 5: "asio"} return {"name": vals[0], "type": types[vals[1]], "id": vals[2]} class Device(Adapter): """Defines concrete implementation for device""" @classmethod def make(cls, remote): """ Factory function for device. Returns a Device class of a kind. """ def num_ins(cls) -> int: return cls.getter(direction="in") def num_outs(cls) -> int: return cls.getter(direction="out") DEVICE_cls = type( f"Device{remote.kind}", (cls,), { "ins": property(num_ins), "outs": property(num_outs), }, ) return DEVICE_cls(remote) def __str__(self): return f"{type(self).__name__}" def input(self, index: int) -> dict: return self.getter(index=index, direction="in") def output(self, index: int) -> dict: return self.getter(index=index, direction="out")