mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-03-22 12:18:32 -04:00
UDP Sink : use specific method to apply channelizer sample rate and frequency offset changes. Separate this data from settings
This commit is contained in:
parent
e5baca1a37
commit
f27bb2d1c2
@ -35,6 +35,9 @@ const QString UDPSink::m_channelId = "UDPSink";
|
||||
UDPSink::UDPSink(DeviceSinkAPI *deviceAPI) :
|
||||
ChannelSourceAPI(m_channelIdURI),
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_outputSampleRate(48000),
|
||||
m_basebandSampleRate(48000),
|
||||
m_inputFrequencyOffset(0),
|
||||
m_squelch(1e-6),
|
||||
m_spectrum(0),
|
||||
m_spectrumEnabled(false),
|
||||
@ -313,66 +316,31 @@ bool UDPSink::handleMessage(const Message& cmd)
|
||||
if (UpChannelizer::MsgChannelizerNotification::match(cmd))
|
||||
{
|
||||
UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd;
|
||||
qDebug() << "UDPSink::handleMessage: MsgChannelizerNotification";
|
||||
|
||||
UDPSinkSettings settings = m_settings;
|
||||
|
||||
settings.m_basebandSampleRate = notif.getBasebandSampleRate();
|
||||
settings.m_outputSampleRate = notif.getSampleRate();
|
||||
settings.m_inputFrequencyOffset = notif.getFrequencyOffset();
|
||||
|
||||
applySettings(settings);
|
||||
|
||||
qDebug() << "UDPSink::handleMessage: MsgChannelizerNotification:"
|
||||
<< " m_basebandSampleRate: " << settings.m_basebandSampleRate
|
||||
<< " m_outputSampleRate: " << settings.m_outputSampleRate
|
||||
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset;
|
||||
applyChannelSettings(notif.getBasebandSampleRate(), notif.getSampleRate(), notif.getFrequencyOffset());
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MsgConfigureChannelizer::match(cmd))
|
||||
{
|
||||
MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd;
|
||||
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
|
||||
<< " sampleRate: " << cfg.getSampleRate()
|
||||
<< " centerFrequency: " << cfg.getCenterFrequency();
|
||||
|
||||
m_channelizer->configure(m_channelizer->getInputMessageQueue(),
|
||||
cfg.getSampleRate(),
|
||||
cfg.getCenterFrequency());
|
||||
|
||||
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
|
||||
<< " sampleRate: " << cfg.getSampleRate()
|
||||
<< " centerFrequency: " << cfg.getCenterFrequency();
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MsgConfigureUDPSink::match(cmd))
|
||||
{
|
||||
MsgConfigureUDPSink& cfg = (MsgConfigureUDPSink&) cmd;
|
||||
qDebug() << "UDPSink::handleMessage: MsgConfigureUDPSink";
|
||||
|
||||
UDPSinkSettings settings = cfg.getSettings();
|
||||
|
||||
// These settings are set with DownChannelizer::MsgChannelizerNotification
|
||||
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
|
||||
settings.m_basebandSampleRate = m_settings.m_basebandSampleRate;
|
||||
settings.m_outputSampleRate = m_settings.m_outputSampleRate;
|
||||
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
|
||||
|
||||
applySettings(settings, cfg.getForce());
|
||||
|
||||
qDebug() << "UDPSink::handleMessage: MsgConfigureUDPSink:"
|
||||
<< " m_sampleFormat: " << settings.m_sampleFormat
|
||||
<< " m_inputSampleRate: " << settings.m_inputSampleRate
|
||||
<< " m_rfBandwidth: " << settings.m_rfBandwidth
|
||||
<< " m_fmDeviation: " << settings.m_fmDeviation
|
||||
<< " m_udpAddressStr: " << settings.m_udpAddress
|
||||
<< " m_udpPort: " << settings.m_udpPort
|
||||
<< " m_channelMute: " << settings.m_channelMute
|
||||
<< " m_gainIn: " << settings.m_gainIn
|
||||
<< " m_gainOut: " << settings.m_gainOut
|
||||
<< " m_squelchGate: " << settings.m_squelchGate
|
||||
<< " m_squelch: " << settings.m_squelch << "dB"
|
||||
<< " m_squelchEnabled: " << settings.m_squelchEnabled
|
||||
<< " m_autoRWBalance: " << settings.m_autoRWBalance
|
||||
<< " m_stereoInput: " << settings.m_stereoInput
|
||||
<< " force: " << cfg.getForce();
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -421,7 +389,7 @@ bool UDPSink::handleMessage(const Message& cmd)
|
||||
m_settingsMutex.lock();
|
||||
m_interpolatorDistanceRemain = 0;
|
||||
m_interpolatorConsumed = false;
|
||||
m_interpolatorDistance = (Real) m_actualInputSampleRate / (Real) m_settings.m_outputSampleRate;
|
||||
m_interpolatorDistance = (Real) m_actualInputSampleRate / (Real) m_outputSampleRate;
|
||||
//m_interpolator.create(48, m_actualInputSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0); // causes clicking: leaving at standard frequency
|
||||
m_settingsMutex.unlock();
|
||||
}
|
||||
@ -471,24 +439,65 @@ void UDPSink::resetReadIndex()
|
||||
getInputMessageQueue()->push(cmd);
|
||||
}
|
||||
|
||||
void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
|
||||
void UDPSink::applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset)
|
||||
{
|
||||
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) ||
|
||||
(settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force)
|
||||
qDebug() << "UDPSink::applyChannelSettings:"
|
||||
<< " basebandSampleRate: " << basebandSampleRate
|
||||
<< " outputSampleRate: " << outputSampleRate
|
||||
<< " inputFrequencyOffset: " << inputFrequencyOffset;
|
||||
|
||||
if ((inputFrequencyOffset != m_inputFrequencyOffset) ||
|
||||
(outputSampleRate != m_outputSampleRate))
|
||||
{
|
||||
m_settingsMutex.lock();
|
||||
m_carrierNco.setFreq(settings.m_inputFrequencyOffset, settings.m_outputSampleRate);
|
||||
m_carrierNco.setFreq(inputFrequencyOffset, outputSampleRate);
|
||||
m_settingsMutex.unlock();
|
||||
}
|
||||
|
||||
if((settings.m_outputSampleRate != m_settings.m_outputSampleRate) ||
|
||||
(settings.m_rfBandwidth != m_settings.m_rfBandwidth) ||
|
||||
if (outputSampleRate != m_outputSampleRate)
|
||||
{
|
||||
m_settingsMutex.lock();
|
||||
m_interpolatorDistanceRemain = 0;
|
||||
m_interpolatorConsumed = false;
|
||||
m_interpolatorDistance = (Real) m_settings.m_inputSampleRate / (Real) outputSampleRate;
|
||||
m_interpolator.create(48, m_settings.m_inputSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0);
|
||||
m_settingsMutex.unlock();
|
||||
m_squelchThreshold = outputSampleRate * m_settings.m_squelchGate;
|
||||
initSquelch(m_squelchOpen);
|
||||
}
|
||||
|
||||
m_basebandSampleRate = basebandSampleRate;
|
||||
m_outputSampleRate = outputSampleRate;
|
||||
m_inputFrequencyOffset = inputFrequencyOffset;
|
||||
}
|
||||
|
||||
void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
|
||||
{
|
||||
qDebug() << "UDPSink::applySettings:"
|
||||
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
|
||||
<< " m_sampleFormat: " << settings.m_sampleFormat
|
||||
<< " m_inputSampleRate: " << settings.m_inputSampleRate
|
||||
<< " m_rfBandwidth: " << settings.m_rfBandwidth
|
||||
<< " m_fmDeviation: " << settings.m_fmDeviation
|
||||
<< " m_udpAddressStr: " << settings.m_udpAddress
|
||||
<< " m_udpPort: " << settings.m_udpPort
|
||||
<< " m_channelMute: " << settings.m_channelMute
|
||||
<< " m_gainIn: " << settings.m_gainIn
|
||||
<< " m_gainOut: " << settings.m_gainOut
|
||||
<< " m_squelchGate: " << settings.m_squelchGate
|
||||
<< " m_squelch: " << settings.m_squelch << "dB"
|
||||
<< " m_squelchEnabled: " << settings.m_squelchEnabled
|
||||
<< " m_autoRWBalance: " << settings.m_autoRWBalance
|
||||
<< " m_stereoInput: " << settings.m_stereoInput
|
||||
<< " force: " << force;
|
||||
|
||||
if((settings.m_rfBandwidth != m_settings.m_rfBandwidth) ||
|
||||
(settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force)
|
||||
{
|
||||
m_settingsMutex.lock();
|
||||
m_interpolatorDistanceRemain = 0;
|
||||
m_interpolatorConsumed = false;
|
||||
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_outputSampleRate;
|
||||
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) m_outputSampleRate;
|
||||
m_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
|
||||
m_actualInputSampleRate = settings.m_inputSampleRate;
|
||||
m_udpHandler.resetReadIndex();
|
||||
@ -515,7 +524,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
|
||||
|
||||
if ((settings.m_squelchGate != m_settings.m_squelchGate) || force)
|
||||
{
|
||||
m_squelchThreshold = settings.m_outputSampleRate * settings.m_squelchGate;
|
||||
m_squelchThreshold = m_outputSampleRate * settings.m_squelchGate;
|
||||
initSquelch(m_squelchOpen);
|
||||
}
|
||||
|
||||
@ -543,7 +552,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
|
||||
{
|
||||
m_interpolatorDistanceRemain = 0;
|
||||
m_interpolatorConsumed = false;
|
||||
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_outputSampleRate;
|
||||
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) m_outputSampleRate;
|
||||
m_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
|
||||
m_actualInputSampleRate = settings.m_inputSampleRate;
|
||||
m_udpHandler.resetReadIndex();
|
||||
|
@ -168,8 +168,10 @@ private:
|
||||
ThreadedBasebandSampleSource* m_threadedChannelizer;
|
||||
UpChannelizer* m_channelizer;
|
||||
|
||||
int m_basebandSampleRate;
|
||||
Real m_outputSampleRate;
|
||||
int m_inputFrequencyOffset;
|
||||
UDPSinkSettings m_settings;
|
||||
int m_absoluteFrequencyOffset;
|
||||
|
||||
Real m_squelch;
|
||||
|
||||
@ -217,6 +219,7 @@ private:
|
||||
static const int m_sampleRateAverageItems = 17;
|
||||
static const int m_ssbFftLen = 1024;
|
||||
|
||||
void applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset);
|
||||
void applySettings(const UDPSinkSettings& settings, bool force = false);
|
||||
void modulateSample();
|
||||
void calculateLevel(Real sample);
|
||||
|
@ -30,10 +30,8 @@ UDPSinkSettings::UDPSinkSettings() :
|
||||
|
||||
void UDPSinkSettings::resetToDefaults()
|
||||
{
|
||||
m_outputSampleRate = 48000;
|
||||
m_sampleFormat = FormatS16LE;
|
||||
m_inputSampleRate = 48000;
|
||||
m_basebandSampleRate = 48000;
|
||||
m_inputFrequencyOffset = 0;
|
||||
m_rfBandwidth = 12500;
|
||||
m_fmDeviation = 2500;
|
||||
@ -117,7 +115,7 @@ bool UDPSinkSettings::deserialize(const QByteArray& data)
|
||||
m_sampleFormat = (SampleFormat) ((int) FormatNone - 1);
|
||||
}
|
||||
|
||||
d.readReal(4, &m_outputSampleRate, 48000);
|
||||
d.readReal(4, &m_inputSampleRate, 48000);
|
||||
d.readReal(5, &m_rfBandwidth, 32000);
|
||||
|
||||
if (m_spectrumGUI)
|
||||
|
@ -34,8 +34,6 @@ struct UDPSinkSettings
|
||||
FormatNone
|
||||
};
|
||||
|
||||
int m_basebandSampleRate;
|
||||
Real m_outputSampleRate;
|
||||
SampleFormat m_sampleFormat;
|
||||
Real m_inputSampleRate;
|
||||
qint64 m_inputFrequencyOffset;
|
||||
|
Loading…
Reference in New Issue
Block a user