|
import socket |
|
from rich.console import Console |
|
import logging |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
console = Console() |
|
|
|
|
|
class SocketReceiver: |
|
""" |
|
Handles reception of the audio packets from the client. |
|
""" |
|
|
|
def __init__( |
|
self, |
|
stop_event, |
|
queue_out, |
|
should_listen, |
|
host="0.0.0.0", |
|
port=12345, |
|
chunk_size=1024, |
|
): |
|
self.stop_event = stop_event |
|
self.queue_out = queue_out |
|
self.should_listen = should_listen |
|
self.chunk_size = chunk_size |
|
self.host = host |
|
self.port = port |
|
|
|
def receive_full_chunk(self, conn, chunk_size): |
|
data = b"" |
|
while len(data) < chunk_size: |
|
packet = conn.recv(chunk_size - len(data)) |
|
if not packet: |
|
|
|
return None |
|
data += packet |
|
return data |
|
|
|
def run(self): |
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
|
self.socket.bind((self.host, self.port)) |
|
self.socket.listen(1) |
|
logger.info("Receiver waiting to be connected...") |
|
self.conn, _ = self.socket.accept() |
|
logger.info("receiver connected") |
|
|
|
self.should_listen.set() |
|
while not self.stop_event.is_set(): |
|
audio_chunk = self.receive_full_chunk(self.conn, self.chunk_size) |
|
if audio_chunk is None: |
|
|
|
self.queue_out.put(b"END") |
|
break |
|
if self.should_listen.is_set(): |
|
self.queue_out.put(audio_chunk) |
|
self.conn.close() |
|
logger.info("Receiver closed") |
|
|