From efe80a75f5dcb09da1e0210a9863836bdd8aba07 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 19 Dec 2020 16:28:18 +0100 Subject: [PATCH] put the socketclient on the source so it can be shared --- csdr/chain/__init__.py | 3 +++ csdr/chain/fft.py | 5 ++--- csdr/csdr.py | 10 +++++++++- owrx/fft.py | 1 + owrx/source/__init__.py | 12 ++++++++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/csdr/chain/__init__.py b/csdr/chain/__init__.py index b689125..7197c4e 100644 --- a/csdr/chain/__init__.py +++ b/csdr/chain/__init__.py @@ -12,5 +12,8 @@ class Chain(object): for w in self.workers: w.stop() + def setInput(self, buffer): + self.workers[0].setInput(buffer) + def getBuffer(self): return self.buffer diff --git a/csdr/chain/fft.py b/csdr/chain/fft.py index bf90b15..3cc2344 100644 --- a/csdr/chain/fft.py +++ b/csdr/chain/fft.py @@ -1,11 +1,10 @@ from csdr.chain import Chain -from pycsdr import SocketClient, Fft, LogAveragePower, FftExchangeSides, CompressFftAdpcm +from pycsdr import Fft, LogAveragePower, FftExchangeSides, CompressFftAdpcm class FftChain(Chain): - def __init__(self, port, fft_size, fft_block_size, fft_averages, fft_compression): + def __init__(self, fft_size, fft_block_size, fft_averages, fft_compression): workers = [ - SocketClient(port=port), Fft(size=fft_size, every_n_samples=int(fft_block_size)), LogAveragePower(add_db=-70, fft_size=fft_size, avg_number=fft_averages), FftExchangeSides(fft_size=fft_size), diff --git a/csdr/csdr.py b/csdr/csdr.py index aab92fb..385688d 100644 --- a/csdr/csdr.py +++ b/csdr/csdr.py @@ -77,6 +77,7 @@ class dsp(object): def __init__(self, output): self.pycsdr_enabled = True self.pycsdr_chain = None + self.socketClient = None self.samp_rate = 250000 self.output_rate = 11025 @@ -137,6 +138,11 @@ class dsp(object): self.direwolf_port = None self.process = None + def setSocketClient(self, socketClient): + self.socketClient = socketClient + if self.pycsdr_chain is not None: + self.pycsdr_chain.setInput(socketClient.getBuffer()) + def set_service(self, flag=True): self.is_service = flag @@ -766,13 +772,15 @@ class dsp(object): self.running = True self.pycsdr_chain = FftChain( - port=self.nc_port, fft_size=self.fft_size, fft_block_size=self.fft_block_size(), fft_averages=self.fft_averages, fft_compression=self.fft_compression ) + if self.socketClient is not None: + self.pycsdr_chain.setInput(self.socketClient.getBuffer()) + self.output.send_output("audio", self.pycsdr_chain.getBuffer().read) return diff --git a/owrx/fft.py b/owrx/fft.py index 717c086..3486983 100644 --- a/owrx/fft.py +++ b/owrx/fft.py @@ -31,6 +31,7 @@ class SpectrumThread(csdr.output, SdrSourceEventClient): self.dsp = dsp = csdr.dsp(self) dsp.nc_port = self.sdrSource.getPort() + dsp.setSocketClient(self.sdrSource.getSocketClient()) dsp.set_demodulator("fft") def set_fft_averages(key, value): diff --git a/owrx/source/__init__.py b/owrx/source/__init__.py index cf5e198..21d1761 100644 --- a/owrx/source/__init__.py +++ b/owrx/source/__init__.py @@ -11,6 +11,8 @@ from owrx.command import CommandMapper from owrx.socket import getAvailablePort from owrx.property import PropertyStack, PropertyLayer +from pycsdr import SocketClient + import logging logger = logging.getLogger(__name__) @@ -48,6 +50,7 @@ class SdrSource(ABC): self.id = id self.commandMapper = None + self.socketClient = None self.props = PropertyStack() # layer 0 reserved for profile properties @@ -141,6 +144,12 @@ class SdrSource(ABC): def getPort(self): return self.port + def getSocketClient(self): + with self.modificationLock: + if self.socketClient is None: + self.socketClient = SocketClient(self.port) + return self.socketClient + def getCommandValues(self): dict = self.sdrProps.__dict__() if "lfo_offset" in dict and dict["lfo_offset"] is not None: @@ -249,6 +258,9 @@ class SdrSource(ABC): pass if self.monitor: self.monitor.join() + if self.socketClient is not None: + self.socketClient.stop() + self.socketClient = None def hasClients(self, *args): clients = [c for c in self.clients if c.getClientClass() in args]