mirror of https://github.com/f4exb/sdrangel.git
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) :
|
UDPSink::UDPSink(DeviceSinkAPI *deviceAPI) :
|
||||||
ChannelSourceAPI(m_channelIdURI),
|
ChannelSourceAPI(m_channelIdURI),
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
|
m_outputSampleRate(48000),
|
||||||
|
m_basebandSampleRate(48000),
|
||||||
|
m_inputFrequencyOffset(0),
|
||||||
m_squelch(1e-6),
|
m_squelch(1e-6),
|
||||||
m_spectrum(0),
|
m_spectrum(0),
|
||||||
m_spectrumEnabled(false),
|
m_spectrumEnabled(false),
|
||||||
|
@ -313,66 +316,31 @@ bool UDPSink::handleMessage(const Message& cmd)
|
||||||
if (UpChannelizer::MsgChannelizerNotification::match(cmd))
|
if (UpChannelizer::MsgChannelizerNotification::match(cmd))
|
||||||
{
|
{
|
||||||
UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd;
|
UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd;
|
||||||
|
qDebug() << "UDPSink::handleMessage: MsgChannelizerNotification";
|
||||||
|
|
||||||
UDPSinkSettings settings = m_settings;
|
applyChannelSettings(notif.getBasebandSampleRate(), notif.getSampleRate(), notif.getFrequencyOffset());
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (MsgConfigureChannelizer::match(cmd))
|
else if (MsgConfigureChannelizer::match(cmd))
|
||||||
{
|
{
|
||||||
MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd;
|
MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd;
|
||||||
|
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
|
||||||
|
<< " sampleRate: " << cfg.getSampleRate()
|
||||||
|
<< " centerFrequency: " << cfg.getCenterFrequency();
|
||||||
|
|
||||||
m_channelizer->configure(m_channelizer->getInputMessageQueue(),
|
m_channelizer->configure(m_channelizer->getInputMessageQueue(),
|
||||||
cfg.getSampleRate(),
|
cfg.getSampleRate(),
|
||||||
cfg.getCenterFrequency());
|
cfg.getCenterFrequency());
|
||||||
|
|
||||||
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
|
|
||||||
<< " sampleRate: " << cfg.getSampleRate()
|
|
||||||
<< " centerFrequency: " << cfg.getCenterFrequency();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (MsgConfigureUDPSink::match(cmd))
|
else if (MsgConfigureUDPSink::match(cmd))
|
||||||
{
|
{
|
||||||
MsgConfigureUDPSink& cfg = (MsgConfigureUDPSink&) cmd;
|
MsgConfigureUDPSink& cfg = (MsgConfigureUDPSink&) cmd;
|
||||||
|
qDebug() << "UDPSink::handleMessage: MsgConfigureUDPSink";
|
||||||
|
|
||||||
UDPSinkSettings settings = cfg.getSettings();
|
applySettings(cfg.getSettings(), cfg.getForce());
|
||||||
|
|
||||||
// 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();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -421,7 +389,7 @@ bool UDPSink::handleMessage(const Message& cmd)
|
||||||
m_settingsMutex.lock();
|
m_settingsMutex.lock();
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorConsumed = false;
|
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_interpolator.create(48, m_actualInputSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0); // causes clicking: leaving at standard frequency
|
||||||
m_settingsMutex.unlock();
|
m_settingsMutex.unlock();
|
||||||
}
|
}
|
||||||
|
@ -471,24 +439,65 @@ void UDPSink::resetReadIndex()
|
||||||
getInputMessageQueue()->push(cmd);
|
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) ||
|
qDebug() << "UDPSink::applyChannelSettings:"
|
||||||
(settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force)
|
<< " basebandSampleRate: " << basebandSampleRate
|
||||||
|
<< " outputSampleRate: " << outputSampleRate
|
||||||
|
<< " inputFrequencyOffset: " << inputFrequencyOffset;
|
||||||
|
|
||||||
|
if ((inputFrequencyOffset != m_inputFrequencyOffset) ||
|
||||||
|
(outputSampleRate != m_outputSampleRate))
|
||||||
{
|
{
|
||||||
m_settingsMutex.lock();
|
m_settingsMutex.lock();
|
||||||
m_carrierNco.setFreq(settings.m_inputFrequencyOffset, settings.m_outputSampleRate);
|
m_carrierNco.setFreq(inputFrequencyOffset, outputSampleRate);
|
||||||
m_settingsMutex.unlock();
|
m_settingsMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_outputSampleRate != m_settings.m_outputSampleRate) ||
|
if (outputSampleRate != m_outputSampleRate)
|
||||||
(settings.m_rfBandwidth != m_settings.m_rfBandwidth) ||
|
{
|
||||||
|
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)
|
(settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force)
|
||||||
{
|
{
|
||||||
m_settingsMutex.lock();
|
m_settingsMutex.lock();
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorConsumed = false;
|
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_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
|
||||||
m_actualInputSampleRate = settings.m_inputSampleRate;
|
m_actualInputSampleRate = settings.m_inputSampleRate;
|
||||||
m_udpHandler.resetReadIndex();
|
m_udpHandler.resetReadIndex();
|
||||||
|
@ -515,7 +524,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
|
||||||
|
|
||||||
if ((settings.m_squelchGate != m_settings.m_squelchGate) || 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);
|
initSquelch(m_squelchOpen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -543,7 +552,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
|
||||||
{
|
{
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorConsumed = false;
|
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_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
|
||||||
m_actualInputSampleRate = settings.m_inputSampleRate;
|
m_actualInputSampleRate = settings.m_inputSampleRate;
|
||||||
m_udpHandler.resetReadIndex();
|
m_udpHandler.resetReadIndex();
|
||||||
|
|
|
@ -168,8 +168,10 @@ private:
|
||||||
ThreadedBasebandSampleSource* m_threadedChannelizer;
|
ThreadedBasebandSampleSource* m_threadedChannelizer;
|
||||||
UpChannelizer* m_channelizer;
|
UpChannelizer* m_channelizer;
|
||||||
|
|
||||||
|
int m_basebandSampleRate;
|
||||||
|
Real m_outputSampleRate;
|
||||||
|
int m_inputFrequencyOffset;
|
||||||
UDPSinkSettings m_settings;
|
UDPSinkSettings m_settings;
|
||||||
int m_absoluteFrequencyOffset;
|
|
||||||
|
|
||||||
Real m_squelch;
|
Real m_squelch;
|
||||||
|
|
||||||
|
@ -217,6 +219,7 @@ private:
|
||||||
static const int m_sampleRateAverageItems = 17;
|
static const int m_sampleRateAverageItems = 17;
|
||||||
static const int m_ssbFftLen = 1024;
|
static const int m_ssbFftLen = 1024;
|
||||||
|
|
||||||
|
void applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset);
|
||||||
void applySettings(const UDPSinkSettings& settings, bool force = false);
|
void applySettings(const UDPSinkSettings& settings, bool force = false);
|
||||||
void modulateSample();
|
void modulateSample();
|
||||||
void calculateLevel(Real sample);
|
void calculateLevel(Real sample);
|
||||||
|
|
|
@ -30,10 +30,8 @@ UDPSinkSettings::UDPSinkSettings() :
|
||||||
|
|
||||||
void UDPSinkSettings::resetToDefaults()
|
void UDPSinkSettings::resetToDefaults()
|
||||||
{
|
{
|
||||||
m_outputSampleRate = 48000;
|
|
||||||
m_sampleFormat = FormatS16LE;
|
m_sampleFormat = FormatS16LE;
|
||||||
m_inputSampleRate = 48000;
|
m_inputSampleRate = 48000;
|
||||||
m_basebandSampleRate = 48000;
|
|
||||||
m_inputFrequencyOffset = 0;
|
m_inputFrequencyOffset = 0;
|
||||||
m_rfBandwidth = 12500;
|
m_rfBandwidth = 12500;
|
||||||
m_fmDeviation = 2500;
|
m_fmDeviation = 2500;
|
||||||
|
@ -117,7 +115,7 @@ bool UDPSinkSettings::deserialize(const QByteArray& data)
|
||||||
m_sampleFormat = (SampleFormat) ((int) FormatNone - 1);
|
m_sampleFormat = (SampleFormat) ((int) FormatNone - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
d.readReal(4, &m_outputSampleRate, 48000);
|
d.readReal(4, &m_inputSampleRate, 48000);
|
||||||
d.readReal(5, &m_rfBandwidth, 32000);
|
d.readReal(5, &m_rfBandwidth, 32000);
|
||||||
|
|
||||||
if (m_spectrumGUI)
|
if (m_spectrumGUI)
|
||||||
|
|
|
@ -34,8 +34,6 @@ struct UDPSinkSettings
|
||||||
FormatNone
|
FormatNone
|
||||||
};
|
};
|
||||||
|
|
||||||
int m_basebandSampleRate;
|
|
||||||
Real m_outputSampleRate;
|
|
||||||
SampleFormat m_sampleFormat;
|
SampleFormat m_sampleFormat;
|
||||||
Real m_inputSampleRate;
|
Real m_inputSampleRate;
|
||||||
qint64 m_inputFrequencyOffset;
|
qint64 m_inputFrequencyOffset;
|
||||||
|
|
Loading…
Reference in New Issue