mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
adjusted server shutdown and transmitting state
This commit is contained in:
parent
787cb2d862
commit
41d9642eb1
3 changed files with 14 additions and 11 deletions
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
# Fill with zeros if the queue is empty
|
# 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)
|
self.states.setTransmitting(False)
|
||||||
|
# Fill with zeros if the queue is empty
|
||||||
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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue