mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
possible fix for #132
it seems, pyaudio isnt terminated correctly. running it within a subprocess which will be closed after execution, pyaudio seems to be terminated and not causing a problem anymore on raspberry pi. Yay
This commit is contained in:
parent
7a93f0a824
commit
efc700b1f7
16
tnc/audio.py
16
tnc/audio.py
|
@ -10,6 +10,10 @@ import json
|
|||
from ctypes import *
|
||||
from contextlib import contextmanager
|
||||
import pyaudio
|
||||
from multiprocessing import Process, Queue
|
||||
AUDIO_DEVICES = Queue()
|
||||
|
||||
|
||||
|
||||
ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p)
|
||||
|
||||
|
@ -29,8 +33,13 @@ def noalsaerr():
|
|||
# p = pyaudio.PyAudio()
|
||||
######################################################
|
||||
|
||||
|
||||
def get_audio_devices():
|
||||
p = Process(target=update_audio_devices)
|
||||
p.start()
|
||||
p.join()
|
||||
return AUDIO_DEVICES.get()
|
||||
|
||||
def update_audio_devices():
|
||||
# UPDATE LIST OF AUDIO DEVICES
|
||||
try:
|
||||
# we need to "try" this, because sometimes libasound.so isn't in the default place
|
||||
|
@ -61,5 +70,6 @@ def get_audio_devices():
|
|||
output_devices.append({"id": i, "name": str(name)})
|
||||
|
||||
p.terminate()
|
||||
|
||||
return [input_devices, output_devices]
|
||||
AUDIO_DEVICES.put([input_devices, output_devices])
|
||||
|
||||
|
||||
|
|
34
tnc/sock.py
34
tnc/sock.py
|
@ -78,17 +78,15 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
|
|||
data = SOCKET_QUEUE.get()
|
||||
sock_data = bytes(data, 'utf-8')
|
||||
sock_data += b'\n' # append line limiter
|
||||
|
||||
# send data to all clients
|
||||
try:
|
||||
for client in CONNECTED_CLIENTS:
|
||||
try:
|
||||
client.send(sock_data)
|
||||
except:
|
||||
print("connection lost...")
|
||||
CONNECTED_CLIENTS.remove(self.request)
|
||||
except:
|
||||
print("client not anymore in client list")
|
||||
|
||||
#try:
|
||||
for client in CONNECTED_CLIENTS:
|
||||
try:
|
||||
client.send(sock_data)
|
||||
except:
|
||||
print("connection lost...")
|
||||
|
||||
# we want to transmit scatter data only once to reduce network traffic
|
||||
static.SCATTER = []
|
||||
# we want to display INFO messages only once
|
||||
|
@ -106,8 +104,8 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
|
|||
if chunk == b'':
|
||||
#print("connection broken. Closing...")
|
||||
self.connection_alive = False
|
||||
|
||||
if data.startswith(b'{') and data.endswith(b'}\n'):
|
||||
print(chunk)
|
||||
if data.startswith(b'{') and data.endswith(b'}\n'):
|
||||
# split data by \n if we have multiple commands in socket buffer
|
||||
data = data.split(b'\n')
|
||||
# remove empty data
|
||||
|
@ -119,7 +117,15 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
|
|||
process_tnc_commands(commands)
|
||||
else:
|
||||
process_daemon_commands(commands)
|
||||
|
||||
|
||||
# wait some time between processing multiple commands
|
||||
# this is only a first test to avoid doubled transmission
|
||||
# we might improve this by only processing one command or
|
||||
# doing some kind of selection to determin which commands need to be dropped
|
||||
# and which one can be processed during a running transmission
|
||||
time.sleep(3)
|
||||
|
||||
|
||||
# finally delete our rx buffer to be ready for new commands
|
||||
data = bytes()
|
||||
except Exception as e:
|
||||
|
@ -438,4 +444,4 @@ def send_daemon_state():
|
|||
return jsondata
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return None
|
||||
return None
|
||||
|
|
Loading…
Reference in a new issue