socket_receiver.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import socket
  2. from rich.console import Console
  3. import logging
  4. logger = logging.getLogger(__name__)
  5. console = Console()
  6. class SocketReceiver:
  7. """
  8. Handles reception of the audio packets from the client.
  9. """
  10. def __init__(
  11. self,
  12. stop_event,
  13. queue_out,
  14. should_listen,
  15. host="0.0.0.0",
  16. port=12345,
  17. chunk_size=1024,
  18. ):
  19. self.stop_event = stop_event
  20. self.queue_out = queue_out
  21. self.should_listen = should_listen
  22. self.chunk_size = chunk_size
  23. self.host = host
  24. self.port = port
  25. def receive_full_chunk(self, conn, chunk_size):
  26. data = b""
  27. while len(data) < chunk_size:
  28. packet = conn.recv(chunk_size - len(data))
  29. if not packet:
  30. # connection closed
  31. return None
  32. data += packet
  33. return data
  34. def run(self):
  35. self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  36. self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  37. self.socket.bind((self.host, self.port))
  38. self.socket.listen(1)
  39. logger.info("Receiver waiting to be connected...")
  40. self.conn, _ = self.socket.accept()
  41. logger.info("receiver connected")
  42. self.should_listen.set()
  43. while not self.stop_event.is_set():
  44. audio_chunk = self.receive_full_chunk(self.conn, self.chunk_size)
  45. if audio_chunk is None:
  46. # connection closed
  47. self.queue_out.put(b"END")
  48. break
  49. if self.should_listen.is_set():
  50. self.queue_out.put(audio_chunk)
  51. self.conn.close()
  52. logger.info("Receiver closed")