use new non-blocking strategy (affects all reads)

This commit is contained in:
Jakob Ketterl 2018-09-25 21:15:23 +00:00
parent 7e08c8f28e
commit d1ce737886
2 changed files with 11 additions and 5 deletions

View File

@ -26,7 +26,6 @@ import os
import code import code
import signal import signal
import fcntl import fcntl
import select
class dsp: class dsp:
@ -394,6 +393,10 @@ class dsp:
if self.csdr_dynamic_bufsize: my_env["CSDR_DYNAMIC_BUFSIZE_ON"]="1"; if self.csdr_dynamic_bufsize: my_env["CSDR_DYNAMIC_BUFSIZE_ON"]="1";
if self.csdr_print_bufsizes: my_env["CSDR_PRINT_BUFSIZES"]="1"; if self.csdr_print_bufsizes: my_env["CSDR_PRINT_BUFSIZES"]="1";
self.process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setpgrp, env=my_env) self.process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setpgrp, env=my_env)
#set stdout to non-blocking to avoid blocking the main loop when no audio was decoded in digital modes
self.set_pipe_nonblocking(self.process.stdout)
self.running = True self.running = True
#open control pipes for csdr and send initialization data #open control pipes for csdr and send initialization data
@ -419,9 +422,9 @@ class dsp:
return self.process.stdout.read(size) return self.process.stdout.read(size)
def read_async(self, size): def read_async(self, size):
if (select.select([self.process.stdout], [], [], 0)[0] != []): try:
return self.process.stdout.read(size) return self.process.stdout.read(size)
else: except IOError:
return None return None
def stop(self): def stop(self):

View File

@ -306,13 +306,16 @@ def spectrum_thread_function():
print "[openwebrx-spectrum] Spectrum thread initialized successfully." print "[openwebrx-spectrum] Spectrum thread initialized successfully."
dsp.start() dsp.start()
if cfg.csdr_dynamic_bufsize: if cfg.csdr_dynamic_bufsize:
dsp.read(8) #dummy read to skip bufsize & preamble dsp.read_async(8) #dummy read to skip bufsize & preamble
print "[openwebrx-spectrum] Note: CSDR_DYNAMIC_BUFSIZE_ON = 1" print "[openwebrx-spectrum] Note: CSDR_DYNAMIC_BUFSIZE_ON = 1"
print "[openwebrx-spectrum] Spectrum thread started." print "[openwebrx-spectrum] Spectrum thread started."
bytes_to_read=int(dsp.get_fft_bytes_to_read()) bytes_to_read=int(dsp.get_fft_bytes_to_read())
spectrum_thread_counter=0 spectrum_thread_counter=0
while True: while True:
data=dsp.read(bytes_to_read) data=dsp.read_async(bytes_to_read)
if data is None:
time.sleep(.01)
continue
#print "gotcha",len(data),"bytes of spectrum data via spectrum_thread_function()" #print "gotcha",len(data),"bytes of spectrum data via spectrum_thread_function()"
if spectrum_thread_counter >= cfg.fft_fps: if spectrum_thread_counter >= cfg.fft_fps:
spectrum_thread_counter=0 spectrum_thread_counter=0