48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
import socket
|
|
import subprocess
|
|
import os
|
|
import threading
|
|
import time
|
|
|
|
BIN_PATH = "/opt/md380-emu/md380-emu"
|
|
SHM_DIR = "/dev/shm"
|
|
|
|
def gestisci_emulatore(porta):
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
sock.bind(('127.0.0.1', porta))
|
|
print(f"[*] Vocoder attivo in ascolto sulla porta UDP {porta}")
|
|
|
|
while True:
|
|
try:
|
|
data, addr = sock.recvfrom(1024)
|
|
if not data: continue
|
|
|
|
# Percorsi file univoci per ogni porta direttamente nella RAM
|
|
f_in = f"{SHM_DIR}/in_{porta}.bin"
|
|
f_out = f"{SHM_DIR}/out_{porta}.bin"
|
|
|
|
with open(f_in, "wb") as f:
|
|
f.write(data)
|
|
|
|
# Se riceviamo 7 byte, è AMBE da decodificare in PCM. Altrimenti è PCM da codificare.
|
|
if len(data) == 7 or len(data) == 9:
|
|
subprocess.run([BIN_PATH, "-d", "-i", f_in, "-o", f_out], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
else:
|
|
subprocess.run([BIN_PATH, "-e", "-i", f_in, "-o", f_out], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
|
|
if os.path.exists(f_out):
|
|
with open(f_out, "rb") as f:
|
|
sock.sendto(f.read(), addr)
|
|
except Exception:
|
|
pass
|
|
|
|
# Avviamo 3 vocoder indipendenti in background
|
|
for p in [2470, 2471, 2472]:
|
|
threading.Thread(target=gestisci_emulatore, args=(p,), daemon=True).start()
|
|
|
|
try:
|
|
while True:
|
|
time.sleep(1)
|
|
except KeyboardInterrupt:
|
|
print("Chiusura del pool...")
|