adjusted server shutdown and transmitting state

This commit is contained in:
DJ2LS 2024-03-15 09:45:51 +01:00
parent 787cb2d862
commit 41d9642eb1
3 changed files with 14 additions and 11 deletions

View file

@ -1,16 +1,12 @@
""" """
Gather information about audio devices. Gather information about audio devices.
""" """
import atexit
import multiprocessing import multiprocessing
import crcengine import crcengine
import sounddevice as sd import sounddevice as sd
import structlog import structlog
import numpy as np import numpy as np
import queue import queue
import threading
atexit.register(sd._terminate)
log = structlog.get_logger("audio") log = structlog.get_logger("audio")

View file

@ -9,7 +9,6 @@ Created on Wed Dec 23 07:04:24 2020
# pylint: disable=invalid-name, line-too-long, c-extension-no-member # pylint: disable=invalid-name, line-too-long, c-extension-no-member
# pylint: disable=import-outside-toplevel # pylint: disable=import-outside-toplevel
import atexit
import queue import queue
import time import time
import codec2 import codec2
@ -56,6 +55,7 @@ class RF:
self.ptt_state = False self.ptt_state = False
self.enqueuing_audio = False # set to True, while we are processing audio
self.AUDIO_SAMPLE_RATE = 48000 self.AUDIO_SAMPLE_RATE = 48000
self.modem_sample_rate = codec2.api.FREEDV_FS_8000 self.modem_sample_rate = codec2.api.FREEDV_FS_8000
@ -104,9 +104,6 @@ class RF:
if not self.init_audio(): if not self.init_audio():
raise RuntimeError("Unable to init audio devices") raise RuntimeError("Unable to init audio devices")
self.demodulator.start(self.sd_input_stream) self.demodulator.start(self.sd_input_stream)
atexit.register(self.sd_input_stream.stop)
return True return True
@ -247,6 +244,8 @@ class RF:
def enqueue_audio_out(self, audio_48k) -> None: def enqueue_audio_out(self, audio_48k) -> None:
self.enqueuing_audio = True
if not self.states.isTransmitting(): if not self.states.isTransmitting():
self.states.setTransmitting(True) self.states.setTransmitting(True)
@ -267,6 +266,7 @@ class RF:
for block in sliced_audio_data: for block in sliced_audio_data:
self.audio_out_queue.put(block) self.audio_out_queue.put(block)
self.enqueuing_audio = False
self.states.transmitting_event.wait() self.states.transmitting_event.wait()
self.radio.set_ptt(False) self.radio.set_ptt(False)
@ -275,7 +275,6 @@ class RF:
return return
def sd_output_audio_callback(self, outdata: np.ndarray, frames: int, time, status) -> None: def sd_output_audio_callback(self, outdata: np.ndarray, frames: int, time, status) -> None:
try: try:
if not self.audio_out_queue.empty(): if not self.audio_out_queue.empty():
chunk = self.audio_out_queue.get_nowait() chunk = self.audio_out_queue.get_nowait()
@ -283,8 +282,11 @@ class RF:
outdata[:] = chunk.reshape(outdata.shape) outdata[:] = chunk.reshape(outdata.shape)
else: else:
# reset transmitting state only, if we are not actively processing audio
# for avoiding a ptt toggle state bug
if not self.enqueuing_audio:
self.states.setTransmitting(False)
# Fill with zeros if the queue is empty # Fill with zeros if the queue is empty
self.states.setTransmitting(False)
outdata.fill(0) outdata.fill(0)
except Exception as e: except Exception as e:
self.log.warning("[AUDIO STATUS]", status=status, time=time, frames=frames, e=e) self.log.warning("[AUDIO STATUS]", status=status, time=time, frames=frames, e=e)

View file

@ -328,9 +328,13 @@ def sock_states(sock):
def stop_server(): def stop_server():
try: try:
app.service_manager.stop_modem() app.service_manager.stop_modem()
except Exception: if app.service_manager.modem:
app.service_manager.modem.sd_input_stream.stop
audio.sd._terminate()
except Exception as e:
print("Error stopping modem") print("Error stopping modem")
time.sleep(1) time.sleep(1)
print("------------------------------------------")
print('Server shutdown...') print('Server shutdown...')
if __name__ == "__main__": if __name__ == "__main__":
@ -367,4 +371,5 @@ if __name__ == "__main__":
modemaddress = '127.0.0.1' modemaddress = '127.0.0.1'
if not modemport: if not modemport:
modemport = 5000 modemport = 5000
app.run(modemaddress, modemport) app.run(modemaddress, modemport)