import logging from .audio import Audio from .obsws import OBSWS from .scene import Scene from .states import StreamState from .streamlabs import StreamlabsController logger = logging.getLogger(__name__) class DuckyPad: """base DuckyPad class""" def __init__(self, **kwargs): self.logger = logger.getChild(__class__.__name__) for attr, val in kwargs.items(): setattr(self, attr, val) self.stream = StreamState() self.audio = Audio(self, vm=self.vm, mixer=self.mixer) self.scene = Scene(self, vm=self.vm) self.obsws = OBSWS(self) self.streamlabs_controller = StreamlabsController(self) def __enter__(self): return self def __exit__(self, exc_value, exc_type, traceback): self.streamlabs_controller.conn.disconnect() def reset(self): ''' apply streaming config, then apply current scene settings if stream is live enable both mics over vban ''' self.vm.apply_config("streaming") self.audio.reset_states() if self.stream.current_scene: self.logger.debug( f"Running function for current scene {self.stream.current_scene}" ) fn = getattr( self.scene, "_".join([word.lower() for word in self.stream.current_scene.split()]), ) fn() if self.stream.is_live: self.logger.debug("stream is live, enabling both mics over vban") self.vm.vban.outstream[0].on = True self.vm.vban.outstream[1].on = True else: self.logger.debug( "stream is not live. Leaving both vban outstreams disabled" ) def connect(*args, **kwargs): DuckyPad_cls = DuckyPad return DuckyPad_cls(*args, **kwargs)