diff --git a/pyproject.toml b/pyproject.toml index 8448986..e8fd923 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vban-cmd" -version = "1.4.2" +version = "1.4.3" description = "Python interface for the VBAN RT Packet Service (Sendtext)" authors = ["onyx-and-iris "] license = "MIT" diff --git a/vban_cmd/worker.py b/vban_cmd/worker.py index 29e2ea4..e4030e8 100644 --- a/vban_cmd/worker.py +++ b/vban_cmd/worker.py @@ -41,6 +41,7 @@ class Updater(threading.Thread): def __init__(self, remote): super().__init__(name="updater", target=self.update, daemon=True) self._remote = remote + self._remote.socks[Socket.response].settimeout(5) self._remote.socks[Socket.response].bind( (socket.gethostbyname(socket.gethostname()), self._remote.port) ) @@ -48,35 +49,40 @@ class Updater(threading.Thread): self._remote._public_packet = self._get_rt() def _fetch_rt_packet(self) -> Optional[VbanRtPacket]: - data, _ = self._remote.socks[Socket.response].recvfrom(2048) - # check for packet data - if len(data) > HEADER_SIZE: - # check if packet is of type rt packet response - if self.packet_expected.header == data[: HEADER_SIZE - 4]: - return VbanRtPacket( - _voicemeeterType=data[28:29], - _reserved=data[29:30], - _buffersize=data[30:32], - _voicemeeterVersion=data[32:36], - _optionBits=data[36:40], - _samplerate=data[40:44], - _inputLeveldB100=data[44:112], - _outputLeveldB100=data[112:240], - _TransportBit=data[240:244], - _stripState=data[244:276], - _busState=data[276:308], - _stripGaindB100Layer1=data[308:324], - _stripGaindB100Layer2=data[324:340], - _stripGaindB100Layer3=data[340:356], - _stripGaindB100Layer4=data[356:372], - _stripGaindB100Layer5=data[372:388], - _stripGaindB100Layer6=data[388:404], - _stripGaindB100Layer7=data[404:420], - _stripGaindB100Layer8=data[420:436], - _busGaindB100=data[436:452], - _stripLabelUTF8c60=data[452:932], - _busLabelUTF8c60=data[932:1412], - ) + try: + data, _ = self._remote.socks[Socket.response].recvfrom(2048) + # check for packet data + if len(data) > HEADER_SIZE: + # check if packet is of type rt packet response + if self.packet_expected.header == data[: HEADER_SIZE - 4]: + return VbanRtPacket( + _voicemeeterType=data[28:29], + _reserved=data[29:30], + _buffersize=data[30:32], + _voicemeeterVersion=data[32:36], + _optionBits=data[36:40], + _samplerate=data[40:44], + _inputLeveldB100=data[44:112], + _outputLeveldB100=data[112:240], + _TransportBit=data[240:244], + _stripState=data[244:276], + _busState=data[276:308], + _stripGaindB100Layer1=data[308:324], + _stripGaindB100Layer2=data[324:340], + _stripGaindB100Layer3=data[340:356], + _stripGaindB100Layer4=data[356:372], + _stripGaindB100Layer5=data[372:388], + _stripGaindB100Layer6=data[388:404], + _stripGaindB100Layer7=data[404:420], + _stripGaindB100Layer8=data[420:436], + _busGaindB100=data[436:452], + _stripLabelUTF8c60=data[452:932], + _busLabelUTF8c60=data[932:1412], + ) + except TimeoutError as e: + print(f"Unable to establish connection with {self._remote.ip}") + [sock.close() for sock in self._remote.socks] + raise e def _get_rt(self) -> VbanRtPacket: """Attempt to fetch data packet until a valid one found"""