def _change_replay_speed(self, offs: int) -> None: if not self._replay_speed_text: if ba.do_once(): print('_change_replay_speed called without widget') return _ba.set_replay_speed_exponent(_ba.get_replay_speed_exponent() + offs) actual_speed = pow(2.0, _ba.get_replay_speed_exponent()) ba.textwidget(edit=self._replay_speed_text, text=ba.Lstr(resource='watchWindow.playbackSpeedText', subs=[('${SPEED}', str(actual_speed))]))
def run(self) -> None: # pylint: disable=too-many-branches # pylint: disable=too-many-statements ba.app.ping_thread_count += 1 sock: Optional[socket.socket] = None try: import socket from ba.internal import get_ip_address_type socket_type = get_ip_address_type(self._address) sock = socket.socket(socket_type, socket.SOCK_DGRAM) sock.connect((self._address, self._port)) accessible = False starttime = time.time() # Send a few pings and wait a second for # a response. sock.settimeout(1) for _i in range(3): sock.send(b'\x0b') result: Optional[bytes] try: # 11: BA_PACKET_SIMPLE_PING result = sock.recv(10) except Exception: result = None if result == b'\x0c': # 12: BA_PACKET_SIMPLE_PONG accessible = True break time.sleep(1) ping = (time.time() - starttime) * 1000.0 ba.pushcall(ba.Call(self._call, self._address, self._port, ping if accessible else None), from_other_thread=True) except ConnectionRefusedError: # Fine, server; sorry we pinged you. Hmph. pass except OSError as exc: import errno # Ignore harmless errors. if exc.errno in { errno.EHOSTUNREACH, errno.ENETUNREACH, errno.EINVAL, errno.EPERM, errno.EACCES }: pass elif exc.errno == 10022: # Windows 'invalid argument' error. pass elif exc.errno == 10051: # Windows 'a socket operation was attempted # to an unreachable network' error. pass elif exc.errno == errno.EADDRNOTAVAIL: if self._port == 0: # This has happened. Ignore. pass elif ba.do_once(): print(f'Got EADDRNOTAVAIL on gather ping' f' for addr {self._address}' f' port {self._port}.') else: ba.print_exception( f'Error on gather ping ' f'(errno={exc.errno})', once=True) except Exception: ba.print_exception('Error on gather ping', once=True) finally: try: if sock is not None: sock.close() except Exception: ba.print_exception('Error on gather ping cleanup', once=True) ba.app.ping_thread_count -= 1