avoid demodulator concurrency
* this frees up resources used by the current demodulator before starting a new one * this addresses an issue where users of single-channel AMBE sticks could not seamlessly switch between digital modes
This commit is contained in:
parent
40c68933e1
commit
46c78f6463
14
csdr/chain/dummy.py
Normal file
14
csdr/chain/dummy.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from pycsdr.types import Format
|
||||||
|
from csdr.chain import Module
|
||||||
|
|
||||||
|
|
||||||
|
class DummyDemodulator(Module):
|
||||||
|
def __init__(self, outputFormat: Format):
|
||||||
|
self.outputFormat = outputFormat
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
def getInputFormat(self) -> Format:
|
||||||
|
return Format.COMPLEX_FLOAT
|
||||||
|
|
||||||
|
def getOutputFormat(self) -> Format:
|
||||||
|
return self.outputFormat
|
15
owrx/dsp.py
15
owrx/dsp.py
@ -7,6 +7,7 @@ from csdr.chain.demodulator import BaseDemodulatorChain, FixedIfSampleRateChain,
|
|||||||
from csdr.chain.selector import Selector, SecondarySelector
|
from csdr.chain.selector import Selector, SecondarySelector
|
||||||
from csdr.chain.clientaudio import ClientAudioChain
|
from csdr.chain.clientaudio import ClientAudioChain
|
||||||
from csdr.chain.fft import FftChain
|
from csdr.chain.fft import FftChain
|
||||||
|
from csdr.chain.dummy import DummyDemodulator
|
||||||
from pycsdr.modules import Buffer, Writer
|
from pycsdr.modules import Buffer, Writer
|
||||||
from pycsdr.types import Format
|
from pycsdr.types import Format
|
||||||
from typing import Union, Optional
|
from typing import Union, Optional
|
||||||
@ -121,6 +122,19 @@ class ClientDemodulatorChain(Chain):
|
|||||||
if self.metaWriter is not None and isinstance(demodulator, MetaProvider):
|
if self.metaWriter is not None and isinstance(demodulator, MetaProvider):
|
||||||
demodulator.setMetaWriter(self.metaWriter)
|
demodulator.setMetaWriter(self.metaWriter)
|
||||||
|
|
||||||
|
def stopDemodulator(self):
|
||||||
|
if self.demodulator is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
# we need to get the currrent demodulator out of the chain so that it can be deallocated properly
|
||||||
|
# so we just replace it with a dummy here
|
||||||
|
# in order to avoid any client audio chain hassle, the dummy simply imitates the output format of the current
|
||||||
|
# demodulator
|
||||||
|
self.replace(1, DummyDemodulator(self.demodulator.getOutputFormat()))
|
||||||
|
|
||||||
|
self.demodulator.stop()
|
||||||
|
self.demodulator = None
|
||||||
|
|
||||||
def _getSelectorOutputRate(self):
|
def _getSelectorOutputRate(self):
|
||||||
if isinstance(self.demodulator, FixedIfSampleRateChain):
|
if isinstance(self.demodulator, FixedIfSampleRateChain):
|
||||||
return self.demodulator.getFixedIfSampleRate()
|
return self.demodulator.getFixedIfSampleRate()
|
||||||
@ -544,6 +558,7 @@ class DspManager(SdrSourceEventClient, ClientDemodulatorSecondaryDspEventClient)
|
|||||||
return FreeDV()
|
return FreeDV()
|
||||||
|
|
||||||
def setDemodulator(self, mod):
|
def setDemodulator(self, mod):
|
||||||
|
self.chain.stopDemodulator()
|
||||||
try:
|
try:
|
||||||
demodulator = self._getDemodulator(mod)
|
demodulator = self._getDemodulator(mod)
|
||||||
if demodulator is None:
|
if demodulator is None:
|
||||||
|
Loading…
Reference in New Issue
Block a user